@ai-ecoverse/slicc-kernel 1.125.12 → 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.
@@ -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.12" : "0.0.0-dev";
2658
+ KERNEL_VERSION = true ? "1.126.0" : "0.0.0-dev";
2659
2659
  OS_RELEASE = "6.0.0-slicc";
2660
2660
  }
2661
2661
  });
@@ -15775,7 +15775,8 @@ function sessionOf(r) {
15775
15775
  }
15776
15776
  return Object.freeze({
15777
15777
  path: "kernel",
15778
- substitutes: false,
15778
+ substitutes: r.substitutes === true,
15779
+ verified: r.verified === true,
15779
15780
  protocol: r.protocol ?? "TLSv1.2",
15780
15781
  alpnProtocol: r.alpnProtocol,
15781
15782
  authorized: r.authorized === true,
@@ -16251,20 +16252,24 @@ function syncOps(kernel, shared) {
16251
16252
  const r = kernel.blocking({ op: "fd-read", fd, max: Math.min(max, MAX_IO) });
16252
16253
  return r.ok && r.kind === "bytes" ? r.bytes : new Uint8Array(0);
16253
16254
  };
16254
- const write2 = (fd, data) => {
16255
+ const write2 = (fd, data, options) => {
16255
16256
  const bytes = typeof data === "string" ? encoder3.encode(data) : data;
16256
16257
  const i = info(fd);
16257
- if (writeDevice(i)) return;
16258
+ if (writeDevice(i)) return bytes.length;
16259
+ const nonblock = options?.nonblock === true;
16258
16260
  let at = 0;
16259
16261
  while (at < bytes.length) {
16260
16262
  const body = bytes.subarray(at, at + MAX_IO);
16261
16263
  try {
16262
- at += written(kernel.blocking({ op: "fd-write", fd, body }), body.length);
16264
+ const req = { op: "fd-write", fd, body, ...nonblock ? { nonblock } : {} };
16265
+ at += written(kernel.blocking(req), body.length);
16263
16266
  } catch (err) {
16264
16267
  if (brokenPipe(err, i)) kernel.call({ op: "proc-kill", pid: shared.pid, sig: SIG.PIPE });
16265
16268
  throw err;
16266
16269
  }
16270
+ if (nonblock) break;
16267
16271
  }
16272
+ return at;
16268
16273
  };
16269
16274
  const statOf = (op, path) => {
16270
16275
  const abs = resolve(path);
@@ -16555,7 +16560,7 @@ function rawOf(termios) {
16555
16560
  raw.c_cc[VTIME] = 0;
16556
16561
  return raw;
16557
16562
  }
16558
- function ttyOps(kernel) {
16563
+ function ttyOps(kernel, syncKernel) {
16559
16564
  const saved = /* @__PURE__ */ new Map();
16560
16565
  const terminalOf = async (fd) => (await kernel.json({ op: "fd-info", fd })).terminal ?? `fd ${fd}`;
16561
16566
  const getAttr = async (fd) => await kernel.json({ op: "tty-get", fd });
@@ -16607,8 +16612,27 @@ function ttyOps(kernel) {
16607
16612
  await back.catch(() => void 0);
16608
16613
  }
16609
16614
  };
16615
+ const syncGet = (fd) => syncKernel.json({ op: "tty-get", fd });
16616
+ const syncSet = (fd, termios) => void syncKernel.json({ op: "tty-set", fd, termios: copy(termios) });
16617
+ const syncTty = {
16618
+ getAttr: syncGet,
16619
+ setAttr: syncSet,
16620
+ setRaw(fd, raw) {
16621
+ const info = syncKernel.json({ op: "fd-info", fd });
16622
+ const terminal = info.terminal ?? `fd ${fd}`;
16623
+ if (!raw) {
16624
+ const original = saved.get(terminal);
16625
+ saved.delete(terminal);
16626
+ if (original) syncSet(fd, original.termios);
16627
+ return;
16628
+ }
16629
+ const current = syncGet(fd);
16630
+ if (!saved.has(terminal)) saved.set(terminal, { fd, termios: current });
16631
+ syncSet(fd, rawOf(current));
16632
+ }
16633
+ };
16610
16634
  const modes = () => [...saved].reverse().map(([terminal, { fd, termios }]) => ({ terminal, fd, termios }));
16611
- return { tty, restore, modes };
16635
+ return { tty, syncTty, restore, modes };
16612
16636
  }
16613
16637
  var BRKINT, INPCK, ISTRIP, ICRNL, IXON, ONLCR, CS8, ISIG, ICANON2, ECHO2, IEXTEN, VTIME, VMIN;
16614
16638
  var init_js_tty = __esm({
@@ -16834,6 +16858,26 @@ var init_js_websocket = __esm({
16834
16858
  });
16835
16859
 
16836
16860
  // src/process/js/js-context.ts
16861
+ function fdList(list) {
16862
+ const fds = [...list ?? []];
16863
+ if (!fds.every((fd) => Number.isInteger(fd) && fd >= 0))
16864
+ throw new JsCallError("EINVAL", "select", "ERR_INVALID_ARG_VALUE: fds must be integers >= 0");
16865
+ return fds;
16866
+ }
16867
+ async function selectOp(kernel, sets, signal) {
16868
+ signal?.throwIfAborted();
16869
+ const read2 = fdList(sets.read);
16870
+ const write2 = fdList(sets.write);
16871
+ const timeoutMs2 = sets.timeoutMs ?? -1;
16872
+ if (!Number.isFinite(timeoutMs2))
16873
+ throw new JsCallError("EINVAL", "select", "ERR_INVALID_ARG_VALUE: timeoutMs");
16874
+ const r = await kernel.blocking(
16875
+ { op: "fd-select", read: read2, write: write2, timeoutMs: Math.max(-1, Math.floor(timeoutMs2)) },
16876
+ signal
16877
+ );
16878
+ const got = r.ok && r.kind === "json" ? r.json : {};
16879
+ return { read: got.read ?? [], write: got.write ?? [] };
16880
+ }
16837
16881
  function listen(listeners, listener) {
16838
16882
  const own = (error, promise) => listener(error, promise);
16839
16883
  listeners.add(own);
@@ -16923,7 +16967,17 @@ function writer(kernel, info, pid) {
16923
16967
  writes.delete(w);
16924
16968
  }
16925
16969
  };
16926
- return { writes, writeAll };
16970
+ const writeSome = async (fd, data) => {
16971
+ const i = await info(fd);
16972
+ if (writeDevice(i)) return data.length;
16973
+ const body = data.subarray(0, MAX_IO);
16974
+ const r = await kernel.raw({ op: "fd-write", fd, body, nonblock: true });
16975
+ if (r.ok) return written(r, body.length);
16976
+ if (brokenPipe(callError(r, "fd-write"), i))
16977
+ await kernel.call({ op: "proc-kill", pid, sig: SIG.PIPE });
16978
+ throw callError(r, "fd-write");
16979
+ };
16980
+ return { writes, writeAll, writeSome };
16927
16981
  }
16928
16982
  function readable2(read2) {
16929
16983
  return new ReadableStream(
@@ -17071,6 +17125,24 @@ function pendingReads(kernel, info, random) {
17071
17125
  };
17072
17126
  return { read: read2, closing };
17073
17127
  }
17128
+ function tracked2(pending, writeAll, writeSome) {
17129
+ return (fd, data, options) => {
17130
+ const bytes = typeof data === "string" ? encoder4.encode(data) : data;
17131
+ let settle;
17132
+ const settled2 = new Promise((resolve) => settle = resolve);
17133
+ pending.add(settled2);
17134
+ return (async () => {
17135
+ try {
17136
+ if (options?.nonblock === true) return await writeSome(fd, bytes);
17137
+ await writeAll(fd, bytes);
17138
+ return bytes.length;
17139
+ } finally {
17140
+ pending.delete(settled2);
17141
+ settle();
17142
+ }
17143
+ })();
17144
+ };
17145
+ }
17074
17146
  function createContext(o) {
17075
17147
  const { kernel } = o;
17076
17148
  const infos = /* @__PURE__ */ new Map();
@@ -17097,22 +17169,13 @@ function createContext(o) {
17097
17169
  return got;
17098
17170
  };
17099
17171
  const { read: read2, closing } = pendingReads(kernel, info, random);
17100
- const { writes, writeAll } = writer(kernel, info, o.pid);
17101
- const write2 = (fd, data) => {
17102
- const bytes = typeof data === "string" ? encoder4.encode(data) : data;
17103
- let settle;
17104
- const settled2 = new Promise((resolve2) => settle = resolve2);
17105
- pending.add(settled2);
17106
- return (async () => {
17107
- try {
17108
- await writeAll(fd, bytes);
17109
- } finally {
17110
- pending.delete(settled2);
17111
- settle();
17112
- }
17113
- })();
17114
- };
17115
- const writable2 = (fd) => new WritableStream({ write: (chunk) => write2(fd, chunk) });
17172
+ const { writes, writeAll, writeSome } = writer(kernel, info, o.pid);
17173
+ const write2 = tracked2(pending, writeAll, writeSome);
17174
+ const writable2 = (fd) => new WritableStream({
17175
+ write: async (chunk) => {
17176
+ await write2(fd, chunk);
17177
+ }
17178
+ });
17116
17179
  const statOf = async (op, path) => {
17117
17180
  const abs = resolve(path);
17118
17181
  if (inDev(abs)) return devAsync(kernel, devStat(abs, op === "stat"));
@@ -17138,10 +17201,11 @@ function createContext(o) {
17138
17201
  const lane = o.lane ?? laneOf(void 0);
17139
17202
  if (o.lane && o.lane !== noLane) kernel.syncLane = o.lane;
17140
17203
  const syncKernel = new JsSyncKernel(lane, kernel, unwind);
17141
- const terminal = ttyOps(kernel);
17204
+ const terminal = ttyOps(kernel, syncKernel);
17142
17205
  const shared = { pid: o.pid, resolve, random, infos, handles, closing };
17143
17206
  const sync = {
17144
17207
  kernel: KERNEL_INFO,
17208
+ tty: terminal.syncTty,
17145
17209
  ...watchingSyncOps(kernel, syncKernel, shared),
17146
17210
  run: (options) => runSync(syncKernel, { env: o.env, cwd: o.cwd, resolve, signal: signalNumber }, options),
17147
17211
  spawn: (options) => spawnSync(options),
@@ -17186,6 +17250,7 @@ function createContext(o) {
17186
17250
  },
17187
17251
  socketpair: async () => await kernel.json({ op: "sock-pair", domain: "unix", type: "stream" }),
17188
17252
  pipe: async () => await kernel.json({ op: "fd-pipe" }),
17253
+ select: (sets, options) => selectOp(kernel, sets, options?.signal),
17189
17254
  async fdStatus(fd) {
17190
17255
  const type = typeOf(await info(fd));
17191
17256
  return { type, tty: type === "tty", seekable: type === "file" };