@ai-ecoverse/slicc-kernel 1.102.6 → 1.103.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.
Files changed (178) hide show
  1. package/README.md +1 -1
  2. package/dist/kernel-worker.js +1 -1
  3. package/dist/node-process-worker.js +1 -1
  4. package/dist/node.js +1 -1
  5. package/dist/process-worker.js +1 -1
  6. package/dist/types/body-idle.d.ts +3 -0
  7. package/dist/types/bytes.d.ts +1 -0
  8. package/dist/types/cdp/facade.d.ts +27 -0
  9. package/dist/types/cdp/hosts.d.ts +14 -0
  10. package/dist/types/cdp/port.d.ts +24 -0
  11. package/dist/types/cdp/types.d.ts +12 -0
  12. package/dist/types/cdp/websocket.d.ts +61 -0
  13. package/dist/types/client/attach.d.ts +132 -0
  14. package/dist/types/client/dial-stream.d.ts +23 -0
  15. package/dist/types/client/loopback-fetch.d.ts +5 -0
  16. package/dist/types/client/protocol.d.ts +153 -0
  17. package/dist/types/client/serve-client.d.ts +18 -0
  18. package/dist/types/clipboard-relay.d.ts +25 -0
  19. package/dist/types/commands.d.ts +38 -0
  20. package/dist/types/cron/clock.d.ts +13 -0
  21. package/dist/types/driver.d.ts +3 -0
  22. package/dist/types/facade/hosts.d.ts +12 -0
  23. package/dist/types/facade/port.d.ts +16 -0
  24. package/dist/types/facade/types.d.ts +23 -0
  25. package/dist/types/fs/access.d.ts +29 -0
  26. package/dist/types/fs/attest.d.ts +41 -0
  27. package/dist/types/fs/changes.d.ts +19 -0
  28. package/dist/types/fs/commands.d.ts +4 -0
  29. package/dist/types/fs/dac.d.ts +64 -0
  30. package/dist/types/fs/dev-removal.d.ts +9 -0
  31. package/dist/types/fs/fresh-modules.d.ts +9 -0
  32. package/dist/types/fs/integrity.d.ts +53 -0
  33. package/dist/types/fs/meta.d.ts +85 -0
  34. package/dist/types/fs/opfs.d.ts +141 -0
  35. package/dist/types/fs/owners.d.ts +17 -0
  36. package/dist/types/fs/pages.d.ts +41 -0
  37. package/dist/types/fs/path-map.d.ts +16 -0
  38. package/dist/types/fs/physical-path.d.ts +14 -0
  39. package/dist/types/fs/protect.d.ts +27 -0
  40. package/dist/types/fs/ranged.d.ts +73 -0
  41. package/dist/types/fs/remote.d.ts +45 -0
  42. package/dist/types/fs/types.d.ts +115 -0
  43. package/dist/types/fs/unlinked.d.ts +75 -0
  44. package/dist/types/fs/view.d.ts +1 -0
  45. package/dist/types/fs/walk.d.ts +12 -0
  46. package/dist/types/fs/watch.d.ts +23 -0
  47. package/dist/types/index.d.ts +159 -0
  48. package/dist/types/integrity-relay.d.ts +18 -0
  49. package/dist/types/kernel/children.d.ts +90 -0
  50. package/dist/types/kernel/clipboard.d.ts +49 -0
  51. package/dist/types/kernel/cpu-clock.d.ts +56 -0
  52. package/dist/types/kernel/cred.d.ts +17 -0
  53. package/dist/types/kernel/dgram.d.ts +56 -0
  54. package/dist/types/kernel/dial.d.ts +20 -0
  55. package/dist/types/kernel/epoll.d.ts +67 -0
  56. package/dist/types/kernel/eventfd.d.ts +19 -0
  57. package/dist/types/kernel/exec-ticket.d.ts +25 -0
  58. package/dist/types/kernel/fd-table.d.ts +107 -0
  59. package/dist/types/kernel/host-ops.d.ts +98 -0
  60. package/dist/types/kernel/host.d.ts +116 -0
  61. package/dist/types/kernel/jobs.d.ts +50 -0
  62. package/dist/types/kernel/locks.d.ts +40 -0
  63. package/dist/types/kernel/net/datagram-wire.d.ts +8 -0
  64. package/dist/types/kernel/net/http-syscalls.d.ts +58 -0
  65. package/dist/types/kernel/net/http1.d.ts +48 -0
  66. package/dist/types/kernel/net/loopback-names.d.ts +14 -0
  67. package/dist/types/kernel/net/loopback-transport.d.ts +13 -0
  68. package/dist/types/kernel/net/network.d.ts +29 -0
  69. package/dist/types/kernel/net/proxy-service.d.ts +70 -0
  70. package/dist/types/kernel/net/realm-ca.d.ts +28 -0
  71. package/dist/types/kernel/net/redirect-hops.d.ts +5 -0
  72. package/dist/types/kernel/net/remote-transport.d.ts +98 -0
  73. package/dist/types/kernel/net/resolver.d.ts +29 -0
  74. package/dist/types/kernel/net/routes.d.ts +15 -0
  75. package/dist/types/kernel/net/tls-engine.d.ts +46 -0
  76. package/dist/types/kernel/net/tls-tunnel.d.ts +35 -0
  77. package/dist/types/kernel/net/transport.d.ts +64 -0
  78. package/dist/types/kernel/net/uplink-socket.d.ts +11 -0
  79. package/dist/types/kernel/net/uplink.d.ts +163 -0
  80. package/dist/types/kernel/net/ws-queue.d.ts +21 -0
  81. package/dist/types/kernel/net/ws-syscalls.d.ts +45 -0
  82. package/dist/types/kernel/net/x509.d.ts +34 -0
  83. package/dist/types/kernel/pipe.d.ts +29 -0
  84. package/dist/types/kernel/proc-info.d.ts +44 -0
  85. package/dist/types/kernel/process.d.ts +525 -0
  86. package/dist/types/kernel/protocol.d.ts +126 -0
  87. package/dist/types/kernel/pty.d.ts +84 -0
  88. package/dist/types/kernel/run-child.d.ts +39 -0
  89. package/dist/types/kernel/scrub-file.d.ts +13 -0
  90. package/dist/types/kernel/sealed.d.ts +74 -0
  91. package/dist/types/kernel/select.d.ts +7 -0
  92. package/dist/types/kernel/sem.d.ts +72 -0
  93. package/dist/types/kernel/settling.d.ts +16 -0
  94. package/dist/types/kernel/signals.d.ts +44 -0
  95. package/dist/types/kernel/socket-syscalls.d.ts +74 -0
  96. package/dist/types/kernel/socket.d.ts +125 -0
  97. package/dist/types/kernel/timer.d.ts +4 -0
  98. package/dist/types/kernel/tty.d.ts +53 -0
  99. package/dist/types/kernel/vfs-file.d.ts +149 -0
  100. package/dist/types/launcher.d.ts +359 -0
  101. package/dist/types/local-proxy-transport.d.ts +39 -0
  102. package/dist/types/meta.d.ts +11 -0
  103. package/dist/types/mount/chunked.d.ts +9 -0
  104. package/dist/types/mount/connection.d.ts +35 -0
  105. package/dist/types/mount/driver.d.ts +50 -0
  106. package/dist/types/mount/fsa.d.ts +26 -0
  107. package/dist/types/mount/fstab.d.ts +17 -0
  108. package/dist/types/mount/host.d.ts +24 -0
  109. package/dist/types/mount/hostfs.d.ts +129 -0
  110. package/dist/types/mount/media.d.ts +8 -0
  111. package/dist/types/mount/medium.d.ts +12 -0
  112. package/dist/types/mount/mount-fs.d.ts +136 -0
  113. package/dist/types/mount/protocol.d.ts +140 -0
  114. package/dist/types/mount/syscall.d.ts +27 -0
  115. package/dist/types/mount/tmpfs.d.ts +2 -0
  116. package/dist/types/node/loopback.d.ts +11 -0
  117. package/dist/types/node/memory-root.d.ts +2 -0
  118. package/dist/types/node/ws-diagnose.d.ts +4 -0
  119. package/dist/types/node.d.ts +85 -0
  120. package/dist/types/process/fd-metadata.d.ts +4 -0
  121. package/dist/types/process/js/async-sab.d.ts +15 -0
  122. package/dist/types/process/js/js-children.d.ts +63 -0
  123. package/dist/types/process/js/js-context.d.ts +133 -0
  124. package/dist/types/process/js/js-dev.d.ts +50 -0
  125. package/dist/types/process/js/js-exit.d.ts +15 -0
  126. package/dist/types/process/js/js-fetch.d.ts +2 -0
  127. package/dist/types/process/js/js-io.d.ts +81 -0
  128. package/dist/types/process/js/js-kernel.d.ts +61 -0
  129. package/dist/types/process/js/js-net.d.ts +42 -0
  130. package/dist/types/process/js/js-proc.d.ts +31 -0
  131. package/dist/types/process/js/js-run.d.ts +35 -0
  132. package/dist/types/process/js/js-sync.d.ts +86 -0
  133. package/dist/types/process/js/js-tty.d.ts +30 -0
  134. package/dist/types/process/js/js-websocket.d.ts +21 -0
  135. package/dist/types/process/kernel-streams.d.ts +196 -0
  136. package/dist/types/process/process-fds.d.ts +95 -0
  137. package/dist/types/process/process-locks.d.ts +29 -0
  138. package/dist/types/process/process-pty.d.ts +20 -0
  139. package/dist/types/process/process-signals.d.ts +33 -0
  140. package/dist/types/process/procfs.d.ts +41 -0
  141. package/dist/types/process/wasi/dylink.d.ts +9 -0
  142. package/dist/types/process/wasi/slicc-lock.d.ts +26 -0
  143. package/dist/types/process/wasi/slicc-sem.d.ts +3 -0
  144. package/dist/types/process/wasi/wasi-abi.d.ts +156 -0
  145. package/dist/types/process/wasi/wasi-fds.d.ts +130 -0
  146. package/dist/types/process/wasi/wasi-files.d.ts +99 -0
  147. package/dist/types/process/wasi/wasi-host.d.ts +104 -0
  148. package/dist/types/process/wasi/wasi-memory.d.ts +16 -0
  149. package/dist/types/process/wasi/wasi-module.d.ts +13 -0
  150. package/dist/types/process/wasi/wasi-poll.d.ts +13 -0
  151. package/dist/types/process/wasi/wasi-procfs.d.ts +36 -0
  152. package/dist/types/process/wasi/wasi-sigmask.d.ts +19 -0
  153. package/dist/types/process/wasi/wasi-signals.d.ts +43 -0
  154. package/dist/types/process/wasi/wasi-termios.d.ts +10 -0
  155. package/dist/types/process/wasi/wasix-fork.d.ts +63 -0
  156. package/dist/types/process/wasi/wasix-linker.d.ts +108 -0
  157. package/dist/types/process/wasi/wasix-sockets.d.ts +9 -0
  158. package/dist/types/process/wasi/wasix-trampoline.d.ts +18 -0
  159. package/dist/types/process/wasi/wasm-functypes.d.ts +25 -0
  160. package/dist/types/process/wasi-errno.d.ts +1 -0
  161. package/dist/types/realm/emscripten-vfs-hook.d.ts +19 -0
  162. package/dist/types/realm/live-vfs-fs.d.ts +186 -0
  163. package/dist/types/realm/sync-fs-dispatch.d.ts +26 -0
  164. package/dist/types/realm/sync-fs-token-registry.d.ts +36 -0
  165. package/dist/types/realm/sync-fs-wire.d.ts +118 -0
  166. package/dist/types/realm/sync-sab-bridge.d.ts +21 -0
  167. package/dist/types/realm/sync-sab-responder.d.ts +16 -0
  168. package/dist/types/realm/sync-sab-wire.d.ts +64 -0
  169. package/dist/types/sealed-relay.d.ts +26 -0
  170. package/dist/types/serve.d.ts +190 -0
  171. package/dist/types/sudo-command.d.ts +4 -0
  172. package/dist/types/sudo.d.ts +105 -0
  173. package/dist/types/testing.d.ts +46 -0
  174. package/dist/types/transport.d.ts +25 -0
  175. package/dist/types/users.d.ts +86 -0
  176. package/dist/types/version.d.ts +3 -0
  177. package/dist/types/websocket-transport.d.ts +12 -0
  178. package/package.json +22 -6
