@multiplayer-app/sandbox 2.0.0-wip-yjs-state-changes.0 → 3.0.0-wip-yjs-state-changes.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.
- package/README.md +4 -0
- package/dist/cli.js +3011 -97
- package/dist/cli.js.map +7 -1
- package/dist/executor/detect.d.ts +1 -1
- package/dist/executor/docker-executor.d.ts +1 -1
- package/dist/executor/docker-sandbox-executor.d.ts +1 -1
- package/dist/executor/fargate-executor.d.ts +1 -1
- package/dist/executor/firecracker-executor.d.ts +1 -1
- package/dist/executor/index.d.ts +1 -1
- package/dist/executor/lambda-microvm-executor.d.ts +1 -1
- package/dist/executor/mock-executor.d.ts +1 -1
- package/dist/executor/qemu-executor.d.ts +1 -1
- package/dist/executor/remote-executor.d.ts +1 -1
- package/dist/executor/types.d.ts +1 -1
- package/dist/images.d.ts +1 -1
- package/dist/index.js +3005 -29
- package/dist/index.js.map +7 -1
- package/dist/vendor/builder-types/access.d.ts +25 -0
- package/dist/vendor/builder-types/access.d.ts.map +1 -0
- package/dist/vendor/builder-types/events.d.ts +80 -0
- package/dist/vendor/builder-types/events.d.ts.map +1 -0
- package/dist/vendor/builder-types/index.d.ts +11 -0
- package/dist/vendor/builder-types/index.d.ts.map +1 -0
- package/dist/vendor/builder-types/release.d.ts +49 -0
- package/dist/vendor/builder-types/release.d.ts.map +1 -0
- package/dist/vendor/builder-types/vm.d.ts +101 -0
- package/dist/vendor/builder-types/vm.d.ts.map +1 -0
- package/dist/vendor/builder-types/worker.d.ts +25 -0
- package/dist/vendor/builder-types/worker.d.ts.map +1 -0
- package/package.json +15 -6
- package/dist/config.js +0 -144
- package/dist/config.js.map +0 -1
- package/dist/console-relays.js +0 -46
- package/dist/console-relays.js.map +0 -1
- package/dist/executor/detect.js +0 -184
- package/dist/executor/detect.js.map +0 -1
- package/dist/executor/docker-executor.js +0 -331
- package/dist/executor/docker-executor.js.map +0 -1
- package/dist/executor/docker-sandbox-executor.js +0 -343
- package/dist/executor/docker-sandbox-executor.js.map +0 -1
- package/dist/executor/fargate-executor.js +0 -293
- package/dist/executor/fargate-executor.js.map +0 -1
- package/dist/executor/firecracker-executor.js +0 -352
- package/dist/executor/firecracker-executor.js.map +0 -1
- package/dist/executor/index.js +0 -166
- package/dist/executor/index.js.map +0 -1
- package/dist/executor/lambda-microvm-executor.js +0 -211
- package/dist/executor/lambda-microvm-executor.js.map +0 -1
- package/dist/executor/mock-executor.js +0 -198
- package/dist/executor/mock-executor.js.map +0 -1
- package/dist/executor/mock-executor.test.js +0 -81
- package/dist/executor/mock-executor.test.js.map +0 -1
- package/dist/executor/qemu-executor.js +0 -383
- package/dist/executor/qemu-executor.js.map +0 -1
- package/dist/executor/reattach-utils.js +0 -11
- package/dist/executor/reattach-utils.js.map +0 -1
- package/dist/executor/remote-executor.js +0 -125
- package/dist/executor/remote-executor.js.map +0 -1
- package/dist/executor/types.js +0 -3
- package/dist/executor/types.js.map +0 -1
- package/dist/images.js +0 -163
- package/dist/images.js.map +0 -1
- package/dist/services/serial-relay.js +0 -74
- package/dist/services/serial-relay.js.map +0 -1
- package/dist/services/vnc-relay.js +0 -101
- package/dist/services/vnc-relay.js.map +0 -1
- package/dist/socket-client.js +0 -119
- package/dist/socket-client.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { VmAction } from './vm';
|
|
2
|
+
/** Events exchanged on the worker socket (sandbox side listens, worker side emits — and vice versa). */
|
|
3
|
+
export declare const WorkerEvent: {
|
|
4
|
+
readonly HEARTBEAT: "worker:heartbeat";
|
|
5
|
+
readonly REATTACH: "worker:reattach";
|
|
6
|
+
readonly VM_CREATE: "vm:create";
|
|
7
|
+
readonly VM_PAUSE: "vm:pause";
|
|
8
|
+
readonly VM_RESUME: "vm:resume";
|
|
9
|
+
readonly VM_STOP: "vm:stop";
|
|
10
|
+
readonly VM_RESTORE: "vm:restore";
|
|
11
|
+
readonly VM_DESTROY: "vm:destroy";
|
|
12
|
+
readonly PROXY_HTTP: "proxy:http";
|
|
13
|
+
readonly VM_EXEC: "vm:exec";
|
|
14
|
+
readonly VM_WRITE_FILES: "vm:write-files";
|
|
15
|
+
readonly VNC_INIT: "vnc:init";
|
|
16
|
+
readonly VNC_FRAME: "vnc:frame";
|
|
17
|
+
readonly VNC_COPY_FRAME: "vnc:copy-frame";
|
|
18
|
+
readonly TERMINAL_DATA: "terminal:data";
|
|
19
|
+
readonly VNC_MOUSE: "vnc:mouse";
|
|
20
|
+
readonly VNC_KEYBOARD: "vnc:keyboard";
|
|
21
|
+
readonly TERMINAL_INPUT: "terminal:input";
|
|
22
|
+
};
|
|
23
|
+
export type WorkerEventName = (typeof WorkerEvent)[keyof typeof WorkerEvent];
|
|
24
|
+
/** Maps a VmAction to its worker socket event name. */
|
|
25
|
+
export declare const VM_ACTION_EVENTS: Record<VmAction, string>;
|
|
26
|
+
/** Events on the browser-facing console Socket.io namespaces (/vnc and /terminal). */
|
|
27
|
+
export declare const ConsoleEvent: {
|
|
28
|
+
readonly VNC_INIT: "init";
|
|
29
|
+
readonly VNC_FRAME: "frame";
|
|
30
|
+
readonly VNC_COPY_FRAME: "copy-frame";
|
|
31
|
+
readonly VNC_MOUSE: "mouse";
|
|
32
|
+
readonly VNC_KEYBOARD: "keyboard";
|
|
33
|
+
readonly TERMINAL_DATA: "data";
|
|
34
|
+
readonly TERMINAL_INPUT: "data";
|
|
35
|
+
};
|
|
36
|
+
export interface VncInitPayload {
|
|
37
|
+
vmId: string;
|
|
38
|
+
width: number;
|
|
39
|
+
height: number;
|
|
40
|
+
}
|
|
41
|
+
export interface VncFramePayload {
|
|
42
|
+
vmId: string;
|
|
43
|
+
x: number;
|
|
44
|
+
y: number;
|
|
45
|
+
width: number;
|
|
46
|
+
height: number;
|
|
47
|
+
encoding: 'raw';
|
|
48
|
+
data: Buffer;
|
|
49
|
+
}
|
|
50
|
+
export interface VncCopyFramePayload {
|
|
51
|
+
vmId: string;
|
|
52
|
+
x: number;
|
|
53
|
+
y: number;
|
|
54
|
+
src: {
|
|
55
|
+
x: number;
|
|
56
|
+
y: number;
|
|
57
|
+
};
|
|
58
|
+
width: number;
|
|
59
|
+
height: number;
|
|
60
|
+
}
|
|
61
|
+
export interface TerminalDataPayload {
|
|
62
|
+
vmId: string;
|
|
63
|
+
data: Buffer;
|
|
64
|
+
}
|
|
65
|
+
export interface VncMousePayload {
|
|
66
|
+
vmId: string;
|
|
67
|
+
x: number;
|
|
68
|
+
y: number;
|
|
69
|
+
button: number;
|
|
70
|
+
}
|
|
71
|
+
export interface VncKeyboardPayload {
|
|
72
|
+
vmId: string;
|
|
73
|
+
keyCode: number;
|
|
74
|
+
isDown: boolean;
|
|
75
|
+
}
|
|
76
|
+
export interface TerminalInputPayload {
|
|
77
|
+
vmId: string;
|
|
78
|
+
data: string;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAIpC,wGAAwG;AACxG,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;CAkCd,CAAA;AAEV,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAA;AAE5E,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAKrD,CAAA;AAID,sFAAsF;AACtF,eAAO,MAAM,YAAY;;;;;;;;CAaf,CAAA;AAIV,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,KAAK,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type HealthStatus = {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
service: string;
|
|
4
|
+
timestamp: string;
|
|
5
|
+
};
|
|
6
|
+
export * from './worker';
|
|
7
|
+
export * from './vm';
|
|
8
|
+
export * from './access';
|
|
9
|
+
export * from './events';
|
|
10
|
+
export * from './release';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,cAAc,UAAU,CAAA;AACxB,cAAc,MAAM,CAAA;AACpB,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { VmStack } from './vm';
|
|
2
|
+
import type { GatewayAccessConfig } from './access';
|
|
3
|
+
/**
|
|
4
|
+
* A release is a versioned app artifact (zip with the app source, e.g. app.js/app.py)
|
|
5
|
+
* stored in S3-compatible storage. VMs created with a releaseId receive a presigned
|
|
6
|
+
* URL at boot, pull the artifact, unzip it, and start it on the stack's runtime.
|
|
7
|
+
*/
|
|
8
|
+
export interface ReleaseRecord {
|
|
9
|
+
releaseId: string;
|
|
10
|
+
name: string;
|
|
11
|
+
stack: VmStack;
|
|
12
|
+
/** Object key of the artifact zip inside the releases bucket. */
|
|
13
|
+
artifactKey: string;
|
|
14
|
+
/**
|
|
15
|
+
* True once the artifact has been extracted into individual objects under
|
|
16
|
+
* releaseSitePrefix(releaseId) — only meaningful for stack "static", where the
|
|
17
|
+
* gateway serves those objects directly, with no VM involved.
|
|
18
|
+
*/
|
|
19
|
+
published: boolean;
|
|
20
|
+
publishedAt?: string;
|
|
21
|
+
/** Gateway-level access protection (Cloudflare Access-style login gate). */
|
|
22
|
+
access?: GatewayAccessConfig;
|
|
23
|
+
createdAt: string;
|
|
24
|
+
updatedAt: string;
|
|
25
|
+
}
|
|
26
|
+
export interface ReleaseCreateRequest {
|
|
27
|
+
name: string;
|
|
28
|
+
stack: VmStack;
|
|
29
|
+
/** Existing object key to register. Omit to get a presigned uploadUrl for a new key. */
|
|
30
|
+
artifactKey?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface ReleaseUpdateRequest {
|
|
33
|
+
name?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface ReleaseCreateResponse {
|
|
36
|
+
release: ReleaseRecord;
|
|
37
|
+
/** Presigned PUT URL to upload the artifact zip; present when artifactKey was not supplied. */
|
|
38
|
+
uploadUrl?: string;
|
|
39
|
+
}
|
|
40
|
+
/** S3 key prefix (no trailing slash) under which a static release's extracted files live. */
|
|
41
|
+
export declare function releaseSitePrefix(releaseId: string): string;
|
|
42
|
+
export declare const RELEASE_REDIS_KEY_PREFIX = "release:";
|
|
43
|
+
/** Mirrored into Redis on publish so the gateway can serve static releases without touching Mongo. */
|
|
44
|
+
export interface ReleaseRegistryEntry {
|
|
45
|
+
stack: VmStack;
|
|
46
|
+
published: boolean;
|
|
47
|
+
access?: GatewayAccessConfig;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=release.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../src/release.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAEnD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,aAAa,CAAA;IACtB,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,eAAO,MAAM,wBAAwB,aAAa,CAAA;AAElD,sGAAsG;AACtG,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,mBAAmB,CAAA;CAC7B"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { GatewayAccessConfig } from './access';
|
|
2
|
+
export declare const VM_STACKS: readonly ["generic", "node", "python", "static"];
|
|
3
|
+
export type VmStack = (typeof VM_STACKS)[number];
|
|
4
|
+
export declare const VM_ENGINES: readonly ["mock", "qemu", "firecracker", "docker", "docker-sandbox", "remote", "lambda-microvm", "fargate"];
|
|
5
|
+
export type VmEngine = (typeof VM_ENGINES)[number];
|
|
6
|
+
export type VmState = 'creating' | 'running' | 'pausing' | 'paused' | 'resuming' | 'stopping' | 'stopped' | 'restoring' | 'destroying' | 'error';
|
|
7
|
+
export declare const VM_ACTIONS: readonly ["pause", "resume", "stop", "restore"];
|
|
8
|
+
export type VmAction = (typeof VM_ACTIONS)[number];
|
|
9
|
+
export interface VmResources {
|
|
10
|
+
vcpuCount: number;
|
|
11
|
+
memMib: number;
|
|
12
|
+
}
|
|
13
|
+
export interface VmRecord {
|
|
14
|
+
vmId: string;
|
|
15
|
+
/** Builder session this VM belongs to; optional for VMs not tied to a session. */
|
|
16
|
+
sessionId?: string;
|
|
17
|
+
workerId: string;
|
|
18
|
+
stack: VmStack;
|
|
19
|
+
/** Micro-VM engine the VM runs on. Absent on records created before engines existed. */
|
|
20
|
+
engine?: VmEngine;
|
|
21
|
+
/** Release whose artifact the VM pulled and started at boot. */
|
|
22
|
+
releaseId?: string;
|
|
23
|
+
/** Gateway-level access protection (Cloudflare Access-style login gate). */
|
|
24
|
+
access?: GatewayAccessConfig;
|
|
25
|
+
resources: VmResources;
|
|
26
|
+
state: VmState;
|
|
27
|
+
/**
|
|
28
|
+
* Opaque, engine-specific data an executor needs to reattach to this VM after a worker
|
|
29
|
+
* restart (e.g. a QEMU QMP socket path, a Fargate task ARN). Sandbox stores it as-is and
|
|
30
|
+
* never interprets it — only the executor that created it knows the shape.
|
|
31
|
+
*/
|
|
32
|
+
runtimeMetadata?: Record<string, unknown>;
|
|
33
|
+
createdAt: string;
|
|
34
|
+
updatedAt: string;
|
|
35
|
+
}
|
|
36
|
+
export interface VmCreateRequest {
|
|
37
|
+
/** Builder session to associate the VM with (not validated; informational for now). */
|
|
38
|
+
sessionId?: string;
|
|
39
|
+
stack: VmStack;
|
|
40
|
+
/** Requested micro-VM engine. Omit to use the scheduled worker's default engine. */
|
|
41
|
+
engine?: VmEngine;
|
|
42
|
+
/** Release to deploy into the VM: the guest pulls the artifact (presigned URL), unzips, and starts it. */
|
|
43
|
+
releaseId?: string;
|
|
44
|
+
resources?: Partial<VmResources>;
|
|
45
|
+
}
|
|
46
|
+
export interface VmExecRequest {
|
|
47
|
+
/** Shell command executed inside the VM workspace. */
|
|
48
|
+
command: string;
|
|
49
|
+
/** Working directory relative to the VM workspace root. */
|
|
50
|
+
cwd?: string;
|
|
51
|
+
/** Wall-clock limit for the command; capped by the executor. */
|
|
52
|
+
timeoutMs?: number;
|
|
53
|
+
}
|
|
54
|
+
export interface VmExecResult {
|
|
55
|
+
exitCode: number;
|
|
56
|
+
stdout: string;
|
|
57
|
+
stderr: string;
|
|
58
|
+
durationMs: number;
|
|
59
|
+
/** True when stdout/stderr were cut at the executor's output cap. */
|
|
60
|
+
truncated: boolean;
|
|
61
|
+
/** True when the command was killed by the timeout. */
|
|
62
|
+
timedOut: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface VmFileWrite {
|
|
65
|
+
/** Path relative to the VM workspace root (no leading slash, no traversal). */
|
|
66
|
+
path: string;
|
|
67
|
+
content: string;
|
|
68
|
+
/** How `content` is encoded; utf8 by default, base64 for binary files. */
|
|
69
|
+
encoding?: 'utf8' | 'base64';
|
|
70
|
+
}
|
|
71
|
+
export interface VmWriteFilesResult {
|
|
72
|
+
written: Array<{
|
|
73
|
+
path: string;
|
|
74
|
+
bytes: number;
|
|
75
|
+
}>;
|
|
76
|
+
}
|
|
77
|
+
export interface ProxyRequestDescriptor {
|
|
78
|
+
method: string;
|
|
79
|
+
path: string;
|
|
80
|
+
headers: Record<string, string>;
|
|
81
|
+
body?: Buffer;
|
|
82
|
+
}
|
|
83
|
+
export interface ProxyResponseDescriptor {
|
|
84
|
+
statusCode: number;
|
|
85
|
+
headers: Record<string, string>;
|
|
86
|
+
body?: Buffer;
|
|
87
|
+
}
|
|
88
|
+
export interface CommandResult {
|
|
89
|
+
ok: boolean;
|
|
90
|
+
error?: string;
|
|
91
|
+
}
|
|
92
|
+
export interface CommandAck<T = unknown> extends CommandResult {
|
|
93
|
+
result?: T;
|
|
94
|
+
}
|
|
95
|
+
export declare const VM_REDIS_KEY_PREFIX = "vm:";
|
|
96
|
+
export interface VmRegistryEntry {
|
|
97
|
+
workerId: string;
|
|
98
|
+
state: VmState;
|
|
99
|
+
access?: GatewayAccessConfig;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=vm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vm.d.ts","sourceRoot":"","sources":["../src/vm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { VmEngine } from './vm';
|
|
2
|
+
export interface WorkerCapacity {
|
|
3
|
+
maxVms: number;
|
|
4
|
+
usedVms: number;
|
|
5
|
+
cpuCores: number;
|
|
6
|
+
memMib: number;
|
|
7
|
+
}
|
|
8
|
+
export interface WorkerInfo {
|
|
9
|
+
workerId: string;
|
|
10
|
+
hostname: string;
|
|
11
|
+
ip?: string;
|
|
12
|
+
region?: string;
|
|
13
|
+
version: string;
|
|
14
|
+
capacity: WorkerCapacity;
|
|
15
|
+
/** Micro-VM engines this worker detected as runnable on its host. */
|
|
16
|
+
engines: VmEngine[];
|
|
17
|
+
/** Engine used when a VM create request doesn't specify one. */
|
|
18
|
+
defaultEngine: VmEngine;
|
|
19
|
+
lastHeartbeatAt: string;
|
|
20
|
+
}
|
|
21
|
+
/** Worker -> sandbox heartbeat payload (workerId is set server-side from the authenticated socket). */
|
|
22
|
+
export type WorkerHeartbeat = Omit<WorkerInfo, 'workerId' | 'lastHeartbeatAt'>;
|
|
23
|
+
export declare const WORKER_REDIS_KEY_PREFIX = "worker:";
|
|
24
|
+
export declare const WORKER_REDIS_INDEX_KEY = "workers:index";
|
|
25
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAEpC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,cAAc,CAAA;IACxB,qEAAqE;IACrE,OAAO,EAAE,QAAQ,EAAE,CAAA;IACnB,gEAAgE;IAChE,aAAa,EAAE,QAAQ,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,uGAAuG;AACvG,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,iBAAiB,CAAC,CAAA;AAE9E,eAAO,MAAM,uBAAuB,YAAY,CAAA;AAChD,eAAO,MAAM,sBAAsB,kBAAkB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@multiplayer-app/sandbox",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0-wip-yjs-state-changes.0",
|
|
4
4
|
"description": "Sandbox worker library and CLI (Docker, QEMU, Firecracker, AWS Lambda MicroVM, Fargate)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"require": "./dist/index.js",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
7
14
|
"bin": {
|
|
8
15
|
"sandbox": "dist/cli.js"
|
|
9
16
|
},
|
|
@@ -19,19 +26,21 @@
|
|
|
19
26
|
"@aws-sdk/client-ecs": "^3.1087.0",
|
|
20
27
|
"@aws-sdk/client-lambda-microvms": "^3.1079.0",
|
|
21
28
|
"@aws-sdk/client-s3": "^3.1079.0",
|
|
29
|
+
"bunyan": "1.8.15",
|
|
22
30
|
"commander": "^14.0.0",
|
|
23
31
|
"dotenv": "^17.2.3",
|
|
24
32
|
"rfb2": "^0.2.2",
|
|
25
|
-
"socket.io-client": "4.8.3"
|
|
26
|
-
"@multiplayer-app/logger": "0.0.1",
|
|
27
|
-
"@multiplayer-app/builder-types": "0.0.1"
|
|
33
|
+
"socket.io-client": "4.8.3"
|
|
28
34
|
},
|
|
29
35
|
"devDependencies": {
|
|
30
36
|
"@types/node": "^25.8.0",
|
|
31
|
-
"
|
|
37
|
+
"esbuild": "^0.25.12",
|
|
38
|
+
"typescript": "^6.0.3",
|
|
39
|
+
"@multiplayer-app/builder-types": "0.0.1",
|
|
40
|
+
"@multiplayer-app/logger": "0.0.1"
|
|
32
41
|
},
|
|
33
42
|
"scripts": {
|
|
34
|
-
"build": "tsc --build --force &&
|
|
43
|
+
"build": "tsc --build --force && node scripts/bundle.mjs",
|
|
35
44
|
"clean": "rm -rf ./dist tsconfig.tsbuildinfo",
|
|
36
45
|
"typecheck": "tsc --noEmit",
|
|
37
46
|
"lint": "eslint src/**/*.ts --config ../../eslint.config.js",
|
package/dist/config.js
DELETED
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.WORKER_VERSION = void 0;
|
|
7
|
-
exports.loadWorkerConfigFromEnv = loadWorkerConfigFromEnv;
|
|
8
|
-
const os_1 = __importDefault(require("os"));
|
|
9
|
-
const path_1 = __importDefault(require("path"));
|
|
10
|
-
const package_json_1 = require("../package.json");
|
|
11
|
-
Object.defineProperty(exports, "WORKER_VERSION", { enumerable: true, get: function () { return package_json_1.version; } });
|
|
12
|
-
const images_1 = require("./images");
|
|
13
|
-
/** Format: "node:<value>,python:<value>" — per-stack overrides (MicroVM image ARNs, Fargate task defs). */
|
|
14
|
-
function parseStackMap(raw) {
|
|
15
|
-
const map = {};
|
|
16
|
-
if (!raw)
|
|
17
|
-
return map;
|
|
18
|
-
for (const pair of raw.split(',')) {
|
|
19
|
-
const idx = pair.indexOf(':');
|
|
20
|
-
if (idx === -1)
|
|
21
|
-
continue;
|
|
22
|
-
const stack = pair.slice(0, idx).trim();
|
|
23
|
-
const arn = pair.slice(idx + 1).trim();
|
|
24
|
-
if (stack && arn)
|
|
25
|
-
map[stack] = arn;
|
|
26
|
-
}
|
|
27
|
-
return map;
|
|
28
|
-
}
|
|
29
|
-
function parseArnList(raw) {
|
|
30
|
-
if (!raw)
|
|
31
|
-
return undefined;
|
|
32
|
-
const arns = raw.split(',').map((s) => s.trim()).filter(Boolean);
|
|
33
|
-
return arns.length ? arns : undefined;
|
|
34
|
-
}
|
|
35
|
-
function loadWorkerConfigFromEnv(env = process.env) {
|
|
36
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7;
|
|
37
|
-
const workerId = ((_a = env.WORKER_ID) === null || _a === void 0 ? void 0 : _a.trim()) || os_1.default.hostname();
|
|
38
|
-
const token = env.WORKER_TOKEN;
|
|
39
|
-
if (!token) {
|
|
40
|
-
throw new Error('WORKER_TOKEN is required');
|
|
41
|
-
}
|
|
42
|
-
return {
|
|
43
|
-
workerId,
|
|
44
|
-
token,
|
|
45
|
-
sandboxUrl: (_b = env.SANDBOX_URL) !== null && _b !== void 0 ? _b : 'https://api.sandbox.filingramp.com',
|
|
46
|
-
workerSocketPath: (_c = env.WORKER_SOCKET_PATH) !== null && _c !== void 0 ? _c : '/v0/sapi/workers/ws',
|
|
47
|
-
maxVms: Number(env.MAX_VMS) || 10,
|
|
48
|
-
region: env.WORKER_REGION,
|
|
49
|
-
remote: {
|
|
50
|
-
// No default: an unset AGENT_URL means the remote engine is not configured on this worker
|
|
51
|
-
agentUrl: (_d = env.AGENT_URL) !== null && _d !== void 0 ? _d : '',
|
|
52
|
-
authToken: env.AGENT_TOKEN,
|
|
53
|
-
},
|
|
54
|
-
firecracker: {
|
|
55
|
-
bin: (_e = env.FIRECRACKER_BIN) !== null && _e !== void 0 ? _e : 'firecracker',
|
|
56
|
-
// Per-stack base images (<imagesDir>/<stack>/vmlinuz + initramfs.img) from
|
|
57
|
-
// `worker-cli images pull` / setup-vm-images.sh; engine detection checks
|
|
58
|
-
// existence, so missing images just disable the engine.
|
|
59
|
-
imagesDir: (_g = (_f = env.FIRECRACKER_IMAGES_DIR) !== null && _f !== void 0 ? _f : env.VM_IMAGES_DIR) !== null && _g !== void 0 ? _g : (0, images_1.defaultImagesDir)(),
|
|
60
|
-
// Explicit single-image override, applied to every stack when both are set
|
|
61
|
-
kernelPath: env.FIRECRACKER_KERNEL,
|
|
62
|
-
initrdPath: env.FIRECRACKER_INITRD,
|
|
63
|
-
vmDataPath: (_h = env.FIRECRACKER_VM_DATA) !== null && _h !== void 0 ? _h : path_1.default.join(os_1.default.tmpdir(), 'firecracker-vms'),
|
|
64
|
-
},
|
|
65
|
-
lambdaMicrovm: {
|
|
66
|
-
region: (_j = env.MICROVM_AWS_REGION) !== null && _j !== void 0 ? _j : env.AWS_REGION,
|
|
67
|
-
imageArn: (_k = env.MICROVM_IMAGE_ARN) !== null && _k !== void 0 ? _k : '',
|
|
68
|
-
stackImageArns: parseStackMap(env.MICROVM_STACK_IMAGE_ARNS),
|
|
69
|
-
ingressConnectorArns: parseArnList(env.MICROVM_INGRESS_CONNECTORS),
|
|
70
|
-
egressConnectorArns: parseArnList(env.MICROVM_EGRESS_CONNECTORS),
|
|
71
|
-
executionRoleArn: env.MICROVM_EXECUTION_ROLE_ARN,
|
|
72
|
-
// 0 disables auto-suspend; the sandbox drives pause/resume explicitly by default
|
|
73
|
-
maxIdleSeconds: Number((_l = env.MICROVM_MAX_IDLE_SECONDS) !== null && _l !== void 0 ? _l : 900),
|
|
74
|
-
suspendedDurationSeconds: Number((_m = env.MICROVM_SUSPENDED_DURATION_SECONDS) !== null && _m !== void 0 ? _m : 28800),
|
|
75
|
-
maximumDurationInSeconds: Number((_o = env.MICROVM_MAX_DURATION_SECONDS) !== null && _o !== void 0 ? _o : 28800),
|
|
76
|
-
},
|
|
77
|
-
fargate: {
|
|
78
|
-
region: (_p = env.FARGATE_AWS_REGION) !== null && _p !== void 0 ? _p : env.AWS_REGION,
|
|
79
|
-
cluster: (_q = env.FARGATE_CLUSTER) !== null && _q !== void 0 ? _q : '',
|
|
80
|
-
taskDefinition: env.FARGATE_TASK_DEFINITION,
|
|
81
|
-
// Per-stack task definitions: "node:builder-node:3,python:builder-python:1"
|
|
82
|
-
stackTaskDefinitions: parseStackMap(env.FARGATE_STACK_TASK_DEFS),
|
|
83
|
-
subnets: (_s = (_r = env.FARGATE_SUBNETS) === null || _r === void 0 ? void 0 : _r.split(',').map((s) => s.trim()).filter(Boolean)) !== null && _s !== void 0 ? _s : [],
|
|
84
|
-
securityGroups: (_t = env.FARGATE_SECURITY_GROUPS) === null || _t === void 0 ? void 0 : _t.split(',').map((s) => s.trim()).filter(Boolean),
|
|
85
|
-
// ENABLED when the worker runs outside the task VPC (proxies to the task's public IP)
|
|
86
|
-
assignPublicIp: env.FARGATE_ASSIGN_PUBLIC_IP === 'true',
|
|
87
|
-
guestPort: Number(env.FARGATE_GUEST_PORT) || 8080,
|
|
88
|
-
startTimeoutMs: Number(env.FARGATE_START_TIMEOUT_MS) || 180000,
|
|
89
|
-
},
|
|
90
|
-
docker: {
|
|
91
|
-
bin: (_u = env.DOCKER_BIN) !== null && _u !== void 0 ? _u : 'docker',
|
|
92
|
-
// Local images from `scripts/setup-docker-images.sh`: <imagePrefix>-<stack>:<imageTag>
|
|
93
|
-
imagePrefix: (_v = env.DOCKER_IMAGE_PREFIX) !== null && _v !== void 0 ? _v : 'multiplayer-builder-vm',
|
|
94
|
-
imageTag: (_w = env.DOCKER_IMAGE_TAG) !== null && _w !== void 0 ? _w : 'local',
|
|
95
|
-
stackImages: parseStackMap(env.DOCKER_STACK_IMAGES),
|
|
96
|
-
network: env.DOCKER_NETWORK,
|
|
97
|
-
portRangeStart: Number(env.DOCKER_PORT_MIN) || 9100,
|
|
98
|
-
portRangeEnd: Number(env.DOCKER_PORT_MAX) || 9199,
|
|
99
|
-
guestPort: Number(env.DOCKER_GUEST_PORT) || 8080,
|
|
100
|
-
},
|
|
101
|
-
dockerSandbox: {
|
|
102
|
-
bin: (_x = env.SBX_BIN) !== null && _x !== void 0 ? _x : 'sbx',
|
|
103
|
-
// Bridged from the same local images `docker` (imagePrefix-imageTag) already uses —
|
|
104
|
-
// `docker save` + `sbx template load`, see docker-sandbox-executor.ts.
|
|
105
|
-
imagePrefix: (_y = env.SBX_IMAGE_PREFIX) !== null && _y !== void 0 ? _y : 'multiplayer-builder-vm',
|
|
106
|
-
imageTag: (_z = env.SBX_IMAGE_TAG) !== null && _z !== void 0 ? _z : 'local',
|
|
107
|
-
stackTemplates: parseStackMap(env.SBX_STACK_TEMPLATES),
|
|
108
|
-
// `sbx create shell` doesn't run the image's own CMD, so the engine launches
|
|
109
|
-
// it explicitly — defaults match each Dockerfile's own WORKDIR /app + CMD.
|
|
110
|
-
stackAgentCommands: {
|
|
111
|
-
node: 'node app.js',
|
|
112
|
-
python: 'python app.py',
|
|
113
|
-
static: 'node app.js',
|
|
114
|
-
...parseStackMap(env.SBX_STACK_AGENT_COMMANDS),
|
|
115
|
-
},
|
|
116
|
-
workspaceRoot: (_0 = env.SBX_WORKSPACE_DIR) !== null && _0 !== void 0 ? _0 : path_1.default.join(os_1.default.tmpdir(), 'sbx-vms'),
|
|
117
|
-
portRangeStart: Number(env.SBX_PORT_MIN) || 9200,
|
|
118
|
-
portRangeEnd: Number(env.SBX_PORT_MAX) || 9299,
|
|
119
|
-
guestPort: Number(env.SBX_GUEST_PORT) || 8080,
|
|
120
|
-
// sbx rejects sandboxes below 1 GiB memory.
|
|
121
|
-
minMemoryMib: Number(env.SBX_MIN_MEMORY_MIB) || 1024,
|
|
122
|
-
},
|
|
123
|
-
qemu: {
|
|
124
|
-
bin: (_1 = env.QEMU_BIN) !== null && _1 !== void 0 ? _1 : 'qemu-system-aarch64',
|
|
125
|
-
// Per-stack base images (<imagesDir>/<stack>/vmlinuz + initramfs.img) from
|
|
126
|
-
// `worker-cli images pull` / setup-vm-images.sh; engine detection checks
|
|
127
|
-
// existence, so missing images just disable the engine.
|
|
128
|
-
imagesDir: (_3 = (_2 = env.QEMU_IMAGES_DIR) !== null && _2 !== void 0 ? _2 : env.VM_IMAGES_DIR) !== null && _3 !== void 0 ? _3 : (0, images_1.defaultImagesDir)(),
|
|
129
|
-
// Explicit single-image override, applied to every stack when both are set
|
|
130
|
-
kernelPath: env.QEMU_KERNEL,
|
|
131
|
-
initrdPath: env.QEMU_INITRD,
|
|
132
|
-
vmDataPath: (_4 = env.QEMU_VM_DATA) !== null && _4 !== void 0 ? _4 : path_1.default.join(os_1.default.tmpdir(), 'qemu-vms'),
|
|
133
|
-
portRangeStart: Number(env.QEMU_PORT_MIN) || 9000,
|
|
134
|
-
portRangeEnd: Number(env.QEMU_PORT_MAX) || 9999,
|
|
135
|
-
// Accelerator: hvf (macOS host), kvm (Linux + /dev/kvm), tcg (software, any host — slow)
|
|
136
|
-
accel: (_5 = env.QEMU_ACCEL) !== null && _5 !== void 0 ? _5 : (process.platform === 'darwin' ? 'hvf' : 'kvm'),
|
|
137
|
-
// CPU model: host requires hvf/kvm; max is best for tcg on aarch64; qemu64 for tcg x86_64
|
|
138
|
-
cpu: (_6 = env.QEMU_CPU) !== null && _6 !== void 0 ? _6 : 'host',
|
|
139
|
-
// Machine type: virt (aarch64), q35 (x86_64)
|
|
140
|
-
machine: (_7 = env.QEMU_MACHINE) !== null && _7 !== void 0 ? _7 : 'virt',
|
|
141
|
-
},
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/console-relays.js
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.attachConsoleRelays = attachConsoleRelays;
|
|
4
|
-
const vnc_relay_1 = require("./services/vnc-relay");
|
|
5
|
-
const serial_relay_1 = require("./services/serial-relay");
|
|
6
|
-
/**
|
|
7
|
-
* Wires up VNC and serial relays for any executor that exposes console endpoints (QEMU: VNC +
|
|
8
|
-
* serial TCP ports; Firecracker: serial via process stdio pipe). All media (frames, terminal
|
|
9
|
-
* data) flows through the sandbox socket to browsers — the worker never accepts inbound
|
|
10
|
-
* connections from the internet. Wraps `executor.create`/`destroy` in place.
|
|
11
|
-
*/
|
|
12
|
-
function attachConsoleRelays(executor, sandboxSocket) {
|
|
13
|
-
const relays = new Map();
|
|
14
|
-
const originalCreate = executor.create.bind(executor);
|
|
15
|
-
executor.create = async (spec) => {
|
|
16
|
-
var _a;
|
|
17
|
-
const handle = await originalCreate(spec);
|
|
18
|
-
const entry = {};
|
|
19
|
-
if (handle.vncPort) {
|
|
20
|
-
const vnc = new vnc_relay_1.VncRelay(handle.vmId, '127.0.0.1', handle.vncPort, sandboxSocket);
|
|
21
|
-
vnc.start();
|
|
22
|
-
entry.vnc = vnc;
|
|
23
|
-
}
|
|
24
|
-
const serialSource = handle.serialPort
|
|
25
|
-
? { type: 'tcp', host: '127.0.0.1', port: handle.serialPort }
|
|
26
|
-
: (_a = executor.getSerialSource) === null || _a === void 0 ? void 0 : _a.call(executor, handle.vmId);
|
|
27
|
-
if (serialSource) {
|
|
28
|
-
const serial = new serial_relay_1.SerialRelay(handle.vmId, serialSource, sandboxSocket);
|
|
29
|
-
serial.connect();
|
|
30
|
-
entry.serial = serial;
|
|
31
|
-
}
|
|
32
|
-
if (entry.vnc || entry.serial)
|
|
33
|
-
relays.set(handle.vmId, entry);
|
|
34
|
-
return handle;
|
|
35
|
-
};
|
|
36
|
-
const originalDestroy = executor.destroy.bind(executor);
|
|
37
|
-
executor.destroy = async (vmId) => {
|
|
38
|
-
var _a, _b;
|
|
39
|
-
const entry = relays.get(vmId);
|
|
40
|
-
(_a = entry === null || entry === void 0 ? void 0 : entry.vnc) === null || _a === void 0 ? void 0 : _a.destroy();
|
|
41
|
-
(_b = entry === null || entry === void 0 ? void 0 : entry.serial) === null || _b === void 0 ? void 0 : _b.destroy();
|
|
42
|
-
relays.delete(vmId);
|
|
43
|
-
return originalDestroy(vmId);
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=console-relays.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"console-relays.js","sourceRoot":"","sources":["../src/console-relays.ts"],"names":[],"mappings":";;AAWA,kDAmCC;AA5CD,oDAA+C;AAC/C,0DAAqD;AAErD;;;;;GAKG;AACH,SAAgB,mBAAmB,CAAC,QAA6B,EAAE,aAAqB;IACtF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoD,CAAA;IAE1E,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACrD,QAAQ,CAAC,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE;;QAC/B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,KAAK,GAA6C,EAAE,CAAA;QAE1D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,IAAI,oBAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;YACjF,GAAG,CAAC,KAAK,EAAE,CAAA;YACX,KAAK,CAAC,GAAG,GAAG,GAAG,CAAA;QACjB,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU;YACpC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE;YACtE,CAAC,CAAC,MAAA,QAAQ,CAAC,eAAe,yDAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,IAAI,0BAAW,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC,CAAA;YACxE,MAAM,CAAC,OAAO,EAAE,CAAA;YAChB,KAAK,CAAC,MAAM,GAAG,MAAM,CAAA;QACvB,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAC7D,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAED,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACvD,QAAQ,CAAC,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE;;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,GAAG,0CAAE,OAAO,EAAE,CAAA;QACrB,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAM,0CAAE,OAAO,EAAE,CAAA;QACxB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACnB,OAAO,eAAe,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC,CAAA;AACH,CAAC"}
|