@poe-platform/safe-bash 0.1.683 → 0.1.684

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 (41) hide show
  1. package/README.md +10 -0
  2. package/dist/safe-bash/chunks/chunk-4MPK7VIM.js +519 -0
  3. package/dist/safe-bash/chunks/chunk-4MPK7VIM.js.map +7 -0
  4. package/dist/safe-bash/chunks/{chunk-6R7IR2MV.js → chunk-BONY6MX5.js} +731 -15
  5. package/dist/safe-bash/chunks/chunk-BONY6MX5.js.map +7 -0
  6. package/dist/safe-bash/commands/python/index.browser.js +12 -2
  7. package/dist/safe-bash/commands/python/index.d.ts +5 -0
  8. package/dist/safe-bash/commands/python/index.d.ts.map +1 -1
  9. package/dist/safe-bash/commands/python/index.js +15 -3
  10. package/dist/safe-bash/commands/python/index.js.map +1 -1
  11. package/dist/safe-bash/commands/python/jspi-assets.d.ts +14 -0
  12. package/dist/safe-bash/commands/python/jspi-assets.d.ts.map +1 -0
  13. package/dist/safe-bash/commands/python/jspi-assets.js +51 -0
  14. package/dist/safe-bash/commands/python/jspi-assets.js.map +1 -0
  15. package/dist/safe-bash/commands/python/jspi-scheduler.d.ts +8 -0
  16. package/dist/safe-bash/commands/python/jspi-scheduler.d.ts.map +1 -0
  17. package/dist/safe-bash/commands/python/jspi-scheduler.js +49 -0
  18. package/dist/safe-bash/commands/python/jspi-scheduler.js.map +1 -0
  19. package/dist/safe-bash/commands/python/jspi-trampoline.d.ts +5 -0
  20. package/dist/safe-bash/commands/python/jspi-trampoline.d.ts.map +1 -0
  21. package/dist/safe-bash/commands/python/jspi-trampoline.js +90 -0
  22. package/dist/safe-bash/commands/python/jspi-trampoline.js.map +1 -0
  23. package/dist/safe-bash/commands/python/jspi.d.ts +22 -0
  24. package/dist/safe-bash/commands/python/jspi.d.ts.map +1 -0
  25. package/dist/safe-bash/commands/python/jspi.js +295 -0
  26. package/dist/safe-bash/commands/python/jspi.js.map +1 -0
  27. package/dist/safe-bash/commands/python/runtime-scripts.d.ts +6 -0
  28. package/dist/safe-bash/commands/python/runtime-scripts.d.ts.map +1 -0
  29. package/dist/safe-bash/commands/python/runtime-scripts.js +168 -0
  30. package/dist/safe-bash/commands/python/runtime-scripts.js.map +1 -0
  31. package/dist/safe-bash/commands/python/worker.browser.js +13 -368
  32. package/dist/safe-bash/commands/python/worker.browser.js.map +3 -3
  33. package/dist/safe-bash/commands/python/worker.d.ts.map +1 -1
  34. package/dist/safe-bash/commands/python/worker.js +6 -168
  35. package/dist/safe-bash/commands/python/worker.js.map +1 -1
  36. package/dist/safe-bash/core.browser.js +12 -2
  37. package/dist/safe-bash/core.browser.js.map +1 -1
  38. package/package.json +2 -2
  39. package/dist/safe-bash/chunks/chunk-3G3EZZ63.js +0 -145
  40. package/dist/safe-bash/chunks/chunk-3G3EZZ63.js.map +0 -7
  41. package/dist/safe-bash/chunks/chunk-6R7IR2MV.js.map +0 -7
@@ -1,7 +1,13 @@
1
1
  import {
2
2
  PythonFailure,
3
- parsePythonInvocation
4
- } from "../../chunks/chunk-3G3EZZ63.js";
3
+ parsePythonInvocation,
4
+ pythonDirectoryEntries,
5
+ pythonExecution,
6
+ pythonImportMetadata,
7
+ pythonRuntimeRelocation,
8
+ pythonStatProjection,
9
+ pythonTreeCleanup
10
+ } from "../../chunks/chunk-4MPK7VIM.js";
5
11
  import {
6
12
  init_platform
7
13
  } from "../../chunks/chunk-O4SKIJ5J.js";
