@intentic/sandbox-contract 1.272.0 → 1.273.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 (38) hide show
  1. package/dist/chores/chores.d.ts.map +1 -1
  2. package/dist/chores/chores.js +1 -1
  3. package/dist/chores/chores.js.map +1 -1
  4. package/dist/contracts/capabilities.contract.d.ts +15 -0
  5. package/dist/contracts/capabilities.contract.d.ts.map +1 -1
  6. package/dist/contracts/capabilities.contract.js +10 -0
  7. package/dist/contracts/capabilities.contract.js.map +1 -1
  8. package/dist/contracts/host.contract.d.ts +5 -0
  9. package/dist/contracts/host.contract.d.ts.map +1 -1
  10. package/dist/contracts/system.contract.d.ts +35 -30
  11. package/dist/contracts/system.contract.d.ts.map +1 -1
  12. package/dist/index.d.ts +21 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +1 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/policy/command-run.d.ts.map +1 -1
  17. package/dist/policy/command-run.js +2 -10
  18. package/dist/policy/command-run.js.map +1 -1
  19. package/dist/schemas/devices.d.ts +22 -2
  20. package/dist/schemas/devices.d.ts.map +1 -1
  21. package/dist/schemas/devices.js +41 -7
  22. package/dist/schemas/devices.js.map +1 -1
  23. package/dist/schemas/hosts.d.ts +21 -0
  24. package/dist/schemas/hosts.d.ts.map +1 -1
  25. package/dist/schemas/hosts.js +9 -0
  26. package/dist/schemas/hosts.js.map +1 -1
  27. package/dist/schemas/remote-refs.d.ts +28 -0
  28. package/dist/schemas/remote-refs.d.ts.map +1 -0
  29. package/dist/schemas/remote-refs.js +30 -0
  30. package/dist/schemas/remote-refs.js.map +1 -0
  31. package/package.json +5 -4
  32. package/src/chores/chores.ts +1 -2
  33. package/src/contracts/capabilities.contract.ts +12 -0
  34. package/src/index.ts +1 -0
  35. package/src/policy/command-run.ts +2 -12
  36. package/src/schemas/devices.ts +69 -18
  37. package/src/schemas/hosts.ts +21 -0
  38. package/src/schemas/remote-refs.ts +39 -0
