@ai-ecoverse/slicc-kernel 1.133.4 → 1.134.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.
@@ -0,0 +1,65 @@
1
+ import type { HeldCwdInit } from './protocol.js';
2
+ export declare const CWD_SLOTS = 1024;
3
+ export declare const UNTRACKED: number;
4
+ export interface HeldCwdReply {
5
+ slot?: number;
6
+ seen?: number;
7
+ dead?: boolean;
8
+ }
9
+ export interface CwdAnswer {
10
+ gen: number;
11
+ alive: boolean;
12
+ slot?: number;
13
+ }
14
+ export type InodeOf = (path: string) => Promise<string | number | undefined>;
15
+ export declare class CwdTable {
16
+ readonly sab: SharedArrayBuffer;
17
+ private readonly view;
18
+ private readonly held;
19
+ private readonly free;
20
+ private next;
21
+ checks: number;
22
+ private readonly inodeOf;
23
+ constructor(inodeOf: InodeOf);
24
+ hold(path: string, from?: number): Promise<number>;
25
+ share(slot: number | undefined): number;
26
+ release(slot: number | undefined): void;
27
+ stateOf(slot: number): {
28
+ seen: number;
29
+ dead: boolean;
30
+ };
31
+ touched(paths: readonly string[], trees?: readonly string[]): void;
32
+ check(slot: number): Promise<CwdAnswer>;
33
+ }
34
+ export declare class HeldCwd {
35
+ private readonly view;
36
+ private seen;
37
+ private dead;
38
+ private slot;
39
+ private at;
40
+ private readonly ask;
41
+ constructor(sab: SharedArrayBuffer, slot: number, ask: () => CwdAnswer, state: {
42
+ seen: number;
43
+ dead: boolean;
44
+ path?: string;
45
+ });
46
+ moved(reply: HeldCwdReply, path?: string): boolean;
47
+ private follow;
48
+ alive(path?: string): boolean;
49
+ get current(): number;
50
+ }
51
+ export interface HeldOptions {
52
+ cwds?: SharedArrayBuffer;
53
+ cwdSlot?: number;
54
+ cwdState?: {
55
+ seen: number;
56
+ dead: boolean;
57
+ };
58
+ cwdCheck?: () => Promise<CwdAnswer>;
59
+ cwdChdir?: (path: string) => Promise<HeldCwdReply>;
60
+ }
61
+ export declare function heldInit(o: HeldOptions): {
62
+ held?: HeldCwdInit;
63
+ };
64
+ export declare function heldHooks(o: HeldOptions): Pick<HeldOptions, 'cwdCheck' | 'cwdChdir'>;
65
+ export declare function inheritedCwd(chdir: boolean | undefined, parent: number | undefined): number | undefined;
@@ -9,6 +9,7 @@ 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
11
  import type { FifoTable } from './fifo.js';
12
+ import { type CwdAnswer, type HeldCwdReply } from './held-cwd.js';
12
13
  import type { JobTable } from './jobs.js';
13
14
  import type { KernelLocks } from './lock-service.js';
14
15
  import type { HttpHandles } from './net/http-syscalls.js';
