@ai-ecoverse/slicc-kernel 1.103.4 → 1.106.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.
Files changed (38) hide show
  1. package/README.md +57 -16
  2. package/dist/driver-worker.js +36 -1
  3. package/dist/driver-worker.js.map +2 -2
  4. package/dist/index.js +89 -5
  5. package/dist/index.js.map +2 -2
  6. package/dist/kernel-worker.js +798 -295
  7. package/dist/kernel-worker.js.map +4 -4
  8. package/dist/meta.js.map +2 -2
  9. package/dist/node-driver-worker.js +36 -1
  10. package/dist/node-driver-worker.js.map +2 -2
  11. package/dist/node-process-worker.js +489 -234
  12. package/dist/node-process-worker.js.map +4 -4
  13. package/dist/node.js +846 -315
  14. package/dist/node.js.map +4 -4
  15. package/dist/process-worker.js +426 -171
  16. package/dist/process-worker.js.map +4 -4
  17. package/dist/types/commands.d.ts +6 -1
  18. package/dist/types/fs/command-stat.d.ts +3 -0
  19. package/dist/types/fs/commands.d.ts +7 -1
  20. package/dist/types/fs/engines.d.ts +5 -0
  21. package/dist/types/fs/types.d.ts +1 -0
  22. package/dist/types/kernel/host.d.ts +1 -0
  23. package/dist/types/kernel/net/http-syscalls.d.ts +10 -0
  24. package/dist/types/kernel/net/http1.d.ts +1 -0
  25. package/dist/types/kernel/net/remote-transport.d.ts +18 -0
  26. package/dist/types/kernel/net/transport.d.ts +2 -0
  27. package/dist/types/kernel/process.d.ts +8 -0
  28. package/dist/types/launcher.d.ts +4 -0
  29. package/dist/types/process/js/js-kernel.d.ts +2 -1
  30. package/dist/types/process/process-signals.d.ts +3 -0
  31. package/dist/types/process/wasi/wasi-cred.d.ts +11 -0
  32. package/dist/types/process/wasi/wasi-files.d.ts +1 -0
  33. package/dist/types/process/wasi/wasi-host.d.ts +9 -0
  34. package/dist/types/process/wasi/wasi-sigmask.d.ts +7 -1
  35. package/dist/types/process/wasi/wasix-epoll.d.ts +3 -0
  36. package/dist/types/refused-command.d.ts +4 -0
  37. package/dist/types/transport.d.ts +1 -0
  38. package/package.json +12 -12
@@ -15,9 +15,13 @@ export interface Command {
15
15
  script?: string;
16
16
  bin?: true;
17
17
  imports?: string;
18
+ refused?: string;
19
+ shows?: string;
18
20
  }
