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
@@ -0,0 +1,33 @@
1
+ import type { ResolvedMapping } from '../../../core/types.js';
2
+ /** `folder`: a host folder shared in (it is also one of the plan's mappings). `disk`: an image the engine attaches. */
3
+ export type StorageAttachment = {
4
+ readonly kind: 'folder';
5
+ readonly host: string;
6
+ readonly guest: string;
7
+ readonly readOnly: boolean;
8
+ } | {
9
+ readonly kind: 'disk';
10
+ readonly image: string;
11
+ readonly guest: string;
12
+ readonly maxGb: number;
13
+ };
14
+ export interface DataSet {
15
+ readonly dataPath: string;
16
+ readonly guest: string;
17
+ }
18
+ export interface PreparedStorage {
19
+ readonly attachments: readonly StorageAttachment[];
20
+ /** The folder attachments as mappings, in the order they go in the launch. */
21
+ readonly mappings: readonly ResolvedMapping[];
22
+ }
23
+ export interface ProviderCheck {
24
+ readonly available: boolean;
25
+ readonly reasons: readonly string[];
26
+ readonly fixes: readonly string[];
27
+ }
28
+ export interface StorageProvider {
29
+ readonly id: 'folder' | 'vhdx-mounted' | 'vhdx-attached';
30
+ check(): Promise<ProviderCheck>;
31
+ prepare(dataSet: DataSet): Promise<PreparedStorage>;
32
+ release(): Promise<void>;
33
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ /** Where the data lived before 1.6: per user, in the profile. Still pinned in config.json when it was there. */
2
+ export declare const OLD_DEFAULT_ROOT = "%LOCALAPPDATA%\\AgentSandbox";
3
+ /** The old per-user default, expanded (null when LOCALAPPDATA is not set). */
4
+ export declare function oldDefaultRoot(env?: NodeJS.ProcessEnv): string | null;
5
+ /** The shared default, expanded: %ProgramData%\AgentSandbox\users\<you>. */
6
+ export declare function sharedDefaultRoot(base?: string): string;
7
+ /** The folder that holds one private storage folder per user. */
8
+ export declare function usersFolder(env?: NodeJS.ProcessEnv): string;
9
+ /** The per-user folder under the users folder that `root` is (or is inside), or null when it is elsewhere. */
10
+ export declare function privateFolderOf(root: string, env?: NodeJS.ProcessEnv): string | null;
11
+ /** A folder with something in it (a missing folder, a file or an empty folder holds no data). */
12
+ export declare function holdsData(dir: string): boolean;
13
+ /**
14
+ * Creates the storage root when it is missing. Under %ProgramData%\AgentSandbox\users the folder is made private
15
+ * before anything is written in it (the users folder itself is created as you when no all-users install made it). A
16
+ * root elsewhere is made private when this call creates it.
17
+ */
18
+ export declare function ensureStorageRoot(root: string, protect: (dir: string) => void, env?: NodeJS.ProcessEnv): void;
@@ -0,0 +1,77 @@
1
+ // The storage root (everything kept between sandboxes): where the old and the new default are, which folders may hold
2
+ // saved data, and the one place that creates the root (private when it is under %ProgramData%\AgentSandbox\users).
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { DEFAULTS, machineRoot } from '../../core/config/index.js';
6
+ import { expandPath, fail, isInsideOrEqual, isLink } from '../../core/util/index.js';
7
+ /** Where the data lived before 1.6: per user, in the profile. Still pinned in config.json when it was there. */
8
+ export const OLD_DEFAULT_ROOT = '%LOCALAPPDATA%\\AgentSandbox';
9
+ /** The old per-user default, expanded (null when LOCALAPPDATA is not set). */
10
+ export function oldDefaultRoot(env = process.env) {
11
+ return env.LOCALAPPDATA ? path.join(env.LOCALAPPDATA, 'AgentSandbox') : null;
12
+ }
13
+ /** The shared default, expanded: %ProgramData%\AgentSandbox\users\<you>. */
14
+ export function sharedDefaultRoot(base = process.cwd()) {
15
+ return expandPath(DEFAULTS.storage.root, base);
16
+ }
17
+ /** The folder that holds one private storage folder per user. */
18
+ export function usersFolder(env = process.env) {
19
+ return path.join(machineRoot(env), 'users');
20
+ }
21
+ /** The per-user folder under the users folder that `root` is (or is inside), or null when it is elsewhere. */
22
+ export function privateFolderOf(root, env = process.env) {
23
+ const users = usersFolder(env);
24
+ const resolved = path.resolve(root);
25
+ if (!isInsideOrEqual(users, resolved) || resolved.toLowerCase() === path.resolve(users).toLowerCase())
26
+ return null;
27
+ const first = path.relative(path.resolve(users), resolved).split(path.sep)[0];
28
+ return path.join(users, first);
29
+ }
30
+ /** A folder with something in it (a missing folder, a file or an empty folder holds no data). */
31
+ export function holdsData(dir) {
32
+ try {
33
+ return fs.statSync(dir).isDirectory() && fs.readdirSync(dir).length > 0;
34
+ }
35
+ catch {
36
+ return false;
37
+ }
38
+ }
39
+ /**
40
+ * Creates the storage root when it is missing. Under %ProgramData%\AgentSandbox\users the folder is made private
41
+ * before anything is written in it (the users folder itself is created as you when no all-users install made it). A
42
+ * root elsewhere is made private when this call creates it.
43
+ */
44
+ export function ensureStorageRoot(root, protect, env = process.env) {
45
+ const priv = privateFolderOf(root, env);
46
+ if (fs.existsSync(root)) {
47
+ // Made by hand and still empty: private before anything lands in it.
48
+ if (priv && !holdsData(root))
49
+ protect(priv);
50
+ return;
51
+ }
52
+ if (!priv) {
53
+ // A root of your own choosing is made private too, but only when this call creates it (never an existing folder,
54
+ // so a tree that already holds files is not walked) and never a drive root.
55
+ const created = fs.mkdirSync(root, { recursive: true });
56
+ if (created && path.dirname(path.resolve(root)) !== path.resolve(root)) {
57
+ try {
58
+ protect(root);
59
+ }
60
+ catch {
61
+ // Drives without permissions (FAT, some network shares) cannot be made private: the folder is still used.
62
+ }
63
+ }
64
+ return;
65
+ }
66
+ fs.mkdirSync(path.dirname(priv), { recursive: true });
67
+ if (isLink(path.dirname(priv)))
68
+ fail('The folder ' + path.dirname(priv) + ' is a link.', 'Remove the link first.');
69
+ fs.mkdirSync(priv, { recursive: true });
70
+ try {
71
+ protect(priv);
72
+ }
73
+ catch (e) {
74
+ fail('Could not make ' + priv + ' private: ' + (e instanceof Error ? e.message : String(e)), 'Run sandbox storage move <folder> to keep your data somewhere else, or report this.');
75
+ }
76
+ fs.mkdirSync(root, { recursive: true });
77
+ }
@@ -3,12 +3,13 @@ import path from 'node:path';
3
3
  import { downloader, extractArchive, fetchJson, moveIntoPlace, stagingFolder } from '../../shared/download/index.js';
4
4
  import { safeRemove } from '../../shared/io/index.js';
5
5
  import { assertTestWritable } from '../test-guard.js';
6
+ import { hostDataFolder, hostDataRoot } from '../storage/index.js';
6
7
  import { z } from 'zod';
7
8
  import { assertNoLinks, errMsg, fileExists } from '../../core/util/index.js';
8
9
  // ---- conpty.dll -----------------------------------------------------------------------------------------------------
9
10
  /** Where the sandbox finds conpty.dll + OpenConsole.exe (guest/ptyhost.ts points ptyhost at it). */
10
11
  export function conptyDir(dataPath) {
11
- return path.join(dataPath, 'tools', 'conpty');
12
+ return path.join(hostDataFolder(dataPath, 'tools'), 'conpty');
12
13
  }
13
14
  const NUGET_CONPTY = 'https://api.nuget.org/v3-flatcontainer/microsoft.windows.console.conpty/';
14
15
  const NugetVersionsSchema = z.object({ versions: z.array(z.string()) });
@@ -22,7 +23,7 @@ const NugetCatalogSchema = z.object({ packageHash: z.string(), packageHashAlgori
22
23
  export async function ensureConpty(dataPath, refresh) {
23
24
  const dir = conptyDir(dataPath);
24
25
  assertTestWritable(dir);
25
- assertNoLinks(dataPath, dir);
26
+ assertNoLinks(hostDataRoot(dataPath), dir);
26
27
  if (fileExists(path.join(dir, 'conpty.dll')) && fileExists(path.join(dir, 'OpenConsole.exe')) && !refresh)
27
28
  return 'cached';
28
29
  const arch = process.arch === 'arm64' ? 'arm64' : 'x64';
@@ -17,6 +17,8 @@ declare const TerminalSettingsSchema: z.ZodObject<{
17
17
  * survive turning pwsh off and on). Pure: returns null when nothing changes.
18
18
  */
19
19
  export declare function withPwshProfile(settings: z.output<typeof TerminalSettingsSchema>, visible: boolean): z.output<typeof TerminalSettingsSchema> | null;
20
+ /** settings.json that makes new tabs read the current environment; null when it already does. Pure. */
21
+ export declare function withReloadEnvironment(settings: z.output<typeof TerminalSettingsSchema>): z.output<typeof TerminalSettingsSchema> | null;
20
22
  /**
21
23
  * Shows the PowerShell 7 profile once pwsh is installed in this data folder (and `allowed`, i.e. toolchains.pwsh is
22
24
  * not off), hides it otherwise. settings.json is written by the sandbox too: read with a size cap, through no links,
@@ -3,12 +3,14 @@
3
3
  import fs from 'node:fs';
4
4
  import path from 'node:path';
5
5
  import { downloader, githubAsset } from '../../shared/download/index.js';
6
- import { safeRemove } from '../../shared/io/index.js';
6
+ import { safeRemove, writeFileAtomic } from '../../shared/io/index.js';
7
7
  import { assertTestWritable } from '../test-guard.js';
8
+ import { hostDataFolder, hostDataRoot } from '../storage/index.js';
9
+ import { applyEdits, modify } from 'jsonc-parser';
8
10
  import { z } from 'zod';
9
11
  import { assertNoLinks, errMsg, fileExists, parseJsonc, writeJson } from '../../core/util/index.js';
10
12
  export function terminalDir(dataPath) {
11
- return path.join(dataPath, 'tools', 'terminal');
13
+ return path.join(hostDataFolder(dataPath, 'tools'), 'terminal');
12
14
  }
13
15
  export function terminalExe(dataPath) {
14
16
  return path.join(terminalDir(dataPath), 'WindowsTerminal.exe');
@@ -66,6 +68,13 @@ export function withPwshProfile(settings, visible) {
66
68
  list[at] = { ...list[at], hidden: !visible };
67
69
  return { ...settings, profiles: { ...profiles, list } };
68
70
  }
71
+ /** settings.json that makes new tabs read the current environment; null when it already does. Pure. */
72
+ export function withReloadEnvironment(settings) {
73
+ const compatibility = settings.compatibility;
74
+ if (compatibility?.reloadEnvironmentVariables === true)
75
+ return null;
76
+ return { ...settings, compatibility: { ...compatibility, reloadEnvironmentVariables: true } };
77
+ }
69
78
  /**
70
79
  * Shows the PowerShell 7 profile once pwsh is installed in this data folder (and `allowed`, i.e. toolchains.pwsh is
71
80
  * not off), hides it otherwise. settings.json is written by the sandbox too: read with a size cap, through no links,
@@ -74,13 +83,14 @@ export function withPwshProfile(settings, visible) {
74
83
  export function syncPwshProfile(dataPath, allowed) {
75
84
  const file = path.join(terminalDir(dataPath), 'settings', 'settings.json');
76
85
  assertTestWritable(file);
77
- assertNoLinks(dataPath, file);
86
+ assertNoLinks(hostDataRoot(dataPath), file);
78
87
  if (!fileExists(file) || fs.statSync(file).size > MAX_SETTINGS_BYTES)
79
88
  return;
80
- const visible = allowed && fileExists(path.join(dataPath, 'tools', 'pwsh', 'pwsh.exe'));
89
+ const visible = allowed && fileExists(path.join(hostDataFolder(dataPath, 'tools'), 'pwsh', 'pwsh.exe'));
81
90
  let parsed;
91
+ const text = fs.readFileSync(file, 'utf8');
82
92
  try {
83
- const result = TerminalSettingsSchema.safeParse(parseJsonc(fs.readFileSync(file, 'utf8'), file));
93
+ const result = TerminalSettingsSchema.safeParse(parseJsonc(text, file));
84
94
  if (!result.success)
85
95
  return;
86
96
  parsed = result.data;
@@ -88,9 +98,18 @@ export function syncPwshProfile(dataPath, allowed) {
88
98
  catch {
89
99
  return;
90
100
  }
91
- const next = withPwshProfile(parsed, visible);
92
- if (next)
93
- writeJson(file, next);
101
+ const withProfile = withPwshProfile(parsed, visible);
102
+ if (withProfile) {
103
+ writeJson(file, withReloadEnvironment(withProfile) ?? withProfile);
104
+ return;
105
+ }
106
+ // Only the reload switch is missing: set that one value in the text, so comments and the layout stay.
107
+ if (withReloadEnvironment(parsed)) {
108
+ const edits = modify(text, ['compatibility', 'reloadEnvironmentVariables'], true, {
109
+ formattingOptions: { insertSpaces: true, tabSize: 4 },
110
+ });
111
+ writeFileAtomic(file, applyEdits(text, edits));
112
+ }
94
113
  }
95
114
  export async function ensureTerminal(dataPath, refresh, options = {}) {
96
115
  const result = await installTerminal(dataPath, refresh);
@@ -112,9 +131,9 @@ const installTerminal = async (dataPath, refresh) => {
112
131
  const settings = path.join(dir, 'settings');
113
132
  // downloader.archive replaces tools\terminal: the portable settings folder waits here meanwhile (and goes back also
114
133
  // when the download fails). One still parked from an interrupted earlier run is the one to keep.
115
- const parked = path.join(dataPath, 'tools', 'terminal-settings.parked');
116
- assertNoLinks(dataPath, settings);
117
- assertNoLinks(dataPath, parked);
134
+ const parked = path.join(hostDataFolder(dataPath, 'tools'), 'terminal-settings.parked');
135
+ assertNoLinks(hostDataRoot(dataPath), settings);
136
+ assertNoLinks(hostDataRoot(dataPath), parked);
118
137
  if (fileExists(exe) && !refresh)
119
138
  return { exe, message: 'cached' };
120
139
  try {
@@ -140,7 +159,7 @@ const installTerminal = async (dataPath, refresh) => {
140
159
  fs.renameSync(parked, settings);
141
160
  }
142
161
  const settingsFile = path.join(settings, 'settings.json');
143
- assertNoLinks(dataPath, settingsFile);
162
+ assertNoLinks(hostDataRoot(dataPath), settingsFile);
144
163
  if (fileExists(path.join(dir, '.portable')) && !fs.existsSync(settingsFile))
145
164
  writeJson(settingsFile, SETTINGS);
146
165
  }
@@ -1,6 +1,6 @@
1
1
  export { type ReleaseInfo, type ReleaseSource, GithubReleases, FolderFeed, RELEASE_REPO } from './release-source.js';
2
2
  export { type SkipReason, type UpdateDecision, type DecisionInput, decideUpdate, isTooSoon } from './decision.js';
3
3
  export { UpdateStateFile, type UpdateState } from './update-state.js';
4
- export { updateNotice, type UpdateNotice } from './notice.js';
4
+ export { updateNotice, autoOffText, type UpdateNotice } from './notice.js';
5
5
  export { UpdateLock } from './update-lock.js';
6
6
  export { Updater, type UpdateResult, type RunOptions, type UpdaterOptions } from './updater.js';
@@ -1,6 +1,6 @@
1
1
  export { GithubReleases, FolderFeed, RELEASE_REPO } from './release-source.js';
2
2
  export { decideUpdate, isTooSoon } from './decision.js';
3
3
  export { UpdateStateFile } from './update-state.js';
4
- export { updateNotice } from './notice.js';
4
+ export { updateNotice, autoOffText } from './notice.js';
5
5
  export { UpdateLock } from './update-lock.js';
6
6
  export { Updater } from './updater.js';
@@ -4,6 +4,8 @@ export interface UpdateNotice {
4
4
  /** Identifies the outcome: the same key is never shown to the same user twice. */
5
5
  key: string;
6
6
  }
7
+ /** What a user is told when a failed install was undone and automatic updates were switched off. */
8
+ export declare function autoOffText(failedVersion: string, current: string): string;
7
9
  /**
8
10
  * `current` is the version that runs now. A success is announced while it is still the current version; a blocked
9
11
  * failure while the current version is older than the one that failed. When both exist, the newer outcome wins.
@@ -1,6 +1,14 @@
1
1
  // The one-line notice a user sees on their next command after an update ran without them: it worked, or it failed and
2
2
  // the old version stayed. Each user sees each outcome once (the caller remembers the key). Pure.
3
3
  import { compareVersions } from '../install/layout.js';
4
+ /** What a user is told when a failed install was undone and automatic updates were switched off. */
5
+ export function autoOffText(failedVersion, current) {
6
+ return ('The update to ' +
7
+ failedVersion +
8
+ ' failed and was undone (you are on ' +
9
+ current +
10
+ '). Automatic updates are off; turn them back on in Maintenance > Updates or with sandbox update --auto on.');
11
+ }
4
12
  /**
5
13
  * `current` is the version that runs now. A success is announced while it is still the current version; a blocked
6
14
  * failure while the current version is older than the one that failed. When both exist, the newer outcome wins.
@@ -10,8 +18,12 @@ export function updateNotice(state, current, seenKey) {
10
18
  const done = state.lastResult;
11
19
  if (done?.ok && done.version === current)
12
20
  candidates.push({ at: done.at, notice: { key: 'ok@' + done.at, text: 'Updated to ' + done.version + '.' } });
21
+ const off = state.autoOff;
22
+ if (off && compareVersions(off.version, current) > 0)
23
+ candidates.push({ at: off.at, notice: { key: 'auto-off@' + off.at, text: autoOffText(off.version, current) } });
13
24
  const failed = state.failed;
14
- if (failed && compareVersions(failed.version, current) > 0)
25
+ // The automatic-updates-off notice already tells about this failure.
26
+ if (failed && compareVersions(failed.version, current) > 0 && off?.version !== failed.version)
15
27
  candidates.push({
16
28
  at: failed.at,
17
29
  notice: {
@@ -7,6 +7,12 @@ declare const StateSchema: z.ZodObject<{
7
7
  at: z.ZodString;
8
8
  reason: z.ZodString;
9
9
  }, z.core.$strip>>;
10
+ autoOff: z.ZodOptional<z.ZodObject<{
11
+ version: z.ZodString;
12
+ current: z.ZodString;
13
+ reason: z.ZodString;
14
+ at: z.ZodString;
15
+ }, z.core.$strip>>;
10
16
  lastResult: z.ZodOptional<z.ZodObject<{
11
17
  version: z.ZodString;
12
18
  ok: z.ZodBoolean;
@@ -7,6 +7,8 @@ const StateSchema = z.object({
7
7
  lastCheck: z.string().optional(),
8
8
  previous: z.string().optional(),
9
9
  failed: z.object({ version: z.string(), at: z.string(), reason: z.string() }).optional(),
10
+ /** Why automatic updates were switched off: `version` failed to install and `current` was put back. */
11
+ autoOff: z.object({ version: z.string(), current: z.string(), reason: z.string(), at: z.string() }).optional(),
10
12
  lastResult: z.object({ version: z.string(), ok: z.boolean(), at: z.string() }).optional(),
11
13
  });
12
14
  export class UpdateStateFile {
@@ -7,6 +7,10 @@ export interface UpdaterOptions {
7
7
  /** How long to wait between two looks at GitHub (not for `force`). */
8
8
  minHoursBetweenChecks?: number;
9
9
  downloader?: Downloader;
10
+ /** The scheduled task of an all-users install: removed when a failed install turns automatic updates off. */
11
+ task?: {
12
+ remove(): void;
13
+ } | null;
10
14
  }
11
15
  export interface RunOptions {
12
16
  /** A sandbox runs on this PC: its files are in use, so nothing is installed. */
@@ -29,6 +33,10 @@ export type UpdateResult = {
29
33
  version: string;
30
34
  reason: string;
31
35
  blocked: boolean;
36
+ /** The previous version is active again (pointers and shims), or was never left. */
37
+ rolledBack: boolean;
38
+ /** This failure switched automatic updates off (they were on). */
39
+ autoUpdateOff: boolean;
32
40
  };
33
41
  export declare class Updater {
34
42
  private readonly layout;
@@ -37,12 +45,23 @@ export declare class Updater {
37
45
  private readonly now;
38
46
  private readonly minHours;
39
47
  private readonly downloader;
48
+ private readonly task;
40
49
  constructor(layout: InstallLayout, source?: ReleaseSource, options?: UpdaterOptions);
41
50
  /** Looks for a newer release (unless the time gate says not yet) and installs it if it is verified. */
42
51
  run(options: RunOptions): Promise<UpdateResult>;
43
52
  /** Points the shims back at the version the last successful update replaced. Returns that version. */
44
53
  rollback(): string;
45
54
  private install;
55
+ /** The commands a version's package.json declares, or null when it cannot be read. */
56
+ private binsOf;
57
+ /** Puts the previous version's pointers and shims back and drops shims only the new one had. False: it failed. */
58
+ private restore;
59
+ /**
60
+ * Switches automatic updates off in install.json (the scheduled task of an all-users install does nothing without
61
+ * it) and removes that task when this process may; a failure to remove it is not an error. Remembers why, for the
62
+ * notice. True when automatic updates were on.
63
+ */
64
+ private turnAutoUpdateOff;
46
65
  /** A release tarball: a local feed file is copied, GitHub is downloaded; either way the sha256 must match. */
47
66
  private download;
48
67
  /** The extracted package must be this package, at this version. Returns its commands. */
@@ -1,7 +1,7 @@
1
1
  // Installs a newer release next to the active one, checks that it starts (directly and through the shim), and only then
2
- // moves the pointers to it. Any failure leaves the active version as it was and deletes what was made. A fault of the
3
- // release itself (BadRelease) records the version as failed: it is not tried again until a newer one exists. Anything
4
- // else (the network, a locked file) is retried by the next check. A rollback moves the pointers back.
2
+ // moves the pointers to it. Any failure puts the previous version back (pointers and shims) and deletes what was made.
3
+ // A fault of the release itself (BadRelease) records the version as failed: it is not tried again until a newer one
4
+ // exists. A failed install also turns automatic updates off (`turnAutoUpdateOff`). A rollback moves the pointers back.
5
5
  import crypto from 'node:crypto';
6
6
  import fs from 'node:fs';
7
7
  import path from 'node:path';
@@ -14,6 +14,7 @@ import { SYSTEM } from '../../shared/system.js';
14
14
  import { safeRemove } from '../../shared/io/index.js';
15
15
  import { testWriteRefusal } from '../../shared/test-guard.js';
16
16
  import { refuseInSelfTest } from '../test-guard.js';
17
+ import { InstallRecordFile } from '../install/install-record.js';
17
18
  import { readBins, writeShims } from '../install/shims.js';
18
19
  import { decideUpdate } from './decision.js';
19
20
  import { GithubReleases } from './release-source.js';
@@ -38,6 +39,7 @@ export class Updater {
38
39
  now;
39
40
  minHours;
40
41
  downloader;
42
+ task;
41
43
  constructor(layout, source = new GithubReleases(), options = {}) {
42
44
  this.layout = layout;
43
45
  this.source = source;
@@ -45,6 +47,7 @@ export class Updater {
45
47
  this.now = options.now ?? (() => new Date());
46
48
  this.minHours = options.minHoursBetweenChecks ?? 24;
47
49
  this.downloader = options.downloader ?? new Downloader();
50
+ this.task = options.task ?? null;
48
51
  }
49
52
  /** Looks for a newer release (unless the time gate says not yet) and installs it if it is verified. */
50
53
  async run(options) {
@@ -78,6 +81,10 @@ export class Updater {
78
81
  fail('There is no earlier version to go back to.', 'Only a version an update replaced can be restored.');
79
82
  if (!this.layout.installedVersions().includes(target))
80
83
  fail(target + ' is no longer installed.', 'Install it again with the installer.');
84
+ // The shims of the target first (it may have other commands), then the pointers.
85
+ const bins = this.binsOf(target);
86
+ if (bins)
87
+ writeShims(this.layout, bins);
81
88
  this.layout.setActive(target, node);
82
89
  // The version we leave is now the one a second rollback returns to.
83
90
  this.state.update((s) => ({ ...s, previous: current }));
@@ -87,32 +94,42 @@ export class Updater {
87
94
  const version = release.version;
88
95
  const archive = path.join(this.layout.root, 'staging', version + '.tgz');
89
96
  const work = this.layout.versionDir(version) + '.staging';
90
- let activated = false;
97
+ const previousBins = this.binsOf(current);
98
+ let downloaded = false;
99
+ let shimsWritten = false;
100
+ let pointersMoved = false;
101
+ let newBins = {};
91
102
  try {
92
103
  await this.download(release, archive);
104
+ downloaded = true;
93
105
  safeRemove(work, this.layout.versionsDir);
94
106
  await extractArchive(archive, work).catch((e) => {
95
107
  throw new BadRelease('The release archive could not be unpacked: ' + errMsg(e));
96
108
  });
97
- const bins = this.checkPackage(work, version);
109
+ newBins = this.checkPackage(work, version);
98
110
  moveIntoPlace(work, this.layout.versionDir(version));
99
- writeShims(this.layout, bins);
111
+ shimsWritten = true;
112
+ writeShims(this.layout, newBins);
100
113
  this.checkEntry(version, node);
114
+ pointersMoved = true;
101
115
  this.layout.setActive(version, node);
102
- activated = true;
103
116
  this.checkShim(version);
104
117
  }
105
118
  catch (e) {
106
119
  const reason = errMsg(e);
107
- if (activated)
108
- this.layout.setActive(current, node);
120
+ const changed = pointersMoved || shimsWritten;
121
+ const rolledBack = changed ? this.restore(current, node, previousBins, newBins, pointersMoved) : true;
109
122
  this.discard(work, version);
110
123
  const blocked = e instanceof BadRelease;
111
124
  if (blocked)
112
125
  this.recordFailure(version, reason);
113
126
  else
114
127
  this.recordAttempt(version, false);
115
- return { kind: 'failed', version, reason, blocked };
128
+ // A plain network error before anything arrived changed nothing and says nothing about this release: the next
129
+ // check tries again. Every other failure is a failure of the install itself, so the machine must stop trying
130
+ // by itself until the user turns updates back on.
131
+ const autoUpdateOff = blocked || downloaded ? this.turnAutoUpdateOff(version, current, reason) : false;
132
+ return { kind: 'failed', version, reason, blocked, rolledBack, autoUpdateOff };
116
133
  }
117
134
  finally {
118
135
  try {
@@ -125,6 +142,65 @@ export class Updater {
125
142
  this.finish(version, current);
126
143
  return { kind: 'installed', version, previous: current };
127
144
  }
145
+ /** The commands a version's package.json declares, or null when it cannot be read. */
146
+ binsOf(version) {
147
+ try {
148
+ return readBins(JSON.parse(fs.readFileSync(path.join(this.layout.packageDir(version), 'package.json'), 'utf8')));
149
+ }
150
+ catch {
151
+ return null;
152
+ }
153
+ }
154
+ /** Puts the previous version's pointers and shims back and drops shims only the new one had. False: it failed. */
155
+ restore(current, node, previousBins, newBins, pointersMoved) {
156
+ let ok = true;
157
+ try {
158
+ if (pointersMoved)
159
+ this.layout.setActive(current, node);
160
+ }
161
+ catch {
162
+ ok = false;
163
+ }
164
+ try {
165
+ if (previousBins) {
166
+ writeShims(this.layout, previousBins);
167
+ for (const name of Object.keys(newBins))
168
+ if (!(name in previousBins))
169
+ for (const file of [name + '.cmd', name])
170
+ fs.rmSync(path.join(this.layout.binDir, file), { force: true });
171
+ }
172
+ }
173
+ catch {
174
+ ok = false;
175
+ }
176
+ return ok;
177
+ }
178
+ /**
179
+ * Switches automatic updates off in install.json (the scheduled task of an all-users install does nothing without
180
+ * it) and removes that task when this process may; a failure to remove it is not an error. Remembers why, for the
181
+ * notice. True when automatic updates were on.
182
+ */
183
+ turnAutoUpdateOff(version, current, reason) {
184
+ const record = new InstallRecordFile(this.layout.root);
185
+ const wasOn = record.read()?.autoUpdate === true;
186
+ try {
187
+ record.setAutoUpdate(false);
188
+ }
189
+ catch {
190
+ // The record is unwritable: a blocked version is still not retried, so the failure does not repeat.
191
+ }
192
+ try {
193
+ this.task?.remove();
194
+ }
195
+ catch {
196
+ // Needs admin: the task runs, sees autoUpdate false in install.json and does nothing.
197
+ }
198
+ if (wasOn) {
199
+ const at = this.now().toISOString();
200
+ this.state.update((s) => ({ ...s, autoOff: { version, current, reason, at } }));
201
+ }
202
+ return wasOn;
203
+ }
128
204
  /** A release tarball: a local feed file is copied, GitHub is downloaded; either way the sha256 must match. */
129
205
  async download(release, archive) {
130
206
  fs.mkdirSync(path.dirname(archive), { recursive: true });
@@ -170,7 +246,7 @@ export class Updater {
170
246
  /** The version starts with the private Node and prints its own version number. */
171
247
  checkEntry(version, node) {
172
248
  const entry = path.join(this.layout.packageDir(version), ENTRY);
173
- const run = spawnSync(this.layout.nodeExe(node), [entry, '--version'], {
249
+ const run = spawnSync(this.layout.nodeExe(node), [entry, '--version', '--short'], {
174
250
  encoding: 'utf8',
175
251
  windowsHide: true,
176
252
  timeout: CHECK_MS,
@@ -187,7 +263,7 @@ export class Updater {
187
263
  checkShim(version) {
188
264
  const shim = path.join(this.layout.binDir, 'sandbox.cmd');
189
265
  // /s takes off the outer quotes, so the quoted path (Program Files has a space) needs a pair around the whole line.
190
- const run = spawnSync(SYSTEM.cmd(), ['/d', '/s', '/c', '""' + shim + '" --version"'], {
266
+ const run = spawnSync(SYSTEM.cmd(), ['/d', '/s', '/c', '""' + shim + '" --version --short"'], {
191
267
  encoding: 'utf8',
192
268
  windowsHide: true,
193
269
  windowsVerbatimArguments: true,
@@ -0,0 +1,4 @@
1
+ export { VpnLogin, loginProblem, type LoginState, type VpnCredentials } from './login.js';
2
+ export { fetchBounded, findCountry, nordProfile, recommendedServer, type Fetcher, type NordServer } from './nordvpn.js';
3
+ export { prepareVpn, vpnNotes, wireguardFileProblem, type PrepareOptions } from './prepare.js';
4
+ export { hostPublicIp, readVpnLine, vpnLine, type VpnLine } from './status.js';
@@ -0,0 +1,4 @@
1
+ export { VpnLogin, loginProblem } from './login.js';
2
+ export { fetchBounded, findCountry, nordProfile, recommendedServer } from './nordvpn.js';
3
+ export { prepareVpn, vpnNotes, wireguardFileProblem } from './prepare.js';
4
+ export { hostPublicIp, readVpnLine, vpnLine } from './status.js';
@@ -0,0 +1,24 @@
1
+ import { type VpnProvider } from '../../core/schema/index.js';
2
+ import { SecretStore } from '../secrets/index.js';
3
+ export interface VpnCredentials {
4
+ readonly username: string;
5
+ readonly password: string;
6
+ }
7
+ /** What `sandbox vpn status` may say about the login: never the values. */
8
+ export type LoginState = 'none' | 'saved' | 'unreadable';
9
+ /** The login must go on two lines of a file for OpenVPN, so no line breaks or other control characters. */
10
+ export declare function loginProblem(c: VpnCredentials): string | null;
11
+ export declare class VpnLogin {
12
+ private readonly storageRoot;
13
+ private readonly secrets;
14
+ constructor(storageRoot: string, secrets?: SecretStore);
15
+ private file;
16
+ /** Encrypts and saves the login (replacing an earlier one). */
17
+ save(provider: VpnProvider, login: VpnCredentials): void;
18
+ /** The login, decrypted. Only the launch calls this. */
19
+ read(provider: VpnProvider): VpnCredentials | null;
20
+ /** Whether a login is saved and can be decrypted by this Windows user (the values are never returned). */
21
+ state(provider: VpnProvider): LoginState;
22
+ savedAt(provider: VpnProvider): string | null;
23
+ remove(provider: VpnProvider): boolean;
24
+ }