windows-development-sandbox 1.27.1 → 1.27.3

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 (78) hide show
  1. package/dist/app/context.d.ts +5 -0
  2. package/dist/app/context.js +13 -0
  3. package/dist/app/features/accounts/accounts.def.d.ts +16 -0
  4. package/dist/app/features/accounts/accounts.run.d.ts +4 -0
  5. package/dist/app/features/accounts/services.def.d.ts +15 -1
  6. package/dist/app/features/accounts/services.def.js +67 -31
  7. package/dist/app/features/accounts/services.run.d.ts +7 -2
  8. package/dist/app/features/accounts/services.run.js +25 -6
  9. package/dist/app/features/defs.d.ts +17 -0
  10. package/dist/app/registry.d.ts +1 -1
  11. package/dist/app/registry.js +15 -2
  12. package/dist/bin/agent-sandbox.js +2 -2
  13. package/dist/bin/{chunk-QUHNXHVG.js → chunk-4M5SZZ5P.js} +46 -41
  14. package/dist/bin/{chunk-4TLSWPG7.js → chunk-FA5VWLP4.js} +1 -1
  15. package/dist/bin/{chunk-RSIX7C6D.js → chunk-RU7XRN62.js} +249 -101
  16. package/dist/bin/claude-host.js +2 -2
  17. package/dist/bin/claude-sbx.js +2 -2
  18. package/dist/bin/codex-sbx.js +2 -2
  19. package/dist/bin/gemini-sbx.js +2 -2
  20. package/dist/bin/sandbox.js +2 -2
  21. package/dist/bin/sbx-hide.js +2 -2
  22. package/dist/bin/sbx-show.js +2 -2
  23. package/dist/cli/menu/menu.js +6 -1
  24. package/dist/cli/menu/pages/accounts-page.js +9 -5
  25. package/dist/guest/apps/app-installer.js +7 -5
  26. package/dist/guest/apps/comet-unpack.js +2 -2
  27. package/dist/guest/runtime/pools.d.ts +4 -4
  28. package/dist/guest/runtime/pools.js +4 -15
  29. package/dist/guest/runtime/process.d.ts +5 -2
  30. package/dist/guest/runtime/process.js +23 -3
  31. package/dist/guest/toolchains/engines/epic-launcher.d.ts +6 -0
  32. package/dist/guest/toolchains/engines/epic-launcher.js +19 -1
  33. package/dist/guest/toolchains/engines/unreal-engines.js +2 -1
  34. package/dist/guest/toolchains/installers.d.ts +3 -3
  35. package/dist/guest/toolchains/installers.js +5 -5
  36. package/dist/guest/toolchains/native/vcruntime.js +2 -2
  37. package/dist/guest/toolchains/native/vs-persist.d.ts +2 -2
  38. package/dist/guest/toolchains/signature.d.ts +2 -0
  39. package/dist/guest/toolchains/signature.js +9 -2
  40. package/dist/guest/toolchains/step-scheduler.js +1 -1
  41. package/dist/host/accounts/deliver.js +15 -7
  42. package/dist/host/pc-installs/discover.js +5 -2
  43. package/dist/host/pc-installs/unreal.d.ts +3 -1
  44. package/dist/host/pc-installs/unreal.js +27 -1
  45. package/dist/runtime/agent.js +34 -22
  46. package/dist/runtime/daemon.js +96 -51
  47. package/dist/runtime/db.js +32 -16
  48. package/dist/runtime/main.js +98 -53
  49. package/dist/runtime/netproxy.js +26 -12
  50. package/dist/runtime/tool.js +32 -15
  51. package/dist/runtime/view.js +26 -12
  52. package/dist/selftest/app.test.js +20 -2
  53. package/dist/selftest/boot-runner.test.js +15 -1
  54. package/dist/selftest/engines.test.js +22 -1
  55. package/dist/selftest/menu-screens.js +52 -1
  56. package/dist/selftest/menu.test.js +29 -3
  57. package/dist/selftest/service-accounts.test.js +77 -2
  58. package/dist/selftest/ui-text.test.js +4 -0
  59. package/dist/shared/accounts/kinds.js +9 -9
  60. package/dist/shared/apps/catalogue-gamedev.js +1 -0
  61. package/dist/shared/apps/catalogue.d.ts +2 -0
  62. package/dist/shared/concurrency/pools.js +1 -1
  63. package/dist/shared/download/archive.js +4 -2
  64. package/dist/shared/download/index.d.ts +1 -1
  65. package/dist/shared/download/index.js +1 -1
  66. package/dist/shared/download/spawn.d.ts +7 -1
  67. package/dist/shared/download/spawn.js +16 -1
  68. package/dist/shared/paths/pc-installs.d.ts +8 -0
  69. package/dist/shared/unreal/launcher-files.d.ts +7 -0
  70. package/dist/shared/unreal/launcher-files.js +32 -1
  71. package/dist/web/index.html +1 -1
  72. package/dist/web/{main-VPMYTSUL.js → main-NKM7ECSB.js} +59 -59
  73. package/native/csharp/HcsHost/AssemblyInfo.cs +3 -3
  74. package/native/csharp/HostTools/AssemblyInfo.cs +3 -3
  75. package/native/csharp/StorageHelper/AssemblyInfo.cs +3 -3
  76. package/package.json +1 -1
  77. package/schemas/config.schema.json +9 -9
  78. package/schemas/sandbox-config.schema.json +9 -9
