@ai-ecoverse/slicc-kernel 1.129.0 → 1.130.1

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.
@@ -103,6 +103,28 @@ var init_lockdown = __esm({
103
103
  }
104
104
  });
105
105
 
106
+ // src/kernel/protocol.ts
107
+ var WASM_PROCESS_INIT, WASM_PROCESS_EXIT, WASM_PROCESS_ERROR, WASM_PROCESS_READY, WASM_THREAD_SPAWN, WASM_THREAD_INIT, WASM_THREAD_EXIT, WASM_MAX_THREADS, WASM_DEFAULT_THREADS, JS_THREAD_SPAWN, JS_THREAD_INIT, JS_THREAD_EXIT, JS_THREAD_NO_MEMORY, JS_THREAD_CRASHED;
108
+ var init_protocol = __esm({
109
+ "src/kernel/protocol.ts"() {
110
+ "use strict";
111
+ WASM_PROCESS_INIT = "wasm-process-init";
112
+ WASM_PROCESS_EXIT = "wasm-process-exit";
113
+ WASM_PROCESS_ERROR = "wasm-process-error";
114
+ WASM_PROCESS_READY = "wasm-process-ready";
115
+ WASM_THREAD_SPAWN = "wasm-thread-spawn";
116
+ WASM_THREAD_INIT = "wasm-thread-init";
117
+ WASM_THREAD_EXIT = "wasm-thread-exit";
118
+ WASM_MAX_THREADS = 256;
119
+ WASM_DEFAULT_THREADS = 64;
120
+ JS_THREAD_SPAWN = "js-thread-spawn";
121
+ JS_THREAD_INIT = "js-thread-init";
122
+ JS_THREAD_EXIT = "js-thread-exit";
123
+ JS_THREAD_NO_MEMORY = 256;
124
+ JS_THREAD_CRASHED = 257;
125
+ }
126
+ });
127
+
106
128
  // src/process/wasi/wasi-abi.ts
107
129
  function wasiErrnoOf(code2) {
108
130
  if (!code2) return E.IO;
@@ -766,35 +788,64 @@ function copying(bridge, mutating, entry) {
766
788
  copy: (from, to, mode, exclusive) => mutating(() => copy2.call(bridge, from, to, mode, exclusive), ...entry(to))
767
789
  };
768
790
  }
