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,50 @@
1
+ import { invoke, NO_QUESTIONS, onSurface, } from './kernel/index.js';
2
+ import { hideWindowRun, sandboxStatusRun, showWindowRun, stopSandboxRun } from './features/sandbox/index.js';
3
+ import { listSessionsRun, restartSessionsRun } from './features/sessions/index.js';
4
+ import { getSettingRun, listSettingsRun, resetSettingRun, setSettingRun } from './features/settings/index.js';
5
+ export const IMPLEMENTATIONS = [
6
+ sandboxStatusRun,
7
+ showWindowRun,
8
+ hideWindowRun,
9
+ stopSandboxRun,
10
+ listSessionsRun,
11
+ restartSessionsRun,
12
+ listSettingsRun,
13
+ getSettingRun,
14
+ setSettingRun,
15
+ resetSettingRun,
16
+ ];
17
+ export function implementationOf(id) {
18
+ return IMPLEMENTATIONS.find((i) => i.def.id === id);
19
+ }
20
+ /** Runs a definition by id: input checked before, output checked after. */
21
+ export function runDefinition(id, ctx, input, io) {
22
+ const impl = implementationOf(id);
23
+ if (!impl)
24
+ throw new Error('No implementation for ' + id);
25
+ return invoke(impl, ctx, input, io);
26
+ }
27
+ /** Reads a query in-process (the menu): typed output, and no questions. */
28
+ export async function readQuery(def, ctx, input = {}) {
29
+ return (await runDefinition(def.id, ctx, input, NO_QUESTIONS));
30
+ }
31
+ /** What the web server may run: the registered definitions whose surfaces include the web. */
32
+ export function createRpcHost(ctx) {
33
+ const allowed = (id) => {
34
+ const impl = implementationOf(id);
35
+ return impl && onSurface(impl.def, 'web') ? impl : undefined;
36
+ };
37
+ return {
38
+ kind: (id) => allowed(id)?.def.kind,
39
+ liveMs: (id) => {
40
+ const def = allowed(id)?.def;
41
+ return def?.kind === 'query' ? def.live?.everyMs : undefined;
42
+ },
43
+ run: (id, input, io) => {
44
+ const impl = allowed(id);
45
+ if (!impl)
46
+ throw new Error('Not allowed on the web: ' + id);
47
+ return invoke(impl, ctx, input, io);
48
+ },
49
+ };
50
+ }
@@ -3,6 +3,8 @@ export interface CliOptions {
3
3
  command: string;
4
4
  positionals: string[];
5
5
  passthrough: string[];
6
+ /** The options as commander parsed them, by attribute name (operation commands build their input from these). */
7
+ raw: Readonly<Record<string, unknown>>;
6
8
  config?: string;
7
9
  workspace?: string;
8
10
  harness?: string;
@@ -25,8 +27,15 @@ export interface CliOptions {
25
27
  accountTo?: string;
26
28
  noRestart: boolean;
27
29
  follow: boolean;
30
+ crash: boolean;
28
31
  json: boolean;
29
32
  yes: boolean;
33
+ /** sessions --wide: also the folder column. */
34
+ wide: boolean;
35
+ /** storage move: keep the old folder (copy instead of rename). */
36
+ keepOld: boolean;
37
+ /** config export: keep folders and files of this PC in the file. */
38
+ withPaths: boolean;
30
39
  timeout: number;
31
40
  days: number;
32
41
  /** restart: every session, not only this folder's project's. */
@@ -38,6 +47,8 @@ export interface CliOptions {
38
47
  grep?: string;
39
48
  /** migrate --dry-run, and --restore <backup folder>. */
40
49
  dryRun: boolean;
50
+ /** doctor --fix: repair what it finds without asking. */
51
+ fix: boolean;
41
52
  restore?: string;
42
53
  /** resume --auto: called by the background watcher after a crash. */
43
54
  auto: boolean;
@@ -62,7 +73,12 @@ export declare function splitArgs(text: string): string[];
62
73
  * `cwd`. Pure; validate.ts checks that the agent and folder exist.
63
74
  */
64
75
  export declare function parseSessionWant(input: string, cwd?: string): SessionWant;
65
- /** Every command, its options and help text, from manifest.ts. Actions only record what was parsed. */
66
- export declare function buildProgram(record: (name: string, cmd: Command) => void): Command;
76
+ /** "Unknown command" with the suggestion in our words; other commander errors only lose the lower-case start. */
77
+ export declare function friendlyError(text: string): string;
78
+ /**
79
+ * Every command, its options and help text, from manifest.ts. Actions only record what was parsed. `wrapper` = the
80
+ * sandbox <agent> spelling: --agent stays the agent's own flag there (Claude has one), only --harness is ours.
81
+ */
82
+ export declare function buildProgram(record: (name: string, cmd: Command) => void, wrapper?: boolean): Command;
67
83
  /** Parses argv into the command name and options. Throws commander errors for unknown commands/options. */
68
84
  export declare function parseCli(argv: string[], wrapper?: boolean): CliOptions;
package/dist/cli/args.js CHANGED
@@ -2,9 +2,10 @@
2
2
  // dispatches the result. sandbox claude & co parse as `launch`: every option launch does not own goes to the agent, in
3
3
  // order.
4
4
  import path from 'node:path';
5
- import { Command, InvalidArgumentError, Option } from 'commander';
5
+ import { Argument, Command, InvalidArgumentError, Option } from 'commander';
6
6
  import { fail } from '../core/util/index.js';
7
7
  import { c } from './output/index.js';
8
+ import { insideSandbox } from '../host/sandbox/index.js';
8
9
  import { COMMANDS } from './manifest.js';
9
10
  import { packageVersion } from '../core/package-info.js';
10
11
  /** Splits a command line like a shell: "quoted words" and 'quoted words' stay together. */
@@ -38,45 +39,109 @@ function positiveNumber(value) {
38
39
  function collect(value, previous = []) {
39
40
  return [...previous, value];
40
41
  }
41
- /** One commander option from its manifest entry. */
42
- function toOption(o) {
43
- const flags = (o.short ? o.short + ', ' : '') + o.flag + (o.type === 'boolean' ? '' : ' <' + (o.value ?? 'value') + '>');
44
- const option = new Option(flags, o.description);
45
- if (o.type === 'number')
46
- option.argParser(positiveNumber);
47
- if (o.type === 'list')
48
- option.argParser(collect);
49
- if (o.default !== undefined)
50
- option.default(o.default);
51
- return option;
42
+ /** Commands in --help, group by group, in this order (a command not listed comes last in its group). */
43
+ const HELP_ORDER = [
44
+ ['Agents', ['launch', 'start', 'resume', 'restart', 'stop', 'host']],
45
+ ['Sessions', ['sessions', 'attach', 'status', 'exec', 'show', 'hide', 'db']],
46
+ ['Projects & accounts', ['projects', 'account']],
47
+ ['Data', ['data', 'storage', 'clean', 'sync']],
48
+ ['Web', ['web']],
49
+ ['Health', ['setup', 'doctor', 'repair', 'logs', 'audit', 'update', 'migrate', 'config']],
50
+ ['Advanced', ['generate', 'agent-commands', 'vpn']],
51
+ ];
52
+ /** The commands in the order --help lists them. */
53
+ function helpOrdered() {
54
+ const flat = HELP_ORDER.flatMap(([, names]) => names);
55
+ const rank = (name) => {
56
+ const i = flat.indexOf(name);
57
+ return i < 0 ? flat.length : i;
58
+ };
59
+ return [...COMMANDS].sort((x, y) => rank(x.name) - rank(y.name));
60
+ }
61
+ /** The options of one manifest entry: the visible one, and a hidden old spelling when `shownAs` renames it. */
62
+ function toOptions(o, wrapper) {
63
+ const shown = o.shownAs && !wrapper ? o.shownAs : o.flag;
64
+ const placeholder = o.type === 'boolean' ? '' : ' <' + (o.value ?? 'value') + '>';
65
+ const make = (flag) => {
66
+ const option = new Option((o.short ? o.short + ', ' : '') + flag + placeholder, o.description);
67
+ if (o.type === 'number')
68
+ option.argParser(positiveNumber);
69
+ if (o.type === 'list')
70
+ option.argParser(collect);
71
+ if (o.default !== undefined)
72
+ option.default(o.default);
73
+ if (o.group)
74
+ option.helpGroup(o.group + ':');
75
+ return option;
76
+ };
77
+ const visible = make(shown);
78
+ return shown === o.flag ? [visible] : [visible, make(o.flag).hideHelp()];
52
79
  }
53
- /** Every command, its options and help text, from manifest.ts. Actions only record what was parsed. */
54
- export function buildProgram(record) {
80
+ /** A positional argument; fixed choices are checked by the parser and listed in --help. */
81
+ function toArgument(arg) {
82
+ const name = (arg.required ? '<' : '[') + arg.name + (arg.variadic ? '...' : '') + (arg.required ? '>' : ']');
83
+ const argument = new Argument(name, arg.description);
84
+ if (Array.isArray(arg.choices)) {
85
+ argument.choices(arg.choices);
86
+ const aliases = arg.aliases ?? [];
87
+ const check = argument.parseArg;
88
+ if (aliases.length && check)
89
+ argument.argParser((value, previous) => aliases.includes(value) ? value : check(value, previous));
90
+ }
91
+ return argument;
92
+ }
93
+ /** "Unknown command" with the suggestion in our words; other commander errors only lose the lower-case start. */
94
+ export function friendlyError(text) {
95
+ const m = /^error: unknown command '(.*)'\n\(Did you mean (.*)\?\)\n?$/.exec(text);
96
+ if (m) {
97
+ const names = m[2].replace(/^one of /, '').split(', ');
98
+ return 'Unknown command "' + m[1] + '". Did you mean: ' + names.map((n) => 'sandbox ' + n).join(' or ') + '?\n';
99
+ }
100
+ return text.replace(/^error: /, '').replace(/^./, (ch) => ch.toUpperCase());
101
+ }
102
+ function rootHelp() {
103
+ const lines = [
104
+ '',
105
+ 'Start an agent by name: sandbox claude, sandbox codex ... (the same as sandbox launch --agent <name>).',
106
+ 'Put --config <file> before or after the command to use another settings file.',
107
+ ];
108
+ if (insideSandbox())
109
+ lines.push('You are inside a sandbox: launch, resume, attach, restart, stop, exec, show, hide, storage and web control it from your PC and do not work here.');
110
+ lines.push('', 'Examples:', ' sandbox the menu', ' sandbox claude -t start Claude and attach this terminal', ' sandbox data clean logs delete the saved logs', ' sandbox exec -- npm test run a command in the running sandbox');
111
+ return lines.join('\n');
112
+ }
113
+ /**
114
+ * Every command, its options and help text, from manifest.ts. Actions only record what was parsed. `wrapper` = the
115
+ * sandbox <agent> spelling: --agent stays the agent's own flag there (Claude has one), only --harness is ours.
116
+ */
117
+ export function buildProgram(record, wrapper = false) {
55
118
  const program = new Command('sandbox')
56
119
  .description('A disposable Windows Sandbox for development, with or without an AI agent, for the folder you are in. Run it with no arguments for the menu.')
57
120
  .version(packageVersion(), '-v, --version', 'show the version')
58
121
  .enablePositionalOptions()
59
122
  .showHelpAfterError(' Fix: run the command with --help to see how to use it.')
60
- .configureOutput({
61
- outputError: (text, write) => write(c.red('Error: ') + text.replace(/^error: /, '').replace(/^./, (ch) => ch.toUpperCase())),
62
- })
63
- .addHelpText('after', '\nPut --config <file> before or after the command to use another settings file.\nExamples:\n sandbox the menu\n sandbox claude -t start Claude and attach this terminal\n sandbox data clean logs delete the saved logs\n sandbox exec -- npm test run a command in the running sandbox')
123
+ .configureOutput({ outputError: (text, write) => write(c.red('Error: ') + friendlyError(text)) })
124
+ .addHelpText('after', rootHelp)
64
125
  .exitOverride();
65
- for (const spec of COMMANDS) {
126
+ for (const spec of helpOrdered()) {
66
127
  const cmd = program
67
128
  .command(spec.name, { hidden: spec.hidden })
68
129
  .description(spec.summary)
69
- .option('--config <file>', 'config file (default: ~/.agent-sandbox/config.json)');
130
+ .helpGroup(spec.group + ':')
131
+ .addOption(new Option('--config <file>', 'config file (default: ~/.agent-sandbox/config.json)').hideHelp());
70
132
  for (const option of spec.options)
71
- cmd.addOption(toOption(option));
133
+ for (const o of toOptions(option, wrapper))
134
+ cmd.addOption(o);
72
135
  if (spec.json)
73
136
  cmd.option('--json', 'machine-readable output');
74
137
  for (const arg of spec.args)
75
- cmd.argument((arg.required ? '<' : '[') + arg.name + (arg.variadic ? '...' : '') + (arg.required ? '>' : ']'), arg.description);
138
+ cmd.addArgument(toArgument(arg));
76
139
  if (spec.passthrough === 'agent')
77
140
  cmd.argument('[agentArgs...]', 'passed to the agent').allowUnknownOption().allowExcessArguments();
78
141
  if (spec.passthrough === 'command')
79
142
  cmd.passThroughOptions();
143
+ if (spec.examples?.length)
144
+ cmd.addHelpText('after', '\nExamples:\n' + spec.examples.map((l) => ' ' + l).join('\n'));
80
145
  cmd.action((...args) => record(spec.name, args[args.length - 1]));
81
146
  }
82
147
  return program;
@@ -99,7 +164,7 @@ export function parseCli(argv, wrapper = false) {
99
164
  let parsed = null;
100
165
  const program = buildProgram((name, cmd) => {
101
166
  parsed = { name, cmd };
102
- });
167
+ }, wrapper);
103
168
  const launchFlags = new Set(program.commands
104
169
  .find((c) => c.name() === 'launch')
105
170
  .options.map((o) => o.long)
@@ -121,9 +186,10 @@ export function parseCli(argv, wrapper = false) {
121
186
  command: name === 'start' ? 'launch' : name,
122
187
  positionals: forAgent || name === 'exec' ? [] : operands,
123
188
  passthrough: forAgent || name === 'exec' ? operands : [],
189
+ raw: o,
124
190
  config: o.config,
125
191
  workspace: o.workspace,
126
- harness: o.harness,
192
+ harness: o.harness ?? (name !== 'account' && typeof o.agent === 'string' ? o.agent : undefined),
127
193
  account: o.account,
128
194
  node: o.node,
129
195
  python: o.python,
@@ -144,8 +210,12 @@ export function parseCli(argv, wrapper = false) {
144
210
  accountTo: name === 'account' && typeof o.to === 'string' ? o.to : undefined,
145
211
  noRestart: o.restart === false,
146
212
  follow: Boolean(o.follow),
213
+ crash: Boolean(o.crash),
147
214
  json: Boolean(o.json),
148
215
  yes: Boolean(o.yes),
216
+ wide: Boolean(o.wide),
217
+ keepOld: Boolean(o.keepOld),
218
+ withPaths: Boolean(o.withPaths),
149
219
  all: Boolean(o.all),
150
220
  sessions: (o.session ?? []).map((s) => parseSessionWant(s)),
151
221
  timeout: o.timeout ?? 600,
@@ -153,6 +223,7 @@ export function parseCli(argv, wrapper = false) {
153
223
  kind: o.kind,
154
224
  grep: o.grep,
155
225
  dryRun: Boolean(o.dryRun),
226
+ fix: Boolean(o.fix),
156
227
  auto: o.auto === true,
157
228
  restore: o.restore,
158
229
  check: Boolean(o.check),
@@ -175,6 +246,7 @@ function defaults() {
175
246
  command: '',
176
247
  positionals: [],
177
248
  passthrough: [],
249
+ raw: {},
178
250
  scripts: [],
179
251
  databases: [],
180
252
  terminal: false,
@@ -186,13 +258,18 @@ function defaults() {
186
258
  fromHost: false,
187
259
  noRestart: false,
188
260
  follow: false,
261
+ crash: false,
189
262
  dryRun: false,
263
+ fix: false,
190
264
  auto: false,
191
265
  check: false,
192
266
  rollback: false,
193
267
  unattended: false,
194
268
  json: false,
195
269
  yes: false,
270
+ wide: false,
271
+ keepOld: false,
272
+ withPaths: false,
196
273
  all: false,
197
274
  sessions: [],
198
275
  timeout: 600,
@@ -1,6 +1,7 @@
1
1
  // `account list | save | use | default | rename | remove [--agent <name>]`
2
+ import { askChoice, askName, askRequired } from '../../core/prompt.js';
2
3
  import { fail, safeText } from '../../core/util/index.js';
3
- import { printJson, table } from '../output/index.js';
4
+ import { nextStep, printJson, table } from '../output/index.js';
4
5
  import { AccountsService } from '../services/index.js';
5
6
  function label(a) {
6
7
  return '"' + a.name + '"' + (a.email ? ' (' + a.email + ')' : '');
@@ -31,38 +32,65 @@ function list(ctx, accounts, agent) {
31
32
  return 0;
32
33
  }
33
34
  async function use(ctx, accounts, name, agent) {
34
- console.log('Sandbox now uses ' + label(accounts.activate(name, agent)) + '.');
35
+ const used = accounts.activate(name, agent);
36
+ console.log('Sandbox now uses ' + label(used) + '.');
37
+ if (used.note)
38
+ console.log(safeText(used.note));
35
39
  if (accounts.hasRunningSessions(agent) && !ctx.options.noRestart)
36
40
  console.log(safeText(await accounts.restart(agent)) + ' with --continue; the conversation carries on under the new account.');
37
41
  return 0;
38
42
  }
43
+ /** The account the command is about: the one typed, or one picked from the saved accounts. */
44
+ async function accountName(accounts, action, agent, given) {
45
+ if (given)
46
+ return given;
47
+ const usage = 'Usage: sandbox account ' + action + ' <name>';
48
+ if (action === 'save')
49
+ return askName('Name for this login:', usage, (v) => v.length > 0 || 'Type a name.');
50
+ const rows = accounts.list(agent);
51
+ if (!rows.length)
52
+ fail('No saved accounts.', 'Sign in inside the sandbox, then run: sandbox account save <name>');
53
+ return askChoice('Which account?', rows.map((a) => ({ name: safeText(label(a)), value: a.name })), usage);
54
+ }
55
+ async function remove(ctx, accounts, name, agent) {
56
+ const sure = ctx.options.yes ||
57
+ (await askRequired('Remove the saved account "' + name + '"? Its login cannot be recovered; you would sign in again.', 'Add --yes to remove it without asking.'));
58
+ if (!sure) {
59
+ console.log('Nothing removed.');
60
+ return 1;
61
+ }
62
+ accounts.remove(name, agent);
63
+ console.log('Removed account ' + name + '.');
64
+ return 0;
65
+ }
39
66
  export async function account(ctx) {
40
- const [action = 'list', name] = ctx.options.positionals;
41
- const newName = ctx.options.accountTo;
67
+ const [action = 'list', given] = ctx.options.positionals;
42
68
  const agent = ctx.options.accountAgent ?? 'claude';
43
69
  const accounts = new AccountsService(ctx);
44
- const needName = () => name ?? fail('Missing account name.', 'Usage: sandbox account ' + action + ' <name>');
70
+ if (action === 'list')
71
+ return list(ctx, accounts, agent);
72
+ const name = await accountName(accounts, action, agent, given);
45
73
  switch (action) {
46
- case 'list':
47
- return list(ctx, accounts, agent);
48
74
  case 'save':
49
- console.log('Saved account ' + label(accounts.save(needName(), Boolean(ctx.options.fromHost), agent)) + '.');
75
+ console.log('Saved account ' + label(accounts.save(name, Boolean(ctx.options.fromHost), agent)) + '.');
76
+ nextStep('sandbox account use ' + name + ' (the sandbox uses it)');
50
77
  return 0;
51
78
  case 'use':
52
- return use(ctx, accounts, needName(), agent);
79
+ return use(ctx, accounts, name, agent);
53
80
  case 'default':
54
- accounts.setDefault(needName(), agent);
81
+ accounts.setDefault(name, agent);
55
82
  console.log('Default account: ' + name);
56
83
  return 0;
57
- case 'rename':
58
- accounts.rename(needName(), newName ?? fail('Missing the new name.', 'Usage: sandbox account rename <name> --to <new-name>'), agent);
59
- console.log('Renamed account ' + name + ' to ' + newName);
84
+ case 'rename': {
85
+ const to = ctx.options.accountTo ??
86
+ (await askName('New name for "' + name + '":', 'Usage: sandbox account rename <name> --to <new-name>', (v) => v.length > 0 || 'Type a name.'));
87
+ accounts.rename(name, to, agent);
88
+ console.log('Renamed account ' + name + ' to ' + to + '.');
60
89
  return 0;
90
+ }
61
91
  case 'remove':
62
- accounts.remove(needName(), agent);
63
- console.log('Removed account ' + name);
64
- return 0;
92
+ return remove(ctx, accounts, name, agent);
65
93
  default:
66
- fail('Unknown account action "' + action + '".', 'Use one of: sandbox account list | save <name> | use <name> | default <name> | rename <name> --to <new-name> | remove <name>');
94
+ return fail('Unknown account action "' + action + '".', 'Use one of: sandbox account list | save <name> | use <name> | default <name> | rename <name> --to <new-name> | remove <name>');
67
95
  }
68
96
  }
@@ -15,6 +15,8 @@ export interface Context {
15
15
  borrowed?: Borrowed;
16
16
  }
17
17
  export declare function createContext(packageRoot: string, entry: string, options: CliOptions): Context;
18
+ /** Reads the config again and takes the storage folder from it (after a migration or a move changed it). */
19
+ export declare function refreshStorage(ctx: Context): void;
18
20
  /** For commands that control the sandbox from your PC: inside the sandbox they make no sense. */
19
21
  export declare function requireOnPc(what: string): void;
20
22
  export declare function requireRunning(hint?: string): void;
@@ -36,14 +36,21 @@ export function createContext(packageRoot, entry, options) {
36
36
  dataPath: insideSandbox() ? GUEST_DATA_DIR : path.join(storageRoot, 'data', loaded.config.storage.dataName),
37
37
  };
38
38
  }
39
+ /** Reads the config again and takes the storage folder from it (after a migration or a move changed it). */
40
+ export function refreshStorage(ctx) {
41
+ ctx.loaded = loadConfig(ctx.options.config);
42
+ ctx.storageRoot = expandPath(ctx.loaded.config.storage.root, ctx.loaded.base);
43
+ if (!insideSandbox())
44
+ ctx.dataPath = path.join(ctx.storageRoot, 'data', ctx.loaded.config.storage.dataName);
45
+ }
39
46
  /** For commands that control the sandbox from your PC: inside the sandbox they make no sense. */
40
47
  export function requireOnPc(what) {
41
48
  if (insideSandbox())
42
- fail('You are inside the sandbox already, so "sandbox ' + what + '" has nothing to control.', 'Run it from a terminal on your PC.');
49
+ fail('You are inside the sandbox already, so "sandbox ' + what + '" has nothing to control.', 'Run it from a terminal on your PC. Inside the sandbox these work: sandbox status, sessions, config, data, db, doctor, logs.');
43
50
  }
44
51
  export function requireRunning(hint = '') {
45
52
  if (!isSandboxRunning())
46
- fail('No Windows Sandbox is running.', hint || 'Start one with sandbox claude.');
53
+ fail('No Windows Sandbox is running.', hint || 'Start one: sandbox start (no agent) or sandbox claude.');
47
54
  }
48
55
  /**
49
56
  * Maps a folder on this PC to its path inside the running sandbox (only folders inside the mapped workspace exist
@@ -1,13 +1,34 @@
1
1
  // `sandbox data clean`: asks, then removes the folders the targets name (DataService does the work).
2
2
  import { humanBytes } from '../../../core/disk.js';
3
- import { askTyped, askYesNo } from '../../../core/prompt.js';
3
+ import { askChoices, askRequired, askTyped } from '../../../core/prompt.js';
4
4
  import { fail } from '../../../core/util/index.js';
5
- import { table } from '../../output/index.js';
5
+ import { nextStep, table, working } from '../../output/index.js';
6
6
  import { DataService } from '../../services/index.js';
7
+ import { cleanTargetOf } from './collect.js';
7
8
  export { resolveCleanTargets } from '../../services/index.js';
9
+ /** No target typed: a list of what can be cleaned, with sizes, to tick from (a terminal is needed). */
10
+ async function pickTargets(service) {
11
+ const fix = 'Name them: sandbox data clean logs tools/go (what exists: sandbox data)';
12
+ if (!process.stdin.isTTY)
13
+ fail('Which data should be cleaned?', fix);
14
+ const rows = await working('Measuring the saved data (big folders take a moment)', () => service.entries());
15
+ const choices = rows.flatMap((e) => {
16
+ const target = cleanTargetOf(e);
17
+ return target ? [{ name: target.padEnd(28) + humanBytes(e.bytes), value: target }] : [];
18
+ });
19
+ if (!choices.length)
20
+ return [];
21
+ return askChoices('What do you want to delete? (space ticks, enter confirms)', choices, fix);
22
+ }
8
23
  export async function dataClean(ctx) {
9
24
  const service = new DataService(ctx);
10
- const { targets, present: sized, totalBytes: total } = service.plan(ctx.options.positionals.slice(1));
25
+ const typed = ctx.options.positionals.slice(1);
26
+ const inputs = typed.length ? typed : await pickTargets(service);
27
+ if (!inputs.length) {
28
+ console.log('Nothing chosen, nothing removed.');
29
+ return 0;
30
+ }
31
+ const { targets, present: sized, totalBytes: total } = service.plan(inputs);
11
32
  if (!sized.length) {
12
33
  console.log('Nothing to remove: ' + targets.map((t) => t.target).join(', ') + ' do(es) not exist.');
13
34
  return 0;
@@ -20,18 +41,20 @@ export async function dataClean(ctx) {
20
41
  if (!yes) {
21
42
  const ok = sized.some((t) => t.target === 'all')
22
43
  ? await askTyped('This cannot be undone; the next sandbox starts from scratch and reinstalls everything.', 'all')
23
- : await askYesNo('Delete ' + sized.map((t) => t.target).join(', ') + ' (' + humanBytes(total) + ')? This cannot be undone.');
44
+ : await askRequired('Delete ' + sized.map((t) => t.target).join(', ') + ' (' + humanBytes(total) + ')? This cannot be undone.', 'Add --yes to delete without asking.');
24
45
  if (!ok) {
25
- console.log('Nothing removed.' + (process.stdin.isTTY ? '' : ' Pass --yes to confirm without a prompt.'));
46
+ console.log('Nothing removed.');
26
47
  return 1;
27
48
  }
28
49
  }
29
50
  const outcome = service.clean({ targets, present: sized, totalBytes: total });
30
- console.log('Freed ' +
31
- humanBytes(outcome.freedBytes) +
32
- '. ' +
33
- (outcome.touchedData ? 'The next sandbox reinstalls what it needs.' : ''));
34
51
  if (outcome.failed.length)
35
52
  fail('Could not remove everything: ' + outcome.failed.join('; '), 'Close programs using those folders and run the same command again.');
53
+ console.log('Removed ' +
54
+ sized.map((t) => t.target).join(', ') +
55
+ ' and freed ' +
56
+ humanBytes(outcome.freedBytes) +
57
+ (outcome.touchedData ? '; the next sandbox reinstalls what it needs.' : '.'));
58
+ nextStep('sandbox data (see what is left)');
36
59
  return 0;
37
60
  }
@@ -0,0 +1,2 @@
1
+ import type { Context } from './context.js';
2
+ export declare function engine(ctx: Context): Promise<number>;
@@ -0,0 +1,60 @@
1
+ // `sandbox engine`: the engine in use and, for each engine, what it can do and whether this PC can run it.
2
+ import { fail } from '../../core/util/index.js';
3
+ import { engineReports } from '../../host/engines/index.js';
4
+ import { c, printJson, table } from '../output/index.js';
5
+ const CAPABILITY_NAMES = {
6
+ desktop: 'desktop window',
7
+ gpu: 'GPU',
8
+ clipboard: 'clipboard',
9
+ audio: 'audio',
10
+ video: 'camera',
11
+ printers: 'printers',
12
+ liveFolderAdd: 'add folders while running',
13
+ attachedDisks: 'attached disks',
14
+ multipleInstances: 'several at once',
15
+ hvsocket: 'Hyper-V sockets',
16
+ };
17
+ /** sandbox engine check <engine>: the reasons and the exact commands, in plain words. Nothing is run or changed. */
18
+ async function checkEngine(ctx, name) {
19
+ const report = (await engineReports(ctx.loaded.config)).find((r) => r.id === name);
20
+ if (!report)
21
+ return fail('Unknown engine: ' + name, 'Use windows-sandbox or hcs.');
22
+ if (printJson(ctx, report))
23
+ return report.check.available ? 0 : 1;
24
+ if (report.check.available) {
25
+ console.log(c.green(name + ' can be used on this PC.'));
26
+ if (name === 'hcs')
27
+ console.log('HCS is in alpha: starting it is not enabled yet (docs/design/engines.md).');
28
+ return 0;
29
+ }
30
+ console.log(c.yellow(name + ' cannot be used on this PC yet:'));
31
+ report.check.reasons.forEach((reason, i) => {
32
+ console.log('\n ' + (i + 1) + '. ' + reason);
33
+ console.log(' To fix: ' + (report.check.fixes[i] ?? 'see docs/design/engines.md'));
34
+ });
35
+ console.log('\nNothing was changed. These commands change Windows, so they are yours to run (or not).');
36
+ return 1;
37
+ }
38
+ export async function engine(ctx) {
39
+ const [action = 'show', name = 'hcs'] = ctx.options.positionals;
40
+ if (action === 'check')
41
+ return checkEngine(ctx, name);
42
+ const reports = await engineReports(ctx.loaded.config);
43
+ const using = reports.find((r) => r.inUse);
44
+ if (printJson(ctx, { engine: using?.id, engines: reports }))
45
+ return 0;
46
+ console.log('Engine in use: ' + (using?.id ?? ctx.loaded.config.sandbox.engine) + ' (setting: sandbox.engine)');
47
+ for (const report of reports) {
48
+ console.log('\n' + report.id + (report.inUse ? ' (in use)' : ''));
49
+ console.log(' ' + (report.check.available ? c.green('can be used on this PC') : c.yellow('cannot be used yet')));
50
+ for (const reason of report.check.reasons)
51
+ console.log(' ' + reason);
52
+ for (const fix of report.check.fixes)
53
+ console.log(' Fix: ' + fix);
54
+ table(Object.entries(CAPABILITY_NAMES).map(([key, name]) => [
55
+ ' ' + name,
56
+ report.capabilities[key] ? 'yes' : 'no',
57
+ ]));
58
+ }
59
+ return 0;
60
+ }
@@ -2,8 +2,9 @@ export { createContext, type Context } from './context.js';
2
2
  export { launch } from './launch/index.js';
3
3
  export { setup } from './setup/index.js';
4
4
  export { data } from './data/index.js';
5
+ export { storage, storageBeforeCommand } from './storage/index.js';
5
6
  export { repairCommand } from './repair/index.js';
6
- export { attach, db, exec, hide, show, restart, stop, sessions, status } from './sessions/index.js';
7
+ export { attach, db, exec } from './sessions/index.js';
7
8
  export { account } from './accounts.js';
8
9
  export { resume } from './resume.js';
9
10
  export { projects } from './projects/index.js';
@@ -2,8 +2,9 @@ export { createContext } from './context.js';
2
2
  export { launch } from './launch/index.js';
3
3
  export { setup } from './setup/index.js';
4
4
  export { data } from './data/index.js';
5
+ export { storage, storageBeforeCommand } from './storage/index.js';
5
6
  export { repairCommand } from './repair/index.js';
6
- export { attach, db, exec, hide, show, restart, stop, sessions, status } from './sessions/index.js';
7
+ export { attach, db, exec } from './sessions/index.js';
7
8
  export { account } from './accounts.js';
8
9
  export { resume } from './resume.js';
9
10
  export { projects } from './projects/index.js';
@@ -1,7 +1,8 @@
1
1
  import type { ResolvedRun } from '../../../core/types.js';
2
2
  import { type Context } from '../context.js';
3
3
  /**
4
- * Asked once per parent folder: map it at every start (a project root), so the projects next to this one open in the
5
- * running sandbox without a restart. The answer is saved to your config.
4
+ * Asked at a start from a folder whose parent is not shared yet ("Not now" asks again next time): map it at every
5
+ * start (a project root), so the projects next to this one open in the running sandbox without a restart. The answer is
6
+ * saved to your config.
6
7
  */
7
8
  export declare function maybeAddRoot(ctx: Context, run: ResolvedRun): Promise<void>;