@ai-ecoverse/slicc-kernel 1.103.1 → 1.103.3

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.
@@ -563,6 +563,84 @@ var init_ranged = __esm({
563
563
  }
564
564
  });
565
565
 
566
+ // src/realm/sync-fs-wire.ts
567
+ function parseSyncFsUsage(json2) {
568
+ const u = json2;
569
+ if (!u || typeof u.quota !== "number" || typeof u.usage !== "number") return null;
570
+ return { quota: u.quota, usage: u.usage };
571
+ }
572
+ function syncError(code2, label) {
573
+ return Object.assign(new Error(`${code2}: ${label}`), { code: code2 });
574
+ }
575
+ function parseSyncFsStat(json2) {
576
+ const s = json2;
577
+ if (!s || typeof s.isFile !== "boolean" || typeof s.isDirectory !== "boolean" || typeof s.size !== "number") {
578
+ return null;
579
+ }
580
+ return {
581
+ isFile: s.isFile,
582
+ isDirectory: s.isDirectory,
583
+ isSymbolicLink: s.isSymbolicLink,
584
+ ...s.isSocket === true ? { isSocket: true } : {},
585
+ size: s.size,
586
+ ...typeof s.mode === "number" ? { mode: s.mode } : {},
587
+ ...typeof s.mtimeMs === "number" ? { mtimeMs: s.mtimeMs } : {},
588
+ ...typeof s.atimeMs === "number" ? { atimeMs: s.atimeMs } : {},
589
+ ...typeof s.ctimeMs === "number" ? { ctimeMs: s.ctimeMs } : {},
590
+ ...typeof s.ino === "number" ? { ino: s.ino } : {},
591
+ ...typeof s.nlink === "number" ? { nlink: s.nlink } : {},
592
+ ...typeof s.dev === "number" ? { dev: s.dev } : {},
593
+ ...s.readonly === true ? { readonly: true } : {},
594
+ ...typeof s.maxFile === "number" ? { maxFile: s.maxFile } : {},
595
+ ...s.ranged === true ? { ranged: true } : {},
596
+ ...s.linkable === true ? { linkable: true } : {},
597
+ ...typeof s.version === "string" ? { version: s.version } : {},
598
+ ...typeof s.uid === "number" ? { uid: s.uid } : {},
599
+ ...typeof s.gid === "number" ? { gid: s.gid } : {}
600
+ };
601
+ }
602
+ var SYNC_FS_OPS, HOLD_READ, HOLD_WRITE, HOLD_CREATED, SYNC_FS_REQUEST_TIMEOUT_MS;
603
+ var init_sync_fs_wire = __esm({
604
+ "src/realm/sync-fs-wire.ts"() {
605
+ "use strict";
606
+ SYNC_FS_OPS = [
607
+ "read",
608
+ "write",
609
+ "exists",
610
+ "stat",
611
+ "lstat",
612
+ "readdir",
613
+ "readdir-stat",
614
+ "mkdir",
615
+ "rm",
616
+ "rename",
617
+ "link",
618
+ "unlink",
619
+ "rmdir",
620
+ "symlink",
621
+ "readlink",
622
+ "chmod",
623
+ "utimes",
624
+ "lutimes",
625
+ "statfs",
626
+ "hold",
627
+ "create",
628
+ "kept",
629
+ "pread",
630
+ "pwrite",
631
+ "append",
632
+ "truncate",
633
+ "chown",
634
+ "lchown",
635
+ "access"
636
+ ];
637
+ HOLD_READ = 4;
638
+ HOLD_WRITE = 8;
639
+ HOLD_CREATED = 16;
640
+ SYNC_FS_REQUEST_TIMEOUT_MS = 25e3;
641
+ }
642
+ });
643
+
566
644
  // src/process/wasi/wasi-files.ts
