@ai-ecoverse/slicc-kernel 1.88.0 → 1.88.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.
@@ -3850,7 +3850,7 @@ var KERNEL_VERSION, OS_RELEASE;
3850
3850
  var init_version = __esm({
3851
3851
  "src/version.ts"() {
3852
3852
  "use strict";
3853
- KERNEL_VERSION = true ? "1.88.0" : "0.0.0-dev";
3853
+ KERNEL_VERSION = true ? "1.88.1" : "0.0.0-dev";
3854
3854
  OS_RELEASE = "6.0.0-slicc";
3855
3855
  }
3856
3856
  });
package/dist/node.js CHANGED
@@ -6585,12 +6585,12 @@ async function interruptible(work, signal) {
6585
6585
  if (signal.aborted) throw new KernelError("EINTR");
6586
6586
  let stop = () => {
6587
6587
  };
6588
- const interrupted2 = new Promise((_, reject) => {
6588
+ const interrupted3 = new Promise((_, reject) => {
6589
6589
  stop = () => reject(new KernelError("EINTR"));
6590
6590
  signal.addEventListener("abort", stop, { once: true });
6591
6591
  });
6592
6592
  try {
6593
- return await Promise.race([work, interrupted2]);
6593
+ return await Promise.race([work, interrupted3]);
6594
6594
  } finally {
6595
6595
  signal.removeEventListener("abort", stop);
6596
6596
  }
@@ -7890,11 +7890,12 @@ var MountFs = class {
7890
7890
  });
7891
7891
  }
7892
7892
  async chmod(path, mode) {
7893
- const found = this.at(path);
7894
- if (!found) return this.base.chmod(path, mode);
7895
- this.writable(found.mount, normalizePath(path));
7893
+ const real = await this.follow(path);
7894
+ const found = this.at(real);
7895
+ if (!found) return this.base.chmod(real, mode);
7896
+ this.writable(found.mount, real);
7896
7897
  if (!found.mount.caps.chmod) return;
7897
- this.table.forget(found.mount, normalizePath(path));
7898
+ this.table.forget(found.mount, real);
7898
7899
  await found.mount.conn.call({ op: "setattr", path: found.rel, mode });
7899
7900
  }
7900
7901
  async utimes(path, atime, mtime) {
@@ -8938,7 +8939,7 @@ function mountTable(mounts = []) {
8938
8939
  }
8939
8940
 
8940
8941
  // src/version.ts
8941
- var KERNEL_VERSION = true ? "1.88.0" : "0.0.0-dev";
8942
+ var KERNEL_VERSION = true ? "1.88.1" : "0.0.0-dev";
8942
8943
  var OS_RELEASE = "6.0.0-slicc";
8943
8944
  function procVersion() {
8944
8945
  return `Linux version ${OS_RELEASE} (slicc-kernel ${KERNEL_VERSION}) #1 SMP PREEMPT_DYNAMIC
@@ -11826,16 +11827,16 @@ function interruption(signal) {
11826
11827
  }
11827
11828
  async function selectFds(fds, read, write, timeoutMs, interrupt) {
11828
11829
  const deadline = timeoutMs < 0 ? Number.POSITIVE_INFINITY : Date.now() + timeoutMs;
11829
- const interrupted2 = interruption(interrupt);
11830
- interrupted2.promise.catch(() => {
11830
+ const interrupted3 = interruption(interrupt);
11831
+ interrupted3.promise.catch(() => {
11831
11832
  });
11832
11833
  try {
11833
- return await waitReady(fds, read, write, deadline, interrupted2.promise);
11834
+ return await waitReady(fds, read, write, deadline, interrupted3.promise);
11834
11835
  } finally {
11835
- interrupted2.done();
11836
+ interrupted3.done();
11836
11837
  }
11837
11838
  }
11838
- async function waitReady(fds, read, write, deadline, interrupted2) {
11839
+ async function waitReady(fds, read, write, deadline, interrupted3) {
11839
11840
  for (; ; ) {
11840
11841
  const now = ready(fds, read, write);
11841
11842
  if (now.read.length > 0 || now.write.length > 0 || Date.now() >= deadline) return now;
@@ -11847,7 +11848,7 @@ async function waitReady(fds, read, write, deadline, interrupted2) {
11847
11848
  let timer;
11848
11849
  const expiry = deadline === Number.POSITIVE_INFINITY ? [] : [new Promise((resolve2) => timer = setTimeout(resolve2, deadline - Date.now()))];
11849
11850
  try {
11850
- await Promise.race([...changes, ...expiry, interrupted2]);
11851
+ await Promise.race([...changes, ...expiry, interrupted3]);
11851
11852
  } finally {
11852
11853
  round.abort();
11853
11854
  clearTimeout(timer);
@@ -14776,63 +14777,137 @@ function compile(secrets, options = {}) {
14776
14777
 
14777
14778
  // src/kernel/scrub-file.ts
14778
14779
  var SCRUB_IDLE_MS = 50;
14780
+ var SCRUB_NONBLOCK_MAX = 64 * 1024;
14779
14781
  var encoder5 = new TextEncoder();
14780
14782
  function scrubberOf(secrets) {
14781
14783
  const usable = secrets.filter((s) => encoder5.encode(s.value).length >= MIN_VALUE);
14782
14784
  return usable.length > 0 ? compile(usable, { idleMs: SCRUB_IDLE_MS }) : void 0;
14783
14785
  }
14784
- async function writeAll2(file, bytes, signal) {
14786
+ async function writeAll2(file, bytes) {
14785
14787
  const write = file.write;
14786
- for (let at = 0; at < bytes.length; ) {
14787
- at += await write.call(file, bytes.subarray(at), at === 0 ? signal : void 0);
14788
- }
14788
+ for (let at = 0; at < bytes.length; ) at += await write.call(file, bytes.subarray(at));
14789
14789
  }
14790
14790
  function bound(file, key) {
14791
14791
  const method = file[key];
14792
14792
  return typeof method === "function" ? { [key]: method.bind(file) } : {};
14793
14793
  }
14794
+ function interrupted2(err) {
14795
+ const code = err?.code;
14796
+ return code === "EINTR" || code === "EAGAIN";
14797
+ }
14794
14798
  function scrubbed(inner, scrubber, idleMs = SCRUB_IDLE_MS) {
14795
14799
  const file = inner.file;
14796
14800
  const stream2 = scrubber.stream();
14797
- let queue = Promise.resolve();
14801
+ let tail = Promise.resolve();
14802
+ let pending = 0;
14803
+ let busy = false;
14798
14804
  let timer;
14799
14805
  let failed3;
14806
+ const waiters = /* @__PURE__ */ new Set();
14807
+ const quiet2 = () => !busy && pending === 0;
14808
+ const wake = () => {
14809
+ for (const waiter of [...waiters]) waiter();
14810
+ };
14800
14811
  const raise = () => {
14801
14812
  if (failed3 === void 0) return;
14802
14813
  const err = failed3;
14803
14814
  failed3 = void 0;
14804
14815
  throw err;
14805
14816
  };
14806
- const enqueue = (bytes, signal) => {
14807
- const next2 = queue.then(() => bytes.length > 0 ? writeAll2(file, bytes, signal) : void 0);
14808
- queue = next2.catch(() => void 0);
14809
- return next2;
14817
+ const later = (bytes) => {
14818
+ if (bytes.length === 0) return;
14819
+ pending += 1;
14820
+ tail = tail.then(() => writeAll2(file, bytes)).catch((err) => {
14821
+ if (failed3 === void 0) failed3 = err;
14822
+ }).finally(() => {
14823
+ pending -= 1;
14824
+ if (quiet2()) wake();
14825
+ });
14826
+ };
14827
+ const settling = (signal) => new Promise((resolve2, reject) => {
14828
+ const done4 = () => {
14829
+ waiters.delete(done4);
14830
+ signal?.removeEventListener("abort", stop);
14831
+ resolve2();
14832
+ };
14833
+ const stop = () => {
14834
+ waiters.delete(done4);
14835
+ reject(new KernelError("EINTR"));
14836
+ };
14837
+ if (signal?.aborted) return stop();
14838
+ waiters.add(done4);
14839
+ signal?.addEventListener("abort", stop, { once: true });
14840
+ });
14841
+ const settled = async () => {
14842
+ while (!quiet2()) await settling();
14843
+ };
14844
+ const changed = async (signal) => {
14845
+ const round = new AbortController();
14846
+ const stop = signal ? AbortSignal.any([signal, round.signal]) : round.signal;
14847
+ try {
14848
+ const own = settling(stop);
14849
+ await Promise.race(file.changed ? [own, file.changed(stop)] : [own]);
14850
+ } catch (err) {
14851
+ throw signal?.aborted ? new KernelError("EINTR") : err;
14852
+ } finally {
14853
+ round.abort();
14854
+ }
14855
+ };
14856
+ const turn = async (signal) => {
14857
+ for (let waited = false; ; waited = true) {
14858
+ if (quiet2() && (pollFile(file).writable || !file.changed)) {
14859
+ busy = true;
14860
+ return;
14861
+ }
14862
+ if (signal?.aborted) throw new KernelError(waited ? "EINTR" : "EAGAIN");
14863
+ await changed(signal);
14864
+ }
14865
+ };
14866
+ const send = async (out, signal) => {
14867
+ const write = file.write;
14868
+ for (let at = 0; at < out.length; ) {
14869
+ try {
14870
+ at += await write.call(file, out.subarray(at), signal);
14871
+ } catch (err) {
14872
+ if (!signal?.aborted || !interrupted2(err)) throw err;
14873
+ }
14874
+ if (at < out.length && signal?.aborted) return later(out.subarray(at));
14875
+ }
14810
14876
  };
14811
14877
  const release = () => {
14812
14878
  timer = void 0;
14813
- enqueue(stream2.idle()).catch((err) => {
14814
- failed3 = err;
14815
- });
14879
+ later(stream2.idle());
14816
14880
  };
14817
14881
  return new OpenFile({
14818
14882
  ...bound(file, "read"),
14819
14883
  ...bound(file, "peek"),
14820
- ...bound(file, "poll"),
14821
- ...bound(file, "changed"),
14822
14884
  ...bound(file, "stat"),
14885
+ poll: () => {
14886
+ const state = pollFile(file);
14887
+ return quiet2() ? state : { ...state, writable: false };
14888
+ },
14889
+ changed,
14823
14890
  ...file.tty ? { tty: file.tty } : {},
14824
14891
  ...file.clipboard ? { clipboard: file.clipboard } : {},
14825
14892
  ...file.write ? {
14826
14893
  write: async (bytes, signal) => {
14827
- if (timer !== void 0) clearTimeout(timer);
14828
- raise();
14829
- await enqueue(stream2.push(bytes), signal);
14894
+ await turn(signal);
14895
+ const taken = signal?.aborted && bytes.length > SCRUB_NONBLOCK_MAX ? bytes.subarray(0, SCRUB_NONBLOCK_MAX) : bytes;
14896
+ try {
14897
+ raise();
14898
+ if (timer !== void 0) clearTimeout(timer);
14899
+ timer = void 0;
14900
+ await send(stream2.push(taken), signal);
14901
+ } finally {
14902
+ busy = false;
14903
+ if (quiet2()) wake();
14904
+ }
14830
14905
  timer = setTimeout(release, idleMs);
14831
- return bytes.length;
14906
+ return taken.length;
14832
14907
  }
14833
14908
  } : {},
14834
14909
  flush: async () => {
14835
- await queue;
14910
+ await settled();
14836
14911
  raise();
14837
14912
  await file.flush?.();
14838
14913
  },
@@ -14840,7 +14915,9 @@ function scrubbed(inner, scrubber, idleMs = SCRUB_IDLE_MS) {
14840
14915
  if (timer !== void 0) clearTimeout(timer);
14841
14916
  let failure;
14842
14917
  try {
14843
- await enqueue(stream2.end());
14918
+ await settled();
14919
+ later(stream2.end());
14920
+ await settled();
14844
14921
  raise();
14845
14922
  } catch (err) {
14846
14923
  failure = { err };
@@ -15016,12 +15093,12 @@ var SealedChannel = class {
15016
15093
  if (signal.aborted) throw new KernelError("EINTR");
15017
15094
  let stop = () => {
15018
15095
  };
15019
- const interrupted2 = new Promise((_, reject) => {
15096
+ const interrupted3 = new Promise((_, reject) => {
15020
15097
  stop = () => reject(new KernelError("EINTR"));
15021
15098
  signal.addEventListener("abort", stop, { once: true });
15022
15099
  });
15023
15100
  try {
15024
- await Promise.race([flight.done, interrupted2]);
15101
+ await Promise.race([flight.done, interrupted3]);
15025
15102
  } finally {
15026
15103
  signal.removeEventListener("abort", stop);
15027
15104
  }
@@ -18087,11 +18164,9 @@ var Launcher = class {
18087
18164
  groupSession(pgid) {
18088
18165
  return this.jobs.sessionOf(pgid);
18089
18166
  }
18090
- treeScrubs(pid, req) {
18167
+ treeScrubs(req) {
18091
18168
  const inherited2 = req.ppid !== void 0 ? this.scrubs.get(req.ppid) : void 0;
18092
- const scrubs = req.scrub ? [...inherited2 ?? [], req.scrub] : inherited2;
18093
- if (scrubs) this.scrubs.set(pid, scrubs);
18094
- return scrubs;
18169
+ return req.scrub ? [...inherited2 ?? [], req.scrub] : inherited2;
18095
18170
  }
18096
18171
  start(req) {
18097
18172
  this.sampling();
@@ -18099,7 +18174,7 @@ var Launcher = class {
18099
18174
  throw new SpawnError("ESRCH");
18100
18175
  }
18101
18176
  const pid = req.pid ?? this.nextPid++;
18102
- const scrubs = this.treeScrubs(pid, req);
18177
+ const scrubs = this.treeScrubs(req);
18103
18178
  const stack = this.stackFor(req.tag);
18104
18179
  const terminal = req.fds.stdioTerminal();
18105
18180
  const decided = req.decided ?? Promise.resolve(true);
@@ -18169,6 +18244,7 @@ var Launcher = class {
18169
18244
  ...this.shownIds(req)
18170
18245
  });
18171
18246
  this.processes.set(pid, handle);
18247
+ if (scrubs) this.scrubs.set(pid, scrubs);
18172
18248
  const { cred } = req;
18173
18249
  this.creds.set(pid, () => handle.cred?.() ?? copyCred(cred));
18174
18250
  if (req.tag !== void 0) this.tags.set(pid, req.tag);