@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.
@@ -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.109.0" : "0.0.0-dev";
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 handle.getFile();
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 chosen = protocol ? `Sec-WebSocket-Protocol: ${protocol}\r
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
- ${chosen}\r
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.109.0" : "0.0.0-dev";
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(planned, req) {
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 } = {}) {