19
21
  interface Manifest {
20
22
  name?: unknown;
23
+ version?: unknown;
24
+ engines?: unknown;
21
25
  bin?: unknown;
22
26
  slicc?: {
23
27
  abi?: unknown;
@@ -30,7 +34,8 @@ interface Manifest {
30
34
  }
31
35
  export declare function commandsOf(pkg: string, manifest: Manifest): Command[];
32
36
  export declare function pnpmGlobalRoots(fs: KernelFs, home: string): Promise<string[]>;
33
- export declare function scanCommands(fs: KernelFs, modules: string | (string | string[])[], binsFrom?: number): Promise<Map<string, Command>>;
37
+ export declare function engineRefusal(manifest: Manifest, kernel: string): string | undefined;
38
+ export declare function scanCommands(fs: KernelFs, modules: string | (string | string[])[], binsFrom?: number, kernel?: string): Promise<Map<string, Command>>;
34
39
  export declare function scanFilesystems(fs: KernelFs, modules: string | string[]): Promise<Map<string, string>>;
35
40
  export declare function scanBinfmts(fs: KernelFs, modules: string | string[], warn?: (message: string) => void, owners?: Map<string, string>): Promise<Map<string, string>>;
36
41
  export declare function binfmtSuffix(binfmts: ReadonlyMap<string, string>, path: string): string | undefined;
@@ -0,0 +1,3 @@
1
+ import type { Guard } from './dac.js';
2
+ import type { FsStat } from './types.js';
3
+ export declare function callerStat(g: Guard | undefined, path: string, st: FsStat): Promise<FsStat>;
@@ -1,4 +1,10 @@
1
+ import type { Cred } from '../kernel/cred.js';
1
2
  import { type KernelFs } from './types.js';
2
3
  export declare function followLinks(fs: KernelFs, path: string): Promise<string>;
3
4
  export type UserCommandDir = (dir: string) => Promise<ReadonlySet<string> | undefined>;
4
- export declare function withCommandDirs(fs: KernelFs, names: () => Promise<ReadonlySet<string>>, userDir?: UserCommandDir, owners?: boolean): KernelFs;
5
+ export interface EntryTarget {
6
+ path: string;
7
+ owner?: Cred;
8
+ }
9
+ export type CommandTarget = (path: string) => Promise<EntryTarget | undefined>;
10
+ export declare function withCommandDirs(fs: KernelFs, names: () => Promise<ReadonlySet<string>>, userDir?: UserCommandDir, owners?: boolean, targetOf?: CommandTarget): KernelFs;
@@ -0,0 +1,5 @@
1
+ type Version = [number, number, number, string[]];
2
+ export declare function parseVersion(text: string): Version | undefined;
3
+ export declare function compare(a: Version, b: Version): number;
4
+ export declare function satisfies(version: string, range: string): boolean | undefined;
5
+ export {};
@@ -90,6 +90,7 @@ export interface KernelFs {
90
90
  unguarded?(): KernelFs;
91
91
  noLinks?(): KernelFs;
92
92
  mayChange?(path: string, follow: boolean, whole?: boolean): Promise<void>;
93
+ commandTarget?(path: string): Promise<string | undefined>;
93
94
  readVersioned?(path: string, cached?: boolean): Promise<{
94
95
  bytes: Uint8Array;
95
96
  version: string;
@@ -112,5 +112,6 @@ export interface WasmProcessHandle {
112
112
  }>;
113
113
  }
114
114
  export declare const KILL_GRACE_MS = 2000;
115
+ export declare const KILL_HARD_MS = 5000;
115
116
  export declare function inheritedFds(fds: FdTable): InheritedFd[];
116
117
  export declare function spawnWasmProcess(opts: SpawnWasmOptions): WasmProcessHandle;
@@ -7,6 +7,7 @@ export interface HttpRequestBody {
7
7
  method: string;
8
8
  headers: HeaderList;
9
9
  body?: Uint8Array;
10
+ stream?: boolean;
10
11
  }
11
12
  export type HttpSyscall = ({
12
13
  op: 'net-request';
@@ -19,6 +20,13 @@ export type HttpSyscall = ({
19
20
  op: 'net-read';
20
21
  handle: number;
21
22
  max: number;
23
+ } | {
24
+ op: 'net-write';
25
+ handle: number;
26
+ bytes: Uint8Array;
27
+ } | {
28
+ op: 'net-end';
29
+ handle: number;
22
30
  } | {
23
31
  op: 'net-close';
24
32
  handle: number;
@@ -47,6 +55,8 @@ export declare class HttpHandles {
47
55
  private traits;
48
56
  private request;
49
57
  private opened;
58
+ private write;
59
+ private end;
50
60
  private start;
51
61
  private respond;
52
62
  private headOf;
@@ -42,6 +42,7 @@ export type BodyFraming = {
42
42
  };
43
43
  export declare function requestFraming(headers: HeaderList): BodyFraming;
44
44
  export declare function readBody(incoming: Incoming, framing: BodyFraming, cap: number, signal?: AbortSignal): Promise<Uint8Array | undefined>;
45
+ export declare function streamBody(incoming: Incoming, framing: BodyFraming, signal?: AbortSignal): AsyncGenerator<Uint8Array>;
45
46
  export declare function concat(chunks: Uint8Array[], total?: number): Uint8Array<ArrayBuffer>;
46
47
  export declare function responseHead(status: number, reason: string, headers: HeaderList): Uint8Array;
47
48
  export declare function chunk(bytes: Uint8Array): Uint8Array;
@@ -6,6 +6,18 @@ export type TransportCall = {
6
6
  method: string;
7
7
  headers: HeaderList;
8
8
  body?: Uint8Array;
9
+ streamed?: true;
10
+ } | {
11
+ net: 'body-chunk';
12
+ nid: number;
13
+ bytes: Uint8Array;
14
+ } | {
15
+ net: 'body-end';
16
+ nid: number;
17
+ } | {
18
+ net: 'body-error';
19
+ nid: number;
20
+ message: string;
9
21
  } | {
10
22
  net: 'read';
11
23
  nid: number;
@@ -45,6 +57,9 @@ export type TransportReply = {
45
57
  net: 'chunk';
46
58
  nid: number;
47
59
  bytes: Uint8Array;
60
+ } | {
61
+ net: 'body-pull';
62
+ nid: number;
48
63
  } | {
49
64
  net: 'end';
50
65
  nid: number;
@@ -86,10 +101,13 @@ export declare class RemoteTransport implements RealmTransport {
86
101
  private readonly waiting;
87
102
  private nextId;
88
103
  private readonly sockets;
104
+ private readonly uploads;
89
105
  private failure;
90
106
  constructor(port: TransportPort, traits: RealmTransportTraits);
91
107
  receive(reply: TransportReply): void;
92
108
  private toSocket;
109
+ private pull;
110
+ private dropUpload;
93
111
  fail(error: Error): void;
94
112
  private ask;
95
113
  private cancel;
@@ -4,6 +4,7 @@ export interface RealmTransportRequest {
4
4
  method: string;
5
5
  headers: HeaderList;
6
6
  body?: Uint8Array;
7
+ bodyStream?: AsyncIterable<Uint8Array>;
7
8
  signal: AbortSignal;
8
9
  }
9
10
  export interface RealmRedirectHop {
@@ -33,6 +34,7 @@ export interface RealmTransportTraits {
33
34
  crossOrigin?: 'cors' | 'any';
34
35
  unavailable?: true;
35
36
  websocket?: true;
37
+ streamingBodies?: true;
36
38
  redirectHops?: true;
37
39
  exit?: RealmTransportExit;
38
40
  [trait: string]: unknown;
@@ -314,6 +314,10 @@ export type WasmSyscall = {
314
314
  caught: number;
315
315
  ignored: number;
316
316
  defaults?: number;
317
+ } | {
318
+ op: 'sig-waiting';
319
+ tid: number;
320
+ set: number;
317
321
  } | {
318
322
  op: 'sig-pause';
319
323
  } | SocketSyscall | EpollSyscall | SemSyscall | HttpSyscall | PtySyscall | HostSyscall;
@@ -424,6 +428,7 @@ export declare class WasmProcess {
424
428
  };
425
429
  inheritable(fork?: boolean): number;
426
430
  signal(sig: number): SignalOutcome;
431
+ private routeBlocked;
427
432
  private spawn;
428
433
  private onDeath;
429
434
  private sendDeath;
@@ -435,6 +440,9 @@ export declare class WasmProcess {
435
440
  private cont;
436
441
  private readonly blocks;
437
442
  private readonly sizesRead;
443
+ private readonly sigwaiters;
444
+ private setSigwaiter;
445
+ private waiterFor;
438
446
  syscall(req: WasmSyscall, cancelled?: AbortSignal, block?: () => void): Promise<SyncFsResult>;
439
447
  setUmask(mask?: number): number;
440
448
  die(): void;
@@ -214,6 +214,7 @@ export declare class Launcher {
214
214
  onTraits(listener: () => void): () => void;
215
215
  updateTransportTraits(): boolean;
216
216
  commands(scope?: string): Promise<Map<string, Command>>;
217
+ private refusals;
217
218
  private ownCommands;
218
219
  private interpreters;
219
220
  private tiers;
@@ -352,6 +353,9 @@ export declare class Launcher {
352
353
  private noLinksOf;
353
354
  private rooted;
354
355
  private commandFs;
356
+ private readonly named;
357
+ private commandNames;
358
+ private entryTarget;
355
359
  private processChain;
356
360
  private starting;
357
361
  openTerminal(argv: string[], options: TerminalOptions): Promise<TerminalSession>;
@@ -5,7 +5,8 @@ import { type SyncSabRequestBody } from '../../realm/sync-sab-wire.js';
5
5
  import { type AsyncSabTransport, type WaitAsyncLike } from './async-sab.js';
6
6
  export declare class JsCallError extends Error {
7
7
  readonly code: string;
8
- constructor(code: string, what: string);
8
+ readonly detail: string | undefined;
9
+ constructor(code: string, what: string, detail?: string);
9
10
  }
10
11
  export declare function umaskRequest(mask: unknown): {
11
12
  op: 'proc-umask';
@@ -19,6 +19,8 @@ export declare class SignalGate {
19
19
  private unwinding;
20
20
  private quieted;
21
21
  private delivered;
22
+ private raised;
23
+ private entering;
22
24
  private readonly raw;
23
25
  private readonly header;
24
26
  private readonly hooks;
@@ -29,5 +31,6 @@ export declare class SignalGate {
29
31
  private report;
30
32
  quiet<T>(fn: () => T): T;
31
33
  interrupt(): boolean;
34
+ raisedOnEntry(): number;
32
35
  deliver(): void;
33
36
  }
@@ -0,0 +1,11 @@
1
+ import type { Cred } from '../../kernel/cred.js';
2
+ export declare class CredCache {
3
+ private cred;
4
+ private stamp;
5
+ private readonly fetch;
6
+ private readonly shared;
7
+ constructor(fetch: () => Cred, shared?: Int32Array);
8
+ private gen;
9
+ get(): Cred;
10
+ change(apply: () => Cred): Cred;
11
+ }
@@ -91,6 +91,7 @@ export declare function resolveUnder(dir: string, path: string): string;
91
91
  export declare function pathInode(path: string): bigint;
92
92
  export declare const MISS_TTL_MS = 20;
93
93
  export declare const FS_GEN = 4;
94
+ export declare const CRED_GEN = 5;
94
95
  export declare const SHARED_IDS_BYTES: number;
95
96
  export declare function cachingBridge(bridge: SyncFsPosixBridge, now?: () => number, shared?: Int32Array): SyncFsPosixBridge & {
96
97
  invalidate(): void;
@@ -28,6 +28,7 @@ export interface WasiHostOptions {
28
28
  device?: DeviceMeta;
29
29
  }>;
30
30
  shared?: Int32Array;
31
+ credGen?: Int32Array;
31
32
  forked?: {
32
33
  fds: readonly WasiForkFd[];
33
34
  cloexec: readonly number[];
@@ -38,11 +39,15 @@ export type WasiFunction = (...args: never[]) => number | undefined;
38
39
  export declare class WasiHost {
39
40
  readonly mem: WasiMemory;
40
41
  readonly fds: WasiFds;
42
+ private readonly creds;
41
43
  private readonly started;
42
44
  private cache;
43
45
  private readonly startCwd;
44
46
  interruptWakes: boolean;
47
+ strictEpoll: boolean;
45
48
  entered: boolean;
49
+ enteredSignals: number;
50
+ raisedOnEntry: (() => number) | undefined;
46
51
  onRaise: ((sig: number) => boolean) | undefined;
47
52
  muted: ((fd: number, data: Uint8Array) => boolean) | undefined;
48
53
  signals: WasiSignals | undefined;
@@ -62,6 +67,9 @@ export declare class WasiHost {
62
67
  sliccImports(): Record<string, WasiFunction>;
63
68
  private poll;
64
69
  private maskedPoll;
70
+ private epollWait;
71
+ private settleEntry;
72
+ private maskedEpoll;
65
73
  private suspend;
66
74
  imports(): Record<string, WasiFunction>;
67
75
  now(id: number): bigint;
@@ -81,6 +89,7 @@ export declare class WasiHost {
81
89
  private lockedFile;
82
90
  private kernelStat;
83
91
  private write;
92
+ private brokenPipe;
84
93
  private read;
85
94
  private local;
86
95
  private seek;
@@ -7,13 +7,19 @@ export declare class WasiSigmask {
7
7
  private readonly header;
8
8
  private readonly deliver;
9
9
  private readonly process;
10
- constructor(header: Int32Array, deliver: () => void, process?: Int32Array);
10
+ readonly tid: number;
11
+ constructor(header: Int32Array, deliver: () => void, process?: Int32Array, tid?: number);
11
12
  static unsupported(header: Int32Array): void;
12
13
  set(how: number, setLo: number, setHi: number, old: (lo: number, hi: number) => void): number;
13
14
  swap(setLo: number, setHi: number): [number, number];
14
15
  deliverUnblocked(): boolean;
15
16
  restore([lo, hi]: [number, number]): void;
17
+ blockedBits(): number;
18
+ blocks(sig: number): boolean;
16
19
  inherited(): BlockedMask;
17
20
  discard(sig: number): void;
21
+ sigwait(setLo: number, timeoutNs: bigint, publish: (set: number) => void, took: (sig: number) => void, entered?: boolean): number;
22
+ private take;
23
+ private interrupted;
18
24
  pending(): number;
19
25
  }
@@ -0,0 +1,3 @@
1
+ import type { WasiFunction, WasiHost } from './wasi-host.js';
2
+ export declare function timeoutMs(ns: bigint): number;
3
+ export declare function wasixEpollImports(host: WasiHost): Record<string, WasiFunction>;
@@ -0,0 +1,4 @@
1
+ import type { Command } from './commands.js';
2
+ export declare const REFUSED_PATH = "/usr/lib/slicc/refused";
3
+ export declare const REFUSED_SOURCE: string;
4
+ export declare function refusing(command: Command): Command;
@@ -10,6 +10,7 @@ export interface FetchTransportOptions {
10
10
  webSocket?: boolean | WebSocketConstructor;
11
11
  webSocketHeaders?: boolean;
12
12
  redirect?: 'follow' | 'manual';
13
+ streamingBodies?: boolean;
13
14
  }
14
15
  export declare const SEND_BUFFER: number;
15
16
  export declare function fetchTransport(options?: FetchTransportOptions): RealmTransport;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-kernel",
3
- "version": "1.103.4",
3
+ "version": "1.106.3",
4
4
  "description": "SLICC's wasm-realm kernel: run Emscripten programs in the browser against OPFS, with fork, spawn, pipes and waitpid",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -63,26 +63,26 @@
63
63
  "format": "biome check --write ."
64
64
  },
65
65
  "devDependencies": {
66
- "@ai-ecoverse/py-numpy": "2.3.2-9",
66
+ "@ai-ecoverse/py-numpy": "2.3.2-10",
67
67
  "@ai-ecoverse/slicc-node": "2.5.1",
68
68
  "@ai-ecoverse/slicc-scrub": "1.0.0",
69
- "@ai-ecoverse/slicc-shared-web": "1.21.0",
69
+ "@ai-ecoverse/slicc-shared-web": "1.21.1",
70
70
  "@ai-ecoverse/wasi-cargo": "0.99.0-2",
71
- "@ai-ecoverse/wasi-pnpm": "12.9.1-8",
71
+ "@ai-ecoverse/wasi-pnpm": "12.9.1-9",
72
72
  "@ai-ecoverse/wasi-ripgrep": "15.2.0-5",
73
73
  "@ai-ecoverse/wasi-rustc": "1.98.1-4",
74
74
  "@ai-ecoverse/wasi-zig": "0.16.0-15",
75
- "@ai-ecoverse/wasix-python": "3.14.2-21",
76
- "@ai-ecoverse/wasm-bash": "5.3.0-18",
77
- "@ai-ecoverse/wasm-coreutils": "9.12.0-7",
78
- "@ai-ecoverse/wasm-curl": "8.22.0-4",
75
+ "@ai-ecoverse/wasix-python": "3.14.2-24",
76
+ "@ai-ecoverse/wasm-bash": "5.3.0-19",
77
+ "@ai-ecoverse/wasm-coreutils": "9.12.0-8",
78
+ "@ai-ecoverse/wasm-curl": "8.22.0-5",
79
79
  "@ai-ecoverse/wasm-git": "2.55.0-15",
80
- "@ai-ecoverse/wasm-procps": "4.0.7-1",
80
+ "@ai-ecoverse/wasm-procps": "4.0.7-2",
81
81
  "@ai-ecoverse/wasm-sqlite3": "3.54.0-3",
82
- "@ai-ecoverse/wasm-tar": "1.35.0-6",
82
+ "@ai-ecoverse/wasm-tar": "1.35.0-7",
83
83
  "@ai-ecoverse/wasm-tls-engine": "4.2.0-1",
84
- "@ai-ecoverse/wasm-tree": "2.3.2-1",
85
- "@ai-ecoverse/wasm-util-linux": "2.42.4-1",
84
+ "@ai-ecoverse/wasm-tree": "2.3.2-2",
85
+ "@ai-ecoverse/wasm-util-linux": "2.42.4-2",
86
86
  "@biomejs/biome": "2.5.15",
87
87
  "@types/node": "24.19.1",
88
88
  "esbuild": "0.28.2",