@ai-ecoverse/slicc-kernel 1.109.0 → 1.110.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 +21 -3
- package/dist/kernel-worker.js +100 -15
- package/dist/kernel-worker.js.map +3 -3
- package/dist/node-process-worker.js +1 -1
- package/dist/node.js +101 -15
- package/dist/node.js.map +3 -3
- package/dist/process-worker.js +1 -1
- package/dist/types/commands.d.ts +6 -0
- package/dist/types/cron/command.d.ts +1 -1
- package/dist/types/fs/opfs.d.ts +5 -0
- package/dist/types/launcher.d.ts +2 -1
- package/package.json +1 -6
|
@@ -5204,7 +5204,7 @@ var KERNEL_VERSION, OS_RELEASE;
|
|
|
5204
5204
|
var init_version = __esm({
|
|
5205
5205
|
"src/version.ts"() {
|
|
5206
5206
|
"use strict";
|
|
5207
|
-
KERNEL_VERSION = true ? "1.
|
|
5207
|
+
KERNEL_VERSION = true ? "1.110.1" : "0.0.0-dev";
|
|
5208
5208
|
OS_RELEASE = "6.0.0-slicc";
|
|
5209
5209
|
}
|
|
5210
5210
|
});
|
package/dist/node.js
CHANGED
|
@@ -4083,6 +4083,8 @@ var S_ISGID3 = 1024;
|
|
|
4083
4083
|
var READ_ATTEMPTS = 3;
|
|
4084
4084
|
var MAX_LINKS5 = 40;
|
|
4085
4085
|
var CHECK_MS = 1e3;
|
|
4086
|
+
var FILE_HANDLES = 4096;
|
|
4087
|
+
var STALE = /* @__PURE__ */ new Set(["NotFoundError", "TypeMismatchError"]);
|
|
4086
4088
|
var EXECUTABLE = /\/node_modules\/(?:@[^/]+\/)?[^/]+\/bin\//;
|
|
4087
4089
|
var ERRNO_BY_DOM_ERROR = {
|
|
4088
4090
|
NotFoundError: "ENOENT",
|
|
@@ -4204,6 +4206,9 @@ var OpfsFs = class {
|
|
|
4204
4206
|
root;
|
|
4205
4207
|
meta;
|
|
4206
4208
|
dirs = new PathMap();
|
|
4209
|
+
files = new PathMap();
|
|
4210
|
+
snapshots = /* @__PURE__ */ new WeakMap();
|
|
4211
|
+
found = /* @__PURE__ */ new WeakMap();
|
|
4207
4212
|
checked = /* @__PURE__ */ new WeakMap();
|
|
4208
4213
|
channel;
|
|
4209
4214
|
remote;
|
|
@@ -4441,6 +4446,19 @@ var OpfsFs = class {
|
|
|
4441
4446
|
}
|
|
4442
4447
|
forget(path) {
|
|
4443
4448
|
this.dirs.deleteTree(path);
|
|
4449
|
+
this.files.deleteTree(path);
|
|
4450
|
+
}
|
|
4451
|
+
remember(path, handle, looked = false) {
|
|
4452
|
+
if (handle.kind !== "file") return handle;
|
|
4453
|
+
if (looked) {
|
|
4454
|
+
this.found.set(handle, performance.now());
|
|
4455
|
+
this.snapshots.delete(handle);
|
|
4456
|
+
}
|
|
4457
|
+
this.files.delete(path);
|
|
4458
|
+
if (this.files.size >= FILE_HANDLES)
|
|
4459
|
+
this.files.delete(this.files.keys().next().value);
|
|
4460
|
+
this.files.set(path, handle);
|
|
4461
|
+
return handle;
|
|
4444
4462
|
}
|
|
4445
4463
|
async inDir(path, op) {
|
|
4446
4464
|
const dir = await this.dir(path);
|
|
@@ -4464,16 +4482,30 @@ var OpfsFs = class {
|
|
|
4464
4482
|
}
|
|
4465
4483
|
async handle(path) {
|
|
4466
4484
|
if (split(path).length === 0) return this.root;
|
|
4485
|
+
const cached = this.files.get(path);
|
|
4486
|
+
const fresh2 = cached && performance.now() - (this.found.get(cached) ?? -CHECK_MS) < CHECK_MS;
|
|
4487
|
+
if (cached && !fresh2) this.files.delete(path);
|
|
4488
|
+
if (cached && fresh2) {
|
|
4489
|
+
try {
|
|
4490
|
+
this.snapshots.set(cached, await cached.getFile());
|
|
4491
|
+
return this.remember(path, cached);
|
|
4492
|
+
} catch (err) {
|
|
4493
|
+
if (!STALE.has(err?.name))
|
|
4494
|
+
throw translate(err, path, "read");
|
|
4495
|
+
this.files.delete(path);
|
|
4496
|
+
this.snapshots.delete(cached);
|
|
4497
|
+
}
|
|
4498
|
+
}
|
|
4467
4499
|
const [dir, name2] = await this.parent(path);
|
|
4468
4500
|
const known = this.dirs.has(path);
|
|
4469
4501
|
return this.inDir(dir, async (parent) => {
|
|
4470
4502
|
const [first, second] = known ? ["directory", "file"] : ["file", "directory"];
|
|
4471
4503
|
try {
|
|
4472
|
-
return await this.child(parent, name2, first);
|
|
4504
|
+
return this.remember(path, await this.child(parent, name2, first), true);
|
|
4473
4505
|
} catch (err) {
|
|
4474
4506
|
if (err?.name !== "TypeMismatchError") throw err;
|
|
4475
4507
|
}
|
|
4476
|
-
return this.child(parent, name2, second);
|
|
4508
|
+
return this.remember(path, await this.child(parent, name2, second), true);
|
|
4477
4509
|
}).catch((err) => {
|
|
4478
4510
|
throw translate(err, path);
|
|
4479
4511
|
});
|
|
@@ -4616,9 +4648,15 @@ var OpfsFs = class {
|
|
|
4616
4648
|
if (this.dirTimes.get(path) === ms) this.dirTimes.delete(path);
|
|
4617
4649
|
}
|
|
4618
4650
|
}
|
|
4651
|
+
async snapshot(handle) {
|
|
4652
|
+
const taken = this.snapshots.get(handle);
|
|
4653
|
+
if (!taken) return handle.getFile();
|
|
4654
|
+
this.snapshots.delete(handle);
|
|
4655
|
+
return taken;
|
|
4656
|
+
}
|
|
4619
4657
|
async statOf(path, handle, meta, touched) {
|
|
4620
4658
|
const directory = handle.kind === "directory";
|
|
4621
|
-
const file = directory ? void 0 : await
|
|
4659
|
+
const file = directory ? void 0 : await this.snapshot(handle);
|
|
4622
4660
|
const modified = file?.lastModified ?? 0;
|
|
4623
4661
|
const kept = meta?.mtimeMs !== void 0 && meta.mtimeFor === modified ? meta.mtimeMs : modified;
|
|
4624
4662
|
const mtime = touched ?? kept;
|
|
@@ -5975,14 +6013,14 @@ var WsReader = class {
|
|
|
5975
6013
|
}
|
|
5976
6014
|
};
|
|
5977
6015
|
function switchingHead(accept2, protocol = "") {
|
|
5978
|
-
const
|
|
6016
|
+
const chosen2 = protocol ? `Sec-WebSocket-Protocol: ${protocol}\r
|
|
5979
6017
|
` : "";
|
|
5980
6018
|
return latin1Bytes(
|
|
5981
6019
|
`HTTP/1.1 101 Switching Protocols\r
|
|
5982
6020
|
Upgrade: websocket\r
|
|
5983
6021
|
Connection: Upgrade\r
|
|
5984
6022
|
Sec-WebSocket-Accept: ${accept2}\r
|
|
5985
|
-
${
|
|
6023
|
+
${chosen2}\r
|
|
5986
6024
|
`
|
|
5987
6025
|
);
|
|
5988
6026
|
}
|
|
@@ -6435,7 +6473,7 @@ function satisfies(version, range2) {
|
|
|
6435
6473
|
}
|
|
6436
6474
|
|
|
6437
6475
|
// src/version.ts
|
|
6438
|
-
var KERNEL_VERSION = true ? "1.
|
|
6476
|
+
var KERNEL_VERSION = true ? "1.110.1" : "0.0.0-dev";
|
|
6439
6477
|
var OS_RELEASE = "6.0.0-slicc";
|
|
6440
6478
|
function procVersion() {
|
|
6441
6479
|
return `Linux version ${OS_RELEASE} (slicc-kernel ${KERNEL_VERSION}) #1 SMP PREEMPT_DYNAMIC
|
|
@@ -6483,6 +6521,37 @@ function argsOf(pkg, raw) {
|
|
|
6483
6521
|
if (!raw.every((arg) => typeof arg === "string")) return void 0;
|
|
6484
6522
|
return raw.map((arg) => arg.replace(PACKAGE, pkg));
|
|
6485
6523
|
}
|
|
6524
|
+
var warnedVariants = /* @__PURE__ */ new Set();
|
|
6525
|
+
function variantOf(pkg, raw) {
|
|
6526
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return void 0;
|
|
6527
|
+
const { env, wasm } = raw;
|
|
6528
|
+
const path = inside(pkg, wasm);
|
|
6529
|
+
if (!path || !env || typeof env !== "object" || Array.isArray(env)) return void 0;
|
|
6530
|
+
const pairs = Object.entries(env);
|
|
6531
|
+
if (pairs.length === 0) return void 0;
|
|
6532
|
+
if (!pairs.every(([key, value2]) => ENV_KEY.test(key) && typeof value2 === "string")) {
|
|
6533
|
+
return void 0;
|
|
6534
|
+
}
|
|
6535
|
+
return { env: Object.fromEntries(pairs), wasm: path };
|
|
6536
|
+
}
|
|
6537
|
+
function variantsOf(pkg, name2, raw) {
|
|
6538
|
+
if (raw === void 0) return void 0;
|
|
6539
|
+
const variants = Array.isArray(raw) ? raw.map((one) => variantOf(pkg, one)) : [void 0];
|
|
6540
|
+
if (variants.every((one) => one !== void 0)) {
|
|
6541
|
+
return variants.length > 0 ? variants : void 0;
|
|
6542
|
+
}
|
|
6543
|
+
const key = `${pkg}:${name2}:${JSON.stringify(raw)}`;
|
|
6544
|
+
if (!warnedVariants.has(key)) {
|
|
6545
|
+
warnedVariants.add(key);
|
|
6546
|
+
console.warn(`slicc-kernel: ${pkg}: ${name2}: ignoring malformed "variants", running its wasm`);
|
|
6547
|
+
}
|
|
6548
|
+
return void 0;
|
|
6549
|
+
}
|
|
6550
|
+
function variantFor(variants, env) {
|
|
6551
|
+
return variants?.find(
|
|
6552
|
+
(one) => Object.entries(one.env).every(([key, value2]) => env[key] === value2)
|
|
6553
|
+
)?.wasm;
|
|
6554
|
+
}
|
|
6486
6555
|
function abiOf(raw, fallback) {
|
|
6487
6556
|
const abi = raw ?? fallback;
|
|
6488
6557
|
return abi === "emscripten" || abi === "wasi" || abi === "js" ? abi : void 0;
|
|
@@ -6516,6 +6585,7 @@ function commandOf(pkg, name2, raw, packageAbi, shared) {
|
|
|
6516
6585
|
const glue = abi === "wasi" ? wasm : inside(pkg, raw.glue);
|
|
6517
6586
|
if (!abi || !glue || !wasm) return void 0;
|
|
6518
6587
|
const imports = abi === "wasi" ? inside(pkg, raw.imports) : void 0;
|
|
6588
|
+
const variants = variantsOf(pkg, name2, raw.variants);
|
|
6519
6589
|
return {
|
|
6520
6590
|
name: name2,
|
|
6521
6591
|
abi,
|
|
@@ -6527,7 +6597,8 @@ function commandOf(pkg, name2, raw, packageAbi, shared) {
|
|
|
6527
6597
|
...abi === "wasi" && raw.preopenRoot === true ? { preopenRoot: true } : {},
|
|
6528
6598
|
...args ? { args } : {},
|
|
6529
6599
|
...withEnv,
|
|
6530
|
-
...imports ? { imports } : {}
|
|
6600
|
+
...imports ? { imports } : {},
|
|
6601
|
+
...variants ? { variants } : {}
|
|
6531
6602
|
};
|
|
6532
6603
|
}
|
|
6533
6604
|
function commandsOf(pkg, manifest) {
|
|
@@ -6847,13 +6918,14 @@ var CRONTAB_SOURCE = `export default async function crontab(ctx) {
|
|
|
6847
6918
|
let text;
|
|
6848
6919
|
try {
|
|
6849
6920
|
if (file === "-") {
|
|
6921
|
+
const stream = new TextDecoder();
|
|
6850
6922
|
const parts = [];
|
|
6851
6923
|
for (;;) {
|
|
6852
6924
|
const chunk = await ctx.read(0);
|
|
6853
6925
|
if (chunk.length === 0) break;
|
|
6854
|
-
parts.push(decode(chunk));
|
|
6926
|
+
parts.push(stream.decode(chunk, { stream: true }));
|
|
6855
6927
|
}
|
|
6856
|
-
text = parts.join("");
|
|
6928
|
+
text = parts.join("") + stream.decode();
|
|
6857
6929
|
} else text = decode(await ctx.fs.readFile(ctx.resolve(file)));
|
|
6858
6930
|
} catch (err) {
|
|
6859
6931
|
await say(2, "crontab: " + file + ": " + (err && err.code ? err.code : String(err)) + "\\n");
|
|
@@ -7399,7 +7471,10 @@ var CronService = class {
|
|
|
7399
7471
|
const account = await this.host.lookup(job.user);
|
|
7400
7472
|
if (account) out.push({ source: "system", account, job });
|
|
7401
7473
|
}
|
|
7402
|
-
const names = await fs.readdir(SPOOL_DIR).catch(() =>
|
|
7474
|
+
const names = await fs.readdir(SPOOL_DIR).catch((err) => {
|
|
7475
|
+
if (err?.code === "ENOENT") return [];
|
|
7476
|
+
throw err;
|
|
7477
|
+
});
|
|
7403
7478
|
for (const name2 of names.sort()) {
|
|
7404
7479
|
if (name2.startsWith(".") || name2.endsWith("~")) continue;
|
|
7405
7480
|
const path = `${SPOOL_DIR}/${name2}`;
|
|
@@ -21991,9 +22066,18 @@ function targetOf(command) {
|
|
|
21991
22066
|
...command.env ? { env: command.env } : {},
|
|
21992
22067
|
...command.unset ? { unset: command.unset } : {},
|
|
21993
22068
|
...command.imports ? { imports: command.imports } : {},
|
|
21994
|
-
...command.preopenRoot ? { preopenRoot: true } : {}
|
|
22069
|
+
...command.preopenRoot ? { preopenRoot: true } : {},
|
|
22070
|
+
...command.variants ? { variants: command.variants } : {}
|
|
21995
22071
|
};
|
|
21996
22072
|
}
|
|
22073
|
+
function chosen(planned, env) {
|
|
22074
|
+
const { target } = planned;
|
|
22075
|
+
const wasm = variantFor(target.variants, env);
|
|
22076
|
+
if (wasm === void 0) return planned;
|
|
22077
|
+
const { asked: _asked, ...rest2 } = target;
|
|
22078
|
+
const glue = target.abi === "wasi" ? wasm : target.glue;
|
|
22079
|
+
return { ...planned, target: { ...rest2, wasm, glue } };
|
|
22080
|
+
}
|
|
21997
22081
|
function withScriptEnv(target, command) {
|
|
21998
22082
|
if (!command) return target;
|
|
21999
22083
|
return {
|
|
@@ -22904,14 +22988,15 @@ var Launcher = class {
|
|
|
22904
22988
|
...target.preopenRoot ? { preopenRoot: true } : {}
|
|
22905
22989
|
};
|
|
22906
22990
|
}
|
|
22907
|
-
async launch(
|
|
22908
|
-
const { target, args } = planned;
|
|
22991
|
+
async launch(asked, req) {
|
|
22909
22992
|
const cwd = await physicalPathAsync(this.base, req.cwd);
|
|
22910
22993
|
const seen = { ...req.env, HOSTNAME: this.hostname, cwd };
|
|
22911
|
-
const env = { ...expandDefaults(target.env, seen), ...req.env };
|
|
22912
|
-
for (const key of target.unset ?? []) delete env[key];
|
|
22994
|
+
const env = { ...expandDefaults(asked.target.env, seen), ...req.env };
|
|
22995
|
+
for (const key of asked.target.unset ?? []) delete env[key];
|
|
22913
22996
|
delete env[TICKET_ENV];
|
|
22914
22997
|
env.HOSTNAME = this.hostname;
|
|
22998
|
+
const planned = chosen(asked, env);
|
|
22999
|
+
const { target, args } = planned;
|
|
22915
23000
|
let program;
|
|
22916
23001
|
await this.pnpmReady();
|
|
22917
23002
|
try {
|
|
@@ -24288,6 +24373,7 @@ var MemoryFile = class {
|
|
|
24288
24373
|
this.parent = parent;
|
|
24289
24374
|
}
|
|
24290
24375
|
async getFile() {
|
|
24376
|
+
if (this.parent.removed || this.parent.children.get(this.name) !== this) fail2("NotFoundError");
|
|
24291
24377
|
return new File(this.data.blobs, this.name, { lastModified: this.lastModified });
|
|
24292
24378
|
}
|
|
24293
24379
|
async createWritable({ keepExistingData = false } = {}) {
|