@eclipse-docks/extension-python-runtime 0.7.122 → 0.7.125

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ import "./pyservice-DGwNXWO4.js";
2
+ import "./package-manager-DJaTJoVI.js";
package/dist/api.js CHANGED
@@ -1,4 +1,4 @@
1
1
  import { t as PyEnv } from "./pyservice-DGwNXWO4.js";
2
- import { t as pythonPackageManagerService } from "./package-manager-DcDiJbD3.js";
3
- import "./api-C6Mnm5y_.js";
2
+ import { t as pythonPackageManagerService } from "./package-manager-DJaTJoVI.js";
3
+ import "./api-DpvBDibr.js";
4
4
  export { PyEnv, pythonPackageManagerService };
@@ -3,8 +3,8 @@ import { registerAll, toastError } from "@eclipse-docks/core";
3
3
  //#region src/commands.ts
4
4
  registerAll({
5
5
  command: {
6
- id: "python",
7
- name: "Run Python Cell",
6
+ id: "python.runCode",
7
+ name: "Run Python Code",
8
8
  description: "Runs Python code.",
9
9
  keyBinding: "CTRL+R",
10
10
  parameters: [{
@@ -26,4 +26,4 @@ registerAll({
26
26
  });
27
27
  //#endregion
28
28
 
29
- //# sourceMappingURL=commands-D0y3XxCw.js.map
29
+ //# sourceMappingURL=commands-Cn6_ogss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands-Cn6_ogss.js","names":[],"sources":["../src/commands.ts"],"sourcesContent":["import { registerAll, toastError } from \"@eclipse-docks/core\";\nimport { PyEnv } from \"./pyservice\";\n\nregisterAll({\n command: {\n id: \"python.runCode\",\n name: \"Run Python Code\",\n description: \"Runs Python code.\",\n keyBinding: \"CTRL+R\",\n parameters: [\n {\n name: \"code\",\n description: \"Python code to execute\",\n required: true\n }\n ]\n },\n handler: {\n execute: async (context: any) => {\n const code: string | undefined = context.params?.code;\n if (!code) {\n toastError(\"No Python code provided.\");\n return;\n }\n const pyenv = new PyEnv();\n await pyenv.init({ params: context.params });\n return await pyenv.execCode(code);\n }\n }\n});\n\n"],"mappings":";;;AAGA,YAAY;CACV,SAAS;EACP,IAAI;EACJ,MAAM;EACN,aAAa;EACb,YAAY;EACZ,YAAY,CACV;GACE,MAAM;GACN,aAAa;GACb,UAAU;GACX,CACF;EACF;CACD,SAAS,EACP,SAAS,OAAO,YAAiB;EAC/B,MAAM,OAA2B,QAAQ,QAAQ;AACjD,MAAI,CAAC,MAAM;AACT,cAAW,2BAA2B;AACtC;;EAEF,MAAM,QAAQ,IAAI,OAAO;AACzB,QAAM,MAAM,KAAK,EAAE,QAAQ,QAAQ,QAAQ,CAAC;AAC5C,SAAO,MAAM,MAAM,SAAS,KAAK;IAEpC;CACF,CAAC"}
package/dist/index.js CHANGED
@@ -9,9 +9,9 @@ extensionRegistry.registerExtension({
9
9
  id: pkg.name,
10
10
  name: t.EXT_PYTHONRUNTIME_NAME,
11
11
  description: t.EXT_PYTHONRUNTIME_DESC,
12
- loader: () => Promise.all([import("./python-runtime-extension-BZ3XkDRK.js"), import("./commands-D0y3XxCw.js")]),
12
+ loader: () => Promise.all([import("./python-runtime-extension-u9NoE4Xj.js"), import("./commands-Cn6_ogss.js")]),
13
13
  icon: "docks python",
14
- dependencies: ["@eclipse-docks/extension-terminal"]
14
+ dependencies: ["@eclipse-docks/extension-terminal", "@eclipse-docks/extension-monaco-editor"]
15
15
  });
16
16
  //#endregion
17
17
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry, i18n } from '@eclipse-docks/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_PYTHONRUNTIME_NAME,\n description: t.EXT_PYTHONRUNTIME_DESC,\n loader: () => Promise.all([\n import(\"./python-runtime-extension\"),\n import(\"./commands\"),\n ]),\n icon: \"docks python\",\n dependencies: [\"@eclipse-docks/extension-terminal\"],\n});\n"],"mappings":";;;AAGA,IAAM,IAAI,MAAM,KAAK,uBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,CAAgC,EAAE,KAAK;AAE5D,kBAAkB,kBAAkB;CAClC,IAAI,IAAI;CACR,MAAM,EAAE;CACR,aAAa,EAAE;CACf,cAAc,QAAQ,IAAI,CACxB,OAAO,2CACP,OAAO,0BACR,CAAC;CACF,MAAM;CACN,cAAc,CAAC,oCAAA;CAChB,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry, i18n } from '@eclipse-docks/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_PYTHONRUNTIME_NAME,\n description: t.EXT_PYTHONRUNTIME_DESC,\n loader: () => Promise.all([\n import(\"./python-runtime-extension\"),\n import(\"./commands\"),\n ]),\n icon: \"docks python\",\n dependencies: [\"@eclipse-docks/extension-terminal\",\"@eclipse-docks/extension-monaco-editor\"],\n});\n"],"mappings":";;;AAGA,IAAM,IAAI,MAAM,KAAK,uBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,CAAgC,EAAE,KAAK;AAE5D,kBAAkB,kBAAkB;CAClC,IAAI,IAAI;CACR,MAAM,EAAE;CACR,aAAa,EAAE;CACf,cAAc,QAAQ,IAAI,CACxB,OAAO,2CACP,OAAO,0BACR,CAAC;CACF,MAAM;CACN,cAAc,CAAC,qCAAoC,yCAAA;CACpD,CAAC"}
@@ -124,7 +124,7 @@ var DocksPythonPackageManager = class DocksPythonPackageManager extends LitEleme
124
124
  <wa-icon name="box" style="opacity: 0.5;"></wa-icon>
125
125
  <span class="package-name">${pkg}</span>
126
126
  <wa-button
127
- size="small"
127
+ size="s"
128
128
  variant="text"
129
129
  @click=${() => this.removePackage(pkg)}
130
130
  title="Remove package">
@@ -280,4 +280,4 @@ rootContext.put("pythonPackageManagerService", pythonPackageManagerService);
280
280
  //#endregion
281
281
  export { pythonPackageManagerService as t };
282
282
 
283
- //# sourceMappingURL=package-manager-DcDiJbD3.js.map
283
+ //# sourceMappingURL=package-manager-DJaTJoVI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager-DJaTJoVI.js","names":[],"sources":["../src/package-manager.ts"],"sourcesContent":["import { css, html, LitElement } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { ref } from \"lit/directives/ref.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { PyEnv } from \"./pyservice\";\nimport { rootContext } from \"@eclipse-docks/core\";\n\nexport interface PackageManagerOptions {\n packages: string[];\n onPackageAdded?: (packageName: string) => void;\n onPackageRemoved?: (packageName: string) => void;\n pyenv?: PyEnv;\n}\n\n@customElement('docks-python-package-manager')\nexport class DocksPythonPackageManager extends LitElement {\n @property({ type: Boolean })\n open: boolean = false;\n\n @property({ type: Array })\n packages: string[] = [];\n\n @property({ attribute: false })\n pyenv?: PyEnv;\n\n @state()\n private loadingPackages: boolean = false;\n\n @state()\n private packageLoadError?: string;\n\n private onPackageAdded?: (packageName: string) => void;\n private onPackageRemoved?: (packageName: string) => void;\n\n public configure(options: PackageManagerOptions) {\n this.packages = options.packages || [];\n this.pyenv = options.pyenv;\n this.onPackageAdded = options.onPackageAdded;\n this.onPackageRemoved = options.onPackageRemoved;\n }\n\n public show() {\n this.open = true;\n }\n\n public hide() {\n this.open = false;\n }\n\n private addPackage(packageName: string) {\n if (!packageName || packageName.trim() === '') return;\n\n const trimmedName = packageName.trim();\n if (!this.packages.includes(trimmedName)) {\n this.packages = [...this.packages, trimmedName];\n this.onPackageAdded?.(trimmedName);\n }\n }\n\n private removePackage(packageName: string) {\n const index = this.packages.indexOf(packageName);\n if (index > -1) {\n this.packages = this.packages.filter(pkg => pkg !== packageName);\n this.onPackageRemoved?.(packageName);\n }\n }\n\n private async reloadPackages() {\n if (!this.pyenv) return;\n\n this.loadingPackages = true;\n this.packageLoadError = undefined;\n\n try {\n await this.pyenv.loadPackages(this.packages);\n } catch (error) {\n this.packageLoadError = String(error);\n } finally {\n this.loadingPackages = false;\n }\n }\n\n render() {\n let newPackageInput: HTMLInputElement | undefined;\n\n return html`\n <wa-dialog \n label=\"Manage Required Packages\" \n ?open=${this.open}\n @wa-after-hide=${() => {\n this.open = false;\n this.dispatchEvent(new CustomEvent('hide', { bubbles: true, composed: true }));\n }}>\n <div class=\"package-manager\">\n <p class=\"package-manager-description\">\n Specify Python packages that should be automatically loaded when connecting to the kernel.\n </p>\n\n ${this.loadingPackages ? html`\n <wa-alert variant=\"primary\" open>\n <wa-icon slot=\"icon\" name=\"circle-notch\" library=\"fa\" class=\"spinning\"></wa-icon>\n Loading packages...\n </wa-alert>\n ` : ''}\n\n ${this.packageLoadError ? html`\n <wa-alert variant=\"danger\" open closable @wa-after-hide=${() => this.packageLoadError = undefined}>\n <wa-icon slot=\"icon\" name=\"exclamation-triangle\"></wa-icon>\n <strong>Package Load Error:</strong><br>\n ${this.packageLoadError}\n </wa-alert>\n ` : ''}\n\n <div class=\"package-input-group\">\n <wa-input \n placeholder=\"Package name (e.g., pandas, numpy)\" \n ${ref((el: any) => newPackageInput = el)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter' && newPackageInput) {\n this.addPackage(newPackageInput.value);\n newPackageInput.value = '';\n }\n }}>\n <wa-icon slot=\"prefix\" name=\"box\"></wa-icon>\n </wa-input>\n <wa-button \n @click=${() => {\n if (newPackageInput) {\n this.addPackage(newPackageInput.value);\n newPackageInput.value = '';\n }\n }}\n variant=\"primary\">\n <wa-icon slot=\"prefix\" name=\"plus\"></wa-icon>\n Add\n </wa-button>\n </div>\n\n ${this.packages.length === 0 ? html`\n <div class=\"empty-state\">\n <wa-icon name=\"box\" style=\"font-size: 3rem; opacity: 0.3;\"></wa-icon>\n <p>No packages configured</p>\n <p style=\"font-size: 0.9rem; opacity: 0.7;\">Add packages above to auto-load them when the kernel connects</p>\n </div>\n ` : html`\n <div class=\"package-list\">\n <div class=\"package-list-header\">\n <strong>Required Packages (${this.packages.length})</strong>\n </div>\n ${repeat(this.packages, pkg => pkg, pkg => html`\n <div class=\"package-item\">\n <wa-icon name=\"box\" style=\"opacity: 0.5;\"></wa-icon>\n <span class=\"package-name\">${pkg}</span>\n <wa-button \n size=\"s\" \n variant=\"text\"\n @click=${() => this.removePackage(pkg)}\n title=\"Remove package\">\n <wa-icon name=\"xmark\"></wa-icon>\n </wa-button>\n </div>\n `)}\n </div>\n `}\n </div>\n <div slot=\"footer\" class=\"package-manager-footer\">\n ${this.pyenv && this.packages.length > 0 ? html`\n <wa-button \n variant=\"default\"\n @click=${() => this.reloadPackages()}\n ?disabled=${this.loadingPackages}>\n <wa-icon slot=\"prefix\" name=\"arrows-rotate\"></wa-icon>\n Reload Packages\n </wa-button>\n ` : ''}\n <wa-button \n variant=\"primary\"\n @click=${() => this.hide()}>\n Done\n </wa-button>\n </div>\n </wa-dialog>\n `;\n }\n\n static styles = css`\n :host {\n display: contents;\n }\n\n .package-manager {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 1rem;\n }\n\n .package-manager-description {\n margin: 0;\n font-size: 0.95rem;\n opacity: 0.8;\n line-height: 1.5;\n }\n\n .package-input-group {\n display: flex;\n gap: 0.5rem;\n }\n\n .package-input-group wa-input {\n flex: 1;\n }\n\n .package-list {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n max-height: 400px;\n overflow-y: auto;\n }\n\n .package-list-header {\n padding: 0.5rem;\n border-bottom: 1px solid var(--wa-color-outline);\n margin-bottom: 0.5rem;\n }\n\n .package-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem;\n border-radius: 4px;\n background: var(--wa-color-surface-variant);\n transition: background 0.2s;\n }\n\n .package-item:hover {\n background: var(--wa-color-surface-container-highest);\n }\n\n .package-name {\n flex: 1;\n font-family: monospace;\n font-size: 0.95rem;\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n padding: 3rem 1rem;\n text-align: center;\n opacity: 0.6;\n }\n\n .empty-state p {\n margin: 0;\n }\n\n .package-manager-footer {\n display: flex;\n gap: 0.5rem;\n justify-content: flex-end;\n padding-top: 1rem;\n border-top: 1px solid var(--wa-color-outline);\n }\n\n .spinning {\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n `;\n}\n\nclass PythonPackageManagerService {\n private managerInstance?: DocksPythonPackageManager;\n\n public showPackageManager(options: PackageManagerOptions): DocksPythonPackageManager {\n if (!this.managerInstance) {\n this.managerInstance = document.createElement('docks-python-package-manager') as DocksPythonPackageManager;\n document.body.appendChild(this.managerInstance);\n }\n\n this.managerInstance.configure(options);\n this.managerInstance.show();\n\n return this.managerInstance;\n }\n\n public getManager(): DocksPythonPackageManager | undefined {\n return this.managerInstance;\n }\n}\n\nexport const pythonPackageManagerService = new PythonPackageManagerService();\nrootContext.put(\"pythonPackageManagerService\", pythonPackageManagerService);\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { t as PyEnv } from "./pyservice-DGwNXWO4.js";
2
- import { t as pythonPackageManagerService } from "./package-manager-DcDiJbD3.js";
3
- import "./api-C6Mnm5y_.js";
2
+ import { t as pythonPackageManagerService } from "./package-manager-DJaTJoVI.js";
3
+ import "./api-DpvBDibr.js";
4
4
  import { n as parsePackagesFromContent, t as contentWithPackagesLine } from "./editor-python-run-Cs68X5JL.js";
5
5
  import { DocksPart, toastError } from "@eclipse-docks/core";
6
6
  import { css, html } from "lit";
@@ -133,7 +133,7 @@ var DocksPythonEditor = class DocksPythonEditor extends DocksPart {
133
133
  return html`
134
134
  <wa-button
135
135
  appearance="plain"
136
- size="small"
136
+ size="s"
137
137
  style=${styleMap({
138
138
  display: "flex",
139
139
  alignItems: "center",
@@ -147,7 +147,7 @@ var DocksPythonEditor = class DocksPythonEditor extends DocksPart {
147
147
  ${connectionText}
148
148
  </wa-button>
149
149
  <wa-button
150
- size="small"
150
+ size="s"
151
151
  appearance="plain"
152
152
  ?disabled=${!this.pyConnected}
153
153
  @click=${() => this.runScript()}
@@ -157,7 +157,7 @@ var DocksPythonEditor = class DocksPythonEditor extends DocksPart {
157
157
  Run
158
158
  </wa-button>
159
159
  <wa-button
160
- size="small"
160
+ size="s"
161
161
  appearance="plain"
162
162
  ?disabled=${!this.pyConnected}
163
163
  @click=${() => this.openPackageManager()}
@@ -212,4 +212,4 @@ _decorate([state()], DocksPythonEditor.prototype, "pyVersion", void 0);
212
212
  DocksPythonEditor = _decorate([customElement("docks-python-editor")], DocksPythonEditor);
213
213
  //#endregion
214
214
 
215
- //# sourceMappingURL=python-editor-BpEUhgXs.js.map
215
+ //# sourceMappingURL=python-editor-DYi4l3P9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"python-editor-BpEUhgXs.js","names":[],"sources":["../src/python-editor.ts"],"sourcesContent":["import { customElement, property, state } from \"lit/decorators.js\";\nimport { DocksPart } from \"@eclipse-docks/core\";\nimport { css, html } from \"lit\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { EditorInput, EditorContentProvider } from \"@eclipse-docks/core\";\nimport { DocksMonacoWidget } from '@eclipse-docks/extension-monaco-editor/widget';\nimport { PyEnv, pythonPackageManagerService } from \"./api\";\nimport { parsePackagesFromContent, contentWithPackagesLine } from \"./editor-python-run\";\nimport { toastError } from \"@eclipse-docks/core\";\n\n@customElement(\"docks-python-editor\")\nexport class DocksPythonEditor extends DocksPart implements EditorContentProvider {\n @property({ attribute: false })\n public input?: EditorInput;\n @property({ type: Boolean })\n public readOnly = false;\n\n @state()\n private initialContent: string | undefined = undefined;\n @state()\n private initialUri: string | undefined = undefined;\n\n @state()\n private pyenv?: PyEnv;\n @state()\n private pyConnected = false;\n @state()\n private pyConnecting = false;\n @state()\n private pyVersion?: string;\n\n private widgetRef = createRef<DocksMonacoWidget>();\n\n protected async doInitUI() {\n const file = this.input!.data;\n const textContents = await file.getContents();\n this.initialContent = textContents;\n this.initialUri = file.getName();\n this.requestUpdate();\n }\n\n private _onContentChange = () => {\n this.markDirty(true);\n };\n\n save(): void {\n const value = this.widgetRef.value?.getContent() ?? \"\";\n this.input?.data.saveContents(value);\n this.markDirty(false);\n }\n\n protected doClose() {\n this.widgetRef.value?.dispose();\n if (this.pyenv) {\n this.pyenv.close();\n this.pyenv = undefined;\n }\n this.pyConnected = false;\n this.pyVersion = undefined;\n }\n\n public getLanguage(): string | null {\n return \"python\";\n }\n\n public isLanguage(lang: string): boolean {\n return lang.toLowerCase() === \"python\";\n }\n\n public getContent(): string | null {\n return this.widgetRef.value?.getContent() ?? null;\n }\n\n public getSelection(): string | null {\n return this.widgetRef.value?.getSelection() ?? null;\n }\n\n public getSnippet(lines: number = 5): { snippet: string; cursorLine: number } | null {\n return this.widgetRef.value?.getSnippet(lines) ?? null;\n }\n\n public getFilePath(): string | null {\n return this.input?.data?.getWorkspacePath() ?? null;\n }\n\n public getPyEnv(): PyEnv | undefined {\n return this.pyenv;\n }\n\n private async initPyEnv(): Promise<void> {\n if (this.pyenv) return;\n this.pyenv = new PyEnv();\n await this.pyenv.init();\n this.pyConnected = true;\n try {\n const response = await this.pyenv.execCode(\"import sys; sys.version.split()[0]\");\n this.pyVersion = response?.result || \"Unknown\";\n } catch {\n this.pyVersion = \"Unknown\";\n }\n }\n\n async connectPython(): Promise<void> {\n if (this.pyConnecting || this.pyConnected) return;\n try {\n this.pyConnecting = true;\n await this.initPyEnv();\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n } finally {\n this.pyConnecting = false;\n }\n }\n\n private async runScript(): Promise<void> {\n if (!this.pyConnected || !this.pyenv) {\n await this.connectPython();\n if (!this.pyenv) return;\n }\n const content = this.getContent()?.trim();\n if (!content) {\n toastError(\"No content to run\");\n return;\n }\n try {\n const packages = parsePackagesFromContent(content);\n if (packages.length > 0) await this.pyenv.loadPackages(packages);\n await this.pyenv.execCode(content);\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n }\n }\n\n private updateEditorPackagesLine(packages: string[]): void {\n const content = this.getContent() ?? \"\";\n const newContent = contentWithPackagesLine(content, packages);\n if (newContent === content) return;\n this.widgetRef.value?.getModel()?.setValue(newContent);\n this.markDirty(true);\n }\n\n private openPackageManager(): void {\n if (!this.pyConnected || !this.pyenv) return;\n const content = this.getContent() ?? \"\";\n const packages = parsePackagesFromContent(content);\n pythonPackageManagerService.showPackageManager({\n packages,\n pyenv: this.pyenv,\n onPackageAdded: (name) => {\n const next = [...parsePackagesFromContent(this.getContent() ?? \"\"), name];\n this.updateEditorPackagesLine(next);\n },\n onPackageRemoved: (name) => {\n const next = parsePackagesFromContent(this.getContent() ?? \"\").filter((p) => p !== name);\n this.updateEditorPackagesLine(next);\n },\n });\n }\n\n protected renderToolbar() {\n const connectionTitle = this.pyConnecting\n ? \"Connecting to Python...\"\n : this.pyConnected\n ? \"Python Connected\"\n : \"Python Disconnected - Click to connect\";\n const connectionText = this.pyConnecting\n ? \"Connecting...\"\n : this.pyConnected && this.pyVersion\n ? `Python ${this.pyVersion}`\n : \"Not connected\";\n const iconColor = this.pyConnected\n ? \"var(--wa-color-green-40)\"\n : this.pyConnecting\n ? \"var(--wa-color-warning-500)\"\n : \"var(--wa-color-red-40)\";\n\n return html`\n <wa-button\n appearance=\"plain\"\n size=\"small\"\n style=${styleMap({ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" })}\n ?disabled=${this.pyConnecting}\n @click=${() => this.connectPython()}\n title=${connectionTitle}\n >\n <wa-icon name=\"circle\" label=\"Python status\" style=${styleMap({ color: iconColor })}></wa-icon>\n ${connectionText}\n </wa-button>\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n ?disabled=${!this.pyConnected}\n @click=${() => this.runScript()}\n title=\"Run Python script\"\n >\n <wa-icon name=\"play\" label=\"Run\"></wa-icon>\n Run\n </wa-button>\n <wa-button\n size=\"small\"\n appearance=\"plain\"\n ?disabled=${!this.pyConnected}\n @click=${() => this.openPackageManager()}\n title=\"Manage packages\"\n >\n <wa-icon name=\"box\" label=\"Packages\"></wa-icon>\n Packages\n </wa-button>\n `;\n }\n\n protected updated(changedProperties: Map<string, unknown>) {\n super.updated(changedProperties);\n if (\n changedProperties.has(\"pyConnected\") ||\n changedProperties.has(\"pyConnecting\") ||\n changedProperties.has(\"pyVersion\")\n ) {\n }\n }\n\n protected renderContent() {\n if (this.initialContent === undefined) {\n return html`<div class=\"monaco-editor-placeholder\"></div>`;\n }\n return html`\n <docks-monaco-widget\n .value=${this.initialContent}\n .uri=${this.initialUri}\n .language=${\"python\"}\n .readOnly=${this.readOnly}\n @content-change=${this._onContentChange}\n ${ref(this.widgetRef)}\n ></docks-monaco-widget>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n position: relative;\n width: 100%;\n height: 100%;\n }\n .monaco-editor-placeholder {\n flex: 1;\n min-height: 0;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"docks-python-editor\": DocksPythonEditor;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"python-editor-DYi4l3P9.js","names":[],"sources":["../src/python-editor.ts"],"sourcesContent":["import { customElement, property, state } from \"lit/decorators.js\";\nimport { DocksPart } from \"@eclipse-docks/core\";\nimport { css, html } from \"lit\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { EditorInput, EditorContentProvider } from \"@eclipse-docks/core\";\nimport { DocksMonacoWidget } from '@eclipse-docks/extension-monaco-editor/widget';\nimport { PyEnv, pythonPackageManagerService } from \"./api\";\nimport { parsePackagesFromContent, contentWithPackagesLine } from \"./editor-python-run\";\nimport { toastError } from \"@eclipse-docks/core\";\n\n@customElement(\"docks-python-editor\")\nexport class DocksPythonEditor extends DocksPart implements EditorContentProvider {\n @property({ attribute: false })\n public input?: EditorInput;\n @property({ type: Boolean })\n public readOnly = false;\n\n @state()\n private initialContent: string | undefined = undefined;\n @state()\n private initialUri: string | undefined = undefined;\n\n @state()\n private pyenv?: PyEnv;\n @state()\n private pyConnected = false;\n @state()\n private pyConnecting = false;\n @state()\n private pyVersion?: string;\n\n private widgetRef = createRef<DocksMonacoWidget>();\n\n protected async doInitUI() {\n const file = this.input!.data;\n const textContents = await file.getContents();\n this.initialContent = textContents;\n this.initialUri = file.getName();\n this.requestUpdate();\n }\n\n private _onContentChange = () => {\n this.markDirty(true);\n };\n\n save(): void {\n const value = this.widgetRef.value?.getContent() ?? \"\";\n this.input?.data.saveContents(value);\n this.markDirty(false);\n }\n\n protected doClose() {\n this.widgetRef.value?.dispose();\n if (this.pyenv) {\n this.pyenv.close();\n this.pyenv = undefined;\n }\n this.pyConnected = false;\n this.pyVersion = undefined;\n }\n\n public getLanguage(): string | null {\n return \"python\";\n }\n\n public isLanguage(lang: string): boolean {\n return lang.toLowerCase() === \"python\";\n }\n\n public getContent(): string | null {\n return this.widgetRef.value?.getContent() ?? null;\n }\n\n public getSelection(): string | null {\n return this.widgetRef.value?.getSelection() ?? null;\n }\n\n public getSnippet(lines: number = 5): { snippet: string; cursorLine: number } | null {\n return this.widgetRef.value?.getSnippet(lines) ?? null;\n }\n\n public getFilePath(): string | null {\n return this.input?.data?.getWorkspacePath() ?? null;\n }\n\n public getPyEnv(): PyEnv | undefined {\n return this.pyenv;\n }\n\n private async initPyEnv(): Promise<void> {\n if (this.pyenv) return;\n this.pyenv = new PyEnv();\n await this.pyenv.init();\n this.pyConnected = true;\n try {\n const response = await this.pyenv.execCode(\"import sys; sys.version.split()[0]\");\n this.pyVersion = response?.result || \"Unknown\";\n } catch {\n this.pyVersion = \"Unknown\";\n }\n }\n\n async connectPython(): Promise<void> {\n if (this.pyConnecting || this.pyConnected) return;\n try {\n this.pyConnecting = true;\n await this.initPyEnv();\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n } finally {\n this.pyConnecting = false;\n }\n }\n\n private async runScript(): Promise<void> {\n if (!this.pyConnected || !this.pyenv) {\n await this.connectPython();\n if (!this.pyenv) return;\n }\n const content = this.getContent()?.trim();\n if (!content) {\n toastError(\"No content to run\");\n return;\n }\n try {\n const packages = parsePackagesFromContent(content);\n if (packages.length > 0) await this.pyenv.loadPackages(packages);\n await this.pyenv.execCode(content);\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n }\n }\n\n private updateEditorPackagesLine(packages: string[]): void {\n const content = this.getContent() ?? \"\";\n const newContent = contentWithPackagesLine(content, packages);\n if (newContent === content) return;\n this.widgetRef.value?.getModel()?.setValue(newContent);\n this.markDirty(true);\n }\n\n private openPackageManager(): void {\n if (!this.pyConnected || !this.pyenv) return;\n const content = this.getContent() ?? \"\";\n const packages = parsePackagesFromContent(content);\n pythonPackageManagerService.showPackageManager({\n packages,\n pyenv: this.pyenv,\n onPackageAdded: (name) => {\n const next = [...parsePackagesFromContent(this.getContent() ?? \"\"), name];\n this.updateEditorPackagesLine(next);\n },\n onPackageRemoved: (name) => {\n const next = parsePackagesFromContent(this.getContent() ?? \"\").filter((p) => p !== name);\n this.updateEditorPackagesLine(next);\n },\n });\n }\n\n protected renderToolbar() {\n const connectionTitle = this.pyConnecting\n ? \"Connecting to Python...\"\n : this.pyConnected\n ? \"Python Connected\"\n : \"Python Disconnected - Click to connect\";\n const connectionText = this.pyConnecting\n ? \"Connecting...\"\n : this.pyConnected && this.pyVersion\n ? `Python ${this.pyVersion}`\n : \"Not connected\";\n const iconColor = this.pyConnected\n ? \"var(--wa-color-green-40)\"\n : this.pyConnecting\n ? \"var(--wa-color-warning-500)\"\n : \"var(--wa-color-red-40)\";\n\n return html`\n <wa-button\n appearance=\"plain\"\n size=\"s\"\n style=${styleMap({ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" })}\n ?disabled=${this.pyConnecting}\n @click=${() => this.connectPython()}\n title=${connectionTitle}\n >\n <wa-icon name=\"circle\" label=\"Python status\" style=${styleMap({ color: iconColor })}></wa-icon>\n ${connectionText}\n </wa-button>\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n ?disabled=${!this.pyConnected}\n @click=${() => this.runScript()}\n title=\"Run Python script\"\n >\n <wa-icon name=\"play\" label=\"Run\"></wa-icon>\n Run\n </wa-button>\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n ?disabled=${!this.pyConnected}\n @click=${() => this.openPackageManager()}\n title=\"Manage packages\"\n >\n <wa-icon name=\"box\" label=\"Packages\"></wa-icon>\n Packages\n </wa-button>\n `;\n }\n\n protected updated(changedProperties: Map<string, unknown>) {\n super.updated(changedProperties);\n if (\n changedProperties.has(\"pyConnected\") ||\n changedProperties.has(\"pyConnecting\") ||\n changedProperties.has(\"pyVersion\")\n ) {\n }\n }\n\n protected renderContent() {\n if (this.initialContent === undefined) {\n return html`<div class=\"monaco-editor-placeholder\"></div>`;\n }\n return html`\n <docks-monaco-widget\n .value=${this.initialContent}\n .uri=${this.initialUri}\n .language=${\"python\"}\n .readOnly=${this.readOnly}\n @content-change=${this._onContentChange}\n ${ref(this.widgetRef)}\n ></docks-monaco-widget>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n position: relative;\n width: 100%;\n height: 100%;\n }\n .monaco-editor-placeholder {\n flex: 1;\n min-height: 0;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"docks-python-editor\": DocksPythonEditor;\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { t as PyEnv } from "./pyservice-DGwNXWO4.js";
2
- import { t as pythonPackageManagerService } from "./package-manager-DcDiJbD3.js";
2
+ import { t as pythonPackageManagerService } from "./package-manager-DJaTJoVI.js";
3
3
  import { n as parsePackagesFromContent } from "./editor-python-run-Cs68X5JL.js";
