@ai-ecoverse/slicc-kernel 1.152.1 → 1.153.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.
@@ -2,6 +2,7 @@ import type { CdpHook } from '../cdp/types.js';
2
2
  import type { FacadeHook } from '../facade/types.js';
3
3
  import type { FsStat, UsersMode } from '../fs/types.js';
4
4
  import type { WatchChange } from '../fs/watch.js';
5
+ import { type EmbedderHook } from '../kernel/embedder.js';
5
6
  import type { RealmTransport, RealmTransportRequest, RealmTransportResponse, RealmTransportTraits } from '../kernel/net/transport.js';
6
7
  import type { MountEntry, MountSpec } from '../mount/mount-fs.js';
7
8
  import { type DialledSocket, type DialOptions } from './dial-stream.js';
@@ -19,6 +20,7 @@ export declare class KernelCallError extends Error {
19
20
  export interface AttachOptions {
20
21
  timeoutMs?: number;
21
22
  locks?: LockManagerLike | null;
23
+ requests?: EmbedderHook;
22
24
  }
23
25
  export interface SpawnOptions {
24
26
  cwd?: string;
@@ -7,6 +7,10 @@ export declare const PROTOCOL: readonly [number, number];
7
7
  export interface ClientHello {
8
8
  protocol: readonly [number, number];
9
9
  lock?: string;
10
+ requests?: Record<string, {
11
+ group?: string;
12
+ users?: Array<string | number>;
13
+ }>;
10
14
  }
11
15
  export interface KernelHello {
12
16
  protocol: readonly [number, number];
@@ -10,6 +10,8 @@ export interface ClientHost {
10
10
  signal?: (name: string) => number;
11
11
  user?: string | number;
12
12
  tag?: string;
13
+ session?: number;
14
+ attachRequests?: boolean;
13
15
  }
14
16
  export interface ServedClient {
15
17
  detach(kill?: boolean): void;
@@ -0,0 +1,58 @@
1
+ import type { EmbedderHook, EmbedderKindPolicy, EmbedderStamp } from './kernel/embedder.js';
2
+ export interface EmbedderPort {
3
+ postMessage(message: unknown, transfer?: Transferable[]): void;
4
+ }
5
+ type Kinds = Readonly<Record<string, EmbedderKindPolicy>>;
6
+ export interface EmbedderAsk {
7
+ id: number;
8
+ client: number;
9
+ kind: string;
10
+ options: Record<string, unknown>;
11
+ stamp: EmbedderStamp;
12
+ }
13
+ export type EmbedderToPage = {
14
+ ask: EmbedderAsk;
15
+ } | {
16
+ id: number;
17
+ body: Uint8Array;
18
+ } | {
19
+ id: number;
20
+ bodyEnd: true;
21
+ } | {
22
+ id: number;
23
+ pull: true;
24
+ } | {
25
+ id: number;
26
+ cancel: string;
27
+ };
28
+ export type EmbedderToKernel = {
29
+ id: number;
30
+ ready: true;
31
+ } | {
32
+ id: number;
33
+ chunk: Uint8Array;
34
+ } | {
35
+ id: number;
36
+ done: true;
37
+ } | {
38
+ id: number;
39
+ error: {
40
+ name: string;
41
+ message: string;
42
+ };
43
+ } | {
44
+ id: number;
45
+ progress: string;
46
+ } | {
47
+ id: number;
48
+ bodyPull: true;
49
+ };
50
+ export declare function embedderAsker(port: EmbedderPort): {
51
+ hookFor: (client: number, kinds: Kinds) => EmbedderHook;
52
+ answer: (message: EmbedderToKernel) => void;
53
+ };
54
+ export declare function embedderAnswerer(port: EmbedderPort, hookFor: (client: number) => EmbedderHook | undefined): {
55
+ handle(data: unknown): boolean;
56
+ };
57
+ export declare function embedderReplyOf(data: unknown): EmbedderToKernel | undefined;
58
+ export {};
@@ -6,16 +6,19 @@ export interface Replacements {
6
6
  generation(): number;
7
7
  changedSince(path: string, gen: number): boolean;
8
8
  inFlight?(path: string): boolean;
9
+ landed?(path: string): Promise<void>;
9
10
  }
10
11
  export declare class PathMarks {
11
12
  private gen;
12
13
  private floor;
13
14
  private readonly touched;
14
15
  private readonly flying;
16
+ private readonly waiting;
15
17
  generation(): number;
16
18
  touch(target: string): void;
17
19
  changedSince(path: string, gen: number): boolean;
18
20
  around<T>(paths: readonly string[], op: () => Promise<T>): Promise<T>;
21
+ landed(path: string): Promise<void>;
19
22
  inFlight(path: string): boolean;
20
23
  }
21
24
  export interface KeptFile {
@@ -87,6 +90,7 @@ export declare class UnlinkedKeeper {
87
90
  settled(path: string): Promise<void>;
88
91
  generation(): number;
89
92
  changedSince(path: string, gen: number): boolean;
93
+ landed(path: string): Promise<void>;
90
94
  inFlight(path: string): boolean;
91
95
  missed(path: string): boolean;
92
96
  settle(pinned: Pinned, op: () => Promise<void>): Promise<void>;
@@ -7,6 +7,7 @@ import type { DenialHook } from './fs/dac.js';
7
7
  import { type Protection } from './fs/protect.js';
8
8
  import { type UsersMode } from './fs/types.js';
9
9
  import type { ClipboardHook } from './kernel/clipboard.js';
10
+ import { type EmbedderHook } from './kernel/embedder.js';
10
11
  import type { RouteTable } from './kernel/net/routes.js';
11
12
  import { type NetworkUplink } from './kernel/net/uplink.js';
12
13
  import type { SealedHook } from './kernel/sealed.js';
@@ -24,6 +25,7 @@ export type { FacadeConnection, FacadeHook, FacadeInfo, FacadeSpec, FacadeSpecs,
24
25
  export type { Attestation, AttestedDir } from './fs/attest.js';
25
26
  export type { Denial, DenialHook } from './fs/dac.js';
26
27
  export type { ClipboardHook, ClipboardStamp } from './kernel/clipboard.js';
28
+ export type { EmbedderHook, EmbedderKindPolicy, EmbedderReply, EmbedderRequest, EmbedderStamp, } from './kernel/embedder.js';
27
29
  export type { RouteTable } from './kernel/net/routes.js';
28
30
  export type { NetworkUplink, ResolveAnswer, ResolveFamily, UplinkTraits, } from './kernel/net/uplink.js';
29
31
  export type { SealedAbortReason, SealedCaller, SealedHook, SealedRequest, } from './kernel/sealed.js';
@@ -73,6 +75,7 @@ export interface KernelOptions {
73
75
  onDenial?: DenialHook;
74
76
  sealed?: SealedHook;
75
77
  clipboard?: ClipboardHook;
78
+ requests?: EmbedderHook;
76
79
  approve?: ApproveHook;
77
80
  protect?: Protection;
78
81
  }
@@ -99,6 +102,7 @@ export interface RunResult {
99
102
  export interface ConnectOptions {
100
103
  user?: string | number;
101
104
  tag?: string;
105
+ requests?: EmbedderHook | 'attach';
102
106
  }
103
107
  export interface KernelGroups {
104
108
  list(): Promise<Group[]>;
@@ -0,0 +1,100 @@
1
+ import type { UsersMode } from '../fs/types.js';
2
+ import { KernelError, type OpenAccess, OpenFile, type PollState } from './fd-table.js';
3
+ export declare const EMBEDDER_PATH = "/dev/embedder";
4
+ export declare const EMBEDDER_MINOR = 252;
5
+ export declare const EMBEDDER_HEADER_MAX: number;
6
+ export declare const EMBEDDER_WINDOW: number;
7
+ export declare const EMBEDDER_BUDGET: number;
8
+ export declare const EMBEDDER_PER_PROCESS = 16;
9
+ export declare const EMBEDDER_PROGRESS_PER_SECOND = 4;
10
+ export interface EmbedderStamp {
11
+ pid: number;
12
+ uid: number;
13
+ gid: number;
14
+ groups: number[];
15
+ users: UsersMode;
16
+ kind: string;
17
+ tag?: string;
18
+ tags?: string[];
19
+ }
20
+ export interface EmbedderKindPolicy {
21
+ group?: string;
22
+ users?: Array<string | number>;
23
+ }
24
+ export type EmbedderReply = ReadableStream<Uint8Array> | Uint8Array | string | undefined | void;
25
+ export interface EmbedderRequest {
26
+ kind: string;
27
+ options: Record<string, unknown>;
28
+ body: ReadableStream<Uint8Array>;
29
+ stamp: EmbedderStamp;
30
+ signal: AbortSignal;
31
+ progress(line: string): void;
32
+ }
33
+ export interface EmbedderHook {
34
+ kinds: Readonly<Record<string, EmbedderKindPolicy>>;
35
+ handle(request: EmbedderRequest): Promise<EmbedderReply>;
36
+ }
37
+ export interface EmbedderCaller {
38
+ pid: number;
39
+ shownPid: number;
40
+ euid: number;
41
+ egid: number;
42
+ groups: number[];
43
+ sessionUid: number;
44
+ client: number;
45
+ tags: readonly string[] | undefined;
46
+ progress(line: string): void;
47
+ closing(): AbortSignal;
48
+ }
49
+ export interface EmbedderLookup {
50
+ groupId(name: string): Promise<number | undefined>;
51
+ userId(name: string): Promise<number | undefined>;
52
+ }
53
+ export declare function embedderFailure(err: unknown): KernelError;
54
+ export declare class EmbedderChannel {
55
+ readonly access: OpenAccess;
56
+ readonly owner: number;
57
+ caller: EmbedderCaller;
58
+ private readonly broker;
59
+ private header;
60
+ private body;
61
+ private reply;
62
+ private replied;
63
+ private rest;
64
+ private done;
65
+ private failure;
66
+ private reported;
67
+ private readonly abort;
68
+ private closed;
69
+ private readonly throttle;
70
+ constructor(broker: EmbedderBroker, access: OpenAccess, caller: EmbedderCaller);
71
+ get dispatched(): boolean;
72
+ private fail;
73
+ private report;
74
+ private dispatch;
75
+ write(bytes: Uint8Array, signal?: AbortSignal): Promise<number>;
76
+ private writeBody;
77
+ private readerOf;
78
+ read(max: number, signal?: AbortSignal): Promise<Uint8Array>;
79
+ private next;
80
+ poll(): PollState;
81
+ cancel(reason: 'interrupted' | 'closed'): void;
82
+ close(): Promise<void>;
83
+ private drain;
84
+ }
85
+ export declare class EmbedderBroker {
86
+ readonly users: UsersMode;
87
+ private readonly lookup;
88
+ private readonly hooks;
89
+ private readonly budget;
90
+ private readonly open;
91
+ readonly tagsOf: (pid: number) => readonly string[] | undefined;
92
+ constructor(users: UsersMode, lookup: EmbedderLookup, tagsOf?: (pid: number) => readonly string[] | undefined, budget?: number);
93
+ register(client: number, hook: EmbedderHook | undefined): () => void;
94
+ hookFor(client: number): EmbedderHook | undefined;
95
+ private allowed;
96
+ admit(kind: string, caller: EmbedderCaller): Promise<EmbedderStamp>;
97
+ channel(access: OpenAccess, caller: EmbedderCaller): OpenFile;
98
+ release(channel: EmbedderChannel): void;
99
+ }
100
+ export declare function kindsOf(hook: EmbedderHook): Record<string, EmbedderKindPolicy>;
@@ -1,4 +1,5 @@
1
1
  import type { ClipboardChannel } from './clipboard.js';
2
+ import type { EmbedderChannel } from './embedder.js';
2
3
  import type { PtyPair } from './pty.js';
3
4
  import type { SealedChannel } from './sealed.js';
4
5
  import type { KernelTty } from './tty.js';
@@ -39,6 +40,7 @@ export interface KernelFile {
39
40
  pty?: PtyPair;
40
41
  sealed?: SealedChannel;
41
42
  clipboard?: ClipboardChannel;
43
+ embedder?: EmbedderChannel;
42
44
  held?: true;
43
45
  heldMeta?: HeldMeta;
44
46
  identity?: object;
@@ -78,7 +80,7 @@ export declare function nullFile(): OpenFile;
78
80
  export declare function deviceAt(path: string): KernelDevice | undefined;
79
81
  export declare function deviceFile(device: KernelDevice, access?: DeviceAccess): OpenFile;
80
82
  export declare function heldFile(meta?: HeldMeta): OpenFile;
81
- export type KernelFdKind = 'tty' | 'stream' | 'file' | 'socket' | 'held' | 'device' | 'sealed' | 'clipboard';
83
+ export type KernelFdKind = 'tty' | 'stream' | 'file' | 'socket' | 'held' | 'device' | 'sealed' | 'clipboard' | 'embedder';
82
84
  export declare function kernelFdKind(file: KernelFile): Exclude<KernelFdKind, 'socket'>;
83
85
  export interface ForkedHandles {
84
86
  fork(): ForkedHandles;
@@ -7,6 +7,7 @@ import type { ChildForker, ChildSpawner } from './children.js';
7
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
+ import type { EmbedderBroker } from './embedder.js';
10
11
  import { type FdTable, type OpenFile } from './fd-table.js';
11
12
  import type { FifoTable } from './fifo.js';
12
13
  import { type CwdAnswer, type HeldCwdReply } from './held-cwd.js';
@@ -54,6 +55,13 @@ export interface SpawnWasmOptions {
54
55
  sealed?: SealedBroker;
55
56
  outputFilter?: (file: OpenFile) => OpenFile;
56
57
  clipboard?: ClipboardBroker;
58
+ embedder?: {
59
+ broker: EmbedderBroker;
60
+ session: () => {
61
+ client: number;
62
+ uid: number;
63
+ };
64
+ };
57
65
  readonlyAt?: (path: string) => boolean;
58
66
  dac?: Dac;
59
67
  identity?: () => Promise<{
@@ -10,6 +10,7 @@ import type { SudoCall, SudoResult } from '../sudo.js';
10
10
  import { type ChildForker, type ChildSpawner, type ChildStdio, type InheritedSlot } from './children.js';
11
11
  import type { ClipboardBroker } from './clipboard.js';
12
12
  import { type Cred, type CredChange } from './cred.js';
13
+ import { type EmbedderBroker } from './embedder.js';
13
14
  import { type EpollSyscall } from './epoll.js';
14
15
  import { type DeviceAccess, type FdTable, type HeldMeta, type KernelFdKind, type OpenFile } from './fd-table.js';
15
16
  import type { FifoTable } from './fifo.js';
@@ -230,6 +231,9 @@ export type WasmSyscall = {
230
231
  } | {
231
232
  op: 'fd-clipboard-abort';
232
233
  fd: number;
234
+ } | {
235
+ op: 'fd-open-embedder';
236
+ flags: number;
233
237
  } | {
234
238
  op: 'tty-get';
235
239
  fd: number;
@@ -370,6 +374,12 @@ export interface WasmProcessOptions {
370
374
  outputFilter?: (file: OpenFile) => OpenFile;
371
375
  clipboard?: ClipboardBroker;
372
376
  clipboardName?: string;
377
+ embedder?: EmbedderBroker;
378
+ embedderSession?: () => {
379
+ client: number;
380
+ uid: number;
381
+ };
382
+ embedderName?: string;
373
383
  readonlyAt?: (path: string) => boolean;
374
384
  guard?: {
375
385
  dac: Dac;
@@ -504,6 +514,13 @@ export declare class WasmProcess {
504
514
  private cancelSignal;
505
515
  private read;
506
516
  private readClipboard;
517
+ private readEmbedder;
518
+ private writeEmbedder;
519
+ private deviceComplaint;
520
+ private complainLine;
521
+ private embedderCaller;
522
+ private closeFd;
523
+ private openEmbedder;
507
524
  complain(line: string): Promise<boolean>;
508
525
  private clipboardComplaint;
509
526
  private write;
@@ -12,6 +12,11 @@ import type { KernelFs, UsersMode } from './fs/types.js';
12
12
  import { type UnlinkOwner } from './fs/unlinked.js';
13
13
  import { FsWatchers } from './fs/watch.js';
14
14
  import { type ClipboardHook } from './kernel/clipboard.js';
15
+ import { EmbedderBroker, type EmbedderHook } from './kernel/embedder.js';
16
+ type EmbedderSession = {
17
+ client: number;
18
+ uid: number;
19
+ };
15
20
  import type { CpuTimes } from './kernel/cpu-clock.js';
16
21
  import { type Cred } from './kernel/cred.js';
17
22
  import { CwdTable } from './kernel/held-cwd.js';
@@ -65,6 +70,7 @@ export interface LauncherOptions {
65
70
  onDenial?: DenialHook;
66
71
  sealed?: SealedHook;
67
72
  clipboard?: ClipboardHook;
73
+ embedder?: EmbedderHook;
68
74
  approve?: ApproveHook;
69
75
  sudoTimeoutMs?: number;
70
76
  protect?: Protection;
@@ -101,6 +107,7 @@ export interface RunOptions {
101
107
  tags?: readonly string[];
102
108
  tagBase?: number;
103
109
  login?: boolean;
110
+ session?: number;
104
111
  }
105
112
  export interface TerminalOptions {
106
113
  cwd?: string;
@@ -111,6 +118,7 @@ export interface TerminalOptions {
111
118
  tag?: string;
112
119
  tags?: readonly string[];
113
120
  tagBase?: number;
121
+ session?: number;
114
122
  onData: (bytes: Uint8Array) => void;
115
123
  }
116
124
  export interface TerminalSession {
@@ -186,6 +194,7 @@ export declare class Launcher {
186
194
  private readonly described;
187
195
  private readonly creds;
188
196
  private readonly tags;
197
+ private readonly sessions;
189
198
  private readonly tagBases;
190
199
  private readonly links;
191
200
  private readonly freshModules;
@@ -243,6 +252,7 @@ export declare class Launcher {
243
252
  private readonly sealed;
244
253
  private readonly scrubs;
245
254
  private readonly clipboard;
255
+ readonly embedder: EmbedderBroker;
246
256
  private readonly rootFs;
247
257
  private fileWatches;
248
258
  private nextPid;
@@ -376,6 +386,9 @@ export declare class Launcher {
376
386
  private umaskOf;
377
387
  private imageOf;
378
388
  credOf(pid: number): Cred;
389
+ private wireSealed;
390
+ private embedderBroker;
391
+ sessionOf(pid: number): EmbedderSession;
379
392
  tagOf(pid: number): string | undefined;
380
393
  tagsOf(pid: number): readonly string[] | undefined;
381
394
  private wireDac;
@@ -86,6 +86,7 @@ export declare class HeldPaths extends Map<string, number> implements UnlinkHold
86
86
  } | undefined;
87
87
  bindIds(id: (path: string) => Promise<string> | undefined): Promise<void>;
88
88
  trust(handle: number, doubt: number): void;
89
+ pathOf(handle: number): string | undefined;
89
90
  keptFor(handle: number): KeptFile | undefined;
90
91
  holdsHandle(handle: number): boolean;
91
92
  keeps(hidden: string): boolean;
@@ -7,6 +7,7 @@ import type { Protection } from './fs/protect.js';
7
7
  import { type UsersMode } from './fs/types.js';
8
8
  import type { ConnectOptions, KernelGroups, KernelIntegrity, KernelUsers, RunOptions, RunResult, Terminal, TerminalOptions } from './index.js';
9
9
  import type { ClipboardHook } from './kernel/clipboard.js';
10
+ import { type EmbedderHook } from './kernel/embedder.js';
10
11
  import type { RouteTable } from './kernel/net/routes.js';
11
12
  import type { NetworkUplink } from './kernel/net/uplink.js';
12
13
  import type { SealedHook } from './kernel/sealed.js';
@@ -23,6 +24,7 @@ export type { FacadeConnection, FacadeHook, FacadeInfo, FacadeSpec, FacadeSpecs,
23
24
  export type { Denial, DenialHook } from './fs/dac.js';
24
25
  export type { ConnectOptions, Ended, KernelGroups, KernelIntegrity, KernelUsers, NetworkUplink, ResolveAnswer, ResolveFamily, RouteTable, RunOptions, RunResult, Terminal, TerminalOptions, TerminalSignal, } from './index.js';
25
26
  export type { ClipboardHook, ClipboardStamp } from './kernel/clipboard.js';
27
+ export type { EmbedderHook, EmbedderKindPolicy, EmbedderReply, EmbedderRequest, EmbedderStamp, } from './kernel/embedder.js';
26
28
  export type { SealedAbortReason, SealedCaller, SealedHook, SealedRequest, } from './kernel/sealed.js';
27
29
  export type { ConnectorStamp } from './kernel/socket.js';
28
30
  export type { HostfsEvent, HostfsGrant, HostfsGrantHook, HostfsPortGrant, HostfsTransport, } from './mount/hostfs.js';
@@ -57,6 +59,7 @@ export interface NodeKernelOptions {
57
59
  onDenial?: DenialHook;
58
60
  sealed?: SealedHook;
59
61
  clipboard?: ClipboardHook;
62
+ requests?: EmbedderHook;
60
63
  approve?: ApproveHook;
61
64
  protect?: Protection;
62
65
  cron?: {
@@ -64,6 +64,7 @@ export interface ProcessSys {
64
64
  openSealed?(flags: number): number;
65
65
  openClipboard?(flags: number): number;
66
66
  clipboardAbort?(fd: number): void;
67
+ openEmbedder?(flags: number): number;
67
68
  procList?(): ProcessListing;
68
69
  mountList?(): MountLine[];
69
70
  }
@@ -156,7 +157,7 @@ export declare class KernelStreams {
156
157
  socketStream(flags: number): ProcessStream;
157
158
  nameTerminal(stream: ProcessStream): void;
158
159
  private nameStream;
159
- nameDevice(stream: ProcessStream, kind: 'sealed' | 'clipboard'): void;
160
+ nameDevice(stream: ProcessStream, kind: 'sealed' | 'clipboard' | 'embedder'): void;
160
161
  private listSealed;
161
162
  private openNode;
162
163
  private readonly reporting;
@@ -28,6 +28,7 @@ export type WasiForkFd = {
28
28
  };
29
29
  export declare const SEALED_PATH = "/dev/sealed";
30
30
  export declare const CLIPBOARD_PATH = "/dev/clipboard";
31
+ export declare const EMBEDDER_PATH = "/dev/embedder";
31
32
  export declare function deviceOf(path: string): Device | undefined;
32
33
  export declare class WasiFds {
33
34
  private readonly table;
@@ -12,6 +12,7 @@ export interface SyncFsTokenEntry {
12
12
  } | undefined>;
13
13
  hold?: (path: string, held: boolean, open: boolean, real?: string, handle?: number, ino?: number, fid?: string) => number | undefined;
14
14
  keptFor?: (handle: number) => KeptFile | undefined;
15
+ heldAt?: (handle: number) => string | undefined;
15
16
  boundIno?: (handle: number) => {
16
17
  ino: number;
17
18
  fid?: string;
@@ -2,6 +2,7 @@ import { type LockManagerLike } from './client/protocol.js';
2
2
  import { type MetaStore } from './fs/meta.js';
3
3
  import { type ProtectInit } from './fs/protect.js';
4
4
  import { type UsersMode } from './fs/types.js';
5
+ import type { EmbedderKindPolicy } from './kernel/embedder.js';
5
6
  import type { WasmWorkerLike } from './kernel/host.js';
6
7
  import type { RouteTable } from './kernel/net/routes.js';
7
8
  import type { RealmTransportTraits } from './kernel/net/transport.js';
@@ -42,6 +43,7 @@ export interface InitRequest {
42
43
  denials?: boolean;
43
44
  sealed?: boolean;
44
45
  clipboard?: boolean;
46
+ requests?: Record<string, EmbedderKindPolicy>;
45
47
  approve?: boolean;
46
48
  processMounts?: boolean | 'ask';
47
49
  cdp?: boolean;
@@ -85,6 +87,7 @@ export interface ConnectRequest {
85
87
  op: 'connect';
86
88
  user?: string | number;
87
89
  tag?: string;
90
+ requests?: Record<string, EmbedderKindPolicy> | 'attach';
88
91
  }
89
92
  export type UsersRequest = {
90
93
  id: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-kernel",
3
- "version": "1.152.1",
3
+ "version": "1.153.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",
@@ -64,7 +64,7 @@
64
64
  },
65
65
  "devDependencies": {
66
66
  "@ai-ecoverse/py-numpy": "2.5.4-4",
67
- "@ai-ecoverse/slicc-cdp": "1.38.0",
67
+ "@ai-ecoverse/slicc-cdp": "1.39.2",
68
68
  "@ai-ecoverse/slicc-node": "2.5.2",
69
69
  "@ai-ecoverse/slicc-scrub": "1.1.0",
70
70
  "@ai-ecoverse/slicc-shared-web": "2.11.3",