@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.
- package/README.md +1 -1
- package/dist/kernel-worker.js +116 -40
- package/dist/kernel-worker.js.map +3 -3
- package/dist/node-process-worker.js +1 -1
- package/dist/node.js +116 -40
- package/dist/node.js.map +3 -3
- package/dist/process-worker.js +1 -1
- package/package.json +1 -1
|
@@ -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.
|
|
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
|
|
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,
|
|
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
|
|
7894
|
-
|
|
7895
|
-
this.
|
|
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,
|
|
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.
|
|
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
|
|
11830
|
-
|
|
11830
|
+
const interrupted3 = interruption(interrupt);
|
|
11831
|
+
interrupted3.promise.catch(() => {
|
|
11831
11832
|
});
|
|
11832
11833
|
try {
|
|
11833
|
-
return await waitReady(fds, read, write, deadline,
|
|
11834
|
+
return await waitReady(fds, read, write, deadline, interrupted3.promise);
|
|
11834
11835
|
} finally {
|
|
11835
|
-
|
|
11836
|
+
interrupted3.done();
|
|
11836
11837
|
}
|
|
11837
11838
|
}
|
|
11838
|
-
async function waitReady(fds, read, write, deadline,
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
14807
|
-
|
|
14808
|
-
|
|
14809
|
-
|
|
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
|
-
|
|
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
|
-
|
|
14828
|
-
|
|
14829
|
-
|
|
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
|
|
14906
|
+
return taken.length;
|
|
14832
14907
|
}
|
|
14833
14908
|
} : {},
|
|
14834
14909
|
flush: async () => {
|
|
14835
|
-
await
|
|
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
|
|
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
|
|
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,
|
|
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(
|
|
18167
|
+
treeScrubs(req) {
|
|
18091
18168
|
const inherited2 = req.ppid !== void 0 ? this.scrubs.get(req.ppid) : void 0;
|
|
18092
|
-
|
|
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(
|
|
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);
|