@@ -1 +1 @@
1
- {"version":3,"file":"command-run.js","sourceRoot":"","sources":["../../src/policy/command-run.ts"],"names":[],"mappings":"AAeA,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,MAA+B,EAAiB,EAAE,CACzE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;IACpB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnC,SAAS,IAAI;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3C,OAAO,EAAE,CAAC;IACd,CAAC;IACD,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC;AAIP,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAwB,IAAsB,EAAE,OAA4B,EAA0B,EAAE;IACzI,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACzD,SAAS,CAAC;QACN,IAAI,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,IAAI,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;YACf,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,GAAG,CAAC;YACf,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,MAAM,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAA4C,EAAE,OAAe,EAAU,EAAE;IACvG,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,GAAG,OAAO,YAAY,CAAC;IAClC,CAAC;IACD,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,OAAO;YACR,OAAO,GAAG,OAAO,eAAe,CAAC;QACrC,KAAK,WAAW;YACZ,OAAO,GAAG,OAAO,UAAU,CAAC;QAChC,KAAK,QAAQ;YACT,OAAO,GAAG,OAAO,SAAS,CAAC;QAC/B,KAAK,QAAQ;YACT,OAAO,GAAG,OAAO,SAAS,CAAC;QAC/B;YAEI,OAAO,GAAG,OAAO,aAAa,CAAC;IACvC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"command-run.js","sourceRoot":"","sources":["../../src/policy/command-run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAiB7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAwB,IAAsB,EAAE,OAA4B,EAA0B,EAAE;IACzI,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACzD,SAAS,CAAC;QACN,IAAI,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,IAAI,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;YACf,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,GAAG,CAAC;YACf,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAA4C,EAAE,OAAe,EAAU,EAAE;IACvG,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,GAAG,OAAO,YAAY,CAAC;IAClC,CAAC;IACD,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,OAAO;YACR,OAAO,GAAG,OAAO,eAAe,CAAC;QACrC,KAAK,WAAW;YACZ,OAAO,GAAG,OAAO,UAAU,CAAC;QAChC,KAAK,QAAQ;YACT,OAAO,GAAG,OAAO,SAAS,CAAC;QAC/B,KAAK,QAAQ;YACT,OAAO,GAAG,OAAO,SAAS,CAAC;QAC/B;YAEI,OAAO,GAAG,OAAO,aAAa,CAAC;IACvC,CAAC;AACL,CAAC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { type HostFacts } from "./hosts.js";
2
3
  export declare const SandboxResourcesSchema: z.ZodObject<{
3
4
  memoryBytes: z.ZodOptional<z.ZodNumber>;
4
5
  cpus: z.ZodOptional<z.ZodNumber>;
@@ -352,8 +353,8 @@ export declare const DeviceReportSchema: z.ZodObject<{
352
353
  export type DeviceReport = z.infer<typeof DeviceReportSchema>;
353
354
  export declare const REPORT_QUIET_AFTER_MS = 60000;
354
355
  export declare const reportQuiet: (report: DeviceReport, receivedAt: number) => boolean;
355
- export declare const environmentOf: (report: DeviceReport | undefined) => string | undefined;
356
- export declare const differentEnvironment: (left: DeviceReport | undefined, right: DeviceReport | undefined) => boolean;
356
+ export declare const environmentOf: (facts: Pick<HostFacts, "hostname" | "wsl"> | undefined, report: DeviceReport | undefined) => string | undefined;
357
+ export declare const differentEnvironment: (left: string | undefined, right: string | undefined) => boolean;
357
358
  export declare const agentBuildSkew: (agent: DeviceAgent) => {
358
359
  readonly running: string | undefined;
359
360
  readonly installed: string;
@@ -398,6 +399,11 @@ export declare const DeviceSchema: z.ZodObject<{
398
399
  memoryBytes: z.ZodNumber;
399
400
  cpus: z.ZodNumber;
400
401
  }, z.core.$strip>>;
402
+ hostname: z.ZodOptional<z.ZodString>;
403
+ wsl: z.ZodOptional<z.ZodObject<{
404
+ distro: z.ZodString;
405
+ }, z.core.$strip>>;
406
+ wslDistros: z.ZodOptional<z.ZodArray<z.ZodString>>;
401
407
  }, z.core.$strip>>;
402
408
  agentVersion: z.ZodOptional<z.ZodString>;
403
409
  lastSeen: z.ZodOptional<z.ZodNumber>;
@@ -509,6 +515,11 @@ export declare const DevicesListSchema: z.ZodObject<{
509
515
  memoryBytes: z.ZodNumber;
510
516
  cpus: z.ZodNumber;
511
517
  }, z.core.$strip>>;
518
+ hostname: z.ZodOptional<z.ZodString>;
519
+ wsl: z.ZodOptional<z.ZodObject<{
520
+ distro: z.ZodString;
521
+ }, z.core.$strip>>;
522
+ wslDistros: z.ZodOptional<z.ZodArray<z.ZodString>>;
512
523
  }, z.core.$strip>>;
513
524
  agentVersion: z.ZodOptional<z.ZodString>;
514
525
  lastSeen: z.ZodOptional<z.ZodNumber>;
@@ -595,6 +606,15 @@ export declare const DevicesListSchema: z.ZodObject<{
595
606
  }>>;
596
607
  }, z.core.$strip>>;
597
608
  }, z.core.$strip>;
609
+ export interface Machine {
610
+ readonly key: string;
611
+ readonly label: string;
612
+ readonly environments: readonly Device[];
613
+ }
614
+ export declare const deviceHostname: (device: Device) => string | undefined;
615
+ export declare const deviceEnvironment: (device: Device) => string | undefined;
616
+ export declare const isWslDevice: (device: Device) => boolean;
617
+ export declare const machinesOf: (devices: readonly Device[]) => Machine[];
598
618
  export declare const hostRunningSandbox: (devices: readonly Device[], slug: string | undefined) => string | undefined;