@@ -10,204 +16,6 @@ import {
10
16
  init_platform();
11
17
  import { mountPythonFileSystem } from "@poe-platform/safe-fs/core";
12
18
 
13
- // packages/safe-bash/src/commands/python/execution.ts
14
- init_platform();
15
- var pythonExecution = `
16
- import sys, os, json, runpy, traceback, types, warnings, textwrap, io, struct, linecache
17
- _safe_invocation = json.loads(_safe_invocation_json)
18
- os.environ.clear()
19
- os.environ.update(_safe_invocation['env'])
20
- _safe_args = list(_safe_invocation['args'])
21
- sys.orig_argv = [_safe_invocation.get('command', 'python')] + _safe_args
22
- _safe_exit = 0
23
-
24
- class _SafeOptionError(ValueError):
25
- pass
26
-
27
- def _safe_system_exit(_error):
28
- if isinstance(_error.code, int):
29
- _status = int.__index__(_error.code)
30
- _long_bound = 1 << (8 * struct.calcsize('@l') - 1)
31
- status = (_status & 255) if -_long_bound <= _status < _long_bound else 255
32
- else:
33
- status = 0 if _error.code is None else 1
34
- if _error.code is not None and not isinstance(_error.code, int):
35
- print(_error.code, file=sys.stderr)
36
- return status
37
-
38
- def _safe_launch():
39
- args = list(_safe_args)
40
- unbuffered = False
41
- ignore_env = bool(sys.flags.ignore_environment)
42
- safe_path = bool(sys.flags.safe_path)
43
- native_warning_options = list(sys.warnoptions)
44
- # Pyodide adds a bootstrap cwd entry even when CPython safe-path mode is set.
45
- # Each execution mode below supplies its own entry after explicit PYTHONPATH.
46
- sys.path[:] = [entry for entry in sys.path if entry != '']
47
- warning_options = []
48
- version_count = 0
49
- options_terminated = False
50
- while args and args[0].startswith('-') and args[0] != '-':
51
- option = args.pop(0)
52
- if option == '--':
53
- options_terminated = True
54
- break
55
- if option in ('--help', '-h', '-?'):
56
- print('usage: python [-uBEPOsSIbdvqR] [-W filter] [-X option] [-c code | -m module | file | -] [args ...]')
57
- print('Dedicated Pyodide interpreter; stdin is noninteractive.')
58
- print('-u: unbuffered binary output; -B: disable bytecode writes; -E: ignore PYTHON* settings')
59
- print('-P: omit automatic unsafe sys.path entry; -W: Python warning filter')
60
- print('-O/-OO, -S/-s/-I, -b/-bb, -d/-v/-q/-R: CPython startup flags')
61
- print('-X: utf8, dev, warn_default_encoding, int_max_str_digits; interactive flags are unsupported.')
62
- return
63
- if option == '--version':
64
- version_count += 1
65
- continue
66
- if option.startswith('--'):
67
- raise _SafeOptionError('unsupported option ' + option)
68
- index = 1
69
- while index < len(option):
70
- flag = option[index]
71
- if flag in ('h', '?'):
72
- args = ['--help']
73
- break
74
- if flag == 'V':
75
- version_count += 1
76
- index += 1
77
- continue
78
- if flag in ('c', 'm', 'W', 'X'):
79
- operand = option[index + 1:] if index + 1 < len(option) else args.pop(0) if args else None
80
- if operand is None:
81
- raise _SafeOptionError('argument expected for -' + flag)
82
- if flag in ('W', 'X'):
83
- if flag == 'W': warning_options.append(operand)
84
- break
85
- args = ['-' + flag, operand] + args
86
- break
87
- elif flag in ('O', 'S', 's', 'I', 'b', 'd', 'v', 'q', 'R'):
88
- pass # Applied by CPython startup configuration before bootstrap.
89
- elif flag == 'u':
90
- unbuffered = True
91
- elif flag == 'B':
92
- sys.dont_write_bytecode = True
93
- elif flag == 'E':
94
- ignore_env = True
95
- elif flag == 'P':
96
- safe_path = True
97
- else:
98
- raise _SafeOptionError('unsupported option -' + flag)
99
- index += 1
100
- if args and args[0] in ('-c', '-m'):
101
- break
102
- if version_count:
103
- print('Python ' + (sys.version if version_count > 1 else sys.version.split()[0]))
104
- return
105
- if not ignore_env:
106
- unbuffered = unbuffered or bool(os.environ.get('PYTHONUNBUFFERED'))
107
- sys.dont_write_bytecode = sys.dont_write_bytecode or bool(os.environ.get('PYTHONDONTWRITEBYTECODE'))
108
- safe_path = safe_path or bool(os.environ.get('PYTHONSAFEPATH'))
109
- path = os.environ.get('PYTHONPATH')
110
- if path:
111
- sys.path[0:0] = [os.path.abspath(entry) for entry in path.split(os.pathsep)]
112
- if os.environ.get('PYTHONWARNINGS'):
113
- warning_options[0:0] = os.environ['PYTHONWARNINGS'].split(',')
114
- encoding = os.environ.get('PYTHONIOENCODING')
115
- if encoding:
116
- name, separator, errors = encoding.partition(':')
117
- for stream in (sys.stdin, sys.stdout):
118
- stream.reconfigure(encoding=name or None, errors=(errors or 'strict'))
119
- sys.stderr.reconfigure(encoding=name or None, errors='backslashreplace')
120
- # CPython's -b/-bb filter follows environment and command-line -W filters.
121
- byte_warning = ('error' if sys.flags.bytes_warning > 1 else 'default') + '::BytesWarning'
122
- native_before = [value for value in native_warning_options if not (sys.flags.bytes_warning and value == byte_warning)]
123
- warning_options = native_before + warning_options + ([byte_warning] if sys.flags.bytes_warning else [])
124
- warnings._processoptions(warning_options)
125
- sys.warnoptions[:] = warning_options
126
- if unbuffered:
127
- for name in ('stdout', 'stderr'):
128
- stream = getattr(sys, name)
129
- stream.flush()
130
- encoding, errors = stream.encoding, stream.errors
131
- binary = stream.detach()
132
- raw = binary.detach() if hasattr(binary, 'detach') else binary
133
- replacement = io.TextIOWrapper(raw, encoding=encoding, errors=errors, write_through=True)
134
- setattr(sys, name, replacement)
135
- setattr(sys, '__' + name + '__', replacement)
136
- main = types.ModuleType('__main__')
137
- main.__dict__.update(__package__=None, __spec__=None, __loader__=__import__('importlib.machinery', fromlist=['BuiltinImporter']).BuiltinImporter, __builtins__=__builtins__)
138
- sys.modules['__main__'] = main
139
- if not options_terminated and args and args[0] == '-c':
140
- sys.argv = ['-c'] + args[2:]
141
- if not safe_path: sys.path.insert(0, '')
142
- source = textwrap.dedent(args[1])
143
- code = compile(source, '<string>', 'exec')
144
- # CPython 3.14 retains -c source for both top-level and nested tracebacks.
145
- linecache._register_code(code, source, '<string>')
146
- exec(code, main.__dict__)
147
- elif not options_terminated and args and args[0] == '-m':
148
- sys.argv = args[1:]
149
- if not safe_path: sys.path.insert(0, os.getcwd())
150
- runpy._run_module_as_main(args[1], alter_argv=True)
151
- elif not args or args[0] == '-':
152
- sys.argv = (['-'] + args[1:]) if args else ['']
153
- if not safe_path: sys.path.insert(0, '')
154
- main.__file__ = '<stdin>'
155
- exec(compile(sys.stdin.buffer.read(), '<stdin>', 'exec'), main.__dict__)
156
- else:
157
- sys.argv = args
158
- # CPython makes __file__ absolute without collapsing ./ or ../ components.
159
- path = args[0] if os.path.isabs(args[0]) else os.path.join(os.getcwd(), args[0])
160
- importer = __import__('pkgutil').get_importer(path)
161
- if importer is not None:
162
- sys.path.insert(0, path)
163
- runpy._run_module_as_main('__main__', alter_argv=False)
164
- else:
165
- if not safe_path: sys.path.insert(0, os.path.dirname(os.path.realpath(path)))
166
- try:
167
- with open(path, 'rb') as source:
168
- code = source.read()
169
- except OSError as error:
170
- print("python: can't open file " + repr(path) + ': [Errno ' + str(error.errno) + '] ' + error.strerror, file=sys.stderr)
171
- return 2
172
- main.__file__ = path
173
- main.__loader__ = __import__('importlib.machinery', fromlist=['SourceFileLoader']).SourceFileLoader('__main__', path)
174
- exec(compile(code, path, 'exec'), main.__dict__)
175
- return 0
176
-
177
- try:
178
- _safe_exit = _safe_launch() or 0
179
- except SystemExit as _error:
180
- _safe_exit = _safe_system_exit(_error)
181
- except _SafeOptionError as _error:
182
- print('python: ' + str(_error), file=sys.stderr)
183
- _safe_exit = 2
184
- except BaseException as _error:
185
- # Hide bridge frames while preserving actual Python frames and chained errors.
186
- _trace = _error.__traceback__
187
- while _trace is not None and _trace.tb_frame.f_code.co_filename == '<exec>':
188
- _trace = _trace.tb_next
189
- _error.__traceback__ = _trace
190
- sys.last_exc = _error
191
- _safe_exit = 130 if isinstance(_error, KeyboardInterrupt) else 1
192
- try:
193
- sys.excepthook(type(_error), _error, _trace)
194
- except SystemExit as _hook_error:
195
- _safe_exit = _safe_system_exit(_hook_error)
196
- except BaseException as _hook_error:
197
- print('Error in sys.excepthook:', file=sys.stderr)
198
- traceback.print_exception(type(_hook_error), _hook_error, _hook_error.__traceback__.tb_next)
199
- print('\\nOriginal exception was:', file=sys.stderr)
200
- sys.__excepthook__(type(_error), _error, _trace)
201
- finally:
202
- for _stream in (sys.stdout, sys.stderr):
203
- if _stream is not None and not getattr(_stream, 'closed', False):
204
- try:
205
- _stream.flush()
206
- except BaseException:
207
- _safe_exit = 120
208
- _safe_exit
209
- `;
210
-
211
19
  // packages/safe-bash/src/commands/python/provisioning-runtime.ts
212
20
  init_platform();
213
21
  async function installPythonPackages(supplied, start, request, maxTransferBytes) {
@@ -421,41 +229,6 @@ function createPythonWorkerRequest(shared, postMessage, error) {
421
229
  return result;
422
230
  };
423
231
  }
424
- var relocateRuntime = `
425
- import sys, zipimport, importlib.machinery
426
-
427
- def _rebase_runtime_path(value):
428
- return _safe_runtime_mount + value if isinstance(value, str) and (value == '/lib' or value.startswith('/lib/')) else value
429
-
430
- def _rebase_runtime_loader(loader):
431
- if isinstance(loader, zipimport.zipimporter):
432
- archive = _rebase_runtime_path(loader.archive)
433
- if archive != loader.archive:
434
- return zipimport.zipimporter(archive + '/' + loader.prefix)
435
- elif isinstance(loader, (importlib.machinery.SourceFileLoader, importlib.machinery.SourcelessFileLoader, importlib.machinery.ExtensionFileLoader)):
436
- path = _rebase_runtime_path(loader.path)
437
- if path != loader.path:
438
- return type(loader)(loader.name, path)
439
- return loader
440
- sys.path[:] = [_rebase_runtime_path(value) for value in sys.path]
441
- for _module in list(sys.modules.values()):
442
- if _module is None:
443
- continue
444
- for _attribute in ('__file__', '__cached__'):
445
- if hasattr(_module, _attribute):
446
- setattr(_module, _attribute, _rebase_runtime_path(getattr(_module, _attribute)))
447
- if hasattr(_module, '__path__'):
448
- _module.__path__ = [_rebase_runtime_path(value) for value in _module.__path__]
449
- if hasattr(_module, '__loader__'):
450
- _module.__loader__ = _rebase_runtime_loader(_module.__loader__)
451
- _spec = getattr(_module, '__spec__', None)
452
- if _spec is not None:
453
- _spec.origin = _rebase_runtime_path(_spec.origin)
454
- _spec.loader = _rebase_runtime_loader(_spec.loader)
455
- if _spec.submodule_search_locations is not None:
456
- _spec.submodule_search_locations = [_rebase_runtime_path(value) for value in _spec.submodule_search_locations]
457
- sys.path_importer_cache.clear()
458
- `;
459
232
  async function loadPythonRuntime(load) {
460
233
  const wasm = globalThis.WebAssembly;
461
234
  const instantiate = wasm.instantiate;
@@ -600,7 +373,7 @@ async function runPythonWorker(options) {
600
373
  if (name.startsWith("/lib/")) libraries[start.runtimeMount + name] = library;
601
374
  }
602
375
  runtime.globals.set("_safe_runtime_mount", start.runtimeMount);
603
- runtime.runPython(relocateRuntime);
376
+ runtime.runPython(pythonRuntimeRelocation);
604
377
  runtime.globals.set("_safe_import_stat", (path) => {
605
378
  try {
606
379
  const stat = runtime.FS.stat(path);
@@ -609,19 +382,7 @@ async function runPythonWorker(options) {
609
382
  return JSON.stringify({ errno: error.errno ?? errno.EIO });
610
383
  }
611
384
  });
612
- runtime.runPython(`
613
- import importlib._bootstrap_external, types, json
614
- _safe_import_stat_callback = _safe_import_stat
615
- _safe_original_import_stat = importlib._bootstrap_external._path_stat
616
- def _safe_import_path_stat(path):
617
- if path == _safe_runtime_mount or path.startswith(_safe_runtime_mount + '/'):
618
- return _safe_original_import_stat(path)
619
- value = json.loads(_safe_import_stat_callback(path))
620
- if 'errno' in value:
621
- raise OSError(value['errno'], 'filesystem import metadata unavailable', path)
622
- return types.SimpleNamespace(st_mode=value['mode'], st_size=value['size'], st_mtime=value['mtimeMs'] / 1000)
623
- importlib._bootstrap_external._path_stat = _safe_import_path_stat
624
- `);
385
+ runtime.runPython(pythonImportMetadata);
625
386
  runtime.globals.set("_safe_directory_entries", (path) => {
626
387
  try {
627
388
  return JSON.stringify({ entries: runtime.FS.readdir(path).filter((name) => name !== "." && name !== "..") });
@@ -629,21 +390,7 @@ importlib._bootstrap_external._path_stat = _safe_import_path_stat
629
390
  return JSON.stringify({ errno: error.errno ?? errno.EIO });
630
391
  }
631
392
  });
632
- runtime.runPython(`
633
- import os, json, errno
634
- _safe_directory_callback = _safe_directory_entries
635
- def _safe_listdir(path='.'):
636
- if isinstance(path, int):
637
- raise OSError(errno.ENOTSUP, 'retained directory descriptors are unsupported')
638
- original = os.fspath(path) if path is not None else '.'
639
- value = json.loads(_safe_directory_callback(os.fsdecode(original)))
640
- if 'errno' in value:
641
- raise OSError(value['errno'], 'directory enumeration failed', path)
642
- return [os.fsencode(name) for name in value['entries']] if isinstance(original, bytes) else value['entries']
643
- os.listdir = _safe_listdir
644
- # The frozen importer holds the posix module separately from os.
645
- importlib._bootstrap_external._os.listdir = _safe_listdir
646
- `);
393
+ runtime.runPython(pythonDirectoryEntries);
647
394
  runtime.globals.set("_safe_stat_projection", (path, follow) => {
648
395
  try {
649
396
  const value = typeof path === "number" ? runtime.FS.fstat(path) : follow ? runtime.FS.stat(path) : runtime.FS.lstat(path);
@@ -666,96 +413,7 @@ importlib._bootstrap_external._os.listdir = _safe_listdir
666
413
  return JSON.stringify({ errno: error.errno ?? errno.EIO });
667
414
  }
668
415
  });
669
- runtime.runPython(`
670
- import os, json, errno
671
- _safe_stat_callback = _safe_stat_projection
672
- _safe_stat_type = os.stat_result
673
- _safe_fspath = os.fspath
674
- _safe_fsdecode = os.fsdecode
675
-
676
- def _safe_stat(path, *, dir_fd=None, follow_symlinks=True):
677
- if dir_fd is not None:
678
- raise OSError(errno.ENOTSUP, 'dir_fd metadata is unsupported')
679
- if isinstance(path, int):
680
- if not follow_symlinks:
681
- raise ValueError('stat: cannot use fd and follow_symlinks together')
682
- else:
683
- path = _safe_fsdecode(_safe_fspath(path))
684
- value = json.loads(_safe_stat_callback(path, follow_symlinks))
685
- if 'errno' in value:
686
- raise OSError(value['errno'], 'filesystem metadata unavailable', path)
687
- keys = ('mode','ino','dev','nlink','uid','gid','size')
688
- if any(key not in value for key in keys):
689
- raise OSError(errno.EOVERFLOW, 'canonical identity or required stat metadata unavailable', path)
690
- times = [value[key] / 1000 for key in ('atimeMs','mtimeMs','ctimeMs')]
691
- extras = dict(zip(('st_atime','st_mtime','st_ctime'), times))
692
- for name, milliseconds in zip(('atime','mtime','ctime'), (value['atimeMs'],value['mtimeMs'],value['ctimeMs'])):
693
- seconds = int(milliseconds // 1000)
694
- extras['st_' + name + '_ns'] = seconds * 1000000000 + round((milliseconds - seconds * 1000) * 1000000)
695
- for key in ('blocks','blksize','rdev'):
696
- if key in value:
697
- extras['st_' + key] = value[key]
698
- return _safe_stat_type(tuple(value[key] for key in keys) + tuple(int(time // 1) for time in times), extras)
699
-
700
- def _safe_lstat(path, *, dir_fd=None):
701
- return _safe_stat(path, dir_fd=dir_fd, follow_symlinks=False)
702
-
703
- def _safe_fstat(fd):
704
- if not isinstance(fd, int):
705
- raise TypeError('file descriptor must be an integer')
706
- return _safe_stat(fd)
707
- os.stat = _safe_stat
708
- os.lstat = _safe_lstat
709
- os.fstat = _safe_fstat
710
- import stat as _safe_stat_module
711
- class _SafeDirEntry:
712
- def __init__(self, root, name):
713
- self.name = name
714
- self.path = os.path.join(root, name)
715
- self._cache = {}
716
- def __fspath__(self):
717
- return self.path
718
- def stat(self, *, follow_symlinks=True):
719
- if follow_symlinks not in self._cache:
720
- self._cache[follow_symlinks] = os.stat(self.path, follow_symlinks=follow_symlinks)
721
- return self._cache[follow_symlinks]
722
- def inode(self):
723
- return self.stat(follow_symlinks=False).st_ino
724
- def is_dir(self, *, follow_symlinks=True):
725
- try:
726
- return _safe_stat_module.S_ISDIR(self.stat(follow_symlinks=follow_symlinks).st_mode)
727
- except FileNotFoundError:
728
- return False
729
- def is_file(self, *, follow_symlinks=True):
730
- try:
731
- return _safe_stat_module.S_ISREG(self.stat(follow_symlinks=follow_symlinks).st_mode)
732
- except FileNotFoundError:
733
- return False
734
- def is_symlink(self):
735
- try:
736
- return _safe_stat_module.S_ISLNK(self.stat(follow_symlinks=False).st_mode)
737
- except FileNotFoundError:
738
- return False
739
- class _SafeScandir:
740
- def __init__(self, path):
741
- self._entries = iter([_SafeDirEntry(path, name) for name in os.listdir(path)])
742
- def __iter__(self):
743
- return self
744
- def __next__(self):
745
- return next(self._entries)
746
- def close(self):
747
- self._entries = iter(())
748
- def __enter__(self):
749
- return self
750
- def __exit__(self, *args):
751
- self.close()
752
- def _safe_scandir(path='.'):
753
- if isinstance(path, int):
754
- raise OSError(errno.ENOTSUP, 'retained directory descriptors are unsupported')
755
- return _SafeScandir(os.fspath(path) if path is not None else '.')
756
- os.scandir = _safe_scandir
757
-
758
- `);
416
+ runtime.runPython(pythonStatProjection);
759
417
  runtime.globals.set("_safe_tree_cleanup", (path) => {
760
418
  const absolute = path.startsWith("/") ? path : `${runtime.FS.cwd()}/${path}`;
761
419
  if (absolute === start.runtimeMount || absolute.startsWith(start.runtimeMount + "/")) return JSON.stringify({ supported: false });
@@ -767,20 +425,7 @@ os.scandir = _safe_scandir
767
425
  return JSON.stringify({ supported: true, errno: error.errno ?? errno.EIO });
768
426
  }
769
427
  });
770
- runtime.runPython(`
771
- import shutil, os, json
772
- _safe_tree_callback = _safe_tree_cleanup
773
- _safe_original_rmtree_impl = shutil._rmtree_impl
774
- def _safe_rmtree_impl(path, dir_fd, onexc):
775
- if dir_fd is not None:
776
- return _safe_original_rmtree_impl(path, dir_fd, onexc)
777
- value = json.loads(_safe_tree_callback(os.fsdecode(path)))
778
- if not value['supported']:
779
- return _safe_original_rmtree_impl(path, dir_fd, onexc)
780
- if 'errno' in value:
781
- onexc(os.rmdir, path, OSError(value['errno'], 'directory cleanup failed', path))
782
- shutil._rmtree_impl = _safe_rmtree_impl
783
- `);
428
+ runtime.runPython(pythonTreeCleanup);
784
429
  runtime.globals.set("_safe_invocation_json", JSON.stringify(start.invocation));
785
430
  postMessage({ type: "ready" });
786
431
  category = "runtime";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/commands/python/worker.ts", "../../../src/commands/python/execution.ts", "../../../src/commands/python/provisioning-runtime.ts"],
4
- "sourcesContent": ["import { mountPythonFileSystem } from '@poe-code/safe-fs/core';\nimport { pythonExecution } from './execution.js';\nimport { parsePythonInvocation } from './invocation.js';\nimport { installPythonPackages } from './provisioning-runtime.js';\nimport type { PythonPackageStart } from './provisioning.js';\nimport { PythonFailure, type PythonFailureCategory } from './diagnostics.js';\n\nexport interface PythonWorkerStart {\n readonly packages?: PythonPackageStart;\n readonly installOnly?: boolean;\n readonly shared: SharedArrayBuffer;\n readonly invocation: { readonly args: readonly string[]; readonly cwd: string; readonly env: Readonly<Record<string, string>> };\n readonly runtimeMount: string;\n readonly maxTransferBytes: number;\n}\n\n/** Runtime-owned dynamic Emscripten ABI, supplied explicitly by the host. */\nexport interface PythonWorkerRuntime {\n readonly version: string;\n readonly FS: any;\n readonly _module: any;\n readonly globals: { set(name: string, value: unknown): void; delete(name: string): void };\n runPython(source: string): any;\n setStdin(options: {read(buffer: Uint8Array): number}): void;\n setStdout(options: {write(buffer: Uint8Array): number}): void;\n setStderr(options: {write(buffer: Uint8Array): number}): void;\n}\n\nexport function createPythonWorkerRequest(\n shared: SharedArrayBuffer,\n postMessage: (message: unknown) => void,\n error: (code: string) => Error,\n): (operation: string, ...args: any[]) => any {\n let control: Int32Array<SharedArrayBuffer>;\n let payload: Uint8Array<SharedArrayBuffer>;\n try {\n control = new Int32Array(shared, 0, 2);\n payload = new Uint8Array(shared, 8);\n } catch (cause) { throw new PythonFailure('transport-unavailable', { cause }); }\n return (op, ...args) => {\n let length: number;\n let status: number;\n try {\n Atomics.store(control, 0, 0);\n postMessage({op, args});\n while (Atomics.load(control, 0) === 0) Atomics.wait(control, 0, 0);\n length = Atomics.load(control, 1);\n status = Atomics.load(control, 0);\n } catch (cause) { throw cause instanceof PythonFailure ? cause : new PythonFailure('transport-unavailable', { cause }); }\n if (length < 0 || length > payload.length) throw error('EIO');\n // Browser TextDecoder does not accept shared backing stores.\n const result = JSON.parse(new TextDecoder().decode(payload.slice(0, length)));\n if (status !== 1) {\n if (op.startsWith('package-') && typeof result.message === 'string') throw new Error(result.message);\n throw error(result.code ?? 'EIO');\n }\n return result;\n };\n}\n\nconst relocateRuntime = `\nimport sys, zipimport, importlib.machinery\n\ndef _rebase_runtime_path(value):\n return _safe_runtime_mount + value if isinstance(value, str) and (value == '/lib' or value.startswith('/lib/')) else value\n\ndef _rebase_runtime_loader(loader):\n if isinstance(loader, zipimport.zipimporter):\n archive = _rebase_runtime_path(loader.archive)\n if archive != loader.archive:\n return zipimport.zipimporter(archive + '/' + loader.prefix)\n elif isinstance(loader, (importlib.machinery.SourceFileLoader, importlib.machinery.SourcelessFileLoader, importlib.machinery.ExtensionFileLoader)):\n path = _rebase_runtime_path(loader.path)\n if path != loader.path:\n return type(loader)(loader.name, path)\n return loader\nsys.path[:] = [_rebase_runtime_path(value) for value in sys.path]\nfor _module in list(sys.modules.values()):\n if _module is None:\n continue\n for _attribute in ('__file__', '__cached__'):\n if hasattr(_module, _attribute):\n setattr(_module, _attribute, _rebase_runtime_path(getattr(_module, _attribute)))\n if hasattr(_module, '__path__'):\n _module.__path__ = [_rebase_runtime_path(value) for value in _module.__path__]\n if hasattr(_module, '__loader__'):\n _module.__loader__ = _rebase_runtime_loader(_module.__loader__)\n _spec = getattr(_module, '__spec__', None)\n if _spec is not None:\n _spec.origin = _rebase_runtime_path(_spec.origin)\n _spec.loader = _rebase_runtime_loader(_spec.loader)\n if _spec.submodule_search_locations is not None:\n _spec.submodule_search_locations = [_rebase_runtime_path(value) for value in _spec.submodule_search_locations]\nsys.path_importer_cache.clear()\n`;\n\ninterface WasmImports { readonly env?: Record<string, unknown> }\ninterface WasmEngine {\n instantiate(source: unknown, imports?: WasmImports): Promise<unknown>;\n instantiateStreaming?: (source: unknown, imports?: WasmImports) => Promise<unknown>;\n}\n\n/** Intercept the pinned native syscall imports before the interpreter exists.\n * Only call on the dedicated worker's event loop; no host-global mutation is safe here.\n * This blocks ordinary libc routes, not deliberate trusted JavaScript escapes.\n */\nasync function loadPythonRuntime(\n load: () => Promise<PythonWorkerRuntime>,\n): Promise<PythonWorkerRuntime> {\n const wasm = (globalThis as unknown as { WebAssembly: WasmEngine }).WebAssembly;\n const instantiate = wasm.instantiate;\n const instantiateStreaming = wasm.instantiateStreaming;\n let protectedSystem = false;\n let protectedSockets = false;\n const restrict = (imports?: WasmImports): void => {\n const env = imports?.env;\n if (!env) return;\n if (typeof env._emscripten_system === 'function') {\n // Emscripten libc converts the negative errno to system() == -1 / ENOSYS.\n env._emscripten_system = (command: number) => command === 0 ? 0 : -52;\n protectedSystem = true;\n }\n if (typeof env.__syscall_socket === 'function') protectedSockets = true;\n for (const name of ['__syscall_socket', '__syscall_connect', '__syscall_bind', '__syscall_listen', '__syscall_accept4', '__syscall_sendto', '__syscall_sendmsg', '_maybe_connect_async']) {\n if (typeof env[name] === 'function') env[name] = () => -52;\n }\n };\n wasm.instantiate = ((source: unknown, imports?: WasmImports) => {\n restrict(imports);\n return instantiate(source, imports);\n });\n if (instantiateStreaming) wasm.instantiateStreaming = (source, imports) => {\n restrict(imports);\n return instantiateStreaming(source, imports);\n };\n try {\n const runtime = await load();\n if (!protectedSystem || !protectedSockets) throw new PythonFailure('runtime-abi', { cause: new Error('Python native syscall isolation ABI unavailable') });\n // Public convenience APIs otherwise expose direct host FS/socket bindings via pyodide_js.\n const unavailable = () => { throw new Error('Host filesystem and native socket capabilities are unavailable'); };\n const api = runtime as unknown as Record<string, unknown>;\n for (const name of ['mountNodeFS', 'mountNativeFS', 'useNodeSockFS']) {\n if (name in api) api[name] = unavailable;\n }\n if (runtime.FS?.filesystems) delete runtime.FS.filesystems.NODEFS;\n if (runtime._module) {\n delete runtime._module.NODEFS;\n if ('__emscripten_system' in runtime._module) runtime._module.__emscripten_system = (command: number) => command === 0 ? 0 : -52;\n if (runtime._module.SOCKFS) runtime._module.SOCKFS.createSocket = unavailable;\n }\n return runtime;\n } finally {\n wasm.instantiate = instantiate;\n if (instantiateStreaming) wasm.instantiateStreaming = instantiateStreaming;\n }\n}\n\n/** Run inside a dedicated interpreter worker. Backend requests must run elsewhere. */\nexport async function runPythonWorker(options: {\n loadRuntime(configuration: {jsglobals: Record<string, never>; args: string[]; env: Record<string, string>; stdout(message: string): void; stderr(message: string): void}): Promise<PythonWorkerRuntime>;\n start: PythonWorkerStart;\n postMessage(message: unknown): void;\n}): Promise<void> {\n const {start} = options;\n const postMessage = (message: unknown): void => {\n try { options.postMessage(message); }\n catch (cause) { throw new PythonFailure('transport-unavailable', { cause }); }\n };\n let category: PythonFailureCategory = 'startup';\n try {\n const startupRequest = createPythonWorkerRequest(start.shared, postMessage, code => new Error(code));\n const startupWrite = (stream: string, message: string) => {\n const bytes = new TextEncoder().encode(message + '\\n');\n for (let offset = 0; offset < bytes.length; offset += start.maxTransferBytes) {\n startupRequest(stream, Array.from(bytes.subarray(offset, offset + start.maxTransferBytes)));\n }\n };\n let configuration;\n try { configuration = parsePythonInvocation(start.invocation.args, start.invocation.env); }\n catch (error) {\n startupWrite('stderr', 'python: ' + (error instanceof Error ? error.message : String(error)));\n postMessage({type:'exit', exitCode:2});\n return;\n }\n // Removes accidental `import js` access to process/fetch/globalThis. This is\n // defense in depth, not a sandbox: Python JS proxies can recover JS execution.\n category = 'runtime-assets';\n const runtime = await loadPythonRuntime(() => options.loadRuntime({jsglobals: Object.create(null) as Record<string, never>, args:[...configuration.startupArgs], env:{...configuration.env},\n stdout: message => { startupWrite('stdout', message); },\n stderr: message => { startupWrite('stderr', message); },\n }));\n // Namespace relocation is qualified against this ABI only.\n if (runtime.version !== '314.0.6') throw new PythonFailure('runtime-abi', { cause: new Error('Python worker requires Pyodide 314.0.6') });\n if (start.packages) await installPythonPackages(runtime, start.packages, startupRequest, start.maxTransferBytes);\n const unavailablePackage = () => { throw new Error('Python package transport is only available during installation'); };\n const publicRuntime = runtime as unknown as Record<string, any>;\n if ('loadPackage' in publicRuntime) publicRuntime.loadPackage = unavailablePackage;\n if (publicRuntime._api?.packageManager) publicRuntime._api.packageManager.downloadPackage = unavailablePackage;\n if (start.installOnly) {\n startupWrite('stdout', 'Successfully installed requested Python packages');\n postMessage({type:'exit', exitCode:0});\n return;\n }\n category = 'runtime-abi';\n const errno: Record<string, number> = JSON.parse(runtime.runPython(\"__import__('json').dumps({k:v for k,v in vars(__import__('errno')).items() if k.startswith('E') and isinstance(v,int)})\"));\n const request = createPythonWorkerRequest(start.shared, postMessage, code => new runtime.FS.ErrnoError(errno[code] ?? errno.EIO));\n const libraries = runtime._module?.LDSO?.loadedLibsByName;\n if (!libraries) throw new Error('Python runtime native loader ABI unavailable');\n if (typeof runtime._module._Py_FinalizeEx !== 'function') throw new Error('Python runtime finalization ABI unavailable');\n // Preload relocation helpers before application root replaces bootstrap paths.\n runtime.runPython('import sys, zipimport, importlib.machinery, json, os, runpy, traceback');\n runtime.setStdin({read(buffer) {\n const bytes = request('stdin', Math.min(buffer.length, start.maxTransferBytes));\n if (!Array.isArray(bytes) || bytes.length > buffer.length) throw new runtime.FS.ErrnoError(errno.EIO);\n buffer.set(bytes); return bytes.length;\n }});\n for (const [name, configure] of [\n ['stdout', runtime.setStdout.bind(runtime)], ['stderr', runtime.setStderr.bind(runtime)],\n ] as const) {\n configure({write(buffer) {\n let offset = 0;\n while (offset < buffer.length) {\n const chunk = Array.from(Uint8Array.from(buffer.subarray(offset, offset + start.maxTransferBytes)));\n try { request(name, chunk); } catch (error) { if (offset) return offset; throw error; }\n offset += chunk.length;\n }\n return offset;\n }});\n }\n mountPythonFileSystem(runtime.FS, {\n request, cwd: start.invocation.cwd, runtimeMount: start.runtimeMount,\n maxTransferBytes: start.maxTransferBytes, errno, runtimeModule: runtime._module,\n synchronizationFlags: runtime.runPython(\"__import__('os').O_SYNC | __import__('os').O_DSYNC\"),\n });\n for (const [name, library] of Object.entries(libraries)) {\n if (name.startsWith('/lib/')) libraries[start.runtimeMount + name] = library;\n }\n runtime.globals.set('_safe_runtime_mount', start.runtimeMount);\n runtime.runPython(relocateRuntime);\n // Importlib needs only type, modification time and size. Its internal stat\n // consumer must not force fabrication of optional POSIX metadata in os.stat.\n runtime.globals.set('_safe_import_stat', (path: string) => {\n try {\n const stat = runtime.FS.stat(path);\n return JSON.stringify({mode:stat.mode, size:stat.size, mtimeMs:stat.mtimeMs ?? stat.mtime.getTime()});\n } catch (error) {\n return JSON.stringify({errno:(error as {errno?:number}).errno ?? errno.EIO});\n }\n });\n runtime.runPython(`\nimport importlib._bootstrap_external, types, json\n_safe_import_stat_callback = _safe_import_stat\n_safe_original_import_stat = importlib._bootstrap_external._path_stat\ndef _safe_import_path_stat(path):\n if path == _safe_runtime_mount or path.startswith(_safe_runtime_mount + '/'):\n return _safe_original_import_stat(path)\n value = json.loads(_safe_import_stat_callback(path))\n if 'errno' in value:\n raise OSError(value['errno'], 'filesystem import metadata unavailable', path)\n return types.SimpleNamespace(st_mode=value['mode'], st_size=value['size'], st_mtime=value['mtimeMs'] / 1000)\nimportlib._bootstrap_external._path_stat = _safe_import_path_stat\n`);\n runtime.globals.set('_safe_directory_entries', (path: string) => {\n try { return JSON.stringify({entries:runtime.FS.readdir(path).filter((name: string) => name !== '.' && name !== '..')}); }\n catch (error) { return JSON.stringify({errno:(error as {errno?:number}).errno ?? errno.EIO}); }\n });\n runtime.runPython(`\nimport os, json, errno\n_safe_directory_callback = _safe_directory_entries\ndef _safe_listdir(path='.'):\n if isinstance(path, int):\n raise OSError(errno.ENOTSUP, 'retained directory descriptors are unsupported')\n original = os.fspath(path) if path is not None else '.'\n value = json.loads(_safe_directory_callback(os.fsdecode(original)))\n if 'errno' in value:\n raise OSError(value['errno'], 'directory enumeration failed', path)\n return [os.fsencode(name) for name in value['entries']] if isinstance(original, bytes) else value['entries']\nos.listdir = _safe_listdir\n# The frozen importer holds the posix module separately from os.\nimportlib._bootstrap_external._os.listdir = _safe_listdir\n`);\n runtime.globals.set('_safe_stat_projection', (path: string | number, follow: boolean) => {\n try {\n const value = typeof path === 'number' ? runtime.FS.fstat(path) : follow ? runtime.FS.stat(path) : runtime.FS.lstat(path);\n return JSON.stringify({mode:value.mode, ino:value.ino, dev:value.dev, nlink:value.nlink,\n uid:value.uid, gid:value.gid, size:value.size,\n atimeMs:value.atimeMs ?? value.atime.getTime(), mtimeMs:value.mtimeMs ?? value.mtime.getTime(),\n ctimeMs:value.ctimeMs ?? value.ctime.getTime(), blocks:value.blocks, blksize:value.blksize, rdev:value.rdev});\n } catch (error) { return JSON.stringify({errno:(error as {errno?:number}).errno ?? errno.EIO}); }\n });\n runtime.runPython(`\nimport os, json, errno\n_safe_stat_callback = _safe_stat_projection\n_safe_stat_type = os.stat_result\n_safe_fspath = os.fspath\n_safe_fsdecode = os.fsdecode\n\ndef _safe_stat(path, *, dir_fd=None, follow_symlinks=True):\n if dir_fd is not None:\n raise OSError(errno.ENOTSUP, 'dir_fd metadata is unsupported')\n if isinstance(path, int):\n if not follow_symlinks:\n raise ValueError('stat: cannot use fd and follow_symlinks together')\n else:\n path = _safe_fsdecode(_safe_fspath(path))\n value = json.loads(_safe_stat_callback(path, follow_symlinks))\n if 'errno' in value:\n raise OSError(value['errno'], 'filesystem metadata unavailable', path)\n keys = ('mode','ino','dev','nlink','uid','gid','size')\n if any(key not in value for key in keys):\n raise OSError(errno.EOVERFLOW, 'canonical identity or required stat metadata unavailable', path)\n times = [value[key] / 1000 for key in ('atimeMs','mtimeMs','ctimeMs')]\n extras = dict(zip(('st_atime','st_mtime','st_ctime'), times))\n for name, milliseconds in zip(('atime','mtime','ctime'), (value['atimeMs'],value['mtimeMs'],value['ctimeMs'])):\n seconds = int(milliseconds // 1000)\n extras['st_' + name + '_ns'] = seconds * 1000000000 + round((milliseconds - seconds * 1000) * 1000000)\n for key in ('blocks','blksize','rdev'):\n if key in value:\n extras['st_' + key] = value[key]\n return _safe_stat_type(tuple(value[key] for key in keys) + tuple(int(time // 1) for time in times), extras)\n\ndef _safe_lstat(path, *, dir_fd=None):\n return _safe_stat(path, dir_fd=dir_fd, follow_symlinks=False)\n\ndef _safe_fstat(fd):\n if not isinstance(fd, int):\n raise TypeError('file descriptor must be an integer')\n return _safe_stat(fd)\nos.stat = _safe_stat\nos.lstat = _safe_lstat\nos.fstat = _safe_fstat\nimport stat as _safe_stat_module\nclass _SafeDirEntry:\n def __init__(self, root, name):\n self.name = name\n self.path = os.path.join(root, name)\n self._cache = {}\n def __fspath__(self):\n return self.path\n def stat(self, *, follow_symlinks=True):\n if follow_symlinks not in self._cache:\n self._cache[follow_symlinks] = os.stat(self.path, follow_symlinks=follow_symlinks)\n return self._cache[follow_symlinks]\n def inode(self):\n return self.stat(follow_symlinks=False).st_ino\n def is_dir(self, *, follow_symlinks=True):\n try:\n return _safe_stat_module.S_ISDIR(self.stat(follow_symlinks=follow_symlinks).st_mode)\n except FileNotFoundError:\n return False\n def is_file(self, *, follow_symlinks=True):\n try:\n return _safe_stat_module.S_ISREG(self.stat(follow_symlinks=follow_symlinks).st_mode)\n except FileNotFoundError:\n return False\n def is_symlink(self):\n try:\n return _safe_stat_module.S_ISLNK(self.stat(follow_symlinks=False).st_mode)\n except FileNotFoundError:\n return False\nclass _SafeScandir:\n def __init__(self, path):\n self._entries = iter([_SafeDirEntry(path, name) for name in os.listdir(path)])\n def __iter__(self):\n return self\n def __next__(self):\n return next(self._entries)\n def close(self):\n self._entries = iter(())\n def __enter__(self):\n return self\n def __exit__(self, *args):\n self.close()\ndef _safe_scandir(path='.'):\n if isinstance(path, int):\n raise OSError(errno.ENOTSUP, 'retained directory descriptors are unsupported')\n return _SafeScandir(os.fspath(path) if path is not None else '.')\nos.scandir = _safe_scandir\n\n`);\n runtime.globals.set('_safe_tree_cleanup', (path: string) => {\n const absolute = path.startsWith('/') ? path : `${runtime.FS.cwd()}/${path}`;\n if (absolute === start.runtimeMount || absolute.startsWith(start.runtimeMount + '/')) return JSON.stringify({ supported: false });\n try {\n if (!request('rmtreeSupported', absolute)) return JSON.stringify({ supported: false });\n request('rmtree', absolute);\n return JSON.stringify({ supported: true });\n } catch (error) { return JSON.stringify({ supported: true, errno: (error as { errno?: number }).errno ?? errno.EIO }); }\n });\n runtime.runPython(`\nimport shutil, os, json\n_safe_tree_callback = _safe_tree_cleanup\n_safe_original_rmtree_impl = shutil._rmtree_impl\ndef _safe_rmtree_impl(path, dir_fd, onexc):\n if dir_fd is not None:\n return _safe_original_rmtree_impl(path, dir_fd, onexc)\n value = json.loads(_safe_tree_callback(os.fsdecode(path)))\n if not value['supported']:\n return _safe_original_rmtree_impl(path, dir_fd, onexc)\n if 'errno' in value:\n onexc(os.rmdir, path, OSError(value['errno'], 'directory cleanup failed', path))\nshutil._rmtree_impl = _safe_rmtree_impl\n`);\n runtime.globals.set('_safe_invocation_json', JSON.stringify(start.invocation));\n postMessage({type:'ready'});\n category = 'runtime';\n const exitCode = runtime.runPython(pythonExecution);\n // Finalize CPython while canonical storage and stream RPC remain live.\n // This runs atexit and releases buffered files retained by guest modules.\n const finalized = runtime._module._Py_FinalizeEx();\n postMessage({type:'exit', exitCode: finalized < 0 ? 120 : Number(exitCode) & 255});\n } catch (error) {\n postMessage({type:'error', category: error instanceof PythonFailure ? error.category : category,\n message: String(error instanceof PythonFailure && error.cause !== undefined ? error.cause : error)});\n }\n}\n", "/** Executed by CPython after canonical storage and byte streams are installed. */\nexport const pythonExecution = `\nimport sys, os, json, runpy, traceback, types, warnings, textwrap, io, struct, linecache\n_safe_invocation = json.loads(_safe_invocation_json)\nos.environ.clear()\nos.environ.update(_safe_invocation['env'])\n_safe_args = list(_safe_invocation['args'])\nsys.orig_argv = [_safe_invocation.get('command', 'python')] + _safe_args\n_safe_exit = 0\n\nclass _SafeOptionError(ValueError):\n pass\n\ndef _safe_system_exit(_error):\n if isinstance(_error.code, int):\n _status = int.__index__(_error.code)\n _long_bound = 1 << (8 * struct.calcsize('@l') - 1)\n status = (_status & 255) if -_long_bound <= _status < _long_bound else 255\n else:\n status = 0 if _error.code is None else 1\n if _error.code is not None and not isinstance(_error.code, int):\n print(_error.code, file=sys.stderr)\n return status\n\ndef _safe_launch():\n args = list(_safe_args)\n unbuffered = False\n ignore_env = bool(sys.flags.ignore_environment)\n safe_path = bool(sys.flags.safe_path)\n native_warning_options = list(sys.warnoptions)\n # Pyodide adds a bootstrap cwd entry even when CPython safe-path mode is set.\n # Each execution mode below supplies its own entry after explicit PYTHONPATH.\n sys.path[:] = [entry for entry in sys.path if entry != '']\n warning_options = []\n version_count = 0\n options_terminated = False\n while args and args[0].startswith('-') and args[0] != '-':\n option = args.pop(0)\n if option == '--':\n options_terminated = True\n break\n if option in ('--help', '-h', '-?'):\n print('usage: python [-uBEPOsSIbdvqR] [-W filter] [-X option] [-c code | -m module | file | -] [args ...]')\n print('Dedicated Pyodide interpreter; stdin is noninteractive.')\n print('-u: unbuffered binary output; -B: disable bytecode writes; -E: ignore PYTHON* settings')\n print('-P: omit automatic unsafe sys.path entry; -W: Python warning filter')\n print('-O/-OO, -S/-s/-I, -b/-bb, -d/-v/-q/-R: CPython startup flags')\n print('-X: utf8, dev, warn_default_encoding, int_max_str_digits; interactive flags are unsupported.')\n return\n if option == '--version':\n version_count += 1\n continue\n if option.startswith('--'):\n raise _SafeOptionError('unsupported option ' + option)\n index = 1\n while index < len(option):\n flag = option[index]\n if flag in ('h', '?'):\n args = ['--help']\n break\n if flag == 'V':\n version_count += 1\n index += 1\n continue\n if flag in ('c', 'm', 'W', 'X'):\n operand = option[index + 1:] if index + 1 < len(option) else args.pop(0) if args else None\n if operand is None:\n raise _SafeOptionError('argument expected for -' + flag)\n if flag in ('W', 'X'):\n if flag == 'W': warning_options.append(operand)\n break\n args = ['-' + flag, operand] + args\n break\n elif flag in ('O', 'S', 's', 'I', 'b', 'd', 'v', 'q', 'R'):\n pass # Applied by CPython startup configuration before bootstrap.\n elif flag == 'u':\n unbuffered = True\n elif flag == 'B':\n sys.dont_write_bytecode = True\n elif flag == 'E':\n ignore_env = True\n elif flag == 'P':\n safe_path = True\n else:\n raise _SafeOptionError('unsupported option -' + flag)\n index += 1\n if args and args[0] in ('-c', '-m'):\n break\n if version_count:\n print('Python ' + (sys.version if version_count > 1 else sys.version.split()[0]))\n return\n if not ignore_env:\n unbuffered = unbuffered or bool(os.environ.get('PYTHONUNBUFFERED'))\n sys.dont_write_bytecode = sys.dont_write_bytecode or bool(os.environ.get('PYTHONDONTWRITEBYTECODE'))\n safe_path = safe_path or bool(os.environ.get('PYTHONSAFEPATH'))\n path = os.environ.get('PYTHONPATH')\n if path:\n sys.path[0:0] = [os.path.abspath(entry) for entry in path.split(os.pathsep)]\n if os.environ.get('PYTHONWARNINGS'):\n warning_options[0:0] = os.environ['PYTHONWARNINGS'].split(',')\n encoding = os.environ.get('PYTHONIOENCODING')\n if encoding:\n name, separator, errors = encoding.partition(':')\n for stream in (sys.stdin, sys.stdout):\n stream.reconfigure(encoding=name or None, errors=(errors or 'strict'))\n sys.stderr.reconfigure(encoding=name or None, errors='backslashreplace')\n # CPython's -b/-bb filter follows environment and command-line -W filters.\n byte_warning = ('error' if sys.flags.bytes_warning > 1 else 'default') + '::BytesWarning'\n native_before = [value for value in native_warning_options if not (sys.flags.bytes_warning and value == byte_warning)]\n warning_options = native_before + warning_options + ([byte_warning] if sys.flags.bytes_warning else [])\n warnings._processoptions(warning_options)\n sys.warnoptions[:] = warning_options\n if unbuffered:\n for name in ('stdout', 'stderr'):\n stream = getattr(sys, name)\n stream.flush()\n encoding, errors = stream.encoding, stream.errors\n binary = stream.detach()\n raw = binary.detach() if hasattr(binary, 'detach') else binary\n replacement = io.TextIOWrapper(raw, encoding=encoding, errors=errors, write_through=True)\n setattr(sys, name, replacement)\n setattr(sys, '__' + name + '__', replacement)\n main = types.ModuleType('__main__')\n main.__dict__.update(__package__=None, __spec__=None, __loader__=__import__('importlib.machinery', fromlist=['BuiltinImporter']).BuiltinImporter, __builtins__=__builtins__)\n sys.modules['__main__'] = main\n if not options_terminated and args and args[0] == '-c':\n sys.argv = ['-c'] + args[2:]\n if not safe_path: sys.path.insert(0, '')\n source = textwrap.dedent(args[1])\n code = compile(source, '<string>', 'exec')\n # CPython 3.14 retains -c source for both top-level and nested tracebacks.\n linecache._register_code(code, source, '<string>')\n exec(code, main.__dict__)\n elif not options_terminated and args and args[0] == '-m':\n sys.argv = args[1:]\n if not safe_path: sys.path.insert(0, os.getcwd())\n runpy._run_module_as_main(args[1], alter_argv=True)\n elif not args or args[0] == '-':\n sys.argv = (['-'] + args[1:]) if args else ['']\n if not safe_path: sys.path.insert(0, '')\n main.__file__ = '<stdin>'\n exec(compile(sys.stdin.buffer.read(), '<stdin>', 'exec'), main.__dict__)\n else:\n sys.argv = args\n # CPython makes __file__ absolute without collapsing ./ or ../ components.\n path = args[0] if os.path.isabs(args[0]) else os.path.join(os.getcwd(), args[0])\n importer = __import__('pkgutil').get_importer(path)\n if importer is not None:\n sys.path.insert(0, path)\n runpy._run_module_as_main('__main__', alter_argv=False)\n else:\n if not safe_path: sys.path.insert(0, os.path.dirname(os.path.realpath(path)))\n try:\n with open(path, 'rb') as source:\n code = source.read()\n except OSError as error:\n print(\"python: can't open file \" + repr(path) + ': [Errno ' + str(error.errno) + '] ' + error.strerror, file=sys.stderr)\n return 2\n main.__file__ = path\n main.__loader__ = __import__('importlib.machinery', fromlist=['SourceFileLoader']).SourceFileLoader('__main__', path)\n exec(compile(code, path, 'exec'), main.__dict__)\n return 0\n\ntry:\n _safe_exit = _safe_launch() or 0\nexcept SystemExit as _error:\n _safe_exit = _safe_system_exit(_error)\nexcept _SafeOptionError as _error:\n print('python: ' + str(_error), file=sys.stderr)\n _safe_exit = 2\nexcept BaseException as _error:\n # Hide bridge frames while preserving actual Python frames and chained errors.\n _trace = _error.__traceback__\n while _trace is not None and _trace.tb_frame.f_code.co_filename == '<exec>':\n _trace = _trace.tb_next\n _error.__traceback__ = _trace\n sys.last_exc = _error\n _safe_exit = 130 if isinstance(_error, KeyboardInterrupt) else 1\n try:\n sys.excepthook(type(_error), _error, _trace)\n except SystemExit as _hook_error:\n _safe_exit = _safe_system_exit(_hook_error)\n except BaseException as _hook_error:\n print('Error in sys.excepthook:', file=sys.stderr)\n traceback.print_exception(type(_hook_error), _hook_error, _hook_error.__traceback__.tb_next)\n print('\\\\nOriginal exception was:', file=sys.stderr)\n sys.__excepthook__(type(_error), _error, _trace)\nfinally:\n for _stream in (sys.stdout, sys.stderr):\n if _stream is not None and not getattr(_stream, 'closed', False):\n try:\n _stream.flush()\n except BaseException:\n _safe_exit = 120\n_safe_exit\n`;\n", "import type { PythonWorkerRuntime } from './worker.js';\nimport type { PythonPackageStart } from './provisioning.js';\n\ninterface InstallerRuntime extends PythonWorkerRuntime {\n readonly _api: {\n readonly lockfile_packages: Record<string,{file_name:string;sha256:string}>;\n readonly packageManager: {\n readonly defaultChannel:string;\n downloadPackage(metadata:{normalizedName:string;channel:string}):Promise<Uint8Array>;\n };\n };\n loadPackage(names:string[], options:{messageCallback:(message:string)=>void;errorCallback:(message:string)=>void}):Promise<unknown>;\n runPythonAsync(source:string):Promise<unknown>;\n}\n\n/** Pinned installer ABI; all package transport is serviced by the host, before user execution. */\nexport async function installPythonPackages(\n supplied: PythonWorkerRuntime,\n start: PythonPackageStart,\n request:(operation:string,...args:any[])=>any,\n maxTransferBytes:number,\n):Promise<void> {\n if(start.requirements.length===0)return;\n const runtime=supplied as InstallerRuntime;\n if(runtime.version!=='314.0.6'||!runtime._api?.packageManager||!runtime._api.lockfile_packages||typeof runtime.loadPackage!=='function'||typeof runtime.runPythonAsync!=='function')throw new Error('Python package installer ABI requires Pyodide 314.0.6');\n let transportFailure:{error:unknown}|undefined;\n const fetch=(url:string,expected?:string):{bytes:Uint8Array;headers:readonly(readonly[string,string])[]}=>{\n try {\n const opened=request('package-open',start.session,url,expected) as {key:string;size:number;headers:readonly(readonly[string,string])[]};\n try {\n const bytes=new Uint8Array(opened.size);\n for(let offset=0;offset<bytes.length;){\n const chunk=request('package-read',start.session,opened.key,offset,Math.min(maxTransferBytes,65536,bytes.length-offset)) as number[];\n if(!Array.isArray(chunk)||chunk.length===0||offset+chunk.length>bytes.length)throw new Error('Invalid Python package chunk');\n bytes.set(chunk,offset);offset+=chunk.length;\n }\n return {bytes,headers:opened.headers};\n } finally {request('package-close',start.session,opened.key);}\n } catch(error) {\n // Micropip may replace callback errors with a generic package-index failure.\n transportFailure??={error};\n throw error;\n }\n };\n // The pinned loader still owns dependency ordering, wheel extraction and dynamic linking.\n // Replacing only its download operation prevents implicit Node/CDN network fallbacks.\n runtime._api.packageManager.downloadPackage=async metadata=>{\n if(metadata.channel===runtime._api.packageManager.defaultChannel){\n const pkg=runtime._api.lockfile_packages[metadata.normalizedName];\n if(!pkg)throw new Error(`Missing matching Pyodide package: ${metadata.normalizedName}`);\n return fetch(new URL(pkg.file_name,'https://cdn.jsdelivr.net/pyodide/v314.0.6/full/').href,pkg.sha256).bytes;\n }\n return fetch(metadata.channel).bytes;\n };\n const loadPackages=async(names:string[])=>{\n const errors:string[]=[];\n await runtime.loadPackage(names,{messageCallback(){},errorCallback(message){errors.push(message);}});\n if(errors.length)throw new Error(errors.join('\\n'));\n };\n const installedGlobals:string[]=[];\n try {\n await loadPackages(['micropip']);\n runtime.globals.set('_safe_package_native',loadPackages);\n installedGlobals.push('_safe_package_native');\n runtime.globals.set('_safe_package_bytes',(url:string,hash?:string)=>fetch(url,hash).bytes);\n installedGlobals.push('_safe_package_bytes');\n runtime.globals.set('_safe_package_metadata',(url:string)=>{\n const result=fetch(url);return JSON.stringify({text:new TextDecoder().decode(result.bytes),headers:Object.fromEntries(result.headers.map(([name,value])=>[name.toLowerCase(),value]))});\n });\n installedGlobals.push('_safe_package_metadata');\n runtime.globals.set('_safe_package_requirements_json',JSON.stringify(start.requirements));\n installedGlobals.push('_safe_package_requirements_json');\n await runtime.runPythonAsync(`\nimport json as _safe_json\nimport micropip as _safe_micropip\nfrom micropip._compat import compatibility_layer as _safe_compat\nfrom micropip.package_manager import PackageManager as _SafePackageManager\nfrom micropip.wheelinfo import WheelInfo as _SafeWheelInfo\nfrom micropip._utils import check_compatible as _safe_check_compatible\nfrom micropip._vendored.packaging.src.packaging.requirements import Requirement as _SafeRequirement, InvalidRequirement as _SafeInvalidRequirement\nfrom micropip._vendored.packaging.src.packaging.utils import canonicalize_name as _safe_name\n\nclass _SafePackageCompatibility(_safe_compat):\n @staticmethod\n async def loadPackage(names):\n return await _safe_package_native(names)\n @staticmethod\n async def fetch_bytes(url, kwargs):\n return _safe_package_bytes(url).to_bytes()\n @staticmethod\n async def fetch_string_and_headers(url, kwargs):\n value = _safe_json.loads(_safe_package_metadata(url))\n return value['text'], value['headers']\n\n# Require index/URL digests before publishing wheel bytes to the host cache.\n# Local wheels are host-trusted inputs and receive a content digest on first read.\nasync def _safe_wheel_fetch(self, url, kwargs, compat):\n expected = self.sha256 if url == self.url else None\n if url == self.metadata_url and isinstance(self.core_metadata, dict):\n expected = self.core_metadata.get('sha256')\n return _safe_package_bytes(url, expected).to_bytes()\n_SafeWheelInfo._fetch_bytes = _safe_wheel_fetch\n_safe_manager = _SafePackageManager(_SafePackageCompatibility)\n_safe_requirements = _safe_json.loads(_safe_package_requirements_json)\n# A persisted base wheel may be visited before a newly requested extra. Micropip\n# skips already locked names, so every occurrence must carry the requested extras.\n_safe_roots = []\n_safe_extras = {}\nfor _safe_source in _safe_requirements:\n try:\n _safe_root = _SafeRequirement(_safe_source)\n if _safe_root.name.endswith('.whl'):\n raise _SafeInvalidRequirement(_safe_source)\n except _SafeInvalidRequirement:\n _safe_wheel = _SafeWheelInfo.from_url(_safe_source)\n _safe_root = _SafeRequirement(_safe_wheel.name + ' @ ' + _safe_source)\n _safe_roots.append(_safe_root)\n if not _safe_root.marker or _safe_root.marker.evaluate({'extra': ''}):\n # Named requirements may be skipped when already locked. Validate direct\n # wheels even then, rather than letting an incompatible URL report success.\n if _safe_root.url:\n _safe_direct_wheel = _SafeWheelInfo.from_url(_safe_root.url)\n _safe_check_compatible(_safe_direct_wheel.filename)\n # Validate the actual archive and host-checked digest even if micropip's\n # satisfied-name fast path will skip installing this explicit operand.\n await _safe_direct_wheel.download({}, _SafePackageCompatibility)\n _safe_extras.setdefault(_safe_name(_safe_root.name), set()).update(_safe_root.extras)\nfor _safe_root in _safe_roots:\n _safe_root.extras.update(_safe_extras.get(_safe_name(_safe_root.name), set()))\nawait _safe_manager.install([str(root) for root in _safe_roots], deps=True)\n# Resolve selected extras from distribution metadata, including extras added to\n# an already satisfied transitive dependency. Micropip skips those names early.\n# Keep its installer and conflict policy; do not infer dependencies from imports.\nimport importlib.metadata as _safe_metadata\n_safe_previous_pending = None\nwhile True:\n _safe_distributions = [d for d in _safe_metadata.distributions() if d.metadata['Name']]\n _safe_versions = {_safe_name(d.metadata['Name']): d.version for d in _safe_distributions}\n while True:\n _safe_changed = False\n _safe_dependencies = []\n for _safe_dist in _safe_distributions:\n _safe_contexts = {''} | _safe_extras.get(_safe_name(_safe_dist.metadata['Name']), set())\n for _safe_dep in _safe_dist.requires or []:\n _safe_requirement = _SafeRequirement(_safe_dep)\n if _safe_requirement.marker and not any(_safe_requirement.marker.evaluate({'extra': extra}) for extra in _safe_contexts):\n continue\n # The marker belongs to the requesting distribution's extra context, already\n # evaluated above; a separate installer transaction must not reinterpret it.\n _safe_requirement.marker = None\n _safe_dependencies.append(_safe_requirement)\n _safe_selected = _safe_extras.setdefault(_safe_name(_safe_requirement.name), set())\n if not _safe_requirement.extras.issubset(_safe_selected):\n _safe_selected.update(_safe_requirement.extras)\n _safe_changed = True\n if not _safe_changed:\n break\n _safe_pending = set()\n for _safe_requirement in _safe_dependencies:\n _safe_version = _safe_versions.get(_safe_name(_safe_requirement.name))\n if _safe_version is None:\n _safe_pending.add(str(_safe_requirement))\n elif not _safe_requirement.specifier.contains(_safe_version, prereleases=True):\n raise ValueError('Python package dependency conflict: ' + str(_safe_requirement))\n if not _safe_pending:\n break\n if _safe_pending == _safe_previous_pending:\n raise ValueError('Python package dependencies remain missing: ' + ', '.join(sorted(_safe_pending)))\n _safe_previous_pending = _safe_pending\n await _safe_manager.install(sorted(_safe_pending), deps=True)\n# Explicit roots also constrain the result: direct URLs can bypass micropip's\n# already-installed version check, including when another root pins that name.\nfor _safe_root in _safe_roots:\n if _safe_root.marker and not _safe_root.marker.evaluate({'extra': ''}):\n continue\n _safe_version = _safe_versions.get(_safe_name(_safe_root.name))\n if _safe_version is None or not _safe_root.specifier.contains(_safe_version, prereleases=True):\n raise ValueError('Python package version conflict: ' + str(_safe_root))\n if _safe_root.url:\n _safe_wheel = _SafeWheelInfo.from_url(_safe_root.url)\n _safe_wheel_pin = _SafeRequirement(_safe_wheel.name + '==' + str(_safe_wheel.version))\n if _safe_name(_safe_wheel.name) != _safe_name(_safe_root.name) or not _safe_wheel_pin.specifier.contains(_safe_version, prereleases=True):\n raise ValueError('Python package wheel version conflict: ' + str(_safe_root))\n_safe_installed_json = _safe_json.dumps([name + '==' + version for name, version in sorted(_safe_versions.items())])\n`);\n const pinned=JSON.parse(runtime.runPython('_safe_installed_json')) as string[];\n request('package-commit',start.session,pinned);\n }catch(error){\n throw transportFailure ? transportFailure.error : error;\n }finally{\n runtime._api.packageManager.downloadPackage=async()=>{throw new Error('Python package transport is only available during installation');};\n // These bridge callbacks are not an application Python networking capability.\n for(const name of installedGlobals)runtime.globals.delete(name);\n }\n}\n"],
5
- "mappings": "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",
3
+ "sources": ["../../../src/commands/python/worker.ts", "../../../src/commands/python/provisioning-runtime.ts"],
4
+ "sourcesContent": ["import { mountPythonFileSystem } from '@poe-code/safe-fs/core';\nimport { pythonExecution } from './execution.js';\nimport { pythonRuntimeRelocation, pythonImportMetadata, pythonDirectoryEntries, pythonStatProjection, pythonTreeCleanup } from './runtime-scripts.js';\nimport { parsePythonInvocation } from './invocation.js';\nimport { installPythonPackages } from './provisioning-runtime.js';\nimport type { PythonPackageStart } from './provisioning.js';\nimport { PythonFailure, type PythonFailureCategory } from './diagnostics.js';\n\nexport interface PythonWorkerStart {\n readonly packages?: PythonPackageStart;\n readonly installOnly?: boolean;\n readonly shared: SharedArrayBuffer;\n readonly invocation: { readonly args: readonly string[]; readonly cwd: string; readonly env: Readonly<Record<string, string>> };\n readonly runtimeMount: string;\n readonly maxTransferBytes: number;\n}\n\n/** Runtime-owned dynamic Emscripten ABI, supplied explicitly by the host. */\nexport interface PythonWorkerRuntime {\n readonly version: string;\n readonly FS: any;\n readonly _module: any;\n readonly globals: { set(name: string, value: unknown): void; delete(name: string): void };\n runPython(source: string): any;\n setStdin(options: {read(buffer: Uint8Array): number}): void;\n setStdout(options: {write(buffer: Uint8Array): number}): void;\n setStderr(options: {write(buffer: Uint8Array): number}): void;\n}\n\nexport function createPythonWorkerRequest(\n shared: SharedArrayBuffer,\n postMessage: (message: unknown) => void,\n error: (code: string) => Error,\n): (operation: string, ...args: any[]) => any {\n let control: Int32Array<SharedArrayBuffer>;\n let payload: Uint8Array<SharedArrayBuffer>;\n try {\n control = new Int32Array(shared, 0, 2);\n payload = new Uint8Array(shared, 8);\n } catch (cause) { throw new PythonFailure('transport-unavailable', { cause }); }\n return (op, ...args) => {\n let length: number;\n let status: number;\n try {\n Atomics.store(control, 0, 0);\n postMessage({op, args});\n while (Atomics.load(control, 0) === 0) Atomics.wait(control, 0, 0);\n length = Atomics.load(control, 1);\n status = Atomics.load(control, 0);\n } catch (cause) { throw cause instanceof PythonFailure ? cause : new PythonFailure('transport-unavailable', { cause }); }\n if (length < 0 || length > payload.length) throw error('EIO');\n // Browser TextDecoder does not accept shared backing stores.\n const result = JSON.parse(new TextDecoder().decode(payload.slice(0, length)));\n if (status !== 1) {\n if (op.startsWith('package-') && typeof result.message === 'string') throw new Error(result.message);\n throw error(result.code ?? 'EIO');\n }\n return result;\n };\n}\n\n\ninterface WasmImports { readonly env?: Record<string, unknown> }\ninterface WasmEngine {\n instantiate(source: unknown, imports?: WasmImports): Promise<unknown>;\n instantiateStreaming?: (source: unknown, imports?: WasmImports) => Promise<unknown>;\n}\n\n/** Intercept the pinned native syscall imports before the interpreter exists.\n * Only call on the dedicated worker's event loop; no host-global mutation is safe here.\n * This blocks ordinary libc routes, not deliberate trusted JavaScript escapes.\n */\nasync function loadPythonRuntime(\n load: () => Promise<PythonWorkerRuntime>,\n): Promise<PythonWorkerRuntime> {\n const wasm = (globalThis as unknown as { WebAssembly: WasmEngine }).WebAssembly;\n const instantiate = wasm.instantiate;\n const instantiateStreaming = wasm.instantiateStreaming;\n let protectedSystem = false;\n let protectedSockets = false;\n const restrict = (imports?: WasmImports): void => {\n const env = imports?.env;\n if (!env) return;\n if (typeof env._emscripten_system === 'function') {\n // Emscripten libc converts the negative errno to system() == -1 / ENOSYS.\n env._emscripten_system = (command: number) => command === 0 ? 0 : -52;\n protectedSystem = true;\n }\n if (typeof env.__syscall_socket === 'function') protectedSockets = true;\n for (const name of ['__syscall_socket', '__syscall_connect', '__syscall_bind', '__syscall_listen', '__syscall_accept4', '__syscall_sendto', '__syscall_sendmsg', '_maybe_connect_async']) {\n if (typeof env[name] === 'function') env[name] = () => -52;\n }\n };\n wasm.instantiate = ((source: unknown, imports?: WasmImports) => {\n restrict(imports);\n return instantiate(source, imports);\n });\n if (instantiateStreaming) wasm.instantiateStreaming = (source, imports) => {\n restrict(imports);\n return instantiateStreaming(source, imports);\n };\n try {\n const runtime = await load();\n if (!protectedSystem || !protectedSockets) throw new PythonFailure('runtime-abi', { cause: new Error('Python native syscall isolation ABI unavailable') });\n // Public convenience APIs otherwise expose direct host FS/socket bindings via pyodide_js.\n const unavailable = () => { throw new Error('Host filesystem and native socket capabilities are unavailable'); };\n const api = runtime as unknown as Record<string, unknown>;\n for (const name of ['mountNodeFS', 'mountNativeFS', 'useNodeSockFS']) {\n if (name in api) api[name] = unavailable;\n }\n if (runtime.FS?.filesystems) delete runtime.FS.filesystems.NODEFS;\n if (runtime._module) {\n delete runtime._module.NODEFS;\n if ('__emscripten_system' in runtime._module) runtime._module.__emscripten_system = (command: number) => command === 0 ? 0 : -52;\n if (runtime._module.SOCKFS) runtime._module.SOCKFS.createSocket = unavailable;\n }\n return runtime;\n } finally {\n wasm.instantiate = instantiate;\n if (instantiateStreaming) wasm.instantiateStreaming = instantiateStreaming;\n }\n}\n\n/** Run inside a dedicated interpreter worker. Backend requests must run elsewhere. */\nexport async function runPythonWorker(options: {\n loadRuntime(configuration: {jsglobals: Record<string, never>; args: string[]; env: Record<string, string>; stdout(message: string): void; stderr(message: string): void}): Promise<PythonWorkerRuntime>;\n start: PythonWorkerStart;\n postMessage(message: unknown): void;\n}): Promise<void> {\n const {start} = options;\n const postMessage = (message: unknown): void => {\n try { options.postMessage(message); }\n catch (cause) { throw new PythonFailure('transport-unavailable', { cause }); }\n };\n let category: PythonFailureCategory = 'startup';\n try {\n const startupRequest = createPythonWorkerRequest(start.shared, postMessage, code => new Error(code));\n const startupWrite = (stream: string, message: string) => {\n const bytes = new TextEncoder().encode(message + '\\n');\n for (let offset = 0; offset < bytes.length; offset += start.maxTransferBytes) {\n startupRequest(stream, Array.from(bytes.subarray(offset, offset + start.maxTransferBytes)));\n }\n };\n let configuration;\n try { configuration = parsePythonInvocation(start.invocation.args, start.invocation.env); }\n catch (error) {\n startupWrite('stderr', 'python: ' + (error instanceof Error ? error.message : String(error)));\n postMessage({type:'exit', exitCode:2});\n return;\n }\n // Removes accidental `import js` access to process/fetch/globalThis. This is\n // defense in depth, not a sandbox: Python JS proxies can recover JS execution.\n category = 'runtime-assets';\n const runtime = await loadPythonRuntime(() => options.loadRuntime({jsglobals: Object.create(null) as Record<string, never>, args:[...configuration.startupArgs], env:{...configuration.env},\n stdout: message => { startupWrite('stdout', message); },\n stderr: message => { startupWrite('stderr', message); },\n }));\n // Namespace relocation is qualified against this ABI only.\n if (runtime.version !== '314.0.6') throw new PythonFailure('runtime-abi', { cause: new Error('Python worker requires Pyodide 314.0.6') });\n if (start.packages) await installPythonPackages(runtime, start.packages, startupRequest, start.maxTransferBytes);\n const unavailablePackage = () => { throw new Error('Python package transport is only available during installation'); };\n const publicRuntime = runtime as unknown as Record<string, any>;\n if ('loadPackage' in publicRuntime) publicRuntime.loadPackage = unavailablePackage;\n if (publicRuntime._api?.packageManager) publicRuntime._api.packageManager.downloadPackage = unavailablePackage;\n if (start.installOnly) {\n startupWrite('stdout', 'Successfully installed requested Python packages');\n postMessage({type:'exit', exitCode:0});\n return;\n }\n category = 'runtime-abi';\n const errno: Record<string, number> = JSON.parse(runtime.runPython(\"__import__('json').dumps({k:v for k,v in vars(__import__('errno')).items() if k.startswith('E') and isinstance(v,int)})\"));\n const request = createPythonWorkerRequest(start.shared, postMessage, code => new runtime.FS.ErrnoError(errno[code] ?? errno.EIO));\n const libraries = runtime._module?.LDSO?.loadedLibsByName;\n if (!libraries) throw new Error('Python runtime native loader ABI unavailable');\n if (typeof runtime._module._Py_FinalizeEx !== 'function') throw new Error('Python runtime finalization ABI unavailable');\n // Preload relocation helpers before application root replaces bootstrap paths.\n runtime.runPython('import sys, zipimport, importlib.machinery, json, os, runpy, traceback');\n runtime.setStdin({read(buffer) {\n const bytes = request('stdin', Math.min(buffer.length, start.maxTransferBytes));\n if (!Array.isArray(bytes) || bytes.length > buffer.length) throw new runtime.FS.ErrnoError(errno.EIO);\n buffer.set(bytes); return bytes.length;\n }});\n for (const [name, configure] of [\n ['stdout', runtime.setStdout.bind(runtime)], ['stderr', runtime.setStderr.bind(runtime)],\n ] as const) {\n configure({write(buffer) {\n let offset = 0;\n while (offset < buffer.length) {\n const chunk = Array.from(Uint8Array.from(buffer.subarray(offset, offset + start.maxTransferBytes)));\n try { request(name, chunk); } catch (error) { if (offset) return offset; throw error; }\n offset += chunk.length;\n }\n return offset;\n }});\n }\n mountPythonFileSystem(runtime.FS, {\n request, cwd: start.invocation.cwd, runtimeMount: start.runtimeMount,\n maxTransferBytes: start.maxTransferBytes, errno, runtimeModule: runtime._module,\n synchronizationFlags: runtime.runPython(\"__import__('os').O_SYNC | __import__('os').O_DSYNC\"),\n });\n for (const [name, library] of Object.entries(libraries)) {\n if (name.startsWith('/lib/')) libraries[start.runtimeMount + name] = library;\n }\n runtime.globals.set('_safe_runtime_mount', start.runtimeMount);\n runtime.runPython(pythonRuntimeRelocation);\n // Importlib needs only type, modification time and size. Its internal stat\n // consumer must not force fabrication of optional POSIX metadata in os.stat.\n runtime.globals.set('_safe_import_stat', (path: string) => {\n try {\n const stat = runtime.FS.stat(path);\n return JSON.stringify({mode:stat.mode, size:stat.size, mtimeMs:stat.mtimeMs ?? stat.mtime.getTime()});\n } catch (error) {\n return JSON.stringify({errno:(error as {errno?:number}).errno ?? errno.EIO});\n }\n });\n runtime.runPython(pythonImportMetadata);\n runtime.globals.set('_safe_directory_entries', (path: string) => {\n try { return JSON.stringify({entries:runtime.FS.readdir(path).filter((name: string) => name !== '.' && name !== '..')}); }\n catch (error) { return JSON.stringify({errno:(error as {errno?:number}).errno ?? errno.EIO}); }\n });\n runtime.runPython(pythonDirectoryEntries);\n runtime.globals.set('_safe_stat_projection', (path: string | number, follow: boolean) => {\n try {\n const value = typeof path === 'number' ? runtime.FS.fstat(path) : follow ? runtime.FS.stat(path) : runtime.FS.lstat(path);\n return JSON.stringify({mode:value.mode, ino:value.ino, dev:value.dev, nlink:value.nlink,\n uid:value.uid, gid:value.gid, size:value.size,\n atimeMs:value.atimeMs ?? value.atime.getTime(), mtimeMs:value.mtimeMs ?? value.mtime.getTime(),\n ctimeMs:value.ctimeMs ?? value.ctime.getTime(), blocks:value.blocks, blksize:value.blksize, rdev:value.rdev});\n } catch (error) { return JSON.stringify({errno:(error as {errno?:number}).errno ?? errno.EIO}); }\n });\n runtime.runPython(pythonStatProjection);\n runtime.globals.set('_safe_tree_cleanup', (path: string) => {\n const absolute = path.startsWith('/') ? path : `${runtime.FS.cwd()}/${path}`;\n if (absolute === start.runtimeMount || absolute.startsWith(start.runtimeMount + '/')) return JSON.stringify({ supported: false });\n try {\n if (!request('rmtreeSupported', absolute)) return JSON.stringify({ supported: false });\n request('rmtree', absolute);\n return JSON.stringify({ supported: true });\n } catch (error) { return JSON.stringify({ supported: true, errno: (error as { errno?: number }).errno ?? errno.EIO }); }\n });\n runtime.runPython(pythonTreeCleanup);\n runtime.globals.set('_safe_invocation_json', JSON.stringify(start.invocation));\n postMessage({type:'ready'});\n category = 'runtime';\n const exitCode = runtime.runPython(pythonExecution);\n // Finalize CPython while canonical storage and stream RPC remain live.\n // This runs atexit and releases buffered files retained by guest modules.\n const finalized = runtime._module._Py_FinalizeEx();\n postMessage({type:'exit', exitCode: finalized < 0 ? 120 : Number(exitCode) & 255});\n } catch (error) {\n postMessage({type:'error', category: error instanceof PythonFailure ? error.category : category,\n message: String(error instanceof PythonFailure && error.cause !== undefined ? error.cause : error)});\n }\n}\n", "import type { PythonWorkerRuntime } from './worker.js';\nimport type { PythonPackageStart } from './provisioning.js';\n\ninterface InstallerRuntime extends PythonWorkerRuntime {\n readonly _api: {\n readonly lockfile_packages: Record<string,{file_name:string;sha256:string}>;\n readonly packageManager: {\n readonly defaultChannel:string;\n downloadPackage(metadata:{normalizedName:string;channel:string}):Promise<Uint8Array>;\n };\n };\n loadPackage(names:string[], options:{messageCallback:(message:string)=>void;errorCallback:(message:string)=>void}):Promise<unknown>;\n runPythonAsync(source:string):Promise<unknown>;\n}\n\n/** Pinned installer ABI; all package transport is serviced by the host, before user execution. */\nexport async function installPythonPackages(\n supplied: PythonWorkerRuntime,\n start: PythonPackageStart,\n request:(operation:string,...args:any[])=>any,\n maxTransferBytes:number,\n):Promise<void> {\n if(start.requirements.length===0)return;\n const runtime=supplied as InstallerRuntime;\n if(runtime.version!=='314.0.6'||!runtime._api?.packageManager||!runtime._api.lockfile_packages||typeof runtime.loadPackage!=='function'||typeof runtime.runPythonAsync!=='function')throw new Error('Python package installer ABI requires Pyodide 314.0.6');\n let transportFailure:{error:unknown}|undefined;\n const fetch=(url:string,expected?:string):{bytes:Uint8Array;headers:readonly(readonly[string,string])[]}=>{\n try {\n const opened=request('package-open',start.session,url,expected) as {key:string;size:number;headers:readonly(readonly[string,string])[]};\n try {\n const bytes=new Uint8Array(opened.size);\n for(let offset=0;offset<bytes.length;){\n const chunk=request('package-read',start.session,opened.key,offset,Math.min(maxTransferBytes,65536,bytes.length-offset)) as number[];\n if(!Array.isArray(chunk)||chunk.length===0||offset+chunk.length>bytes.length)throw new Error('Invalid Python package chunk');\n bytes.set(chunk,offset);offset+=chunk.length;\n }\n return {bytes,headers:opened.headers};\n } finally {request('package-close',start.session,opened.key);}\n } catch(error) {\n // Micropip may replace callback errors with a generic package-index failure.\n transportFailure??={error};\n throw error;\n }\n };\n // The pinned loader still owns dependency ordering, wheel extraction and dynamic linking.\n // Replacing only its download operation prevents implicit Node/CDN network fallbacks.\n runtime._api.packageManager.downloadPackage=async metadata=>{\n if(metadata.channel===runtime._api.packageManager.defaultChannel){\n const pkg=runtime._api.lockfile_packages[metadata.normalizedName];\n if(!pkg)throw new Error(`Missing matching Pyodide package: ${metadata.normalizedName}`);\n return fetch(new URL(pkg.file_name,'https://cdn.jsdelivr.net/pyodide/v314.0.6/full/').href,pkg.sha256).bytes;\n }\n return fetch(metadata.channel).bytes;\n };\n const loadPackages=async(names:string[])=>{\n const errors:string[]=[];\n await runtime.loadPackage(names,{messageCallback(){},errorCallback(message){errors.push(message);}});\n if(errors.length)throw new Error(errors.join('\\n'));\n };\n const installedGlobals:string[]=[];\n try {\n await loadPackages(['micropip']);\n runtime.globals.set('_safe_package_native',loadPackages);\n installedGlobals.push('_safe_package_native');\n runtime.globals.set('_safe_package_bytes',(url:string,hash?:string)=>fetch(url,hash).bytes);\n installedGlobals.push('_safe_package_bytes');\n runtime.globals.set('_safe_package_metadata',(url:string)=>{\n const result=fetch(url);return JSON.stringify({text:new TextDecoder().decode(result.bytes),headers:Object.fromEntries(result.headers.map(([name,value])=>[name.toLowerCase(),value]))});\n });\n installedGlobals.push('_safe_package_metadata');\n runtime.globals.set('_safe_package_requirements_json',JSON.stringify(start.requirements));\n installedGlobals.push('_safe_package_requirements_json');\n await runtime.runPythonAsync(`\nimport json as _safe_json\nimport micropip as _safe_micropip\nfrom micropip._compat import compatibility_layer as _safe_compat\nfrom micropip.package_manager import PackageManager as _SafePackageManager\nfrom micropip.wheelinfo import WheelInfo as _SafeWheelInfo\nfrom micropip._utils import check_compatible as _safe_check_compatible\nfrom micropip._vendored.packaging.src.packaging.requirements import Requirement as _SafeRequirement, InvalidRequirement as _SafeInvalidRequirement\nfrom micropip._vendored.packaging.src.packaging.utils import canonicalize_name as _safe_name\n\nclass _SafePackageCompatibility(_safe_compat):\n @staticmethod\n async def loadPackage(names):\n return await _safe_package_native(names)\n @staticmethod\n async def fetch_bytes(url, kwargs):\n return _safe_package_bytes(url).to_bytes()\n @staticmethod\n async def fetch_string_and_headers(url, kwargs):\n value = _safe_json.loads(_safe_package_metadata(url))\n return value['text'], value['headers']\n\n# Require index/URL digests before publishing wheel bytes to the host cache.\n# Local wheels are host-trusted inputs and receive a content digest on first read.\nasync def _safe_wheel_fetch(self, url, kwargs, compat):\n expected = self.sha256 if url == self.url else None\n if url == self.metadata_url and isinstance(self.core_metadata, dict):\n expected = self.core_metadata.get('sha256')\n return _safe_package_bytes(url, expected).to_bytes()\n_SafeWheelInfo._fetch_bytes = _safe_wheel_fetch\n_safe_manager = _SafePackageManager(_SafePackageCompatibility)\n_safe_requirements = _safe_json.loads(_safe_package_requirements_json)\n# A persisted base wheel may be visited before a newly requested extra. Micropip\n# skips already locked names, so every occurrence must carry the requested extras.\n_safe_roots = []\n_safe_extras = {}\nfor _safe_source in _safe_requirements:\n try:\n _safe_root = _SafeRequirement(_safe_source)\n if _safe_root.name.endswith('.whl'):\n raise _SafeInvalidRequirement(_safe_source)\n except _SafeInvalidRequirement:\n _safe_wheel = _SafeWheelInfo.from_url(_safe_source)\n _safe_root = _SafeRequirement(_safe_wheel.name + ' @ ' + _safe_source)\n _safe_roots.append(_safe_root)\n if not _safe_root.marker or _safe_root.marker.evaluate({'extra': ''}):\n # Named requirements may be skipped when already locked. Validate direct\n # wheels even then, rather than letting an incompatible URL report success.\n if _safe_root.url:\n _safe_direct_wheel = _SafeWheelInfo.from_url(_safe_root.url)\n _safe_check_compatible(_safe_direct_wheel.filename)\n # Validate the actual archive and host-checked digest even if micropip's\n # satisfied-name fast path will skip installing this explicit operand.\n await _safe_direct_wheel.download({}, _SafePackageCompatibility)\n _safe_extras.setdefault(_safe_name(_safe_root.name), set()).update(_safe_root.extras)\nfor _safe_root in _safe_roots:\n _safe_root.extras.update(_safe_extras.get(_safe_name(_safe_root.name), set()))\nawait _safe_manager.install([str(root) for root in _safe_roots], deps=True)\n# Resolve selected extras from distribution metadata, including extras added to\n# an already satisfied transitive dependency. Micropip skips those names early.\n# Keep its installer and conflict policy; do not infer dependencies from imports.\nimport importlib.metadata as _safe_metadata\n_safe_previous_pending = None\nwhile True:\n _safe_distributions = [d for d in _safe_metadata.distributions() if d.metadata['Name']]\n _safe_versions = {_safe_name(d.metadata['Name']): d.version for d in _safe_distributions}\n while True:\n _safe_changed = False\n _safe_dependencies = []\n for _safe_dist in _safe_distributions:\n _safe_contexts = {''} | _safe_extras.get(_safe_name(_safe_dist.metadata['Name']), set())\n for _safe_dep in _safe_dist.requires or []:\n _safe_requirement = _SafeRequirement(_safe_dep)\n if _safe_requirement.marker and not any(_safe_requirement.marker.evaluate({'extra': extra}) for extra in _safe_contexts):\n continue\n # The marker belongs to the requesting distribution's extra context, already\n # evaluated above; a separate installer transaction must not reinterpret it.\n _safe_requirement.marker = None\n _safe_dependencies.append(_safe_requirement)\n _safe_selected = _safe_extras.setdefault(_safe_name(_safe_requirement.name), set())\n if not _safe_requirement.extras.issubset(_safe_selected):\n _safe_selected.update(_safe_requirement.extras)\n _safe_changed = True\n if not _safe_changed:\n break\n _safe_pending = set()\n for _safe_requirement in _safe_dependencies:\n _safe_version = _safe_versions.get(_safe_name(_safe_requirement.name))\n if _safe_version is None:\n _safe_pending.add(str(_safe_requirement))\n elif not _safe_requirement.specifier.contains(_safe_version, prereleases=True):\n raise ValueError('Python package dependency conflict: ' + str(_safe_requirement))\n if not _safe_pending:\n break\n if _safe_pending == _safe_previous_pending:\n raise ValueError('Python package dependencies remain missing: ' + ', '.join(sorted(_safe_pending)))\n _safe_previous_pending = _safe_pending\n await _safe_manager.install(sorted(_safe_pending), deps=True)\n# Explicit roots also constrain the result: direct URLs can bypass micropip's\n# already-installed version check, including when another root pins that name.\nfor _safe_root in _safe_roots:\n if _safe_root.marker and not _safe_root.marker.evaluate({'extra': ''}):\n continue\n _safe_version = _safe_versions.get(_safe_name(_safe_root.name))\n if _safe_version is None or not _safe_root.specifier.contains(_safe_version, prereleases=True):\n raise ValueError('Python package version conflict: ' + str(_safe_root))\n if _safe_root.url:\n _safe_wheel = _SafeWheelInfo.from_url(_safe_root.url)\n _safe_wheel_pin = _SafeRequirement(_safe_wheel.name + '==' + str(_safe_wheel.version))\n if _safe_name(_safe_wheel.name) != _safe_name(_safe_root.name) or not _safe_wheel_pin.specifier.contains(_safe_version, prereleases=True):\n raise ValueError('Python package wheel version conflict: ' + str(_safe_root))\n_safe_installed_json = _safe_json.dumps([name + '==' + version for name, version in sorted(_safe_versions.items())])\n`);\n const pinned=JSON.parse(runtime.runPython('_safe_installed_json')) as string[];\n request('package-commit',start.session,pinned);\n }catch(error){\n throw transportFailure ? transportFailure.error : error;\n }finally{\n runtime._api.packageManager.downloadPackage=async()=>{throw new Error('Python package transport is only available during installation');};\n // These bridge callbacks are not an application Python networking capability.\n for(const name of installedGlobals)runtime.globals.delete(name);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }