@eclipse-lyra/extension-python-runtime 0.0.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 (37) hide show
  1. package/dist/api.d.ts +3 -0
  2. package/dist/api.d.ts.map +1 -0
  3. package/dist/api.js +7 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/assets/__vite-browser-external-Dhvy_jtL.js +5 -0
  6. package/dist/assets/__vite-browser-external-Dhvy_jtL.js.map +1 -0
  7. package/dist/assets/pyworker-_tLBWDbU.js.map +1 -0
  8. package/dist/commands-3JccKvcq.js +47 -0
  9. package/dist/commands-3JccKvcq.js.map +1 -0
  10. package/dist/commands.d.ts +2 -0
  11. package/dist/commands.d.ts.map +1 -0
  12. package/dist/editor-python-run.d.ts +4 -0
  13. package/dist/editor-python-run.d.ts.map +1 -0
  14. package/dist/i18n.json.d.ts +13 -0
  15. package/dist/index.d.ts +2 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +23 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/package-manager-DTcpwrMr.js +299 -0
  20. package/dist/package-manager-DTcpwrMr.js.map +1 -0
  21. package/dist/package-manager.d.ts +33 -0
  22. package/dist/package-manager.d.ts.map +1 -0
  23. package/dist/pyservice-B-tT6VHu.js +217 -0
  24. package/dist/pyservice-B-tT6VHu.js.map +1 -0
  25. package/dist/pyservice.d.ts +37 -0
  26. package/dist/pyservice.d.ts.map +1 -0
  27. package/dist/python-editor-BZ-OYhJ1.js +247 -0
  28. package/dist/python-editor-BZ-OYhJ1.js.map +1 -0
  29. package/dist/python-editor.d.ts +42 -0
  30. package/dist/python-editor.d.ts.map +1 -0
  31. package/dist/python-runtime-extension-B31nPBS0.js +105 -0
  32. package/dist/python-runtime-extension-B31nPBS0.js.map +1 -0
  33. package/dist/python-runtime-extension.d.ts +3 -0
  34. package/dist/python-runtime-extension.d.ts.map +1 -0
  35. package/dist/pyworker.d.ts +11 -0
  36. package/dist/pyworker.d.ts.map +1 -0
  37. package/package.json +35 -0