599
619
  export declare const SyncStatusSchema: z.ZodObject<{
600
620
  enrolled: z.ZodBoolean;
@@ -1 +1 @@
1
- {"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../src/schemas/devices.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../src/schemas/devices.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { HostFactsSchema } from "./hosts.js";
2
+ import { HostFactsSchema, WslEnvironmentSchema } from "./hosts.js";
3
3
  import { DEV_VERSION } from "../state/versions.js";
4
4
  export const SandboxResourcesSchema = z.object({
5
5
  memoryBytes: z.number().optional(),
@@ -167,7 +167,7 @@ export const agentStalled = (agent, now) => agent.running && agent.lastTickAt !=
167
167
  export const DeviceReportSchema = z.object({
168
168
  hostname: z.string(),
169
169
  os: z.string(),
170
- wsl: z.object({ distro: z.string() }).optional(),
170
+ wsl: WslEnvironmentSchema.optional(),
171
171
  pairings: z.array(DevicePairingSchema),
172
172
  ports: z.array(DevicePortSchema),
173
173
  agent: DeviceAgentSchema,
@@ -175,12 +175,14 @@ export const DeviceReportSchema = z.object({
175
175
  });
176
176
  export const REPORT_QUIET_AFTER_MS = 60_000;
177
177
  export const reportQuiet = (report, receivedAt) => receivedAt - report.capturedAt > REPORT_QUIET_AFTER_MS;
178
- export const environmentOf = (report) => report === undefined ? undefined : report.wsl === undefined ? report.os : `wsl:${report.wsl.distro}`;
179
- export const differentEnvironment = (left, right) => {
180
- const a = environmentOf(left);
181
- const b = environmentOf(right);
182
- return a !== undefined && b !== undefined && a !== b;
178
+ export const environmentOf = (facts, report) => {
179
+ const wsl = facts?.wsl ?? report?.wsl;
180
+ if (wsl !== undefined) {
181
+ return `wsl:${wsl.distro}`;
182
+ }
183
+ return facts?.hostname !== undefined || report !== undefined ? "native" : undefined;
183
184
  };
185
+ export const differentEnvironment = (left, right) => left !== undefined && right !== undefined && left !== right;
184
186
  export const agentBuildSkew = (agent) => {
185
187
  const { build: running, installed } = agent;
186
188
  if (!agent.running || installed === undefined || installed === DEV_VERSION || running === installed) {
@@ -214,6 +216,38 @@ export const DeviceSchema = z.object({
214
216
  gap: DeviceGapSchema.optional(),
215
217
  });
216
218
  export const DevicesListSchema = z.object({ devices: z.array(DeviceSchema) });
219
+ export const deviceHostname = (device) => device.facts?.hostname ?? device.report?.hostname;
220
+ export const deviceEnvironment = (device) => environmentOf(device.facts, device.report);
221
+ export const isWslDevice = (device) => deviceEnvironment(device)?.startsWith("wsl:") === true;
222
+ const byEnvironment = (a, b) => Number(isWslDevice(a)) - Number(isWslDevice(b)) || a.label.localeCompare(b.label);
223
+ const hostnameKey = (device) => deviceHostname(device)?.toLowerCase();
224
+ const siblingsOf = (device, devices) => {
225
+ const key = hostnameKey(device);
226
+ const shared = key === undefined ? [device] : devices.filter((candidate) => hostnameKey(candidate) === key);
227
+ return shared.length > 1 && shared.some(isWslDevice) ? shared.toSorted(byEnvironment) : [device];
228
+ };
229
+ const machineOf = (device, environments) => {
230
+ if (environments.length === 1) {
231
+ return { key: device.key, label: device.label, environments };
232
+ }
233
+ const hostname = deviceHostname(device) ?? device.key;
234
+ return { key: hostname, label: hostname, environments };
235
+ };
236
+ export const machinesOf = (devices) => {
237
+ const folded = new Set();
238
+ const machines = [];
239
+ for (const device of devices) {
240
+ if (folded.has(device)) {
241
+ continue;
242
+ }
243
+ const environments = siblingsOf(device, devices);
244
+ for (const environment of environments) {
245
+ folded.add(environment);
246
+ }
247
+ machines.push(machineOf(device, environments));
248
+ }
249
+ return machines;
250
+ };
217
251
  export const hostRunningSandbox = (devices, slug) => slug === undefined || slug === ""
218
252
  ? undefined
219
253
  : devices.find((device) => device.hostId !== undefined && device.online === true && (device.sandboxes ?? []).some((box) => box.slug === slug))
@@ -1 +1 @@
1
- {"version":3,"file":"devices.js","sourceRoot":"","sources":["../../src/schemas/devices.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"devices.js","sourceRoot":"","sources":["../../src/schemas/devices.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,8 @@
1
1
  import { z } from "zod";
2
+ export declare const WslEnvironmentSchema: z.ZodObject<{
3
+ distro: z.ZodString;
4
+ }, z.core.$strip>;
5
+ export type WslEnvironment = z.infer<typeof WslEnvironmentSchema>;
2
6
  export declare const HostFactsSchema: z.ZodObject<{
3
7
  os: z.ZodString;
4
8
  arch: z.ZodString;
@@ -9,8 +13,15 @@ export declare const HostFactsSchema: z.ZodObject<{
9
13
  memoryBytes: z.ZodNumber;
10
14
  cpus: z.ZodNumber;
11
15
  }, z.core.$strip>>;
16
+ hostname: z.ZodOptional<z.ZodString>;
17
+ wsl: z.ZodOptional<z.ZodObject<{
18
+ distro: z.ZodString;
19
+ }, z.core.$strip>>;
20
+ wslDistros: z.ZodOptional<z.ZodArray<z.ZodString>>;
12
21
  }, z.core.$strip>;
13
22
  export type HostFacts = z.infer<typeof HostFactsSchema>;
23
+ export declare const wslPathOf: (windowsPath: string) => string | undefined;
24
+ export declare const windowsPathOf: (distro: string, linuxPath: string) => string;
14
25
  export declare const HostSummarySchema: z.ZodObject<{
15
26
  id: z.ZodString;
16
27
  platform: z.ZodString;
@@ -27,6 +38,11 @@ export declare const HostSummarySchema: z.ZodObject<{
27
38
  memoryBytes: z.ZodNumber;
28
39
  cpus: z.ZodNumber;
29
40
  }, z.core.$strip>>;
41
+ hostname: z.ZodOptional<z.ZodString>;
42
+ wsl: z.ZodOptional<z.ZodObject<{
43
+ distro: z.ZodString;
44
+ }, z.core.$strip>>;
45
+ wslDistros: z.ZodOptional<z.ZodArray<z.ZodString>>;
30
46
  }, z.core.$strip>>;
31
47
  }, z.core.$strip>;
32
48
  export type HostSummary = z.infer<typeof HostSummarySchema>;
@@ -47,6 +63,11 @@ export declare const HostsListSchema: z.ZodObject<{
47
63
  memoryBytes: z.ZodNumber;
48
64
  cpus: z.ZodNumber;
49
65
  }, z.core.$strip>>;
66
+ hostname: z.ZodOptional<z.ZodString>;
67
+ wsl: z.ZodOptional<z.ZodObject<{
68
+ distro: z.ZodString;
69
+ }, z.core.$strip>>;
70
+ wslDistros: z.ZodOptional<z.ZodArray<z.ZodString>>;
50
71
  }, z.core.$strip>>;
51
72
  }, z.core.$strip>>;
52
73
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"hosts.d.ts","sourceRoot":"","sources":["../../src/schemas/hosts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,eAAe;;;;;;;;;;iBAa1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;iBAU5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;iBAAkD,CAAC"}
1
+ {"version":3,"file":"hosts.d.ts","sourceRoot":"","sources":["../../src/schemas/hosts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,oBAAoB;;iBAAmC,CAAC;AACrE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIlE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;iBAoB1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAIxD,eAAO,MAAM,SAAS,gBAAiB,MAAM,KAAG,MAAM,GAAG,SAGxD,CAAC;AACF,eAAO,MAAM,aAAa,WAAY,MAAM,aAAa,MAAM,KAAG,MAA0E,CAAC;AAC7I,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;iBAU5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;iBAAkD,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ export const WslEnvironmentSchema = z.object({ distro: z.string() });
2
3
  export const HostFactsSchema = z.object({
3
4
  os: z.string(),
4
5
  arch: z.string(),
@@ -6,7 +7,15 @@ export const HostFactsSchema = z.object({
6
7
  home: z.string(),
7
8
  roots: z.array(z.string()),
8
9
  engine: z.object({ memoryBytes: z.number(), cpus: z.number() }).optional(),
10
+ hostname: z.string().optional(),
11
+ wsl: WslEnvironmentSchema.optional(),
12
+ wslDistros: z.array(z.string()).optional(),
9
13
  });
14
+ export const wslPathOf = (windowsPath) => {
15
+ const drive = /^([A-Za-z]):[\\/](.*)$/.exec(windowsPath);
16
+ return drive === null ? undefined : `/mnt/${drive[1]?.toLowerCase()}/${(drive[2] ?? "").replaceAll("\\", "/")}`.replace(/\/$/, "");
17
+ };
18
+ export const windowsPathOf = (distro, linuxPath) => `\\\\wsl.localhost\\${distro}${linuxPath.replaceAll("/", "\\")}`;
10
19
  export const HostSummarySchema = z.object({
11
20
  id: z.string(),
12
21
  platform: z.string().min(1),
@@ -1 +1 @@
1
- {"version":3,"file":"hosts.js","sourceRoot":"","sources":["../../src/schemas/hosts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAEpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAEhB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IAEjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAEhB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAG1B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC7E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IAEtC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;IAEnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAE9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,KAAK,EAAE,eAAe,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"hosts.js","sourceRoot":"","sources":["../../src/schemas/hosts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAKrE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAEpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAEhB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IAEjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAEhB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAG1B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;IAG1E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAE/B,GAAG,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IAEpC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC7C,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,WAAmB,EAAsB,EAAE;IACjE,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzD,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACvI,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAU,EAAE,CAAC,sBAAsB,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;AAC7I,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IAEtC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;IAEnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAE9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,KAAK,EAAE,eAAe,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ export declare const RemoteRefsRequestSchema: z.ZodObject<{
3
+ url: z.ZodURL;
4
+ token: z.ZodOptional<z.ZodString>;
5
+ keeping: z.ZodOptional<z.ZodString>;
6
+ }, z.core.$strip>;
7
+ export declare const RemoteRefSchema: z.ZodObject<{
8
+ name: z.ZodString;
9
+ kind: z.ZodEnum<{
10
+ branch: "branch";
11
+ tag: "tag";
12
+ }>;
13
+ sha: z.ZodString;
14
+ }, z.core.$strip>;
15
+ export type RemoteRef = z.infer<typeof RemoteRefSchema>;
16
+ export declare const RemoteRefsSchema: z.ZodObject<{
17
+ defaultBranch: z.ZodOptional<z.ZodString>;
18
+ refs: z.ZodArray<z.ZodObject<{
19
+ name: z.ZodString;
20
+ kind: z.ZodEnum<{
21
+ branch: "branch";
22
+ tag: "tag";
23
+ }>;
24
+ sha: z.ZodString;
25
+ }, z.core.$strip>>;
26
+ }, z.core.$strip>;
27
+ export type RemoteRefs = z.infer<typeof RemoteRefsSchema>;
28
+ //# sourceMappingURL=remote-refs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-refs.d.ts","sourceRoot":"","sources":["../../src/schemas/remote-refs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,uBAAuB;;;;iBAclC,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;iBAO1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,gBAAgB;;;;;;;;;;iBAM3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ export const RemoteRefsRequestSchema = z.object({
3
+ url: z.url().describe("The repository to ask. http(s) only: an ssh remote would stop on a host-key prompt nobody can answer."),
4
+ token: z
5
+ .string()
6
+ .min(1)
7
+ .optional()
8
+ .describe("A credential for a private one. Sent as a body rather than in the address, so it never lands in a log. A form editing a live connection has never been shown its token: it sends the VAULTED marker here and names the connection in `keeping`, so a private repository still answers without anyone retyping a key."),
9
+ keeping: z
10
+ .string()
11
+ .min(1)
12
+ .optional()
13
+ .describe("Which connection a VAULTED token belongs to. Ignored when a real token is sent."),
14
+ });
15
+ export const RemoteRefSchema = z.object({
16
+ name: z.string().describe("The branch or tag as a person names it: `main`, `v1.4.0`."),
17
+ kind: z.enum(["branch", "tag"]),
18
+ sha: z
19
+ .string()
20
+ .regex(/^[0-9a-f]{40}$/)
21
+ .describe("The commit it points at. An annotated tag is peeled here, so this is always a commit, never a tag object."),
22
+ });
23
+ export const RemoteRefsSchema = z.object({
24
+ defaultBranch: z
25
+ .string()
26
+ .optional()
27
+ .describe("The branch the remote advertises as HEAD, the one to offer first. Absent when the remote advertises no symref."),
28
+ refs: z.array(RemoteRefSchema).describe("Every branch the remote advertises, then every tag. Which to offer first is the reader's question, not this one's."),
29
+ });
30
+ //# sourceMappingURL=remote-refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-refs.js","sourceRoot":"","sources":["../../src/schemas/remote-refs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,uGAAuG,CAAC;IAC9H,KAAK,EAAE,CAAC;SACH,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CACL,sTAAsT,CACzT;IACL,OAAO,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,iFAAiF,CAAC;CACnG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;IACtF,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,GAAG,EAAE,CAAC;SACD,MAAM,EAAE;SACR,KAAK,CAAC,gBAAgB,CAAC;SACvB,QAAQ,CAAC,2GAA2G,CAAC;CAC7H,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,aAAa,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,gHAAgH,CAAC;IAC/H,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,oHAAoH,CAAC;CAChK,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intentic/sandbox-contract",
3
- "version": "1.272.0",
3
+ "version": "1.273.0",
4
4
  "description": "oRPC wire contract for the intentic sandbox daemon, shared by the daemon and its browser client",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -196,9 +196,10 @@
196
196
  }
197
197
  },
198
198
  "dependencies": {
199
- "@intentic/constants": "1.272.0",
200
- "@intentic/extension-manifest": "1.272.0",
201
- "@intentic/registry": "1.272.0",
199
+ "@intentic/base": "1.273.0",
200
+ "@intentic/constants": "1.273.0",
201
+ "@intentic/extension-manifest": "1.273.0",
202
+ "@intentic/registry": "1.273.0",
202
203
  "@orpc/contract": "1.14.13",
203
204
  "tslib": "2.8.1",
204
205
  "zod": "4.5.4"
@@ -1,4 +1,5 @@
1
1
  import type { Advisory, ChoreSignals, OutdatedPackage, ProbeId, ProbeResult } from "../schemas/maintenance.js";
2
+ import { plural } from "@intentic/base/format";
2
3
  import { bucketOf, digestOf } from "./digest.js";
3
4
  import { CHORE_INVARIANTS, composeAsk, REPORT_INVARIANTS, TRIAGE_NOTE } from "./prompt.js";
4
5
  import { componentStem, frameworksOf, idiomRule, normalizePath, UI_FRAMEWORKS, usesTailwind } from "./stack.js";
@@ -96,8 +97,6 @@ export const repoLabel = (repo: string): string => (repo === `root` || repo ===
96
97
  // workspace root reposi…").
97
98
  export const repoName = (repo: string): string => (repo === `root` || repo === `` ? `workspace root` : repo);
98
99
 
99
- const plural = (count: number, one: string, many = `${one}s`): string => `${count} ${count === 1 ? one : many}`;
100
-
101
100
  // One outdated dependency, as the panel lists it; the semver step leads, since it decides whether the row is a
102
101
  // morning's work or a project.
103
102
  const outdatedLine = (entry: OutdatedPackage): string => `${entry.kind} · ${entry.name} ${entry.current} → ${entry.latest}`;
@@ -14,6 +14,7 @@ import {
14
14
  CapabilityStatusSchema,
15
15
  } from "../schemas/capabilities.js";
16
16
  import { MarketplaceRequestSchema, MarketplaceSchema } from "../schemas/marketplace.js";
17
+ import { RemoteRefsRequestSchema, RemoteRefsSchema } from "../schemas/remote-refs.js";
17
18
  import { OkSchema } from "../schemas/shared.js";
18
19
 
19
20
  // The sandbox's unified capability manifest, spanning `list`/`add`/`remove`/`status`/`marketplace`. A VAULTED marker
@@ -108,6 +109,17 @@ export const capabilitiesContract = {
108
109
  })
109
110
  .input(MarketplaceRequestSchema)
110
111
  .output(MarketplaceSchema),
112
+ // What the install form pins to, so nobody has to read a commit sha off a web page and paste it.
113
+ refs: oc
114
+ .route({
115
+ method: "POST",
116
+ path: "/capabilities/refs",
117
+ summary: "The versions a repository offers",
118
+ description:
119
+ "Asks a git remote what it advertises and hands back every branch and tag with the commit it points at, plus which branch is its default. Nothing is cloned and nothing is written, so this is cheap enough to answer a form as someone types a repository into it.",
120
+ })
121
+ .input(RemoteRefsRequestSchema)
122
+ .output(RemoteRefsSchema),
111
123
  dismiss: oc
112
124
  .route({
113
125
  method: "DELETE",
package/src/index.ts CHANGED
@@ -169,6 +169,7 @@ export * from "./schemas/providers/provider-oauth.js";
169
169
  export * from "./schemas/providers/provider-subscriptions.js";
170
170
  export * from "./schemas/public.js";
171
171
  export * from "./schemas/push.js";
172
+ export * from "./schemas/remote-refs.js";
172
173
  export * from "./schemas/secrets.js";
173
174
  export * from "./schemas/sessions.js";
174
175
  export * from "./schemas/settings.js";
@@ -1,4 +1,5 @@
1
1
  import type { CommandRun } from "../schemas/ci.js";
2
+ import { sleep } from "@intentic/base/async";
2
3
 
3
4
  // The heading over a settled run, shown both on the workspace card and in a phone notification, so the two must agree
4
5
  // on wording. `subject` is what ran, in the clicked button's own words ("Checks", "Push", "Publish").
@@ -13,17 +14,6 @@ export interface FollowRunOptions<R extends CommandRun> {
13
14
  readonly onError?: ((cause: unknown) => void) | undefined;
14
15
  }
15
16
 
16
- const sleep = (ms: number, signal: AbortSignal | undefined): Promise<void> =>
17
- new Promise((resolve) => {
18
- const timer = setTimeout(done, ms);
19
- function done(): void {
20
- clearTimeout(timer);
21
- signal?.removeEventListener("abort", done);
22
- resolve();
23
- }
24
- signal?.addEventListener("abort", done, { once: true });
25
- });
26
-
27
17
  // Follows a run to its verdict: reads state until it is no longer running. The one shared loop, so a dropped poll isn't
28
18
  // handled differently by every caller; reads once immediately, so an already-settled run returns without a wait.
29
19
  export const followCommandRun = async <R extends CommandRun>(read: () => Promise<R>, options: FollowRunOptions<R>): Promise<R | undefined> => {
@@ -41,7 +31,7 @@ export const followCommandRun = async <R extends CommandRun>(read: () => Promise
41
31
  } catch (cause) {
42
32
  onError?.(cause);
43
33
  }
44
- await sleep(intervalMs, signal);
34
+ await sleep(intervalMs, { signal });
45
35
  }
46
36
  };
47
37
 
@@ -1,6 +1,6 @@
1
1
  // What one of the user's own machines is running.
2
2
  import { z } from "zod";
3
- import { HostFactsSchema } from "./hosts.js";
3
+ import { type HostFacts, HostFactsSchema, WslEnvironmentSchema } from "./hosts.js";
4
4
  import { DEV_VERSION } from "../state/versions.js";
5
5
  // Desktop-sync report shape shared by the agent, daemon and browser, produced only by `intentic-machine status --json`.
6
6
  // The agent never reports `sandboxes`; the docker half is filled in by whoever reads the report, scoped to the reader's
@@ -303,10 +303,8 @@ export const DeviceReportSchema = z.object({
303
303
  // own: a WSL distro inherits the Windows machine's name, so `wsl` below is what tells those apart.
304
304
  hostname: z.string(),
305
305
  os: z.string(),
306
- // Present only inside a WSL distro. `distro` is that distro's own name ("Arch", "Ubuntu-22.04"), empty when the
307
- // machine won't say. Windows, and every distro it hosts, all answer `hostname` with the same string while being
308
- // separate filesystems running separate agents, so this is the only thing that keeps them apart.
309
- wsl: z.object({ distro: z.string() }).optional(),
306
+ // Present only inside a WSL distro; the same fact rides the connect-time facts, which no scope can withhold.
307
+ wsl: WslEnvironmentSchema.optional(),
310
308
  pairings: z.array(DevicePairingSchema),
311
309
  ports: z.array(DevicePortSchema),
312
310
  // The one agent this device runs, on disk and in flight, in one block.
@@ -321,21 +319,23 @@ export type DeviceReport = z.infer<typeof DeviceReportSchema>;
321
319
  export const REPORT_QUIET_AFTER_MS = 60_000;
322
320
  export const reportQuiet = (report: DeviceReport, receivedAt: number): boolean => receivedAt - report.capturedAt > REPORT_QUIET_AFTER_MS;
323
321
 
324
- // The environment a reading came from, as opposed to the machine hosting it: a Windows install and every WSL distro
325
- // on it are separate filesystems running separate agents, and all of them answer `hostname` with the same string.
326
- // Undefined when nothing has reported — an absence of evidence, never read as agreement.
327
- export const environmentOf = (report: DeviceReport | undefined): string | undefined =>
328
- report === undefined ? undefined : report.wsl === undefined ? report.os : `wsl:${report.wsl.distro}`;
329
-
330
- // Whether two readings positively disagree about which environment they describe. False whenever either side has not
331
- // said, so this only ever blocks a fold it holds evidence against, and an agent too old to report `wsl` keeps the
332
- // behaviour it had before the field existed.
333
- export const differentEnvironment = (left: DeviceReport | undefined, right: DeviceReport | undefined): boolean => {
334
- const a = environmentOf(left);
335
- const b = environmentOf(right);
336
- return a !== undefined && b !== undefined && a !== b;
322
+ // The environment a device's evidence describes, as opposed to the machine hosting it: `wsl:<distro>` inside a
323
+ // distro, `native` for an install on the metal. Connect-time facts are read first, since no scope can withhold them;
324
+ // facts from an agent too old to carry `hostname` say nothing, and a report without `wsl` is native, as it always
325
+ // was. Undefined is an absence of evidence, never read as agreement.
326
+ export const environmentOf = (facts: Pick<HostFacts, "hostname" | "wsl"> | undefined, report: DeviceReport | undefined): string | undefined => {
327
+ const wsl = facts?.wsl ?? report?.wsl;
328
+ if (wsl !== undefined) {
329
+ return `wsl:${wsl.distro}`;
330
+ }
331
+ return facts?.hostname !== undefined || report !== undefined ? "native" : undefined;
337
332
  };
338
333
 
334
+ // Whether two devices positively disagree about which environment they are. False whenever either side has not said,
335
+ // so this only ever blocks a fold it holds evidence against.
336
+ export const differentEnvironment = (left: string | undefined, right: string | undefined): boolean =>
337
+ left !== undefined && right !== undefined && left !== right;
338
+
339
339
  // Compares running build against installed; silent when the loop is stopped, nothing installed, or installed is a dev
340
340
  // build. An unstamped `running` still counts as skew.
341
341
  export const agentBuildSkew = (agent: DeviceAgent): { readonly running: string | undefined; readonly installed: string } | undefined => {
@@ -402,6 +402,57 @@ export const DeviceSchema = z.object({
402
402
  export type Device = z.infer<typeof DeviceSchema>;
403
403
  export const DevicesListSchema = z.object({ devices: z.array(DeviceSchema) });
404
404
 
405
+ // The physical computer a device is an environment of. Windows and every WSL distro on it are one machine with one
406
+ // Docker engine, one screen and one set of disks, each environment holding its own agent and its own door.
407
+ export interface Machine {
408
+ /** A lone device's own key, so its address does not change; a folded machine's is the hostname its doors share. */
409
+ readonly key: string;
410
+ readonly label: string;
411
+ /** Windows first, then distros by label: the side that owns the screen leads. */
412
+ readonly environments: readonly Device[];
413
+ }
414
+
415
+ export const deviceHostname = (device: Device): string | undefined => device.facts?.hostname ?? device.report?.hostname;
416
+ export const deviceEnvironment = (device: Device): string | undefined => environmentOf(device.facts, device.report);
417
+ export const isWslDevice = (device: Device): boolean => deviceEnvironment(device)?.startsWith("wsl:") === true;
418
+
419
+ // Two native installs that merely share a name stay two machines; only a distro joins the machine whose hostname it
420
+ // carries, which is the one fact that makes the name safe to join on.
421
+ const byEnvironment = (a: Device, b: Device): number => Number(isWslDevice(a)) - Number(isWslDevice(b)) || a.label.localeCompare(b.label);
422
+
423
+ const hostnameKey = (device: Device): string | undefined => deviceHostname(device)?.toLowerCase();
424
+
425
+ const siblingsOf = (device: Device, devices: readonly Device[]): Device[] => {
426
+ const key = hostnameKey(device);
427
+ const shared = key === undefined ? [device] : devices.filter((candidate) => hostnameKey(candidate) === key);
428
+ return shared.length > 1 && shared.some(isWslDevice) ? shared.toSorted(byEnvironment) : [device];
429
+ };
430
+
431
+ const machineOf = (device: Device, environments: readonly Device[]): Machine => {
432
+ if (environments.length === 1) {
433
+ return { key: device.key, label: device.label, environments };
434
+ }
435
+ // Folding needs a hostname, so it is present here; the fallback only keeps the type honest.
436
+ const hostname = deviceHostname(device) ?? device.key;
437
+ return { key: hostname, label: hostname, environments };
438
+ };
439
+
440
+ export const machinesOf = (devices: readonly Device[]): Machine[] => {
441
+ const folded = new Set<Device>();
442
+ const machines: Machine[] = [];
443
+ for (const device of devices) {
444
+ if (folded.has(device)) {
445
+ continue;
446
+ }
447
+ const environments = siblingsOf(device, devices);
448
+ for (const environment of environments) {
449
+ folded.add(environment);
450
+ }
451
+ machines.push(machineOf(device, environments));
452
+ }
453
+ return machines;
454
+ };
455
+
405
456
  // The connected, online device whose docker reports a given sandbox slug: the machine that sandbox RUNS ON, as opposed
406
457
  // to any machine merely paired with it. Answers the question every "run it there instead of asking the owner to type
407
458
  // it" path starts from, and is `undefined` for a sync-only agent, which reports no containers at all.