@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.
Files changed (46) hide show
  1. package/README.md +126 -1
  2. package/backend.d.ts +32 -7
  3. package/backend.d.ts.map +1 -1
  4. package/backend.js +107 -524
  5. package/backend.js.map +1 -1
  6. package/host.d.ts +27 -1
  7. package/host.d.ts.map +1 -1
  8. package/host.js +47 -19
  9. package/host.js.map +1 -1
  10. package/index.d.ts +2 -0
  11. package/index.d.ts.map +1 -1
  12. package/index.js +2 -0
  13. package/index.js.map +1 -1
  14. package/machine.d.ts +154 -0
  15. package/machine.d.ts.map +1 -0
  16. package/machine.js +573 -0
  17. package/machine.js.map +1 -0
  18. package/package.json +2 -2
  19. package/plan.d.ts +192 -31
  20. package/plan.d.ts.map +1 -1
  21. package/plan.js +298 -12
  22. package/plan.js.map +1 -1
  23. package/port-relay.d.ts +13 -0
  24. package/port-relay.d.ts.map +1 -0
  25. package/port-relay.js +56 -0
  26. package/port-relay.js.map +1 -0
  27. package/virtualization.d.ts +16 -0
  28. package/virtualization.d.ts.map +1 -0
  29. package/virtualization.js +156 -0
  30. package/virtualization.js.map +1 -0
  31. package/vz/Package.swift +23 -0
  32. package/vz/Sources/DeskNet/Addresses.swift +106 -0
  33. package/vz/Sources/DeskNet/DHCP.swift +111 -0
  34. package/vz/Sources/DeskNet/Fence.swift +57 -0
  35. package/vz/Sources/DeskNet/NetworkStack.swift +547 -0
  36. package/vz/Sources/DeskNet/Packets.swift +355 -0
  37. package/vz/Sources/DeskNet/Plumbing.swift +312 -0
  38. package/vz/Sources/DeskNet/Sockets.swift +221 -0
  39. package/vz/Sources/DeskNet/TCPFlow.swift +448 -0
  40. package/vz/Sources/appkit-desk-vz/Control.swift +152 -0
  41. package/vz/Sources/appkit-desk-vz/Helper.swift +550 -0
  42. package/vz/Sources/appkit-desk-vz/main.swift +38 -0
  43. package/vz/Tests/DeskNetTests/DeskNetTests.swift +426 -0
  44. package/vz/appkit-desk-vz.entitlements +8 -0
  45. package/vz/build.sh +23 -0
  46. 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.7.0",
4
- "description": "Per-agent Debian microVMs under Cloud Hypervisor — headless machines with an on-demand screen, a framed vsock guest-agent protocol, leases with idle suspend and a bounded queue, and load-bearing handover masking behind consumer-supplied policy and recording ports.",
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
- /** Guest vsock context ID; must be unique among resident desks. */
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
- /** Directory holding the vsock and API control sockets. */
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
- /** Host TAP device name; derived from the CID when omitted. */
122
+ /** Cloud Hypervisor only: host TAP device name; derived from the CID when omitted. */
48
123
  tapDevice?: string;
49
- /** Guest MAC address; derived from the CID when omitted. */
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
- * The complete Cloud Hypervisor invocation as inspectable data. Nothing here
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
- * Whether this host can run desks at all: Linux, a usable `/dev/kvm`, and the
116
- * Cloud Hypervisor binary. All three checks are injectable and the answer is
117
- * fail-closed — a host missing any of them gets no desk capability rather
118
- * than a degraded one.
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 Cloud Hypervisor launch plan without spawning
130
- * anything. Fail closed: a missing `/dev/kvm`, VMM binary, kernel, base image,
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, dependencies?: {
134
- pathExists?: (path: string) => boolean;
135
- deviceExists?: (path: string) => boolean;
136
- }): DeskLaunchPlan;
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":"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"}
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}