4
4
  import { File, contributionRegistry, editorRegistry, registerAll, toastError } from "@eclipse-docks/core";
5
5
  import { TARGET_NOTEBOOK_KERNELS } from "@eclipse-docks/extension-notebook";
@@ -288,7 +288,7 @@ editorRegistry.registerEditorInputHandler({
288
288
  label: "Python",
289
289
  icon: "docks python",
290
290
  lazyInit: async () => {
291
- await import("./python-editor-BpEUhgXs.js");
291
+ await import("./python-editor-DYi4l3P9.js");
292
292
  },
293
293
  canHandle: (input) => input instanceof File && input.getName().toLowerCase().endsWith(".py"),
294
294
  ranking: 1e3,
@@ -308,4 +308,4 @@ editorRegistry.registerEditorInputHandler({
308
308
  //#endregion
309
309
  export { PyEnv, pythonPackageManagerService };
310
310
 
311
- //# sourceMappingURL=python-runtime-extension-BZ3XkDRK.js.map
311
+ //# sourceMappingURL=python-runtime-extension-u9NoE4Xj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"python-runtime-extension-BZ3XkDRK.js","names":[],"sources":["../src/python-notebook-kernel.ts","../src/python-terminal-backend.ts","../src/python-runtime-extension.ts"],"sourcesContent":["import type {\n NotebookExecutionResult,\n NotebookKernel,\n NotebookKernelContribution,\n} from '@eclipse-docks/extension-notebook';\nimport { TARGET_NOTEBOOK_KERNELS } from '@eclipse-docks/extension-notebook';\nimport { PyEnv } from './pyservice';\nimport { pythonPackageManagerService } from './package-manager';\n\nclass PythonNotebookKernel implements NotebookKernel {\n readonly id = 'python';\n readonly label = 'Python';\n readonly language = 'python';\n\n private pyenv: PyEnv | null = null;\n private requiredPackages: string[] = [];\n private loadedPackages = new Set<string>();\n private connectPromise: Promise<void> | null = null;\n\n async connect(options?: { requiredPackages?: string[] }): Promise<void> {\n if (this.connectPromise) {\n await this.connectPromise;\n if (options?.requiredPackages) {\n this.requiredPackages = options.requiredPackages;\n }\n const packagesToLoadAfterWait = this.requiredPackages.filter((pkg) => !this.loadedPackages.has(pkg));\n if (packagesToLoadAfterWait.length === 0 || !this.pyenv) return;\n await this.pyenv.loadPackages(packagesToLoadAfterWait);\n packagesToLoadAfterWait.forEach((pkg) => this.loadedPackages.add(pkg));\n return;\n }\n\n this.connectPromise = this.doConnect(options);\n try {\n await this.connectPromise;\n } finally {\n this.connectPromise = null;\n }\n }\n\n private async doConnect(options?: { requiredPackages?: string[] }): Promise<void> {\n if (options?.requiredPackages) {\n this.requiredPackages = options.requiredPackages;\n }\n\n if (!this.pyenv) {\n this.pyenv = new PyEnv();\n await this.pyenv.init();\n }\n\n const packagesToLoad = this.requiredPackages.filter((pkg) => !this.loadedPackages.has(pkg));\n if (packagesToLoad.length > 0) {\n await this.pyenv.loadPackages(packagesToLoad);\n packagesToLoad.forEach((pkg) => this.loadedPackages.add(pkg));\n }\n\n try {\n await this.pyenv.execCode(`\ntry:\n import matplotlib\n matplotlib.use('agg')\n import matplotlib.pyplot as plt\n import io\n import base64\n _original_show = plt.show\n _display_data = None\n def _patched_show(*args, **kwargs):\n global _display_data\n if plt.get_fignums():\n fig = plt.gcf()\n buffer = io.BytesIO()\n fig.savefig(buffer, format='png', bbox_inches='tight', dpi=100)\n buffer.seek(0)\n _display_data = base64.b64encode(buffer.read()).decode('utf-8')\n plt.close(fig)\n pass\n plt.show = _patched_show\nexcept ImportError:\n pass\n`);\n } catch {\n // matplotlib not installed\n }\n }\n\n async execute(code: string): Promise<NotebookExecutionResult> {\n if (!this.pyenv) {\n await this.connect();\n }\n if (!this.pyenv) {\n return { error: 'Python kernel not initialized' };\n }\n try {\n const response = await this.pyenv.execCode(code);\n const outputParts: string[] = [];\n\n if (response && typeof response === 'object' && 'console' in response) {\n const consoleOutput = response.console;\n if (Array.isArray(consoleOutput) && consoleOutput.length > 0) {\n const filtered = consoleOutput.filter((s: unknown) => s && String(s).trim());\n if (filtered.length > 0) {\n outputParts.push(...filtered.map(String));\n }\n }\n }\n\n let imageData: string | undefined;\n try {\n const checkDisplayData = await this.pyenv.execCode(\n '_display_data if \"_display_data\" in dir() else None'\n );\n const displayResult =\n checkDisplayData && typeof checkDisplayData === 'object' && checkDisplayData !== null && 'result' in checkDisplayData\n ? (checkDisplayData as { result: unknown }).result\n : checkDisplayData;\n if (\n displayResult != null &&\n String(displayResult) !== 'None' &&\n String(displayResult) !== 'undefined'\n ) {\n imageData = String(displayResult);\n await this.pyenv.execCode('_display_data = None');\n }\n } catch {\n // ignore\n }\n\n if (!imageData) {\n const result =\n response && typeof response === 'object' && response !== null && 'result' in response\n ? (response as { result: unknown }).result\n : response;\n if (result !== undefined && result !== null && String(result) !== 'undefined') {\n const s = String(result);\n if (s && s !== 'undefined') outputParts.push(s);\n }\n }\n\n return {\n data: outputParts.length > 0 ? outputParts.join('\\n') : undefined,\n imageData,\n };\n } catch (err) {\n return {\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n async getVersion(): Promise<string | undefined> {\n if (!this.pyenv) return undefined;\n try {\n const response = await this.pyenv.getVersion();\n return response ?? undefined;\n } catch {\n return undefined;\n }\n }\n\n interrupt(): void {\n this.pyenv?.interrupt?.();\n }\n\n async restart(): Promise<void> {\n if (this.pyenv) {\n this.pyenv.close();\n this.pyenv = null;\n }\n this.loadedPackages.clear();\n await this.connect({ requiredPackages: this.requiredPackages });\n }\n\n openPackageManager(\n context?: {\n requiredPackages: string[];\n onPackageAdded: (name: string) => void;\n onPackageRemoved: (name: string) => void;\n }\n ): void {\n if (!this.pyenv) return;\n pythonPackageManagerService.showPackageManager({\n packages: context?.requiredPackages ?? [],\n pyenv: this.pyenv,\n onPackageAdded: context?.onPackageAdded,\n onPackageRemoved: context?.onPackageRemoved,\n });\n }\n\n close(): void {\n if (this.pyenv) {\n this.pyenv.close();\n this.pyenv = null;\n }\n this.loadedPackages.clear();\n }\n}\n\nexport const pythonNotebookKernelContribution: NotebookKernelContribution = {\n id: 'python',\n label: 'Python',\n language: 'python',\n loadKernel: async (): Promise<NotebookKernel> => new PythonNotebookKernel(),\n};\n","import type { TerminalBackend } from '@eclipse-docks/extension-terminal/api';\nimport { LineInput } from '@eclipse-docks/extension-terminal/api';\nimport { PyEnv } from './pyservice';\n\nconst PROMPT = '>>> ';\n\nfunction formatExecResult(response: unknown): string {\n const result =\n response && typeof response === 'object' && response !== null && 'result' in response\n ? (response as { result: unknown }).result\n : response;\n\n if (result === undefined || result === null || String(result) === 'undefined') {\n return '';\n }\n const text = String(result);\n if (!text || text === 'undefined') return '';\n if (typeof result === 'object') return JSON.stringify(result, null, 2) + '\\r\\n';\n return text + '\\r\\n';\n}\n\nexport class PythonReplBackend implements TerminalBackend {\n private writeCallbacks = new Set<(data: string) => void>();\n private lineInput: LineInput;\n private pyenv: PyEnv | null = null;\n private running = false;\n private atLineStart = true;\n\n constructor() {\n this.lineInput = new LineInput((data: string) => this.emit(data));\n }\n\n onDidWrite(callback: (data: string) => void): () => void {\n this.writeCallbacks.add(callback);\n return () => this.writeCallbacks.delete(callback);\n }\n\n private emit(data: string): void {\n for (const cb of this.writeCallbacks) cb(data);\n if (data.length > 0) {\n this.atLineStart = /[\\r\\n]$/.test(data);\n }\n }\n\n private emitPrompt(): void {\n if (!this.atLineStart) this.emit('\\r\\n');\n this.emit(PROMPT);\n }\n\n async open(): Promise<void> {\n this.emit('Initializing Python...\\r\\n');\n this.pyenv = new PyEnv();\n await this.pyenv.init();\n this.pyenv.setStdoutCallback((text) => this.emit(text));\n this.pyenv.setStderrCallback((text) => this.emit(`\\x1b[31m${text}\\x1b[0m`));\n\n let version = '';\n try {\n version = String((await this.pyenv.getVersion()) ?? '');\n } catch {\n version = '';\n }\n\n this.emit(`Python ${version} REPL (Pyodide)\\r\\n\\r\\n`);\n this.emitPrompt();\n }\n\n close(): void {\n this.pyenv?.close();\n this.pyenv = null;\n this.lineInput.reset();\n }\n\n setDimensions(_dimensions: { cols: number; rows: number }): void {}\n\n handleInput(data: string): void {\n if (this.running) return;\n const line = this.lineInput.feed(data);\n if (line === null) return;\n void this.runLine(line);\n }\n\n private async runLine(line: string): Promise<void> {\n if (!this.pyenv) {\n this.emitPrompt();\n return;\n }\n\n const trimmed = line.trim();\n if (!trimmed) {\n this.emitPrompt();\n return;\n }\n\n this.running = true;\n try {\n const response = await this.pyenv.execCode(trimmed);\n const output = formatExecResult(response);\n if (output) this.emit(output);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.emit(`\\x1b[31m${msg}\\x1b[0m\\r\\n`);\n } finally {\n this.running = false;\n this.emitPrompt();\n }\n }\n}\n\nexport const PYTHON_REPL_PROFILE_ID = 'terminal.python-repl';\n","import {\n registerAll,\n toastInfo,\n toastError,\n editorRegistry,\n File,\n type EditorInput,\n contributionRegistry,\n} from \"@eclipse-docks/core\";\nimport { TARGET_NOTEBOOK_KERNELS } from \"@eclipse-docks/extension-notebook\";\nimport { registerTerminalProfile } from \"@eclipse-docks/extension-terminal/api\";\nimport { html } from \"@eclipse-docks/core/externals/lit\";\n\ntype EditorWithLanguage = { isLanguage?(lang: string): boolean };\nimport { PyEnv } from \"./pyservice\";\nimport { pythonNotebookKernelContribution } from \"./python-notebook-kernel\";\nimport { PythonReplBackend, PYTHON_REPL_PROFILE_ID } from \"./python-terminal-backend\";\n\ncontributionRegistry.registerContribution(TARGET_NOTEBOOK_KERNELS, pythonNotebookKernelContribution);\n\nregisterTerminalProfile({\n id: PYTHON_REPL_PROFILE_ID,\n label: \"Python REPL\",\n icon: \"docks python\",\n create: async () => new PythonReplBackend(),\n});\n\nimport { parsePackagesFromContent } from \"./editor-python-run\";\nimport { pythonPackageManagerService } from \"./package-manager\";\n\nexport { PyEnv } from \"./pyservice\";\nexport { pythonPackageManagerService } from \"./package-manager\";\n\nregisterAll({\n command: {\n id: \"python\",\n name: \"Run Python Script\",\n description: \"Executes a Python script given its file path\",\n parameters: [\n { name: \"script\", description: \"the path to a Python script to run\", required: false },\n ],\n },\n handler: {\n execute: async (context: any) => {\n const script: string = context.params?.[\"script\"];\n if (!script) return;\n const pyenv = new PyEnv();\n await pyenv.init({ params: context.params });\n await pyenv.execScript(script);\n },\n },\n});\n\nregisterAll({\n command: {\n id: \"python.openEditorPackageManager\",\n name: \"Manage packages\",\n description: \"Manage Python packages for the editor environment\",\n parameters: [],\n },\n handler: {\n canExecute: (ctx) => !!(ctx.activeEditor as EditorWithLanguage)?.isLanguage?.(\"python\"),\n execute: async (ctx) => {\n const ed = ctx.activeEditor as { getContent?: () => string; getPyEnv?: () => PyEnv | undefined } | undefined;\n if (!ed) {\n toastError(\"No active editor\");\n return;\n }\n const content = ed?.getContent?.() ?? \"\";\n const packages = parsePackagesFromContent(content);\n const pyenv = ed.getPyEnv?.();\n pythonPackageManagerService.showPackageManager({\n packages,\n pyenv,\n });\n },\n },\n});\n\neditorRegistry.registerEditorInputHandler({\n editorId: \"system.python-editor\",\n label: \"Python\",\n icon: \"docks python\",\n lazyInit: async () => {\n await import(\"./python-editor\");\n },\n canHandle: (input: unknown) =>\n input instanceof File && input.getName().toLowerCase().endsWith(\".py\"),\n ranking: 1000,\n handle: async (input: File) => {\n const editorInput: EditorInput = {\n title: input.getWorkspacePath(),\n data: input,\n key: input.getWorkspacePath(),\n icon: editorRegistry.getFileIcon(input.getName()),\n state: {},\n component: () => null as any,\n };\n\n editorInput.component = (id: string) =>\n html`<docks-python-editor id=\"${id}\" .input=${editorInput}></docks-python-editor>`;\n\n return editorInput;\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"python-runtime-extension-u9NoE4Xj.js","names":[],"sources":["../src/python-notebook-kernel.ts","../src/python-terminal-backend.ts","../src/python-runtime-extension.ts"],"sourcesContent":["import type {\n NotebookExecutionResult,\n NotebookKernel,\n NotebookKernelContribution,\n} from '@eclipse-docks/extension-notebook';\nimport { TARGET_NOTEBOOK_KERNELS } from '@eclipse-docks/extension-notebook';\nimport { PyEnv } from './pyservice';\nimport { pythonPackageManagerService } from './package-manager';\n\nclass PythonNotebookKernel implements NotebookKernel {\n readonly id = 'python';\n readonly label = 'Python';\n readonly language = 'python';\n\n private pyenv: PyEnv | null = null;\n private requiredPackages: string[] = [];\n private loadedPackages = new Set<string>();\n private connectPromise: Promise<void> | null = null;\n\n async connect(options?: { requiredPackages?: string[] }): Promise<void> {\n if (this.connectPromise) {\n await this.connectPromise;\n if (options?.requiredPackages) {\n this.requiredPackages = options.requiredPackages;\n }\n const packagesToLoadAfterWait = this.requiredPackages.filter((pkg) => !this.loadedPackages.has(pkg));\n if (packagesToLoadAfterWait.length === 0 || !this.pyenv) return;\n await this.pyenv.loadPackages(packagesToLoadAfterWait);\n packagesToLoadAfterWait.forEach((pkg) => this.loadedPackages.add(pkg));\n return;\n }\n\n this.connectPromise = this.doConnect(options);\n try {\n await this.connectPromise;\n } finally {\n this.connectPromise = null;\n }\n }\n\n private async doConnect(options?: { requiredPackages?: string[] }): Promise<void> {\n if (options?.requiredPackages) {\n this.requiredPackages = options.requiredPackages;\n }\n\n if (!this.pyenv) {\n this.pyenv = new PyEnv();\n await this.pyenv.init();\n }\n\n const packagesToLoad = this.requiredPackages.filter((pkg) => !this.loadedPackages.has(pkg));\n if (packagesToLoad.length > 0) {\n await this.pyenv.loadPackages(packagesToLoad);\n packagesToLoad.forEach((pkg) => this.loadedPackages.add(pkg));\n }\n\n try {\n await this.pyenv.execCode(`\ntry:\n import matplotlib\n matplotlib.use('agg')\n import matplotlib.pyplot as plt\n import io\n import base64\n _original_show = plt.show\n _display_data = None\n def _patched_show(*args, **kwargs):\n global _display_data\n if plt.get_fignums():\n fig = plt.gcf()\n buffer = io.BytesIO()\n fig.savefig(buffer, format='png', bbox_inches='tight', dpi=100)\n buffer.seek(0)\n _display_data = base64.b64encode(buffer.read()).decode('utf-8')\n plt.close(fig)\n pass\n plt.show = _patched_show\nexcept ImportError:\n pass\n`);\n } catch {\n // matplotlib not installed\n }\n }\n\n async execute(code: string): Promise<NotebookExecutionResult> {\n if (!this.pyenv) {\n await this.connect();\n }\n if (!this.pyenv) {\n return { error: 'Python kernel not initialized' };\n }\n try {\n const response = await this.pyenv.execCode(code);\n const outputParts: string[] = [];\n\n if (response && typeof response === 'object' && 'console' in response) {\n const consoleOutput = response.console;\n if (Array.isArray(consoleOutput) && consoleOutput.length > 0) {\n const filtered = consoleOutput.filter((s: unknown) => s && String(s).trim());\n if (filtered.length > 0) {\n outputParts.push(...filtered.map(String));\n }\n }\n }\n\n let imageData: string | undefined;\n try {\n const checkDisplayData = await this.pyenv.execCode(\n '_display_data if \"_display_data\" in dir() else None'\n );\n const displayResult =\n checkDisplayData && typeof checkDisplayData === 'object' && checkDisplayData !== null && 'result' in checkDisplayData\n ? (checkDisplayData as { result: unknown }).result\n : checkDisplayData;\n if (\n displayResult != null &&\n String(displayResult) !== 'None' &&\n String(displayResult) !== 'undefined'\n ) {\n imageData = String(displayResult);\n await this.pyenv.execCode('_display_data = None');\n }\n } catch {\n // ignore\n }\n\n if (!imageData) {\n const result =\n response && typeof response === 'object' && response !== null && 'result' in response\n ? (response as { result: unknown }).result\n : response;\n if (result !== undefined && result !== null && String(result) !== 'undefined') {\n const s = String(result);\n if (s && s !== 'undefined') outputParts.push(s);\n }\n }\n\n return {\n data: outputParts.length > 0 ? outputParts.join('\\n') : undefined,\n imageData,\n };\n } catch (err) {\n return {\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n async getVersion(): Promise<string | undefined> {\n if (!this.pyenv) return undefined;\n try {\n const response = await this.pyenv.getVersion();\n return response ?? undefined;\n } catch {\n return undefined;\n }\n }\n\n interrupt(): void {\n this.pyenv?.interrupt?.();\n }\n\n async restart(): Promise<void> {\n if (this.pyenv) {\n this.pyenv.close();\n this.pyenv = null;\n }\n this.loadedPackages.clear();\n await this.connect({ requiredPackages: this.requiredPackages });\n }\n\n openPackageManager(\n context?: {\n requiredPackages: string[];\n onPackageAdded: (name: string) => void;\n onPackageRemoved: (name: string) => void;\n }\n ): void {\n if (!this.pyenv) return;\n pythonPackageManagerService.showPackageManager({\n packages: context?.requiredPackages ?? [],\n pyenv: this.pyenv,\n onPackageAdded: context?.onPackageAdded,\n onPackageRemoved: context?.onPackageRemoved,\n });\n }\n\n close(): void {\n if (this.pyenv) {\n this.pyenv.close();\n this.pyenv = null;\n }\n this.loadedPackages.clear();\n }\n}\n\nexport const pythonNotebookKernelContribution: NotebookKernelContribution = {\n id: 'python',\n label: 'Python',\n language: 'python',\n loadKernel: async (): Promise<NotebookKernel> => new PythonNotebookKernel(),\n};\n","import type { TerminalBackend } from '@eclipse-docks/extension-terminal/api';\nimport { LineInput } from '@eclipse-docks/extension-terminal/api';\nimport { PyEnv } from './pyservice';\n\nconst PROMPT = '>>> ';\n\nfunction formatExecResult(response: unknown): string {\n const result =\n response && typeof response === 'object' && response !== null && 'result' in response\n ? (response as { result: unknown }).result\n : response;\n\n if (result === undefined || result === null || String(result) === 'undefined') {\n return '';\n }\n const text = String(result);\n if (!text || text === 'undefined') return '';\n if (typeof result === 'object') return JSON.stringify(result, null, 2) + '\\r\\n';\n return text + '\\r\\n';\n}\n\nexport class PythonReplBackend implements TerminalBackend {\n private writeCallbacks = new Set<(data: string) => void>();\n private lineInput: LineInput;\n private pyenv: PyEnv | null = null;\n private running = false;\n private atLineStart = true;\n\n constructor() {\n this.lineInput = new LineInput((data: string) => this.emit(data));\n }\n\n onDidWrite(callback: (data: string) => void): () => void {\n this.writeCallbacks.add(callback);\n return () => this.writeCallbacks.delete(callback);\n }\n\n private emit(data: string): void {\n for (const cb of this.writeCallbacks) cb(data);\n if (data.length > 0) {\n this.atLineStart = /[\\r\\n]$/.test(data);\n }\n }\n\n private emitPrompt(): void {\n if (!this.atLineStart) this.emit('\\r\\n');\n this.emit(PROMPT);\n }\n\n async open(): Promise<void> {\n this.emit('Initializing Python...\\r\\n');\n this.pyenv = new PyEnv();\n await this.pyenv.init();\n this.pyenv.setStdoutCallback((text) => this.emit(text));\n this.pyenv.setStderrCallback((text) => this.emit(`\\x1b[31m${text}\\x1b[0m`));\n\n let version = '';\n try {\n version = String((await this.pyenv.getVersion()) ?? '');\n } catch {\n version = '';\n }\n\n this.emit(`Python ${version} REPL (Pyodide)\\r\\n\\r\\n`);\n this.emitPrompt();\n }\n\n close(): void {\n this.pyenv?.close();\n this.pyenv = null;\n this.lineInput.reset();\n }\n\n setDimensions(_dimensions: { cols: number; rows: number }): void {}\n\n handleInput(data: string): void {\n if (this.running) return;\n const line = this.lineInput.feed(data);\n if (line === null) return;\n void this.runLine(line);\n }\n\n private async runLine(line: string): Promise<void> {\n if (!this.pyenv) {\n this.emitPrompt();\n return;\n }\n\n const trimmed = line.trim();\n if (!trimmed) {\n this.emitPrompt();\n return;\n }\n\n this.running = true;\n try {\n const response = await this.pyenv.execCode(trimmed);\n const output = formatExecResult(response);\n if (output) this.emit(output);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.emit(`\\x1b[31m${msg}\\x1b[0m\\r\\n`);\n } finally {\n this.running = false;\n this.emitPrompt();\n }\n }\n}\n\nexport const PYTHON_REPL_PROFILE_ID = 'terminal.python-repl';\n","import {\n registerAll,\n toastInfo,\n toastError,\n editorRegistry,\n File,\n type EditorInput,\n contributionRegistry,\n} from \"@eclipse-docks/core\";\nimport { TARGET_NOTEBOOK_KERNELS } from \"@eclipse-docks/extension-notebook\";\nimport { registerTerminalProfile } from \"@eclipse-docks/extension-terminal/api\";\nimport { html } from \"@eclipse-docks/core/externals/lit\";\n\ntype EditorWithLanguage = { isLanguage?(lang: string): boolean };\nimport { PyEnv } from \"./pyservice\";\nimport { pythonNotebookKernelContribution } from \"./python-notebook-kernel\";\nimport { PythonReplBackend, PYTHON_REPL_PROFILE_ID } from \"./python-terminal-backend\";\n\ncontributionRegistry.registerContribution(TARGET_NOTEBOOK_KERNELS, pythonNotebookKernelContribution);\n\nregisterTerminalProfile({\n id: PYTHON_REPL_PROFILE_ID,\n label: \"Python REPL\",\n icon: \"docks python\",\n create: async () => new PythonReplBackend(),\n});\n\nimport { parsePackagesFromContent } from \"./editor-python-run\";\nimport { pythonPackageManagerService } from \"./package-manager\";\n\nexport { PyEnv } from \"./pyservice\";\nexport { pythonPackageManagerService } from \"./package-manager\";\n\nregisterAll({\n command: {\n id: \"python\",\n name: \"Run Python Script\",\n description: \"Executes a Python script given its file path\",\n parameters: [\n { name: \"script\", description: \"the path to a Python script to run\", required: false },\n ],\n },\n handler: {\n execute: async (context: any) => {\n const script: string = context.params?.[\"script\"];\n if (!script) return;\n const pyenv = new PyEnv();\n await pyenv.init({ params: context.params });\n await pyenv.execScript(script);\n },\n },\n});\n\nregisterAll({\n command: {\n id: \"python.openEditorPackageManager\",\n name: \"Manage packages\",\n description: \"Manage Python packages for the editor environment\",\n parameters: [],\n },\n handler: {\n canExecute: (ctx) => !!(ctx.activeEditor as EditorWithLanguage)?.isLanguage?.(\"python\"),\n execute: async (ctx) => {\n const ed = ctx.activeEditor as { getContent?: () => string; getPyEnv?: () => PyEnv | undefined } | undefined;\n if (!ed) {\n toastError(\"No active editor\");\n return;\n }\n const content = ed?.getContent?.() ?? \"\";\n const packages = parsePackagesFromContent(content);\n const pyenv = ed.getPyEnv?.();\n pythonPackageManagerService.showPackageManager({\n packages,\n pyenv,\n });\n },\n },\n});\n\neditorRegistry.registerEditorInputHandler({\n editorId: \"system.python-editor\",\n label: \"Python\",\n icon: \"docks python\",\n lazyInit: async () => {\n await import(\"./python-editor\");\n },\n canHandle: (input: unknown) =>\n input instanceof File && input.getName().toLowerCase().endsWith(\".py\"),\n ranking: 1000,\n handle: async (input: File) => {\n const editorInput: EditorInput = {\n title: input.getWorkspacePath(),\n data: input,\n key: input.getWorkspacePath(),\n icon: editorRegistry.getFileIcon(input.getName()),\n state: {},\n component: () => null as any,\n };\n\n editorInput.component = (id: string) =>\n html`<docks-python-editor id=\"${id}\" .input=${editorInput}></docks-python-editor>`;\n\n return editorInput;\n },\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-docks/extension-python-runtime",
3
- "version": "0.7.122",
3
+ "version": "0.7.125",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -1,2 +0,0 @@
1
- import "./pyservice-DGwNXWO4.js";
2
- import "./package-manager-DcDiJbD3.js";
@@ -1 +0,0 @@
1
- {"version":3,"file":"commands-D0y3XxCw.js","names":[],"sources":["../src/commands.ts"],"sourcesContent":["import { registerAll, toastError } from \"@eclipse-docks/core\";\nimport { PyEnv } from \"./pyservice\";\n\nregisterAll({\n command: {\n id: \"python\",\n name: \"Run Python Cell\",\n description: \"Runs Python code.\",\n keyBinding: \"CTRL+R\",\n parameters: [\n {\n name: \"code\",\n description: \"Python code to execute\",\n required: true\n }\n ]\n },\n handler: {\n execute: async (context: any) => {\n const code: string | undefined = context.params?.code;\n if (!code) {\n toastError(\"No Python code provided.\");\n return;\n }\n const pyenv = new PyEnv();\n await pyenv.init({ params: context.params });\n return await pyenv.execCode(code);\n }\n }\n});\n\n"],"mappings":";;;AAGA,YAAY;CACV,SAAS;EACP,IAAI;EACJ,MAAM;EACN,aAAa;EACb,YAAY;EACZ,YAAY,CACV;GACE,MAAM;GACN,aAAa;GACb,UAAU;GACX,CACF;EACF;CACD,SAAS,EACP,SAAS,OAAO,YAAiB;EAC/B,MAAM,OAA2B,QAAQ,QAAQ;AACjD,MAAI,CAAC,MAAM;AACT,cAAW,2BAA2B;AACtC;;EAEF,MAAM,QAAQ,IAAI,OAAO;AACzB,QAAM,MAAM,KAAK,EAAE,QAAQ,QAAQ,QAAQ,CAAC;AAC5C,SAAO,MAAM,MAAM,SAAS,KAAK;IAEpC;CACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-manager-DcDiJbD3.js","names":[],"sources":["../src/package-manager.ts"],"sourcesContent":["import { css, html, LitElement } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { ref } from \"lit/directives/ref.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { PyEnv } from \"./pyservice\";\nimport { rootContext } from \"@eclipse-docks/core\";\n\nexport interface PackageManagerOptions {\n packages: string[];\n onPackageAdded?: (packageName: string) => void;\n onPackageRemoved?: (packageName: string) => void;\n pyenv?: PyEnv;\n}\n\n@customElement('docks-python-package-manager')\nexport class DocksPythonPackageManager extends LitElement {\n @property({ type: Boolean })\n open: boolean = false;\n\n @property({ type: Array })\n packages: string[] = [];\n\n @property({ attribute: false })\n pyenv?: PyEnv;\n\n @state()\n private loadingPackages: boolean = false;\n\n @state()\n private packageLoadError?: string;\n\n private onPackageAdded?: (packageName: string) => void;\n private onPackageRemoved?: (packageName: string) => void;\n\n public configure(options: PackageManagerOptions) {\n this.packages = options.packages || [];\n this.pyenv = options.pyenv;\n this.onPackageAdded = options.onPackageAdded;\n this.onPackageRemoved = options.onPackageRemoved;\n }\n\n public show() {\n this.open = true;\n }\n\n public hide() {\n this.open = false;\n }\n\n private addPackage(packageName: string) {\n if (!packageName || packageName.trim() === '') return;\n\n const trimmedName = packageName.trim();\n if (!this.packages.includes(trimmedName)) {\n this.packages = [...this.packages, trimmedName];\n this.onPackageAdded?.(trimmedName);\n }\n }\n\n private removePackage(packageName: string) {\n const index = this.packages.indexOf(packageName);\n if (index > -1) {\n this.packages = this.packages.filter(pkg => pkg !== packageName);\n this.onPackageRemoved?.(packageName);\n }\n }\n\n private async reloadPackages() {\n if (!this.pyenv) return;\n\n this.loadingPackages = true;\n this.packageLoadError = undefined;\n\n try {\n await this.pyenv.loadPackages(this.packages);\n } catch (error) {\n this.packageLoadError = String(error);\n } finally {\n this.loadingPackages = false;\n }\n }\n\n render() {\n let newPackageInput: HTMLInputElement | undefined;\n\n return html`\n <wa-dialog \n label=\"Manage Required Packages\" \n ?open=${this.open}\n @wa-after-hide=${() => {\n this.open = false;\n this.dispatchEvent(new CustomEvent('hide', { bubbles: true, composed: true }));\n }}>\n <div class=\"package-manager\">\n <p class=\"package-manager-description\">\n Specify Python packages that should be automatically loaded when connecting to the kernel.\n </p>\n\n ${this.loadingPackages ? html`\n <wa-alert variant=\"primary\" open>\n <wa-icon slot=\"icon\" name=\"circle-notch\" library=\"fa\" class=\"spinning\"></wa-icon>\n Loading packages...\n </wa-alert>\n ` : ''}\n\n ${this.packageLoadError ? html`\n <wa-alert variant=\"danger\" open closable @wa-after-hide=${() => this.packageLoadError = undefined}>\n <wa-icon slot=\"icon\" name=\"exclamation-triangle\"></wa-icon>\n <strong>Package Load Error:</strong><br>\n ${this.packageLoadError}\n </wa-alert>\n ` : ''}\n\n <div class=\"package-input-group\">\n <wa-input \n placeholder=\"Package name (e.g., pandas, numpy)\" \n ${ref((el: any) => newPackageInput = el)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter' && newPackageInput) {\n this.addPackage(newPackageInput.value);\n newPackageInput.value = '';\n }\n }}>\n <wa-icon slot=\"prefix\" name=\"box\"></wa-icon>\n </wa-input>\n <wa-button \n @click=${() => {\n if (newPackageInput) {\n this.addPackage(newPackageInput.value);\n newPackageInput.value = '';\n }\n }}\n variant=\"primary\">\n <wa-icon slot=\"prefix\" name=\"plus\"></wa-icon>\n Add\n </wa-button>\n </div>\n\n ${this.packages.length === 0 ? html`\n <div class=\"empty-state\">\n <wa-icon name=\"box\" style=\"font-size: 3rem; opacity: 0.3;\"></wa-icon>\n <p>No packages configured</p>\n <p style=\"font-size: 0.9rem; opacity: 0.7;\">Add packages above to auto-load them when the kernel connects</p>\n </div>\n ` : html`\n <div class=\"package-list\">\n <div class=\"package-list-header\">\n <strong>Required Packages (${this.packages.length})</strong>\n </div>\n ${repeat(this.packages, pkg => pkg, pkg => html`\n <div class=\"package-item\">\n <wa-icon name=\"box\" style=\"opacity: 0.5;\"></wa-icon>\n <span class=\"package-name\">${pkg}</span>\n <wa-button \n size=\"small\" \n variant=\"text\"\n @click=${() => this.removePackage(pkg)}\n title=\"Remove package\">\n <wa-icon name=\"xmark\"></wa-icon>\n </wa-button>\n </div>\n `)}\n </div>\n `}\n </div>\n <div slot=\"footer\" class=\"package-manager-footer\">\n ${this.pyenv && this.packages.length > 0 ? html`\n <wa-button \n variant=\"default\"\n @click=${() => this.reloadPackages()}\n ?disabled=${this.loadingPackages}>\n <wa-icon slot=\"prefix\" name=\"arrows-rotate\"></wa-icon>\n Reload Packages\n </wa-button>\n ` : ''}\n <wa-button \n variant=\"primary\"\n @click=${() => this.hide()}>\n Done\n </wa-button>\n </div>\n </wa-dialog>\n `;\n }\n\n static styles = css`\n :host {\n display: contents;\n }\n\n .package-manager {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 1rem;\n }\n\n .package-manager-description {\n margin: 0;\n font-size: 0.95rem;\n opacity: 0.8;\n line-height: 1.5;\n }\n\n .package-input-group {\n display: flex;\n gap: 0.5rem;\n }\n\n .package-input-group wa-input {\n flex: 1;\n }\n\n .package-list {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n max-height: 400px;\n overflow-y: auto;\n }\n\n .package-list-header {\n padding: 0.5rem;\n border-bottom: 1px solid var(--wa-color-outline);\n margin-bottom: 0.5rem;\n }\n\n .package-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem;\n border-radius: 4px;\n background: var(--wa-color-surface-variant);\n transition: background 0.2s;\n }\n\n .package-item:hover {\n background: var(--wa-color-surface-container-highest);\n }\n\n .package-name {\n flex: 1;\n font-family: monospace;\n font-size: 0.95rem;\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n padding: 3rem 1rem;\n text-align: center;\n opacity: 0.6;\n }\n\n .empty-state p {\n margin: 0;\n }\n\n .package-manager-footer {\n display: flex;\n gap: 0.5rem;\n justify-content: flex-end;\n padding-top: 1rem;\n border-top: 1px solid var(--wa-color-outline);\n }\n\n .spinning {\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n `;\n}\n\nclass PythonPackageManagerService {\n private managerInstance?: DocksPythonPackageManager;\n\n public showPackageManager(options: PackageManagerOptions): DocksPythonPackageManager {\n if (!this.managerInstance) {\n this.managerInstance = document.createElement('docks-python-package-manager') as DocksPythonPackageManager;\n document.body.appendChild(this.managerInstance);\n }\n\n this.managerInstance.configure(options);\n this.managerInstance.show();\n\n return this.managerInstance;\n }\n\n public getManager(): DocksPythonPackageManager | undefined {\n return this.managerInstance;\n }\n}\n\nexport const pythonPackageManagerService = new PythonPackageManagerService();\nrootContext.put(\"pythonPackageManagerService\", pythonPackageManagerService);\n"],"mappings":"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"}