windows-development-sandbox 1.5.0 → 1.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 (709) hide show
  1. package/README.md +1 -0
  2. package/config.example.json +27 -1
  3. package/dist/app/context.d.ts +8 -0
  4. package/dist/app/context.js +12 -0
  5. package/dist/app/features/defs.d.ts +322 -0
  6. package/dist/app/features/defs.js +28 -0
  7. package/dist/app/features/sandbox/index.d.ts +2 -0
  8. package/dist/app/features/sandbox/index.js +3 -0
  9. package/dist/app/features/sandbox/sandbox.def.d.ts +193 -0
  10. package/dist/app/features/sandbox/sandbox.def.js +245 -0
  11. package/dist/app/features/sandbox/sandbox.run.d.ts +72 -0
  12. package/dist/app/features/sandbox/sandbox.run.js +98 -0
  13. package/dist/app/features/sessions/index.d.ts +2 -0
  14. package/dist/app/features/sessions/index.js +3 -0
  15. package/dist/app/features/sessions/sessions.def.d.ts +141 -0
  16. package/dist/app/features/sessions/sessions.def.js +176 -0
  17. package/dist/app/features/sessions/sessions.run.d.ts +39 -0
  18. package/dist/app/features/sessions/sessions.run.js +58 -0
  19. package/dist/{cli/menu/settings/categories.d.ts → app/features/settings/categories.def.d.ts} +4 -0
  20. package/dist/{cli/menu/settings/categories.js → app/features/settings/categories.def.js} +40 -46
  21. package/dist/app/features/settings/index.d.ts +5 -0
  22. package/dist/app/features/settings/index.js +6 -0
  23. package/dist/{cli/menu/settings/config-file.d.ts → app/features/settings/settings-file.d.ts} +1 -1
  24. package/dist/{cli/menu/settings/config-file.js → app/features/settings/settings-file.js} +1 -1
  25. package/dist/app/features/settings/settings-rows.d.ts +35 -0
  26. package/dist/app/features/settings/settings-rows.js +94 -0
  27. package/dist/app/features/settings/settings.def.d.ts +157 -0
  28. package/dist/app/features/settings/settings.def.js +179 -0
  29. package/dist/app/features/settings/settings.run.d.ts +67 -0
  30. package/dist/app/features/settings/settings.run.js +84 -0
  31. package/dist/app/kernel/define.d.ts +143 -0
  32. package/dist/app/kernel/define.js +42 -0
  33. package/dist/app/kernel/errors.d.ts +34 -0
  34. package/dist/app/kernel/errors.js +45 -0
  35. package/dist/app/kernel/fields.d.ts +70 -0
  36. package/dist/app/kernel/fields.js +243 -0
  37. package/dist/app/kernel/index.d.ts +8 -0
  38. package/dist/app/kernel/index.js +10 -0
  39. package/dist/app/kernel/io.d.ts +193 -0
  40. package/dist/app/kernel/io.js +126 -0
  41. package/dist/app/kernel/rpc.d.ts +156 -0
  42. package/dist/app/kernel/rpc.js +47 -0
  43. package/dist/{cli/menu/settings → app/kernel}/schema-node.d.ts +9 -0
  44. package/dist/{cli/menu/settings → app/kernel}/schema-node.js +26 -0
  45. package/dist/app/kernel/text.d.ts +6 -0
  46. package/dist/app/kernel/text.js +57 -0
  47. package/dist/app/kernel/view.d.ts +146 -0
  48. package/dist/app/kernel/view.js +28 -0
  49. package/dist/app/registry.d.ts +10 -0
  50. package/dist/app/registry.js +50 -0
  51. package/dist/cli/args.d.ts +18 -2
  52. package/dist/cli/args.js +101 -24
  53. package/dist/cli/commands/accounts.js +45 -17
  54. package/dist/cli/commands/context.d.ts +2 -0
  55. package/dist/cli/commands/context.js +9 -2
  56. package/dist/cli/commands/data/clean.js +32 -9
  57. package/dist/cli/commands/engine.d.ts +2 -0
  58. package/dist/cli/commands/engine.js +60 -0
  59. package/dist/cli/commands/index.d.ts +2 -1
  60. package/dist/cli/commands/index.js +2 -1
  61. package/dist/cli/commands/launch/add-root.d.ts +3 -2
  62. package/dist/cli/commands/launch/add-root.js +11 -10
  63. package/dist/cli/commands/launch/launch.js +102 -9
  64. package/dist/cli/commands/launch/prepare.js +6 -4
  65. package/dist/cli/commands/launch/running.js +2 -1
  66. package/dist/cli/commands/launch/summary.d.ts +2 -0
  67. package/dist/cli/commands/maintenance/audit.js +1 -1
  68. package/dist/cli/commands/maintenance/clean.d.ts +1 -1
  69. package/dist/cli/commands/maintenance/clean.js +17 -3
  70. package/dist/cli/commands/maintenance/config-share.d.ts +12 -0
  71. package/dist/cli/commands/maintenance/config-share.js +80 -0
  72. package/dist/cli/commands/maintenance/config.d.ts +1 -1
  73. package/dist/cli/commands/maintenance/config.js +38 -10
  74. package/dist/cli/commands/maintenance/doctor.d.ts +1 -1
  75. package/dist/cli/commands/maintenance/doctor.js +2 -4
  76. package/dist/cli/commands/maintenance/logs.js +14 -0
  77. package/dist/cli/commands/maintenance/migrate.d.ts +2 -1
  78. package/dist/cli/commands/maintenance/migrate.js +19 -4
  79. package/dist/cli/commands/maintenance/sync.js +2 -0
  80. package/dist/cli/commands/maintenance/update.d.ts +2 -0
  81. package/dist/cli/commands/maintenance/update.js +27 -4
  82. package/dist/cli/commands/projects/here.js +12 -7
  83. package/dist/cli/commands/projects/projects.js +26 -17
  84. package/dist/cli/commands/registry.js +10 -7
  85. package/dist/cli/commands/repair/checks/agents.d.ts +2 -0
  86. package/dist/cli/commands/repair/checks/agents.js +70 -0
  87. package/dist/cli/commands/repair/checks/common.d.ts +8 -0
  88. package/dist/cli/commands/repair/checks/common.js +22 -0
  89. package/dist/cli/commands/repair/checks/contained.d.ts +2 -0
  90. package/dist/cli/commands/repair/checks/contained.js +139 -0
  91. package/dist/cli/commands/repair/checks/data.d.ts +2 -0
  92. package/dist/cli/commands/repair/checks/data.js +241 -0
  93. package/dist/cli/commands/repair/checks/hcs.d.ts +7 -0
  94. package/dist/cli/commands/repair/checks/hcs.js +28 -0
  95. package/dist/cli/commands/repair/checks/index.d.ts +2 -0
  96. package/dist/cli/commands/repair/checks/index.js +24 -0
  97. package/dist/cli/commands/repair/checks/install.d.ts +5 -0
  98. package/dist/cli/commands/repair/checks/install.js +318 -0
  99. package/dist/cli/commands/repair/checks/machine.d.ts +2 -0
  100. package/dist/cli/commands/repair/checks/machine.js +232 -0
  101. package/dist/cli/commands/repair/checks/network.d.ts +6 -0
  102. package/dist/cli/commands/repair/checks/network.js +60 -0
  103. package/dist/cli/commands/repair/checks/pc.d.ts +4 -0
  104. package/dist/cli/commands/repair/checks/pc.js +86 -0
  105. package/dist/cli/commands/repair/checks/sandbox.d.ts +2 -0
  106. package/dist/cli/commands/repair/checks/sandbox.js +282 -0
  107. package/dist/cli/commands/repair/checks/settings.d.ts +2 -0
  108. package/dist/cli/commands/repair/checks/settings.js +169 -0
  109. package/dist/cli/commands/repair/checks/vpn.d.ts +2 -0
  110. package/dist/cli/commands/repair/checks/vpn.js +78 -0
  111. package/dist/cli/commands/repair/engine.d.ts +32 -0
  112. package/dist/cli/commands/repair/engine.js +127 -0
  113. package/dist/cli/commands/repair/env.d.ts +7 -0
  114. package/dist/cli/commands/repair/env.js +50 -0
  115. package/dist/cli/commands/repair/index.d.ts +1 -9
  116. package/dist/cli/commands/repair/index.js +2 -54
  117. package/dist/cli/commands/repair/log.d.ts +17 -0
  118. package/dist/cli/commands/repair/log.js +82 -0
  119. package/dist/cli/commands/repair/printer.d.ts +32 -0
  120. package/dist/cli/commands/repair/printer.js +132 -0
  121. package/dist/cli/commands/repair/run.d.ts +33 -0
  122. package/dist/cli/commands/repair/run.js +133 -0
  123. package/dist/cli/commands/repair/types.d.ts +97 -9
  124. package/dist/cli/commands/repair/types.js +11 -7
  125. package/dist/cli/commands/resume.js +2 -2
  126. package/dist/cli/commands/sessions/index.d.ts +0 -4
  127. package/dist/cli/commands/sessions/index.js +3 -7
  128. package/dist/cli/commands/setup/index.d.ts +5 -0
  129. package/dist/cli/commands/setup/index.js +25 -1
  130. package/dist/cli/commands/shared-use.d.ts +5 -2
  131. package/dist/cli/commands/shared-use.js +11 -8
  132. package/dist/cli/commands/storage/contained.d.ts +3 -0
  133. package/dist/cli/commands/storage/contained.js +179 -0
  134. package/dist/cli/commands/storage/index.d.ts +2 -0
  135. package/dist/cli/commands/storage/index.js +2 -0
  136. package/dist/cli/commands/storage/offer.d.ts +3 -0
  137. package/dist/cli/commands/storage/offer.js +91 -0
  138. package/dist/cli/commands/storage/storage.d.ts +8 -0
  139. package/dist/cli/commands/storage/storage.js +179 -0
  140. package/dist/cli/commands/user-config.js +2 -2
  141. package/dist/cli/commands/vpn.d.ts +4 -0
  142. package/dist/cli/commands/vpn.js +91 -0
  143. package/dist/cli/commands/web.d.ts +4 -0
  144. package/dist/cli/commands/web.js +97 -0
  145. package/dist/cli/history.js +1 -1
  146. package/dist/cli/index.js +48 -4
  147. package/dist/cli/manifest.d.ts +339 -97
  148. package/dist/cli/manifest.js +222 -67
  149. package/dist/cli/menu/add-agent.d.ts +47 -0
  150. package/dist/cli/menu/add-agent.js +168 -0
  151. package/dist/cli/menu/apps.d.ts +38 -3
  152. package/dist/cli/menu/apps.js +80 -5
  153. package/dist/cli/menu/command-fields.d.ts +18 -0
  154. package/dist/cli/menu/command-fields.js +61 -0
  155. package/dist/cli/menu/command-form.d.ts +22 -0
  156. package/dist/cli/menu/command-form.js +169 -46
  157. package/dist/cli/menu/data-folder.d.ts +18 -0
  158. package/dist/cli/menu/data-folder.js +99 -0
  159. package/dist/cli/menu/io-menu.d.ts +29 -0
  160. package/dist/cli/menu/io-menu.js +126 -0
  161. package/dist/cli/menu/live.d.ts +27 -0
  162. package/dist/cli/menu/live.js +69 -0
  163. package/dist/cli/menu/memory.d.ts +19 -0
  164. package/dist/cli/menu/memory.js +53 -0
  165. package/dist/cli/menu/menu.d.ts +11 -2
  166. package/dist/cli/menu/menu.js +36 -15
  167. package/dist/cli/menu/pages/accounts-page.js +55 -24
  168. package/dist/cli/menu/pages/agents-page.d.ts +68 -0
  169. package/dist/cli/menu/pages/agents-page.js +345 -0
  170. package/dist/cli/menu/pages/apps-page.d.ts +3 -1
  171. package/dist/cli/menu/pages/apps-page.js +20 -4
  172. package/dist/cli/menu/pages/list-page.d.ts +43 -3
  173. package/dist/cli/menu/pages/list-page.js +146 -12
  174. package/dist/cli/menu/pages/maintenance-page.d.ts +9 -5
  175. package/dist/cli/menu/pages/maintenance-page.js +172 -85
  176. package/dist/cli/menu/pages/sandbox-page.d.ts +7 -6
  177. package/dist/cli/menu/pages/sandbox-page.js +117 -120
  178. package/dist/cli/menu/pages/scopes.d.ts +1 -1
  179. package/dist/cli/menu/pages/sessions-page.d.ts +6 -8
  180. package/dist/cli/menu/pages/sessions-page.js +22 -75
  181. package/dist/cli/menu/pages/settings-page.d.ts +10 -14
  182. package/dist/cli/menu/pages/settings-page.js +95 -102
  183. package/dist/cli/menu/render-view.d.ts +28 -0
  184. package/dist/cli/menu/render-view.js +112 -0
  185. package/dist/cli/menu/settings/ask-path.d.ts +14 -0
  186. package/dist/cli/menu/settings/ask-path.js +14 -0
  187. package/dist/cli/menu/settings/collections/collection-editor.d.ts +8 -2
  188. package/dist/cli/menu/settings/collections/collection-editor.js +12 -8
  189. package/dist/cli/menu/settings/collections/map-editor.js +5 -1
  190. package/dist/cli/menu/settings/collections/object-list-editor.js +2 -2
  191. package/dist/cli/menu/settings/collections/object-map-editor.js +2 -2
  192. package/dist/cli/menu/settings/collections/string-list-editor.d.ts +10 -1
  193. package/dist/cli/menu/settings/collections/string-list-editor.js +23 -0
  194. package/dist/cli/menu/settings/draft.d.ts +1 -1
  195. package/dist/cli/menu/settings/format.d.ts +1 -3
  196. package/dist/cli/menu/settings/format.js +6 -36
  197. package/dist/cli/menu/settings/index.d.ts +1 -3
  198. package/dist/cli/menu/settings/index.js +3 -3
  199. package/dist/cli/menu/settings/object-editor.d.ts +6 -2
  200. package/dist/cli/menu/settings/object-editor.js +15 -4
  201. package/dist/cli/menu/settings/share.d.ts +36 -0
  202. package/dist/cli/menu/settings/share.js +131 -0
  203. package/dist/cli/menu/settings/value-editor.d.ts +10 -1
  204. package/dist/cli/menu/settings/value-editor.js +99 -63
  205. package/dist/cli/menu/several.js +7 -5
  206. package/dist/cli/menu/share-settings.d.ts +21 -0
  207. package/dist/cli/menu/share-settings.js +112 -0
  208. package/dist/cli/menu/shell.d.ts +53 -10
  209. package/dist/cli/menu/shell.js +115 -10
  210. package/dist/cli/menu/views.d.ts +7 -0
  211. package/dist/cli/menu/views.js +11 -0
  212. package/dist/cli/menu/vpn-login.d.ts +16 -0
  213. package/dist/cli/menu/vpn-login.js +74 -0
  214. package/dist/cli/operations/handler.d.ts +6 -0
  215. package/dist/cli/operations/handler.js +61 -0
  216. package/dist/cli/operations/index.d.ts +4 -0
  217. package/dist/cli/operations/index.js +5 -0
  218. package/dist/cli/operations/input.d.ts +6 -0
  219. package/dist/cli/operations/input.js +37 -0
  220. package/dist/cli/operations/io-cli.d.ts +7 -0
  221. package/dist/cli/operations/io-cli.js +62 -0
  222. package/dist/cli/operations/spec.d.ts +18 -0
  223. package/dist/cli/operations/spec.js +108 -0
  224. package/dist/cli/output/colors.d.ts +2 -2
  225. package/dist/cli/output/colors.js +2 -11
  226. package/dist/cli/output/index.d.ts +1 -0
  227. package/dist/cli/output/index.js +1 -0
  228. package/dist/cli/output/print.d.ts +5 -1
  229. package/dist/cli/output/print.js +15 -4
  230. package/dist/cli/output/progress.d.ts +15 -0
  231. package/dist/cli/output/progress.js +44 -0
  232. package/dist/cli/output/render-view.d.ts +4 -0
  233. package/dist/cli/output/render-view.js +63 -0
  234. package/dist/cli/services/accounts-service.d.ts +2 -0
  235. package/dist/cli/services/accounts-service.js +2 -2
  236. package/dist/cli/services/agent-commands-service.d.ts +2 -0
  237. package/dist/cli/services/agent-commands-service.js +11 -2
  238. package/dist/cli/services/health-service.d.ts +0 -6
  239. package/dist/cli/services/health-service.js +5 -42
  240. package/dist/cli/services/index.d.ts +3 -1
  241. package/dist/cli/services/index.js +3 -1
  242. package/dist/cli/services/logs-service.js +4 -3
  243. package/dist/cli/services/migrate-service.js +1 -1
  244. package/dist/cli/services/update-service.d.ts +2 -0
  245. package/dist/cli/services/update-service.js +13 -6
  246. package/dist/cli/services/vpn-service.d.ts +28 -0
  247. package/dist/cli/services/vpn-service.js +46 -0
  248. package/dist/cli/services/web-service.d.ts +22 -0
  249. package/dist/cli/services/web-service.js +111 -0
  250. package/dist/cli/tui/app.d.ts +12 -4
  251. package/dist/cli/tui/app.js +38 -9
  252. package/dist/cli/tui/dialogs/path-listing.d.ts +43 -0
  253. package/dist/cli/tui/dialogs/path-listing.js +127 -0
  254. package/dist/cli/tui/dialogs/path-picker.d.ts +67 -0
  255. package/dist/cli/tui/dialogs/path-picker.js +423 -0
  256. package/dist/cli/tui/dialogs/text-screen.d.ts +6 -0
  257. package/dist/cli/tui/dialogs/text-screen.js +10 -3
  258. package/dist/cli/tui/frame.d.ts +7 -10
  259. package/dist/cli/tui/frame.js +19 -10
  260. package/dist/cli/tui/index.d.ts +4 -3
  261. package/dist/cli/tui/index.js +2 -1
  262. package/dist/cli/tui/list/list-screen.d.ts +28 -2
  263. package/dist/cli/tui/list/list-screen.js +130 -66
  264. package/dist/cli/tui/list/list-types.d.ts +10 -4
  265. package/dist/cli/tui/nav.d.ts +29 -0
  266. package/dist/cli/tui/nav.js +67 -0
  267. package/dist/cli/tui/terminal.d.ts +7 -0
  268. package/dist/cli/tui/terminal.js +30 -10
  269. package/dist/cli/validate.d.ts +1 -1
  270. package/dist/cli/validate.js +3 -3
  271. package/dist/cli/version.d.ts +2 -0
  272. package/dist/cli/version.js +11 -0
  273. package/dist/core/config/defaults.js +13 -1
  274. package/dist/core/config/loader.js +12 -2
  275. package/dist/core/local-config/overrides.js +1 -0
  276. package/dist/core/prompt.d.ts +19 -0
  277. package/dist/core/prompt.js +43 -3
  278. package/dist/core/schema/common.d.ts +6 -0
  279. package/dist/core/schema/common.js +8 -0
  280. package/dist/core/schema/config.d.ts +36 -0
  281. package/dist/core/schema/config.js +26 -2
  282. package/dist/core/schema/harness.d.ts +2 -0
  283. package/dist/core/schema/harness.js +13 -2
  284. package/dist/core/schema/index.d.ts +3 -1
  285. package/dist/core/schema/index.js +3 -1
  286. package/dist/core/schema/profile.d.ts +1 -0
  287. package/dist/core/schema/profile.js +3 -0
  288. package/dist/core/schema/redact.d.ts +13 -0
  289. package/dist/core/schema/redact.js +75 -0
  290. package/dist/core/schema/sandbox.d.ts +6 -0
  291. package/dist/core/schema/sandbox.js +21 -3
  292. package/dist/core/schema/vpn.d.ts +18 -0
  293. package/dist/core/schema/vpn.js +22 -0
  294. package/dist/core/schema/web.d.ts +6 -0
  295. package/dist/core/schema/web.js +14 -0
  296. package/dist/core/types.d.ts +44 -0
  297. package/dist/core/util/fs.d.ts +2 -0
  298. package/dist/core/util/fs.js +9 -0
  299. package/dist/core/util/index.d.ts +1 -1
  300. package/dist/core/util/index.js +1 -1
  301. package/dist/guest/agents/agent-files.d.ts +54 -0
  302. package/dist/guest/agents/agent-files.js +67 -0
  303. package/dist/guest/agents/agent-installer.js +2 -9
  304. package/dist/guest/agents/local-state.d.ts +14 -0
  305. package/dist/guest/agents/local-state.js +218 -0
  306. package/dist/guest/agents/sbx-agent.d.ts +2 -0
  307. package/dist/guest/agents/sbx-agent.js +35 -0
  308. package/dist/guest/boot/boot.d.ts +4 -0
  309. package/dist/guest/boot/boot.js +51 -11
  310. package/dist/guest/daemon/daemon.js +8 -1
  311. package/dist/guest/daemon/exec.js +2 -1
  312. package/dist/guest/daemon/idle-shutdown.js +2 -0
  313. package/dist/guest/daemon/sessions.d.ts +5 -0
  314. package/dist/guest/daemon/sessions.js +20 -3
  315. package/dist/guest/entries/agent.d.ts +1 -0
  316. package/dist/guest/entries/agent.js +10 -0
  317. package/dist/guest/entries/daemon.js +5 -0
  318. package/dist/guest/governor/decide.d.ts +61 -0
  319. package/dist/guest/governor/decide.js +182 -0
  320. package/dist/guest/governor/governor.d.ts +42 -0
  321. package/dist/guest/governor/governor.js +214 -0
  322. package/dist/guest/governor/index.d.ts +2 -0
  323. package/dist/guest/governor/index.js +2 -0
  324. package/dist/guest/runtime/csc.d.ts +2 -0
  325. package/dist/guest/runtime/csc.js +2 -0
  326. package/dist/guest/runtime/secrets.d.ts +12 -0
  327. package/dist/guest/runtime/secrets.js +63 -0
  328. package/dist/guest/sessions/viewer.js +3 -1
  329. package/dist/guest/setup/claude-profile.d.ts +2 -1
  330. package/dist/guest/setup/claude-profile.js +12 -1
  331. package/dist/guest/setup/environment.d.ts +6 -0
  332. package/dist/guest/setup/environment.js +56 -6
  333. package/dist/guest/setup/path-plan.d.ts +32 -0
  334. package/dist/guest/setup/path-plan.js +67 -0
  335. package/dist/guest/setup/shell-path.d.ts +1 -0
  336. package/dist/guest/setup/shell-path.js +22 -0
  337. package/dist/guest/toolchains/languages/python.js +1 -1
  338. package/dist/guest/toolchains/native/rust-extras.js +4 -2
  339. package/dist/guest/toolchains/runtimes.js +2 -2
  340. package/dist/guest/vpn/index.d.ts +1 -0
  341. package/dist/guest/vpn/index.js +1 -0
  342. package/dist/guest/vpn/openvpn.d.ts +9 -0
  343. package/dist/guest/vpn/openvpn.js +47 -0
  344. package/dist/guest/vpn/tunnel.d.ts +17 -0
  345. package/dist/guest/vpn/tunnel.js +78 -0
  346. package/dist/guest/vpn/vpn.d.ts +6 -0
  347. package/dist/guest/vpn/vpn.js +174 -0
  348. package/dist/guest/vpn/wireguard.d.ts +32 -0
  349. package/dist/guest/vpn/wireguard.js +132 -0
  350. package/dist/host/agent-commands/commands.d.ts +4 -0
  351. package/dist/host/agent-commands/commands.js +31 -7
  352. package/dist/host/audit/log.d.ts +1 -1
  353. package/dist/host/channel/attach.d.ts +6 -2
  354. package/dist/host/channel/attach.js +6 -3
  355. package/dist/host/channel/channel.d.ts +9 -0
  356. package/dist/host/channel/channel.js +30 -2
  357. package/dist/host/engines/engine.d.ts +12 -0
  358. package/dist/host/engines/engine.js +1 -0
  359. package/dist/host/engines/hcs/check.d.ts +25 -0
  360. package/dist/host/engines/hcs/check.js +95 -0
  361. package/dist/host/engines/hcs/documents.d.ts +44 -0
  362. package/dist/host/engines/hcs/documents.js +155 -0
  363. package/dist/host/engines/hcs/engine.d.ts +39 -0
  364. package/dist/host/engines/hcs/engine.js +171 -0
  365. package/dist/host/engines/hcs/helper.d.ts +43 -0
  366. package/dist/host/engines/hcs/helper.js +173 -0
  367. package/dist/host/engines/hcs/images.d.ts +37 -0
  368. package/dist/host/engines/hcs/images.js +152 -0
  369. package/dist/host/engines/index.d.ts +7 -0
  370. package/dist/host/engines/index.js +5 -0
  371. package/dist/host/engines/registry.d.ts +16 -0
  372. package/dist/host/engines/registry.js +30 -0
  373. package/dist/host/engines/types.d.ts +58 -0
  374. package/dist/host/engines/types.js +1 -0
  375. package/dist/host/engines/windows-sandbox/engine.d.ts +16 -0
  376. package/dist/host/engines/windows-sandbox/engine.js +63 -0
  377. package/dist/host/engines/windows-sandbox/wsb-text.d.ts +2 -0
  378. package/dist/host/engines/windows-sandbox/wsb-text.js +29 -0
  379. package/dist/host/health/acl-read.d.ts +17 -0
  380. package/dist/host/health/acl-read.js +45 -0
  381. package/dist/host/health/config-backup.d.ts +11 -0
  382. package/dist/host/health/config-backup.js +73 -0
  383. package/dist/host/health/index.d.ts +6 -0
  384. package/dist/host/health/index.js +7 -0
  385. package/dist/host/health/install-state.d.ts +33 -0
  386. package/dist/host/health/install-state.js +110 -0
  387. package/dist/host/health/path-copies.d.ts +32 -0
  388. package/dist/host/health/path-copies.js +82 -0
  389. package/dist/host/health/stale.d.ts +45 -0
  390. package/dist/host/health/stale.js +120 -0
  391. package/dist/host/health/system.d.ts +37 -0
  392. package/dist/host/health/system.js +87 -0
  393. package/dist/host/install/copies.d.ts +13 -0
  394. package/dist/host/install/copies.js +63 -0
  395. package/dist/host/install/index.d.ts +1 -0
  396. package/dist/host/install/index.js +1 -0
  397. package/dist/host/launch/generate.d.ts +5 -1
  398. package/dist/host/launch/generate.js +73 -7
  399. package/dist/host/launch/index.d.ts +3 -1
  400. package/dist/host/launch/index.js +3 -1
  401. package/dist/host/launch/launch-plan.d.ts +13 -0
  402. package/dist/host/launch/launch-plan.js +26 -0
  403. package/dist/host/launch/mappings.js +2 -1
  404. package/dist/host/launch/risk-notes.d.ts +10 -0
  405. package/dist/host/launch/risk-notes.js +18 -0
  406. package/dist/host/launch/session-file.d.ts +2 -0
  407. package/dist/host/launch/session-file.js +11 -2
  408. package/dist/host/launch/stage.js +1 -1
  409. package/dist/host/launch/wsb-file.d.ts +28 -4
  410. package/dist/host/launch/wsb-file.js +61 -42
  411. package/dist/host/life/crash-report.d.ts +27 -1
  412. package/dist/host/life/crash-report.js +173 -7
  413. package/dist/host/life/host-memory.d.ts +40 -0
  414. package/dist/host/life/host-memory.js +137 -0
  415. package/dist/host/life/index.d.ts +2 -0
  416. package/dist/host/life/index.js +2 -0
  417. package/dist/host/life/stop-events.d.ts +2 -0
  418. package/dist/host/life/stop-events.js +20 -3
  419. package/dist/host/life/stop-warning.js +1 -1
  420. package/dist/host/life/watchdog.d.ts +54 -0
  421. package/dist/host/life/watchdog.js +108 -0
  422. package/dist/host/migrate/backup.js +3 -0
  423. package/dist/host/migrate/migrations/config-file.d.ts +2 -0
  424. package/dist/host/migrate/migrations/config-file.js +7 -0
  425. package/dist/host/migrate/migrations/follow-machine-storage.js +9 -1
  426. package/dist/host/migrate/migrations/pin-storage-root.d.ts +4 -0
  427. package/dist/host/migrate/migrations/pin-storage-root.js +46 -0
  428. package/dist/host/migrate/migrations/unpin-config-defaults.js +4 -1
  429. package/dist/host/migrate/registry.js +2 -1
  430. package/dist/host/native.d.ts +3 -2
  431. package/dist/host/native.js +22 -3
  432. package/dist/host/profile/accounts.d.ts +25 -1
  433. package/dist/host/profile/accounts.js +96 -13
  434. package/dist/host/profile/agent-accounts.d.ts +5 -1
  435. package/dist/host/profile/agent-accounts.js +35 -5
  436. package/dist/host/profile/claude-login.js +3 -2
  437. package/dist/host/profile/index.d.ts +2 -1
  438. package/dist/host/profile/index.js +1 -0
  439. package/dist/host/profile/plugin-share.d.ts +26 -0
  440. package/dist/host/profile/plugin-share.js +146 -0
  441. package/dist/host/projects/join.d.ts +7 -1
  442. package/dist/host/projects/join.js +21 -4
  443. package/dist/host/projects/registry.d.ts +16 -10
  444. package/dist/host/projects/registry.js +74 -6
  445. package/dist/host/sandbox/contained-deps.d.ts +2 -0
  446. package/dist/host/sandbox/contained-deps.js +17 -0
  447. package/dist/host/sandbox/index.d.ts +2 -0
  448. package/dist/host/sandbox/index.js +2 -0
  449. package/dist/host/sandbox/platform.d.ts +4 -0
  450. package/dist/host/sandbox/platform.js +23 -4
  451. package/dist/host/sandbox/tasklist.d.ts +13 -0
  452. package/dist/host/sandbox/tasklist.js +47 -0
  453. package/dist/host/secrets/index.d.ts +2 -0
  454. package/dist/host/secrets/index.js +2 -0
  455. package/dist/host/secrets/launch-secrets.d.ts +17 -0
  456. package/dist/host/secrets/launch-secrets.js +94 -0
  457. package/dist/host/secrets/secret-store.d.ts +25 -0
  458. package/dist/host/secrets/secret-store.js +89 -0
  459. package/dist/host/sharing/acl.d.ts +16 -2
  460. package/dist/host/sharing/acl.js +35 -10
  461. package/dist/host/sharing/current.js +8 -3
  462. package/dist/host/sharing/doctor.d.ts +2 -0
  463. package/dist/host/sharing/doctor.js +44 -0
  464. package/dist/host/sharing/group-access.d.ts +6 -0
  465. package/dist/host/sharing/group-access.js +24 -0
  466. package/dist/host/sharing/index.d.ts +2 -1
  467. package/dist/host/sharing/index.js +2 -1
  468. package/dist/host/sharing/lifecycle.d.ts +8 -2
  469. package/dist/host/sharing/lifecycle.js +16 -7
  470. package/dist/host/storage/cleanup.d.ts +2 -0
  471. package/dist/host/storage/cleanup.js +2 -1
  472. package/dist/host/storage/contained/check.d.ts +9 -0
  473. package/dist/host/storage/contained/check.js +37 -0
  474. package/dist/host/storage/contained/contained-storage.d.ts +66 -0
  475. package/dist/host/storage/contained/contained-storage.js +168 -0
  476. package/dist/host/storage/contained/disk-port.d.ts +43 -0
  477. package/dist/host/storage/contained/disk-port.js +122 -0
  478. package/dist/host/storage/contained/index.d.ts +9 -0
  479. package/dist/host/storage/contained/index.js +8 -0
  480. package/dist/host/storage/contained/layout.d.ts +28 -0
  481. package/dist/host/storage/contained/layout.js +45 -0
  482. package/dist/host/storage/contained/resolve.d.ts +4 -0
  483. package/dist/host/storage/contained/resolve.js +30 -0
  484. package/dist/host/storage/contained/setting.d.ts +1 -0
  485. package/dist/host/storage/contained/setting.js +5 -0
  486. package/dist/host/storage/contained/state.d.ts +89 -0
  487. package/dist/host/storage/contained/state.js +166 -0
  488. package/dist/host/storage/contained/transfer.d.ts +24 -0
  489. package/dist/host/storage/contained/transfer.js +121 -0
  490. package/dist/host/storage/history.d.ts +21 -0
  491. package/dist/host/storage/history.js +49 -0
  492. package/dist/host/storage/index.d.ts +6 -0
  493. package/dist/host/storage/index.js +6 -0
  494. package/dist/host/storage/move.d.ts +95 -0
  495. package/dist/host/storage/move.js +384 -0
  496. package/dist/host/storage/offer.d.ts +11 -0
  497. package/dist/host/storage/offer.js +36 -0
  498. package/dist/host/storage/providers/contained.d.ts +15 -0
  499. package/dist/host/storage/providers/contained.js +39 -0
  500. package/dist/host/storage/providers/folder.d.ts +12 -0
  501. package/dist/host/storage/providers/folder.js +20 -0
  502. package/dist/host/storage/providers/index.d.ts +4 -0
  503. package/dist/host/storage/providers/index.js +3 -0
  504. package/dist/host/storage/providers/registry.d.ts +9 -0
  505. package/dist/host/storage/providers/registry.js +14 -0
  506. package/dist/host/storage/providers/types.d.ts +33 -0
  507. package/dist/host/storage/providers/types.js +1 -0
  508. package/dist/host/storage/root.d.ts +18 -0
  509. package/dist/host/storage/root.js +77 -0
  510. package/dist/host/tools/conpty.js +3 -2
  511. package/dist/host/tools/windows-terminal.d.ts +2 -0
  512. package/dist/host/tools/windows-terminal.js +31 -12
  513. package/dist/host/update/index.d.ts +1 -1
  514. package/dist/host/update/index.js +1 -1
  515. package/dist/host/update/notice.d.ts +2 -0
  516. package/dist/host/update/notice.js +13 -1
  517. package/dist/host/update/update-state.d.ts +6 -0
  518. package/dist/host/update/update-state.js +2 -0
  519. package/dist/host/update/updater.d.ts +19 -0
  520. package/dist/host/update/updater.js +88 -12
  521. package/dist/host/vpn/index.d.ts +4 -0
  522. package/dist/host/vpn/index.js +4 -0
  523. package/dist/host/vpn/login.d.ts +24 -0
  524. package/dist/host/vpn/login.js +79 -0
  525. package/dist/host/vpn/nordvpn.d.ts +21 -0
  526. package/dist/host/vpn/nordvpn.js +77 -0
  527. package/dist/host/vpn/prepare.d.ts +19 -0
  528. package/dist/host/vpn/prepare.js +138 -0
  529. package/dist/host/vpn/status.d.ts +12 -0
  530. package/dist/host/vpn/status.js +53 -0
  531. package/dist/host/web/auth.d.ts +38 -0
  532. package/dist/host/web/auth.js +96 -0
  533. package/dist/host/web/backend.d.ts +14 -0
  534. package/dist/host/web/backend.js +1 -0
  535. package/dist/host/web/bridge.d.ts +27 -0
  536. package/dist/host/web/bridge.js +144 -0
  537. package/dist/host/web/browser.d.ts +3 -0
  538. package/dist/host/web/browser.js +23 -0
  539. package/dist/host/web/control.d.ts +17 -0
  540. package/dist/host/web/control.js +67 -0
  541. package/dist/host/web/index.d.ts +10 -0
  542. package/dist/host/web/index.js +9 -0
  543. package/dist/host/web/rpc.d.ts +24 -0
  544. package/dist/host/web/rpc.js +149 -0
  545. package/dist/host/web/runner.d.ts +16 -0
  546. package/dist/host/web/runner.js +44 -0
  547. package/dist/host/web/server.d.ts +47 -0
  548. package/dist/host/web/server.js +238 -0
  549. package/dist/host/web/state.d.ts +20 -0
  550. package/dist/host/web/state.js +41 -0
  551. package/dist/host/web/static-files.d.ts +13 -0
  552. package/dist/host/web/static-files.js +57 -0
  553. package/dist/runtime/agent.js +27675 -0
  554. package/dist/runtime/daemon.js +1950 -1122
  555. package/dist/runtime/db.js +302 -111
  556. package/dist/runtime/main.js +1560 -275
  557. package/dist/runtime/netproxy.js +168 -8
  558. package/dist/runtime/view.js +186 -13
  559. package/dist/selftest/accounts.test.js +40 -0
  560. package/dist/selftest/agent-paths.test.d.ts +2 -0
  561. package/dist/selftest/agent-paths.test.js +125 -0
  562. package/dist/selftest/app.test.d.ts +2 -0
  563. package/dist/selftest/app.test.js +324 -0
  564. package/dist/selftest/channel.test.js +18 -0
  565. package/dist/selftest/cli.test.js +35 -4
  566. package/dist/selftest/config.test.js +59 -0
  567. package/dist/selftest/contained.test.d.ts +2 -0
  568. package/dist/selftest/contained.test.js +544 -0
  569. package/dist/selftest/credentials.test.d.ts +2 -0
  570. package/dist/selftest/credentials.test.js +198 -0
  571. package/dist/selftest/engine.test.d.ts +2 -0
  572. package/dist/selftest/engine.test.js +127 -0
  573. package/dist/selftest/generate.test.js +1 -1
  574. package/dist/selftest/hcs.test.d.ts +2 -0
  575. package/dist/selftest/hcs.test.js +482 -0
  576. package/dist/selftest/health.test.d.ts +2 -0
  577. package/dist/selftest/health.test.js +470 -0
  578. package/dist/selftest/heavy-load.test.d.ts +2 -0
  579. package/dist/selftest/heavy-load.test.js +329 -0
  580. package/dist/selftest/host-sim.test.js +2 -0
  581. package/dist/selftest/index.js +31 -0
  582. package/dist/selftest/layout.test.js +14 -0
  583. package/dist/selftest/menu-perf.test.d.ts +2 -0
  584. package/dist/selftest/menu-perf.test.js +248 -0
  585. package/dist/selftest/menu-screens.d.ts +7 -0
  586. package/dist/selftest/menu-screens.js +68 -17
  587. package/dist/selftest/menu.test.js +603 -22
  588. package/dist/selftest/migrate.test.js +1 -1
  589. package/dist/selftest/personalization.test.js +3 -1
  590. package/dist/selftest/projects.test.js +39 -1
  591. package/dist/selftest/shared-use.test.js +64 -2
  592. package/dist/selftest/sharing.test.js +50 -1
  593. package/dist/selftest/storage.test.d.ts +2 -0
  594. package/dist/selftest/storage.test.js +363 -0
  595. package/dist/selftest/support/engine-cases.d.ts +8 -0
  596. package/dist/selftest/support/engine-cases.js +65 -0
  597. package/dist/selftest/support/engine-golden.d.ts +3 -0
  598. package/dist/selftest/support/engine-golden.js +66 -0
  599. package/dist/selftest/support/fixtures.d.ts +20 -0
  600. package/dist/selftest/support/hcs-probes.d.ts +17 -0
  601. package/dist/selftest/support/hcs-probes.js +41 -0
  602. package/dist/selftest/support/releases.js +1 -1
  603. package/dist/selftest/toolchains.test.js +21 -0
  604. package/dist/selftest/update-service.test.js +87 -3
  605. package/dist/selftest/vpn.test.d.ts +2 -0
  606. package/dist/selftest/vpn.test.js +412 -0
  607. package/dist/selftest/web.test.d.ts +2 -0
  608. package/dist/selftest/web.test.js +402 -0
  609. package/dist/shared/apps/catalogue.js +31 -0
  610. package/dist/shared/channel/index.d.ts +1 -0
  611. package/dist/shared/channel/index.js +1 -0
  612. package/dist/shared/channel/run-dir.d.ts +9 -1
  613. package/dist/shared/channel/run-dir.js +18 -1
  614. package/dist/shared/channel/schema.d.ts +53 -0
  615. package/dist/shared/channel/schema.js +38 -0
  616. package/dist/shared/channel/secrets.d.ts +29 -0
  617. package/dist/shared/channel/secrets.js +50 -0
  618. package/dist/shared/memory/index.d.ts +1 -0
  619. package/dist/shared/memory/index.js +1 -0
  620. package/dist/shared/memory/policy.d.ts +33 -0
  621. package/dist/shared/memory/policy.js +55 -0
  622. package/dist/shared/pty/output-filter.d.ts +14 -1
  623. package/dist/shared/pty/output-filter.js +22 -4
  624. package/dist/shared/pty/terminal.d.ts +4 -1
  625. package/dist/shared/pty/terminal.js +4 -2
  626. package/dist/shared/system.d.ts +1 -0
  627. package/dist/shared/system.js +1 -0
  628. package/dist/shared/vpn/download.d.ts +29 -0
  629. package/dist/shared/vpn/download.js +30 -0
  630. package/dist/shared/vpn/kill-switch.d.ts +18 -0
  631. package/dist/shared/vpn/kill-switch.js +81 -0
  632. package/dist/shared/vpn/ovpn.d.ts +23 -0
  633. package/dist/shared/vpn/ovpn.js +244 -0
  634. package/dist/shared/vpn/wireguard.d.ts +51 -0
  635. package/dist/shared/vpn/wireguard.js +227 -0
  636. package/dist/shared/web/index.d.ts +1 -0
  637. package/dist/shared/web/index.js +1 -0
  638. package/dist/shared/web/protocol.d.ts +61 -0
  639. package/dist/shared/web/protocol.js +35 -0
  640. package/dist/sync/sync-cycle.js +9 -5
  641. package/dist/sync/sync-state.d.ts +1 -0
  642. package/dist/sync/sync-state.js +1 -0
  643. package/dist/sync/watcher.d.ts +13 -0
  644. package/dist/sync/watcher.js +102 -3
  645. package/dist/web/index.html +14 -0
  646. package/dist/web/main-NRRS5O6Z.js +157 -0
  647. package/dist/web/main-T5DMCHYV.css +1 -0
  648. package/native/csharp/FolderSecurity.cs +29 -0
  649. package/native/csharp/HcsHost/AssemblyInfo.cs +14 -0
  650. package/native/csharp/HcsHost/Guard.cs +100 -0
  651. package/native/csharp/HcsHost/Hcs.cs +256 -0
  652. package/native/csharp/HcsHost/Json.cs +78 -0
  653. package/native/csharp/HcsHost/Program.cs +185 -0
  654. package/native/csharp/HcsHost/VirtualDisk.cs +95 -0
  655. package/native/csharp/HostTools/AssemblyInfo.cs +14 -0
  656. package/native/csharp/HostTools/MemoryStatus.cs +107 -0
  657. package/native/csharp/HostTools/Program.cs +58 -17
  658. package/native/scripts/check-contained.ps1 +28 -0
  659. package/native/scripts/contained-common.ps1 +241 -0
  660. package/native/scripts/dismount-contained.ps1 +66 -0
  661. package/native/scripts/memory-status.ps1 +34 -0
  662. package/native/scripts/mount-contained.ps1 +139 -0
  663. package/native/scripts/protect-data.ps1 +29 -0
  664. package/native/scripts/read-folder-sddl.ps1 +10 -0
  665. package/native/scripts/run-elevated.ps1 +17 -4
  666. package/native/scripts/set-folder-access.ps1 +49 -7
  667. package/native/scripts/stop-events.ps1 +23 -8
  668. package/node_modules/ws/LICENSE +20 -0
  669. package/node_modules/ws/README.md +548 -0
  670. package/node_modules/ws/browser.js +8 -0
  671. package/node_modules/ws/index.js +22 -0
  672. package/node_modules/ws/lib/buffer-util.js +131 -0
  673. package/node_modules/ws/lib/constants.js +19 -0
  674. package/node_modules/ws/lib/event-target.js +292 -0
  675. package/node_modules/ws/lib/extension.js +203 -0
  676. package/node_modules/ws/lib/limiter.js +55 -0
  677. package/node_modules/ws/lib/permessage-deflate.js +530 -0
  678. package/node_modules/ws/lib/receiver.js +743 -0
  679. package/node_modules/ws/lib/sender.js +607 -0
  680. package/node_modules/ws/lib/stream.js +161 -0
  681. package/node_modules/ws/lib/subprotocol.js +62 -0
  682. package/node_modules/ws/lib/validation.js +152 -0
  683. package/node_modules/ws/lib/websocket-server.js +562 -0
  684. package/node_modules/ws/lib/websocket.js +1421 -0
  685. package/node_modules/ws/package.json +74 -0
  686. package/node_modules/ws/wrapper.mjs +21 -0
  687. package/package.json +22 -5
  688. package/sandbox/csharp/EnvBroadcast.cs +33 -0
  689. package/sandbox/csharp/MemGov.cs +398 -0
  690. package/sandbox/csharp/PathSync.cs +90 -0
  691. package/sandbox/csharp/PtyHost.cs +111 -5
  692. package/sandbox/scripts/install-shell-path.ps1 +73 -0
  693. package/sandbox/scripts/set-machine-environment.ps1 +37 -4
  694. package/schemas/config.schema.json +136 -7
  695. package/schemas/sandbox-config.schema.json +17 -4
  696. package/dist/cli/commands/repair/checks.d.ts +0 -2
  697. package/dist/cli/commands/repair/checks.js +0 -246
  698. package/dist/cli/commands/sessions/control.d.ts +0 -4
  699. package/dist/cli/commands/sessions/control.js +0 -66
  700. package/dist/cli/commands/sessions/list.d.ts +0 -2
  701. package/dist/cli/commands/sessions/list.js +0 -45
  702. package/dist/cli/commands/sessions/status.d.ts +0 -2
  703. package/dist/cli/commands/sessions/status.js +0 -93
  704. package/dist/cli/commands/sessions/window.d.ts +0 -3
  705. package/dist/cli/commands/sessions/window.js +0 -18
  706. package/dist/cli/menu/pages/start-page.d.ts +0 -43
  707. package/dist/cli/menu/pages/start-page.js +0 -192
  708. package/dist/cli/tui/tab-bar.d.ts +0 -9
  709. package/dist/cli/tui/tab-bar.js +0 -33
