@galaxyproject/olit 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.
- package/LICENSE +21 -0
- package/README.md +188 -0
- package/package.json +61 -0
- package/static/InterVariable-Italic.woff2 +0 -0
- package/static/InterVariable.woff2 +0 -0
- package/static/JetBrainsMono-Bold.woff2 +0 -0
- package/static/JetBrainsMono-BoldItalic.woff2 +0 -0
- package/static/JetBrainsMono-Italic.woff2 +0 -0
- package/static/JetBrainsMono-Regular.woff2 +0 -0
- package/static/index.css +1 -0
- package/static/index.html +13 -0
- package/static/index.js +4024 -0
- package/static/logo.svg +31 -0
- package/static/olit.xml +98 -0
- package/static/pyodide/README.md +62 -0
- package/static/pyodide/annotated_types-0.7.0-py3-none-any.whl +0 -0
- package/static/pyodide/attrs-25.2.0-py3-none-any.whl +0 -0
- package/static/pyodide/console-v2.html +393 -0
- package/static/pyodide/console.html +305 -0
- package/static/pyodide/ffi.d.ts +1130 -0
- package/static/pyodide/galaxy-charts-e7348f1e5617.js +38078 -0
- package/static/pyodide/galaxy-ops-6b6069501426.js +9476 -0
- package/static/pyodide/jsonschema-4.23.0-py3-none-any.whl +0 -0
- package/static/pyodide/jsonschema_specifications-2024.10.1-py3-none-any.whl +0 -0
- package/static/pyodide/llm-fetch.js +16 -0
- package/static/pyodide/micropip-0.11.1-py3-none-any.whl +0 -0
- package/static/pyodide/numpy-2.2.5-cp313-cp313-pyemscripten_2025_0_wasm32.whl +0 -0
- package/static/pyodide/olit-0.0.0-07b000ed515e9-py3-none-any.whl +0 -0
- package/static/pyodide/package.json +126 -0
- package/static/pyodide/pandas-2.3.3-cp313-cp313-pyemscripten_2025_0_wasm32.whl +0 -0
- package/static/pyodide/pydantic-2.12.5-py3-none-any.whl +0 -0
- package/static/pyodide/pydantic_core-2.41.5-cp313-cp313-pyemscripten_2025_0_wasm32.whl +0 -0
- package/static/pyodide/pyodide-lock.json +1 -0
- package/static/pyodide/pyodide-worker.js +120 -0
- package/static/pyodide/pyodide.asm.js +15 -0
- package/static/pyodide/pyodide.asm.wasm +0 -0
- package/static/pyodide/pyodide.d.ts +1699 -0
- package/static/pyodide/pyodide.js +6 -0
- package/static/pyodide/pyodide.js.map +7 -0
- package/static/pyodide/pyodide.mjs +4 -0
- package/static/pyodide/pyodide.mjs.map +7 -0
- package/static/pyodide/pyrsistent-0.20.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl +0 -0
- package/static/pyodide/python_dateutil-2.9.0.post0-py2.py3-none-any.whl +0 -0
- package/static/pyodide/python_stdlib.zip +0 -0
- package/static/pyodide/pytz-2025.2-py2.py3-none-any.whl +0 -0
- package/static/pyodide/pyyaml-6.0.2-cp313-cp313-pyemscripten_2025_0_wasm32.whl +0 -0
- package/static/pyodide/referencing-0.36.2-py3-none-any.whl +0 -0
- package/static/pyodide/rpds_py-0.30.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl +0 -0
- package/static/pyodide/six-1.17.0-py2.py3-none-any.whl +0 -0
- package/static/pyodide/typing_extensions-4.15.0-py3-none-any.whl +0 -0
- package/static/pyodide/typing_inspection-0.4.2-py3-none-any.whl +0 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { authorizedFetch } from "./llm-fetch.js";
|
|
2
|
+
|
|
3
|
+
let loadPyodide = null;
|
|
4
|
+
let pyodide = null;
|
|
5
|
+
let running = false;
|
|
6
|
+
// Abort authority for the current run; the worker owns it because fetch needs it.
|
|
7
|
+
let abortController = null;
|
|
8
|
+
// Outstanding approvals; the run is parked on these, so abort must drain them.
|
|
9
|
+
const pendingConfirms = new Map();
|
|
10
|
+
let confirmSeq = 0;
|
|
11
|
+
|
|
12
|
+
function settleConfirms(approved) {
|
|
13
|
+
for (const resolve of pendingConfirms.values()) {
|
|
14
|
+
resolve(approved);
|
|
15
|
+
}
|
|
16
|
+
pendingConfirms.clear();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
self.onmessage = async (e) => {
|
|
20
|
+
const { type, payload, id } = e.data;
|
|
21
|
+
// Handled first and without an id: it arrives while a run is in flight.
|
|
22
|
+
if (type === "abort") {
|
|
23
|
+
if (running && abortController) {
|
|
24
|
+
abortController.abort();
|
|
25
|
+
// A turn parked on an approval would otherwise never resume.
|
|
26
|
+
settleConfirms(false);
|
|
27
|
+
}
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (type === "confirmResult") {
|
|
31
|
+
const resolve = pendingConfirms.get(payload.confirmId);
|
|
32
|
+
if (resolve) {
|
|
33
|
+
pendingConfirms.delete(payload.confirmId);
|
|
34
|
+
resolve(payload.approved === true);
|
|
35
|
+
}
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (type === "initialize") {
|
|
39
|
+
try {
|
|
40
|
+
if (!loadPyodide) {
|
|
41
|
+
const mod = await import(`${payload.indexURL}/pyodide.mjs`);
|
|
42
|
+
loadPyodide = mod.loadPyodide;
|
|
43
|
+
}
|
|
44
|
+
pyodide = await loadPyodide({ indexURL: payload.indexURL });
|
|
45
|
+
// The brain fetches through this; the key stays here, out of the interpreter.
|
|
46
|
+
globalThis.olitFetch = authorizedFetch(fetch, payload.llm);
|
|
47
|
+
const pyodidePackages = payload.packages;
|
|
48
|
+
if (pyodidePackages) {
|
|
49
|
+
console.debug("[pyodide-worker] Installing packages:", pyodidePackages);
|
|
50
|
+
await pyodide.loadPackage(pyodidePackages);
|
|
51
|
+
}
|
|
52
|
+
for (const whl of payload.extraPackages || []) {
|
|
53
|
+
console.log(`Loading ${whl}`);
|
|
54
|
+
await pyodide.runPythonAsync(
|
|
55
|
+
`import micropip\nawait micropip.install(${JSON.stringify(whl)})`,
|
|
56
|
+
);
|
|
57
|
+
console.log(`Loaded ${whl}`);
|
|
58
|
+
}
|
|
59
|
+
// Imported rather than bundled: this worker is served as a file, not built by vite.
|
|
60
|
+
for (const module of [payload.opsModule, payload.chartsModule].filter(Boolean)) {
|
|
61
|
+
const peer = await import(`${payload.indexURL}/${module}`);
|
|
62
|
+
peer.install(payload.galaxy || {});
|
|
63
|
+
}
|
|
64
|
+
self.postMessage({ type: "ready" });
|
|
65
|
+
} catch (err) {
|
|
66
|
+
self.postMessage({ type: "error", error: String(err) });
|
|
67
|
+
}
|
|
68
|
+
} else {
|
|
69
|
+
if (pyodide) {
|
|
70
|
+
if (type === "runPythonAsync") {
|
|
71
|
+
running = true;
|
|
72
|
+
abortController = new AbortController();
|
|
73
|
+
globalThis.olitAborted = () => abortController?.signal.aborted === true;
|
|
74
|
+
globalThis.olitAbortSignal = () => abortController?.signal;
|
|
75
|
+
// The events channel in reverse; answered by `confirmResult`.
|
|
76
|
+
globalThis.olitConfirm = (json) =>
|
|
77
|
+
new Promise((resolve) => {
|
|
78
|
+
if (abortController?.signal.aborted) {
|
|
79
|
+
resolve(false);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const confirmId = `${id}:${confirmSeq++}`;
|
|
83
|
+
pendingConfirms.set(confirmId, resolve);
|
|
84
|
+
try {
|
|
85
|
+
self.postMessage({ type: "confirm", id, confirmId, request: JSON.parse(json) });
|
|
86
|
+
} catch (err) {
|
|
87
|
+
pendingConfirms.delete(confirmId);
|
|
88
|
+
resolve(false);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
// Bridge for live progress; only a string crosses the boundary.
|
|
92
|
+
globalThis.olitEmit = (json) => {
|
|
93
|
+
try {
|
|
94
|
+
self.postMessage({ type: "event", id, event: JSON.parse(json) });
|
|
95
|
+
} catch (err) {
|
|
96
|
+
// ignore a malformed event payload
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
try {
|
|
100
|
+
const result = await pyodide.runPythonAsync(payload.code);
|
|
101
|
+
self.postMessage({ id, result });
|
|
102
|
+
} catch (err) {
|
|
103
|
+
self.postMessage({ id, error: String(err) });
|
|
104
|
+
} finally {
|
|
105
|
+
running = false;
|
|
106
|
+
abortController = null;
|
|
107
|
+
settleConfirms(false);
|
|
108
|
+
globalThis.olitEmit = undefined;
|
|
109
|
+
globalThis.olitAborted = undefined;
|
|
110
|
+
globalThis.olitAbortSignal = undefined;
|
|
111
|
+
globalThis.olitConfirm = undefined;
|
|
112
|
+
}
|
|
113
|
+
} else {
|
|
114
|
+
self.postMessage({ id, error: `Unknown message type: ${type}` });
|
|
115
|
+
}
|
|
116
|
+
} else {
|
|
117
|
+
self.postMessage({ id, error: "Pyodide not initialized" });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|