791
+ function listed({ cache, seen, filled }, p, list, gen, asked) {
792
+ const base = p === "/" ? "" : p;
793
+ for (const [name2, st] of list) {
794
+ if (!st) continue;
795
+ filled.set(st, asked);
796
+ const at = `${base}/${name2}`;
797
+ cache.put(cache.lstats, at, st);
798
+ if (gen !== void 0) seen.saw(cache.lstats, at, gen);
799
+ if (st.isSymbolicLink) continue;
800
+ cache.put(cache.stats, at, st);
801
+ if (gen !== void 0) seen.saw(cache.stats, at, gen);
802
+ }
803
+ }
804
+ function fetched({
805
+ view,
806
+ now,
807
+ seen,
808
+ filled,
809
+ cache
810
+ }, map, path, get) {
811
+ const gen = view?.now();
812
+ const asked = now();
813
+ let hit;
814
+ try {
815
+ hit = get();
816
+ if (gen !== void 0) seen.saw(map, path, gen);
817
+ } catch (e) {
818
+ hit = { error: e, until: asked + MISS_TTL_MS, ...gen !== void 0 ? { gen } : {} };
819
+ }
820
+ filled.set(hit, asked);
821
+ cache.put(map, path, hit);
822
+ return hit;
823
+ }
769
824
  function cachingBridge(bridge, now = () => performance.now(), shared) {
770
825
  const blind = shared !== void 0 && shared.length * 4 < SHARED_IDS_BYTES;
771
826
  const cache = new StatCache(blind ? void 0 : shared);
772
827
  const { stats, lstats } = cache;
773
828
  const view = bridge.changes;
774
- const live = (miss, path) => miss.until > now() && (view === void 0 || miss.gen === void 0 || !view.changedSince(miss.gen, path).changed);
829
+ const filled = new Fills(view, now);
830
+ const young = (entry2) => filled.young(entry2);
831
+ const live = (miss, path) => miss.until > now() && young(miss) && (view === void 0 || miss.gen === void 0 || !view.changedSince(miss.gen, path).changed);
775
832
  const seen = new SeenAt(view, lstats);
776
- const kept = remember(cache, seen, blind);
833
+ const kept = remember(cache, seen, blind, (entry2) => filled.set(entry2));
777
834
  const gone = (path) => goneAbove([lstats, stats], live, path);
835
+ const usable = (map, path) => {
836
+ const hit = map.get(path);
837
+ if (hit === void 0) return void 0;
838
+ if ("until" in hit) return live(hit, path) ? hit : void 0;
839
+ return young(hit) && !seen.changed(map, path) ? hit : void 0;
840
+ };
778
841
  const cached = (map, path, get) => {
779
- if (blind || view?.foreign()) return get();
842
+ if (blind) return get();
780
843
  cache.fresh();
781
- let hit = map.get(path);
782
- if (hit !== void 0 && !("until" in hit) && seen.changed(map, path)) hit = void 0;
783
- if (hit === void 0 || "until" in hit && !live(hit, path)) {
844
+ let hit = usable(map, path);
845
+ if (hit === void 0) {
784
846
  const missing2 = gone(path);
785
847
  if (missing2) throw missing2.error;
786
- const gen = view?.now();
787
- try {
788
- hit = get();
789
- if (gen !== void 0) seen.saw(map, path, gen);
790
- } catch (e) {
791
- hit = {
792
- error: e,
793
- until: now() + MISS_TTL_MS,
794
- ...gen !== void 0 ? { gen } : {}
795
- };
796
- }
797
- cache.put(map, path, hit);
848
+ hit = fetched({ view, now, seen, filled, cache }, map, path, get);
798
849
  }
799
850
  if ("until" in hit) throw hit.error;
800
851
  return hit;
@@ -851,24 +902,16 @@ function cachingBridge(bridge, now = () => performance.now(), shared) {
851
902
  readdir: (p) => bridge.readdir(p),
852
903
  readdirStat: (p) => {
853
904
  const gen = view?.now();
905
+ const asked = now();
854
906
  const list = bridge.readdirStat(p);
855
- const base = p === "/" ? "" : p;
856
- for (const [name2, st] of list) {
857
- if (!st || blind) continue;
858
- const at = `${base}/${name2}`;
859
- cache.put(lstats, at, st);
860
- if (gen !== void 0) seen.saw(lstats, at, gen);
861
- if (st.isSymbolicLink) continue;
862
- cache.put(stats, at, st);
863
- if (gen !== void 0) seen.saw(stats, at, gen);
864
- }
907
+ if (!blind) listed({ cache, seen, filled }, p, list, gen, asked);
865
908
  return list;
866
909
  },
867
910
  readlink: (p) => {
868
911
  const known = blind ? void 0 : (cache.fresh(), lstats.get(p));
869
912
  const gen = seen.lstat(p);
870
913
  const current = view !== void 0 && gen !== void 0 && !view.changedSince(gen, p).changed;
871
- if (known && current && !("until" in known) && !known.isSymbolicLink) {
914
+ if (known && current && !("until" in known) && young(known) && !known.isSymbolicLink) {
872
915
  throw syncError("EINVAL", `'${p}' is not a symbolic link`);
873
916
  }
874
917
  return bridge.readlink(p);
@@ -941,7 +984,7 @@ function pinnedIo(bridge, handle, rewriting) {
941
984
  } : {}
942
985
  };
943
986
  }
944
- var WasiError, FileBuffer, LocalFile, MAX_LINKS, MISS_TTL_MS, CACHE_CAP, FS_GEN, CRED_GEN, UMASK, RING, RING_SIZE, SLOT, FD_RING, FD_RING_SIZE, SHARED_IDS_BYTES, StatCache, SEEN_CAP, SeenAt, remember;
987
+ var WasiError, FileBuffer, LocalFile, MAX_LINKS, MISS_TTL_MS, SHARED_TTL_MS, CACHE_CAP, FS_GEN, CRED_GEN, UMASK, RING, RING_SIZE, SLOT, FD_RING, FD_RING_SIZE, SHARED_IDS_BYTES, StatCache, SEEN_CAP, SeenAt, remember, Fills;
945
988
  var init_wasi_files = __esm({
946
989
  "src/process/wasi/wasi-files.ts"() {
947
990
  "use strict";
@@ -1168,6 +1211,7 @@ var init_wasi_files = __esm({
1168
1211
  };
1169
1212
  MAX_LINKS = 40;
1170
1213
  MISS_TTL_MS = 20;
1214
+ SHARED_TTL_MS = 100;
1171
1215
  CACHE_CAP = 8192;
1172
1216
  FS_GEN = 4;
1173
1217
  CRED_GEN = 5;
@@ -1332,30 +1376,30 @@ var init_wasi_files = __esm({
1332
1376
  return since.changed;
1333
1377
  }
1334
1378
  };
1335
- remember = (cache, seen, blind) => (path, made) => {
1379
+ remember = (cache, seen, blind, fill) => (path, made) => {
1336
1380
  if (!made || blind) return made;
1337
1381
  const { seen: at, ...st } = made;
1382
+ fill(st);
1338
1383
  cache.put(cache.stats, path, st);
1339
1384
  if (at !== void 0) seen.saw(cache.stats, path, at);
1340
1385
  return made;
1341
1386
  };
1342
- }
1343
- });
1344
-
1345
- // src/kernel/protocol.ts
1346
- var WASM_PROCESS_INIT, WASM_PROCESS_EXIT, WASM_PROCESS_ERROR, WASM_PROCESS_READY, WASM_THREAD_SPAWN, WASM_THREAD_INIT, WASM_THREAD_EXIT, WASM_MAX_THREADS, WASM_DEFAULT_THREADS;
1347
- var init_protocol = __esm({
1348
- "src/kernel/protocol.ts"() {
1349
- "use strict";
1350
- WASM_PROCESS_INIT = "wasm-process-init";
1351
- WASM_PROCESS_EXIT = "wasm-process-exit";
1352
- WASM_PROCESS_ERROR = "wasm-process-error";
1353
- WASM_PROCESS_READY = "wasm-process-ready";
1354
- WASM_THREAD_SPAWN = "wasm-thread-spawn";
1355
- WASM_THREAD_INIT = "wasm-thread-init";
1356
- WASM_THREAD_EXIT = "wasm-thread-exit";
1357
- WASM_MAX_THREADS = 256;
1358
- WASM_DEFAULT_THREADS = 64;
1387
+ Fills = class {
1388
+ at = /* @__PURE__ */ new WeakMap();
1389
+ view;
1390
+ now;
1391
+ constructor(view, now) {
1392
+ this.view = view;
1393
+ this.now = now;
1394
+ }
1395
+ set(entry, at = this.now()) {
1396
+ this.at.set(entry, at);
1397
+ }
1398
+ young(entry) {
1399
+ if (!this.view?.foreign()) return true;
1400
+ return this.now() - (this.at.get(entry) ?? Number.NEGATIVE_INFINITY) < SHARED_TTL_MS;
1401
+ }
1402
+ };
1359
1403
  }
1360
1404
  });
1361
1405
 
@@ -5920,8 +5964,8 @@ var init_wasi_host = __esm({
5920
5964
  }
5921
5965
  list(path) {
5922
5966
  const { fs } = this.o;
5923
- const listed = fs.readdirStat(path);
5924
- return { names: [".", "..", ...listed.map(([name2]) => name2)], stats: new Map(listed) };
5967
+ const listed2 = fs.readdirStat(path);
5968
+ return { names: [".", "..", ...listed2.map(([name2]) => name2)], stats: new Map(listed2) };
5925
5969
  }
5926
5970
  lstatOrNull(path) {
5927
5971
  try {
@@ -6435,7 +6479,7 @@ var KERNEL_VERSION, OS_RELEASE;
6435
6479
  var init_version = __esm({
6436
6480
  "src/version.ts"() {
6437
6481
  "use strict";
6438
- KERNEL_VERSION = true ? "1.129.0" : "0.0.0-dev";
6482
+ KERNEL_VERSION = true ? "1.130.1" : "0.0.0-dev";
6439
6483
  OS_RELEASE = "6.0.0-slicc";
6440
6484
  }
6441
6485
  });
@@ -8343,9 +8387,9 @@ function createNodeOps(h) {
8343
8387
  node.live.stat = void 0;
8344
8388
  },
8345
8389
  lookup(parent, name2) {
8346
- const listed = parent.live.listed?.get(name2);
8390
+ const listed2 = parent.live.listed?.get(name2);
8347
8391
  parent.live.listed?.delete(name2);
8348
- const st = listed ?? call2(() => bridgeOf(parent).lstat(childPath(parent, name2)));
8392
+ const st = listed2 ?? call2(() => bridgeOf(parent).lstat(childPath(parent, name2)));
8349
8393
  return makeNode(parent, name2, st);
8350
8394
  },
8351
8395
  mknod(parent, name2, mode) {
@@ -8419,10 +8463,10 @@ function createNodeOps(h) {
8419
8463
  call2(() => bridgeOf(parent).rmdir(childPath(parent, name2)));
8420
8464
  },
8421
8465
  readdir(node) {
8422
- const listed = call2(() => bridgeOf(node).readdirStat(liveNodePath(node)));
8466
+ const listed2 = call2(() => bridgeOf(node).readdirStat(liveNodePath(node)));
8423
8467
  node.live.listed = /* @__PURE__ */ new Map();
8424
- for (const [name2, st] of listed) if (st) node.live.listed.set(name2, st);
8425
- return [".", "..", ...listed.map(([name2]) => name2)];
8468
+ for (const [name2, st] of listed2) if (st) node.live.listed.set(name2, st);
8469
+ return [".", "..", ...listed2.map(([name2]) => name2)];
8426
8470
  },
8427
8471
  symlink(parent, newName, target) {
8428
8472
  parent.live.listed = void 0;
@@ -10456,7 +10500,7 @@ function useProcfs(Fs, sys, pid, memory = memorySource()) {
10456
10500
  return dir;
10457
10501
  };
10458
10502
  const scans = /* @__PURE__ */ new Map();
10459
- const listed = (target) => {
10503
+ const listed2 = (target) => {
10460
10504
  let found = false;
10461
10505
  for (const [stream, pids] of scans) {
10462
10506
  if (Fs.streams && Fs.streams[stream.fd ?? -1] !== stream) scans.delete(stream);
@@ -10477,7 +10521,7 @@ function useProcfs(Fs, sys, pid, memory = memorySource()) {
10477
10521
  ...procOps2,
10478
10522
  lookup: (parent, name2) => {
10479
10523
  if (/^[1-9]\d*$/.test(name2)) {
10480
- if (!infoOf(Number(name2)) && !listed(Number(name2))) throw error();
10524
+ if (!infoOf(Number(name2)) && !listed2(Number(name2))) throw error();
10481
10525
  return pidDir(name2, Number(name2));
10482
10526
  }
10483
10527
  if (name2 === "mounts") return file(parent, name2, () => mountTable(sys.mountList?.() ?? []));
@@ -10793,9 +10837,9 @@ function procfsBridge(fs, tree) {
10793
10837
  }
10794
10838
  }),
10795
10839
  () => {
10796
- const listed = fs.readdirStat(p);
10797
- if (p !== "/" || listed.some(([name2]) => name2 === "proc")) return listed;
10798
- return [...listed, ["proc", tree.stat("/proc")]];
10840
+ const listed2 = fs.readdirStat(p);
10841
+ if (p !== "/" || listed2.some(([name2]) => name2 === "proc")) return listed2;
10842
+ return [...listed2, ["proc", tree.stat("/proc")]];
10799
10843
  }
10800
10844
  ),
10801
10845
  rename: (from, to) => readOnly2(
@@ -12255,9 +12299,7 @@ function createContext(o) {
12255
12299
  argv: o.argv,
12256
12300
  env: o.env,
12257
12301
  pid: o.pid,
12258
- async ppid() {
12259
- return identityOf(await kernel.json({ op: "proc-identity" }), o).ppid;
12260
- },
12302
+ ppid: async () => identityOf(await kernel.json({ op: "proc-identity" }), o).ppid,
12261
12303
  cwd: o.cwd,
12262
12304
  stdin: readable2(read2),
12263
12305
  stdout: writable2(1),
@@ -12302,6 +12344,7 @@ function createContext(o) {
12302
12344
  websocket: websocketOp(kernel),
12303
12345
  tty: terminal.tty,
12304
12346
  exit,
12347
+ thread: o.thread,
12305
12348
  onUncaught: (listener) => listen(strays.exception, listener),
12306
12349
  onUnhandledRejection: (listener) => listen(strays.rejection, listener)
12307
12350
  };
@@ -12533,11 +12576,100 @@ var init_js_context = __esm({
12533
12576
  }
12534
12577
  });
12535
12578
 
12579
+ // src/process/js/js-thread.ts
12580
+ function outOfMemory(err) {
12581
+ return err instanceof RangeError && OOM.test(err.message);
12582
+ }
12583
+ function optionsOf(options) {
12584
+ if (options === void 0) return {};
12585
+ if (typeof options !== "object" || options === null || Array.isArray(options)) {
12586
+ throw new JsCallError("EINVAL", "thread.spawn");
12587
+ }
12588
+ const { transfer } = options;
12589
+ if (transfer !== void 0 && !Array.isArray(transfer)) {
12590
+ throw new JsCallError("EINVAL", "thread.spawn");
12591
+ }
12592
+ return options;
12593
+ }
12594
+ function started(port3, control) {
12595
+ const exited = Promise.withResolvers();
12596
+ return new Promise((resolve, reject) => {
12597
+ const thread = (tid) => Object.freeze({
12598
+ tid,
12599
+ port: port3,
12600
+ exited: exited.promise,
12601
+ async terminate() {
12602
+ control.postMessage({ terminate: true });
12603
+ await exited.promise;
12604
+ }
12605
+ });
12606
+ control.onmessage = (event) => {
12607
+ const said = event.data;
12608
+ if ("tid" in said) resolve(thread(said.tid));
12609
+ else if ("errno" in said) {
12610
+ control.close();
12611
+ port3.close();
12612
+ reject(new JsCallError(said.errno, "thread.spawn", said.message));
12613
+ } else if ("exited" in said) {
12614
+ control.close();
12615
+ exited.resolve(said.exited);
12616
+ }
12617
+ };
12618
+ });
12619
+ }
12620
+ function threadContext(post2, start2) {
12621
+ const spawn = (options) => {
12622
+ let asked;
12623
+ try {
12624
+ asked = optionsOf(options);
12625
+ } catch (err) {
12626
+ return Promise.reject(err);
12627
+ }
12628
+ const channel = new NativeChannel();
12629
+ const control = new NativeChannel();
12630
+ const transfer = [...asked.transfer ?? []];
12631
+ const msg = {
12632
+ type: JS_THREAD_SPAWN,
12633
+ data: asked.data,
12634
+ port: channel.port2,
12635
+ control: control.port2,
12636
+ transfer
12637
+ };
12638
+ try {
12639
+ post2.postMessage(msg, [channel.port2, control.port2, ...transfer]);
12640
+ } catch (err) {
12641
+ channel.port1.close();
12642
+ control.port1.close();
12643
+ return Promise.reject(err);
12644
+ }
12645
+ return started(channel.port1, control.port1);
12646
+ };
12647
+ return Object.freeze({
12648
+ tid: start2?.tid ?? 0,
12649
+ port: start2?.port,
12650
+ data: start2?.data,
12651
+ NO_MEMORY: JS_THREAD_NO_MEMORY,
12652
+ CRASHED: JS_THREAD_CRASHED,
12653
+ spawn
12654
+ });
12655
+ }
12656
+ var NativeChannel, OOM;
12657
+ var init_js_thread = __esm({
12658
+ "src/process/js/js-thread.ts"() {
12659
+ "use strict";
12660
+ init_protocol();
12661
+ init_js_kernel();
12662
+ NativeChannel = globalThis.MessageChannel;
12663
+ OOM = /out of memory|Array buffer allocation failed|Cannot allocate Wasm memory/i;
12664
+ }
12665
+ });
12666
+
12536
12667
  // src/process/js/js-runtime.ts
12537
12668
  var js_runtime_exports = {};
12538
12669
  __export(js_runtime_exports, {
12539
12670
  mainOf: () => mainOf,
12540
12671
  runJsProcess: () => runJsProcess,
12672
+ runJsThread: () => runJsThread,
12541
12673
  trapStrays: () => trapStrays
12542
12674
  });
12543
12675
  function trapStrays(scope2, stray) {
@@ -12568,7 +12700,15 @@ function mainOf(module) {
12568
12700
  const main = typeof module.default === "function" ? module.default : module.main;
12569
12701
  return typeof main === "function" ? main : void 0;
12570
12702
  }
12571
- async function runJsProcess(init, port3, deps = {}) {
12703
+ function runJsProcess(init, port3, deps = {}) {
12704
+ return runJs(init, port3, deps, void 0);
12705
+ }
12706
+ function runJsThread(init, port3, deps = {}) {
12707
+ const { thread, ...rest2 } = init;
12708
+ return runJs(rest2, port3, deps, thread);
12709
+ }
12710
+ async function runJs(init, port3, deps, thread) {
12711
+ const failed5 = (err) => thread && outOfMemory(err) ? JS_THREAD_NO_MEMORY : 1;
12572
12712
  const transport = createAsyncSabTransport(init.sab, port3, deps.waitAsync);
12573
12713
  let resolveExit;
12574
12714
  const exit = new Promise((resolve) => resolveExit = resolve);
@@ -12580,7 +12720,7 @@ async function runJsProcess(init, port3, deps = {}) {
12580
12720
  let failing;
12581
12721
  const fail = (err) => {
12582
12722
  if (err instanceof JsExit) return;
12583
- failing ??= say(message(err)).then(() => exited(1));
12723
+ failing ??= (thread ? Promise.resolve() : say(message(err))).then(() => exited(failed5(err)));
12584
12724
  };
12585
12725
  const kernel = new JsKernel({
12586
12726
  sab: init.sab,
@@ -12601,7 +12741,8 @@ async function runJsProcess(init, port3, deps = {}) {
12601
12741
  cwd: init.cwd,
12602
12742
  exit: (status3) => exited(statusOf(status3)),
12603
12743
  lane: laneOf(init.lane),
12604
- strays
12744
+ strays,
12745
+ thread: threadContext(port3, thread)
12605
12746
  });
12606
12747
  const say = (text) => ctx.write(2, `${init.argv0}: ${text}
12607
12748
  `).catch(() => void 0);
@@ -12632,8 +12773,8 @@ async function runJsProcess(init, port3, deps = {}) {
12632
12773
  const program = main;
12633
12774
  const ran = Promise.resolve().then(() => program(ctx)).then(statusOf, async (err) => {
12634
12775
  if (err instanceof JsExit) return err.status;
12635
- await say(message(err));
12636
- return 1;
12776
+ if (!thread) await say(message(err));
12777
+ return failed5(err);
12637
12778
  });
12638
12779
  const status2 = await Promise.race([ran, exit]);
12639
12780
  await drain2();
@@ -12646,11 +12787,13 @@ var NOT_RUNNABLE;
12646
12787
  var init_js_runtime = __esm({
12647
12788
  "src/process/js/js-runtime.ts"() {
12648
12789
  "use strict";
12790
+ init_protocol();
12649
12791
  init_wasi_imports();
12650
12792
  init_async_sab();
12651
12793
  init_js_context();
12652
12794
  init_js_kernel();
12653
12795
  init_js_sync();
12796
+ init_js_thread();
12654
12797
  init_lockdown();
12655
12798
  NOT_RUNNABLE = 126;
12656
12799
  }
@@ -15150,17 +15293,17 @@ function ptsBridge(fs, call2) {
15150
15293
  },
15151
15294
  readdir: (p) => {
15152
15295
  if (p === PTS) return names();
15153
- const listed = fs.readdir(p);
15154
- return p === "/dev" && !listed.includes("pts") ? [...listed, "pts"] : listed;
15296
+ const listed2 = fs.readdir(p);
15297
+ return p === "/dev" && !listed2.includes("pts") ? [...listed2, "pts"] : listed2;
15155
15298
  },
15156
15299
  readdirStat: (p) => {
15157
15300
  if (p === PTS) {
15158
15301
  const known = open();
15159
15302
  return names(known).map((name2) => listedEntry(name2, known));
15160
15303
  }
15161
- const listed = fs.readdirStat(p);
15162
- if (p !== "/dev" || listed.some(([name2]) => name2 === "pts")) return listed;
15163
- return [...listed, ["pts", dir()]];
15304
+ const listed2 = fs.readdirStat(p);
15305
+ if (p !== "/dev" || listed2.some(([name2]) => name2 === "pts")) return listed2;
15306
+ return [...listed2, ["pts", dir()]];
15164
15307
  }
15165
15308
  };
15166
15309
  return new Proxy(fs, {
@@ -17746,7 +17889,7 @@ init_process_runtime();
17746
17889
  var loadWasi = () => Promise.resolve().then(() => (init_wasi_runtime(), wasi_runtime_exports));
17747
17890
  var loadJs = () => Promise.resolve().then(() => (init_js_runtime(), js_runtime_exports));
17748
17891
  var NOT_RUNNABLE2 = 126;
17749
- function started(init, port3, run, wasi, js) {
17892
+ function started2(init, port3, run, wasi, js) {
17750
17893
  if (init.program?.abi === "js") {
17751
17894
  const jsInit = init;
17752
17895
  return js().then((m) => m.runJsProcess(jsInit, port3));
@@ -17776,8 +17919,19 @@ function processEntry(port3, run = runWasmProcess, wasi = loadWasi, js = loadJs,
17776
17919
  };
17777
17920
  return (data) => {
17778
17921
  const type = data?.type;
17779
- if (type !== WASM_THREAD_INIT && type !== WASM_PROCESS_INIT) return;
17922
+ if (type !== WASM_THREAD_INIT && type !== WASM_PROCESS_INIT && type !== JS_THREAD_INIT) return;
17780
17923
  const refusal2 = sealOnce();
17924
+ if (type === JS_THREAD_INIT) {
17925
+ if (refusal2) return failed5(refusal2.error);
17926
+ js().then((m) => {
17927
+ if (!m.runJsThread) throw new Error("this process worker runs no JS threads");
17928
+ return m.runJsThread(data, port3);
17929
+ }).then(
17930
+ (code2) => port3.postMessage({ type: JS_THREAD_EXIT, code: code2 }),
17931
+ failed5
17932
+ );
17933
+ return;
17934
+ }
17781
17935
  const init = data;
17782
17936
  if (type === WASM_THREAD_INIT || init?.program?.abi !== "js") useLocalClock(init?.sab);
17783
17937
  if (type === WASM_THREAD_INIT) {
@@ -17786,7 +17940,7 @@ function processEntry(port3, run = runWasmProcess, wasi = loadWasi, js = loadJs,
17786
17940
  return;
17787
17941
  }
17788
17942
  if (refusal2) return failed5(refusal2.error, NOT_RUNNABLE2);
17789
- started(data, port3, run, wasi, js).then(
17943
+ started2(data, port3, run, wasi, js).then(
17790
17944
  (code2) => port3.postMessage({ type: WASM_PROCESS_EXIT, code: code2 }),
17791
17945
  failed5
17792
17946
  );
@@ -17800,14 +17954,17 @@ scope.require ??= createRequire(import.meta.url);
17800
17954
  scope.__filename ??= new URL(import.meta.url).pathname;
17801
17955
  scope.__dirname ??= new URL(".", import.meta.url).pathname;
17802
17956
  var port2 = parentPort;
17803
- var post = { postMessage: (message2) => port2.postMessage(message2) };
17957
+ var post = {
17958
+ postMessage: (message2, transfer) => port2.postMessage(message2, transfer)
17959
+ };
17804
17960
  var strayScope = nodeProcess ? { process: nodeProcess } : {};
17805
17961
  var onMessage = processEntry(
17806
17962
  post,
17807
17963
  void 0,
17808
17964
  async () => wasi_runtime_exports,
17809
17965
  async () => ({
17810
- runJsProcess: (init, at) => runJsProcess(init, at, { lockdown: () => nodeLockdown(), scope: strayScope })
17966
+ runJsProcess: (init, at) => runJsProcess(init, at, { lockdown: () => nodeLockdown(), scope: strayScope }),
17967
+ runJsThread: (init, at) => runJsThread(init, at, { lockdown: () => nodeLockdown(), scope: strayScope })
17811
17968
  }),
17812
17969
  () => nodeLockdown()
17813
17970
  );