@@ -6,12 +6,15 @@ export const DEFAULTS = {
6
6
  audit: { enabled: false, days: 14, maxMb: 100, processes: true, files: true },
7
7
  mappings: [],
8
8
  sandbox: {
9
+ engine: 'windows-sandbox',
9
10
  memoryMb: 'auto',
10
11
  maxMemoryMb: 32768,
11
12
  maxMemoryPercent: 80,
12
13
  cpuLimit: 80,
13
14
  pageFileMb: 16384,
14
15
  reserveHostMb: 8192,
16
+ agentMemoryHeadroomMb: 'auto',
17
+ pressureResponse: true,
15
18
  vGpu: false,
16
19
  networking: true,
17
20
  clipboard: true,
@@ -24,13 +27,16 @@ export const DEFAULTS = {
24
27
  },
25
28
  sharing: { otherUsers: false },
26
29
  storage: {
27
- root: '%LOCALAPPDATA%\\AgentSandbox',
30
+ root: '%ProgramData%\\AgentSandbox\\users\\%USERNAME%',
28
31
  persistAgentState: true,
29
32
  dataName: 'default',
30
33
  markSandboxFiles: true,
34
+ contained: 'off',
35
+ containedMaxGb: 64,
31
36
  warnDataGb: 50,
32
37
  },
33
38
  network: { blockPrivateRanges: true, allowOnly: [], blockHosts: [], forwardPorts: [], dns: [], proxy: '' },
39
+ vpn: { enabled: false, provider: 'nordvpn', protocol: 'udp', country: '', configFile: '', killSwitch: true },
34
40
  provisioning: {
35
41
  copyFromHost: true,
36
42
  fallbackToInstall: true,
@@ -88,6 +94,7 @@ export const DEFAULTS = {
88
94
  sqlserver: { enabled: 'auto' },
89
95
  },
90
96
  attach: { enabled: true, reuseSession: true, auto: false, autoHide: false },
97
+ web: { enabled: false, port: 47800 },
91
98
  agentCommands: { enabled: false, agents: 'auto' },
92
99
  secrets: { strip: true, allow: [], patterns: [], warnFiles: true },
93
100
  personalization: { enabled: true },
@@ -99,6 +106,7 @@ export const DEFAULTS = {
99
106
  globalStateFile: 'auto',
100
107
  copyCredentials: false,
101
108
  overwrite: true,
109
+ sharePluginsAcrossAccounts: false,
102
110
  syncHistory: true,
103
111
  historyScope: 'project',
104
112
  syncClaudeMem: true,
@@ -122,6 +130,10 @@ export const DEFAULTS = {
122
130
  arguments: [],
123
131
  environment: {},
124
132
  home: { env: { CODEX_HOME: 'codex' }, loginFiles: ['auth.json'], hostDir: '~/.codex' },
133
+ localState: { CODEX_SQLITE_HOME: 'sqlite' },
134
+ // Its own command sandbox keeps local users' passwords sealed with DPAPI: unreadable in the next sandbox
135
+ // ("CryptUnprotectData" on every command), so it sets that sandbox up again at each boot.
136
+ bootReset: ['.sandbox-secrets', '.sandbox\\setup_marker.json', '.sandbox\\deny_read_acl_state.json'],
125
137
  resumeArguments: ['resume', '--last'],
126
138
  },
127
139
  gemini: {
@@ -23,8 +23,18 @@ export function machineConfigPath(env = process.env) {
23
23
  * folders in it must be full paths (after %VARIABLES% expand), never relative to someone's folder.
24
24
  */
25
25
  function readMachineConfig(file) {
26
- if (!fs.existsSync(file))
27
- return null;
26
+ // existsSync says false on "access denied": a user not yet in the group would silently get the defaults.
27
+ try {
28
+ fs.accessSync(file, fs.constants.R_OK);
29
+ }
30
+ catch (e) {
31
+ const code = e.code;
32
+ if (code === 'ENOENT' || code === 'ENOTDIR')
33
+ return null;
34
+ if (code === 'EACCES' || code === 'EPERM')
35
+ fail('Cannot read the settings for this PC in ' + file + '.', 'Sign out of Windows and in again after being added to the Agent Sandbox Users group.');
36
+ throw e;
37
+ }
28
38
  const raw = readJsonc(file);
29
39
  const config = validateConfig(mergeConfig(DEFAULTS, raw), file);
30
40
  const folders = config.mappings.map((m, i) => ['mappings[' + i + '].host', m.host]);
@@ -49,6 +49,7 @@ export const ON_IS_SAFER = [
49
49
  'network.blockPrivateRanges',
50
50
  'sandbox.protectedClient',
51
51
  'downloads.requireChecksum',
52
+ 'vpn.killSwitch',
52
53
  ];
53
54
  export const OFF_IS_SAFER = [
54
55
  'sandbox.networking',
@@ -1,4 +1,23 @@
1
+ /** One entry of a list question; `description` is shown under the highlighted entry. */
2
+ export interface PromptChoice<T> {
3
+ readonly name: string;
4
+ readonly value: T;
5
+ readonly description?: string;
6
+ }
1
7
  /** A yes/no question (default no). */
2
8
  export declare function askYesNo(question: string, defaultYes?: boolean): Promise<boolean>;
9
+ /** A yes/no question the command needs answered: no terminal fails (`--yes` answers yes on the command line). */
10
+ export declare function askRequired(question: string, fix?: string, defaultYes?: boolean): Promise<boolean>;
3
11
  /** Asks the user to type `expected` (a stronger confirmation than yes/no). */
4
12
  export declare function askTyped(question: string, expected: string): Promise<boolean>;
13
+ /** Pick one entry from a list (for an argument that was left out); `fix` says what to type instead. */
14
+ export declare function askChoice<T>(message: string, choices: readonly PromptChoice<T>[], fix: string): Promise<T>;
15
+ /** Tick any number of entries from a list; `fix` says what to type instead. */
16
+ export declare function askChoices<T>(message: string, choices: readonly PromptChoice<T>[], fix: string): Promise<T[]>;
17
+ /** Type a name or a path. `validate` returns true, or the problem to show. */
18
+ export declare function askName(message: string, fix: string, validate?: (value: string) => true | string): Promise<string>;
19
+ /**
20
+ * Type a secret (a password, an API key) with each character shown as *. Never echoed, never kept; `fix` says what to
21
+ * do without a terminal.
22
+ */
23
+ export declare function askSecret(message: string, fix: string): Promise<string>;
@@ -1,12 +1,24 @@
1
- // Questions asked on the terminal, all through @inquirer/prompts. Without an interactive terminal the answer is always
2
- // "no".
3
- import { confirm, input } from '@inquirer/prompts';
1
+ // Questions asked on the terminal, all through @inquirer/prompts. askYesNo is for optional offers: without an
2
+ // interactive terminal the answer is "no". askRequired, askChoice and askName are for questions a command cannot go on
3
+ // without: with no terminal they fail and say how to answer on the command line.
4
+ import { checkbox, confirm, input, password, select } from '@inquirer/prompts';
5
+ import { fail } from './util/errors.js';
6
+ /** The terminal check every required question starts with. */
7
+ function requireTerminal(fix) {
8
+ if (!process.stdin.isTTY)
9
+ fail('Cannot ask here (no terminal).', fix);
10
+ }
4
11
  /** A yes/no question (default no). */
5
12
  export async function askYesNo(question, defaultYes = false) {
6
13
  if (!process.stdin.isTTY)
7
14
  return false;
8
15
  return confirm({ message: question, default: defaultYes });
9
16
  }
17
+ /** A yes/no question the command needs answered: no terminal fails (`--yes` answers yes on the command line). */
18
+ export async function askRequired(question, fix = 'Add --yes to answer yes.', defaultYes = false) {
19
+ requireTerminal(fix);
20
+ return confirm({ message: question, default: defaultYes });
21
+ }
10
22
  /** Asks the user to type `expected` (a stronger confirmation than yes/no). */
11
23
  export async function askTyped(question, expected) {
12
24
  if (!process.stdin.isTTY)
@@ -14,3 +26,31 @@ export async function askTyped(question, expected) {
14
26
  const answer = await input({ message: question + ' Type "' + expected + '" to confirm:' });
15
27
  return answer.trim().toLowerCase() === expected;
16
28
  }
29
+ /** Pick one entry from a list (for an argument that was left out); `fix` says what to type instead. */
30
+ export async function askChoice(message, choices, fix) {
31
+ requireTerminal(fix);
32
+ return select({ message, choices: [...choices] });
33
+ }
34
+ /** Tick any number of entries from a list; `fix` says what to type instead. */
35
+ export async function askChoices(message, choices, fix) {
36
+ requireTerminal(fix);
37
+ return checkbox({ message, choices: [...choices] });
38
+ }
39
+ /** Type a name or a path. `validate` returns true, or the problem to show. */
40
+ export async function askName(message, fix, validate) {
41
+ requireTerminal(fix);
42
+ const answer = await input({ message, validate: validate ? (v) => validate(v.trim()) : undefined });
43
+ return answer.trim();
44
+ }
45
+ /**
46
+ * Type a secret (a password, an API key) with each character shown as *. Never echoed, never kept; `fix` says what to
47
+ * do without a terminal.
48
+ */
49
+ export async function askSecret(message, fix) {
50
+ requireTerminal(fix);
51
+ return password({
52
+ message,
53
+ mask: '*',
54
+ validate: (v) => (v.length > 0 ? true : 'Type it, or press Ctrl+C to cancel.'),
55
+ });
56
+ }
@@ -18,3 +18,9 @@ export declare const GitAccessSchema: z.ZodEnum<{
18
18
  export declare const EnabledSchema: z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>;
19
19
  export declare function enabled(what: string, markers: string): typeof EnabledSchema;
20
20
  export declare function Packages(what: string, example: string): typeof StringsSchema;
21
+ /**
22
+ * Marks a setting whose value is a secret (an API key in an agent's environment): config show / get, the menu, doctor
23
+ * and every --json print *** for it (core/schema/redact.ts), and it is never written to session.json or the launch
24
+ * folder (it travels in a one-shot file, see shared/channel/secrets.ts).
25
+ */
26
+ export declare function secret<T extends z.ZodType>(schema: T): T;
@@ -25,3 +25,11 @@ export function enabled(what, markers) {
25
25
  export function Packages(what, example) {
26
26
  return StringsSchema.describe(what + ', installed once and kept (e.g. ' + example + ').');
27
27
  }
28
+ /**
29
+ * Marks a setting whose value is a secret (an API key in an agent's environment): config show / get, the menu, doctor
30
+ * and every --json print *** for it (core/schema/redact.ts), and it is never written to session.json or the launch
31
+ * folder (it travels in a one-shot file, see shared/channel/secrets.ts).
32
+ */
33
+ export function secret(schema) {
34
+ return schema.meta({ secret: true });
35
+ }
@@ -23,12 +23,18 @@ export declare const ConfigSchema: z.ZodObject<{
23
23
  optional: z.ZodOptional<z.ZodBoolean>;
24
24
  }, z.core.$strict>>;
25
25
  sandbox: z.ZodObject<{
26
+ engine: z.ZodEnum<{
27
+ "windows-sandbox": "windows-sandbox";
28
+ hcs: "hcs";
29
+ }>;
26
30
  memoryMb: z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodNumber]>;
27
31
  maxMemoryMb: z.ZodNumber;
28
32
  maxMemoryPercent: z.ZodNumber;
29
33
  cpuLimit: z.ZodUnion<readonly [z.ZodLiteral<"none">, z.ZodNumber]>;
30
34
  pageFileMb: z.ZodNumber;
31
35
  reserveHostMb: z.ZodNumber;
36
+ agentMemoryHeadroomMb: z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodLiteral<"none">, z.ZodNumber]>;
37
+ pressureResponse: z.ZodBoolean;
32
38
  vGpu: z.ZodBoolean;
33
39
  networking: z.ZodBoolean;
34
40
  clipboard: z.ZodBoolean;
@@ -47,6 +53,11 @@ export declare const ConfigSchema: z.ZodObject<{
47
53
  persistAgentState: z.ZodBoolean;
48
54
  dataName: z.ZodString;
49
55
  markSandboxFiles: z.ZodBoolean;
56
+ contained: z.ZodEnum<{
57
+ off: "off";
58
+ vhdx: "vhdx";
59
+ }>;
60
+ containedMaxGb: z.ZodNumber;
50
61
  warnDataGb: z.ZodNumber;
51
62
  }, z.core.$strict>;
52
63
  network: z.ZodObject<{
@@ -60,6 +71,21 @@ export declare const ConfigSchema: z.ZodObject<{
60
71
  dns: z.ZodArray<z.ZodString>;
61
72
  proxy: z.ZodString;
62
73
  }, z.core.$strict>;
74
+ vpn: z.ZodObject<{
75
+ enabled: z.ZodBoolean;
76
+ provider: z.ZodEnum<{
77
+ nordvpn: "nordvpn";
78
+ "openvpn-file": "openvpn-file";
79
+ "wireguard-file": "wireguard-file";
80
+ }>;
81
+ protocol: z.ZodEnum<{
82
+ udp: "udp";
83
+ tcp: "tcp";
84
+ }>;
85
+ country: z.ZodString;
86
+ configFile: z.ZodString;
87
+ killSwitch: z.ZodBoolean;
88
+ }, z.core.$strict>;
63
89
  provisioning: z.ZodObject<{
64
90
  copyFromHost: z.ZodBoolean;
65
91
  fallbackToInstall: z.ZodBoolean;
@@ -218,6 +244,10 @@ export declare const ConfigSchema: z.ZodObject<{
218
244
  auto: z.ZodBoolean;
219
245
  autoHide: z.ZodBoolean;
220
246
  }, z.core.$strict>;
247
+ web: z.ZodObject<{
248
+ enabled: z.ZodBoolean;
249
+ port: z.ZodNumber;
250
+ }, z.core.$strict>;
221
251
  agentCommands: z.ZodObject<{
222
252
  enabled: z.ZodBoolean;
223
253
  agents: z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodArray<z.ZodString>]>;
@@ -258,6 +288,7 @@ export declare const ConfigSchema: z.ZodObject<{
258
288
  globalStateFile: z.ZodString;
259
289
  copyCredentials: z.ZodBoolean;
260
290
  overwrite: z.ZodBoolean;
291
+ sharePluginsAcrossAccounts: z.ZodBoolean;
261
292
  syncHistory: z.ZodBoolean;
262
293
  historyScope: z.ZodEnum<{
263
294
  project: "project";
@@ -281,6 +312,8 @@ export declare const ConfigSchema: z.ZodObject<{
281
312
  loginFiles: z.ZodArray<z.ZodString>;
282
313
  hostDir: z.ZodOptional<z.ZodString>;
283
314
  }, z.core.$strict>>;
315
+ localState: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
316
+ bootReset: z.ZodOptional<z.ZodArray<z.ZodString>>;
284
317
  resumeArguments: z.ZodOptional<z.ZodArray<z.ZodString>>;
285
318
  resumeOneArguments: z.ZodOptional<z.ZodArray<z.ZodString>>;
286
319
  }, z.core.$strict>>;
@@ -345,6 +378,9 @@ export declare const LocalOverridesSchema: z.ZodObject<{
345
378
  blockPrivateRanges: z.ZodOptional<z.ZodBoolean>;
346
379
  blockHosts: z.ZodOptional<z.ZodArray<z.ZodString>>;
347
380
  }, z.core.$strict>>;
381
+ vpn: z.ZodOptional<z.ZodObject<{
382
+ killSwitch: z.ZodOptional<z.ZodBoolean>;
383
+ }, z.core.$strict>>;
348
384
  provisioning: z.ZodOptional<z.ZodObject<{
349
385
  copyFromHost: z.ZodOptional<z.ZodBoolean>;
350
386
  fallbackToInstall: z.ZodOptional<z.ZodBoolean>;
@@ -11,6 +11,8 @@ import { ToolchainsSchema } from './toolchains.js';
11
11
  import { AppsSchema } from './apps.js';
12
12
  import { ProjectsSchema } from './projects.js';
13
13
  import { ResumeSchema } from './resume.js';
14
+ import { WebSchema } from './web.js';
15
+ import { VpnSchema } from './vpn.js';
14
16
  export const ConfigSchema = z
15
17
  .strictObject({
16
18
  $schema: SchemaRefSchema.optional(),
@@ -23,23 +25,37 @@ export const ConfigSchema = z
23
25
  sandbox: SandboxSchema,
24
26
  sharing: SharingSchema,
25
27
  storage: z.strictObject({
26
- root: z.string().min(1).describe('Where everything is kept on this PC (tools, databases, logins, launches).'),
28
+ root: z
29
+ .string()
30
+ .min(1)
31
+ .describe('Where everything is kept on this PC (tools, databases, logins, launches). The default is a private folder for you under %ProgramData%\\AgentSandbox\\users, which works for installs for one user and for everyone. sandbox storage move <folder> moves it.'),
27
32
  persistAgentState: z.boolean().describe('Keep agent logins and history between sandboxes.'),
28
33
  dataName: NameSchema.describe('Name of the persistent data set (C:\\AgentData) shared by all workspaces.'),
29
34
  markSandboxFiles: z
30
35
  .boolean()
31
36
  .describe('Programs and scripts (.exe, .ps1, .bat, .cmd, .msi, .lnk ...) that appear or change in your project while a sandbox runs get Windows\' "downloaded from the internet" mark, so SmartScreen and PowerShell ask before they run on this PC.'),
37
+ contained: z
38
+ .enum(['off', 'vhdx'])
39
+ .describe('(beta) Keep the sandbox tools, state and logs inside one disk image file (vhdx) instead of loose folders, so scanning programs on this PC see one file. Not yet tried on a real PC. Turn it on with sandbox storage contained on (it moves your files and asks first); Windows asks for permission to mount the image when a sandbox starts. "off" = loose folders, as always. Yours only: a project file (.sandbox-config.json) cannot set it.'),
40
+ containedMaxGb: z
41
+ .number()
42
+ .int()
43
+ .min(8)
44
+ .max(4096)
45
+ .describe('(beta) Largest size, in GB, the disk image of storage.contained may grow to.'),
32
46
  warnDataGb: z
33
47
  .number()
34
48
  .min(0)
35
49
  .describe('Say at launch when the persisted data (tools, databases, logins) is bigger than this many GB; 0 = never. sandbox data shows what takes the space.'),
36
50
  }),
37
51
  network: NetworkSchema,
52
+ vpn: VpnSchema,
38
53
  provisioning: ProvisioningSchema,
39
54
  downloads: DownloadsSchema,
40
55
  toolchains: ToolchainsSchema,
41
56
  databases: DatabasesSchema.describe('Databases running inside the sandbox. Data persists in C:\\AgentData\\databases; each one starts at boot.'),
42
57
  attach: AttachSchema,
58
+ web: WebSchema,
43
59
  agentCommands: AgentCommandsSchema,
44
60
  secrets: SecretsSchema,
45
61
  personalization: toggle('Copy your desktop look (theme, accent, taskbar, wallpaper, ...) into the sandbox.'),
@@ -71,9 +87,17 @@ export const LocalOverridesSchema = z
71
87
  .describe('Extra folders (relative paths are relative to this file), e.g. a read-only data folder at another place in the sandbox. Folders outside the project are used only as your projects.allowOutsideMappings setting allows (by default you are asked once).'),
72
88
  scripts: StringsSchema.describe('Scripts (.ps1 / .mjs / .cmd, relative to this file) run inside the sandbox before the agent.'),
73
89
  // This PC's resources are yours to share: CPU and paging file (this PC's disk) are not a project's to set.
74
- sandbox: SandboxSchema.omit({ cpuLimit: true, pageFileMb: true }).partial(),
90
+ sandbox: SandboxSchema.omit({
91
+ cpuLimit: true,
92
+ pageFileMb: true,
93
+ engine: true,
94
+ agentMemoryHeadroomMb: true,
95
+ pressureResponse: true,
96
+ }).partial(),
75
97
  // A project may block more (the LAN, hosts); it never opens hosts, ports, DNS or a proxy.
76
98
  network: NetworkSchema.pick({ blockPrivateRanges: true, blockHosts: true }).partial(),
99
+ // A project may turn the kill switch on, never off, and never choose a VPN, a server, a file or a login.
100
+ vpn: VpnSchema.pick({ killSwitch: true }).partial(),
77
101
  provisioning: ProvisioningSchema.pick({ copyFromHost: true, fallbackToInstall: true, refresh: true })
78
102
  .extend({ git: GitSchema.partial(), terminal: toggle('Windows Terminal as the sandbox window.').partial() })
79
103
  .partial(),
@@ -21,6 +21,8 @@ export declare const HarnessSchema: z.ZodObject<{
21
21
  loginFiles: z.ZodArray<z.ZodString>;
22
22
  hostDir: z.ZodOptional<z.ZodString>;
23
23
  }, z.core.$strict>>;
24
+ localState: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
25
+ bootReset: z.ZodOptional<z.ZodArray<z.ZodString>>;
24
26
  resumeArguments: z.ZodOptional<z.ZodArray<z.ZodString>>;
25
27
  resumeOneArguments: z.ZodOptional<z.ZodArray<z.ZodString>>;
26
28
  }, z.core.$strict>;
@@ -1,6 +1,6 @@
1
1
  // An agent (claude, codex, ...) the sandbox can run.
2
2
  import { z } from 'zod';
3
- import { StringsSchema } from './common.js';
3
+ import { secret, StringsSchema } from './common.js';
4
4
  /** A folder below the agent's state folder: plain names only, no drive, no "..". */
5
5
  const SubfolderSchema = z
6
6
  .string()
@@ -41,8 +41,19 @@ export const HarnessSchema = z
41
41
  .describe('Python package installed with `uv tool install` inside the sandbox (e.g. aider-chat).'),
42
42
  uvBin: z.string().optional().describe('Command the uv package provides.'),
43
43
  arguments: StringsSchema.describe('Arguments always passed to the agent.'),
44
- environment: z.record(z.string(), z.string()).describe('Environment variables for the agent.'),
44
+ environment: z
45
+ .record(z.string(), secret(z.string()))
46
+ .describe('Environment variables for the agent (API keys go here). Their values are shown as *** and are handed to the sandbox in a one-shot file, never kept in the launch folder. The agent can read its own environment.'),
45
47
  home: HarnessHomeSchema.optional().describe('Where its login lives inside the sandbox; leave out when the agent cannot be pointed at a folder (then its login is not kept between sandboxes).'),
48
+ localState: z
49
+ .record(z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/), SubfolderSchema)
50
+ .optional()
51
+ .describe("Environment variable -> folder below the agent's own state folder (state\\<agent>) for SQLite databases. SQLite cannot run in a mapped folder, so the agent runs from a copy on the sandbox's disk (the variable points to it) that is copied from and back to that folder."),
52
+ bootReset: z
53
+ .array(SubfolderSchema)
54
+ .max(32)
55
+ .optional()
56
+ .describe("Files and folders below the agent's own state folder (state\\<agent>) that only work on the machine that wrote them (keys sealed with Windows DPAPI, local accounts it created). Every sandbox is a new machine, so they are deleted at each boot and the agent sets them up again."),
46
57
  resumeArguments: StringsSchema.optional().describe('Arguments used when the agent is restarted in place (e.g. after an account switch) so it resumes the conversation.'),
47
58
  resumeOneArguments: StringsSchema.optional().describe('Arguments that reopen one conversation, with {id} where its id goes (claude: --resume {id}). Used instead of resumeArguments when the conversation of a session is known.'),
48
59
  })
@@ -1,6 +1,8 @@
1
- export { GitAccessSchema } from './common.js';
1
+ export { GitAccessSchema, NameSchema, secret } from './common.js';
2
+ export { REDACTED, redactSecrets, scrubSecrets, secretPaths, secretValues } from './redact.js';
2
3
  export { ConfigSchema, LocalOverridesSchema } from './config.js';
3
4
  export { HarnessSchema } from './harness.js';
4
5
  export { describeIssues, jsonSchemas } from './json-schema.js';
5
6
  export { MappingSchema } from './sandbox.js';
6
7
  export { ToolchainsSchema } from './toolchains.js';
8
+ export { VpnSchema, VPN_PROVIDERS, type VpnProvider } from './vpn.js';
@@ -1,8 +1,10 @@
1
1
  // Every setting, defined once with zod, split by area in schema/. This file is the one place the rest of the code (and
2
2
  // scripts/schemas.mjs, which generates the JSON Schema files) imports them from.
3
- export { GitAccessSchema } from './common.js';
3
+ export { GitAccessSchema, NameSchema, secret } from './common.js';
4
+ export { REDACTED, redactSecrets, scrubSecrets, secretPaths, secretValues } from './redact.js';
4
5
  export { ConfigSchema, LocalOverridesSchema } from './config.js';
5
6
  export { HarnessSchema } from './harness.js';
6
7
  export { describeIssues, jsonSchemas } from './json-schema.js';
7
8
  export { MappingSchema } from './sandbox.js';
8
9
  export { ToolchainsSchema } from './toolchains.js';
10
+ export { VpnSchema, VPN_PROVIDERS } from './vpn.js';
@@ -22,6 +22,7 @@ export declare const ClaudeProfileSchema: z.ZodObject<{
22
22
  globalStateFile: z.ZodString;
23
23
  copyCredentials: z.ZodBoolean;
24
24
  overwrite: z.ZodBoolean;
25
+ sharePluginsAcrossAccounts: z.ZodBoolean;
25
26
  syncHistory: z.ZodBoolean;
26
27
  historyScope: z.ZodEnum<{
27
28
  project: "project";
@@ -38,6 +38,9 @@ export const ClaudeProfileSchema = z.strictObject({
38
38
  globalStateFile: z.string().describe('Your .claude.json, or "auto". Empty string = do not copy.'),
39
39
  copyCredentials: z.boolean().describe('Copy your Claude LOGIN into the sandbox. Prefer sandbox account instead.'),
40
40
  overwrite: z.boolean().describe('Refresh these settings from this PC on every launch.'),
41
+ sharePluginsAcrossAccounts: z
42
+ .boolean()
43
+ .describe('When you switch Claude accounts, copy your Claude plugins (and which ones are enabled) into a data set that has none yet. Off by default: plugins are code that runs in your sessions.'),
41
44
  syncHistory: z.boolean().describe('Bring conversation history in, and sync new history back (path-translated).'),
42
45
  historyScope: z
43
46
  .enum(['project', 'all'])
@@ -0,0 +1,13 @@
1
+ /** What is printed instead of a secret. */
2
+ export declare const REDACTED = "***";
3
+ /** A path through a config; "*" stands for any key of a map or any item of a list. */
4
+ type SecretPath = readonly string[];
5
+ /** Every setting marked secret, found from the schema itself (so a new secret setting needs no list). */
6
+ export declare function secretPaths(): readonly SecretPath[];
7
+ /** A copy of `config` with every secret value replaced by ***. */
8
+ export declare function redactSecrets<T>(config: T): T;
9
+ /** The secret values in `config` (for scrubbing text that was built from it). */
10
+ export declare function secretValues(config: unknown): string[];
11
+ /** `text` with every secret value of `config` replaced by *** (a last safety net for output built from a config). */
12
+ export declare function scrubSecrets(text: string, config: unknown): string;
13
+ export {};
@@ -0,0 +1,75 @@
1
+ // Secrets in settings: which values are marked `secret` in the schemas, and printing a config without them.
2
+ import { z } from 'zod';
3
+ import { ConfigSchema } from './config.js';
4
+ /** What is printed instead of a secret. */
5
+ export const REDACTED = '***';
6
+ let cached = null;
7
+ const walk = (node, at, out) => {
8
+ if (typeof node !== 'object' || node === null)
9
+ return;
10
+ const n = node;
11
+ if (n.secret === true)
12
+ out.push(at);
13
+ for (const [k, v] of Object.entries(n.properties ?? {}))
14
+ walk(v, [...at, k], out);
15
+ if (typeof n.additionalProperties === 'object')
16
+ walk(n.additionalProperties, [...at, '*'], out);
17
+ if (n.items)
18
+ walk(n.items, [...at, '*'], out);
19
+ for (const key of ['anyOf', 'oneOf', 'allOf'])
20
+ if (Array.isArray(n[key]))
21
+ for (const v of n[key])
22
+ walk(v, at, out);
23
+ };
24
+ /** Every setting marked secret, found from the schema itself (so a new secret setting needs no list). */
25
+ export function secretPaths() {
26
+ if (!cached) {
27
+ const out = [];
28
+ walk(z.toJSONSchema(ConfigSchema, { io: 'input', unrepresentable: 'any' }), [], out);
29
+ cached = out;
30
+ }
31
+ return cached;
32
+ }
33
+ const blank = (value, path) => {
34
+ if (path.length === 0)
35
+ return typeof value === 'string' && value !== '' ? REDACTED : value;
36
+ if (typeof value !== 'object' || value === null)
37
+ return value;
38
+ const [head, ...rest] = path;
39
+ if (Array.isArray(value))
40
+ return value.map((v) => (head === '*' ? blank(v, rest) : v));
41
+ const o = value;
42
+ return Object.fromEntries(Object.entries(o).map(([k, v]) => [k, head === '*' || head === k ? blank(v, rest) : v]));
43
+ };
44
+ /** A copy of `config` with every secret value replaced by ***. */
45
+ export function redactSecrets(config) {
46
+ return secretPaths().reduce((value, path) => blank(value, path), config);
47
+ }
48
+ const collect = (value, path, out) => {
49
+ if (path.length === 0) {
50
+ if (typeof value === 'string' && value !== '')
51
+ out.push(value);
52
+ return;
53
+ }
54
+ if (typeof value !== 'object' || value === null)
55
+ return;
56
+ const [head, ...rest] = path;
57
+ const o = value;
58
+ for (const [k, v] of Object.entries(o))
59
+ if (head === '*' || head === k)
60
+ collect(v, rest, out);
61
+ };
62
+ /** The secret values in `config` (for scrubbing text that was built from it). */
63
+ export function secretValues(config) {
64
+ const out = [];
65
+ for (const path of secretPaths())
66
+ collect(config, path, out);
67
+ return [...new Set(out)];
68
+ }
69
+ /** `text` with every secret value of `config` replaced by *** (a last safety net for output built from a config). */
70
+ export function scrubSecrets(text, config) {
71
+ return secretValues(config)
72
+ .filter((v) => v.length >= 4)
73
+ .sort((a, b) => b.length - a.length)
74
+ .reduce((t, v) => t.split(v).join(REDACTED).split(JSON.stringify(v).slice(1, -1)).join(REDACTED), text);
75
+ }
@@ -7,12 +7,18 @@ export declare const MappingSchema: z.ZodObject<{
7
7
  optional: z.ZodOptional<z.ZodBoolean>;
8
8
  }, z.core.$strict>;
9
9
  export declare const SandboxSchema: z.ZodObject<{
10
+ engine: z.ZodEnum<{
11
+ "windows-sandbox": "windows-sandbox";
12
+ hcs: "hcs";
13
+ }>;
10
14
  memoryMb: z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodNumber]>;
11
15
  maxMemoryMb: z.ZodNumber;
12
16
  maxMemoryPercent: z.ZodNumber;
13
17
  cpuLimit: z.ZodUnion<readonly [z.ZodLiteral<"none">, z.ZodNumber]>;
14
18
  pageFileMb: z.ZodNumber;
15
19
  reserveHostMb: z.ZodNumber;
20
+ agentMemoryHeadroomMb: z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodLiteral<"none">, z.ZodNumber]>;
21
+ pressureResponse: z.ZodBoolean;
16
22
  vGpu: z.ZodBoolean;
17
23
  networking: z.ZodBoolean;
18
24
  clipboard: z.ZodBoolean;
@@ -16,6 +16,9 @@ export const MappingSchema = z.strictObject({
16
16
  optional: z.boolean().optional().describe('true = skip it quietly when the host folder does not exist.'),
17
17
  });
18
18
  export const SandboxSchema = z.strictObject({
19
+ engine: z
20
+ .enum(['windows-sandbox', 'hcs'])
21
+ .describe('(alpha) What runs the sandbox. "windows-sandbox" = Windows Sandbox (the default: desktop, Windows Terminal, GPU, clipboard, audio, printers). "hcs" = a headless Hyper-V isolated Server Core container for agents (no desktop, GPU or clipboard); it needs Windows features and an image on this PC (sandbox engine check hcs lists what is missing), and starting it is not enabled yet in this alpha. sandbox engine shows what each engine can do. Yours only: a project file (.sandbox-config.json) cannot set it.'),
19
22
  memoryMb: z
20
23
  .union([z.literal('auto'), z.number().int().min(2048)])
21
24
  .describe('Sandbox RAM in MB (>= 2048), or "auto": free RAM minus reserveHostMb, capped at maxMemoryMb.'),
@@ -35,10 +38,24 @@ export const SandboxSchema = z.strictObject({
35
38
  .min(0)
36
39
  .max(262144)
37
40
  .describe('Size of the sandbox\'s paging file in MB, created at full size when it starts so it never grows while builds run (8 GB of its disk always stays free). Windows Sandbox starts with about 1 GB: parallel builds then fail with "The paging file is too small", and Windows grows the file under load. 0 = leave Windows\' own.'),
38
- reserveHostMb: z.number().int().nonnegative().describe('RAM always left for this PC when memoryMb is "auto".'),
39
- vGpu: z.boolean().describe('Virtual GPU. Off by default: Microsoft notes it widens the sandbox attack surface.'),
41
+ reserveHostMb: z
42
+ .number()
43
+ .int()
44
+ .nonnegative()
45
+ .describe('Memory always left for this PC when memoryMb is "auto": the sandbox gets at most (free RAM, and RAM plus paging file still unused) minus this.'),
46
+ agentMemoryHeadroomMb: z
47
+ .union([z.literal('auto'), z.literal('none'), z.number().int().min(0)])
48
+ .describe('Memory kept out of the agents reach inside the sandbox, in MB: everything the agents start (their builds, tests, tools) together may use at most the sandbox memory minus this; a runaway parallel build then gets out-of-memory errors in its own session instead of freezing or crashing the whole sandbox. "auto" = the larger of 2048 MB and 10 % of the sandbox memory; "none" = no limit. Yours only: a project file cannot change it.'),
49
+ pressureResponse: z
50
+ .boolean()
51
+ .describe('When the sandbox (or this PC) runs low on memory, slow the heaviest build programs down (lower priority) and, if that is not enough, pause the biggest compiler for a few seconds at a time, so heavy parallel builds slow down instead of closing the sandbox. Never touches the agents themselves. Yours only: a project file cannot change it.'),
52
+ vGpu: z
53
+ .boolean()
54
+ .describe("Virtual GPU. Off by default: Microsoft notes it widens the sandbox attack surface. The sandbox then uses this PC's graphics card, and with some graphics drivers heavy use can freeze the whole PC: turn it on only when a program in the sandbox needs the GPU (the mesa toolchain gives software OpenGL without it)."),
40
55
  networking: z.boolean().describe('Internet access. false is the only hard network isolation Windows Sandbox offers.'),
41
- clipboard: z.boolean().describe('Shared clipboard between this PC and the sandbox.'),
56
+ clipboard: z
57
+ .boolean()
58
+ .describe("Shared clipboard between this PC and the sandbox. Also lets an agent's copy (in sandbox attach) reach this PC's clipboard."),
42
59
  audioInput: z.boolean().describe('Microphone access.'),
43
60
  videoInput: z.boolean().describe('Camera access.'),
44
61
  printerRedirection: z.boolean().describe('Printers from this PC.'),
@@ -85,6 +102,7 @@ export const NetworkSchema = z.strictObject({
85
102
  proxy: z
86
103
  .string()
87
104
  .regex(/^(https?:\/\/[^\s]+)?$/, 'http://host:port')
105
+ .refine((v) => !/^https?:\/\/[^/?#]*@/i.test(v), 'no user name or password in the address (it would be stored in plain text and visible to the agent): use a proxy that needs no login')
88
106
  .describe('An HTTP proxy the sandbox uses to reach the internet (HTTP_PROXY / HTTPS_PROXY for everything in it), e.g. http://proxy.corp:8080. Empty = none.'),
89
107
  });
90
108
  export const AuditSchema = z.strictObject({
@@ -0,0 +1,18 @@
1
+ import { z } from 'zod';
2
+ export declare const VPN_PROVIDERS: readonly ["nordvpn", "openvpn-file", "wireguard-file"];
3
+ export declare const VpnSchema: z.ZodObject<{
4
+ enabled: z.ZodBoolean;
5
+ provider: z.ZodEnum<{
6
+ nordvpn: "nordvpn";
7
+ "openvpn-file": "openvpn-file";
8
+ "wireguard-file": "wireguard-file";
9
+ }>;
10
+ protocol: z.ZodEnum<{
11
+ udp: "udp";
12
+ tcp: "tcp";
13
+ }>;
14
+ country: z.ZodString;
15
+ configFile: z.ZodString;
16
+ killSwitch: z.ZodBoolean;
17
+ }, z.core.$strict>;
18
+ export type VpnProvider = (typeof VPN_PROVIDERS)[number];
@@ -0,0 +1,22 @@
1
+ // The VPN setting (inside the sandbox only; the login is not a setting: it is kept encrypted by `sandbox vpn login`).
2
+ import { z } from 'zod';
3
+ export const VPN_PROVIDERS = ['nordvpn', 'openvpn-file', 'wireguard-file'];
4
+ export const VpnSchema = z.strictObject({
5
+ enabled: z
6
+ .boolean()
7
+ .describe("Send the sandbox's traffic through a VPN. Only the sandbox: your PC's own connection is untouched. Needs a saved login first (sandbox vpn login). The agent in the sandbox can read that login and can turn the tunnel off (it is the administrator there)."),
8
+ provider: z
9
+ .enum(VPN_PROVIDERS)
10
+ .describe('nordvpn: a recommended NordVPN server is picked at every launch. openvpn-file: your own .ovpn file (configFile). wireguard-file: your own WireGuard .conf (configFile), e.g. from your company.'),
11
+ protocol: z.enum(['udp', 'tcp']).describe('udp is faster; tcp gets through networks that block udp.'),
12
+ country: z
13
+ .string()
14
+ .regex(/^([A-Za-z][A-Za-z .'-]{0,39})?$/, 'a country name or code like uk or Germany')
15
+ .describe('nordvpn: the country of the server, e.g. uk, us or Germany. Empty = the best server anywhere.'),
16
+ configFile: z
17
+ .string()
18
+ .describe("openvpn-file / wireguard-file: the .ovpn or .conf file on this PC (an .ovpn has its certificates inside it). Files that run programs (script-security, up, down, plugin, PostUp ...) are refused. A WireGuard file holds your private key: it is read when a sandbox starts and handed over in a one-shot file. A project's file can never set this."),
19
+ killSwitch: z
20
+ .boolean()
21
+ .describe('Block all traffic that does not go through the tunnel: when the tunnel cannot start, the sandbox stays offline instead of using your normal connection. A project can only turn this on, never off.'),
22
+ });