@ai-ecoverse/slicc-kernel 1.125.2 → 1.125.4

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.
@@ -2655,7 +2655,7 @@ var KERNEL_VERSION, OS_RELEASE;
2655
2655
  var init_version = __esm({
2656
2656
  "src/version.ts"() {
2657
2657
  "use strict";
2658
- KERNEL_VERSION = true ? "1.125.2" : "0.0.0-dev";
2658
+ KERNEL_VERSION = true ? "1.125.4" : "0.0.0-dev";
2659
2659
  OS_RELEASE = "6.0.0-slicc";
2660
2660
  }
2661
2661
  });
@@ -3877,7 +3877,7 @@ function datesOf(real) {
3877
3877
  dates[key] = new Date(value2);
3878
3878
  return dates;
3879
3879
  }
3880
- var POLLIN, POLLOUT, POLLERR, POLLHUP, POLLRDNORM, POLLWRNORM, TCSETSF, O_NONBLOCK, SOCKET_MODE, PTY_PATH, TTY_PATH, TTY_NAME, SEALED_PATH, STRERROR, CLIPBOARD_PATH, O_CREAT2, O_EXCL2, O_NOCTTY, O_TRUNC3, O_DIRECTORY, KILLED_BY_SIGPIPE, ProcessExit, SyscallError, KernelStreams;
3880
+ var POLLIN, POLLOUT, POLLERR, POLLHUP, POLLRDNORM, POLLWRNORM, TCSETSF, O_NONBLOCK, SOCKET_MODE, PTY_PATH, TTY_PATH, PTS_MAJOR, TTY_NAME, SEALED_PATH, STRERROR, CLIPBOARD_PATH, O_CREAT2, O_EXCL2, O_NOCTTY, O_TRUNC3, O_DIRECTORY, KILLED_BY_SIGPIPE, ProcessExit, SyscallError, KernelStreams;
3881
3881
  var init_kernel_streams = __esm({
3882
3882
  "src/process/kernel-streams.ts"() {
3883
3883
  "use strict";
@@ -3894,6 +3894,7 @@ var init_kernel_streams = __esm({
3894
3894
  SOCKET_MODE = 49663;
3895
3895
  PTY_PATH = /^\/dev\/(?:ptmx|pts\/(\d+))$/;
3896
3896
  TTY_PATH = /^\/dev\/tty\d+$/;
3897
+ PTS_MAJOR = 136;
3897
3898
  TTY_NAME = /^tty\d+$/;
3898
3899
  SEALED_PATH = "/dev/sealed";
3899
3900
  STRERROR = {
@@ -4105,6 +4106,48 @@ var init_kernel_streams = __esm({
4105
4106
  return [...names, ...missing2];
4106
4107
  };
4107
4108
  }
4109
+ usePtsNodes() {
4110
+ const fs = this.Fs;
4111
+ const { lookupNode, readdir, getPath, mkdir, mkdev, makedev } = fs;
4112
+ const numbers = this.sys.ptyNumbers?.bind(this.sys);
4113
+ if (!lookupNode || !readdir || !getPath || !mkdir || !mkdev || !makedev || !numbers) return;
4114
+ const make = (parent, name2) => {
4115
+ const dir = getPath.call(fs, parent);
4116
+ if (dir === "/dev" && name2 === "pts") mkdir.call(fs, "/dev/pts", 493);
4117
+ else if (dir === "/dev/pts" && numbers().includes(Number(name2)) && /^\d+$/.test(name2))
4118
+ mkdev.call(fs, `/dev/pts/${name2}`, makedev.call(fs, PTS_MAJOR, Number(name2)));
4119
+ else return false;
4120
+ return true;
4121
+ };
4122
+ fs.lookupNode = (parent, name2) => {
4123
+ try {
4124
+ return lookupNode.call(fs, parent, name2);
4125
+ } catch (e) {
4126
+ if (this.creatingTerminal) throw e;
4127
+ this.creatingTerminal = true;
4128
+ let made;
4129
+ try {
4130
+ made = make(parent, name2);
4131
+ } finally {
4132
+ this.creatingTerminal = false;
4133
+ }
4134
+ if (!made) throw e;
4135
+ return lookupNode.call(fs, parent, name2);
4136
+ }
4137
+ };
4138
+ fs.readdir = (path) => {
4139
+ const at = path.replace(/\/+$/, "");
4140
+ if (at === "/dev/pts") return [".", "..", ...numbers().map(String)];
4141
+ const names = readdir.call(fs, path);
4142
+ return at === "/dev" && !names.includes("pts") ? [...names, "pts"] : names;
4143
+ };
4144
+ }
4145
+ ptsTarget(path, st) {
4146
+ if ((st?.rdev ?? 0) >> 8 !== PTS_MAJOR) return void 0;
4147
+ const { lookupPath } = this.Fs;
4148
+ const real = lookupPath?.call(this.Fs, path, { follow: true }).path;
4149
+ return real !== void 0 && isPtyPath(real) ? real : void 0;
4150
+ }
4108
4151
  ttyNode(name2) {
4109
4152
  const { analyzePath, mkdev, makedev } = this.Fs;
4110
4153
  if (!TTY_PATH.test(name2) || !analyzePath || !mkdev || !makedev) return;
@@ -4180,6 +4223,7 @@ var init_kernel_streams = __esm({
4180
4223
  if (typeof this.Fs.open !== "function") return;
4181
4224
  this.usePtyPaths();
4182
4225
  this.useTerminalNodes();
4226
+ this.usePtsNodes();
4183
4227
  this.listSealed();
4184
4228
  const open = this.Fs.open.bind(this.Fs);
4185
4229
  this.Fs.open = (path, flags, mode) => {
@@ -4295,15 +4339,21 @@ var init_kernel_streams = __esm({
4295
4339
  if (path === CLIPBOARD_PATH && this.sys.openClipboard) return sealedStat(251);
4296
4340
  const owned = this.ownedTty(path);
4297
4341
  if (owned && isPtyPath(path)) return this.owned(path, ptyStat(path));
4298
- if (!isPtyPath(path)) {
4299
- const st = original.call(fs, path, ...rest2);
4300
- return owned && TTY_PATH.test(path) ? this.owned(path, st) : st;
4301
- }
4342
+ if (!isPtyPath(path))
4343
+ return this.pathStat(path, original.call(fs, path, ...rest2), name2, owned);
4302
4344
  this.existingPty(path);
4303
4345
  return ptyStat(path);
4304
4346
  };
4305
4347
  }
4306
4348
  }
4349
+ pathStat(path, st, name2, owned) {
4350
+ const pts = name2 === "stat" ? this.ptsTarget(path, st) : void 0;
4351
+ if (pts) {
4352
+ this.existingPty(pts);
4353
+ return owned ? this.owned(pts, ptyStat(pts)) : ptyStat(pts);
4354
+ }
4355
+ return owned && TTY_PATH.test(path) ? this.owned(path, st) : st;
4356
+ }
4307
4357
  ownedTty(path) {
4308
4358
  return this.options.owners === true && this.sys.ttyOwner !== void 0 && path !== "/dev/ptmx";
4309
4359
  }
@@ -9965,6 +10015,7 @@ function filetypeOf(s) {
9965
10015
  if (s.isSymbolicLink) return FILETYPE.SYMBOLIC_LINK;
9966
10016
  if (s.isDirectory) return FILETYPE.DIRECTORY;
9967
10017
  if (s.isSocket) return FILETYPE.SOCKET_STREAM;
10018
+ if (((s.mode ?? 0) & 61440) === 8192) return FILETYPE.CHARACTER_DEVICE;
9968
10019
  return s.isFile ? FILETYPE.REGULAR_FILE : FILETYPE.UNKNOWN;
9969
10020
  }
9970
10021
  function filestatOf(path, s) {
@@ -10206,7 +10257,11 @@ var init_wasi_host = __esm({
10206
10257
  }
10207
10258
  if (this.synthetic(path)) return ROOT_IDS;
10208
10259
  if (kernelDev(path)) return devSync(dev, devStat(path, follow3));
10209
- return follow3 ? this.o.fs.stat(path) : this.o.fs.lstat(path);
10260
+ return this.orDev(
10261
+ path,
10262
+ follow3,
10263
+ () => follow3 ? this.o.fs.stat(path) : this.o.fs.lstat(path)
10264
+ );
10210
10265
  };
10211
10266
  return wrap({
10212
10267
  fd_chown: (fd, uid, gid) => {
@@ -10285,7 +10340,16 @@ var init_wasi_host = __esm({
10285
10340
  const node = devSync(dev, devStat(path, (flags & AT_SYMLINK_NOFOLLOW2) === 0));
10286
10341
  return void mem.view().setUint32(out, node.mode ?? DEVICE_MODE, true);
10287
10342
  }
10288
- const st = flags & AT_SYMLINK_NOFOLLOW2 ? this.o.fs.lstat(path) : this.o.fs.stat(path);
10343
+ const follow3 = (flags & AT_SYMLINK_NOFOLLOW2) === 0;
10344
+ let st;
10345
+ try {
10346
+ st = follow3 ? this.o.fs.stat(path) : this.o.fs.lstat(path);
10347
+ } catch (err) {
10348
+ const device2 = this.orDev(path, follow3, () => {
10349
+ throw err;
10350
+ });
10351
+ return void mem.view().setUint32(out, device2.mode ?? DEVICE_MODE, true);
10352
+ }
10289
10353
  mem.view().setUint32(out, (st.isFifo ? S_IFIFO2 : 0) | modeOf2(st), true);
10290
10354
  }
10291
10355
  });
@@ -10995,6 +11059,21 @@ var init_wasi_host = __esm({
10995
11059
  synthetic(path) {
10996
11060
  return deviceOf(path) !== void 0 || path === SEALED_PATH2 && !!this.o.kernel.sys.openSealed || path === CLIPBOARD_PATH2 && !!this.o.kernel.sys.openClipboard;
10997
11061
  }
11062
+ linkedDev(path, follow3) {
11063
+ if (!follow3) return void 0;
11064
+ const real = physicalPath(this.o.fs, path);
11065
+ return real !== path && kernelDev(real) ? real : void 0;
11066
+ }
11067
+ orDev(path, follow3, stat) {
11068
+ try {
11069
+ return stat();
11070
+ } catch (err) {
11071
+ const device2 = err.code === "ENOENT" && this.linkedDev(path, follow3);
11072
+ if (!device2) throw err;
11073
+ const json2 = (req) => this.o.kernel.call(req);
11074
+ return devSync({ json: json2 }, devStat(device2, true));
11075
+ }
11076
+ }
10998
11077
  devChar(path, follow3) {
10999
11078
  try {
11000
11079
  const json2 = (req) => this.o.kernel.call(req);
@@ -11102,11 +11181,12 @@ var init_wasi_host = __esm({
11102
11181
  return filestatOf(path, follow3 ? this.o.fs.stat(path) : this.o.fs.lstat(path));
11103
11182
  } catch (err) {
11104
11183
  if (err.code !== "ENOENT") throw err;
11105
- if (kernelDev(path) && this.devChar(path, follow3)) {
11184
+ const device2 = kernelDev(path) ? path : this.linkedDev(path, follow3);
11185
+ if (device2 && this.devChar(device2, true)) {
11106
11186
  return this.local({
11107
11187
  filetype: FILETYPE.CHARACTER_DEVICE,
11108
11188
  size: 0n,
11109
- ino: pathInode(path),
11189
+ ino: pathInode(device2),
11110
11190
  mtimeNs: 0n
11111
11191
  });
11112
11192
  }
@@ -12175,6 +12255,60 @@ var init_wasi_procfs = __esm({
12175
12255
  }
12176
12256
  });
12177
12257
 
12258
+ // src/process/wasi/wasi-ptsfs.ts
12259
+ function ptsBridge(fs, call2) {
12260
+ const open = () => call2({ op: "pty-list" });
12261
+ const kernel = { json: (req) => call2(req) };
12262
+ const entry = (p) => {
12263
+ const n = PTS_ENTRY.exec(p)?.[1];
12264
+ if (n === void 0 || !open().includes(Number(n))) throw syncError("ENOENT", p);
12265
+ return devSync(kernel, devStat(p, true));
12266
+ };
12267
+ const dir = () => devSync(kernel, devStat(PTS, true));
12268
+ const statOf = (p, real) => {
12269
+ if (p === PTS) return dir();
12270
+ return PTS_ENTRY.test(p) ? entry(p) : real();
12271
+ };
12272
+ const names = () => open().map(String).sort();
12273
+ const over = {
12274
+ stat: (p) => statOf(p, () => fs.stat(p)),
12275
+ lstat: (p) => statOf(p, () => fs.lstat(p)),
12276
+ exists: (p) => {
12277
+ if (p === PTS) return true;
12278
+ if (!PTS_ENTRY.test(p)) return fs.exists(p);
12279
+ return open().includes(Number(PTS_ENTRY.exec(p)?.[1]));
12280
+ },
12281
+ readdir: (p) => {
12282
+ if (p === PTS) return names();
12283
+ const listed = fs.readdir(p);
12284
+ return p === "/dev" && !listed.includes("pts") ? [...listed, "pts"] : listed;
12285
+ },
12286
+ readdirStat: (p) => {
12287
+ if (p === PTS) return names().map((name2) => [name2, entry(`${PTS}/${name2}`)]);
12288
+ const listed = fs.readdirStat(p);
12289
+ if (p !== "/dev" || listed.some(([name2]) => name2 === "pts")) return listed;
12290
+ return [...listed, ["pts", dir()]];
12291
+ }
12292
+ };
12293
+ return new Proxy(fs, {
12294
+ get(target, key, receiver) {
12295
+ if (Object.hasOwn(over, key)) return over[key];
12296
+ const value2 = Reflect.get(target, key, receiver);
12297
+ return typeof value2 === "function" ? value2.bind(target) : value2;
12298
+ }
12299
+ });
12300
+ }
12301
+ var PTS, PTS_ENTRY;
12302
+ var init_wasi_ptsfs = __esm({
12303
+ "src/process/wasi/wasi-ptsfs.ts"() {
12304
+ "use strict";
12305
+ init_sync_fs_wire();
12306
+ init_js_dev();
12307
+ PTS = "/dev/pts";
12308
+ PTS_ENTRY = /^\/dev\/pts\/(\d+)$/;
12309
+ }
12310
+ });
12311
+
12178
12312
  // src/process/wasi/wasi-signals.ts
12179
12313
  var DELIVERED_MASK, KERNEL_DEFAULTS, LIBC_DEFAULT_EXIT, SA_RESTART, SA_NODEFER, SA_NOCLDWAIT, DISPOSITION_IGNORE, DISPOSITION_HANDLER, withBit, WASIX_LIBC_DEFAULT_LINE, WasiSignals;
12180
12314
  var init_wasi_signals = __esm({
@@ -14350,13 +14484,20 @@ async function runWasiProcess(init, port2) {
14350
14484
  ppid: id.ppid,
14351
14485
  parent: () => identify(transport, init).ppid,
14352
14486
  kernel: { sys: traced(stats, "kernel", sys), call: call2 },
14353
- fs: procfsBridge(
14354
- cachingBridge(
14355
- traced(stats, "fs", createSyncFsSabBridge(transport, { ...ownersOf(init), direct: true })),
14356
- void 0,
14357
- threads?.ids
14487
+ fs: ptsBridge(
14488
+ procfsBridge(
14489
+ cachingBridge(
14490
+ traced(
14491
+ stats,
14492
+ "fs",
14493
+ createSyncFsSabBridge(transport, { ...ownersOf(init), direct: true })
14494
+ ),
14495
+ void 0,
14496
+ threads?.ids
14497
+ ),
14498
+ procTree(call2, id.pid)
14358
14499
  ),
14359
- procTree(call2, id.pid)
14500
+ call2
14360
14501
  ),
14361
14502
  ...descriptors(init, fork, threads),
14362
14503
  ...threads ? { credGen: threads.ids } : {}
@@ -14456,13 +14597,16 @@ async function runWasiThread(init, port2) {
14456
14597
  ppid: id.ppid,
14457
14598
  parent: () => identify(transport, init).ppid,
14458
14599
  kernel: { sys, call: call2 },
14459
- fs: procfsBridge(
14460
- cachingBridge(
14461
- createSyncFsSabBridge(transport, { ...ownersOf(init), direct: true }),
14462
- void 0,
14463
- threads.ids
14600
+ fs: ptsBridge(
14601
+ procfsBridge(
14602
+ cachingBridge(
14603
+ createSyncFsSabBridge(transport, { ...ownersOf(init), direct: true }),
14604
+ void 0,
14605
+ threads.ids
14606
+ ),
14607
+ procTree(call2, id.pid)
14464
14608
  ),
14465
- procTree(call2, id.pid)
14609
+ call2
14466
14610
  ),
14467
14611
  shared: threads.ids
14468
14612
  });
@@ -14528,6 +14672,7 @@ var init_wasi_runtime = __esm({
14528
14672
  init_wasi_imports();
14529
14673
  init_wasi_module();
14530
14674
  init_wasi_procfs();
14675
+ init_wasi_ptsfs();
14531
14676
  init_wasi_sigmask();
14532
14677
  init_wasi_signals();
14533
14678
  init_wasi_stats();