@ai-ecoverse/slicc-kernel 1.125.11 → 1.126.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6392,7 +6392,7 @@ var KERNEL_VERSION, OS_RELEASE;
6392
6392
  var init_version = __esm({
6393
6393
  "src/version.ts"() {
6394
6394
  "use strict";
6395
- KERNEL_VERSION = true ? "1.125.11" : "0.0.0-dev";
6395
+ KERNEL_VERSION = true ? "1.126.0" : "0.0.0-dev";
6396
6396
  OS_RELEASE = "6.0.0-slicc";
6397
6397
  }
6398
6398
  });
@@ -7269,7 +7269,8 @@ function sessionOf(r) {
7269
7269
  }
7270
7270
  return Object.freeze({
7271
7271
  path: "kernel",
7272
- substitutes: false,
7272
+ substitutes: r.substitutes === true,
7273
+ verified: r.verified === true,
7273
7274
  protocol: r.protocol ?? "TLSv1.2",
7274
7275
  alpnProtocol: r.alpnProtocol,
7275
7276
  authorized: r.authorized === true,
@@ -11226,20 +11227,24 @@ function syncOps(kernel, shared) {
11226
11227
  const r = kernel.blocking({ op: "fd-read", fd, max: Math.min(max, MAX_IO) });
11227
11228
  return r.ok && r.kind === "bytes" ? r.bytes : new Uint8Array(0);
11228
11229
  };
11229
- const write2 = (fd, data) => {
11230
+ const write2 = (fd, data, options) => {
11230
11231
  const bytes = typeof data === "string" ? encoder3.encode(data) : data;
11231
11232
  const i = info(fd);
11232
- if (writeDevice(i)) return;
11233
+ if (writeDevice(i)) return bytes.length;
11234
+ const nonblock = options?.nonblock === true;
11233
11235
  let at = 0;
11234
11236
  while (at < bytes.length) {
11235
11237
  const body = bytes.subarray(at, at + MAX_IO);
11236
11238
  try {
11237
- at += written(kernel.blocking({ op: "fd-write", fd, body }), body.length);
11239
+ const req = { op: "fd-write", fd, body, ...nonblock ? { nonblock } : {} };
11240
+ at += written(kernel.blocking(req), body.length);
11238
11241
  } catch (err) {
11239
11242
  if (brokenPipe(err, i)) kernel.call({ op: "proc-kill", pid: shared.pid, sig: SIG.PIPE });
11240
11243
  throw err;
11241
11244
  }
11245
+ if (nonblock) break;
11242
11246
  }
11247
+ return at;
11243
11248
  };
11244
11249
  const statOf = (op, path) => {
11245
11250
  const abs = resolve(path);
@@ -11530,7 +11535,7 @@ function rawOf(termios) {
11530
11535
  raw.c_cc[VTIME] = 0;
11531
11536
  return raw;
11532
11537
  }
11533
- function ttyOps(kernel) {
11538
+ function ttyOps(kernel, syncKernel) {
11534
11539
  const saved = /* @__PURE__ */ new Map();
11535
11540
  const terminalOf = async (fd) => (await kernel.json({ op: "fd-info", fd })).terminal ?? `fd ${fd}`;
11536
11541
  const getAttr = async (fd) => await kernel.json({ op: "tty-get", fd });
@@ -11582,8 +11587,27 @@ function ttyOps(kernel) {
11582
11587
  await back.catch(() => void 0);
11583
11588
  }
11584
11589
  };
11590
+ const syncGet = (fd) => syncKernel.json({ op: "tty-get", fd });
11591
+ const syncSet = (fd, termios) => void syncKernel.json({ op: "tty-set", fd, termios: copy(termios) });
11592
+ const syncTty = {
11593
+ getAttr: syncGet,
11594
+ setAttr: syncSet,
11595
+ setRaw(fd, raw) {
11596
+ const info = syncKernel.json({ op: "fd-info", fd });
11597
+ const terminal = info.terminal ?? `fd ${fd}`;
11598
+ if (!raw) {
11599
+ const original = saved.get(terminal);
11600
+ saved.delete(terminal);
11601
+ if (original) syncSet(fd, original.termios);
11602
+ return;
11603
+ }
11604
+ const current = syncGet(fd);
11605
+ if (!saved.has(terminal)) saved.set(terminal, { fd, termios: current });
11606
+ syncSet(fd, rawOf(current));
11607
+ }
11608
+ };
11585
11609
  const modes = () => [...saved].reverse().map(([terminal, { fd, termios }]) => ({ terminal, fd, termios }));
11586
- return { tty, restore, modes };
11610
+ return { tty, syncTty, restore, modes };
11587
11611
  }
11588
11612
  var BRKINT, INPCK, ISTRIP, ICRNL, IXON, ONLCR, CS8, ISIG, ICANON, ECHO, IEXTEN, VTIME, VMIN;
11589
11613
  var init_js_tty = __esm({
@@ -11809,6 +11833,26 @@ var init_js_websocket = __esm({
11809
11833
  });
11810
11834
 
11811
11835
  // src/process/js/js-context.ts
11836
+ function fdList(list) {
11837
+ const fds = [...list ?? []];
11838
+ if (!fds.every((fd) => Number.isInteger(fd) && fd >= 0))
11839
+ throw new JsCallError("EINVAL", "select", "ERR_INVALID_ARG_VALUE: fds must be integers >= 0");
11840
+ return fds;
11841
+ }
11842
+ async function selectOp(kernel, sets, signal) {
11843
+ signal?.throwIfAborted();
11844
+ const read2 = fdList(sets.read);
11845
+ const write2 = fdList(sets.write);
11846
+ const timeoutMs2 = sets.timeoutMs ?? -1;
11847
+ if (!Number.isFinite(timeoutMs2))
11848
+ throw new JsCallError("EINVAL", "select", "ERR_INVALID_ARG_VALUE: timeoutMs");
11849
+ const r = await kernel.blocking(
11850
+ { op: "fd-select", read: read2, write: write2, timeoutMs: Math.max(-1, Math.floor(timeoutMs2)) },
11851
+ signal
11852
+ );
11853
+ const got = r.ok && r.kind === "json" ? r.json : {};
11854
+ return { read: got.read ?? [], write: got.write ?? [] };
11855
+ }
11812
11856
  function listen(listeners, listener) {
11813
11857
  const own = (error, promise) => listener(error, promise);
11814
11858
  listeners.add(own);
@@ -11898,7 +11942,17 @@ function writer(kernel, info, pid) {
11898
11942
  writes.delete(w);
11899
11943
  }
11900
11944
  };
11901
- return { writes, writeAll };
11945
+ const writeSome = async (fd, data) => {
11946
+ const i = await info(fd);
11947
+ if (writeDevice(i)) return data.length;
11948
+ const body = data.subarray(0, MAX_IO);
11949
+ const r = await kernel.raw({ op: "fd-write", fd, body, nonblock: true });
11950
+ if (r.ok) return written(r, body.length);
11951
+ if (brokenPipe(callError(r, "fd-write"), i))
11952
+ await kernel.call({ op: "proc-kill", pid, sig: SIG.PIPE });
11953
+ throw callError(r, "fd-write");
11954
+ };
11955
+ return { writes, writeAll, writeSome };
11902
11956
  }
11903
11957
  function readable2(read2) {
11904
11958
  return new ReadableStream(
@@ -12046,6 +12100,24 @@ function pendingReads(kernel, info, random) {
12046
12100
  };
12047
12101
  return { read: read2, closing };
12048
12102
  }
12103
+ function tracked2(pending, writeAll, writeSome) {
12104
+ return (fd, data, options) => {
12105
+ const bytes = typeof data === "string" ? encoder4.encode(data) : data;
12106
+ let settle;
12107
+ const settled2 = new Promise((resolve) => settle = resolve);
12108
+ pending.add(settled2);
12109
+ return (async () => {
12110
+ try {
12111
+ if (options?.nonblock === true) return await writeSome(fd, bytes);
12112
+ await writeAll(fd, bytes);
12113
+ return bytes.length;
12114
+ } finally {
12115
+ pending.delete(settled2);
12116
+ settle();
12117
+ }
12118
+ })();
12119
+ };
12120
+ }
12049
12121
  function createContext(o) {
12050
12122
  const { kernel } = o;
12051
12123
  const infos = /* @__PURE__ */ new Map();
@@ -12072,22 +12144,13 @@ function createContext(o) {
12072
12144
  return got;
12073
12145
  };
12074
12146
  const { read: read2, closing } = pendingReads(kernel, info, random);
12075
- const { writes, writeAll } = writer(kernel, info, o.pid);
12076
- const write2 = (fd, data) => {
12077
- const bytes = typeof data === "string" ? encoder4.encode(data) : data;
12078
- let settle;
12079
- const settled2 = new Promise((resolve2) => settle = resolve2);
12080
- pending.add(settled2);
12081
- return (async () => {
12082
- try {
12083
- await writeAll(fd, bytes);
12084
- } finally {
12085
- pending.delete(settled2);
12086
- settle();
12087
- }
12088
- })();
12089
- };
12090
- const writable2 = (fd) => new WritableStream({ write: (chunk) => write2(fd, chunk) });
12147
+ const { writes, writeAll, writeSome } = writer(kernel, info, o.pid);
12148
+ const write2 = tracked2(pending, writeAll, writeSome);
12149
+ const writable2 = (fd) => new WritableStream({
12150
+ write: async (chunk) => {
12151
+ await write2(fd, chunk);
12152
+ }
12153
+ });
12091
12154
  const statOf = async (op, path) => {
12092
12155
  const abs = resolve(path);
12093
12156
  if (inDev(abs)) return devAsync(kernel, devStat(abs, op === "stat"));
@@ -12113,10 +12176,11 @@ function createContext(o) {
12113
12176
  const lane = o.lane ?? laneOf(void 0);
12114
12177
  if (o.lane && o.lane !== noLane) kernel.syncLane = o.lane;
12115
12178
  const syncKernel = new JsSyncKernel(lane, kernel, unwind);
12116
- const terminal = ttyOps(kernel);
12179
+ const terminal = ttyOps(kernel, syncKernel);
12117
12180
  const shared = { pid: o.pid, resolve, random, infos, handles, closing };
12118
12181
  const sync = {
12119
12182
  kernel: KERNEL_INFO,
12183
+ tty: terminal.syncTty,
12120
12184
  ...watchingSyncOps(kernel, syncKernel, shared),
12121
12185
  run: (options) => runSync(syncKernel, { env: o.env, cwd: o.cwd, resolve, signal: signalNumber }, options),
12122
12186
  spawn: (options) => spawnSync(options),
@@ -12161,6 +12225,7 @@ function createContext(o) {
12161
12225
  },
12162
12226
  socketpair: async () => await kernel.json({ op: "sock-pair", domain: "unix", type: "stream" }),
12163
12227
  pipe: async () => await kernel.json({ op: "fd-pipe" }),
12228
+ select: (sets, options) => selectOp(kernel, sets, options?.signal),
12164
12229
  async fdStatus(fd) {
12165
12230
  const type = typeOf(await info(fd));
12166
12231
  return { type, tty: type === "tty", seekable: type === "file" };