@@ -0,0 +1,33 @@
1
+ import { LitElement } from 'lit';
2
+ import { PyEnv } from './pyservice';
3
+ export interface PackageManagerOptions {
4
+ packages: string[];
5
+ onPackageAdded?: (packageName: string) => void;
6
+ onPackageRemoved?: (packageName: string) => void;
7
+ pyenv?: PyEnv;
8
+ }
9
+ export declare class LyraPythonPackageManager extends LitElement {
10
+ open: boolean;
11
+ packages: string[];
12
+ pyenv?: PyEnv;
13
+ private loadingPackages;
14
+ private packageLoadError?;
15
+ private onPackageAdded?;
16
+ private onPackageRemoved?;
17
+ configure(options: PackageManagerOptions): void;
18
+ show(): void;
19
+ hide(): void;
20
+ private addPackage;
21
+ private removePackage;
22
+ private reloadPackages;
23
+ render(): import('lit-html').TemplateResult<1>;
24
+ static styles: import('lit').CSSResult;
25
+ }
26
+ declare class PythonPackageManagerService {
27
+ private managerInstance?;
28
+ showPackageManager(options: PackageManagerOptions): LyraPythonPackageManager;
29
+ getManager(): LyraPythonPackageManager | undefined;
30
+ }
31
+ export declare const pythonPackageManagerService: PythonPackageManagerService;
32
+ export {};
33
+ //# sourceMappingURL=package-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,KAAK,CAAC;AAI5C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,MAAM,WAAW,qBAAqB;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,gBAAgB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,KAAK,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,qBACa,wBAAyB,SAAQ,UAAU;IAEpD,IAAI,EAAE,OAAO,CAAS;IAGtB,QAAQ,EAAE,MAAM,EAAE,CAAM;IAGxB,KAAK,CAAC,EAAE,KAAK,CAAC;IAGd,OAAO,CAAC,eAAe,CAAkB;IAGzC,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAElC,OAAO,CAAC,cAAc,CAAC,CAAgC;IACvD,OAAO,CAAC,gBAAgB,CAAC,CAAgC;IAElD,SAAS,CAAC,OAAO,EAAE,qBAAqB;IAOxC,IAAI;IAIJ,IAAI;IAIX,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;YAQP,cAAc;IAe5B,MAAM;IAuGN,MAAM,CAAC,MAAM,0BAiGX;CACL;AAED,cAAM,2BAA2B;IAC7B,OAAO,CAAC,eAAe,CAAC,CAA2B;IAE5C,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,GAAG,wBAAwB;IAY5E,UAAU,IAAI,wBAAwB,GAAG,SAAS;CAG5D;AAED,eAAO,MAAM,2BAA2B,6BAAoC,CAAC"}
@@ -0,0 +1,217 @@
1
+ import { publish, TOPIC_WORKSPACE_CHANGED } from "@eclipse-lyra/core";
2
+ const jsContent = 'var __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\nvar require_pyworker_001 = __commonJS({\n "assets/pyworker-_tLBWDbU.js"(exports, module) {\n const version = "0.27.7";\n var pyoPackageJson = {\n version\n };\n var Q = Object.defineProperty;\n var s = (e, t) => Q(e, "name", { value: t, configurable: true }), R = ((e) => typeof require < "u" ? require : typeof Proxy < "u" ? new Proxy(e, { get: (t, o) => (typeof require < "u" ? require : t)[o] }) : e)(function(e) {\n if (typeof require < "u") return require.apply(this, arguments);\n throw new Error(\'Dynamic require of "\' + e + \'" is not supported\');\n });\n function Z(e) {\n return !isNaN(parseFloat(e)) && isFinite(e);\n }\n s(Z, "_isNumber");\n function E(e) {\n return e.charAt(0).toUpperCase() + e.substring(1);\n }\n s(E, "_capitalize");\n function O(e) {\n return function() {\n return this[e];\n };\n }\n s(O, "_getter");\n var w = ["isConstructor", "isEval", "isNative", "isToplevel"], N = ["columnNumber", "lineNumber"], _ = ["fileName", "functionName", "source"], ee = ["args"], te = ["evalOrigin"], P = w.concat(N, _, ee, te);\n function p(e) {\n if (e) for (var t = 0; t < P.length; t++) e[P[t]] !== void 0 && this["set" + E(P[t])](e[P[t]]);\n }\n s(p, "StackFrame");\n p.prototype = { getArgs: function() {\n return this.args;\n }, setArgs: function(e) {\n if (Object.prototype.toString.call(e) !== "[object Array]") throw new TypeError("Args must be an Array");\n this.args = e;\n }, getEvalOrigin: function() {\n return this.evalOrigin;\n }, setEvalOrigin: function(e) {\n if (e instanceof p) this.evalOrigin = e;\n else if (e instanceof Object) this.evalOrigin = new p(e);\n else throw new TypeError("Eval Origin must be an Object or StackFrame");\n }, toString: function() {\n var e = this.getFileName() || "", t = this.getLineNumber() || "", o = this.getColumnNumber() || "", r = this.getFunctionName() || "";\n return this.getIsEval() ? e ? "[eval] (" + e + ":" + t + ":" + o + ")" : "[eval]:" + t + ":" + o : r ? r + " (" + e + ":" + t + ":" + o + ")" : e + ":" + t + ":" + o;\n } };\n p.fromString = s(function(t) {\n var o = t.indexOf("("), r = t.lastIndexOf(")"), a = t.substring(0, o), n = t.substring(o + 1, r).split(","), i = t.substring(r + 1);\n if (i.indexOf("@") === 0) var c = /@(.+?)(?::(\\d+))?(?::(\\d+))?$/.exec(i, ""), l = c[1], d = c[2], u = c[3];\n return new p({ functionName: a, args: n || void 0, fileName: l, lineNumber: d || void 0, columnNumber: u || void 0 });\n }, "StackFrame$$fromString");\n for (b = 0; b < w.length; b++) p.prototype["get" + E(w[b])] = O(w[b]), p.prototype["set" + E(w[b])] = /* @__PURE__ */ (function(e) {\n return function(t) {\n this[e] = !!t;\n };\n })(w[b]);\n var b;\n for (v = 0; v < N.length; v++) p.prototype["get" + E(N[v])] = O(N[v]), p.prototype["set" + E(N[v])] = /* @__PURE__ */ (function(e) {\n return function(t) {\n if (!Z(t)) throw new TypeError(e + " must be a Number");\n this[e] = Number(t);\n };\n })(N[v]);\n var v;\n for (h = 0; h < _.length; h++) p.prototype["get" + E(_[h])] = O(_[h]), p.prototype["set" + E(_[h])] = /* @__PURE__ */ (function(e) {\n return function(t) {\n this[e] = String(t);\n };\n })(_[h]);\n var h, k = p;\n function ne() {\n var e = /^\\s*at .*(\\S+:\\d+|\\(native\\))/m, t = /^(eval@)?(\\[native code])?$/;\n return { parse: s(function(r) {\n if (r.stack && r.stack.match(e)) return this.parseV8OrIE(r);\n if (r.stack) return this.parseFFOrSafari(r);\n throw new Error("Cannot parse given Error object");\n }, "ErrorStackParser$$parse"), extractLocation: s(function(r) {\n if (r.indexOf(":") === -1) return [r];\n var a = /(.+?)(?::(\\d+))?(?::(\\d+))?$/, n = a.exec(r.replace(/[()]/g, ""));\n return [n[1], n[2] || void 0, n[3] || void 0];\n }, "ErrorStackParser$$extractLocation"), parseV8OrIE: s(function(r) {\n var a = r.stack.split(`\n`).filter(function(n) {\n return !!n.match(e);\n }, this);\n return a.map(function(n) {\n n.indexOf("(eval ") > -1 && (n = n.replace(/eval code/g, "eval").replace(/(\\(eval at [^()]*)|(,.*$)/g, ""));\n var i = n.replace(/^\\s+/, "").replace(/\\(eval code/g, "(").replace(/^.*?\\s+/, ""), c = i.match(/ (\\(.+\\)$)/);\n i = c ? i.replace(c[0], "") : i;\n var l = this.extractLocation(c ? c[1] : i), d = c && i || void 0, u = ["eval", "<anonymous>"].indexOf(l[0]) > -1 ? void 0 : l[0];\n return new k({ functionName: d, fileName: u, lineNumber: l[1], columnNumber: l[2], source: n });\n }, this);\n }, "ErrorStackParser$$parseV8OrIE"), parseFFOrSafari: s(function(r) {\n var a = r.stack.split(`\n`).filter(function(n) {\n return !n.match(t);\n }, this);\n return a.map(function(n) {\n if (n.indexOf(" > eval") > -1 && (n = n.replace(/ line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g, ":$1")), n.indexOf("@") === -1 && n.indexOf(":") === -1) return new k({ functionName: n });\n var i = /((.*".+"[^@]*)?[^@]*)(?:@)/, c = n.match(i), l = c && c[1] ? c[1] : void 0, d = this.extractLocation(n.replace(i, ""));\n return new k({ functionName: l, fileName: d[0], lineNumber: d[1], columnNumber: d[2], source: n });\n }, this);\n }, "ErrorStackParser$$parseFFOrSafari") };\n }\n s(ne, "ErrorStackParser");\n var re = new ne();\n var M = re;\n var g = typeof process == "object" && typeof process.versions == "object" && typeof process.versions.node == "string" && !process.browser, A = g && typeof module < "u" && typeof module.exports < "u" && typeof R < "u" && typeof __dirname < "u", W = g && !A, ie = typeof Deno < "u", B = !g && !ie, $ = B && typeof window == "object" && typeof document == "object" && typeof document.createElement == "function" && "sessionStorage" in window && typeof importScripts != "function", j = B && typeof importScripts == "function" && typeof self == "object";\n typeof navigator == "object" && typeof navigator.userAgent == "string" && navigator.userAgent.indexOf("Chrome") == -1 && navigator.userAgent.indexOf("Safari") > -1;\n var z, D, V, H, L;\n async function T() {\n if (!g || (z = (await import("./__vite-browser-external-Dhvy_jtL.js")).default, H = await import("./__vite-browser-external-Dhvy_jtL.js"), L = await import("./__vite-browser-external-Dhvy_jtL.js"), V = (await import("./__vite-browser-external-Dhvy_jtL.js")).default, D = await import("./__vite-browser-external-Dhvy_jtL.js"), U = D.sep, typeof R < "u")) return;\n let e = H, t = await import("./__vite-browser-external-Dhvy_jtL.js"), o = await import("./__vite-browser-external-Dhvy_jtL.js"), r = await import("./__vite-browser-external-Dhvy_jtL.js"), a = { fs: e, crypto: t, ws: o, child_process: r };\n globalThis.require = function(n) {\n return a[n];\n };\n }\n s(T, "initNodeModules");\n function oe(e, t) {\n return D.resolve(t || ".", e);\n }\n s(oe, "node_resolvePath");\n function ae(e, t) {\n return t === void 0 && (t = location), new URL(e, t).toString();\n }\n s(ae, "browser_resolvePath");\n var x;\n g ? x = oe : x = ae;\n var U;\n g || (U = "/");\n function se(e, t) {\n return e.startsWith("file://") && (e = e.slice(7)), e.includes("://") ? { response: fetch(e) } : { binary: L.readFile(e).then((o) => new Uint8Array(o.buffer, o.byteOffset, o.byteLength)) };\n }\n s(se, "node_getBinaryResponse");\n function ce(e, t) {\n let o = new URL(e, location);\n return { response: fetch(o, t ? { integrity: t } : {}) };\n }\n s(ce, "browser_getBinaryResponse");\n var F;\n g ? F = se : F = ce;\n async function q(e, t) {\n let { response: o, binary: r } = F(e, t);\n if (r) return r;\n let a = await o;\n if (!a.ok) throw new Error(`Failed to load \'${e}\': request failed.`);\n return new Uint8Array(await a.arrayBuffer());\n }\n s(q, "loadBinaryFile");\n var I;\n if ($) I = s(async (e) => await import(e), "loadScript");\n else if (j) I = s(async (e) => {\n try {\n globalThis.importScripts(e);\n } catch (t) {\n if (t instanceof TypeError) await import(e);\n else throw t;\n }\n }, "loadScript");\n else if (g) I = le;\n else throw new Error("Cannot determine runtime environment");\n async function le(e) {\n e.startsWith("file://") && (e = e.slice(7)), e.includes("://") ? V.runInThisContext(await (await fetch(e)).text()) : await import(z.pathToFileURL(e).href);\n }\n s(le, "nodeLoadScript");\n async function J(e) {\n if (g) {\n await T();\n let t = await L.readFile(e, { encoding: "utf8" });\n return JSON.parse(t);\n } else return await (await fetch(e)).json();\n }\n s(J, "loadLockFile");\n async function K() {\n if (A) return __dirname;\n let e;\n try {\n throw new Error();\n } catch (r) {\n e = r;\n }\n let t = M.parse(e)[0].fileName;\n if (g && !t.startsWith("file://") && (t = `file://${t}`), W) {\n let r = await import("./__vite-browser-external-Dhvy_jtL.js");\n return (await import("./__vite-browser-external-Dhvy_jtL.js")).fileURLToPath(r.dirname(t));\n }\n let o = t.lastIndexOf(U);\n if (o === -1) throw new Error("Could not extract indexURL path from pyodide module location");\n return t.slice(0, o);\n }\n s(K, "calculateDirname");\n function Y(e) {\n let t = e.FS, o = e.FS.filesystems.MEMFS, r = e.PATH, a = { DIR_MODE: 16895, FILE_MODE: 33279, mount: function(n) {\n if (!n.opts.fileSystemHandle) throw new Error("opts.fileSystemHandle is required");\n return o.mount.apply(null, arguments);\n }, syncfs: async (n, i, c) => {\n try {\n let l = a.getLocalSet(n), d = await a.getRemoteSet(n), u = i ? d : l, m = i ? l : d;\n await a.reconcile(n, u, m), c(null);\n } catch (l) {\n c(l);\n }\n }, getLocalSet: (n) => {\n let i = /* @__PURE__ */ Object.create(null);\n function c(u) {\n return u !== "." && u !== "..";\n }\n s(c, "isRealDir");\n function l(u) {\n return (m) => r.join2(u, m);\n }\n s(l, "toAbsolute");\n let d = t.readdir(n.mountpoint).filter(c).map(l(n.mountpoint));\n for (; d.length; ) {\n let u = d.pop(), m = t.stat(u);\n t.isDir(m.mode) && d.push.apply(d, t.readdir(u).filter(c).map(l(u))), i[u] = { timestamp: m.mtime, mode: m.mode };\n }\n return { type: "local", entries: i };\n }, getRemoteSet: async (n) => {\n let i = /* @__PURE__ */ Object.create(null), c = await de(n.opts.fileSystemHandle);\n for (let [l, d] of c) l !== "." && (i[r.join2(n.mountpoint, l)] = { timestamp: d.kind === "file" ? new Date((await d.getFile()).lastModified) : /* @__PURE__ */ new Date(), mode: d.kind === "file" ? a.FILE_MODE : a.DIR_MODE });\n return { type: "remote", entries: i, handles: c };\n }, loadLocalEntry: (n) => {\n let c = t.lookupPath(n).node, l = t.stat(n);\n if (t.isDir(l.mode)) return { timestamp: l.mtime, mode: l.mode };\n if (t.isFile(l.mode)) return c.contents = o.getFileDataAsTypedArray(c), { timestamp: l.mtime, mode: l.mode, contents: c.contents };\n throw new Error("node type not supported");\n }, storeLocalEntry: (n, i) => {\n if (t.isDir(i.mode)) t.mkdirTree(n, i.mode);\n else if (t.isFile(i.mode)) t.writeFile(n, i.contents, { canOwn: true });\n else throw new Error("node type not supported");\n t.chmod(n, i.mode), t.utime(n, i.timestamp, i.timestamp);\n }, removeLocalEntry: (n) => {\n var i = t.stat(n);\n t.isDir(i.mode) ? t.rmdir(n) : t.isFile(i.mode) && t.unlink(n);\n }, loadRemoteEntry: async (n) => {\n if (n.kind === "file") {\n let i = await n.getFile();\n return { contents: new Uint8Array(await i.arrayBuffer()), mode: a.FILE_MODE, timestamp: new Date(i.lastModified) };\n } else {\n if (n.kind === "directory") return { mode: a.DIR_MODE, timestamp: /* @__PURE__ */ new Date() };\n throw new Error("unknown kind: " + n.kind);\n }\n }, storeRemoteEntry: async (n, i, c) => {\n let l = n.get(r.dirname(i)), d = t.isFile(c.mode) ? await l.getFileHandle(r.basename(i), { create: true }) : await l.getDirectoryHandle(r.basename(i), { create: true });\n if (d.kind === "file") {\n let u = await d.createWritable();\n await u.write(c.contents), await u.close();\n }\n n.set(i, d);\n }, removeRemoteEntry: async (n, i) => {\n await n.get(r.dirname(i)).removeEntry(r.basename(i)), n.delete(i);\n }, reconcile: async (n, i, c) => {\n let l = 0, d = [];\n Object.keys(i.entries).forEach(function(f) {\n let y = i.entries[f], S = c.entries[f];\n (!S || t.isFile(y.mode) && y.timestamp.getTime() > S.timestamp.getTime()) && (d.push(f), l++);\n }), d.sort();\n let u = [];\n if (Object.keys(c.entries).forEach(function(f) {\n i.entries[f] || (u.push(f), l++);\n }), u.sort().reverse(), !l) return;\n let m = i.type === "remote" ? i.handles : c.handles;\n for (let f of d) {\n let y = r.normalize(f.replace(n.mountpoint, "/")).substring(1);\n if (c.type === "local") {\n let S = m.get(y), X = await a.loadRemoteEntry(S);\n a.storeLocalEntry(f, X);\n } else {\n let S = a.loadLocalEntry(f);\n await a.storeRemoteEntry(m, y, S);\n }\n }\n for (let f of u) if (c.type === "local") a.removeLocalEntry(f);\n else {\n let y = r.normalize(f.replace(n.mountpoint, "/")).substring(1);\n await a.removeRemoteEntry(m, y);\n }\n } };\n e.FS.filesystems.NATIVEFS_ASYNC = a;\n }\n s(Y, "initializeNativeFS");\n var de = s(async (e) => {\n let t = [];\n async function o(a) {\n for await (let n of a.values()) t.push(n), n.kind === "directory" && await o(n);\n }\n s(o, "collect"), await o(e);\n let r = /* @__PURE__ */ new Map();\n r.set(".", e);\n for (let a of t) {\n let n = (await e.resolve(a)).join("/");\n r.set(n, a);\n }\n return r;\n }, "getFsHandles");\n function G(e) {\n let t = { noImageDecoding: true, noAudioDecoding: true, noWasmDecoding: false, preRun: ge(e), quit(o, r) {\n throw t.exited = { status: o, toThrow: r }, r;\n }, print: e.stdout, printErr: e.stderr, thisProgram: e._sysExecutable, arguments: e.args, API: { config: e }, locateFile: (o) => e.indexURL + o, instantiateWasm: ye(e.indexURL) };\n return t;\n }\n s(G, "createSettings");\n function ue(e) {\n return function(t) {\n let o = "/";\n try {\n t.FS.mkdirTree(e);\n } catch (r) {\n console.error(`Error occurred while making a home directory \'${e}\':`), console.error(r), console.error(`Using \'${o}\' for a home directory instead`), e = o;\n }\n t.FS.chdir(e);\n };\n }\n s(ue, "createHomeDirectory");\n function fe(e) {\n return function(t) {\n Object.assign(t.ENV, e);\n };\n }\n s(fe, "setEnvironment");\n function me(e) {\n return e ? [async (t) => {\n t.addRunDependency("fsInitHook");\n try {\n await e(t.FS, { sitePackages: t.API.sitePackages });\n } finally {\n t.removeRunDependency("fsInitHook");\n }\n }] : [];\n }\n s(me, "callFsInitHook");\n function pe(e) {\n let t = q(e);\n return async (o) => {\n let r = o._py_version_major(), a = o._py_version_minor();\n o.FS.mkdirTree("/lib"), o.API.sitePackages = `/lib/python${r}.${a}/site-packages`, o.FS.mkdirTree(o.API.sitePackages), o.addRunDependency("install-stdlib");\n try {\n let n = await t;\n o.FS.writeFile(`/lib/python${r}${a}.zip`, n);\n } catch (n) {\n console.error("Error occurred while installing the standard library:"), console.error(n);\n } finally {\n o.removeRunDependency("install-stdlib");\n }\n };\n }\n s(pe, "installStdlib");\n function ge(e) {\n let t;\n return e.stdLibURL != null ? t = e.stdLibURL : t = e.indexURL + "python_stdlib.zip", [...me(e.fsInit), pe(t), ue(e.env.HOME), fe(e.env), Y];\n }\n s(ge, "getFileSystemInitializationFuncs");\n function ye(e) {\n if (typeof WasmOffsetConverter < "u") return;\n let { binary: t, response: o } = F(e + "pyodide.asm.wasm");\n return function(r, a) {\n return (async function() {\n try {\n let n;\n o ? n = await WebAssembly.instantiateStreaming(o, r) : n = await WebAssembly.instantiate(await t, r);\n let { instance: i, module: c } = n;\n a(i, c);\n } catch (n) {\n console.warn("wasm instantiation failed!"), console.warn(n);\n }\n })(), {};\n };\n }\n s(ye, "getInstantiateWasmFunc");\n var C = "0.27.7";\n async function $e(e = {}) {\n var u, m;\n await T();\n let t = e.indexURL || await K();\n t = x(t), t.endsWith("/") || (t += "/"), e.indexURL = t;\n let o = { fullStdLib: false, jsglobals: globalThis, stdin: globalThis.prompt ? globalThis.prompt : void 0, lockFileURL: t + "pyodide-lock.json", args: [], env: {}, packageCacheDir: t, packages: [], enableRunUntilComplete: true, checkAPIVersion: true, BUILD_ID: "e94377f5ce7dcf67e0417b69a0016733c2cfb6b4622ee8c490a6f17eb58e863b" }, r = Object.assign(o, e);\n (u = r.env).HOME ?? (u.HOME = "/home/pyodide"), (m = r.env).PYTHONINSPECT ?? (m.PYTHONINSPECT = "1");\n let a = G(r), n = a.API;\n if (n.lockFilePromise = J(r.lockFileURL), typeof _createPyodideModule != "function") {\n let f = `${r.indexURL}pyodide.asm.js`;\n await I(f);\n }\n let i;\n if (e._loadSnapshot) {\n let f = await e._loadSnapshot;\n ArrayBuffer.isView(f) ? i = f : i = new Uint8Array(f), a.noInitialRun = true, a.INITIAL_MEMORY = i.length;\n }\n let c = await _createPyodideModule(a);\n if (a.exited) throw a.exited.toThrow;\n if (e.pyproxyToStringRepr && n.setPyProxyToStringMethod(true), n.version !== C && r.checkAPIVersion) throw new Error(`Pyodide version does not match: \'${C}\' <==> \'${n.version}\'. If you updated the Pyodide version, make sure you also updated the \'indexURL\' parameter passed to loadPyodide.`);\n c.locateFile = (f) => {\n throw new Error("Didn\'t expect to load any more file_packager files!");\n };\n let l;\n i && (l = n.restoreSnapshot(i));\n let d = n.finalizeBootstrap(l, e._snapshotDeserializer);\n return n.sys.path.insert(0, ""), d.version.includes("dev") || n.setCdnUrl(`https://cdn.jsdelivr.net/pyodide/v${d.version}/full/`), n._pyodide.set_excepthook(), await n.packageIndexReady, n.initializeStreams(r.stdin, r.stdout, r.stderr), d;\n }\n s($e, "loadPyodide");\n let pyodide = null;\n let workspaceMountFS = null;\n let interruptBuffer = null;\n let inputCounter = 0;\n const pendingInputRequests = /* @__PURE__ */ new Map();\n const originalConsole = {\n log: console.log.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n debug: console.debug.bind(console)\n };\n function formatArg(arg) {\n if (arg === null) return "null";\n if (arg === void 0) return "undefined";\n if (typeof arg === "string") return arg;\n if (typeof arg === "number" || typeof arg === "boolean") return String(arg);\n if (arg instanceof Error) return `${arg.name}: ${arg.message}`;\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n }\n console.log = function(...args) {\n originalConsole.log.apply(console, args);\n self.postMessage({\n id: "console-log",\n type: "console",\n payload: { level: "info", message: args.map((a) => formatArg(a)).join(" ") }\n });\n };\n console.info = function(...args) {\n originalConsole.info.apply(console, args);\n self.postMessage({\n id: "console-log",\n type: "console",\n payload: { level: "info", message: args.map((a) => formatArg(a)).join(" ") }\n });\n };\n console.warn = function(...args) {\n originalConsole.warn.apply(console, args);\n self.postMessage({\n id: "console-log",\n type: "console",\n payload: { level: "warning", message: args.map((a) => formatArg(a)).join(" ") }\n });\n };\n console.error = function(...args) {\n originalConsole.error.apply(console, args);\n self.postMessage({\n id: "console-log",\n type: "console",\n payload: { level: "error", message: args.map((a) => formatArg(a)).join(" ") }\n });\n };\n console.debug = function(...args) {\n originalConsole.debug.apply(console, args);\n self.postMessage({\n id: "console-log",\n type: "console",\n payload: { level: "debug", message: args.map((a) => formatArg(a)).join(" ") }\n });\n };\n const consoleBuffer = [];\n function sendMessage(response) {\n self.postMessage(response);\n }\n async function initPyodide(payload) {\n const poVersion = pyoPackageJson.version;\n pyodide = await $e({\n indexURL: `https://cdn.jsdelivr.net/pyodide/v${poVersion}/full/`\n });\n if (typeof SharedArrayBuffer !== "undefined") {\n try {\n const interruptBufferShared = new SharedArrayBuffer(1);\n interruptBuffer = new Uint8Array(interruptBufferShared);\n pyodide.setInterruptBuffer(interruptBuffer);\n sendMessage({\n id: "interrupt-buffer",\n type: "success",\n payload: interruptBufferShared\n });\n } catch (error) {\n console.warn("Failed to set up interrupt buffer:", error);\n sendMessage({\n id: "interrupt-buffer",\n type: "error",\n payload: { message: "SharedArrayBuffer not available" }\n });\n }\n } else {\n console.warn("SharedArrayBuffer not available - interrupt functionality will be limited");\n sendMessage({\n id: "interrupt-buffer",\n type: "error",\n payload: { message: "SharedArrayBuffer not available" }\n });\n }\n pyodide.globals.set("input", (promptText) => {\n const inputId = `input-${inputCounter++}`;\n sendMessage({\n id: inputId,\n type: "inputRequest",\n payload: { prompt: promptText || "" }\n });\n return new Promise((resolve, reject) => {\n pendingInputRequests.set(inputId, { resolve, reject });\n });\n });\n pyodide.setStderr({\n batched: (s2) => {\n consoleBuffer.push(s2);\n sendMessage({\n id: "stream",\n type: "stderr",\n payload: s2\n });\n }\n });\n pyodide.setStdout({\n batched: (s2) => {\n consoleBuffer.push(s2);\n sendMessage({\n id: "stream",\n type: "stdout",\n payload: s2\n });\n }\n });\n if (payload.vars) {\n for (const [key, value] of Object.entries(payload.vars)) {\n pyodide.globals.set(key, value);\n }\n }\n }\n async function mountWorkspace(payload) {\n if (!pyodide) throw new Error("Pyodide not initialized");\n const mountPoint = payload.mountPoint || "/workspace";\n workspaceMountFS = await pyodide.mountNativeFS(mountPoint, payload.handle);\n pyodide.runPython(`import os, sys; sys.path.append(\'${mountPoint}\'); os.chdir("${mountPoint}");`);\n }\n async function installDependencies(payload) {\n if (!pyodide) throw new Error("Pyodide not initialized");\n const lines = payload.requirements.split("\\n").map((line) => line.trim()).filter((line) => line && !line.startsWith("#"));\n if (lines.length > 0) {\n await pyodide.loadPackage(lines, {\n checkIntegrity: false\n });\n }\n }\n async function loadPackages(payload) {\n if (!pyodide) throw new Error("Pyodide not initialized");\n if (payload.packages.length > 0) {\n await pyodide.loadPackage(payload.packages, {\n checkIntegrity: false\n });\n }\n }\n function convertResult(result) {\n if (result === void 0 || result === null) {\n return result;\n }\n const resultType = typeof result;\n if (resultType === "string" || resultType === "number" || resultType === "boolean") {\n return result;\n }\n if (result && typeof result === "object") {\n if (typeof result.toJs === "function") {\n try {\n const jsValue = result.toJs({\n dict_converter: Object.fromEntries,\n create_pyproxies: false\n });\n if (typeof result.destroy === "function") {\n result.destroy();\n }\n return jsValue;\n } catch (error) {\n try {\n const strValue = String(result);\n if (typeof result.destroy === "function") {\n result.destroy();\n }\n return strValue;\n } catch {\n return "[Python object]";\n }\n }\n }\n try {\n structuredClone(result);\n return result;\n } catch {\n try {\n return JSON.parse(JSON.stringify(result));\n } catch {\n return String(result);\n }\n }\n }\n return result;\n }\n async function execCode(payload) {\n if (!pyodide) throw new Error("Pyodide not initialized");\n consoleBuffer.length = 0;\n if (interruptBuffer) {\n interruptBuffer[0] = 0;\n }\n let result;\n try {\n result = await pyodide.runPythonAsync(payload.code);\n } catch (error) {\n if (interruptBuffer) {\n interruptBuffer[0] = 0;\n }\n throw error;\n }\n if (interruptBuffer) {\n interruptBuffer[0] = 0;\n }\n await syncWorkspace();\n return {\n result: convertResult(result),\n console: consoleBuffer.slice()\n };\n }\n async function execModule(payload) {\n if (!pyodide) throw new Error("Pyodide not initialized");\n consoleBuffer.length = 0;\n const mod = pyodide.pyimport(payload.moduleName);\n const entryName = payload.entryName ?? "main";\n let result;\n if (entryName in mod) {\n const func = mod[entryName];\n if (!(func instanceof Function)) {\n throw new Error(`Module entry point is not a function: ${entryName}`);\n }\n result = func.callKwargs(payload.vars || {});\n }\n await syncWorkspace();\n return {\n result: convertResult(result),\n console: consoleBuffer.slice()\n };\n }\n async function runFunction(payload) {\n if (!pyodide) throw new Error("Pyodide not initialized");\n consoleBuffer.length = 0;\n const func = pyodide.globals.get(payload.name);\n const result = func.callKwargs(payload.args);\n func.destroy();\n await syncWorkspace();\n return {\n result: convertResult(result),\n console: consoleBuffer.slice()\n };\n }\n async function setGlobal(payload) {\n if (!pyodide) throw new Error("Pyodide not initialized");\n pyodide.globals.set(payload.key, payload.value);\n }\n async function syncWorkspace() {\n if (workspaceMountFS) {\n await workspaceMountFS.syncfs();\n }\n }\n async function getVersion() {\n if (!pyodide) throw new Error("Pyodide not initialized");\n return String(pyodide.version);\n }\n self.onmessage = async (event) => {\n const { id, type, payload } = event.data;\n if (type === "inputResponse") {\n const pending = pendingInputRequests.get(id);\n if (pending) {\n pendingInputRequests.delete(id);\n if (payload.cancelled) {\n pending.resolve("");\n } else {\n pending.resolve(payload.value || "");\n }\n }\n return;\n }\n try {\n let result;\n switch (type) {\n case "init":\n await initPyodide(payload);\n result = { initialized: true };\n break;\n case "mountWorkspace":\n await mountWorkspace(payload);\n result = { mounted: true };\n break;\n case "installDependencies":\n await installDependencies(payload);\n result = { installed: true };\n break;\n case "loadPackages":\n await loadPackages(payload);\n result = { loaded: true };\n break;\n case "execCode":\n result = await execCode(payload);\n break;\n case "execModule":\n result = await execModule(payload);\n break;\n case "runFunction":\n result = await runFunction(payload);\n break;\n case "setGlobal":\n await setGlobal(payload);\n result = { set: true };\n break;\n case "syncWorkspace":\n await syncWorkspace();\n result = { synced: true };\n break;\n case "getVersion":\n result = await getVersion();\n break;\n default:\n throw new Error(`Unknown message type: ${type}`);\n }\n sendMessage({\n id,\n type: "success",\n payload: result\n });\n } catch (error) {\n sendMessage({\n id,\n type: "error",\n payload: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : void 0\n }\n });\n }\n };\n }\n});\nexport default require_pyworker_001();\n//# sourceMappingURL=pyworker-_tLBWDbU.js.map\n';
3
+ const blob = typeof self !== "undefined" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", jsContent], { type: "text/javascript;charset=utf-8" });
4
+ function WorkerWrapper(options) {
5
+ let objURL;
6
+ try {
7
+ objURL = blob && (self.URL || self.webkitURL).createObjectURL(blob);
8
+ if (!objURL) throw "";
9
+ const worker = new Worker(objURL, {
10
+ type: "module",
11
+ name: options?.name
12
+ });
13
+ worker.addEventListener("error", () => {
14
+ (self.URL || self.webkitURL).revokeObjectURL(objURL);
15
+ });
16
+ return worker;
17
+ } catch (e) {
18
+ return new Worker(
19
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(jsContent),
20
+ {
21
+ type: "module",
22
+ name: options?.name
23
+ }
24
+ );
25
+ }
26
+ }
27
+ let pipRequirementsModulePromise = null;
28
+ async function getPipRequirementsModule() {
29
+ if (!pipRequirementsModulePromise) {
30
+ pipRequirementsModulePromise = import("pip-requirements-js");
31
+ }
32
+ return pipRequirementsModulePromise;
33
+ }
34
+ let messageId = 0;
35
+ class PyEnv {
36
+ constructor() {
37
+ this.pendingMessages = /* @__PURE__ */ new Map();
38
+ }
39
+ async init(workspace, vars) {
40
+ this.workspace = workspace;
41
+ this.vars = vars ?? {};
42
+ const worker = new WorkerWrapper();
43
+ this.worker = worker;
44
+ worker.onmessage = (event) => {
45
+ this.handleWorkerMessage(event.data);
46
+ };
47
+ worker.onerror = (error) => {
48
+ console.error("Python Worker error:", error);
49
+ };
50
+ await this.sendMessage("init", { vars: this.vars });
51
+ if (this.workspace) {
52
+ await this.mountWorkspace();
53
+ }
54
+ }
55
+ handleWorkerMessage(response) {
56
+ if (response.id === "interrupt-buffer") {
57
+ if (response.type === "success") {
58
+ this.interruptBuffer = new Uint8Array(response.payload);
59
+ } else {
60
+ this.interruptBuffer = void 0;
61
+ }
62
+ return;
63
+ }
64
+ if (response.type === "inputRequest") {
65
+ const promptText = response.payload.prompt || "Input:";
66
+ const userInput = window.prompt(promptText);
67
+ this.worker.postMessage({
68
+ id: response.id,
69
+ type: "inputResponse",
70
+ payload: {
71
+ value: userInput,
72
+ cancelled: userInput === null
73
+ }
74
+ });
75
+ return;
76
+ }
77
+ if (response.type === "stdout") {
78
+ if (this.stdoutCallback) {
79
+ this.stdoutCallback(response.payload);
80
+ } else {
81
+ console.info(response.payload);
82
+ }
83
+ return;
84
+ }
85
+ if (response.type === "stderr") {
86
+ if (this.stderrCallback) {
87
+ this.stderrCallback(response.payload);
88
+ } else {
89
+ console.error(response.payload);
90
+ }
91
+ return;
92
+ }
93
+ if (response.type === "console") {
94
+ const { level, message } = response.payload;
95
+ if (typeof window !== "undefined" && window.logToTerminal) {
96
+ window.logToTerminal("Python Worker", message, level);
97
+ }
98
+ return;
99
+ }
100
+ const pending = this.pendingMessages.get(response.id);
101
+ if (pending) {
102
+ this.pendingMessages.delete(response.id);
103
+ if (response.type === "success") {
104
+ pending.resolve(response.payload);
105
+ } else if (response.type === "error") {
106
+ pending.reject(new Error(response.payload.message));
107
+ }
108
+ }
109
+ }
110
+ async sendMessage(type, payload) {
111
+ if (!this.worker) {
112
+ throw new Error("PyEnv not initialized yet: see init()");
113
+ }
114
+ const id = `msg-${messageId++}`;
115
+ const message = { id, type, payload };
116
+ return new Promise((resolve, reject) => {
117
+ this.pendingMessages.set(id, { resolve, reject });
118
+ this.worker.postMessage(message);
119
+ });
120
+ }
121
+ setStdoutCallback(callback) {
122
+ this.stdoutCallback = callback;
123
+ }
124
+ setStderrCallback(callback) {
125
+ this.stderrCallback = callback;
126
+ }
127
+ async runFunction(name, args) {
128
+ const response = await this.sendMessage("runFunction", { name, args });
129
+ publish(TOPIC_WORKSPACE_CHANGED, this.workspace);
130
+ return response;
131
+ }
132
+ async setGlobal(key, value) {
133
+ await this.sendMessage("setGlobal", { key, value });
134
+ }
135
+ async mountWorkspace(mountPoint = "/workspace") {
136
+ if (!this.workspace) return;
137
+ const getHandle = this.workspace.getHandle;
138
+ if (typeof getHandle !== "function") return;
139
+ await this.sendMessage("mountWorkspace", {
140
+ handle: getHandle.call(this.workspace),
141
+ mountPoint
142
+ });
143
+ }
144
+ async installDependencies(pyFile) {
145
+ if (!pyFile) return;
146
+ const parent = pyFile.getParent();
147
+ if (!parent) return;
148
+ const reqFile = await parent.getResource("requirements.txt");
149
+ if (!reqFile) return;
150
+ const reqContents = (await reqFile.getContents()).replaceAll("\r", "");
151
+ const { parsePipRequirementsFile } = await getPipRequirementsModule();
152
+ const packages = parsePipRequirementsFile(reqContents).filter((p) => "name" in p).map((p) => p.name);
153
+ await this.loadPackages(packages);
154
+ }
155
+ async loadPackages(packages) {
156
+ if (packages.length > 0) {
157
+ await this.sendMessage("loadPackages", { packages });
158
+ }
159
+ }
160
+ async syncWorkspace() {
161
+ await this.sendMessage("syncWorkspace");
162
+ publish(TOPIC_WORKSPACE_CHANGED, this.workspace);
163
+ }
164
+ async execCode(code) {
165
+ const response = await this.sendMessage("execCode", { code });
166
+ publish(TOPIC_WORKSPACE_CHANGED, this.workspace);
167
+ return response;
168
+ }
169
+ async execScript(path) {
170
+ const pyFile = this.workspace ? await this.workspace.getResource(path) : void 0;
171
+ if (pyFile) {
172
+ await this.installDependencies(pyFile);
173
+ }
174
+ const moduleName = path.split(".")[0];
175
+ const entryName = path.includes(":") ? path.split(":").reverse()[0] : void 0;
176
+ return await this.execModule(moduleName, entryName);
177
+ }
178
+ async execModule(moduleName, entryName) {
179
+ const response = await this.sendMessage("execModule", {
180
+ moduleName,
181
+ entryName,
182
+ vars: this.vars
183
+ });
184
+ publish(TOPIC_WORKSPACE_CHANGED, this.workspace);
185
+ return response;
186
+ }
187
+ async getVersion() {
188
+ return await this.sendMessage("getVersion");
189
+ }
190
+ /**
191
+ * Check if interrupt functionality is available (requires SharedArrayBuffer).
192
+ */
193
+ canInterrupt() {
194
+ return this.interruptBuffer !== void 0;
195
+ }
196
+ /**
197
+ * Interrupts any currently running Python code.
198
+ * This will cause a KeyboardInterrupt to be raised in the Python code.
199
+ * Only works if SharedArrayBuffer is available (check with canInterrupt()).
200
+ */
201
+ interrupt() {
202
+ if (this.interruptBuffer) {
203
+ this.interruptBuffer[0] = 2;
204
+ }
205
+ }
206
+ close() {
207
+ if (this.worker) {
208
+ this.worker.terminate();
209
+ this.worker = void 0;
210
+ }
211
+ this.pendingMessages.clear();
212
+ }
213
+ }
214
+ export {
215
+ PyEnv as P
216
+ };
217
+ //# sourceMappingURL=pyservice-B-tT6VHu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pyservice-B-tT6VHu.js","sources":["../src/pyservice.ts"],"sourcesContent":["import {Directory, File, TOPIC_WORKSPACE_CHANGED, workspaceService} from \"@eclipse-lyra/core\";\ntype PipRequirementsModule = typeof import(\"pip-requirements-js\");\n\nlet pipRequirementsModulePromise: Promise<PipRequirementsModule> | null = null;\n\nasync function getPipRequirementsModule(): Promise<PipRequirementsModule> {\n if (!pipRequirementsModulePromise) {\n pipRequirementsModulePromise = import(\"pip-requirements-js\");\n }\n return pipRequirementsModulePromise;\n}\nimport {publish} from \"@eclipse-lyra/core\";\nimport type {PyWorkerMessage, PyWorkerResponse} from \"./pyworker\";\nimport PyWorker from \"./pyworker?worker&inline\";\n\n// Message counter for tracking requests/responses\nlet messageId = 0;\n\n// Now runs in a Web Worker for better performance and isolation\nexport class PyEnv {\n private worker?: Worker;\n private workspace?: Directory;\n private vars: any;\n private pendingMessages: Map<string, { resolve: (value: any) => void, reject: (error: any) => void }> = new Map();\n private stdoutCallback?: (text: string) => void;\n private stderrCallback?: (text: string) => void;\n private interruptBuffer?: Uint8Array;\n\n public async init(workspace?: Directory, vars?: any) {\n this.workspace = workspace;\n this.vars = vars ?? {};\n\n // Create Web Worker using Vite's ?worker import\n const worker = new PyWorker();\n this.worker = worker;\n\n worker.onmessage = (event: MessageEvent<PyWorkerResponse>) => {\n this.handleWorkerMessage(event.data);\n };\n\n worker.onerror = (error) => {\n console.error('Python Worker error:', error);\n };\n\n // Initialize Pyodide in worker\n await this.sendMessage('init', { vars: this.vars });\n\n if (this.workspace) {\n await this.mountWorkspace();\n }\n }\n\n private handleWorkerMessage(response: PyWorkerResponse) {\n // Handle interrupt buffer initialization\n if (response.id === 'interrupt-buffer') {\n if (response.type === 'success') {\n this.interruptBuffer = new Uint8Array(response.payload);\n } else {\n // SharedArrayBuffer not available - interrupt buffer will be undefined\n this.interruptBuffer = undefined;\n }\n return;\n }\n \n // Handle input requests\n if (response.type === 'inputRequest') {\n const promptText = response.payload.prompt || 'Input:';\n const userInput = window.prompt(promptText);\n \n // Send response back to worker\n this.worker!.postMessage({\n id: response.id,\n type: 'inputResponse',\n payload: {\n value: userInput,\n cancelled: userInput === null\n }\n } as PyWorkerMessage);\n return;\n }\n \n // Handle stdout/stderr streams\n if (response.type === 'stdout') {\n if (this.stdoutCallback) {\n this.stdoutCallback(response.payload);\n } else {\n console.info(response.payload);\n }\n return;\n }\n \n if (response.type === 'stderr') {\n if (this.stderrCallback) {\n this.stderrCallback(response.payload);\n } else {\n console.error(response.payload);\n }\n return;\n }\n \n // Handle console messages from worker\n if (response.type === 'console') {\n const { level, message } = response.payload;\n // Forward to log terminal\n if (typeof window !== 'undefined' && (window as any).logToTerminal) {\n (window as any).logToTerminal('Python Worker', message, level);\n }\n return;\n }\n\n // Handle regular responses\n const pending = this.pendingMessages.get(response.id);\n if (pending) {\n this.pendingMessages.delete(response.id);\n \n if (response.type === 'success') {\n pending.resolve(response.payload);\n } else if (response.type === 'error') {\n pending.reject(new Error(response.payload.message));\n }\n }\n }\n\n private async sendMessage(type: PyWorkerMessage['type'], payload?: any): Promise<any> {\n if (!this.worker) {\n throw new Error('PyEnv not initialized yet: see init()');\n }\n\n const id = `msg-${messageId++}`;\n const message: PyWorkerMessage = { id, type, payload };\n\n return new Promise((resolve, reject) => {\n this.pendingMessages.set(id, { resolve, reject });\n this.worker!.postMessage(message);\n });\n }\n\n public setStdoutCallback(callback: (text: string) => void) {\n this.stdoutCallback = callback;\n }\n\n public setStderrCallback(callback: (text: string) => void) {\n this.stderrCallback = callback;\n }\n\n public async runFunction(name: string, args: any) {\n const response = await this.sendMessage('runFunction', { name, args });\n publish(TOPIC_WORKSPACE_CHANGED, this.workspace);\n // Return the full response object so caller can access both result and console output\n return response;\n }\n\n public async setGlobal(key: string, value: any) {\n await this.sendMessage('setGlobal', { key, value });\n }\n\n public async mountWorkspace(mountPoint: string = \"/workspace\") {\n if (!this.workspace) return;\n // Only browser workspaces backed by File System Access API expose getHandle(); we use a capability check\n // so the extension stays agnostic of core's FileSysDirHandleResource implementation.\n const getHandle = (this.workspace as { getHandle?: () => FileSystemDirectoryHandle }).getHandle;\n if (typeof getHandle !== \"function\") return;\n await this.sendMessage(\"mountWorkspace\", {\n handle: getHandle.call(this.workspace),\n mountPoint,\n });\n }\n\n public async installDependencies(pyFile?: File) {\n if (!pyFile) return;\n const parent = pyFile.getParent();\n if (!parent) return;\n const reqFile = await parent.getResource(\"requirements.txt\") as File | null;\n if (!reqFile) return;\n const reqContents: string = ((await reqFile.getContents()) as string).replaceAll(\"\\r\", \"\");\n const { parsePipRequirementsFile } = await getPipRequirementsModule();\n const packages = parsePipRequirementsFile(reqContents)\n .filter(p => \"name\" in p)\n .map(p => (p as any).name);\n await this.loadPackages(packages);\n }\n\n public async loadPackages(packages: string[]) {\n if (packages.length > 0) {\n await this.sendMessage('loadPackages', { packages });\n }\n }\n\n public async syncWorkspace() {\n await this.sendMessage('syncWorkspace');\n publish(TOPIC_WORKSPACE_CHANGED, this.workspace);\n }\n\n public async execCode(code: string) {\n const response = await this.sendMessage('execCode', { code });\n publish(TOPIC_WORKSPACE_CHANGED, this.workspace);\n // Return the full response object so caller can access both result and console output\n return response;\n }\n\n public async execScript(path: string) {\n const pyFile = this.workspace ? (await this.workspace.getResource(path) as File) : undefined;\n if (pyFile) {\n await this.installDependencies(pyFile);\n }\n const moduleName = path.split(\".\")[0];\n const entryName = path.includes(\":\") ? path.split(\":\").reverse()[0] : undefined;\n return await this.execModule(moduleName, entryName);\n }\n\n public async execModule(moduleName: string, entryName?: string) {\n const response = await this.sendMessage('execModule', {\n moduleName,\n entryName,\n vars: this.vars\n });\n publish(TOPIC_WORKSPACE_CHANGED, this.workspace);\n // Return the full response object so caller can access both result and console output\n return response;\n }\n\n public async getVersion() {\n return await this.sendMessage('getVersion');\n }\n\n /**\n * Check if interrupt functionality is available (requires SharedArrayBuffer).\n */\n public canInterrupt(): boolean {\n return this.interruptBuffer !== undefined;\n }\n\n /**\n * Interrupts any currently running Python code.\n * This will cause a KeyboardInterrupt to be raised in the Python code.\n * Only works if SharedArrayBuffer is available (check with canInterrupt()).\n */\n public interrupt() {\n if (this.interruptBuffer) {\n // Set the interrupt flag (2 = SIGINT)\n this.interruptBuffer[0] = 2;\n }\n }\n\n close() {\n if (this.worker) {\n this.worker.terminate();\n this.worker = undefined;\n }\n this.pendingMessages.clear();\n }\n}\n"],"names":["PyWorker"],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { Directory, File } from '@eclipse-lyra/core';
2
+ export declare class PyEnv {
3
+ private worker?;
4
+ private workspace?;
5
+ private vars;
6
+ private pendingMessages;
7
+ private stdoutCallback?;
8
+ private stderrCallback?;
9
+ private interruptBuffer?;
10
+ init(workspace?: Directory, vars?: any): Promise<void>;
11
+ private handleWorkerMessage;
12
+ private sendMessage;
13
+ setStdoutCallback(callback: (text: string) => void): void;
14
+ setStderrCallback(callback: (text: string) => void): void;
15
+ runFunction(name: string, args: any): Promise<any>;
16
+ setGlobal(key: string, value: any): Promise<void>;
17
+ mountWorkspace(mountPoint?: string): Promise<void>;
18
+ installDependencies(pyFile?: File): Promise<void>;
19
+ loadPackages(packages: string[]): Promise<void>;
20
+ syncWorkspace(): Promise<void>;
21
+ execCode(code: string): Promise<any>;
22
+ execScript(path: string): Promise<any>;
23
+ execModule(moduleName: string, entryName?: string): Promise<any>;
24
+ getVersion(): Promise<any>;
25
+ /**
26
+ * Check if interrupt functionality is available (requires SharedArrayBuffer).
27
+ */
28
+ canInterrupt(): boolean;
29
+ /**
30
+ * Interrupts any currently running Python code.
31
+ * This will cause a KeyboardInterrupt to be raised in the Python code.
32
+ * Only works if SharedArrayBuffer is available (check with canInterrupt()).
33
+ */
34
+ interrupt(): void;
35
+ close(): void;
36
+ }
37
+ //# sourceMappingURL=pyservice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pyservice.d.ts","sourceRoot":"","sources":["../src/pyservice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,IAAI,EAA4C,MAAM,oBAAoB,CAAC;AAmB9F,qBAAa,KAAK;IACd,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,eAAe,CAA2F;IAClH,OAAO,CAAC,cAAc,CAAC,CAAyB;IAChD,OAAO,CAAC,cAAc,CAAC,CAAyB;IAChD,OAAO,CAAC,eAAe,CAAC,CAAa;IAExB,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,GAAG;IAwBnD,OAAO,CAAC,mBAAmB;YAuEb,WAAW;IAclB,iBAAiB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI;IAIlD,iBAAiB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI;IAI5C,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;IAOnC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAIjC,cAAc,CAAC,UAAU,GAAE,MAAqB;IAYhD,mBAAmB,CAAC,MAAM,CAAC,EAAE,IAAI;IAcjC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE;IAM/B,aAAa;IAKb,QAAQ,CAAC,IAAI,EAAE,MAAM;IAOrB,UAAU,CAAC,IAAI,EAAE,MAAM;IAUvB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAWjD,UAAU;IAIvB;;OAEG;IACI,YAAY,IAAI,OAAO;IAI9B;;;;OAIG;IACI,SAAS;IAOhB,KAAK;CAOR"}
@@ -0,0 +1,247 @@
1
+ import { property, state, customElement } from "lit/decorators.js";
2
+ import { LyraPart, workspaceService, toastError } from "@eclipse-lyra/core";
3
+ import { css, html } from "lit";
4
+ import { createRef, ref } from "lit/directives/ref.js";
5
+ import { styleMap } from "lit/directives/style-map.js";
6
+ import { P as PyEnv } from "./pyservice-B-tT6VHu.js";
7
+ import { p as pythonPackageManagerService } from "./package-manager-DTcpwrMr.js";
8
+ import { p as parsePackagesFromContent, c as contentWithPackagesLine } from "./python-runtime-extension-B31nPBS0.js";
9
+ var __defProp = Object.defineProperty;
10
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
11
+ var __decorateClass = (decorators, target, key, kind) => {
12
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
13
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
14
+ if (decorator = decorators[i])
15
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
16
+ if (kind && result) __defProp(target, key, result);
17
+ return result;
18
+ };
19
+ let LyraPythonEditor = class extends LyraPart {
20
+ constructor() {
21
+ super(...arguments);
22
+ this.readOnly = false;
23
+ this.initialContent = void 0;
24
+ this.initialUri = void 0;
25
+ this.pyConnected = false;
26
+ this.pyConnecting = false;
27
+ this.widgetRef = createRef();
28
+ this._onContentChange = () => {
29
+ this.markDirty(true);
30
+ };
31
+ }
32
+ async doInitUI() {
33
+ const file = this.input.data;
34
+ const textContents = await file.getContents();
35
+ this.initialContent = textContents;
36
+ this.initialUri = file.getName();
37
+ this.requestUpdate();
38
+ }
39
+ save() {
40
+ const value = this.widgetRef.value?.getContent() ?? "";
41
+ this.input?.data.saveContents(value);
42
+ this.markDirty(false);
43
+ }
44
+ doClose() {
45
+ this.widgetRef.value?.dispose();
46
+ if (this.pyenv) {
47
+ this.pyenv.close();
48
+ this.pyenv = void 0;
49
+ }
50
+ this.pyConnected = false;
51
+ this.pyVersion = void 0;
52
+ }
53
+ getLanguage() {
54
+ return "python";
55
+ }
56
+ isLanguage(lang) {
57
+ return lang.toLowerCase() === "python";
58
+ }
59
+ getContent() {
60
+ return this.widgetRef.value?.getContent() ?? null;
61
+ }
62
+ getSelection() {
63
+ return this.widgetRef.value?.getSelection() ?? null;
64
+ }
65
+ getSnippet(lines = 5) {
66
+ return this.widgetRef.value?.getSnippet(lines) ?? null;
67
+ }
68
+ getFilePath() {
69
+ return this.input?.data?.getWorkspacePath() ?? null;
70
+ }
71
+ getPyEnv() {
72
+ return this.pyenv;
73
+ }
74
+ async initPyEnv() {
75
+ if (this.pyenv) return;
76
+ const workspace = await workspaceService.getWorkspace();
77
+ if (!workspace) {
78
+ toastError("No workspace selected");
79
+ return;
80
+ }
81
+ this.pyenv = new PyEnv();
82
+ await this.pyenv.init(workspace);
83
+ this.pyConnected = true;
84
+ try {
85
+ const response = await this.pyenv.execCode("import sys; sys.version.split()[0]");
86
+ this.pyVersion = response?.result || "Unknown";
87
+ } catch {
88
+ this.pyVersion = "Unknown";
89
+ }
90
+ }
91
+ async connectPython() {
92
+ if (this.pyConnecting || this.pyConnected) return;
93
+ try {
94
+ this.pyConnecting = true;
95
+ await this.initPyEnv();
96
+ } catch (err) {
97
+ toastError(err instanceof Error ? err.message : String(err));
98
+ } finally {
99
+ this.pyConnecting = false;
100
+ }
101
+ }
102
+ async runScript() {
103
+ if (!this.pyConnected || !this.pyenv) {
104
+ await this.connectPython();
105
+ if (!this.pyenv) return;
106
+ }
107
+ const content = this.getContent()?.trim();
108
+ if (!content) {
109
+ toastError("No content to run");
110
+ return;
111
+ }
112
+ try {
113
+ const packages = parsePackagesFromContent(content);
114
+ if (packages.length > 0) await this.pyenv.loadPackages(packages);
115
+ await this.pyenv.execCode(content);
116
+ } catch (err) {
117
+ toastError(err instanceof Error ? err.message : String(err));
118
+ }
119
+ }
120
+ updateEditorPackagesLine(packages) {
121
+ const content = this.getContent() ?? "";
122
+ const newContent = contentWithPackagesLine(content, packages);
123
+ if (newContent === content) return;
124
+ this.widgetRef.value?.getModel()?.setValue(newContent);
125
+ this.markDirty(true);
126
+ }
127
+ openPackageManager() {
128
+ if (!this.pyConnected || !this.pyenv) return;
129
+ const content = this.getContent() ?? "";
130
+ const packages = parsePackagesFromContent(content);
131
+ pythonPackageManagerService.showPackageManager({
132
+ packages,
133
+ pyenv: this.pyenv,
134
+ onPackageAdded: (name) => {
135
+ const next = [...parsePackagesFromContent(this.getContent() ?? ""), name];
136
+ this.updateEditorPackagesLine(next);
137
+ },
138
+ onPackageRemoved: (name) => {
139
+ const next = parsePackagesFromContent(this.getContent() ?? "").filter((p) => p !== name);
140
+ this.updateEditorPackagesLine(next);
141
+ }
142
+ });
143
+ }
144
+ renderToolbar() {
145
+ const connectionTitle = this.pyConnecting ? "Connecting to Python..." : this.pyConnected ? "Python Connected" : "Python Disconnected - Click to connect";
146
+ const connectionText = this.pyConnecting ? "Connecting..." : this.pyConnected && this.pyVersion ? `Python ${this.pyVersion}` : "Not connected";
147
+ const iconColor = this.pyConnected ? "var(--wa-color-green-40)" : this.pyConnecting ? "var(--wa-color-warning-500)" : "var(--wa-color-red-40)";
148
+ return html`
149
+ <wa-button
150
+ appearance="plain"
151
+ size="small"
152
+ style=${styleMap({ display: "flex", alignItems: "center", gap: "0.5rem" })}
153
+ ?disabled=${this.pyConnecting}
154
+ @click=${() => this.connectPython()}
155
+ title=${connectionTitle}
156
+ >
157
+ <wa-icon name="circle" label="Python status" style=${styleMap({ color: iconColor })}></wa-icon>
158
+ ${connectionText}
159
+ </wa-button>
160
+ <wa-button
161
+ size="small"
162
+ appearance="plain"
163
+ ?disabled=${!this.pyConnected}
164
+ @click=${() => this.runScript()}
165
+ title="Run Python script"
166
+ >
167
+ <wa-icon name="play" label="Run"></wa-icon>
168
+ Run
169
+ </wa-button>
170
+ <wa-button
171
+ size="small"
172
+ appearance="plain"
173
+ ?disabled=${!this.pyConnected}
174
+ @click=${() => this.openPackageManager()}
175
+ title="Manage packages"
176
+ >
177
+ <wa-icon name="box" label="Packages"></wa-icon>
178
+ Packages
179
+ </wa-button>
180
+ `;
181
+ }
182
+ updated(changedProperties) {
183
+ super.updated(changedProperties);
184
+ if (changedProperties.has("pyConnected") || changedProperties.has("pyConnecting") || changedProperties.has("pyVersion")) {
185
+ this.updateToolbar();
186
+ }
187
+ }
188
+ render() {
189
+ if (this.initialContent === void 0) {
190
+ return html`<div class="monaco-editor-placeholder"></div>`;
191
+ }
192
+ return html`
193
+ <lyra-monaco-widget
194
+ .value=${this.initialContent}
195
+ .uri=${this.initialUri}
196
+ .language=${"python"}
197
+ .readOnly=${this.readOnly}
198
+ @content-change=${this._onContentChange}
199
+ ${ref(this.widgetRef)}
200
+ ></lyra-monaco-widget>
201
+ `;
202
+ }
203
+ };
204
+ LyraPythonEditor.styles = css`
205
+ :host {
206
+ display: flex;
207
+ flex-direction: column;
208
+ position: relative;
209
+ width: 100%;
210
+ height: 100%;
211
+ }
212
+ .monaco-editor-placeholder {
213
+ flex: 1;
214
+ min-height: 0;
215
+ }
216
+ `;
217
+ __decorateClass([
218
+ property({ attribute: false })
219
+ ], LyraPythonEditor.prototype, "input", 2);
220
+ __decorateClass([
221
+ property({ type: Boolean })
222
+ ], LyraPythonEditor.prototype, "readOnly", 2);
223
+ __decorateClass([
224
+ state()
225
+ ], LyraPythonEditor.prototype, "initialContent", 2);
226
+ __decorateClass([
227
+ state()
228
+ ], LyraPythonEditor.prototype, "initialUri", 2);
229
+ __decorateClass([
230
+ state()
231
+ ], LyraPythonEditor.prototype, "pyenv", 2);
232
+ __decorateClass([
233
+ state()
234
+ ], LyraPythonEditor.prototype, "pyConnected", 2);
235
+ __decorateClass([
236
+ state()
237
+ ], LyraPythonEditor.prototype, "pyConnecting", 2);
238
+ __decorateClass([
239
+ state()
240
+ ], LyraPythonEditor.prototype, "pyVersion", 2);
241
+ LyraPythonEditor = __decorateClass([
242
+ customElement("lyra-python-editor")
243
+ ], LyraPythonEditor);
244
+ export {
245
+ LyraPythonEditor
246
+ };
247
+ //# sourceMappingURL=python-editor-BZ-OYhJ1.js.map