@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.
- package/README.md +57 -16
- package/dist/driver-worker.js +36 -1
- package/dist/driver-worker.js.map +2 -2
- package/dist/index.js +89 -5
- package/dist/index.js.map +2 -2
- package/dist/kernel-worker.js +798 -295
- package/dist/kernel-worker.js.map +4 -4
- package/dist/meta.js.map +2 -2
- package/dist/node-driver-worker.js +36 -1
- package/dist/node-driver-worker.js.map +2 -2
- package/dist/node-process-worker.js +489 -234
- package/dist/node-process-worker.js.map +4 -4
- package/dist/node.js +846 -315
- package/dist/node.js.map +4 -4
- package/dist/process-worker.js +426 -171
- package/dist/process-worker.js.map +4 -4
- package/dist/types/commands.d.ts +6 -1
- package/dist/types/fs/command-stat.d.ts +3 -0
- package/dist/types/fs/commands.d.ts +7 -1
- package/dist/types/fs/engines.d.ts +5 -0
- package/dist/types/fs/types.d.ts +1 -0
- package/dist/types/kernel/host.d.ts +1 -0
- package/dist/types/kernel/net/http-syscalls.d.ts +10 -0
- package/dist/types/kernel/net/http1.d.ts +1 -0
- package/dist/types/kernel/net/remote-transport.d.ts +18 -0
- package/dist/types/kernel/net/transport.d.ts +2 -0
- package/dist/types/kernel/process.d.ts +8 -0
- package/dist/types/launcher.d.ts +4 -0
- package/dist/types/process/js/js-kernel.d.ts +2 -1
- package/dist/types/process/process-signals.d.ts +3 -0
- package/dist/types/process/wasi/wasi-cred.d.ts +11 -0
- package/dist/types/process/wasi/wasi-files.d.ts +1 -0
- package/dist/types/process/wasi/wasi-host.d.ts +9 -0
- package/dist/types/process/wasi/wasi-sigmask.d.ts +7 -1
- package/dist/types/process/wasi/wasix-epoll.d.ts +3 -0
- package/dist/types/refused-command.d.ts +4 -0
- package/dist/types/transport.d.ts +1 -0
- package/package.json +12 -12
package/dist/types/commands.d.ts
CHANGED
|
@@ -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
|
|
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;
|
|
@@ -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
|
|
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 {};
|
package/dist/types/fs/types.d.ts
CHANGED
|
@@ -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;
|
package/dist/types/launcher.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
}
|
|
@@ -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.
|
|
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-
|
|
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.
|
|
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-
|
|
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-
|
|
76
|
-
"@ai-ecoverse/wasm-bash": "5.3.0-
|
|
77
|
-
"@ai-ecoverse/wasm-coreutils": "9.12.0-
|
|
78
|
-
"@ai-ecoverse/wasm-curl": "8.22.0-
|
|
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-
|
|
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-
|
|
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-
|
|
85
|
-
"@ai-ecoverse/wasm-util-linux": "2.42.4-
|
|
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",
|