@braedonsaunders/appkit-desk 0.7.0 → 0.9.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 +126 -1
- package/backend.d.ts +32 -7
- package/backend.d.ts.map +1 -1
- package/backend.js +107 -524
- package/backend.js.map +1 -1
- package/host.d.ts +27 -1
- package/host.d.ts.map +1 -1
- package/host.js +47 -19
- package/host.js.map +1 -1
- package/index.d.ts +2 -0
- package/index.d.ts.map +1 -1
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/machine.d.ts +154 -0
- package/machine.d.ts.map +1 -0
- package/machine.js +573 -0
- package/machine.js.map +1 -0
- package/package.json +2 -2
- package/plan.d.ts +192 -31
- package/plan.d.ts.map +1 -1
- package/plan.js +298 -12
- package/plan.js.map +1 -1
- package/port-relay.d.ts +13 -0
- package/port-relay.d.ts.map +1 -0
- package/port-relay.js +56 -0
- package/port-relay.js.map +1 -0
- package/virtualization.d.ts +16 -0
- package/virtualization.d.ts.map +1 -0
- package/virtualization.js +156 -0
- package/virtualization.js.map +1 -0
- package/vz/Package.swift +23 -0
- package/vz/Sources/DeskNet/Addresses.swift +106 -0
- package/vz/Sources/DeskNet/DHCP.swift +111 -0
- package/vz/Sources/DeskNet/Fence.swift +57 -0
- package/vz/Sources/DeskNet/NetworkStack.swift +547 -0
- package/vz/Sources/DeskNet/Packets.swift +355 -0
- package/vz/Sources/DeskNet/Plumbing.swift +312 -0
- package/vz/Sources/DeskNet/Sockets.swift +221 -0
- package/vz/Sources/DeskNet/TCPFlow.swift +448 -0
- package/vz/Sources/appkit-desk-vz/Control.swift +152 -0
- package/vz/Sources/appkit-desk-vz/Helper.swift +550 -0
- package/vz/Sources/appkit-desk-vz/main.swift +38 -0
- package/vz/Tests/DeskNetTests/DeskNetTests.swift +426 -0
- package/vz/appkit-desk-vz.entitlements +8 -0
- package/vz/build.sh +23 -0
- package/vz/check/extract-boot.py +221 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@braedonsaunders/appkit-desk",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Per-agent Debian microVMs
|
|
3
|
+
"version": "0.9.0",
|
|
4
|
+
"description": "Per-agent Debian microVMs on Linux and macOS, with a framed guest-agent protocol, leases, snapshots, and governed networking.",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"exports": {
|
package/plan.d.ts
CHANGED
|
@@ -5,6 +5,23 @@ export declare const DEFAULT_RUNTIME_DIR = "/run/appkit-desk";
|
|
|
5
5
|
export declare const DEFAULT_MEMORY_MB = 384;
|
|
6
6
|
export declare const DEFAULT_VCPUS = 2;
|
|
7
7
|
export declare const DEFAULT_KERNEL_CMDLINE = "root=/dev/vda rw quiet";
|
|
8
|
+
/**
|
|
9
|
+
* Where a Cloud Hypervisor desk looks for `virtiofsd` when `virtiofsdPath` is
|
|
10
|
+
* not set and it is not on `PATH`: Debian's and Fedora's package location.
|
|
11
|
+
*/
|
|
12
|
+
export declare const DEFAULT_VIRTIOFSD_PATH = "/usr/libexec/virtiofsd";
|
|
13
|
+
export declare const DEFAULT_VIRTIOFSD_SANDBOX: DeskVirtiofsdSandbox;
|
|
14
|
+
/**
|
|
15
|
+
* The guest network Virtualization.framework desks get from the helper's NAT:
|
|
16
|
+
* the same addresses QEMU's user networking uses, so they are unsurprising in
|
|
17
|
+
* a guest. Nothing outside the helper ever sees them.
|
|
18
|
+
*/
|
|
19
|
+
export declare const DEFAULT_VZ_GUEST_ADDRESS = "10.0.2.15";
|
|
20
|
+
export declare const DEFAULT_VZ_GATEWAY_ADDRESS = "10.0.2.2";
|
|
21
|
+
export declare const DEFAULT_VZ_PREFIX_LENGTH = 24;
|
|
22
|
+
export declare const DEFAULT_VZ_DNS: readonly string[];
|
|
23
|
+
/** Virtualization.framework always gives the guest vsock context ID 3. */
|
|
24
|
+
export declare const VZ_GUEST_CID = 3;
|
|
8
25
|
/**
|
|
9
26
|
* Every failure this package raises. The `name` is annotated as `string`
|
|
10
27
|
* rather than left to infer its literal so a subclass can narrow the meaning
|
|
@@ -20,9 +37,59 @@ export interface DeskLauncherIdentity {
|
|
|
20
37
|
/** Host/container GID used to invoke the VMM and image tooling. */
|
|
21
38
|
gid: number;
|
|
22
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Which hypervisor a plan is for: Cloud Hypervisor over KVM on Linux, or
|
|
42
|
+
* Apple's Virtualization.framework through the `appkit-desk-vz` helper on an
|
|
43
|
+
* Apple silicon Mac.
|
|
44
|
+
*/
|
|
45
|
+
export type DeskHypervisor = 'cloud-hypervisor' | 'virtualization';
|
|
46
|
+
/**
|
|
47
|
+
* The guest network of a Virtualization.framework desk. The helper runs a
|
|
48
|
+
* userspace NAT: the guest reaches the public internet and nothing else unless
|
|
49
|
+
* `allowLan` is set — no RFC 1918 space, link-local, CGNAT, or the Mac itself.
|
|
50
|
+
*/
|
|
51
|
+
export interface DeskGuestNetworkOptions {
|
|
52
|
+
/** Let the guest reach the Mac's LAN, link-local and CGNAT space, and the Mac. */
|
|
53
|
+
allowLan?: boolean;
|
|
54
|
+
/** The address the helper's DHCP server leases the guest. */
|
|
55
|
+
guestAddress?: string;
|
|
56
|
+
/** The helper's own address on the link: the guest's router. */
|
|
57
|
+
gatewayAddress?: string;
|
|
58
|
+
prefixLength?: number;
|
|
59
|
+
/** Resolvers the guest is handed; the first also answers DNS sent to the gateway. */
|
|
60
|
+
dns?: readonly string[];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* A host directory shared into the guest over virtio-fs. The guest mounts it
|
|
64
|
+
* with `mount -t virtiofs <tag> <dir>`.
|
|
65
|
+
*/
|
|
66
|
+
export interface DeskShare {
|
|
67
|
+
/** 1–36 lowercase letters, digits, or hyphens, starting with a letter or digit; unique per desk. */
|
|
68
|
+
tag: string;
|
|
69
|
+
/** Absolute path of an existing host directory. */
|
|
70
|
+
path: string;
|
|
71
|
+
/**
|
|
72
|
+
* Refuse every write from the guest. Enforced by the host's file server, so
|
|
73
|
+
* a guest cannot lift it by remounting the share read-write.
|
|
74
|
+
*/
|
|
75
|
+
readOnly: boolean;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* How `virtiofsd` confines itself to the shared directory. `namespace` (its
|
|
79
|
+
* own default) pivots into the directory inside new mount, PID and network
|
|
80
|
+
* namespaces, which needs CAP_SYS_ADMIN when run as root and unprivileged user
|
|
81
|
+
* namespaces otherwise. `chroot` only chroots, which needs root and suits a
|
|
82
|
+
* container that may not create namespaces. Both stop symlinks from escaping
|
|
83
|
+
* the share; running unconfined is not offered.
|
|
84
|
+
*/
|
|
85
|
+
export type DeskVirtiofsdSandbox = 'namespace' | 'chroot';
|
|
23
86
|
export interface DeskLaunchPlanOptions {
|
|
24
87
|
deskId: string;
|
|
88
|
+
/** Defaults to `cloud-hypervisor`. */
|
|
89
|
+
hypervisor?: DeskHypervisor;
|
|
90
|
+
/** Cloud Hypervisor only: the VMM binary. */
|
|
25
91
|
vmmPath?: string;
|
|
92
|
+
/** Cloud Hypervisor only: the KVM device. */
|
|
26
93
|
kvmPath?: string;
|
|
27
94
|
qemuImgPath?: string;
|
|
28
95
|
/** Absolute path of the kernel image the microVM boots. */
|
|
@@ -40,14 +107,40 @@ export interface DeskLaunchPlanOptions {
|
|
|
40
107
|
overlayPath: string;
|
|
41
108
|
memoryMb?: number;
|
|
42
109
|
vcpus?: number;
|
|
43
|
-
/**
|
|
110
|
+
/**
|
|
111
|
+
* Guest vsock context ID; must be unique among resident desks. Cloud
|
|
112
|
+
* Hypervisor only — a Virtualization.framework guest is always CID 3, and
|
|
113
|
+
* its vsock is private to its helper.
|
|
114
|
+
*/
|
|
44
115
|
vsockCid: number;
|
|
45
|
-
/**
|
|
116
|
+
/**
|
|
117
|
+
* Directory holding the desk's control sockets. Defaults to
|
|
118
|
+
* `/run/appkit-desk` for Cloud Hypervisor and `<os tmpdir>/appkit-desk` for
|
|
119
|
+
* Virtualization.framework.
|
|
120
|
+
*/
|
|
46
121
|
runtimeDir?: string;
|
|
47
|
-
/**
|
|
122
|
+
/** Cloud Hypervisor only: host TAP device name; derived from the CID when omitted. */
|
|
48
123
|
tapDevice?: string;
|
|
49
|
-
/**
|
|
124
|
+
/**
|
|
125
|
+
* Guest MAC address. Derived from the CID for Cloud Hypervisor, and from the
|
|
126
|
+
* desk ID for Virtualization.framework, whose restore needs the same NIC.
|
|
127
|
+
*/
|
|
50
128
|
macAddress?: string;
|
|
129
|
+
/** Virtualization.framework only: the helper's NAT network and fence. */
|
|
130
|
+
guestNetwork?: DeskGuestNetworkOptions;
|
|
131
|
+
/**
|
|
132
|
+
* Host directories shared into the guest. Restoring a snapshot requires the
|
|
133
|
+
* same shares the desk was parked with; see the backends.
|
|
134
|
+
*/
|
|
135
|
+
shares?: readonly DeskShare[];
|
|
136
|
+
/**
|
|
137
|
+
* Cloud Hypervisor only: the `virtiofsd` binary (1.13 or later) that serves
|
|
138
|
+
* each share. Defaults to the first `virtiofsd` on `PATH`, then
|
|
139
|
+
* `/usr/libexec/virtiofsd`. Not needed, and not looked for, without shares.
|
|
140
|
+
*/
|
|
141
|
+
virtiofsdPath?: string;
|
|
142
|
+
/** Cloud Hypervisor only: defaults to `namespace`. */
|
|
143
|
+
virtiofsdSandbox?: DeskVirtiofsdSandbox;
|
|
51
144
|
kernelCmdline?: string;
|
|
52
145
|
launcherIdentity?: DeskLauncherIdentity;
|
|
53
146
|
/**
|
|
@@ -67,17 +160,9 @@ export interface DeskLaunchPlanOptions {
|
|
|
67
160
|
*/
|
|
68
161
|
restore?: boolean;
|
|
69
162
|
}
|
|
70
|
-
/**
|
|
71
|
-
|
|
72
|
-
* has been spawned: tests, audit logs, and readiness screens can assert on the
|
|
73
|
-
* exact argv a desk would boot with.
|
|
74
|
-
*/
|
|
75
|
-
export interface DeskLaunchPlan {
|
|
163
|
+
/** What every plan carries, whichever hypervisor runs it. */
|
|
164
|
+
export interface DeskLaunchPlanBase {
|
|
76
165
|
deskId: string;
|
|
77
|
-
vmm: {
|
|
78
|
-
command: string;
|
|
79
|
-
args: string[];
|
|
80
|
-
};
|
|
81
166
|
overlay: {
|
|
82
167
|
path: string;
|
|
83
168
|
basePath: string;
|
|
@@ -87,22 +172,22 @@ export interface DeskLaunchPlan {
|
|
|
87
172
|
args: string[];
|
|
88
173
|
} | null;
|
|
89
174
|
};
|
|
175
|
+
/**
|
|
176
|
+
* The host Unix socket the guest's vsock is reached through, with Cloud
|
|
177
|
+
* Hypervisor's hybrid-vsock preamble: write `CONNECT <port>\n`, read
|
|
178
|
+
* `OK <n>\n`, then the stream is the guest connection.
|
|
179
|
+
*/
|
|
90
180
|
vsock: {
|
|
91
181
|
cid: number;
|
|
92
182
|
socketPath: string;
|
|
93
183
|
};
|
|
94
|
-
api: {
|
|
95
|
-
socketPath: string;
|
|
96
|
-
};
|
|
97
|
-
tap: {
|
|
98
|
-
device: string;
|
|
99
|
-
mac: string;
|
|
100
|
-
};
|
|
101
184
|
/** Where a memory snapshot of this desk is written, and read back from. */
|
|
102
185
|
snapshot: {
|
|
103
186
|
dir: string;
|
|
104
187
|
restoring: boolean;
|
|
105
188
|
};
|
|
189
|
+
/** Host directories shared into the guest, in the order they were given. */
|
|
190
|
+
shares: readonly DeskShare[];
|
|
106
191
|
memoryMb: number;
|
|
107
192
|
vcpus: number;
|
|
108
193
|
kernelPath: string;
|
|
@@ -112,27 +197,103 @@ export interface DeskLaunchPlan {
|
|
|
112
197
|
launcherIdentity?: DeskLauncherIdentity;
|
|
113
198
|
}
|
|
114
199
|
/**
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
|
|
200
|
+
* The complete Cloud Hypervisor invocation as inspectable data. Nothing here
|
|
201
|
+
* has been spawned: tests, audit logs, and readiness screens can assert on the
|
|
202
|
+
* exact argv a desk would boot with.
|
|
203
|
+
*/
|
|
204
|
+
export interface CloudHypervisorLaunchPlan extends DeskLaunchPlanBase {
|
|
205
|
+
hypervisor: 'cloud-hypervisor';
|
|
206
|
+
vmm: {
|
|
207
|
+
command: string;
|
|
208
|
+
args: string[];
|
|
209
|
+
};
|
|
210
|
+
api: {
|
|
211
|
+
socketPath: string;
|
|
212
|
+
};
|
|
213
|
+
tap: {
|
|
214
|
+
device: string;
|
|
215
|
+
mac: string;
|
|
216
|
+
};
|
|
217
|
+
/**
|
|
218
|
+
* Each share with the `virtiofsd` that serves it. Every daemon must be
|
|
219
|
+
* listening on its socket before the VMM starts, for a boot and for a
|
|
220
|
+
* restore alike.
|
|
221
|
+
*/
|
|
222
|
+
shares: readonly CloudHypervisorShare[];
|
|
223
|
+
}
|
|
224
|
+
export interface CloudHypervisorShare extends DeskShare {
|
|
225
|
+
/** The vhost-user socket the daemon listens on and the VMM connects to. */
|
|
226
|
+
socketPath: string;
|
|
227
|
+
daemon: {
|
|
228
|
+
command: string;
|
|
229
|
+
args: string[];
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* A Virtualization.framework desk as inspectable data: what the helper is
|
|
234
|
+
* asked to boot. The helper path belongs to the backend, not the plan.
|
|
235
|
+
*/
|
|
236
|
+
export interface VirtualizationLaunchPlan extends DeskLaunchPlanBase {
|
|
237
|
+
hypervisor: 'virtualization';
|
|
238
|
+
/**
|
|
239
|
+
* The host Unix socket guest TCP ports are reached through, with the same
|
|
240
|
+
* preamble as `vsock`: `CONNECT <tcp port>\n` answered by `OK <n>\n` once
|
|
241
|
+
* the guest accepts, or a close with nothing written when it refuses.
|
|
242
|
+
*/
|
|
243
|
+
ports: {
|
|
244
|
+
socketPath: string;
|
|
245
|
+
};
|
|
246
|
+
network: {
|
|
247
|
+
mac: string;
|
|
248
|
+
allowLan: boolean;
|
|
249
|
+
guestAddress: string;
|
|
250
|
+
gatewayAddress: string;
|
|
251
|
+
prefixLength: number;
|
|
252
|
+
dns: string[];
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
export type DeskLaunchPlan = CloudHypervisorLaunchPlan | VirtualizationLaunchPlan;
|
|
256
|
+
/**
|
|
257
|
+
* Whether this host can run desks at all. On Linux: a usable `/dev/kvm` and
|
|
258
|
+
* the Cloud Hypervisor binary. On macOS: Apple silicon, macOS 14 or later (the
|
|
259
|
+
* first with Virtualization.framework save and restore), and an existing
|
|
260
|
+
* `appkit-desk-vz` helper at `helperPath`. Signature and entitlement are checked
|
|
261
|
+
* by macOS on execution, not by this probe. Every check is injectable and the
|
|
262
|
+
* answer is fail-closed — a host missing any of them gets no desk capability
|
|
263
|
+
* rather than a degraded one.
|
|
119
264
|
*/
|
|
120
265
|
export declare function isDeskSupported(options?: {
|
|
121
266
|
platform?: NodeJS.Platform;
|
|
122
267
|
kvmPath?: string;
|
|
123
268
|
vmmPath?: string;
|
|
269
|
+
/** macOS: the signed `appkit-desk-vz` helper. Required there. */
|
|
270
|
+
helperPath?: string;
|
|
271
|
+
arch?: string;
|
|
272
|
+
/** The kernel release, as `os.release()` reports it. */
|
|
273
|
+
osRelease?: string;
|
|
124
274
|
pathExists?: (path: string) => boolean;
|
|
125
275
|
}): boolean;
|
|
126
276
|
/** Validate a desk identifier, which is used in socket paths and device names. */
|
|
127
277
|
export declare function cleanDeskId(value: string): string;
|
|
278
|
+
export interface DeskLaunchPlanDependencies {
|
|
279
|
+
pathExists?: (path: string) => boolean;
|
|
280
|
+
deviceExists?: (path: string) => boolean;
|
|
281
|
+
/** Whether a path is an existing directory; checked for every share. */
|
|
282
|
+
isDirectory?: (path: string) => boolean;
|
|
283
|
+
/** Searched for `virtiofsd` when `virtiofsdPath` is not set; defaults to `process.env.PATH`. */
|
|
284
|
+
searchPath?: string;
|
|
285
|
+
}
|
|
128
286
|
/**
|
|
129
|
-
* Build the deterministic
|
|
130
|
-
*
|
|
287
|
+
* Build the deterministic launch plan without spawning anything. Fail closed:
|
|
288
|
+
* a missing `/dev/kvm` or VMM binary (Cloud Hypervisor), kernel, base image,
|
|
131
289
|
* or overlay directory throws instead of producing a plan that cannot boot.
|
|
132
290
|
*/
|
|
133
|
-
export declare function buildDeskLaunchPlan(options: DeskLaunchPlanOptions
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
291
|
+
export declare function buildDeskLaunchPlan(options: DeskLaunchPlanOptions & {
|
|
292
|
+
hypervisor: 'virtualization';
|
|
293
|
+
}, dependencies?: DeskLaunchPlanDependencies): VirtualizationLaunchPlan;
|
|
294
|
+
export declare function buildDeskLaunchPlan(options: DeskLaunchPlanOptions & {
|
|
295
|
+
hypervisor?: 'cloud-hypervisor';
|
|
296
|
+
}, dependencies?: DeskLaunchPlanDependencies): CloudHypervisorLaunchPlan;
|
|
297
|
+
export declare function buildDeskLaunchPlan(options: DeskLaunchPlanOptions, dependencies?: DeskLaunchPlanDependencies): DeskLaunchPlan;
|
|
137
298
|
export declare function cleanLauncherIdentity(identity: DeskLauncherIdentity | undefined): DeskLauncherIdentity | undefined;
|
|
138
299
|
//# sourceMappingURL=plan.d.ts.map
|
package/plan.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}
|