@ai-ecoverse/slicc-kernel 1.125.3 → 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.3" : "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) {
@@ -12204,6 +12255,60 @@ var init_wasi_procfs = __esm({
12204
12255
  }
12205
12256
  });
12206
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
+
12207
12312
  // src/process/wasi/wasi-signals.ts
12208
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;
12209
12314
  var init_wasi_signals = __esm({
@@ -14379,13 +14484,20 @@ async function runWasiProcess(init, port2) {
14379
14484
  ppid: id.ppid,
14380
14485
  parent: () => identify(transport, init).ppid,
14381
14486
  kernel: { sys: traced(stats, "kernel", sys), call: call2 },
14382
- fs: procfsBridge(
14383
- cachingBridge(
14384
- traced(stats, "fs", createSyncFsSabBridge(transport, { ...ownersOf(init), direct: true })),
14385
- void 0,
14386
- 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)
14387
14499
  ),
14388
- procTree(call2, id.pid)
14500
+ call2
14389
14501
  ),
14390
14502
  ...descriptors(init, fork, threads),
14391
14503
  ...threads ? { credGen: threads.ids } : {}
@@ -14485,13 +14597,16 @@ async function runWasiThread(init, port2) {
14485
14597
  ppid: id.ppid,
14486
14598
  parent: () => identify(transport, init).ppid,
14487
14599
  kernel: { sys, call: call2 },
14488
- fs: procfsBridge(
14489
- cachingBridge(
14490
- createSyncFsSabBridge(transport, { ...ownersOf(init), direct: true }),
14491
- void 0,
14492
- 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)
14493
14608
  ),
14494
- procTree(call2, id.pid)
14609
+ call2
14495
14610
  ),
14496
14611
  shared: threads.ids
14497
14612
  });
@@ -14557,6 +14672,7 @@ var init_wasi_runtime = __esm({
14557
14672
  init_wasi_imports();
14558
14673
  init_wasi_module();
14559
14674
  init_wasi_procfs();
14675
+ init_wasi_ptsfs();
14560
14676
  init_wasi_sigmask();
14561
14677
  init_wasi_signals();
14562
14678
  init_wasi_stats();