@kispace-io/core 0.7.0

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.
Files changed (272) hide show
  1. package/dist/api/base-classes.d.ts +7 -0
  2. package/dist/api/base-classes.d.ts.map +1 -0
  3. package/dist/api/constants.d.ts +2 -0
  4. package/dist/api/constants.d.ts.map +1 -0
  5. package/dist/api/index.d.ts +6 -0
  6. package/dist/api/index.d.ts.map +1 -0
  7. package/dist/api/index.js +80 -0
  8. package/dist/api/index.js.map +1 -0
  9. package/dist/api/services.d.ts +27 -0
  10. package/dist/api/services.d.ts.map +1 -0
  11. package/dist/api/types.d.ts +11 -0
  12. package/dist/api/types.d.ts.map +1 -0
  13. package/dist/commands/files.d.ts +2 -0
  14. package/dist/commands/files.d.ts.map +1 -0
  15. package/dist/commands/global.d.ts +1 -0
  16. package/dist/commands/global.d.ts.map +1 -0
  17. package/dist/commands/index.d.ts +1 -0
  18. package/dist/commands/index.d.ts.map +1 -0
  19. package/dist/commands/version-info.d.ts +2 -0
  20. package/dist/commands/version-info.d.ts.map +1 -0
  21. package/dist/components/index.d.ts +1 -0
  22. package/dist/components/index.d.ts.map +1 -0
  23. package/dist/components/k-app-selector.d.ts +17 -0
  24. package/dist/components/k-app-selector.d.ts.map +1 -0
  25. package/dist/components/k-app-switcher.d.ts +13 -0
  26. package/dist/components/k-app-switcher.d.ts.map +1 -0
  27. package/dist/components/k-command.d.ts +31 -0
  28. package/dist/components/k-command.d.ts.map +1 -0
  29. package/dist/components/k-extensions.d.ts +32 -0
  30. package/dist/components/k-extensions.d.ts.map +1 -0
  31. package/dist/components/k-fastviews.d.ts +34 -0
  32. package/dist/components/k-fastviews.d.ts.map +1 -0
  33. package/dist/components/k-filebrowser.d.ts +40 -0
  34. package/dist/components/k-filebrowser.d.ts.map +1 -0
  35. package/dist/components/k-language-selector.d.ts +12 -0
  36. package/dist/components/k-language-selector.d.ts.map +1 -0
  37. package/dist/components/k-log-terminal.d.ts +36 -0
  38. package/dist/components/k-log-terminal.d.ts.map +1 -0
  39. package/dist/components/k-part-name.d.ts +12 -0
  40. package/dist/components/k-part-name.d.ts.map +1 -0
  41. package/dist/components/k-tasks.d.ts +13 -0
  42. package/dist/components/k-tasks.d.ts.map +1 -0
  43. package/dist/components/k-workspace-name.d.ts +14 -0
  44. package/dist/components/k-workspace-name.d.ts.map +1 -0
  45. package/dist/contributions/default-ui-contributions.d.ts +2 -0
  46. package/dist/contributions/default-ui-contributions.d.ts.map +1 -0
  47. package/dist/contributions/index.d.ts +1 -0
  48. package/dist/contributions/index.d.ts.map +1 -0
  49. package/dist/contributions/marketplace-catalog-contributions.d.ts +2 -0
  50. package/dist/contributions/marketplace-catalog-contributions.d.ts.map +1 -0
  51. package/dist/core/app-host-config.d.ts +7 -0
  52. package/dist/core/app-host-config.d.ts.map +1 -0
  53. package/dist/core/apploader.d.ts +214 -0
  54. package/dist/core/apploader.d.ts.map +1 -0
  55. package/dist/core/appstate.d.ts +12 -0
  56. package/dist/core/appstate.d.ts.map +1 -0
  57. package/dist/core/commandregistry.d.ts +79 -0
  58. package/dist/core/commandregistry.d.ts.map +1 -0
  59. package/dist/core/config.d.ts +15 -0
  60. package/dist/core/config.d.ts.map +1 -0
  61. package/dist/core/constants.d.ts +21 -0
  62. package/dist/core/constants.d.ts.map +1 -0
  63. package/dist/core/contributionregistry.d.ts +49 -0
  64. package/dist/core/contributionregistry.d.ts.map +1 -0
  65. package/dist/core/di.d.ts +18 -0
  66. package/dist/core/di.d.ts.map +1 -0
  67. package/dist/core/dialogservice.d.ts +33 -0
  68. package/dist/core/dialogservice.d.ts.map +1 -0
  69. package/dist/core/editorregistry.d.ts +73 -0
  70. package/dist/core/editorregistry.d.ts.map +1 -0
  71. package/dist/core/esmsh-service.d.ts +40 -0
  72. package/dist/core/esmsh-service.d.ts.map +1 -0
  73. package/dist/core/events.d.ts +7 -0
  74. package/dist/core/events.d.ts.map +1 -0
  75. package/dist/core/events.js +63 -0
  76. package/dist/core/events.js.map +1 -0
  77. package/dist/core/extensionregistry.d.ts +98 -0
  78. package/dist/core/extensionregistry.d.ts.map +1 -0
  79. package/dist/core/filesys.d.ts +139 -0
  80. package/dist/core/filesys.d.ts.map +1 -0
  81. package/dist/core/i18n.d.ts +50 -0
  82. package/dist/core/i18n.d.ts.map +1 -0
  83. package/dist/core/index.d.ts +1 -0
  84. package/dist/core/index.d.ts.map +1 -0
  85. package/dist/core/k-utils.d.ts +2 -0
  86. package/dist/core/k-utils.d.ts.map +1 -0
  87. package/dist/core/keybindings.d.ts +67 -0
  88. package/dist/core/keybindings.d.ts.map +1 -0
  89. package/dist/core/logger.d.ts +44 -0
  90. package/dist/core/logger.d.ts.map +1 -0
  91. package/dist/core/marketplaceregistry.d.ts +25 -0
  92. package/dist/core/marketplaceregistry.d.ts.map +1 -0
  93. package/dist/core/packageinfoservice.d.ts +16 -0
  94. package/dist/core/packageinfoservice.d.ts.map +1 -0
  95. package/dist/core/persistenceservice.d.ts +6 -0
  96. package/dist/core/persistenceservice.d.ts.map +1 -0
  97. package/dist/core/settingsservice.d.ts +19 -0
  98. package/dist/core/settingsservice.d.ts.map +1 -0
  99. package/dist/core/signals.d.ts +3 -0
  100. package/dist/core/signals.d.ts.map +1 -0
  101. package/dist/core/taskservice.d.ts +20 -0
  102. package/dist/core/taskservice.d.ts.map +1 -0
  103. package/dist/core/toast.d.ts +4 -0
  104. package/dist/core/toast.d.ts.map +1 -0
  105. package/dist/core/tree-utils.d.ts +16 -0
  106. package/dist/core/tree-utils.d.ts.map +1 -0
  107. package/dist/dialogs/confirm-dialog.d.ts +14 -0
  108. package/dist/dialogs/confirm-dialog.d.ts.map +1 -0
  109. package/dist/dialogs/index.d.ts +5 -0
  110. package/dist/dialogs/index.d.ts.map +1 -0
  111. package/dist/dialogs/info-dialog.d.ts +13 -0
  112. package/dist/dialogs/info-dialog.d.ts.map +1 -0
  113. package/dist/dialogs/navigable-info-dialog.d.ts +33 -0
  114. package/dist/dialogs/navigable-info-dialog.d.ts.map +1 -0
  115. package/dist/dialogs/prompt-dialog.d.ts +21 -0
  116. package/dist/dialogs/prompt-dialog.d.ts.map +1 -0
  117. package/dist/externals/lit.d.ts +20 -0
  118. package/dist/externals/lit.d.ts.map +1 -0
  119. package/dist/externals/lit.js +15 -0
  120. package/dist/externals/lit.js.map +1 -0
  121. package/dist/externals/third-party.d.ts +7 -0
  122. package/dist/externals/third-party.d.ts.map +1 -0
  123. package/dist/externals/third-party.js +2 -0
  124. package/dist/externals/third-party.js.map +1 -0
  125. package/dist/externals/webawesome.d.ts +1 -0
  126. package/dist/externals/webawesome.d.ts.map +1 -0
  127. package/dist/externals/webawesome.js +52 -0
  128. package/dist/externals/webawesome.js.map +1 -0
  129. package/dist/i18n/extensions.json.d.ts +42 -0
  130. package/dist/i18n/fastviews.json.d.ts +13 -0
  131. package/dist/i18n/filebrowser.json.d.ts +35 -0
  132. package/dist/i18n/index.d.ts +2 -0
  133. package/dist/i18n/index.d.ts.map +1 -0
  134. package/dist/i18n/logterminal.json.d.ts +45 -0
  135. package/dist/i18n/partname.json.d.ts +15 -0
  136. package/dist/i18n/tasks.json.d.ts +15 -0
  137. package/dist/i18n/workspace.json.d.ts +15 -0
  138. package/dist/index.d.ts +2 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +80 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/k-icon-BZC7dQV0.js +492 -0
  143. package/dist/k-icon-BZC7dQV0.js.map +1 -0
  144. package/dist/k-nocontent-Bh_yToGh.js +48 -0
  145. package/dist/k-nocontent-Bh_yToGh.js.map +1 -0
  146. package/dist/k-resizable-grid-Ch3iWZaL.js +3157 -0
  147. package/dist/k-resizable-grid-Ch3iWZaL.js.map +1 -0
  148. package/dist/k-standard-layout-CQ1VZoxa.js +5011 -0
  149. package/dist/k-standard-layout-CQ1VZoxa.js.map +1 -0
  150. package/dist/layouts/k-standard-layout.d.ts +16 -0
  151. package/dist/layouts/k-standard-layout.d.ts.map +1 -0
  152. package/dist/parts/index.d.ts +1 -0
  153. package/dist/parts/index.d.ts.map +1 -0
  154. package/dist/parts/index.js +53 -0
  155. package/dist/parts/index.js.map +1 -0
  156. package/dist/parts/k-app.d.ts +11 -0
  157. package/dist/parts/k-app.d.ts.map +1 -0
  158. package/dist/parts/k-container.d.ts +4 -0
  159. package/dist/parts/k-container.d.ts.map +1 -0
  160. package/dist/parts/k-contextmenu.d.ts +38 -0
  161. package/dist/parts/k-contextmenu.d.ts.map +1 -0
  162. package/dist/parts/k-dialog-content.d.ts +9 -0
  163. package/dist/parts/k-dialog-content.d.ts.map +1 -0
  164. package/dist/parts/k-element.d.ts +36 -0
  165. package/dist/parts/k-element.d.ts.map +1 -0
  166. package/dist/parts/k-part.d.ts +96 -0
  167. package/dist/parts/k-part.d.ts.map +1 -0
  168. package/dist/parts/k-resizable-grid.d.ts +31 -0
  169. package/dist/parts/k-resizable-grid.d.ts.map +1 -0
  170. package/dist/parts/k-tabs.d.ts +74 -0
  171. package/dist/parts/k-tabs.d.ts.map +1 -0
  172. package/dist/parts/k-toolbar.d.ts +21 -0
  173. package/dist/parts/k-toolbar.d.ts.map +1 -0
  174. package/dist/widgets/index.d.ts +1 -0
  175. package/dist/widgets/index.d.ts.map +1 -0
  176. package/dist/widgets/index.js +3 -0
  177. package/dist/widgets/index.js.map +1 -0
  178. package/dist/widgets/k-icon.d.ts +10 -0
  179. package/dist/widgets/k-icon.d.ts.map +1 -0
  180. package/dist/widgets/k-nocontent.d.ts +13 -0
  181. package/dist/widgets/k-nocontent.d.ts.map +1 -0
  182. package/dist/widgets/k-widget.d.ts +25 -0
  183. package/dist/widgets/k-widget.d.ts.map +1 -0
  184. package/package.json +81 -0
  185. package/src/api/base-classes.ts +10 -0
  186. package/src/api/constants.ts +3 -0
  187. package/src/api/index.ts +31 -0
  188. package/src/api/services.ts +52 -0
  189. package/src/api/types.ts +46 -0
  190. package/src/commands/files.ts +829 -0
  191. package/src/commands/global.ts +225 -0
  192. package/src/commands/index.ts +4 -0
  193. package/src/commands/version-info.ts +214 -0
  194. package/src/components/index.ts +10 -0
  195. package/src/components/k-app-selector.ts +233 -0
  196. package/src/components/k-app-switcher.ts +126 -0
  197. package/src/components/k-command.ts +236 -0
  198. package/src/components/k-extensions.ts +615 -0
  199. package/src/components/k-fastviews.ts +314 -0
  200. package/src/components/k-filebrowser.ts +442 -0
  201. package/src/components/k-language-selector.ts +166 -0
  202. package/src/components/k-log-terminal.ts +337 -0
  203. package/src/components/k-part-name.ts +54 -0
  204. package/src/components/k-tasks.ts +267 -0
  205. package/src/components/k-workspace-name.ts +56 -0
  206. package/src/contributions/default-ui-contributions.ts +51 -0
  207. package/src/contributions/index.ts +3 -0
  208. package/src/contributions/marketplace-catalog-contributions.ts +6 -0
  209. package/src/core/app-host-config.ts +23 -0
  210. package/src/core/apploader.ts +630 -0
  211. package/src/core/appstate.ts +15 -0
  212. package/src/core/commandregistry.ts +210 -0
  213. package/src/core/config.ts +29 -0
  214. package/src/core/constants.ts +27 -0
  215. package/src/core/contributionregistry.ts +77 -0
  216. package/src/core/di.ts +54 -0
  217. package/src/core/dialogservice.ts +266 -0
  218. package/src/core/editorregistry.ts +303 -0
  219. package/src/core/esmsh-service.ts +404 -0
  220. package/src/core/events.ts +68 -0
  221. package/src/core/extensionregistry.ts +399 -0
  222. package/src/core/filesys.ts +618 -0
  223. package/src/core/i18n.ts +221 -0
  224. package/src/core/index.ts +51 -0
  225. package/src/core/k-utils.ts +11 -0
  226. package/src/core/keybindings.ts +274 -0
  227. package/src/core/logger.ts +187 -0
  228. package/src/core/marketplaceregistry.ts +197 -0
  229. package/src/core/packageinfoservice.ts +56 -0
  230. package/src/core/persistenceservice.ts +15 -0
  231. package/src/core/settingsservice.ts +70 -0
  232. package/src/core/signals.ts +18 -0
  233. package/src/core/taskservice.ts +72 -0
  234. package/src/core/toast.ts +11 -0
  235. package/src/core/tree-utils.ts +24 -0
  236. package/src/dialogs/confirm-dialog.ts +72 -0
  237. package/src/dialogs/index.ts +4 -0
  238. package/src/dialogs/info-dialog.ts +67 -0
  239. package/src/dialogs/navigable-info-dialog.ts +256 -0
  240. package/src/dialogs/prompt-dialog.ts +123 -0
  241. package/src/externals/lit.ts +26 -0
  242. package/src/externals/third-party.ts +9 -0
  243. package/src/externals/webawesome.ts +54 -0
  244. package/src/i18n/extensions.json +39 -0
  245. package/src/i18n/fastviews.json +10 -0
  246. package/src/i18n/filebrowser.json +33 -0
  247. package/src/i18n/index.ts +25 -0
  248. package/src/i18n/logterminal.json +42 -0
  249. package/src/i18n/partname.json +12 -0
  250. package/src/i18n/tasks.json +12 -0
  251. package/src/i18n/workspace.json +12 -0
  252. package/src/icons/icons.txt +3 -0
  253. package/src/icons/js.svg +6 -0
  254. package/src/icons/jupyter.svg +18 -0
  255. package/src/icons/python.svg +15 -0
  256. package/src/index.ts +3 -0
  257. package/src/layouts/k-standard-layout.ts +174 -0
  258. package/src/parts/index.ts +6 -0
  259. package/src/parts/k-app.ts +29 -0
  260. package/src/parts/k-container.ts +4 -0
  261. package/src/parts/k-contextmenu.ts +245 -0
  262. package/src/parts/k-dialog-content.ts +31 -0
  263. package/src/parts/k-element.ts +100 -0
  264. package/src/parts/k-part.ts +158 -0
  265. package/src/parts/k-resizable-grid.ts +366 -0
  266. package/src/parts/k-tabs.ts +574 -0
  267. package/src/parts/k-toolbar.ts +158 -0
  268. package/src/vite-env.d.ts +2 -0
  269. package/src/widgets/index.ts +2 -0
  270. package/src/widgets/k-icon.ts +39 -0
  271. package/src/widgets/k-nocontent.ts +40 -0
  272. package/src/widgets/k-widget.ts +90 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"k-standard-layout-CQ1VZoxa.js","sources":["../src/core/packageinfoservice.ts","../src/core/i18n.ts","../src/core/keybindings.ts","../src/core/filesys.ts","../src/core/editorregistry.ts","../src/core/marketplaceregistry.ts","../src/i18n/index.ts","../src/core/tree-utils.ts","../src/components/k-filebrowser.ts","../src/components/k-tasks.ts","../src/components/k-workspace-name.ts","../src/components/k-part-name.ts","../src/components/k-extensions.ts","../src/components/k-log-terminal.ts","../src/components/k-command.ts","../src/components/k-fastviews.ts","../src/components/k-language-selector.ts","../src/components/k-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/core/index.ts","../src/core/app-host-config.ts","../src/core/config.ts","../src/layouts/k-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);","/**\n * Key Binding Manager for geo!space\n *\n * Handles keyboard shortcuts and binds them to commands.\n * Supports standard modifiers: CTRL, ALT, SHIFT, META (CMD on Mac)\n */\n\nimport logger from \"./logger\";\nimport { subscribe } from \"./events\";\nimport { commandRegistry, TOPIC_COMMAND_REGISTERED } from \"./commandregistry\";\nimport { rootContext } from \"./di\";\n\nimport type { Command } from \"./commandregistry\";\n\nexport type ModifierField = 'ctrl' | 'alt' | 'shift' | 'meta';\n\nexport interface KeyBinding {\n commandId: string;\n key: string;\n ctrl?: boolean;\n alt?: boolean;\n shift?: boolean;\n meta?: boolean;\n}\n\nconst MODIFIER_FIELDS: ModifierField[] = ['alt', 'ctrl', 'meta', 'shift'];\n\nconst MODIFIER_ALIASES: Record<string, ModifierField> = {\n CTRL: 'ctrl', CONTROL: 'ctrl',\n ALT: 'alt', OPTION: 'alt',\n SHIFT: 'shift',\n META: 'meta', CMD: 'meta', COMMAND: 'meta', WIN: 'meta', WINDOWS: 'meta',\n};\n\nconst MODIFIER_DISPLAY: Record<ModifierField, string> = {\n ctrl: 'Ctrl', alt: 'Alt', shift: 'Shift', meta: 'Cmd',\n};\n\nconst KEY_NORMALIZE: Record<string, string> = {\n SPACE: ' ', ESC: 'ESCAPE', RETURN: 'ENTER',\n LEFT: 'ARROWLEFT', RIGHT: 'ARROWRIGHT', UP: 'ARROWUP', DOWN: 'ARROWDOWN',\n DEL: 'DELETE', INS: 'INSERT', PAGEUP: 'PAGEUP', PAGEDOWN: 'PAGEDOWN',\n};\n\nconst KNOWN_MODIFIERS = new Set<string>(Object.keys(MODIFIER_ALIASES));\n\nfunction normalizeKey(key: string): string {\n return KEY_NORMALIZE[key] ?? key;\n}\n\nexport class KeyBindingManager {\n private bindings: Map<string, KeyBinding[]> = new Map();\n private enabled: boolean = true;\n\n constructor() {\n document.addEventListener('keydown', this.handleKeyDown.bind(this), true);\n this.registerExistingCommandBindings();\n subscribe(TOPIC_COMMAND_REGISTERED, (command: Command) => {\n if (command.keyBinding) {\n this.registerKeyBinding(command.id, command.keyBinding);\n }\n });\n }\n\n private registerExistingCommandBindings() {\n const commands = commandRegistry.listCommands();\n Object.values(commands).forEach((command: Command) => {\n if (command.keyBinding) {\n this.registerKeyBinding(command.id, command.keyBinding);\n }\n });\n }\n\n /**\n * Parse a key binding string like \"CTRL+SHIFT+P\" or \"ALT+S\"\n */\n parseKeyBinding(keyBindingString: string): KeyBinding | null {\n if (!keyBindingString || keyBindingString.trim() === '') {\n return null;\n }\n\n const parts = keyBindingString.toUpperCase().split('+').map(p => p.trim());\n if (parts.length === 0) {\n return null;\n }\n\n const key = parts[parts.length - 1];\n const modifiers = parts.slice(0, -1);\n if (parts.length === 1 && KNOWN_MODIFIERS.has(key)) {\n return null;\n }\n\n const binding: Partial<KeyBinding> = { ctrl: false, alt: false, shift: false, meta: false };\n for (const modifier of modifiers) {\n const field = MODIFIER_ALIASES[modifier];\n if (field === undefined) return null;\n binding[field] = true;\n }\n binding.key = normalizeKey(key);\n return binding as KeyBinding;\n }\n\n /**\n * Create a unique key for a binding\n */\n private getBindingKey(binding: KeyBinding): string {\n const parts = [...MODIFIER_FIELDS.filter(f => binding[f]), binding.key.toUpperCase()];\n return parts.join('+');\n }\n\n /**\n * Register a key binding for a command\n */\n registerKeyBinding(commandId: string, keyBindingString: string): boolean {\n const binding = this.parseKeyBinding(keyBindingString);\n \n if (!binding) {\n logger.error(`Invalid key binding: ${keyBindingString}`);\n return false;\n }\n\n binding.commandId = commandId;\n \n const bindingKey = this.getBindingKey(binding);\n \n if (!this.bindings.has(bindingKey)) {\n this.bindings.set(bindingKey, []);\n }\n \n const existing = this.bindings.get(bindingKey)!;\n const sameCommand = existing.find(b => b.commandId === commandId);\n if (sameCommand) {\n logger.error(`Key binding ${keyBindingString} already registered for command ${commandId}`);\n return false;\n }\n const otherCommand = existing.find(b => b.commandId !== commandId);\n if (otherCommand) {\n logger.warn(`Key binding ${keyBindingString} already used by command ${otherCommand.commandId}; refusing for ${commandId}`);\n return false;\n }\n\n existing.push(binding);\n logger.debug(`Key binding registered: ${keyBindingString} -> ${commandId}`);\n \n return true;\n }\n\n /**\n * Unregister a key binding\n */\n unregisterKeyBinding(commandId: string, keyBindingString?: string): void {\n if (keyBindingString) {\n const binding = this.parseKeyBinding(keyBindingString);\n if (binding) {\n const bindingKey = this.getBindingKey(binding);\n const bindings = this.bindings.get(bindingKey);\n if (bindings) {\n const filtered = bindings.filter(b => b.commandId !== commandId);\n if (filtered.length === 0) {\n this.bindings.delete(bindingKey);\n } else {\n this.bindings.set(bindingKey, filtered);\n }\n }\n }\n } else {\n // Remove all bindings for this command\n for (const [key, bindings] of this.bindings.entries()) {\n const filtered = bindings.filter(b => b.commandId !== commandId);\n if (filtered.length === 0) {\n this.bindings.delete(key);\n } else {\n this.bindings.set(key, filtered);\n }\n }\n }\n }\n\n /**\n * Get all key bindings for a command\n */\n getKeyBindingsForCommand(commandId: string): string[] {\n const result: string[] = [];\n for (const bindings of this.bindings.values()) {\n for (const binding of bindings) {\n if (binding.commandId === commandId) {\n result.push(this.formatKeyBinding(binding));\n }\n }\n }\n return result.sort();\n }\n\n /**\n * Format a key binding for display\n */\n formatKeyBinding(binding: KeyBinding): string {\n const parts = MODIFIER_FIELDS.filter(f => binding[f]).map(f => MODIFIER_DISPLAY[f]);\n const key = binding.key.length === 1\n ? binding.key.toUpperCase()\n : binding.key.charAt(0).toUpperCase() + binding.key.slice(1).toLowerCase();\n parts.push(key);\n return parts.join('+');\n }\n\n /**\n * Handle keyboard events\n */\n private handleKeyDown(event: KeyboardEvent): void {\n if (!this.enabled) {\n return;\n }\n // event.key can be empty or layout-specific with some IMEs or dead keys\n const eventBinding: KeyBinding = {\n commandId: '',\n key: normalizeKey(event.key.toUpperCase()),\n ctrl: event.ctrlKey,\n alt: event.altKey,\n shift: event.shiftKey,\n meta: event.metaKey\n };\n const bindingKey = this.getBindingKey(eventBinding);\n const bindings = this.bindings.get(bindingKey);\n\n if (bindings && bindings.length > 0) {\n const binding = bindings[0];\n try {\n event.preventDefault();\n event.stopPropagation();\n const context = commandRegistry.createExecutionContext({});\n commandRegistry.execute(binding.commandId, context);\n logger.debug(`Executed command via key binding: ${binding.commandId}`);\n } catch (error: any) {\n logger.error(`Failed to execute command ${binding.commandId}: ${error.message}`);\n }\n }\n }\n\n /**\n * Enable or disable key binding handling\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n }\n\n /**\n * Check if key binding handling is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Get all registered key bindings\n */\n getAllBindings(): Map<string, KeyBinding[]> {\n const copy = new Map<string, KeyBinding[]>();\n for (const [key, bindings] of this.bindings) {\n copy.set(key, [...bindings]);\n }\n return copy;\n }\n\n /**\n * Clear all key bindings\n */\n clearAll(): void {\n this.bindings.clear();\n }\n}\n\nexport const keyBindingManager = new KeyBindingManager();\nrootContext.put(\"keyBindingManager\", keyBindingManager);\n\n","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 while (current) {\n paths.push(current.getName())\n current = current.getParent()\n }\n paths.reverse()\n // the first path is the workspace itself, remove it as the path is always realtive to the workspace\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 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 // Check if contents is a ReadableStream (for streaming large files)\n if (contents && typeof contents.pipeTo === 'function') {\n await contents.pipeTo(writable)\n } else {\n // Traditional approach for blobs, strings, etc.\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, this.getWorkspace());\n }\n}\n\nexport interface ResourceMap {\n [key: string]: Resource;\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, this.getWorkspace());\n }\n }\n return currentResource;\n }\n\n public touch() {\n publish(TOPIC_WORKSPACE_CHANGED, 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, 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, this.getWorkspace());\n }\n}\n\n/**\n * Interface for workspace contributions\n * \n * Allows extensions to register custom workspace implementations\n */\nexport interface WorkspaceContribution {\n /**\n * Unique identifier for this workspace type (e.g., 'filesystem', 'webdav')\n */\n type: string;\n\n /**\n * Display name for this workspace type\n */\n name: string;\n\n /**\n * Check if this contribution can handle the given connection input\n */\n canHandle(input: any): boolean;\n\n /**\n * Create a Directory from the given connection input\n */\n connect(input: any): Promise<Directory>;\n\n /**\n * Restore a workspace from persisted data\n */\n restore?(data: any): Promise<Directory | undefined>;\n\n /**\n * Prepare data for persistence\n */\n persist?(workspace: Directory): Promise<any>;\n}\n\ninterface PersistedWorkspaceData {\n type: string;\n data: any;\n}\n\nexport class WorkspaceService {\n private workspace?: Promise<Directory | undefined>;\n private currentType?: string;\n private contributions: Map<string, WorkspaceContribution> = new Map();\n\n constructor() {\n this.workspace = this.loadPersistedWorkspace();\n this.workspace.then(workspace => {\n if (workspace) {\n publish(TOPIC_WORKSPACE_CONNECTED, workspace);\n }\n });\n }\n\n /**\n * Register a workspace contribution\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 /**\n * Get all registered workspace contributions\n */\n getContributions(): WorkspaceContribution[] {\n return Array.from(this.contributions.values());\n }\n\n private async loadPersistedWorkspace(): Promise<Directory | undefined> {\n const persistedData = await persistenceService.getObject(\"workspace_data\") as PersistedWorkspaceData | null;\n \n if (!persistedData) {\n return undefined;\n }\n\n const contribution = this.contributions.get(persistedData.type);\n if (!contribution) {\n console.warn(`No contribution found for workspace type: ${persistedData.type}`);\n return undefined;\n }\n\n try {\n if (contribution.restore) {\n const workspace = await contribution.restore(persistedData.data);\n if (workspace) {\n this.currentType = persistedData.type;\n }\n return workspace;\n }\n } catch (error) {\n console.error(`Failed to restore workspace of type ${persistedData.type}:`, error);\n }\n\n return undefined;\n }\n\n async connectWorkspace(input: any): Promise<Directory> {\n // Find a contribution that can handle this input\n const contribution = Array.from(this.contributions.values()).find(c => c.canHandle(input));\n \n if (!contribution) {\n throw new Error('No workspace contribution can handle this input');\n }\n\n // Connect using the contribution\n const workspace = await contribution.connect(input);\n \n // Persist the workspace data\n const persistData = contribution.persist ? await contribution.persist(workspace) : input;\n const workspaceData: PersistedWorkspaceData = {\n type: contribution.type,\n data: persistData\n };\n await persistenceService.persistObject(\"workspace_data\", workspaceData);\n\n // Update current workspace\n this.currentType = contribution.type;\n this.workspace = Promise.resolve(workspace);\n publish(TOPIC_WORKSPACE_CONNECTED, workspace);\n\n return workspace;\n }\n\n public async getWorkspace(): Promise<Directory | undefined> {\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.workspace;\n }\n\n public getWorkspaceType(): string | undefined {\n return this.currentType;\n }\n\n public async disconnectWorkspace(): Promise<void> {\n this.workspace = undefined;\n this.currentType = undefined;\n await persistenceService.persistObject(\"workspace_data\", null);\n await persistenceService.persistObject(\"workspace\", null); // Clean up legacy\n }\n}\n\nexport const workspaceService = new WorkspaceService();\nrootContext.put(\"workspaceService\", workspaceService);\n\n// Register default filesystem contribution\nworkspaceService.registerContribution({\n type: 'filesystem',\n name: 'Local File System',\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});","import {EDITOR_AREA_MAIN} from \"./constants\";\nimport {KPart} from \"../parts/k-part\";\nimport {activePartSignal, activeEditorSignal, partDirtySignal} from \"./appstate\";\nimport {watchSignal} from \"./signals\";\nimport {subscribe} from \"./events\";\nimport {TOPIC_WORKSPACE_CONNECTED} from \"./filesys\";\nimport {KTabs} from \"../parts/k-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 editorId: string;\n title: string;\n icon?: string;\n data: any;\n noOverflow?: boolean;\n widgetFactory: (container: any, tab: HTMLElement) => any;\n state: { [key: string]: any };\n}\n\nexport interface EditorInputHandler {\n canHandle: (input: any) => boolean;\n handle: (input: any) => Promise<EditorInput>;\n lazyInit?: () => Promise<void> | void;\n ranking?: number; // Higher ranking = higher priority (default: 0)\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 * 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: KTabs) {\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 KPart => element instanceof KPart)\n parts.forEach((part) => {\n activePartSignal.set(part)\n // Only update activeEditorSignal if this is an editor part\n if ((part as KPart).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 KPart => element instanceof KPart)\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 KPart)\n }\n if (activeEditorSignal.get() == part) {\n activeEditorSignal.set(null as unknown as KPart)\n }\n })\n }\n // @ts-ignore\n editorArea.addEventListener(\"tab-closed\", closed)\n\n const dirtyHandler = (targetPart: KPart) => {\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 async handleInput(input: any) {\n // Handlers are already sorted by ranking, so iterate in order\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 return await editorInputHandler.handle(input);\n }\n }\n }\n\n getEditorArea(): KTabs | null {\n return document.querySelector(`k-tabs#${EDITOR_AREA_MAIN}`) as KTabs | null\n }\n\n async loadEditor(editorInput: EditorInput | any) {\n if (!editorInput) {\n return\n }\n\n if (!(\"widgetFactory\" in editorInput)) {\n editorInput = await this.handleInput(editorInput)\n }\n\n if (!editorInput || !(\"widgetFactory\" in editorInput)) {\n return\n }\n\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(editorInput.key)) {\n editorArea.activate(editorInput.key)\n return\n }\n\n editorArea.open({\n name: editorInput.key,\n editorId: editorInput.editorId,\n label: editorInput.title,\n icon: editorInput.icon,\n closable: true,\n noOverflow: editorInput.noOverflow,\n component: editorInput.widgetFactory\n } as 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 } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\nimport { KPart } from \"../parts/k-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 { commandRegistry } from \"../core/commandregistry\";\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\n@customElement('k-filebrowser')\nexport class KFileBrowser extends KPart {\n\n @state()\n private root?: TreeNode;\n private workspaceDir?: Directory\n private treeRef = createRef<HTMLElement>();\n private loadingNodes = new Set<TreeNode>();\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) => this.onWorkspaceChanged(workspaceDir));\n this.subscribe(TOPIC_WORKSPACE_CONNECTED, (workspaceDir: Directory) => this.onWorkspaceConnected(workspaceDir));\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 if (workspaceDir) {\n await this.loadWorkspace(workspaceDir!)\n } else {\n commandRegistry.execute(\"help\")\n }\n }\n\n protected renderToolbar() {\n const canModify = activeSelectionSignal.get() instanceof Resource;\n\n return html`\n <k-command icon=\"folder-open\" title=\"${t('CONNECT_WORKSPACE')}\" dropdown=\"filebrowser.connections\"></k-command>\n <k-command cmd=\"reload_workspace\" icon=\"repeat\" title=\"${t('RELOAD_WORKSPACE')}\"></k-command>\n <k-command cmd=\"create_file\" icon=\"plus\" title=\"${t('CREATE_NEW')}\" dropdown=\"filebrowser.create\"></k-command>\n <k-command cmd=\"rename_resource\" icon=\"pen\" ?disabled=${!canModify} title=\"${t('RENAME_RESOURCE')}\"></k-command>\n <k-command cmd=\"delete_resource\" icon=\"trash\" ?disabled=${!canModify} title=\"${t('DELETE_RESOURCE')}\"></k-command>\n `;\n }\n\n protected renderContextMenu() {\n const canModify = activeSelectionSignal.get() instanceof Resource;\n\n return html`\n <k-command cmd=\"open_editor\" icon=\"folder-open\">${t('OPEN')}</k-command>\n <k-command cmd=\"create_file\" icon=\"plus\" dropdown=\"filebrowser.create\">${t('CREATE_NEW')}</k-command>\n <k-command cmd=\"rename_resource\" icon=\"pen\" ?disabled=${!canModify}>${t('RENAME')}</k-command>\n <k-command cmd=\"delete_resource\" icon=\"trash\" ?disabled=${!canModify}>${t('DELETE')}</k-command>\n `;\n }\n\n async onWorkspaceChanged(workspaceDir: Directory) {\n activeSelectionSignal.set(undefined)\n await this.loadWorkspace(workspaceDir)\n await this.syncTreeSelection()\n }\n\n async onWorkspaceConnected(workspaceDir: Directory) {\n await this.loadWorkspace(workspaceDir)\n }\n\n async loadWorkspace(workspaceDir?: Directory) {\n this.workspaceDir = workspaceDir\n if (!workspaceDir) {\n this.root = undefined\n } else {\n this.root = await this.resourceToTreeNode(workspaceDir, true)\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: boolean = 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 && loadChildren) {\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 }\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\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><wa-icon name=${icon} label=\"${node.leaf ? t('FILE') : t('FOLDER')}\"></wa-icon> ${node.label}</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 filePath = (node.data as Resource).getWorkspacePath()\n this.executeCommand(\"open_editor\", {\n \"path\": filePath\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 activeSelectionSignal.set(node.data)\n } else {\n activeSelectionSignal.set(undefined)\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 <k-no-content message=\"${t('SELECT_WORKSPACE')}\"></k-no-content>`, () => html`\n `)}\n <wa-tree @wa-selection-change=${this.nobubble(this.onSelectionChanged)}\n style=\"--indent-guide-width: 1px;\">\n ${this.createTreeItems(this.root!, true)}\n </wa-tree>\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 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 'k-filebrowser': KFileBrowser\n }\n}\n","import {contributionRegistry, HTMLContribution} from \"../core/contributionregistry\";\nimport {TOOLBAR_BOTTOM_CENTER} from \"../core/constants\";\nimport {customElement} from \"lit/decorators.js\";\nimport {KPart} from \"../parts/k-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 html: \"<k-tasks></k-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 .task-item {\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) .task-item {\n background: var(--wa-color-neutral-95);\n border: 1px solid var(--wa-color-neutral-85);\n }\n \n .task-header {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n \n .task-name {\n font-weight: 600;\n font-size: 1rem;\n color: var(--wa-color-neutral-90);\n }\n \n :host-context(.wa-light) .task-name {\n color: var(--wa-color-neutral-10);\n }\n \n .task-message {\n font-size: 0.875rem;\n color: var(--wa-color-neutral-70);\n margin-top: 0.25rem;\n }\n \n :host-context(.wa-light) .task-message {\n color: var(--wa-color-neutral-30);\n }\n \n .task-progress {\n margin-top: 0.5rem;\n }\n \n wa-progress-bar {\n --track-height: 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=\"task-item\">\n <div class=\"task-header\">\n <wa-icon name=\"hourglass\" style=\"color: var(--wa-color-warning-fill-loud);\"></wa-icon>\n <div style=\"flex: 1;\">\n <div class=\"task-name\">${taskProgress.name}</div>\n ${taskProgress.message ? html`\n <div class=\"task-message\">${taskProgress.message}</div>\n ` : ''}\n </div>\n </div>\n <div class=\"task-progress\">\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('k-tasks')\nexport class KTasks extends KPart {\n static styles = css`\n :host {\n display: flex;\n align-items: center;\n }\n \n .task-indicator {\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 .task-indicator:hover {\n background: var(--wa-color-neutral-15);\n }\n \n :host-context(.wa-light) .task-indicator:hover {\n background: var(--wa-color-neutral-85);\n }\n \n .task-count {\n font-size: 0.875rem;\n color: var(--wa-color-neutral-70);\n }\n \n :host-context(.wa-light) .task-count {\n color: var(--wa-color-neutral-30);\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 // Show the dialog when clicking the hourglass\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=\"task-indicator\" @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=\"task-count\">${taskCount}</span>\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'k-tasks': KTasks\n }\n}","import {customElement} from \"lit/decorators.js\";\nimport {KElement} from \"../parts/k-element\";\nimport {html} from \"lit\";\nimport {workspaceService, TOPIC_WORKSPACE_CONNECTED} from \"../core/filesys\";\nimport {subscribe} from \"../core/events\";\nimport {commandRegistry} from \"../core/commandregistry\";\nimport {i18n} from \"../core/i18n\";\n\nconst t = i18n('workspace');\n\n@customElement('k-workspace-name')\nexport class KWorkspaceName extends KElement {\n \n private workspaceName = t('NO_WORKSPACE');\n\n protected doInitUI() {\n this.updateWorkspaceName();\n \n subscribe(TOPIC_WORKSPACE_CONNECTED, () => {\n this.updateWorkspaceName();\n });\n }\n\n private updateWorkspaceName() {\n workspaceService.getWorkspace().then(workspace => {\n this.workspaceName = workspace?.getName() || t('NO_WORKSPACE');\n this.requestUpdate();\n });\n }\n\n private handleLoadWorkspace() {\n commandRegistry.execute(\"load_workspace\", {\n source: this\n });\n }\n\n protected render() {\n return html`\n <wa-button \n appearance=\"plain\"\n size=\"small\"\n title=\"${t('LOAD_WORKSPACE')}\"\n @click=${this.handleLoadWorkspace}>\n <wa-icon name=\"folder-open\" slot=\"start\" label=\"Workspace\"></wa-icon>\n ${this.workspaceName}\n </wa-button>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'k-workspace-name': KWorkspaceName\n }\n}\n\n","import {customElement} from \"lit/decorators.js\";\nimport {KElement} from \"../parts/k-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/k-icon';\nimport {i18n} from \"../core/i18n\";\n\nconst t = i18n('partname');\n\ncontributionRegistry.registerContribution(TOOLBAR_BOTTOM_CENTER, {\n html: \"<k-part-name></k-part-name>\"\n} as HTMLContribution)\n\n@customElement('k-part-name')\nexport class KPartName extends KElement {\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 <k-icon slot=\"start\" name=\"${partIcon}\" label=\"Part\"></k-icon>\n ${this.getPartName()}\n </wa-button>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'k-part-name': KPartName\n }\n}\n\n","import {css, html} from 'lit'\nimport {when} from \"lit/directives/when.js\";\nimport {customElement, state} from 'lit/decorators.js'\nimport {KPart} from \"../parts/k-part\";\nimport {Extension, extensionRegistry, TOPIC_EXTENSIONS_CHANGED} from \"../core/extensionregistry\";\nimport '../widgets/k-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('KExtensions');\n\nconst t = i18n('extensions');\n\n\n@customElement('k-extensions')\nexport class KExtensions extends KPart {\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><k-icon name=\"${e.icon}\"></k-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><k-icon name=\"${e.icon}\"></k-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><k-icon name=\"${e.icon}\"></k-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 <k-icon name=\"${depExt?.icon || 'puzzle-piece'}\"></k-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 k-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 'k-extensions': KExtensions\n }\n}\n","import { css, html } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { KPart } from '../parts/k-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('k-log-terminal')\nexport class KLogTerminal extends KPart {\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 <k-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 </k-command>\n\n <k-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 </k-command>\n\n <k-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 </k-command>\n\n <k-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 </k-command>\n\n <k-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 </k-command>\n\n <wa-divider orientation=\"vertical\"></wa-divider>\n\n <k-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 </k-command>\n\n <k-command \n icon=\"trash\" \n title=\"${t('CLEAR_LOGS')}\"\n .action=${() => this.clear()}>\n ${t('CLEAR')}\n </k-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: break-word;\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 'k-log-terminal': KLogTerminal;\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 { KWidget } from '../widgets/k-widget'\nimport '../widgets/k-icon'\nimport { keyBindingManager } from '../core/keybindings'\nimport { contributionRegistry, Contribution, CommandContribution, HTMLContribution, ContributionChangeEvent, TOPIC_CONTRIBUTEIONS_CHANGED } from '../core/contributionregistry'\nimport { subscribe } from '../core/events'\nimport { Signal } from '@lit-labs/signals'\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'\n\n@customElement('k-command')\nexport class KCommand extends KWidget {\n @property()\n cmd: string = ''\n\n @property({ type: Object, attribute: false })\n action?: (event?: Event) => void\n\n @property()\n title: string = ''\n\n @property()\n label?: boolean = false\n\n @property()\n icon?: string\n\n @property({ type: Boolean })\n disabled: boolean = false\n\n @property()\n appearance: 'default' | 'plain' | 'outline' | 'accent' | 'filled-outlined' | 'filled' | 'outlined' = 'plain'\n\n @property()\n variant: 'neutral' | 'brand' | 'success' | 'warning' | 'danger' = 'neutral'\n\n @property()\n size: 'small' | 'medium' | 'large' = 'small'\n\n @property({ type: Object, attribute: false })\n params: Record<string, any> = {}\n\n @property()\n dropdown?: string\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 @state()\n private dropdownContributions: Contribution[] = []\n\n private handleClick(event?: Event) {\n if (this.disabled) return\n\n if (event) {\n event.stopPropagation()\n }\n\n if (this.action) {\n this.action(event)\n return\n }\n\n if (this.cmd) {\n const dropdown = this.closest('wa-dropdown') as any;\n if (dropdown && dropdown.open !== undefined) {\n dropdown.open = false;\n }\n this.executeCommand(this.cmd, this.params);\n }\n }\n\n private handleSelect(event: CustomEvent) {\n // Close dropdown immediately when any item is selected\n // This ensures the dropdown is hidden before the command executes\n const dropdown = event.target as any;\n if (dropdown && dropdown.open !== undefined) {\n dropdown.open = false;\n }\n }\n\n private isInDropdown(): boolean {\n return !!this.closest('wa-dropdown, wa-dropdown-menu')\n }\n\n private getKeybinding(): string | null {\n if (!this.cmd || this.action) return null\n const keybindings = keyBindingManager.getKeyBindingsForCommand(this.cmd)\n return keybindings.length > 0 ? keybindings[0] : null\n }\n\n protected doBeforeUI() {\n if (this.dropdown) {\n this.loadDropdownContributions()\n \n subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: ContributionChangeEvent) => {\n if (this.dropdown && event.target === this.dropdown) {\n this.dropdownContributions = event.contributions;\n this.requestUpdate();\n }\n })\n }\n }\n\n private loadDropdownContributions() {\n if (!this.dropdown) return\n this.dropdownContributions = contributionRegistry.getContributions(this.dropdown)\n this.requestUpdate()\n }\n\n private renderContribution(contribution: Contribution) {\n if ('command' in contribution) {\n const commandContribution = contribution as CommandContribution\n const disabled = (commandContribution.disabled as Signal.Computed<boolean>)?.get()\n return html`\n <k-command \n cmd=\"${commandContribution.command}\"\n icon=\"${commandContribution.icon || ''}\"\n .params=${commandContribution.params || {}}\n ?disabled=\"${disabled}\">\n ${commandContribution.label}\n </k-command>\n `\n }\n \n if ('html' in contribution) {\n const htmlContribution = contribution as HTMLContribution\n const contents = htmlContribution.html\n if (contents instanceof Function) {\n return contents()\n }\n return unsafeHTML(contents)\n }\n \n return nothing\n }\n\n render() {\n const keybinding = this.getKeybinding()\n\n if (this.isInDropdown()) {\n return html`\n <wa-dropdown-item \n ?disabled=${this.disabled}\n @click=${(e: Event) => this.handleClick(e)}>\n <k-icon name=\"${this.icon}\" label=\"${this.title}\" slot=\"icon\"></k-icon>\n <slot></slot>\n ${keybinding ? html`<span class=\"keybinding\">${keybinding}</span>` : ''}\n </wa-dropdown-item>\n `\n }\n\n if (this.dropdown) {\n return html`\n <wa-dropdown \n placement=${this.placement}\n @wa-select=${(e: CustomEvent) => this.handleSelect(e)}>\n <wa-button \n slot=\"trigger\"\n appearance=${this.appearance}\n variant=${this.variant}\n size=${this.size}\n ?disabled=${this.disabled}\n with-caret\n title=${keybinding ? `${this.title} (${keybinding})` : this.title}>\n <k-icon slot=\"start\" name=\"${this.icon}\" label=\"${this.title}\"></k-icon>\n <slot></slot>\n ${this.label ? this.title : nothing}\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.dropdownContributions.map(c => this.renderContribution(c))}\n \n ${this.cmd ? html`\n <wa-divider></wa-divider>\n <k-command \n cmd=\"${this.cmd}\"\n icon=\"${this.icon || ''}\"\n .params=${this.params}\n ?disabled=${this.disabled}>\n <slot></slot>\n ${this.title}\n </k-command>\n ` : nothing}\n </wa-dropdown>\n `\n }\n\n return html`\n <wa-button\n appearance=${this.appearance}\n variant=${this.variant}\n size=${this.size}\n ?disabled=${this.disabled}\n title=${keybinding ? `${this.title} (${keybinding})` : this.title}\n @click=${(e: Event) => this.handleClick(e)}>\n <k-icon slot=\"start\" name=\"${this.icon}\" label=\"${this.title}\"></k-icon>\n <slot></slot>\n </wa-button>\n `\n }\n\n static styles = css`\n :host {\n display: inline-block;\n }\n\n .keybinding {\n margin-left: auto;\n padding: 2px 6px;\n background: var(--wa-color-neutral-15);\n border: 1px solid var(--wa-color-neutral-25);\n border-radius: 3px;\n font-size: 10px;\n font-family: monospace;\n opacity: 0.7;\n }\n\n :host-context(.wa-light) .keybinding {\n background: var(--wa-color-neutral-85);\n border: 1px solid var(--wa-color-neutral-75);\n }\n `\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'k-command': KCommand\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 { KWidget } from '../widgets/k-widget'\nimport '../widgets/k-icon'\nimport { contributionRegistry, TabContribution, ContributionChangeEvent, TOPIC_CONTRIBUTEIONS_CHANGED } from '../core/contributionregistry'\nimport { subscribe } from '../core/events'\nimport { Signal } from '@lit-labs/signals'\nimport { KTabs } from '../parts/k-tabs'\nimport { i18n } from '../core/i18n'\n\nconst t = i18n('fastviews');\n\n@customElement('k-fastviews')\nexport class KFastViews extends KWidget {\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<KTabs> = 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(`k-tabs#${this.containerId}`) as KTabs | null\n if (!tabContainer) {\n console.error(`k-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 <k-icon name=\"${contribution.icon || ''}\" label=\"${contribution.label}\" slot=\"icon\"></k-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 <k-icon slot=\"start\" name=\"${this.icon}\" label=\"${this.title}\"></k-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 <k-tabs \n ${ref(this.tabsRef)}\n id=\"${this.getDrawerTabsId()}\"\n style=\"width: 100%; height: 100%; display: flex; flex-direction: column;\">\n </k-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 'k-fastviews': KFastViews\n }\n}\n\n","import { html, render, css } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\nimport { KElement } from \"../parts/k-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('k-language-selector')\nexport class KLanguageSelector extends KElement {\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 'k-language-selector': KLanguageSelector;\n }\n}\n\n","import { html, css } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { KElement } from \"../parts/k-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('k-app-switcher')\nexport class KAppSwitcher extends KElement {\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 'k-app-switcher': KAppSwitcher;\n }\n}\n\n","import { html } from \"lit\";\nimport { contributionRegistry } from \"../core/contributionregistry\";\nimport {\n SIDEBAR_MAIN,\n TOOLBAR_BOTTOM,\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`<k-filebrowser id=\"${id}\"></k-filebrowser>`\n});\n\ncontributionRegistry.registerContribution(\"system.fastviews-bottomend\", {\n name: \"log-terminal\",\n label: \"Log Messages\",\n icon: \"list\",\n component: (id: string) => html`<k-log-terminal id=\"${id}\"></k-log-terminal>`\n});\n\ncontributionRegistry.registerContribution(TOOLBAR_BOTTOM, {\n slot: \"start\",\n label: \"Workspace\",\n html: `<k-workspace-name></k-workspace-name>`\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 html: `<k-fastviews target=\"system.fastviews-bottomend\" icon=\"bolt\" title=\"Fast Views\"></k-fastviews>`\n});\n\ncontributionRegistry.registerContribution(TOOLBAR_BOTTOM_END, {\n label: \"Language\",\n html: () => html`<k-language-selector></k-language-selector>`\n});\n\ncontributionRegistry.registerContribution(TOOLBAR_MAIN_RIGHT, {\n label: \"App Switcher\",\n html: () => html`<k-app-switcher></k-app-switcher>`\n});\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 {promptDialog, confirmDialog} from \"../dialogs\";\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\": \"create_file\",\n \"name\": \"Create new file\",\n \"description\": \"Creates a new file within the workspace. For .geospace map files, use create_map_file instead.\",\n \"keyBinding\": \"CTRL+N\",\n \"parameters\": [\n {\n \"name\": \"path\",\n \"description\": \"the path including name of the file to be created, must be relative to the workspace\",\n \"required\": false\n },\n {\n \"name\": \"contents\",\n \"description\": \"the textual contents of the file\",\n \"required\": false\n },\n {\n \"name\": \"ask\",\n \"description\": \"whether to prompt the user for the file path\",\n \"required\": false\n },\n {\n \"name\": \"extension\",\n \"description\": \"required file extension (e.g., '.geospace'), will be appended if missing\",\n \"required\": false\n }\n ],\n \"output\": [\n {\n \"name\": \"path\",\n \"description\": \"the path of the created file\"\n }\n ]\n },\n handler: {\n execute: async ({params}: any) => {\n let path = params?.path\n const contents = params?.contents\n const ask = params?.ask\n const extension = params?.extension\n\n if (ask || !path) {\n path = await promptDialog(\"Enter path to new file (directories will be created if not exist):\", path || \"\")\n if (!path) {\n return\n }\n }\n\n if (extension && !path.endsWith(extension)) {\n path += extension\n }\n\n const result = await getWorkspaceAndPath({path}, true)\n if (!result) {\n return\n }\n const { workspace: workspaceDir } = result\n\n const existingResource = await workspaceDir.getResource(path)\n if (existingResource) {\n const overwrite = await confirmDialog(`File \"${path}\" already exists. Do you want to overwrite it?`)\n if (!overwrite) {\n return\n }\n }\n\n const createdResource = await workspaceDir.getResource(path, {create: true})\n if (!createdResource) {\n toastError(\"Could not create file: \" + path)\n } else {\n if (contents) {\n await (createdResource as File).saveContents(contents)\n }\n logger.info(\"File created: \" + path)\n }\n\n return path\n }\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"rename_resource\",\n \"name\": \"Rename a resource (file or directory)\",\n \"description\": \"Renames a resource (file or directory)\",\n \"keyBinding\": \"F2\",\n \"parameters\": [\n {\n \"name\": \"path\",\n \"description\": \"the path of the resource within the workspace to rename or the currently active selection\",\n \"required\": false\n },\n {\n \"name\": \"newName\",\n \"description\": \"the new name for the resource\",\n \"required\": false\n }\n ]\n },\n handler: {\n execute: async context => {\n const resource = await getResourceFromContext(context)\n if (!resource) {\n toastError(\"No resource to rename provided!\")\n return\n }\n\n const currentName = resource.getName()\n const newName = context.params?.newName || \n await promptDialog(`Enter new name for \"${currentName}\":`, currentName)\n \n if (!newName || newName === currentName) {\n return\n }\n\n try {\n await resource.rename(newName)\n toastInfo(`Resource renamed to: ${newName}`)\n } catch (err: any) {\n toastError(`Failed to rename ${currentName}: ${err.message}`)\n }\n }\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"delete_resource\",\n \"name\": \"Delete a resource (file or directory)\",\n \"description\": \"Deletes a resource (file or directory)\",\n \"parameters\": [\n {\n \"name\": \"path\",\n \"description\": \"the path of the resource within the workspace to delete or the currently active selection\",\n \"required\": false\n },\n {\n \"name\": \"confirm\",\n \"description\": \"whether to ask the user to confirm the deletion, true by default\",\n \"required\": false\n }\n ]\n },\n handler: {\n execute: async context => {\n const resource = await getResourceFromContext(context)\n if (!resource) {\n toastError(\"No resource to delete provided!\")\n return\n }\n const path = resource.getWorkspacePath()\n const confirmParam = context.params && context.params[\"confirm\"]\n let yes = true\n if (confirmParam === undefined || confirmParam === true) {\n yes = await confirmDialog(`Are you sure you want to delete ${path}?`)\n }\n\n if (yes) {\n try {\n await resource.delete()\n toastInfo(\"Resource deleted: \" + path)\n } catch (err: any) {\n toastError(`Resource ${path} could not be deleted: ${err.message || err}`)\n }\n }\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\": \"reload_workspace\",\n \"name\": \"Reload workspace folder\",\n \"description\": \"Reloads the active workspace folder\",\n \"parameters\": []\n },\n handler: {\n execute: async _context => {\n const workspace = await workspaceService.getWorkspace()\n if (!workspace) {\n toastError(\"No workspace selected.\")\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\": \"tha path of the file to open within the workspace\",\n \"required\": true\n }\n ]\n },\n handler: {\n execute: async context => {\n const result = await getWorkspaceAndFile({path: context.params?.[\"path\"]})\n if (!result) {\n return\n }\n\n const { file } = result\n await editorRegistry.loadEditor(file)\n }\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"head_file\",\n \"name\": \"Head - Show first lines\",\n \"description\": \"Shows the first N lines of a file\",\n \"parameters\": [\n {\n \"name\": \"path\",\n \"description\": \"the path of the file to read\",\n \"required\": true\n },\n {\n \"name\": \"lines\",\n \"description\": \"number of lines to show from the beginning (default: 10)\",\n \"type\": \"number\",\n \"required\": false\n }\n ],\n \"output\": [\n {\n \"name\": \"content\",\n \"description\": \"the first N lines of the file\"\n }\n ]\n },\n handler: {\n execute: async ({params}: any) => {\n const result = await getWorkspaceAndFile(params)\n if (!result) {\n return\n }\n\n const { file } = result\n const numLines = params?.lines ? parseInt(params.lines, 10) : 10\n if (isNaN(numLines) || numLines < 1) {\n toastError(\"Number of lines must be a positive integer\")\n return\n }\n\n const contents = await readTextFile(file)\n if (!contents) {\n return\n }\n\n const lines = contents.split('\\n')\n const headLines = lines.slice(0, numLines).join('\\n')\n return headLines\n }\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"tail_file\",\n \"name\": \"Tail - Show last lines\",\n \"description\": \"Shows the last N lines of a file\",\n \"parameters\": [\n {\n \"name\": \"path\",\n \"description\": \"the path of the file to read\",\n \"required\": true\n },\n {\n \"name\": \"lines\",\n \"description\": \"number of lines to show from the end (default: 10)\",\n \"type\": \"number\",\n \"required\": false\n }\n ],\n \"output\": [\n {\n \"name\": \"content\",\n \"description\": \"the last N lines of the file\"\n }\n ]\n },\n handler: {\n execute: async ({params}: any) => {\n const result = await getWorkspaceAndFile(params)\n if (!result) {\n return\n }\n\n const { file } = result\n const numLines = params?.lines ? parseInt(params.lines, 10) : 10\n if (isNaN(numLines) || numLines < 1) {\n toastError(\"Number of lines must be a positive integer\")\n return\n }\n\n const contents = await readTextFile(file)\n if (!contents) {\n return\n }\n\n const lines = contents.split('\\n')\n const tailLines = lines.slice(-numLines).join('\\n')\n return tailLines\n }\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"cat_file\",\n \"name\": \"Cat - Show file contents\",\n \"description\": \"Shows the complete contents of a file\",\n \"parameters\": [\n {\n \"name\": \"path\",\n \"description\": \"the path of the file to read\",\n \"required\": true\n }\n ],\n \"output\": [\n {\n \"name\": \"content\",\n \"description\": \"the complete contents of the file\"\n }\n ]\n },\n handler: {\n execute: async ({params}: any) => {\n const result = await getWorkspaceAndFile(params)\n if (!result) {\n return\n }\n\n const { file } = result\n\n return await readTextFile(file)\n }\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"wc_file\",\n \"name\": \"Word count\",\n \"description\": \"Counts lines, words, and characters in a file\",\n \"parameters\": [\n {\n \"name\": \"path\",\n \"description\": \"the path of the file to analyze\",\n \"required\": true\n }\n ],\n \"output\": [\n {\n \"name\": \"lines\",\n \"description\": \"number of lines in the file\"\n },\n {\n \"name\": \"words\",\n \"description\": \"number of words in the file\"\n },\n {\n \"name\": \"characters\",\n \"description\": \"number of characters in the file\"\n }\n ]\n },\n handler: {\n execute: async ({params}: any) => {\n const result = await getWorkspaceAndFile(params)\n if (!result) {\n return\n }\n\n const { file } = result\n\n const contents = await readTextFile(file)\n if (!contents) {\n return\n }\n\n const lines = contents.split('\\n')\n const lineCount = lines.length\n const wordCount = contents.trim() === '' ? 0 : contents.trim().split(/\\s+/).filter(w => w.length > 0).length\n const charCount = contents.length\n\n return {\n lines: lineCount,\n words: wordCount,\n characters: charCount\n }\n }\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"file_exists\",\n \"name\": \"Check if file exists\",\n \"description\": \"Checks if a file exists at the given path\",\n \"parameters\": [\n {\n \"name\": \"path\",\n \"description\": \"the path of the file to check, relative to the workspace\",\n \"required\": true\n }\n ],\n \"output\": [\n {\n \"name\": \"exists\",\n \"description\": \"true if the file exists, false otherwise\"\n }\n ]\n },\n handler: {\n execute: async ({params}: any) => {\n const result = await getWorkspaceAndPath(params)\n if (!result) {\n return false\n }\n\n const { workspace, path } = result\n\n try {\n const resource = await workspace.getResource(path)\n return resource instanceof File\n } catch (err: any) {\n return false\n }\n }\n }\n})\n\nasync function collectFilesRecursive(directory: Directory): Promise<string[]> {\n const files: string[] = []\n const children = await directory.listChildren(true)\n \n for (const child of children) {\n if (child instanceof File) {\n files.push(child.getWorkspacePath())\n } else if (child instanceof Directory) {\n const subFiles = await collectFilesRecursive(child)\n files.push(...subFiles)\n }\n }\n \n return files\n}\n\nregisterAll({\n command: {\n \"id\": \"ls\",\n \"name\": \"List files\",\n \"description\": \"Lists files from a directory. If recursive is provided, it traverses from the provided directory down to all leaves. If no directory is provided, it will traverse from the workspace root.\",\n \"parameters\": [\n {\n \"name\": \"path\",\n \"description\": \"the path of the directory to list, relative to the workspace. If not provided, uses workspace root\",\n \"required\": false\n },\n {\n \"name\": \"recursive\",\n \"description\": \"whether to recursively traverse all subdirectories\",\n \"type\": \"boolean\",\n \"required\": false\n }\n ],\n \"output\": [\n {\n \"name\": \"files\",\n \"description\": \"array of file objects with path and size information\"\n }\n ]\n },\n handler: {\n execute: async ({params}: any) => {\n const result = await getWorkspaceAndPath(params, false)\n if (!result) {\n toastError(\"No workspace available\")\n return []\n }\n\n const { workspace, path } = result\n const recursive = params?.recursive === true || params?.recursive === \"true\"\n\n try {\n let targetDir: Directory = workspace\n \n if (path) {\n const resource = await workspace.getResource(path)\n if (!resource) {\n toastError(`Path not found: ${path}`)\n return []\n }\n if (!(resource instanceof Directory)) {\n toastError(`Path is not a directory: ${path}`)\n return []\n }\n targetDir = resource\n }\n\n if (recursive) {\n const files = await collectFilesRecursive(targetDir)\n const result = []\n for (const filePath of files) {\n const file = await workspace.getResource(filePath)\n if (file instanceof File) {\n const size = await file.size()\n result.push({\n path: filePath,\n size: size\n })\n }\n }\n return result\n } else {\n const children = await targetDir.listChildren(true)\n const result = []\n for (const child of children) {\n if (child instanceof File) {\n const size = await child.size()\n result.push({\n path: child.getWorkspacePath(),\n size: size\n })\n }\n }\n return result\n }\n } catch (err: any) {\n toastError(`Failed to list files: ${err.message}`)\n return []\n }\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\": \"js\",\n \"name\": \"Run JavaScript file\",\n \"description\": \"Executes a JavaScript file given its path\",\n \"parameters\": [\n {\n \"name\": \"script\",\n \"description\": \"the path to a JavaScript file to run\",\n \"required\": false\n }\n ]\n }\n})\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\nregisterAll({\n command: {\n \"id\": \"run_python\",\n \"name\": \"Run Python Cell\",\n \"description\": \"Runs active Python code in a supporting context (e.g. notebook, terminal, etc.)\",\n \"keyBinding\": \"CTRL+R\",\n \"parameters\": []\n }\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 = {\n title: \"Extensions\",\n data: {},\n key: \"system.extensions\",\n editorId: \"extensions-editor\",\n icon: \"puzzle-piece\",\n state: {},\n noOverflow: true,\n } as EditorInput\n editorInput.widgetFactory = () => html`\n <k-extensions></k-extensions>`\n editorRegistry.loadEditor(editorInput).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","// 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 framework-wide 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 {KContainer} from \"../parts/k-container\";\n\n@customElement('k-standard-layout')\nexport class KStandardLayout extends KContainer {\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 k-standard-layout {\n display: flex;\n flex-direction: column;\n height: 100vh;\n width: 100%;\n }\n \n k-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 k-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 k-standard-layout .main-layout {\n flex: 1;\n min-height: 0;\n }\n \n k-standard-layout .toolbar-end {\n justify-self: end;\n }\n </style>\n \n <div class=\"toolbar-top\">\n <k-toolbar id=${TOOLBAR_MAIN}></k-toolbar>\n <k-toolbar id=${TOOLBAR_MAIN_CENTER}></k-toolbar>\n <k-toolbar class=\"toolbar-end\" id=${TOOLBAR_MAIN_RIGHT}></k-toolbar>\n </div>\n \n <k-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 <k-resizable-grid \n id=\"left-sidebar-split\" \n orientation=\"vertical\" \n sizes=\"50%, 50%\">\n <k-tabs id=\"${SIDEBAR_MAIN}\"></k-tabs>\n <k-tabs id=\"${SIDEBAR_MAIN_BOTTOM}\"></k-tabs>\n </k-resizable-grid>\n `\n : html`<k-tabs id=\"${SIDEBAR_MAIN}\"></k-tabs>`\n }\n `\n : nothing\n }\n \n ${this.showBottomPanel\n ? html`\n <k-resizable-grid \n id=\"editor-area-split\" \n orientation=\"vertical\" \n sizes=\"70%, 30%\">\n <k-tabs id=\"${EDITOR_AREA_MAIN}\"></k-tabs>\n <k-tabs id=\"${PANEL_BOTTOM}\"></k-tabs>\n </k-resizable-grid>\n `\n : html`<k-tabs id=\"${EDITOR_AREA_MAIN}\"></k-tabs>`\n }\n \n ${this.showAuxSidebar\n ? html`<k-tabs id=\"${SIDEBAR_AUXILIARY}\"></k-tabs>`\n : nothing\n }\n </k-resizable-grid>\n \n <div class=\"toolbar-bottom\">\n <k-toolbar id=${TOOLBAR_BOTTOM}></k-toolbar>\n <k-toolbar id=${TOOLBAR_BOTTOM_CENTER}></k-toolbar>\n <k-toolbar class=\"toolbar-end\" id=${TOOLBAR_BOTTOM_END}></k-toolbar>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'k-standard-layout': KStandardLayout;\n }\n}\n"],"names":["i18nService","namespace","logger","FileContentType","t","__decorateClass","isEnabled","drawer","state","result","getDialogContainer"],"mappings":"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"}