@ai-ecoverse/slicc-kernel 1.112.0 → 1.114.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.
@@ -15,6 +15,8 @@ export declare class OpfsFs implements KernelFs {
15
15
  private readonly meta;
16
16
  private readonly dirs;
17
17
  private readonly files;
18
+ private readonly absent;
19
+ private changes;
18
20
  private readonly snapshots;
19
21
  private readonly found;
20
22
  private readonly checked;
@@ -63,6 +65,7 @@ export declare class OpfsFs implements KernelFs {
63
65
  private dir;
64
66
  private current;
65
67
  private forget;
68
+ private missed;
66
69
  private remember;
67
70
  private inDir;
68
71
  private child;
@@ -36,7 +36,7 @@ export type { ProcessMountPolicy, ProcessMountRequest } from './mount/syscall.js
36
36
  export type { JsChild, JsExited, JsSpawnOptions, JsStdio } from './process/js/js-children.js';
37
37
  export type { JsCrontabAnswer, JsCrontabCall, JsFdStatus, JsFdType, JsFile, JsOpenOptions, JsProgramContext, JsSignal, JsSudoAnswer, } from './process/js/js-context.js';
38
38
  export type { JsStatFs } from './process/js/js-io.js';
39
- export type { JsAddress, JsConnection, JsConnectOptions, JsListener, JsListenOptions, JsNet, } from './process/js/js-net.js';
39
+ export type { JsAddress, JsConnection, JsConnectOptions, JsListener, JsListenOptions, JsNet, JsResolveOptions, } from './process/js/js-net.js';
40
40
  export type { JsRunOptions, JsRunResult, JsRunStdio } from './process/js/js-run.js';
41
41
  export type { JsCred, JsSyncContext, JsSyncFile } from './process/js/js-sync.js';
42
42
  export type { JsTermios, JsTty, JsTtySize } from './process/js/js-tty.js';
@@ -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;
@@ -18,6 +18,7 @@ import { type ForkState, type InheritedFd, type Program } from './protocol.js';
18
18
  import type { PtyTable } from './pty.js';
19
19
  import type { SealedBroker } from './sealed.js';
20
20
  import type { SemTable } from './sem.js';
21
+ import { type SigInfo } from './signals.js';
21
22
  import { type LoopbackNet } from './socket.js';
22
23
  import type { VfsNodes } from './vfs-file.js';
23
24
  export interface WasmWorkerLike {
@@ -63,7 +64,7 @@ export interface SpawnWasmOptions {
63
64
  fork?: ForkState;
64
65
  ppid?: number;
65
66
  shownPid?: number;
66
- kill?: (pid: number, sig: number) => boolean | Promise<boolean>;
67
+ kill?: (pid: number, sig: number, info?: SigInfo) => boolean | Promise<boolean>;
67
68
  writesBack?: (pid: number) => boolean;
68
69
  processes?: () => ProcessListing;
69
70
  sudo?: WasmProcessOptions['sudo'];
@@ -92,7 +93,7 @@ export interface WasmProcessHandle {
92
93
  pid: number;
93
94
  exited: Promise<number>;
94
95
  kill(code?: number): void;
95
- signal(sig: number): void;
96
+ signal(sig: number, info?: SigInfo): void;
96
97
  termsig(): number | undefined;
97
98
  onState(listener: StateListener): void;
98
99
  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;
@@ -22,7 +22,7 @@ import { type PtySyscall, type PtyTable } from './pty.js';
22
22
  import { type RunRequest } from './run-child.js';
23
23
  import type { SealedBroker, SealedCaller } from './sealed.js';
24
24
  import { type SemSyscall, type SemTable } from './sem.js';
25
- import { type DefaultAction } from './signals.js';
25
+ import { type DefaultAction, type SigInfo } from './signals.js';
26
26
  import { LoopbackNet } from './socket.js';
27
27
  import { type SocketSyscall } from './socket-syscalls.js';
28
28
  import type { Termios } from './tty.js';
@@ -323,6 +323,10 @@ export type WasmSyscall = {
323
323
  op: 'sig-waiting';
324
324
  tid: number;
325
325
  set: number;
326
+ } | {
327
+ op: 'sig-info';
328
+ sig: number;
329
+ tid?: number;
326
330
  } | {
327
331
  op: 'sig-pause';
328
332
  } | SocketSyscall | EpollSyscall | SemSyscall | HttpSyscall | PtySyscall | HostSyscall;
@@ -365,7 +369,7 @@ export interface WasmProcessOptions {
365
369
  spawner?: ChildSpawner;
366
370
  forker?: ChildForker;
367
371
  fs: VfsFileFs;
368
- kill?: (pid: number, sig: number) => boolean | Promise<boolean>;
372
+ kill?: (pid: number, sig: number, info?: SigInfo) => boolean | Promise<boolean>;
369
373
  writesBack?: (pid: number) => boolean;
370
374
  processes?: () => ProcessListing;
371
375
  sudo?: (call: SudoCall, signal: AbortSignal) => Promise<SudoResult>;
@@ -385,7 +389,7 @@ export interface WasmProcessOptions {
385
389
  pendingBits?: () => number;
386
390
  blockedBits?: () => number;
387
391
  dl?: DlState;
388
- raise?: (sig: number) => void;
392
+ raise?: (sig: number, info?: SigInfo) => void;
389
393
  exitNow?: (status: number) => void;
390
394
  exitSignal?: (sig: number) => void;
391
395
  onReap?: (pid: number) => void;
@@ -434,7 +438,13 @@ export declare class WasmProcess {
434
438
  caught: number;
435
439
  };
436
440
  inheritable(fork?: boolean): number;
437
- signal(sig: number): SignalOutcome;
441
+ private readonly sigInfos;
442
+ signal(sig: number, info?: SigInfo): SignalOutcome;
443
+ private threadKill;
444
+ private threadSender;
445
+ private childInfo;
446
+ private takeSigInfo;
447
+ private signalOutcome;
438
448
  private routeBlocked;
439
449
  private spawn;
440
450
  private onDeath;
@@ -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';
@@ -345,7 +346,8 @@ export declare class Launcher {
345
346
  private controlsJobs;
346
347
  private blockedBy;
347
348
  private ignoredBy;
348
- kill(pid: number, sig: number, sender?: Readonly<Cred>, from?: number): boolean;
349
+ kill(pid: number, sig: number, sender?: Readonly<Cred>, from?: number, forwarded?: SigInfo): boolean;
350
+ private senderInfo;
349
351
  private killAll;
350
352
  private driver;
351
353
  private fsaDriver;
@@ -30,9 +30,14 @@ export interface JsConnectOptions {
30
30
  port: number;
31
31
  signal?: AbortSignal;
32
32
  }
33
+ export interface JsResolveOptions {
34
+ family?: 0 | 4 | 6;
35
+ signal?: AbortSignal;
36
+ }
33
37
  export interface JsNet {
34
38
  listen(options?: JsListenOptions): Promise<JsListener>;
35
39
  connect(options: JsConnectOptions): Promise<JsConnection>;
40
+ resolve(name: string, options?: JsResolveOptions): Promise<string[]>;
36
41
  }
37
42
  export interface NetIo {
38
43
  read(fd: number, max: number | undefined, signal: AbortSignal): Promise<Uint8Array>;
@@ -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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-kernel",
3
- "version": "1.112.0",
3
+ "version": "1.114.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,12 +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-procps": "4.0.7-2",
81
- "@ai-ecoverse/wasm-sqlite3": "3.54.0-4",
80
+ "@ai-ecoverse/wasm-procps": "4.0.7-3",
81
+ "@ai-ecoverse/wasm-sqlite3": "3.54.0-5",
82
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-3",
85
- "@ai-ecoverse/wasm-util-linux": "2.42.4-2",
84
+ "@ai-ecoverse/wasm-tree": "2.3.2-4",
85
+ "@ai-ecoverse/wasm-util-linux": "2.42.4-3",
86
86
  "@biomejs/biome": "2.5.15",
87
87
  "@types/node": "24.19.2",
88
88
  "esbuild": "0.28.2",