567
645
  function normalize(path) {
568
646
  const out = [];
@@ -653,15 +731,37 @@ function cachingBridge(bridge, now = () => performance.now(), shared) {
653
731
  const blind = shared !== void 0 && shared.length * 4 < SHARED_IDS_BYTES;
654
732
  const cache = new StatCache(blind ? void 0 : shared);
655
733
  const { stats, lstats } = cache;
734
+ const view = bridge.changes;
735
+ const live = (miss, path) => miss.until > now() && (view === void 0 || miss.gen === void 0 || !view.changedSince(miss.gen, path).changed);
736
+ const seenAt = /* @__PURE__ */ new Map();
737
+ const gone = (path) => {
738
+ for (let at = path.lastIndexOf("/"); at > 0; at = path.lastIndexOf("/", at - 1)) {
739
+ const up = path.slice(0, at);
740
+ for (const map of [lstats, stats]) {
741
+ const hit = map.get(up);
742
+ const code2 = hit && "until" in hit ? hit.error.code : void 0;
743
+ if (hit && "until" in hit && code2 === "ENOENT" && live(hit, up)) return hit;
744
+ }
745
+ }
746
+ return void 0;
747
+ };
656
748
  const cached = (map, path, get) => {
657
749
  if (blind) return get();
658
750
  cache.fresh();
659
751
  let hit = map.get(path);
660
- if (hit === void 0 || "until" in hit && hit.until <= now()) {
752
+ if (hit === void 0 || "until" in hit && !live(hit, path)) {
753
+ const missing2 = gone(path);
754
+ if (missing2) throw missing2.error;
755
+ const gen = view?.now();
661
756
  try {
662
757
  hit = get();
758
+ if (gen !== void 0 && map === lstats) seenAt.set(path, gen);
663
759
  } catch (e) {
664
- hit = { error: e, until: now() + MISS_TTL_MS };
760
+ hit = {
761
+ error: e,
762
+ until: now() + MISS_TTL_MS,
763
+ ...gen !== void 0 ? { gen } : {}
764
+ };
665
765
  }
666
766
  cache.put(map, path, hit);
667
767
  }
@@ -717,7 +817,15 @@ function cachingBridge(bridge, now = () => performance.now(), shared) {
717
817
  }
718
818
  return list;
719
819
  },
720
- readlink: (p) => bridge.readlink(p),
820
+ readlink: (p) => {
821
+ const known = blind ? void 0 : (cache.fresh(), lstats.get(p));
822
+ const gen = seenAt.get(p);
823
+ const current = view !== void 0 && gen !== void 0 && !view.changedSince(gen, p).changed;
824
+ if (known && current && !("until" in known) && !known.isSymbolicLink) {
825
+ throw syncError("EINVAL", `'${p}' is not a symbolic link`);
826
+ }
827
+ return bridge.readlink(p);
828
+ },
721
829
  stat: (p) => cached(stats, p, () => bridge.stat(p)),
722
830
  lstat: (p) => cached(lstats, p, () => bridge.lstat(p)),
723
831
  exists: (p) => {
@@ -784,6 +892,7 @@ var init_wasi_files = __esm({
784
892
  "src/process/wasi/wasi-files.ts"() {
785
893
  "use strict";
786
894
  init_ranged();
895
+ init_sync_fs_wire();
787
896
  WasiError = class extends Error {
788
897
  code;
789
898
  constructor(code2) {
@@ -1631,84 +1740,6 @@ var init_fd_table = __esm({
1631
1740
  }
1632
1741
  });
1633
1742
 
1634
- // src/realm/sync-fs-wire.ts
1635
- function parseSyncFsUsage(json2) {
1636
- const u = json2;
1637
- if (!u || typeof u.quota !== "number" || typeof u.usage !== "number") return null;
1638
- return { quota: u.quota, usage: u.usage };
1639
- }
1640
- function syncError(code2, label) {
1641
- return Object.assign(new Error(`${code2}: ${label}`), { code: code2 });
1642
- }
1643
- function parseSyncFsStat(json2) {
1644
- const s = json2;
1645
- if (!s || typeof s.isFile !== "boolean" || typeof s.isDirectory !== "boolean" || typeof s.size !== "number") {
1646
- return null;
1647
- }
1648
- return {
1649
- isFile: s.isFile,
1650
- isDirectory: s.isDirectory,
1651
- isSymbolicLink: s.isSymbolicLink,
1652
- ...s.isSocket === true ? { isSocket: true } : {},
1653
- size: s.size,
1654
- ...typeof s.mode === "number" ? { mode: s.mode } : {},
1655
- ...typeof s.mtimeMs === "number" ? { mtimeMs: s.mtimeMs } : {},
1656
- ...typeof s.atimeMs === "number" ? { atimeMs: s.atimeMs } : {},
1657
- ...typeof s.ctimeMs === "number" ? { ctimeMs: s.ctimeMs } : {},
1658
- ...typeof s.ino === "number" ? { ino: s.ino } : {},
1659
- ...typeof s.nlink === "number" ? { nlink: s.nlink } : {},
1660
- ...typeof s.dev === "number" ? { dev: s.dev } : {},
1661
- ...s.readonly === true ? { readonly: true } : {},
1662
- ...typeof s.maxFile === "number" ? { maxFile: s.maxFile } : {},
1663
- ...s.ranged === true ? { ranged: true } : {},
1664
- ...s.linkable === true ? { linkable: true } : {},
1665
- ...typeof s.version === "string" ? { version: s.version } : {},
1666
- ...typeof s.uid === "number" ? { uid: s.uid } : {},
1667
- ...typeof s.gid === "number" ? { gid: s.gid } : {}
1668
- };
1669
- }
1670
- var SYNC_FS_OPS, HOLD_READ, HOLD_WRITE, HOLD_CREATED, SYNC_FS_REQUEST_TIMEOUT_MS;
1671
- var init_sync_fs_wire = __esm({
1672
- "src/realm/sync-fs-wire.ts"() {
1673
- "use strict";
1674
- SYNC_FS_OPS = [
1675
- "read",
1676
- "write",
1677
- "exists",
1678
- "stat",
1679
- "lstat",
1680
- "readdir",
1681
- "readdir-stat",
1682
- "mkdir",
1683
- "rm",
1684
- "rename",
1685
- "link",
1686
- "unlink",
1687
- "rmdir",
1688
- "symlink",
1689
- "readlink",
1690
- "chmod",
1691
- "utimes",
1692
- "lutimes",
1693
- "statfs",
1694
- "hold",
1695
- "create",
1696
- "kept",
1697
- "pread",
1698
- "pwrite",
1699
- "append",
1700
- "truncate",
1701
- "chown",
1702
- "lchown",
1703
- "access"
1704
- ];
1705
- HOLD_READ = 4;
1706
- HOLD_WRITE = 8;
1707
- HOLD_CREATED = 16;
1708
- SYNC_FS_REQUEST_TIMEOUT_MS = 25e3;
1709
- }
1710
- });
1711
-
1712
1743
  // src/process/wasi/wasi-fds.ts
1713
1744
  function stdioAlias(path) {
1714
1745
  const m = /^\/dev\/(?:(stdin)|(stdout)|(stderr)|fd\/(\d+))$/.exec(path);
@@ -4300,7 +4331,9 @@ var init_wasix_process = __esm({
4300
4331
  });
4301
4332
  }
4302
4333
  spawn(req, exec = false) {
4303
- const { stdio, inherit, cwd, opened: opened2 } = this.childFds(req.ops ?? []);
4334
+ const ops = req.ops ?? [];
4335
+ const { stdio, inherit, cwd, opened: opened2 } = this.childFds(ops);
4336
+ const moved = ops.some((op) => op.cmd === "chdir" || op.cmd === "fchdir");
4304
4337
  try {
4305
4338
  const spawn = {
4306
4339
  op: "proc-spawn",
@@ -4308,6 +4341,7 @@ var init_wasix_process = __esm({
4308
4341
  argv: req.argv.length > 0 ? req.argv : [req.name],
4309
4342
  env: req.env ?? this.environment(),
4310
4343
  cwd,
4344
+ ...moved ? { chdir: true } : {},
4311
4345
  stdio,
4312
4346
  inherit,
4313
4347
  ...exec ? { exec } : {},
@@ -4590,6 +4624,7 @@ function processes(host, call2, inThread) {
4590
4624
  argv: o.argv,
4591
4625
  env: o.env ?? { ...host.o.env },
4592
4626
  cwd: o.cwd ?? host.cwd,
4627
+ ...o.cwd !== void 0 ? { chdir: true } : {},
4593
4628
  stdio,
4594
4629
  ...inThread ? {} : { restart: true }
4595
4630
  };
@@ -4781,7 +4816,7 @@ var KERNEL_VERSION, OS_RELEASE;
4781
4816
  var init_version = __esm({
4782
4817
  "src/version.ts"() {
4783
4818
  "use strict";
4784
- KERNEL_VERSION = true ? "1.103.1" : "0.0.0-dev";
4819
+ KERNEL_VERSION = true ? "1.103.3" : "0.0.0-dev";
4785
4820
  OS_RELEASE = "6.0.0-slicc";
4786
4821
  }
4787
4822
  });
@@ -5091,6 +5126,7 @@ function childOps(kernel, io, defaults, sync) {
5091
5126
  ...named,
5092
5127
  env: { ...o.env ?? defaults.env },
5093
5128
  cwd: o.cwd ?? defaults.cwd,
5129
+ ...o.cwd !== void 0 ? { chdir: true } : {},
5094
5130
  stdio,
5095
5131
  ...group,
5096
5132
  ...death
@@ -8671,6 +8707,7 @@ function kernelUname(imports, hostname, memory, glue) {
8671
8707
  function kernelChdir(Fs) {
8672
8708
  const { chdir, lookupPath, ErrnoError } = Fs;
8673
8709
  if (!chdir || !lookupPath || !ErrnoError) return;
8710
+ Fs.sliccChdirAt = chdir;
8674
8711
  Fs.chdir = (path) => {
8675
8712
  const { node } = lookupPath.call(Fs, path, { follow: true });
8676
8713
  const directory = Fs.isDir?.(node.mode) === true;
@@ -9748,6 +9785,7 @@ function runSync(kernel, d, o) {
9748
9785
  ...named,
9749
9786
  env: { ...o.env ?? d.env },
9750
9787
  cwd: o.cwd === void 0 ? d.cwd : d.resolve(o.cwd),
9788
+ ...o.cwd === void 0 ? {} : { chdir: true },
9751
9789
  ...group,
9752
9790
  stdin: stdioOf(o.stdin),
9753
9791
  ...input ? { input } : {},
@@ -11042,7 +11080,7 @@ function mountVfsIntoEmscripten(Fs, deps) {
11042
11080
  linuxRmdir(Fs);
11043
11081
  if (deps.cred) Fs.sliccCred = deps.cred;
11044
11082
  try {
11045
- Fs.chdir(deps.cwd);
11083
+ (Fs.sliccChdirAt ?? Fs.chdir).call(Fs, deps.cwd);
11046
11084
  } catch (err) {
11047
11085
  warn(`cannot chdir to ${deps.cwd}: errno ${err.errno}`);
11048
11086
  }
@@ -12119,6 +12157,7 @@ function createProcessKernel(deps) {
12119
12157
  argv,
12120
12158
  env: env ?? deps.env,
12121
12159
  cwd: cwd ?? Fs.cwd(),
12160
+ ...cwd !== null ? { chdir: true } : {},
12122
12161
  stdio,
12123
12162
  ...inherit.length > 0 ? { inherit } : {},
12124
12163
  ...exec ? { exec } : {},