@@ -182,6 +182,7 @@ import {
182
182
  redactSecrets,
183
183
  refreshStorage,
184
184
  refuseInSelfTest,
185
+ reloadSettings,
185
186
  reopenSessions,
186
187
  reopenedText,
187
188
  requestApp,
@@ -257,7 +258,7 @@ import {
257
258
  withOperationCommands,
258
259
  working,
259
260
  writeJson
260
- } from "./chunk-RSIX7C6D.js";
261
+ } from "./chunk-RU7XRN62.js";
261
262
 
262
263
  // node_modules/commander/lib/error.js
263
264
  var require_error = __commonJS({
@@ -4410,7 +4411,7 @@ function helpOrdered() {
4410
4411
  return [...COMMANDS].sort((x, y) => rank(x.name) - rank(y.name));
4411
4412
  }
4412
4413
  function toOptions(o, wrapper) {
4413
- const shown2 = o.shownAs && !wrapper ? o.shownAs : o.flag;
4414
+ const shown3 = o.shownAs && !wrapper ? o.shownAs : o.flag;
4414
4415
  const placeholder = o.type === "boolean" ? "" : " <" + (o.value ?? "value") + ">";
4415
4416
  const make = (flag) => {
4416
4417
  const option = new Option((o.short ? o.short + ", " : "") + flag + placeholder, o.description);
@@ -4420,8 +4421,8 @@ function toOptions(o, wrapper) {
4420
4421
  if (o.group) option.helpGroup(o.group + ":");
4421
4422
  return option;
4422
4423
  };
4423
- const visible = make(shown2);
4424
- return shown2 === o.flag ? [visible] : [visible, make(o.flag).hideHelp()];
4424
+ const visible = make(shown3);
4425
+ return shown3 === o.flag ? [visible] : [visible, make(o.flag).hideHelp()];
4425
4426
  }
4426
4427
  function toArgument(arg) {
4427
4428
  const name = (arg.required ? "<" : "[") + arg.name + (arg.variadic ? "..." : "") + (arg.required ? ">" : "]");
@@ -4901,10 +4902,10 @@ var TextScreen = class {
4901
4902
  const chars = [...this.value].map((ch) => this.o.masked ? "*" : ch);
4902
4903
  const inner = width - 4;
4903
4904
  const start = Math.max(0, this.cursor - inner + 1);
4904
- const shown2 = chars.slice(start, start + inner);
4905
- const before = shown2.slice(0, this.cursor - start).join("");
4906
- const at = shown2[this.cursor - start] ?? " ";
4907
- const after = shown2.slice(this.cursor - start + 1).join("");
4905
+ const shown3 = chars.slice(start, start + inner);
4906
+ const before = shown3.slice(0, this.cursor - start).join("");
4907
+ const at = shown3[this.cursor - start] ?? " ";
4908
+ const after = shown3.slice(this.cursor - start + 1).join("");
4908
4909
  const text2 = this.value === "" && this.o.placeholder ? Theme.muted(this.o.placeholder) : before + (Theme.colour ? "\x1B[7m" + at + "\x1B[27m" : "_") + after;
4909
4910
  const body = [
4910
4911
  "",
@@ -5114,10 +5115,10 @@ var PathPickerScreen = class {
5114
5115
  const typing = this.mode === "input";
5115
5116
  const frame = (t) => typing ? Theme.accent(t) : Theme.muted(t);
5116
5117
  const start = Math.max(0, this.cursor - inner + 1);
5117
- const shown2 = this.input.slice(start, start + inner);
5118
- const before = shown2.slice(0, this.cursor - start);
5119
- const at = shown2[this.cursor - start] ?? " ";
5120
- const after = shown2.slice(this.cursor - start + 1);
5118
+ const shown3 = this.input.slice(start, start + inner);
5119
+ const before = shown3.slice(0, this.cursor - start);
5120
+ const at = shown3[this.cursor - start] ?? " ";
5121
+ const after = shown3.slice(this.cursor - start + 1);
5121
5122
  const cursor = typing ? Theme.colour ? "\x1B[7m" + at + "\x1B[27m" : "_" : at;
5122
5123
  const field = this.input === "" && !typing ? Theme.muted("type a path or pick below") : before + cursor + after;
5123
5124
  const verdict = this.verdict();
@@ -5540,17 +5541,17 @@ var OverlayScreen = class {
5540
5541
  var KeyBar = class {
5541
5542
  static render(keys, width) {
5542
5543
  const line = (list) => " " + list.map(([k, what]) => Theme.key(k) + " " + Theme.muted(what)).join(" ");
5543
- const shown2 = [...keys];
5544
+ const shown3 = [...keys];
5544
5545
  const importance = (k) => k[2] ?? 5;
5545
- while (Text.width(line(shown2)) > width - 1) {
5546
+ while (Text.width(line(shown3)) > width - 1) {
5546
5547
  let drop = -1;
5547
- shown2.forEach((k, i) => {
5548
- if (importance(k) > 0 && (drop < 0 || importance(k) >= importance(shown2[drop]))) drop = i;
5548
+ shown3.forEach((k, i) => {
5549
+ if (importance(k) > 0 && (drop < 0 || importance(k) >= importance(shown3[drop]))) drop = i;
5549
5550
  });
5550
5551
  if (drop < 0) break;
5551
- shown2.splice(drop, 1);
5552
+ shown3.splice(drop, 1);
5552
5553
  }
5553
- return Text.truncate(line(shown2), width - 1);
5554
+ return Text.truncate(line(shown3), width - 1);
5554
5555
  }
5555
5556
  };
5556
5557
 
@@ -5584,9 +5585,9 @@ var SideNav = class _SideNav {
5584
5585
  lines.findIndex((l) => l.stop)
5585
5586
  );
5586
5587
  const start = lines.length > height ? Math.min(Math.max(0, at - Math.floor(height / 2)), lines.length - height) : 0;
5587
- const shown2 = lines.slice(start, start + height).map((l) => l.text);
5588
- while (shown2.length < height) shown2.push(" ".repeat(width));
5589
- return shown2;
5588
+ const shown3 = lines.slice(start, start + height).map((l) => l.text);
5589
+ while (shown3.length < height) shown3.push(" ".repeat(width));
5590
+ return shown3;
5590
5591
  }
5591
5592
  static section(nav, section, index, width, slim, standing) {
5592
5593
  const open = index === nav.active;
@@ -6435,8 +6436,8 @@ var StringListEditor = class extends CollectionEditor {
6435
6436
 
6436
6437
  // src/cli/menu/settings/format.ts
6437
6438
  function formatValue(value, max = 60) {
6438
- const shown2 = valueText(value, void 0, max);
6439
- return shown2.tone === "ok" ? Theme.ok(shown2.text) : shown2.tone === "muted" ? Theme.muted(shown2.text) : shown2.text;
6439
+ const shown3 = valueText(value, void 0, max);
6440
+ return shown3.tone === "ok" ? Theme.ok(shown3.text) : shown3.tone === "muted" ? Theme.muted(shown3.text) : shown3.text;
6440
6441
  }
6441
6442
 
6442
6443
  // src/cli/menu/settings/collections/map-editor.ts
@@ -7266,34 +7267,35 @@ var ListPage = class {
7266
7267
  };
7267
7268
 
7268
7269
  // src/cli/menu/pages/accounts-page.ts
7270
+ function shown(m) {
7271
+ return m.services.filter((s) => s.ready);
7272
+ }
7269
7273
  function viewOf(m, category) {
7270
7274
  const agent = m.agents.find((a) => a.name === category);
7271
7275
  if (agent) return menuView(agentPage(agent), { category: agent.name, refresh: false });
7272
- const service = m.services.find((s) => serviceCategory(s.kind) === category);
7276
+ const service = shown(m).find((s) => serviceCategory(s.kind) === category);
7273
7277
  if (service) return menuView(servicePage(service), { category: serviceCategory(service.kind), refresh: false });
7274
7278
  return menuView({ title: "Accounts", sections: [] }, { refresh: false });
7275
7279
  }
7276
7280
  function accountsOptions(m) {
7277
7281
  return {
7278
7282
  path: [],
7279
- intro: "Logins saved on this PC, per agent (Use puts one into the sandbox; new launches start with the default), and the service sign-ins sandboxes may get.",
7283
+ intro: "Logins saved on this PC, per agent, and the service sign-ins sandboxes may get.",
7280
7284
  categories: [
7281
7285
  ...m.agents.map((a) => ({
7282
7286
  id: a.name,
7283
7287
  label: a.name,
7284
7288
  description: a.kept ? "Saved " + a.name + " logins." : "This agent's login is not kept between sandboxes: it cannot be pointed at a folder we control."
7285
7289
  })),
7286
- ...m.services.map((s) => ({
7290
+ ...shown(m).map((s) => ({
7287
7291
  id: serviceCategory(s.kind),
7288
7292
  label: s.label,
7289
- description: "Your " + s.label + " sign-in for sandboxes that use " + s.usedFor + "."
7293
+ description: "For " + s.usedFor + "."
7290
7294
  }))
7291
7295
  ],
7292
7296
  items: [
7293
7297
  ...m.agents.flatMap((a) => menuView(agentPage(a), { category: a.name, refresh: false }).items),
7294
- ...m.services.flatMap(
7295
- (s) => menuView(servicePage(s), { category: serviceCategory(s.kind), refresh: false }).items
7296
- )
7298
+ ...shown(m).flatMap((s) => menuView(servicePage(s), { category: serviceCategory(s.kind), refresh: false }).items)
7297
7299
  ],
7298
7300
  empty: "No agents.",
7299
7301
  actions: (category) => viewOf(m, category).actions,
@@ -7481,7 +7483,7 @@ var CommandForm = class {
7481
7483
  }
7482
7484
  item(f) {
7483
7485
  const v = this.values.get(this.id(f));
7484
- const shown2 = v === true ? Theme.ok("On") : v === false || v === void 0 ? Theme.muted(
7486
+ const shown3 = v === true ? Theme.ok("On") : v === false || v === void 0 ? Theme.muted(
7485
7487
  f.kind === "option" && f.spec.type === "boolean" || f.kind === "json" ? "Off" : f.kind === "option" && f.spec.default !== void 0 ? "default " + f.spec.default : f.kind === "arg" && f.spec.required ? "required" : "not set"
7486
7488
  ) : Array.isArray(v) && v.length ? v.join(" ") : Theme.muted("not set");
7487
7489
  const actions = this.actions();
@@ -7489,7 +7491,7 @@ var CommandForm = class {
7489
7491
  return {
7490
7492
  value: this.id(f),
7491
7493
  label: argLabel(f.spec),
7492
- hint: shown2,
7494
+ hint: shown3,
7493
7495
  description: plainDescription(f.spec.description, actions),
7494
7496
  section: "What",
7495
7497
  keywords: f.spec.name
@@ -7498,7 +7500,7 @@ var CommandForm = class {
7498
7500
  return {
7499
7501
  value: "json",
7500
7502
  label: "Machine-readable output",
7501
- hint: shown2,
7503
+ hint: shown3,
7502
7504
  description: "Print JSON instead of a table.",
7503
7505
  section: "Output",
7504
7506
  flip: true
@@ -7507,14 +7509,14 @@ var CommandForm = class {
7507
7509
  return {
7508
7510
  value: "extra",
7509
7511
  label: this.spec.passthrough === "agent" ? "Extra arguments for the agent" : "Arguments for the command",
7510
- hint: shown2,
7512
+ hint: shown3,
7511
7513
  description: this.spec.passthrough === "agent" ? "Passed on to the agent, e.g. --continue." : "The rest of the command line.",
7512
7514
  section: "Output"
7513
7515
  };
7514
7516
  return {
7515
7517
  value: this.id(f),
7516
7518
  label: optionLabel(f.spec),
7517
- hint: shown2,
7519
+ hint: shown3,
7518
7520
  description: plainDescription(f.spec.description, actions),
7519
7521
  section: f.spec.advanced ? "Advanced" : "Options",
7520
7522
  keywords: f.spec.flag,
@@ -8941,19 +8943,19 @@ function draftSource2(draft) {
8941
8943
  effective: (file, key, config2) => file.isProject ? written(file, key) : draft.has(file, key) ? draft.value(file, key) ?? file.defaultOf(key) : import_lodash5.default.get(config2, key)
8942
8944
  };
8943
8945
  }
8944
- function shown(row, value, max = 60) {
8946
+ function shown2(row, value, max = 60) {
8945
8947
  const v = valueText(value, row.field, max);
8946
8948
  return v.tone === "ok" ? Theme.ok(v.text) : v.tone === "muted" ? Theme.muted(v.text) : v.text;
8947
8949
  }
8948
8950
  function item(row, file, draft) {
8949
8951
  const unsaved = draft.has(file, row.key);
8950
8952
  const paint2 = file.isProject ? Theme.project : Theme.changed;
8951
- const value = file.isProject && !row.set ? Theme.muted("all projects: ") + shown(row, row.yours, 40) : shown(row, row.value);
8953
+ const value = file.isProject && !row.set ? Theme.muted("all projects: ") + shown2(row, row.yours, 40) : shown2(row, row.value);
8952
8954
  const details = [
8953
8955
  Theme.muted("Setting ") + row.id,
8954
- Theme.muted("All projects ") + shown(row, row.yours, 40) + Theme.muted(row.yoursSet ? " (your file)" : " (built-in default)"),
8955
- Theme.muted("This project ") + (row.inProject === void 0 ? Theme.muted("not set") : Theme.project(Text.strip(shown(row, row.inProject, 40)))),
8956
- ...!file.isProject ? [Theme.muted("Default ") + shown(row, row.default, 40)] : [],
8956
+ Theme.muted("All projects ") + shown2(row, row.yours, 40) + Theme.muted(row.yoursSet ? " (your file)" : " (built-in default)"),
8957
+ Theme.muted("This project ") + (row.inProject === void 0 ? Theme.muted("not set") : Theme.project(Text.strip(shown2(row, row.inProject, 40)))),
8958
+ ...!file.isProject ? [Theme.muted("Default ") + shown2(row, row.default, 40)] : [],
8957
8959
  ...unsaved ? [Theme.warn("Unsaved: Ctrl+S saves, z undoes this change.")] : [],
8958
8960
  ...file.isProject && row.locked ? [Theme.warn(Theme.glyph.lock + " A project can only make this stricter than your own setting.")] : []
8959
8961
  ];
@@ -9620,7 +9622,10 @@ var Menu = class {
9620
9622
  new MaintenancePage(app, ctx)
9621
9623
  ],
9622
9624
  draft,
9623
- (saved) => this.applyAgentCommands(saved)
9625
+ (saved) => {
9626
+ reloadSettings(this.ctx);
9627
+ return this.applyAgentCommands(saved);
9628
+ }
9624
9629
  );
9625
9630
  }
9626
9631
  /** Runs the menu until you leave it, or until a command that takes over the terminal (attach) has run. */
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
2
  import {
3
3
  attach
4
- } from "./chunk-RSIX7C6D.js";
4
+ } from "./chunk-RU7XRN62.js";
5
5
  export {
6
6
  attach
7
7
  };