@@ -31,6 +32,14 @@ export interface WasmWorkerLike {
31
32
  export interface SpawnWasmOptions {
32
33
  pid: number;
33
34
  changes?: SharedArrayBuffer;
35
+ cwds?: SharedArrayBuffer;
36
+ cwdSlot?: number;
37
+ cwdState?: {
38
+ seen: number;
39
+ dead: boolean;
40
+ };
41
+ cwdCheck?: () => Promise<CwdAnswer>;
42
+ cwdChdir?: (path: string) => Promise<HeldCwdReply>;
34
43
  ignored?: number;
35
44
  blocked?: BlockedMask;
36
45
  umask?: number;
@@ -1,12 +1,24 @@
1
+ import type { SessionScram } from '../sealed-session.js';
1
2
  export declare const PG_MESSAGE_MAX: number;
2
- export type PgAsk = (placeholders: string[]) => Promise<Record<string, string> | undefined>;
3
3
  export declare function sniffPg(start: string): 'yes' | 'no' | 'more';
4
+ export interface PgExpect {
5
+ real: string;
6
+ fake: string;
7
+ }
4
8
  export declare class PgServer {
5
9
  private buffer;
6
10
  private skip;
7
- private lost;
8
11
  cleartext: boolean;
9
- feed(bytes: Uint8Array): void;
12
+ sasl: boolean;
13
+ serverFirst: string | undefined;
14
+ expect: PgExpect | undefined;
15
+ failed: boolean;
16
+ private lost;
17
+ private auth;
18
+ private mechanisms;
19
+ private final;
20
+ private lose;
21
+ filter(bytes: Uint8Array): Uint8Array;
10
22
  }
11
23
  export interface PgFrame {
12
24
  bytes: Uint8Array;
@@ -14,4 +26,15 @@ export interface PgFrame {
14
26
  done: boolean;
15
27
  }
16
28
  export declare function pgLength(bytes: Uint8Array, started: boolean): number | undefined;
17
- export declare function pgPassword(message: Uint8Array, server: PgServer, ask: PgAsk): Promise<PgFrame>;
29
+ export interface PgAsks {
30
+ cleartext(placeholders: string[]): Promise<Record<string, string> | undefined>;
31
+ scram(scram: SessionScram): Promise<Record<string, string> | undefined>;
32
+ }
33
+ export declare class PgClient {
34
+ private clientFirst;
35
+ private readonly server;
36
+ private readonly asks;
37
+ constructor(server: PgServer, asks: PgAsks);
38
+ message(message: Uint8Array): Promise<PgFrame>;
39
+ private final;
40
+ }
@@ -0,0 +1,20 @@
1
+ export interface ScramExchange {
2
+ clientFirstBare: string;
3
+ serverFirst: string;
4
+ clientFinalBare: string;
5
+ salt: Uint8Array;
6
+ iterations: number;
7
+ }
8
+ export interface ScramKeys {
9
+ proof: Uint8Array;
10
+ serverSignature: Uint8Array;
11
+ }
12
+ export declare function base64Of(bytes: Uint8Array): string;
13
+ export declare function clientFirstBare(message: string): string | undefined;
14
+ export declare function exchangeOf(clientFirst: string, serverFirst: string, clientFinal: string): {
15
+ exchange: ScramExchange;
16
+ proof: Uint8Array;
17
+ } | undefined;
18
+ export declare function scramKeys(password: string, x: ScramExchange): Promise<ScramKeys>;
19
+ export declare function saslprep(password: string): string;
20
+ export declare function sameBytes(a: Uint8Array, b: Uint8Array): boolean;
@@ -13,6 +13,7 @@ import { type Cred, type CredChange } from './cred.js';
13
13
  import { type EpollSyscall } from './epoll.js';
14
14
  import { type DeviceAccess, type FdTable, type HeldMeta, type KernelFdKind, type OpenFile } from './fd-table.js';
15
15
  import type { FifoTable } from './fifo.js';
16
+ import type { CwdAnswer, HeldCwdReply } from './held-cwd.js';
16
17
  import { type HostSyscall } from './host-ops.js';
17
18
  import type { JobTable } from './jobs.js';
18
19
  import type { KernelLocks } from './lock-service.js';
@@ -188,6 +189,11 @@ export type WasmSyscall = {
188
189
  } | {
189
190
  op: 'proc-umask';
190
191
  mask?: number;
192
+ } | {
193
+ op: 'cwd-check';
194
+ } | {
195
+ op: 'cwd-chdir';
196
+ path: string;
191
197
  } | {
192
198
  op: 'proc-cred';
193
199
  } | {
@@ -353,6 +359,8 @@ export declare function isWasmSyscall(req: object): req is WasmSyscall;
353
359
  export declare const DEFAULT_UMASK = 18;
354
360
  export interface WasmProcessOptions {
355
361
  ignored?: number;
362
+ cwdCheck?: () => Promise<CwdAnswer>;
363
+ cwdChdir?: (path: string) => Promise<HeldCwdReply>;
356
364
  source?: SourceCheck;
357
365
  umask?: number;
358
366
  cred?: Cred;
@@ -80,6 +80,12 @@ export interface InheritedFd {
80
80
  desc?: number;
81
81
  fifo?: string;
82
82
  }
83
+ export interface HeldCwdInit {
84
+ sab: SharedArrayBuffer;
85
+ slot: number;
86
+ seen: number;
87
+ dead: boolean;
88
+ }
83
89
  export interface WasmProcessInitMsg {
84
90
  type: typeof WASM_PROCESS_INIT;
85
91
  pid: number;
@@ -90,6 +96,7 @@ export interface WasmProcessInitMsg {
90
96
  cwd: string;
91
97
  sab: SharedArrayBuffer;
92
98
  changes?: SharedArrayBuffer;
99
+ held?: HeldCwdInit;
93
100
  ppid?: number;
94
101
  umask?: number;
95
102
  cred?: Cred;
@@ -8,6 +8,12 @@ export interface SessionHead {
8
8
  method: string;
9
9
  path: string;
10
10
  }
11
+ export interface SessionScram {
12
+ clientFirstBare: string;
13
+ serverFirst: string;
14
+ clientFinalBare: string;
15
+ proof: string;
16
+ }
11
17
  export interface SessionFields {
12
18
  stamp: SealedCaller;
13
19
  session: string;
@@ -18,8 +24,9 @@ export interface SessionFields {
18
24
  verified: boolean;
19
25
  handshakeAt: number;
20
26
  exit: string;
21
- placeholders: string[];
27
+ placeholders?: string[];
22
28
  head?: SessionHead;
29
+ scram?: SessionScram;
23
30
  }
24
31
  export declare function boundHost(servername: string): string;
25
32
  export declare function sessionAskable(f: SessionFields, now: number): boolean;
@@ -36,10 +43,16 @@ export declare function sessionRequest(f: SessionFields): {
36
43
  verified: boolean;
37
44
  handshakeAt: number;
38
45
  exit: string;
39
- placeholders: string[];
46
+ placeholders?: string[] | undefined;
40
47
  head?: {
41
48
  method: string;
42
49
  path: string;
43
50
  } | undefined;
51
+ scram?: {
52
+ clientFirstBare: string;
53
+ serverFirst: string;
54
+ clientFinalBare: string;
55
+ proof: string;
56
+ } | undefined;
44
57
  };
45
- export declare function sessionValues(reply: unknown, asked: readonly string[]): Record<string, string> | undefined;
58
+ export declare function sessionValues(reply: unknown, asked: readonly string[] | undefined): Record<string, string> | undefined;
@@ -14,6 +14,7 @@ import { FsWatchers } from './fs/watch.js';
14
14
  import { type ClipboardHook } from './kernel/clipboard.js';
15
15
  import type { CpuTimes } from './kernel/cpu-clock.js';
16
16
  import { type Cred } from './kernel/cred.js';
17
+ import { CwdTable } from './kernel/held-cwd.js';
17
18
  import { type WasmWorkerLike } from './kernel/host.js';
18
19
  import type { CaStore } from './kernel/net/realm-ca.js';
19
20
  import { Resolver } from './kernel/net/resolver.js';
@@ -200,6 +201,8 @@ export declare class Launcher {
200
201
  readonly hostname: string;
201
202
  readonly watchers: FsWatchers;
202
203
  private readonly changes;
204
+ readonly cwds: CwdTable;
205
+ private readonly cwdSlots;
203
206
  private readonly pnpmHome;
204
207
  private readonly pnpmChain;
205
208
  private pnpmMade;
@@ -343,6 +346,8 @@ export declare class Launcher {
343
346
  private identityOf;
344
347
  private running;
345
348
  private decide;
349
+ private heldFor;
350
+ private chdirHeld;
346
351
  private forker;
347
352
  private keySignal;
348
353
  private resolvePrefixes;
@@ -1,4 +1,5 @@
1
1
  import { type DeviceAccess, type DeviceMeta, type KernelFdKind } from '../../kernel/fd-table.js';
2
+ import type { HeldCwd } from '../../kernel/held-cwd.js';
2
3
  import type { WasmSyscall } from '../../kernel/process.js';
3
4
  import { type SyncFsBridgeStat, type SyncFsPosixBridge } from '../../realm/sync-fs-wire.js';
4
5
  import type { ProcessSys } from '../kernel-streams.js';
@@ -117,7 +118,13 @@ export declare class WasiFds {
117
118
  private survives;
118
119
  private detach;
119
120
  renamed(from: string, to: string, replacedLinked?: SyncFsBridgeStat): void;
121
+ held: HeldCwd | undefined;
122
+ private cwdEntry;
123
+ goneCwd(dir: Extract<WasiEntry, {
124
+ type: 'dir';
125
+ }>): boolean;
120
126
  resolve(dirfd: number, path: string): string;
127
+ private joined;
121
128
  private openKernelDevice;
122
129
  private openCharDevice;
123
130
  open(path: string, oflags: number, rights: bigint, fdflags: number, mode?: number): number;
@@ -1,4 +1,5 @@
1
1
  import type { DeviceMeta, KernelFdKind } from '../../kernel/fd-table.js';
2
+ import type { HeldCwd } from '../../kernel/held-cwd.js';
2
3
  import type { SyncFsPosixBridge } from '../../realm/sync-fs-wire.js';
3
4
  import { WasiFds, type WasiForkFd, type WasiKernel } from './wasi-fds.js';
4
5
  import { WasiMemory } from './wasi-memory.js';
@@ -35,6 +36,7 @@ export interface WasiHostOptions {
35
36
  };
36
37
  preopenRoot?: boolean;
37
38
  bare?: boolean;
39
+ held?: HeldCwd;
38
40
  }
39
41
  export type WasiFunction = (...args: never[]) => number | undefined;
40
42
  export declare class WasiHost {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-kernel",
3
- "version": "1.133.4",
3
+ "version": "1.134.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,14 +66,14 @@
66
66
  "@ai-ecoverse/py-numpy": "2.5.4-1",
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.25.1",
69
+ "@ai-ecoverse/slicc-shared-web": "1.25.2",
70
70
  "@ai-ecoverse/wasi-cargo": "0.99.0-3",
71
- "@ai-ecoverse/wasi-pnpm": "12.9.1-15",
71
+ "@ai-ecoverse/wasi-pnpm": "12.9.1-16",
72
72
  "@ai-ecoverse/wasi-ripgrep": "15.2.0-5",
73
73
  "@ai-ecoverse/wasi-rustc": "1.98.1-6",
74
74
  "@ai-ecoverse/wasi-zig": "0.16.0-17",
75
75
  "@ai-ecoverse/wasix-python": "3.15.0-2",
76
- "@ai-ecoverse/wasm-bash": "5.3.0-20",
76
+ "@ai-ecoverse/wasm-bash": "5.3.0-21",
77
77
  "@ai-ecoverse/wasm-coreutils": "9.12.0-10",
78
78
  "@ai-ecoverse/wasm-curl": "8.22.0-7",
79
79
  "@ai-ecoverse/wasm-git": "2.55.0-17",