@@ -0,0 +1,56 @@
1
+ export declare const SYS_CAP_US = 20000;
2
+ export declare function epochMicros(): number;
3
+ export declare const rawWait: (typed: Int32Array, index: number, value: number, timeout?: number) => 'ok' | 'not-equal' | 'timed-out';
4
+ export declare function useLocalClock(sab: SharedArrayBuffer | undefined): void;
5
+ export declare function localWait<T>(wait: () => T, blocks?: boolean): T;
6
+ export declare function localCpuNanos(): bigint | undefined;
7
+ export declare function localIdle(sab: SharedArrayBuffer, now: number): {
8
+ idle: number;
9
+ waiting: boolean;
10
+ };
11
+ export interface CpuTimes {
12
+ utime: number;
13
+ stime: number;
14
+ }
15
+ export declare class CpuClock {
16
+ private readonly start;
17
+ private sys;
18
+ private idle;
19
+ private since;
20
+ private kind;
21
+ private stopped;
22
+ private last;
23
+ private readonly sab;
24
+ private readonly now;
25
+ constructor(sab: SharedArrayBuffer, now?: () => number);
26
+ enter(): void;
27
+ block(): void;
28
+ leave(): void;
29
+ stop(stopped: boolean): void;
30
+ private frozen;
31
+ freeze(): void;
32
+ running(): boolean;
33
+ times(): CpuTimes;
34
+ private add;
35
+ }
36
+ export declare class ProcessClocks {
37
+ private readonly main;
38
+ private readonly threads;
39
+ private readonly ended;
40
+ private readonly enabled;
41
+ constructor(sab: SharedArrayBuffer, enabled?: boolean, states?: {
42
+ onState(listener: (state: string) => void): void;
43
+ });
44
+ thread(tid: number, sab: SharedArrayBuffer): CpuClock;
45
+ threadEnded(tid: number): void;
46
+ stop(stopped: boolean): void;
47
+ freeze(): void;
48
+ times(): CpuTimes | undefined;
49
+ running(): number;
50
+ states(): Array<{
51
+ tid: number;
52
+ state: 'R' | 'S';
53
+ }>;
54
+ timed<R, T>(clock: CpuClock | undefined, dispatch: (req: R, block: () => void) => Promise<T>): (req: R) => Promise<T>;
55
+ private all;
56
+ }
@@ -0,0 +1,17 @@
1
+ export interface Cred {
2
+ ruid: number;
3
+ euid: number;
4
+ suid: number;
5
+ rgid: number;
6
+ egid: number;
7
+ sgid: number;
8
+ groups: number[];
9
+ }
10
+ export type CredChange = Partial<Cred>;
11
+ export declare const ROOT: Readonly<Cred>;
12
+ export declare const MAX_GROUPS = 65536;
13
+ export declare function userCred(uid: number, gid: number, groups?: number[]): Cred;
14
+ export declare function copyCred(cred: Readonly<Cred>): Cred;
15
+ export declare function changeCred(cur: Readonly<Cred>, change: CredChange): Cred;
16
+ export declare function maySignal(sender: Readonly<Cred>, target: Readonly<Cred>): boolean;
17
+ export declare function maySee(viewer: Readonly<Cred>, target: Readonly<Cred>): boolean;
@@ -0,0 +1,56 @@
1
+ import { type KernelFile, type PollState } from './fd-table.js';
2
+ import { type LoopbackNet, type SockAddr } from './socket.js';
3
+ export type InetAddr = Extract<SockAddr, {
4
+ family: 'inet';
5
+ }>;
6
+ export interface Datagram {
7
+ bytes: Uint8Array;
8
+ from: InetAddr;
9
+ }
10
+ export interface Received {
11
+ bytes: Uint8Array;
12
+ from: InetAddr;
13
+ truncated: boolean;
14
+ }
15
+ export declare const DGRAM_QUEUE_BYTES: number;
16
+ export declare const DGRAM_QUEUE_COUNT = 512;
17
+ export declare const DGRAM_SEND_ROOM: number;
18
+ export declare const MAX_DATAGRAM_V4 = 65507;
19
+ export declare const MAX_DATAGRAM_V6 = 65527;
20
+ export declare class KernelDgram implements KernelFile {
21
+ local: InetAddr | undefined;
22
+ peer: InetAddr | undefined;
23
+ private readonly net;
24
+ private readonly queue;
25
+ private queued;
26
+ private pending;
27
+ private closed;
28
+ private sending;
29
+ private readonly changes;
30
+ private readonly options;
31
+ private readonly uplinks;
32
+ private readonly stop;
33
+ constructor(net: LoopbackNet);
34
+ bind(addr: SockAddr): void;
35
+ private bound;
36
+ connectTo(addr: SockAddr): void;
37
+ private drain;
38
+ private route;
39
+ private takeError;
40
+ send(bytes: Uint8Array, to?: SockAddr): Promise<number>;
41
+ private sendUp;
42
+ private uplinkSocket;
43
+ private pump;
44
+ private unreachable;
45
+ deliver(datagram: Datagram): boolean;
46
+ receive(max: number, peek: boolean, signal?: AbortSignal): Promise<Received>;
47
+ read(max: number, signal?: AbortSignal): Promise<Uint8Array>;
48
+ peek(max: number, signal?: AbortSignal): Promise<Uint8Array>;
49
+ write(bytes: Uint8Array): Promise<number>;
50
+ poll(): PollState;
51
+ changed(signal?: AbortSignal): Promise<void>;
52
+ shutdown(how: number): void;
53
+ getOption(level: number, name: number): number;
54
+ setOption(level: number, name: number, value: number): void;
55
+ close(): void;
56
+ }
@@ -0,0 +1,20 @@
1
+ import { type KernelSocket, type LoopbackNet } from './socket.js';
2
+ export interface DialPortLike {
3
+ postMessage(message: unknown, transfer?: Transferable[]): void;
4
+ addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;
5
+ start?(): void;
6
+ close(): void;
7
+ }
8
+ export type DialMessage = Uint8Array | {
9
+ end: true;
10
+ } | {
11
+ close: true;
12
+ } | {
13
+ more: true;
14
+ } | {
15
+ ack: true;
16
+ } | {
17
+ error: string;
18
+ };
19
+ export declare function dialSocket(net: LoopbackNet, port: number, host?: string): KernelSocket;
20
+ export declare function serveSocket(socket: KernelSocket, port: DialPortLike, onClose?: () => void): () => void;
@@ -0,0 +1,67 @@
1
+ import type { SyncFsResult } from '../realm/sync-fs-wire.js';
2
+ import { type FdTable, type KernelFile, type PollState } from './fd-table.js';
3
+ export declare const EPOLL: {
4
+ readonly IN: 1;
5
+ readonly OUT: 2;
6
+ readonly RDHUP: 4;
7
+ readonly PRI: 8;
8
+ readonly ERR: 16;
9
+ readonly HUP: 32;
10
+ readonly ET: 64;
11
+ readonly ONESHOT: 128;
12
+ };
13
+ export type EpollOp = 'add' | 'mod' | 'del' | 'set';
14
+ export interface EpollEvent {
15
+ events: number;
16
+ data: number[];
17
+ }
18
+ export type EpollSyscall = {
19
+ op: 'epoll-create';
20
+ } | {
21
+ op: 'epoll-ctl';
22
+ epfd: number;
23
+ how: EpollOp;
24
+ fd: number;
25
+ events: number;
26
+ data: number[];
27
+ } | {
28
+ op: 'epoll-wait';
29
+ epfd: number;
30
+ max: number;
31
+ timeoutMs: number;
32
+ } | {
33
+ op: 'eventfd-open';
34
+ initial: string;
35
+ semaphore: boolean;
36
+ };
37
+ export declare const EPOLL_OPS: readonly EpollSyscall['op'][];
38
+ export interface Interest {
39
+ events: number;
40
+ gen: number;
41
+ reported: number;
42
+ armed: boolean;
43
+ }
44
+ export declare function levelOf(file: KernelFile): number;
45
+ export declare function due(interest: Interest, level: number): number;
46
+ export declare function consume(interest: Interest): void;
47
+ export declare class EpollFile implements KernelFile {
48
+ private readonly regs;
49
+ private readonly changes;
50
+ private cursor;
51
+ ctl(fds: FdTable, how: EpollOp, fd: number, events: number, data: number[]): void;
52
+ reaches(target: EpollFile): boolean;
53
+ collect(fds: FdTable, max: number): EpollEvent[];
54
+ wait(fds: FdTable, max: number, timeoutMs: number, signal: AbortSignal): Promise<EpollEvent[]>;
55
+ poll(): PollState;
56
+ changed(signal?: AbortSignal): Promise<void>;
57
+ close(): void;
58
+ private register;
59
+ private drop;
60
+ private watch;
61
+ }
62
+ export interface EpollProcess {
63
+ fds: FdTable;
64
+ blocking(): AbortSignal;
65
+ owed(): boolean;
66
+ }
67
+ export declare function epollSyscall(req: EpollSyscall, proc: EpollProcess): Promise<SyncFsResult>;
@@ -0,0 +1,19 @@
1
+ import { type KernelFile, type PollState } from './fd-table.js';
2
+ export declare const EVENTFD_MAX = 18446744073709551614n;
3
+ export declare class Notifier {
4
+ private waiters;
5
+ wait(signal?: AbortSignal): Promise<void>;
6
+ wake(): void;
7
+ }
8
+ export declare class EventFd implements KernelFile {
9
+ static readonly SIZE = 8;
10
+ private count;
11
+ private readonly semaphore;
12
+ private readonly changes;
13
+ constructor(initial: bigint, semaphore: boolean);
14
+ read(max: number, signal?: AbortSignal): Promise<Uint8Array>;
15
+ write(bytes: Uint8Array, signal?: AbortSignal): Promise<number>;
16
+ poll(): PollState;
17
+ changed(signal?: AbortSignal): Promise<void>;
18
+ close(): void;
19
+ }
@@ -0,0 +1,25 @@
1
+ export declare const TICKET_ENV = "SLICC_SEALED_TICKET";
2
+ export declare const TICKET_TTL_MS = 30000;
3
+ export declare const MAX_TICKETS = 256;
4
+ export interface Booked {
5
+ pid: number;
6
+ path: string;
7
+ requested: string;
8
+ requestedCwd: string;
9
+ argv: string;
10
+ cwd: string;
11
+ at: number;
12
+ }
13
+ export declare function argvDigest(argv: readonly string[]): Promise<string>;
14
+ export declare function isStrings(value: unknown): value is string[];
15
+ export declare function stringRecord(value: unknown): Record<string, string> | undefined;
16
+ export declare class TicketBook {
17
+ private readonly booked;
18
+ private readonly now;
19
+ normalise: (path: string) => Promise<string>;
20
+ constructor(now?: () => number);
21
+ get size(): number;
22
+ record(req: Record<string, unknown>, reply: object, pid: number): Promise<void>;
23
+ take(ticket: string): Booked | undefined;
24
+ private prune;
25
+ }
@@ -0,0 +1,107 @@
1
+ import type { ClipboardChannel } from './clipboard.js';
2
+ import type { PtyPair } from './pty.js';
3
+ import type { SealedChannel } from './sealed.js';
4
+ import type { KernelTty } from './tty.js';
5
+ export type KernelErrno = 'EBADF' | 'EDEADLK' | 'ENOLCK' | 'EEXIST' | 'ELOOP' | 'EOVERFLOW' | 'ENAMETOOLONG' | 'EPIPE' | 'EMFILE' | 'EINVAL' | 'ENOENT' | 'ENOTDIR' | 'ENOEXEC' | 'ECHILD' | 'ENOSYS' | 'ESPIPE' | 'ENOSPC' | 'EINTR' | 'ESRCH' | 'ENOTTY' | 'ENXIO' | 'EPERM' | 'EIO' | 'EACCES' | 'EAGAIN' | 'ENOTSOCK' | 'EAFNOSUPPORT' | 'EPROTONOSUPPORT' | 'EOPNOTSUPP' | 'EADDRINUSE' | 'EADDRNOTAVAIL' | 'ENETUNREACH' | 'ECONNREFUSED' | 'EINPROGRESS' | 'EISCONN' | 'ENOTCONN' | 'EROFS' | 'EFBIG' | 'EALREADY' | 'ETIMEDOUT' | 'ECONNABORTED' | 'EHOSTUNREACH' | 'ECONNRESET' | 'EMSGSIZE' | 'EDESTADDRREQ' | 'ENOPROTOOPT' | 'ENOTSUP' | 'EILSEQ';
6
+ export declare class KernelError extends Error {
7
+ readonly code: KernelErrno;
8
+ readonly detail?: string;
9
+ constructor(code: KernelErrno, detail?: string);
10
+ }
11
+ export interface PollState {
12
+ readable: boolean;
13
+ writable: boolean;
14
+ hangup: boolean;
15
+ rdhup?: boolean;
16
+ error?: boolean;
17
+ }
18
+ export interface KernelFile {
19
+ read?(max: number, signal?: AbortSignal): Promise<Uint8Array>;
20
+ peek?(max: number, signal?: AbortSignal): Promise<Uint8Array>;
21
+ write?(bytes: Uint8Array, signal?: AbortSignal): Promise<number>;
22
+ close(): void | Promise<void>;
23
+ poll?(): PollState;
24
+ changed?(signal?: AbortSignal): Promise<void>;
25
+ seek?(offset: number, whence: number): Promise<number>;
26
+ flush?(): Promise<void>;
27
+ pread?(max: number, at: number): Promise<Uint8Array>;
28
+ pwrite?(bytes: Uint8Array, at: number): Promise<number>;
29
+ resize?(size: number): Promise<void>;
30
+ stat?(): Promise<{
31
+ path: string;
32
+ size: number;
33
+ orphan?: true;
34
+ }>;
35
+ known?(): number | undefined;
36
+ tty?: KernelTty;
37
+ pty?: PtyPair;
38
+ sealed?: SealedChannel;
39
+ clipboard?: ClipboardChannel;
40
+ held?: true;
41
+ heldMeta?: HeldMeta;
42
+ }
43
+ export type HeldMeta = {
44
+ dir: string;
45
+ preopen?: string;
46
+ twin?: number;
47
+ } | DeviceMeta;
48
+ export interface DeviceMeta {
49
+ device: KernelDevice;
50
+ access?: DeviceAccess;
51
+ }
52
+ export type DeviceAccess = 'read' | 'write';
53
+ export type OpenAccess = 'read' | 'write' | 'both';
54
+ export declare function openAccess(flags: number): OpenAccess;
55
+ export type KernelDevice = 'null' | 'zero' | 'full' | 'urandom';
56
+ export declare function pollFile(file: KernelFile): PollState;
57
+ export declare class OpenFile {
58
+ private refs;
59
+ private closers;
60
+ readonly file: KernelFile;
61
+ constructor(file: KernelFile);
62
+ retain(): this;
63
+ onClose(fn: () => void): () => void;
64
+ release(): void | Promise<void>;
65
+ }
66
+ export declare function openPipe(capacity?: number): {
67
+ read: OpenFile;
68
+ write: OpenFile;
69
+ };
70
+ export declare function bytesSource(data: Uint8Array): OpenFile;
71
+ export declare function memoryFile(data: Uint8Array, path: string, position?: number): OpenFile;
72
+ export declare function sinkFile(onData: (bytes: Uint8Array) => void): OpenFile;
73
+ export declare function nullFile(): OpenFile;
74
+ export declare function deviceAt(path: string): KernelDevice | undefined;
75
+ export declare function deviceFile(device: KernelDevice, access?: DeviceAccess): OpenFile;
76
+ export declare function heldFile(meta?: HeldMeta): OpenFile;
77
+ export type KernelFdKind = 'tty' | 'stream' | 'file' | 'socket' | 'held' | 'device' | 'sealed' | 'clipboard';
78
+ export declare function kernelFdKind(file: KernelFile): Exclude<KernelFdKind, 'socket'>;
79
+ export interface ForkedHandles {
80
+ fork(): ForkedHandles;
81
+ clear(): void;
82
+ }
83
+ export declare class FdTable {
84
+ static readonly MAX_FDS = 1024;
85
+ handles: ForkedHandles | undefined;
86
+ private fds;
87
+ private readonly cloexec;
88
+ private readonly status;
89
+ get(fd: number): OpenFile;
90
+ stdioTerminal(): KernelTty | undefined;
91
+ numbers(): number[];
92
+ has(fd: number): boolean;
93
+ setCloseOnExec(fd: number): void;
94
+ clearCloseOnExec(fd: number): void;
95
+ closesOnExec(fd: number): boolean;
96
+ setStatusFlags(fd: number, flags: number): void;
97
+ statusFlags(fd: number): number | undefined;
98
+ install(file: OpenFile, min?: number): number;
99
+ installAt(fd: number, file: OpenFile): void;
100
+ replaceAt(fd: number, file: OpenFile): Promise<void>;
101
+ dup(fd: number, min?: number): number;
102
+ dup2(oldFd: number, newFd: number): number;
103
+ dup2Clipboard(oldFd: number, newFd: number): Promise<number>;
104
+ close(fd: number): void | Promise<void>;
105
+ fork(): FdTable;
106
+ closeAll(): Promise<void>;
107
+ }
@@ -0,0 +1,98 @@
1
+ import type { SyncFsResult } from '../realm/sync-fs-wire.js';
2
+ import { type LockKind, type LockTable } from './locks.js';
3
+ export interface LockTarget {
4
+ path?: string;
5
+ fd?: number;
6
+ }
7
+ export type HostSyscall = {
8
+ op: 'lock';
9
+ path: string;
10
+ exclusive: boolean;
11
+ fd: number;
12
+ } | {
13
+ op: 'unlock';
14
+ path: string;
15
+ } | ({
16
+ op: 'lk-set';
17
+ kind: LockKind | 'unlock';
18
+ start: number;
19
+ len: number;
20
+ wait?: boolean;
21
+ } & LockTarget) | ({
22
+ op: 'lk-get';
23
+ kind: LockKind;
24
+ start: number;
25
+ len: number;
26
+ } & LockTarget) | ({
27
+ op: 'lk-close';
28
+ } & LockTarget) | {
29
+ op: 'async-submit';
30
+ req: {
31
+ op: string;
32
+ };
33
+ ack?: number[];
34
+ } | {
35
+ op: 'async-wait';
36
+ timeoutMs?: number;
37
+ } | {
38
+ op: 'async-take';
39
+ id: number;
40
+ } | {
41
+ op: 'async-resolve';
42
+ value: unknown;
43
+ } | {
44
+ op: 'async-hold';
45
+ } | {
46
+ op: 'async-cancel';
47
+ id: number;
48
+ } | {
49
+ op: 'async-settle';
50
+ ids: number[];
51
+ } | {
52
+ op: 'async-close';
53
+ };
54
+ export declare const HOST_OPS: readonly HostSyscall['op'][];
55
+ type Run = (req: {
56
+ op: string;
57
+ }, cancelled: AbortSignal) => Promise<SyncFsResult>;
58
+ export declare class AsyncOps {
59
+ private next;
60
+ private readonly results;
61
+ private readonly ready;
62
+ private readonly running;
63
+ private readonly waiters;
64
+ private readonly taken;
65
+ private readonly kept;
66
+ private closed;
67
+ private readonly run;
68
+ private readonly onReady;
69
+ constructor(run: Run, onReady?: () => void);
70
+ submit(req: {
71
+ op: string;
72
+ }): number;
73
+ resolve(value: unknown): number;
74
+ hold(): number;
75
+ take(id: number): SyncFsResult;
76
+ ack(ids: readonly number[]): void;
77
+ settle(ids: readonly number[]): Promise<Array<SyncFsResult | null>>;
78
+ cancel(id: number): void;
79
+ private forget;
80
+ wait(timeoutMs: number | undefined, blocking: () => AbortSignal): Promise<number>;
81
+ close(): void;
82
+ private sleep;
83
+ private complete;
84
+ private wake;
85
+ }
86
+ export interface HostOpsContext {
87
+ pid: number;
88
+ owner?: () => number;
89
+ fileKey?: (target: LockTarget, kind: LockKind | 'unlock' | 'close', setting?: boolean) => Promise<string>;
90
+ locks: LockTable | undefined;
91
+ ops: AsyncOps;
92
+ blocking: () => AbortSignal;
93
+ valid: (req: {
94
+ op: string;
95
+ }) => boolean;
96
+ }
97
+ export declare function hostSyscall(req: HostSyscall, ctx: HostOpsContext): Promise<SyncFsResult>;
98
+ export {};
@@ -0,0 +1,116 @@
1
+ import { type Dac } from '../fs/dac.js';
2
+ import { type PathGate } from '../fs/unlinked.js';
3
+ import { HeldPaths } from '../mount/mount-fs.js';
4
+ import { type SourceCheck, type SyncFsTokenEntry } from '../realm/sync-fs-token-registry.js';
5
+ import { type BlockedMask } from '../realm/sync-sab-wire.js';
6
+ import type { ChildForker, ChildSpawner } from './children.js';
7
+ import type { ClipboardBroker } from './clipboard.js';
8
+ import { type CpuTimes } from './cpu-clock.js';
9
+ import { type Cred } from './cred.js';
10
+ import { type FdTable, type OpenFile } from './fd-table.js';
11
+ import type { JobTable } from './jobs.js';
12
+ import type { LockTable } from './locks.js';
13
+ import type { HttpHandles } from './net/http-syscalls.js';
14
+ import type { Resolver } from './net/resolver.js';
15
+ import type { MountLine, ProcessListing } from './proc-info.js';
16
+ import { type StateListener, type WasmProcessOptions, type WasmSyscall } from './process.js';
17
+ import { type ForkState, type InheritedFd, type Program } from './protocol.js';
18
+ import type { PtyTable } from './pty.js';
19
+ import type { SealedBroker } from './sealed.js';
20
+ import type { SemTable } from './sem.js';
21
+ import { type LoopbackNet } from './socket.js';
22
+ import type { VfsNodes } from './vfs-file.js';
23
+ export interface WasmWorkerLike {
24
+ postMessage(message: unknown, transfer?: Transferable[]): void;
25
+ addEventListener(type: 'message' | 'error', handler: (event: MessageEvent) => void): void;
26
+ removeEventListener(type: 'message' | 'error', handler: (event: MessageEvent) => void): void;
27
+ terminate(): void;
28
+ }
29
+ export interface SpawnWasmOptions {
30
+ pid: number;
31
+ changes?: SharedArrayBuffer;
32
+ ignored?: number;
33
+ blocked?: BlockedMask;
34
+ umask?: number;
35
+ cred?: Cred;
36
+ owners?: boolean;
37
+ links?: number;
38
+ fresh?: (path: string, umask: number) => void;
39
+ source?: SourceCheck;
40
+ sealed?: SealedBroker;
41
+ outputFilter?: (file: OpenFile) => OpenFile;
42
+ clipboard?: ClipboardBroker;
43
+ readonlyAt?: (path: string) => boolean;
44
+ dac?: Dac;
45
+ identity?: () => Promise<{
46
+ pid: number;
47
+ ppid: number;
48
+ }>;
49
+ onSyscall?: (req: WasmSyscall) => void;
50
+ settling?: () => boolean;
51
+ program: Program;
52
+ argv0: string;
53
+ args: string[];
54
+ env: Record<string, string>;
55
+ cwd: string;
56
+ fds: FdTable;
57
+ fs: SyncFsTokenEntry['fs'];
58
+ noLinks: SyncFsTokenEntry['fs'];
59
+ createWorker: () => WasmWorkerLike;
60
+ onError?: (message: string) => void;
61
+ spawner?: ChildSpawner;
62
+ forker?: ChildForker;
63
+ fork?: ForkState;
64
+ ppid?: number;
65
+ shownPid?: number;
66
+ kill?: (pid: number, sig: number) => boolean | Promise<boolean>;
67
+ writesBack?: (pid: number) => boolean;
68
+ processes?: () => ProcessListing;
69
+ sudo?: WasmProcessOptions['sudo'];
70
+ openFiles?: Set<VfsNodes>;
71
+ nodes?: VfsNodes;
72
+ statfs?: (path: string) => Promise<{
73
+ quota: number;
74
+ usage: number;
75
+ } | undefined>;
76
+ mounts?: () => MountLine[];
77
+ mount?: WasmProcessOptions['mount'];
78
+ umount?: WasmProcessOptions['umount'];
79
+ held?: Set<HeldPaths>;
80
+ unlinkGate?: PathGate;
81
+ jobs?: JobTable;
82
+ ptys?: PtyTable;
83
+ net?: LoopbackNet;
84
+ http?: HttpHandles;
85
+ locks?: LockTable;
86
+ sems?: SemTable;
87
+ onReap?: (pid: number) => void;
88
+ resolver?: Resolver;
89
+ }
90
+ export interface WasmProcessHandle {
91
+ pid: number;
92
+ exited: Promise<number>;
93
+ kill(code?: number): void;
94
+ signal(sig: number): void;
95
+ termsig(): number | undefined;
96
+ onState(listener: StateListener): void;
97
+ memory(): number;
98
+ ignoredSignals(fork?: boolean): number;
99
+ blockedSignals?(): BlockedMask;
100
+ signalMasks?(): {
101
+ ignored: number;
102
+ caught: number;
103
+ };
104
+ umask?(): number;
105
+ cred?(): Cred;
106
+ writesBack(): boolean;
107
+ times?(): CpuTimes | undefined;
108
+ running?(): number;
109
+ threads?(): Array<{
110
+ tid: number;
111
+ state: 'R' | 'S';
112
+ }>;
113
+ }
114
+ export declare const KILL_GRACE_MS = 2000;
115
+ export declare function inheritedFds(fds: FdTable): InheritedFd[];
116
+ export declare function spawnWasmProcess(opts: SpawnWasmOptions): WasmProcessHandle;
@@ -0,0 +1,50 @@
1
+ import type { KernelTty } from './tty.js';
2
+ export interface JobMember {
3
+ pid: number;
4
+ pgid: number;
5
+ sid: number;
6
+ signal(sig: number): void;
7
+ execParent?: number;
8
+ ppid?: number;
9
+ execed?: boolean;
10
+ shownAs?: number;
11
+ }
12
+ export declare class JobTable {
13
+ private readonly members;
14
+ private readonly handoffs;
15
+ private readonly foreground;
16
+ private readonly terminals;
17
+ keyboard: boolean;
18
+ add(pid: number, parentPid: number | undefined, signal: (sig: number) => void, terminal?: KernelTty): JobMember;
19
+ list(): JobMember[];
20
+ remove(pid: number): void;
21
+ private prune;
22
+ exec(pid: number, child: number, adopt?: boolean): void;
23
+ shown(pid: number): number;
24
+ shownParent(pid: number): number | undefined;
25
+ sessionOf(pgid: number): number | undefined;
26
+ join(pid: number, pgid: number): void;
27
+ lead(pid: number): void;
28
+ pgidOf(pid: number): number | undefined;
29
+ sidOf(pid: number): number | undefined;
30
+ private member;
31
+ private idOf;
32
+ private byId;
33
+ setpgid(caller: number, pid: number, pgid: number): void;
34
+ get handoffCount(): number;
35
+ getpgid(caller: number, pid: number): number;
36
+ getsid(caller: number, pid: number): number;
37
+ setsid(pid: number): number;
38
+ terminalNamed(name: string): KernelTty | undefined;
39
+ terminalNames(): string[];
40
+ private knownTerminals;
41
+ controllingTerminal(pid: number): KernelTty | null | undefined;
42
+ acquireTerminal(pid: number, tty: KernelTty): boolean;
43
+ killGroup(pgid: number, sig: number, may?: (pid: number) => boolean): boolean;
44
+ tcgetpgrp(tty: KernelTty, fallback: number): number;
45
+ tcsetpgrp(caller: number, tty: KernelTty, pgid: number, settling?: boolean): void;
46
+ private reclaimed;
47
+ signalOwnedForeground(tty: KernelTty, sig: number): void;
48
+ signalForeground(tty: KernelTty, fallback: number, sig: number): void;
49
+ fromKeyboard(send: () => void): void;
50
+ }
@@ -0,0 +1,40 @@
1
+ export type LockKind = 'read' | 'write';
2
+ export interface RecordLock {
3
+ owner: number;
4
+ kind: LockKind;
5
+ start: number;
6
+ end: number;
7
+ }
8
+ interface Blocked {
9
+ key: string;
10
+ kind: LockKind;
11
+ start: number;
12
+ end: number;
13
+ }
14
+ export declare function lockRange(start: number, len: number): {
15
+ start: number;
16
+ end: number;
17
+ };
18
+ export declare class LockTable {
19
+ private readonly records;
20
+ private readonly blocked;
21
+ private readonly wakers;
22
+ private readonly held;
23
+ holder(key: string, owner: number, want: Blocked): RecordLock | undefined;
24
+ set(key: string, owner: number, kind: LockKind | 'unlock', start: number, end: number): boolean;
25
+ wait(key: string, owner: number, kind: LockKind, range: {
26
+ start: number;
27
+ end: number;
28
+ }, blocking: () => AbortSignal): Promise<void>;
29
+ private waitsOn;
30
+ private changed;
31
+ private wake;
32
+ private store;
33
+ holds(owner: number): boolean;
34
+ dropFile(key: string, owner: number): void;
35
+ lock(pid: number, path: string, exclusive: boolean, fd: number): boolean;
36
+ unlock(pid: number, path: string): void;
37
+ closed(pid: number, fd: number): void;
38
+ release(pid: number): void;
39
+ }
40
+ export {};
@@ -0,0 +1,8 @@
1
+ export interface Received {
2
+ bytes: Uint8Array;
3
+ host: string;
4
+ port: number;
5
+ truncated: boolean;
6
+ }
7
+ export declare function encodeReceived(got: Received): Uint8Array;
8
+ export declare function decodeReceived(raw: Uint8Array): Received;