@ai-ecoverse/slicc-kernel 1.113.0 → 1.115.0

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.
@@ -10,6 +10,7 @@ export interface MetaEntry {
10
10
  ino?: number;
11
11
  link?: string;
12
12
  socket?: true;
13
+ fifo?: true;
13
14
  dir?: string;
14
15
  uid?: number;
15
16
  gid?: number;
@@ -3,6 +3,7 @@ export interface FsStat {
3
3
  isDirectory: boolean;
4
4
  isSymbolicLink: boolean;
5
5
  isSocket?: boolean;
6
+ isFifo?: boolean;
6
7
  size: number;
7
8
  mode: number;
8
9
  mtime: Date;
@@ -35,6 +36,7 @@ export interface NewOwner extends Owner {
35
36
  mode?: number;
36
37
  parents?: number;
37
38
  socket?: boolean;
39
+ fifo?: boolean;
38
40
  }
39
41
  export interface OwnerChange {
40
42
  uid?: number;
@@ -45,6 +45,14 @@ export interface ChildHandle {
45
45
  exited: Promise<number>;
46
46
  termsig?: () => number | undefined;
47
47
  onState?: (listener: ChildStateListener) => void;
48
+ uid?: () => number | undefined;
49
+ }
50
+ export interface ChildEvent {
51
+ pid: number;
52
+ state: 'exited' | 'stopped' | 'continued';
53
+ status: number;
54
+ termsig?: number | undefined;
55
+ uid?: number | undefined;
48
56
  }
49
57
  export type ChildStateListener = (state: 'stopped' | 'continued', sig: number) => void;
50
58
  export interface WaitFlags {
@@ -68,7 +76,7 @@ export declare function waitStatus(code: number, termsig?: number): number;
68
76
  export declare class ChildTable {
69
77
  private readonly children;
70
78
  private readonly leftovers;
71
- onChildState?: () => void;
79
+ onChildState?: (child?: ChildEvent) => void;
72
80
  onReap?: (pid: number) => void;
73
81
  autoReap?: () => boolean;
74
82
  private readonly kept;
@@ -39,6 +39,7 @@ export interface KernelFile {
39
39
  clipboard?: ClipboardChannel;
40
40
  held?: true;
41
41
  heldMeta?: HeldMeta;
42
+ fifo?: string;
42
43
  }
43
44
  export type HeldMeta = {
44
45
  dir: string;
@@ -0,0 +1,13 @@
1
+ import { type OpenAccess, OpenFile } from './fd-table.js';
2
+ export declare class FifoTable {
3
+ private readonly fifos;
4
+ size(): number;
5
+ open(key: string, path: string, access: OpenAccess, nonblock: boolean, signal: AbortSignal): Promise<OpenFile>;
6
+ private entry;
7
+ private count;
8
+ private notify;
9
+ private changed;
10
+ private release;
11
+ private drop;
12
+ private end;
13
+ }
@@ -8,6 +8,7 @@ import type { ClipboardBroker } from './clipboard.js';
8
8
  import { type CpuTimes } from './cpu-clock.js';
9
9
  import { type Cred } from './cred.js';
10
10
  import { type FdTable, type OpenFile } from './fd-table.js';
11
+ import type { FifoTable } from './fifo.js';
11
12
  import type { JobTable } from './jobs.js';
12
13
  import type { LockTable } from './locks.js';
13
14
  import type { HttpHandles } from './net/http-syscalls.js';
@@ -18,6 +19,7 @@ import { type ForkState, type InheritedFd, type Program } from './protocol.js';
18
19
  import type { PtyTable } from './pty.js';
19
20
  import type { SealedBroker } from './sealed.js';
20
21
  import type { SemTable } from './sem.js';
22
+ import { type SigInfo } from './signals.js';
21
23
  import { type LoopbackNet } from './socket.js';
22
24
  import type { VfsNodes } from './vfs-file.js';
23
25
  export interface WasmWorkerLike {
@@ -63,7 +65,7 @@ export interface SpawnWasmOptions {
63
65
  fork?: ForkState;
64
66
  ppid?: number;
65
67
  shownPid?: number;
66
- kill?: (pid: number, sig: number) => boolean | Promise<boolean>;
68
+ kill?: (pid: number, sig: number, info?: SigInfo) => boolean | Promise<boolean>;
67
69
  writesBack?: (pid: number) => boolean;
68
70
  processes?: () => ProcessListing;
69
71
  sudo?: WasmProcessOptions['sudo'];
@@ -84,6 +86,7 @@ export interface SpawnWasmOptions {
84
86
  net?: LoopbackNet;
85
87
  http?: HttpHandles;
86
88
  locks?: LockTable;
89
+ fifos?: FifoTable;
87
90
  sems?: SemTable;
88
91
  onReap?: (pid: number) => void;
89
92
  resolver?: Resolver;
@@ -92,7 +95,7 @@ export interface WasmProcessHandle {
92
95
  pid: number;
93
96
  exited: Promise<number>;
94
97
  kill(code?: number): void;
95
- signal(sig: number): void;
98
+ signal(sig: number, info?: SigInfo): void;
96
99
  termsig(): number | undefined;
97
100
  onState(listener: StateListener): void;
98
101
  memory(): number;
@@ -1,9 +1,10 @@
1
+ import type { SigInfo } from './signals.js';
1
2
  import type { KernelTty } from './tty.js';
2
3
  export interface JobMember {
3
4
  pid: number;
4
5
  pgid: number;
5
6
  sid: number;
6
- signal(sig: number): void;
7
+ signal(sig: number, info?: SigInfo): void;
7
8
  execParent?: number;
8
9
  ppid?: number;
9
10
  execed?: boolean;
@@ -15,7 +16,7 @@ export declare class JobTable {
15
16
  private readonly foreground;
16
17
  private readonly terminals;
17
18
  keyboard: boolean;
18
- add(pid: number, parentPid: number | undefined, signal: (sig: number) => void, terminal?: KernelTty): JobMember;
19
+ add(pid: number, parentPid: number | undefined, signal: (sig: number, info?: SigInfo) => void, terminal?: KernelTty): JobMember;
19
20
  list(): JobMember[];
20
21
  remove(pid: number): void;
21
22
  private prune;
@@ -40,7 +41,7 @@ export declare class JobTable {
40
41
  private knownTerminals;
41
42
  controllingTerminal(pid: number): KernelTty | null | undefined;
42
43
  acquireTerminal(pid: number, tty: KernelTty): boolean;
43
- killGroup(pgid: number, sig: number, may?: (pid: number) => boolean): boolean;
44
+ killGroup(pgid: number, sig: number, may?: (pid: number) => boolean, info?: SigInfo): boolean;
44
45
  tcgetpgrp(tty: KernelTty, fallback: number): number;
45
46
  tcsetpgrp(caller: number, tty: KernelTty, pgid: number, settling?: boolean): void;
46
47
  private reclaimed;
@@ -11,6 +11,7 @@ import type { ClipboardBroker } from './clipboard.js';
11
11
  import { type Cred, type CredChange } from './cred.js';
12
12
  import { type EpollSyscall } from './epoll.js';
13
13
  import { type DeviceAccess, type FdTable, type HeldMeta, type KernelFdKind, type OpenFile } from './fd-table.js';
14
+ import type { FifoTable } from './fifo.js';
14
15
  import { type HostSyscall } from './host-ops.js';
15
16
  import type { JobTable } from './jobs.js';
16
17
  import type { LockTable } from './locks.js';
@@ -22,7 +23,7 @@ import { type PtySyscall, type PtyTable } from './pty.js';
22
23
  import { type RunRequest } from './run-child.js';
23
24
  import type { SealedBroker, SealedCaller } from './sealed.js';
24
25
  import { type SemSyscall, type SemTable } from './sem.js';
25
- import { type DefaultAction } from './signals.js';
26
+ import { type DefaultAction, type SigInfo } from './signals.js';
26
27
  import { LoopbackNet } from './socket.js';
27
28
  import { type SocketSyscall } from './socket-syscalls.js';
28
29
  import type { Termios } from './tty.js';
@@ -61,6 +62,7 @@ export type WasmSyscall = {
61
62
  existing?: boolean;
62
63
  pin?: VersionPin;
63
64
  handle?: number;
65
+ fifo?: boolean;
64
66
  } | {
65
67
  op: 'fd-pread';
66
68
  fd: number;
@@ -323,6 +325,10 @@ export type WasmSyscall = {
323
325
  op: 'sig-waiting';
324
326
  tid: number;
325
327
  set: number;
328
+ } | {
329
+ op: 'sig-info';
330
+ sig: number;
331
+ tid?: number;
326
332
  } | {
327
333
  op: 'sig-pause';
328
334
  } | SocketSyscall | EpollSyscall | SemSyscall | HttpSyscall | PtySyscall | HostSyscall;
@@ -365,7 +371,7 @@ export interface WasmProcessOptions {
365
371
  spawner?: ChildSpawner;
366
372
  forker?: ChildForker;
367
373
  fs: VfsFileFs;
368
- kill?: (pid: number, sig: number) => boolean | Promise<boolean>;
374
+ kill?: (pid: number, sig: number, info?: SigInfo) => boolean | Promise<boolean>;
369
375
  writesBack?: (pid: number) => boolean;
370
376
  processes?: () => ProcessListing;
371
377
  sudo?: (call: SudoCall, signal: AbortSignal) => Promise<SudoResult>;
@@ -385,7 +391,7 @@ export interface WasmProcessOptions {
385
391
  pendingBits?: () => number;
386
392
  blockedBits?: () => number;
387
393
  dl?: DlState;
388
- raise?: (sig: number) => void;
394
+ raise?: (sig: number, info?: SigInfo) => void;
389
395
  exitNow?: (status: number) => void;
390
396
  exitSignal?: (sig: number) => void;
391
397
  onReap?: (pid: number) => void;
@@ -394,6 +400,7 @@ export interface WasmProcessOptions {
394
400
  net?: LoopbackNet;
395
401
  http?: HttpHandles;
396
402
  locks?: LockTable;
403
+ fifos?: FifoTable;
397
404
  sems?: SemTable;
398
405
  resolver?: Resolver;
399
406
  }
@@ -434,7 +441,13 @@ export declare class WasmProcess {
434
441
  caught: number;
435
442
  };
436
443
  inheritable(fork?: boolean): number;
437
- signal(sig: number): SignalOutcome;
444
+ private readonly sigInfos;
445
+ signal(sig: number, info?: SigInfo): SignalOutcome;
446
+ private threadKill;
447
+ private threadSender;
448
+ private childInfo;
449
+ private takeSigInfo;
450
+ private signalOutcome;
438
451
  private routeBlocked;
439
452
  private spawn;
440
453
  private onDeath;
@@ -472,6 +485,7 @@ export declare class WasmProcess {
472
485
  private clipboardComplaint;
473
486
  private write;
474
487
  private openVfs;
488
+ private openFifo;
475
489
  private openDevice;
476
490
  private identified;
477
491
  private writesAt;
@@ -55,6 +55,7 @@ export interface KernelStreamEntry {
55
55
  flags?: number;
56
56
  cloexec?: boolean;
57
57
  desc?: number;
58
+ fifo?: string;
58
59
  }
59
60
  export type ForkStream = KernelStreamEntry | {
60
61
  fd: number;
@@ -68,6 +69,7 @@ export interface InheritedFd {
68
69
  flags?: number;
69
70
  cloexec?: boolean;
70
71
  desc?: number;
72
+ fifo?: string;
71
73
  }
72
74
  export interface WasmProcessInitMsg {
73
75
  type: typeof WASM_PROCESS_INIT;
@@ -42,3 +42,24 @@ export declare function signalField(sig: number | undefined): {
42
42
  signal?: string;
43
43
  };
44
44
  export declare const SIGNAL_BY_NAME: Readonly<Record<'SIGINT' | 'SIGTERM' | 'SIGKILL' | 'SIGSTOP' | 'SIGCONT', number>>;
45
+ export interface SigInfo {
46
+ code: number;
47
+ pid: number;
48
+ uid: number;
49
+ status: number;
50
+ }
51
+ export declare const SI: {
52
+ readonly USER: 0;
53
+ readonly QUEUE: -1;
54
+ readonly TIMER: -2;
55
+ readonly TKILL: -6;
56
+ readonly KERNEL: 128;
57
+ };
58
+ export declare const CLD: {
59
+ readonly EXITED: 1;
60
+ readonly KILLED: 2;
61
+ readonly DUMPED: 3;
62
+ readonly STOPPED: 5;
63
+ readonly CONTINUED: 6;
64
+ };
65
+ export declare const KERNEL_SIGINFO: Readonly<SigInfo>;
@@ -22,6 +22,7 @@ import type { RealmTransport } from './kernel/net/transport.js';
22
22
  import type { NetworkUplink } from './kernel/net/uplink.js';
23
23
  import type { ProcessInfo } from './kernel/proc-info.js';
24
24
  import { type SealedCaller, type SealedHook } from './kernel/sealed.js';
25
+ import { type SigInfo } from './kernel/signals.js';
25
26
  import { LoopbackNet } from './kernel/socket.js';
26
27
  import { type MediumHandle } from './mount/fsa.js';
27
28
  import { type FstabResult } from './mount/fstab.js';
@@ -179,6 +180,7 @@ export declare class Launcher {
179
180
  private readonly sudoer;
180
181
  private readonly jobs;
181
182
  private readonly locks;
183
+ private readonly fifos;
182
184
  private readonly sems;
183
185
  private readonly settling;
184
186
  private readonly ptys;
@@ -345,7 +347,8 @@ export declare class Launcher {
345
347
  private controlsJobs;
346
348
  private blockedBy;
347
349
  private ignoredBy;
348
- kill(pid: number, sig: number, sender?: Readonly<Cred>, from?: number): boolean;
350
+ kill(pid: number, sig: number, sender?: Readonly<Cred>, from?: number, forwarded?: SigInfo): boolean;
351
+ private senderInfo;
349
352
  private killAll;
350
353
  private driver;
351
354
  private fsaDriver;
@@ -34,6 +34,7 @@ export interface ProcessSys {
34
34
  size: number;
35
35
  };
36
36
  handle?: number;
37
+ fifo?: boolean;
37
38
  }): number;
38
39
  seek(fd: number, offset: number, whence: number): number;
39
40
  flush(fd: number): void;
@@ -82,6 +83,7 @@ export interface ProcessStream {
82
83
  sliccKernelFile?: boolean;
83
84
  sliccCloexec?: boolean;
84
85
  sliccKernelSocket?: boolean;
86
+ sliccKernelFifo?: string;
85
87
  path?: string;
86
88
  flags: number;
87
89
  position: number;
@@ -147,6 +149,7 @@ export declare class KernelStreams {
147
149
  private readonly options;
148
150
  constructor(Fs: ProcessFs, sys: ProcessSys, options?: KernelStreamOptions);
149
151
  attach(stream: ProcessStream, kfd: number, terminal?: boolean): void;
152
+ attachFifo(stream: ProcessStream, path: string): void;
150
153
  attachSocket(stream: ProcessStream, kfd: number): void;
151
154
  socketStream(flags: number): ProcessStream;
152
155
  nameTerminal(stream: ProcessStream): void;
@@ -78,6 +78,7 @@ export declare function useFileMmap(Fs: ProcessFs, deps: MmapDeps): void;
78
78
  export declare function wasmMemory(instance: WebAssembly.Instance, imports: WebAssembly.Imports): WebAssembly.Memory | undefined;
79
79
  export declare function fdOfPath(path: string, cwd: string): number | undefined;
80
80
  export declare function useZeroDevices(Fs: ProcessFs): void;
81
+ export declare function useFifoOpens(Fs: ProcessFs, attach?: (stream: ProcessStream, path: string) => void): void;
81
82
  export declare function useDevRemoval(Fs: ProcessFs): void;
82
83
  export declare function useDevFd(Fs: ProcessFs): void;
83
84
  export declare function pinRootKind(): void;
@@ -123,6 +123,9 @@ export declare class WasiFds {
123
123
  private file;
124
124
  private freshBuffer;
125
125
  private kernelFile;
126
+ private kernelFifo;
127
+ restartable: (() => boolean) | undefined;
128
+ private restarting;
126
129
  private createNew;
127
130
  private isLink;
128
131
  private statOrMissing;
@@ -104,6 +104,7 @@ export declare class WasiHost {
104
104
  private statOrphanable;
105
105
  private synthetic;
106
106
  private resolveForDev;
107
+ private writeSiginfo;
107
108
  private fdAlias;
108
109
  private openFd;
109
110
  private fdTarget;
@@ -105,6 +105,7 @@ export interface LiveFsApi {
105
105
  sliccTouch?: boolean;
106
106
  sliccReading?: LiveFsNode | undefined;
107
107
  sliccCred?: LiveCred;
108
+ sliccOpenFifo?(stream: LiveFsStream, path: string): void;
108
109
  nameTable?: (LiveFsNode | null)[] | null;
109
110
  hashRemoveNode?(node: LiveFsNode): void;
110
111
  lookupNode?(parent: LiveFsNode, name: string): LiveFsNode;
@@ -7,6 +7,7 @@ export interface SyncFsStatJson {
7
7
  isFile: boolean;
8
8
  isSymbolicLink: boolean;
9
9
  isSocket?: boolean;
10
+ isFifo?: boolean;
10
11
  size: number;
11
12
  mode: number;
12
13
  mtimeMs: number;
@@ -1,5 +1,5 @@
1
1
  import type { ChangeView } from '../fs/changes.js';
2
- export declare const SYNC_FS_OPS: readonly ['read', 'write', 'exists', 'stat', 'lstat', 'readdir', 'readdir-stat', 'mkdir', 'rm', 'rename', 'link', 'unlink', 'rmdir', 'symlink', 'readlink', 'chmod', 'utimes', 'lutimes', 'statfs', 'hold', 'create', 'kept', 'pread', 'pwrite', 'append', 'truncate', 'chown', 'lchown', 'access'];
2
+ export declare const SYNC_FS_OPS: readonly ['read', 'write', 'exists', 'stat', 'lstat', 'readdir', 'readdir-stat', 'mkdir', 'rm', 'rename', 'link', 'unlink', 'rmdir', 'symlink', 'readlink', 'chmod', 'utimes', 'lutimes', 'statfs', 'hold', 'create', 'mkfifo', 'kept', 'pread', 'pwrite', 'append', 'truncate', 'chown', 'lchown', 'access'];
3
3
  export type AccessKind = 'open' | 'access' | 'eaccess' | 'follow';
4
4
  export declare const HOLD_READ = 4;
5
5
  export declare const HOLD_WRITE = 8;
@@ -48,6 +48,7 @@ export interface SyncFsBridgeStat {
48
48
  isDirectory: boolean;
49
49
  isSymbolicLink?: boolean;
50
50
  isSocket?: boolean;
51
+ isFifo?: boolean;
51
52
  size: number;
52
53
  mode?: number;
53
54
  mtimeMs?: number;
@@ -101,6 +102,7 @@ export interface SyncFsPosixBridge {
101
102
  hold?(path: string, held: boolean, open?: boolean, handle?: number, want?: number): number | undefined;
102
103
  access?(path: string, mode: number, kind?: AccessKind, nofollow?: boolean): void;
103
104
  create?(path: string, mode?: number, opening?: boolean): void;
105
+ mkfifo?(path: string, mode: number): void;
104
106
  chown?(path: string, ...rest: ChownArgs): void;
105
107
  owners?: boolean;
106
108
  links?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-kernel",
3
- "version": "1.113.0",
3
+ "version": "1.115.0",
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",
@@ -66,7 +66,7 @@
66
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.23.0",
69
+ "@ai-ecoverse/slicc-shared-web": "1.23.1",
70
70
  "@ai-ecoverse/wasi-cargo": "0.99.0-2",
71
71
  "@ai-ecoverse/wasi-pnpm": "12.9.1-9",
72
72
  "@ai-ecoverse/wasi-ripgrep": "15.2.0-5",
@@ -77,11 +77,12 @@
77
77
  "@ai-ecoverse/wasm-coreutils": "9.12.0-9",
78
78
  "@ai-ecoverse/wasm-curl": "8.22.0-5",
79
79
  "@ai-ecoverse/wasm-git": "2.55.0-15",
80
+ "@ai-ecoverse/wasm-gmake": "4.4.1-5",
80
81
  "@ai-ecoverse/wasm-procps": "4.0.7-3",
81
- "@ai-ecoverse/wasm-sqlite3": "3.54.0-4",
82
+ "@ai-ecoverse/wasm-sqlite3": "3.54.0-5",
82
83
  "@ai-ecoverse/wasm-tar": "1.35.0-7",
83
84
  "@ai-ecoverse/wasm-tls-engine": "4.2.0-1",
84
- "@ai-ecoverse/wasm-tree": "2.3.2-3",
85
+ "@ai-ecoverse/wasm-tree": "2.3.2-4",
85
86
  "@ai-ecoverse/wasm-util-linux": "2.42.4-3",
86
87
  "@biomejs/biome": "2.5.15",
87
88
  "@types/node": "24.19.2",