windows-development-sandbox 1.10.0 → 1.11.4

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 (383) hide show
  1. package/README.md +64 -17
  2. package/config.example.json +5 -1
  3. package/dist/app/features/accounts/accounts.def.d.ts +122 -0
  4. package/dist/app/features/accounts/accounts.def.js +243 -0
  5. package/dist/app/features/accounts/accounts.run.d.ts +51 -0
  6. package/dist/app/features/accounts/accounts.run.js +125 -0
  7. package/dist/app/features/accounts/index.d.ts +2 -0
  8. package/dist/app/features/accounts/index.js +3 -0
  9. package/dist/app/features/agents/agent-entry.d.ts +17 -0
  10. package/dist/app/features/agents/agent-entry.js +50 -0
  11. package/dist/app/features/agents/agents.def.d.ts +65 -0
  12. package/dist/app/features/agents/agents.def.js +142 -0
  13. package/dist/app/features/agents/agents.run.d.ts +31 -0
  14. package/dist/app/features/agents/agents.run.js +189 -0
  15. package/dist/app/features/agents/index.d.ts +3 -0
  16. package/dist/app/features/agents/index.js +4 -0
  17. package/dist/app/features/apps/apps-rows.d.ts +31 -0
  18. package/dist/app/features/apps/apps-rows.js +73 -0
  19. package/dist/app/features/apps/apps.def.d.ts +181 -0
  20. package/dist/app/features/apps/apps.def.js +264 -0
  21. package/dist/app/features/apps/apps.run.d.ts +58 -0
  22. package/dist/app/features/apps/apps.run.js +76 -0
  23. package/dist/app/features/apps/index.d.ts +3 -0
  24. package/dist/app/features/apps/index.js +4 -0
  25. package/dist/app/features/data/data.def.d.ts +154 -0
  26. package/dist/app/features/data/data.def.js +194 -0
  27. package/dist/app/features/data/data.run.d.ts +46 -0
  28. package/dist/app/features/data/data.run.js +141 -0
  29. package/dist/app/features/data/index.d.ts +2 -0
  30. package/dist/app/features/data/index.js +3 -0
  31. package/dist/app/features/defs.d.ts +959 -4
  32. package/dist/app/features/defs.js +151 -10
  33. package/dist/app/features/engine/engine.def.d.ts +228 -0
  34. package/dist/app/features/engine/engine.def.js +194 -0
  35. package/dist/app/features/engine/engine.run.d.ts +72 -0
  36. package/dist/app/features/engine/engine.run.js +77 -0
  37. package/dist/app/features/engine/index.d.ts +2 -0
  38. package/dist/app/features/engine/index.js +4 -0
  39. package/dist/app/features/files/files.def.d.ts +51 -0
  40. package/dist/app/features/files/files.def.js +38 -0
  41. package/dist/app/features/files/files.run.d.ts +20 -0
  42. package/dist/app/features/files/files.run.js +59 -0
  43. package/dist/app/features/files/index.d.ts +2 -0
  44. package/dist/app/features/files/index.js +3 -0
  45. package/dist/app/features/github/github.def.d.ts +80 -0
  46. package/dist/app/features/github/github.def.js +142 -0
  47. package/dist/app/features/github/github.run.d.ts +36 -0
  48. package/dist/app/features/github/github.run.js +59 -0
  49. package/dist/app/features/github/index.d.ts +2 -0
  50. package/dist/app/features/github/index.js +3 -0
  51. package/dist/app/features/health/health.def.d.ts +275 -0
  52. package/dist/app/features/health/health.def.js +297 -0
  53. package/dist/app/features/health/health.run.d.ts +125 -0
  54. package/dist/app/features/health/health.run.js +204 -0
  55. package/dist/app/features/health/index.d.ts +2 -0
  56. package/dist/app/features/health/index.js +3 -0
  57. package/dist/app/features/logs/index.d.ts +2 -0
  58. package/dist/app/features/logs/index.js +3 -0
  59. package/dist/app/features/logs/logs.def.d.ts +78 -0
  60. package/dist/app/features/logs/logs.def.js +115 -0
  61. package/dist/app/features/logs/logs.run.d.ts +20 -0
  62. package/dist/app/features/logs/logs.run.js +42 -0
  63. package/dist/app/features/projects/index.d.ts +2 -0
  64. package/dist/app/features/projects/index.js +3 -0
  65. package/dist/app/features/projects/projects.def.d.ts +101 -0
  66. package/dist/app/features/projects/projects.def.js +208 -0
  67. package/dist/app/features/projects/projects.run.d.ts +56 -0
  68. package/dist/app/features/projects/projects.run.js +155 -0
  69. package/dist/app/features/sandbox/sandbox.def.js +11 -5
  70. package/dist/app/features/sessions/sessions.def.js +3 -0
  71. package/dist/app/features/settings/categories.def.js +3 -2
  72. package/dist/{cli/menu/settings/share.d.ts → app/features/settings/settings-share.d.ts} +1 -1
  73. package/dist/{cli/menu/settings/share.js → app/features/settings/settings-share.js} +3 -2
  74. package/dist/app/features/settings/settings.def.d.ts +22 -5
  75. package/dist/app/features/settings/settings.def.js +81 -6
  76. package/dist/app/features/settings/settings.run.d.ts +17 -0
  77. package/dist/app/features/settings/settings.run.js +89 -4
  78. package/dist/app/features/storage/index.d.ts +2 -0
  79. package/dist/app/features/storage/index.js +3 -0
  80. package/dist/app/features/storage/storage.def.d.ts +133 -0
  81. package/dist/app/features/storage/storage.def.js +220 -0
  82. package/dist/app/features/storage/storage.run.d.ts +62 -0
  83. package/dist/app/features/storage/storage.run.js +370 -0
  84. package/dist/app/features/updates/index.d.ts +3 -0
  85. package/dist/app/features/updates/index.js +4 -0
  86. package/dist/app/features/updates/update-lines.d.ts +13 -0
  87. package/dist/app/features/updates/update-lines.js +61 -0
  88. package/dist/app/features/updates/updates.def.d.ts +89 -0
  89. package/dist/app/features/updates/updates.def.js +224 -0
  90. package/dist/app/features/updates/updates.run.d.ts +48 -0
  91. package/dist/app/features/updates/updates.run.js +154 -0
  92. package/dist/app/features/vpn/index.d.ts +2 -0
  93. package/dist/app/features/vpn/index.js +3 -0
  94. package/dist/app/features/vpn/vpn.def.d.ts +112 -0
  95. package/dist/app/features/vpn/vpn.def.js +174 -0
  96. package/dist/app/features/vpn/vpn.run.d.ts +37 -0
  97. package/dist/app/features/vpn/vpn.run.js +54 -0
  98. package/dist/app/features/web/index.d.ts +2 -0
  99. package/dist/app/features/web/index.js +3 -0
  100. package/dist/app/features/web/web.def.d.ts +33 -0
  101. package/dist/app/features/web/web.def.js +90 -0
  102. package/dist/app/features/web/web.run.d.ts +24 -0
  103. package/dist/app/features/web/web.run.js +93 -0
  104. package/dist/app/kernel/define.d.ts +10 -1
  105. package/dist/app/kernel/io.d.ts +34 -0
  106. package/dist/app/kernel/io.js +9 -0
  107. package/dist/app/kernel/rpc.d.ts +17 -0
  108. package/dist/app/kernel/text.d.ts +2 -0
  109. package/dist/app/kernel/text.js +7 -0
  110. package/dist/app/kernel/view.d.ts +24 -1
  111. package/dist/app/kernel/view.js +1 -1
  112. package/dist/app/registry.js +74 -1
  113. package/dist/cli/args.js +1 -1
  114. package/dist/cli/commands/context.d.ts +7 -0
  115. package/dist/cli/commands/context.js +29 -2
  116. package/dist/cli/commands/engine.js +5 -58
  117. package/dist/cli/commands/github.d.ts +2 -0
  118. package/dist/cli/commands/github.js +11 -0
  119. package/dist/cli/commands/index.d.ts +3 -5
  120. package/dist/cli/commands/index.js +3 -5
  121. package/dist/cli/commands/launch/launch.js +21 -4
  122. package/dist/cli/commands/launch/running.js +4 -1
  123. package/dist/cli/commands/maintenance/config.js +1 -6
  124. package/dist/cli/commands/maintenance/index.d.ts +0 -1
  125. package/dist/cli/commands/maintenance/index.js +1 -2
  126. package/dist/cli/commands/maintenance/logs.js +27 -32
  127. package/dist/cli/commands/maintenance/migrate.d.ts +0 -8
  128. package/dist/cli/commands/maintenance/migrate.js +2 -44
  129. package/dist/cli/commands/maintenance/update.d.ts +0 -19
  130. package/dist/cli/commands/maintenance/update.js +1 -99
  131. package/dist/cli/commands/projects/index.d.ts +0 -1
  132. package/dist/cli/commands/projects/index.js +0 -1
  133. package/dist/cli/commands/registry.d.ts +1 -1
  134. package/dist/cli/commands/registry.js +29 -11
  135. package/dist/cli/commands/repair/checks/data.js +1 -1
  136. package/dist/cli/commands/repair/checks/hcs.js +28 -1
  137. package/dist/cli/commands/repair/checks/sandbox.js +1 -1
  138. package/dist/cli/commands/repair/health-run.d.ts +30 -0
  139. package/dist/cli/commands/repair/health-run.js +32 -0
  140. package/dist/cli/commands/repair/printer.d.ts +2 -2
  141. package/dist/cli/commands/repair/printer.js +2 -11
  142. package/dist/cli/commands/repair/run.d.ts +1 -21
  143. package/dist/cli/commands/repair/run.js +13 -70
  144. package/dist/cli/commands/storage/index.d.ts +0 -1
  145. package/dist/cli/commands/storage/index.js +0 -1
  146. package/dist/cli/commands/storage/offer.js +6 -2
  147. package/dist/cli/commands/vpn.d.ts +1 -3
  148. package/dist/cli/commands/vpn.js +8 -89
  149. package/dist/cli/commands/web.d.ts +2 -1
  150. package/dist/cli/commands/web.js +14 -78
  151. package/dist/cli/index.js +3 -2
  152. package/dist/cli/manifest.d.ts +16 -153
  153. package/dist/cli/manifest.js +20 -50
  154. package/dist/cli/menu/command-form.js +1 -2
  155. package/dist/cli/menu/io-menu.d.ts +2 -2
  156. package/dist/cli/menu/io-menu.js +6 -4
  157. package/dist/cli/menu/menu.js +1 -1
  158. package/dist/cli/menu/pages/accounts-page.d.ts +5 -17
  159. package/dist/cli/menu/pages/accounts-page.js +28 -170
  160. package/dist/cli/menu/pages/agents-page.d.ts +17 -18
  161. package/dist/cli/menu/pages/agents-page.js +67 -124
  162. package/dist/cli/menu/pages/apps-page.d.ts +15 -8
  163. package/dist/cli/menu/pages/apps-page.js +121 -29
  164. package/dist/cli/menu/pages/list-page.js +10 -1
  165. package/dist/cli/menu/pages/maintenance-page.d.ts +51 -52
  166. package/dist/cli/menu/pages/maintenance-page.js +246 -427
  167. package/dist/cli/menu/pages/sandbox-page.d.ts +3 -5
  168. package/dist/cli/menu/pages/sandbox-page.js +34 -112
  169. package/dist/cli/menu/pages/settings-page.d.ts +21 -3
  170. package/dist/cli/menu/pages/settings-page.js +89 -17
  171. package/dist/cli/menu/render-view.js +2 -1
  172. package/dist/cli/menu/settings/index.d.ts +0 -1
  173. package/dist/cli/menu/settings/index.js +3 -3
  174. package/dist/cli/menu/views.js +28 -0
  175. package/dist/cli/operations/handler.js +7 -3
  176. package/dist/cli/operations/input.d.ts +1 -1
  177. package/dist/cli/operations/input.js +29 -5
  178. package/dist/cli/operations/io-cli.js +9 -1
  179. package/dist/cli/operations/spec.js +8 -2
  180. package/dist/cli/output/render-view.js +2 -0
  181. package/dist/cli/{commands/data/collect.js → services/data-collect.js} +2 -2
  182. package/dist/cli/{commands/data/remove.js → services/data-remove.js} +2 -2
  183. package/dist/cli/services/data-service.d.ts +1 -1
  184. package/dist/cli/services/data-service.js +2 -2
  185. package/dist/cli/services/databases-service.d.ts +5 -0
  186. package/dist/cli/services/databases-service.js +15 -0
  187. package/dist/cli/services/health-service.d.ts +8 -4
  188. package/dist/cli/services/health-service.js +10 -8
  189. package/dist/cli/services/index.d.ts +4 -1
  190. package/dist/cli/services/index.js +4 -1
  191. package/dist/cli/services/logs-service.d.ts +7 -0
  192. package/dist/cli/services/logs-service.js +13 -0
  193. package/dist/cli/services/storage-service.d.ts +19 -0
  194. package/dist/cli/services/storage-service.js +71 -0
  195. package/dist/cli/services/vpn-service.d.ts +6 -4
  196. package/dist/cli/services/vpn-service.js +5 -11
  197. package/dist/cli/services/web-service.d.ts +4 -3
  198. package/dist/cli/services/web-service.js +12 -32
  199. package/dist/core/config/defaults.js +2 -1
  200. package/dist/core/schema/config.d.ts +5 -0
  201. package/dist/core/schema/config.js +2 -0
  202. package/dist/core/schema/github.d.ts +4 -0
  203. package/dist/core/schema/github.js +7 -0
  204. package/dist/core/schema/index.d.ts +1 -0
  205. package/dist/core/schema/index.js +1 -0
  206. package/dist/core/schema/profile.d.ts +1 -0
  207. package/dist/core/schema/profile.js +3 -0
  208. package/dist/core/schema/sandbox.js +3 -3
  209. package/dist/core/schema/toolchains.js +2 -2
  210. package/dist/core/types.d.ts +6 -3
  211. package/dist/guest/boot/boot.js +8 -0
  212. package/dist/guest/daemon/daemon.js +1 -1
  213. package/dist/guest/daemon/sessions.d.ts +3 -2
  214. package/dist/guest/daemon/sessions.js +38 -7
  215. package/dist/guest/governor/core.d.ts +44 -0
  216. package/dist/guest/governor/core.js +124 -0
  217. package/dist/guest/governor/decide.d.ts +46 -18
  218. package/dist/guest/governor/decide.js +136 -82
  219. package/dist/guest/governor/governor.d.ts +2 -38
  220. package/dist/guest/governor/governor.js +33 -113
  221. package/dist/guest/governor/index.d.ts +1 -0
  222. package/dist/guest/governor/index.js +1 -0
  223. package/dist/guest/network/firewall.d.ts +2 -0
  224. package/dist/guest/network/firewall.js +3 -3
  225. package/dist/guest/sessions/viewer.js +5 -1
  226. package/dist/guest/setup/github-token.d.ts +7 -0
  227. package/dist/guest/setup/github-token.js +65 -0
  228. package/dist/guest/toolchains/languages/node.js +11 -1
  229. package/dist/guest/toolchains/native/rust-extras.js +2 -2
  230. package/dist/guest/toolchains/tools/cli.d.ts +8 -0
  231. package/dist/guest/toolchains/tools/cli.js +35 -2
  232. package/dist/guest/vpn/openvpn.d.ts +5 -0
  233. package/dist/guest/vpn/openvpn.js +14 -1
  234. package/dist/guest/vpn/vpn.js +55 -16
  235. package/dist/guest/vpn/wireguard.js +2 -0
  236. package/dist/host/channel/attach.d.ts +1 -0
  237. package/dist/host/channel/attach.js +1 -0
  238. package/dist/host/channel/channel.d.ts +1 -1
  239. package/dist/host/channel/channel.js +2 -2
  240. package/dist/host/engines/hcs/check.d.ts +1 -0
  241. package/dist/host/engines/hcs/check.js +1 -1
  242. package/dist/host/engines/hcs/engine.d.ts +1 -1
  243. package/dist/host/engines/hcs/engine.js +6 -4
  244. package/dist/host/engines/hcs/helper.d.ts +11 -0
  245. package/dist/host/engines/hcs/helper.js +31 -2
  246. package/dist/host/engines/hcs/leftovers.d.ts +42 -0
  247. package/dist/host/engines/hcs/leftovers.js +101 -0
  248. package/dist/host/engines/index.d.ts +1 -0
  249. package/dist/host/engines/index.js +1 -0
  250. package/dist/host/github/deliver.d.ts +13 -0
  251. package/dist/host/github/deliver.js +51 -0
  252. package/dist/host/github/index.d.ts +2 -0
  253. package/dist/host/github/index.js +3 -0
  254. package/dist/host/github/token.d.ts +21 -0
  255. package/dist/host/github/token.js +74 -0
  256. package/dist/host/launch/generate.js +11 -5
  257. package/dist/host/launch/index.d.ts +1 -1
  258. package/dist/host/launch/index.js +1 -1
  259. package/dist/host/launch/session-file.js +1 -2
  260. package/dist/host/launch/wsb-file.d.ts +11 -7
  261. package/dist/host/launch/wsb-file.js +30 -12
  262. package/dist/host/life/host-memory.d.ts +18 -0
  263. package/dist/host/life/host-memory.js +66 -0
  264. package/dist/host/life/watchdog.d.ts +9 -0
  265. package/dist/host/life/watchdog.js +17 -1
  266. package/dist/host/sandbox/tasklist.d.ts +6 -0
  267. package/dist/host/sandbox/tasklist.js +37 -0
  268. package/dist/host/secrets/launch-secrets.d.ts +2 -1
  269. package/dist/host/secrets/launch-secrets.js +4 -2
  270. package/dist/host/vpn/status.js +13 -3
  271. package/dist/host/web/backend.d.ts +1 -3
  272. package/dist/host/web/index.d.ts +2 -1
  273. package/dist/host/web/index.js +2 -1
  274. package/dist/host/web/live.d.ts +23 -0
  275. package/dist/host/web/live.js +107 -0
  276. package/dist/host/web/rpc.d.ts +6 -1
  277. package/dist/host/web/rpc.js +23 -31
  278. package/dist/host/web/runner.d.ts +4 -0
  279. package/dist/host/web/runner.js +12 -1
  280. package/dist/host/web/server.d.ts +30 -2
  281. package/dist/host/web/server.js +87 -29
  282. package/dist/host/web/state.d.ts +1 -0
  283. package/dist/host/web/state.js +2 -0
  284. package/dist/runtime/agent.js +30 -6
  285. package/dist/runtime/daemon.js +337 -177
  286. package/dist/runtime/db.js +30 -6
  287. package/dist/runtime/main.js +389 -77
  288. package/dist/runtime/netproxy.js +30 -6
  289. package/dist/runtime/view.js +495 -146
  290. package/dist/selftest/app.test.js +632 -12
  291. package/dist/selftest/channel.test.js +18 -1
  292. package/dist/selftest/cli.test.js +1 -1
  293. package/dist/selftest/config.test.js +1 -1
  294. package/dist/selftest/contained.test.js +1 -1
  295. package/dist/selftest/data.test.js +1 -2
  296. package/dist/selftest/engine.test.js +3 -1
  297. package/dist/selftest/github.test.d.ts +2 -0
  298. package/dist/selftest/github.test.js +243 -0
  299. package/dist/selftest/hcs.test.js +105 -8
  300. package/dist/selftest/health.test.js +71 -0
  301. package/dist/selftest/heavy-load.test.js +132 -72
  302. package/dist/selftest/index.js +4 -0
  303. package/dist/selftest/layout.test.js +8 -0
  304. package/dist/selftest/live-terminal.test.js +74 -0
  305. package/dist/selftest/menu-screens.js +171 -56
  306. package/dist/selftest/menu.test.js +54 -37
  307. package/dist/selftest/migrate.test.js +14 -12
  308. package/dist/selftest/powershell-variables.test.d.ts +2 -0
  309. package/dist/selftest/powershell-variables.test.js +61 -0
  310. package/dist/selftest/support/engine-golden.js +1 -0
  311. package/dist/selftest/support/fixtures.d.ts +4 -0
  312. package/dist/selftest/support/web-preview.d.ts +1 -0
  313. package/dist/selftest/support/web-preview.js +856 -0
  314. package/dist/selftest/update-service.test.js +15 -8
  315. package/dist/selftest/vpn.test.js +86 -2
  316. package/dist/selftest/web.test.js +58 -11
  317. package/dist/shared/channel/run-dir.d.ts +2 -0
  318. package/dist/shared/channel/run-dir.js +3 -0
  319. package/dist/shared/channel/schema.d.ts +7 -0
  320. package/dist/shared/channel/schema.js +9 -1
  321. package/dist/shared/channel/secrets.d.ts +1 -0
  322. package/dist/shared/channel/secrets.js +3 -0
  323. package/dist/shared/github/index.d.ts +1 -0
  324. package/dist/shared/github/index.js +2 -0
  325. package/dist/shared/github/token.d.ts +29 -0
  326. package/dist/shared/github/token.js +89 -0
  327. package/dist/shared/memory/policy.d.ts +33 -12
  328. package/dist/shared/memory/policy.js +50 -19
  329. package/dist/shared/pty/ctrl-c.d.ts +18 -0
  330. package/dist/shared/pty/ctrl-c.js +36 -0
  331. package/dist/shared/pty/index.d.ts +1 -0
  332. package/dist/shared/pty/index.js +1 -0
  333. package/dist/shared/pty/terminal.d.ts +2 -0
  334. package/dist/shared/pty/terminal.js +21 -2
  335. package/dist/shared/vpn/kill-switch.d.ts +13 -2
  336. package/dist/shared/vpn/kill-switch.js +88 -8
  337. package/dist/shared/web/protocol.d.ts +0 -4
  338. package/dist/sync/watcher.d.ts +2 -0
  339. package/dist/sync/watcher.js +8 -3
  340. package/dist/web/index.html +2 -2
  341. package/dist/web/{main-T5DMCHYV.css → main-MU5XWZMS.css} +1 -1
  342. package/dist/web/main-SLQNJRXD.js +219 -0
  343. package/native/csharp/HcsHost/AssemblyInfo.cs +3 -3
  344. package/native/csharp/HostTools/AssemblyInfo.cs +3 -3
  345. package/native/csharp/HostTools/MemoryStatus.cs +58 -2
  346. package/native/csharp/HostTools/Program.cs +7 -1
  347. package/package.json +10 -3
  348. package/sandbox/csharp/MemGov.cs +240 -38
  349. package/sandbox/csharp/PtyHost.cs +104 -15
  350. package/sandbox/csharp/SandboxTools/CpuCap.cs +50 -1
  351. package/sandbox/csharp/SandboxTools/Program.cs +1 -1
  352. package/sandbox/scripts/repair-wmi-services.ps1 +26 -0
  353. package/schemas/config.schema.json +19 -5
  354. package/schemas/sandbox-config.schema.json +7 -3
  355. package/dist/cli/commands/accounts.d.ts +0 -2
  356. package/dist/cli/commands/accounts.js +0 -96
  357. package/dist/cli/commands/data/clean.d.ts +0 -3
  358. package/dist/cli/commands/data/clean.js +0 -60
  359. package/dist/cli/commands/data/index.d.ts +0 -4
  360. package/dist/cli/commands/data/index.js +0 -62
  361. package/dist/cli/commands/maintenance/clean.d.ts +0 -2
  362. package/dist/cli/commands/maintenance/clean.js +0 -24
  363. package/dist/cli/commands/maintenance/config-share.d.ts +0 -12
  364. package/dist/cli/commands/maintenance/config-share.js +0 -80
  365. package/dist/cli/commands/projects/projects.d.ts +0 -2
  366. package/dist/cli/commands/projects/projects.js +0 -162
  367. package/dist/cli/commands/storage/contained.d.ts +0 -3
  368. package/dist/cli/commands/storage/contained.js +0 -179
  369. package/dist/cli/commands/storage/storage.d.ts +0 -8
  370. package/dist/cli/commands/storage/storage.js +0 -179
  371. package/dist/cli/menu/add-agent.d.ts +0 -47
  372. package/dist/cli/menu/add-agent.js +0 -168
  373. package/dist/cli/menu/apps.d.ts +0 -69
  374. package/dist/cli/menu/apps.js +0 -214
  375. package/dist/cli/menu/data-folder.d.ts +0 -18
  376. package/dist/cli/menu/data-folder.js +0 -99
  377. package/dist/cli/menu/share-settings.d.ts +0 -21
  378. package/dist/cli/menu/share-settings.js +0 -112
  379. package/dist/cli/menu/vpn-login.d.ts +0 -16
  380. package/dist/cli/menu/vpn-login.js +0 -74
  381. package/dist/web/main-NRRS5O6Z.js +0 -157
  382. /package/dist/cli/{commands/data/collect.d.ts → services/data-collect.d.ts} +0 -0
  383. /package/dist/cli/{commands/data/remove.d.ts → services/data-remove.d.ts} +0 -0
@@ -1,62 +0,0 @@
1
- // `sandbox data`: what persists between sandboxes (toolchains, databases, agent state, logs, host storage) and
2
- // removing chosen parts of it. Everything under the data folder is sandbox-writable: sizes and deletes never follow
3
- // links, and targets resolve strictly inside the data folder.
4
- import _ from 'lodash';
5
- import { humanBytes } from '../../../core/disk.js';
6
- import { fail } from '../../../core/util/index.js';
7
- import { printJson, table, working } from '../../output/index.js';
8
- import { DataService } from '../../services/index.js';
9
- import { dataClean } from './clean.js';
10
- const AREA_LABEL = {
11
- tools: 'Toolchains',
12
- databases: 'Databases',
13
- state: 'Agent state',
14
- logs: 'Logs',
15
- data: 'Other',
16
- host: 'On this PC',
17
- };
18
- export async function dataInfo(ctx) {
19
- const report = await working('Measuring the saved data (big folders take a moment)', () => new DataService(ctx).report(), !ctx.options.json);
20
- const { entries, disks, totalBytes: total } = report;
21
- if (printJson(ctx, { dataPath: ctx.dataPath, storageRoot: ctx.storageRoot, totalBytes: total, entries, disks }))
22
- return 0;
23
- console.log('Disks\n');
24
- table([
25
- ['DRIVE', 'USED', 'FREE', 'SIZE', ''],
26
- ...disks.map((d) => [
27
- d.drive,
28
- humanBytes(d.usedBytes) + ' (' + Math.round((d.usedBytes / d.totalBytes) * 100) + '%)',
29
- humanBytes(d.freeBytes),
30
- humanBytes(d.totalBytes),
31
- d.holdsStorage ? '<- sandbox storage (' + humanBytes(total) + ' of it)' : '',
32
- ]),
33
- ]);
34
- console.log('');
35
- console.log('Persistent data for the sandbox: ' + ctx.dataPath + ' (C:\\AgentData inside)\n');
36
- if (!entries.length) {
37
- console.log('Nothing stored yet. Toolchains, databases and agent logins appear here after the first start.');
38
- return 0;
39
- }
40
- const rows = _.flatMap(_.groupBy(entries, 'area'), (group, area) => [
41
- [AREA_LABEL[area], humanBytes(_.sumBy(group, 'bytes')), ''],
42
- ...group.map((e) => [' ' + e.name, humanBytes(e.bytes), e.path]),
43
- ]);
44
- table([...rows, ['', '', ''], ['Total', humanBytes(total), '']]);
45
- console.log('\nFree space with: sandbox data clean <target...> (e.g. tools/go, databases/postgres-18, logs, launches)');
46
- return 0;
47
- }
48
- /** `sandbox data [info|clean] [targets...]`. */
49
- export function data(ctx) {
50
- const [action = 'info'] = ctx.options.positionals;
51
- switch (action) {
52
- case 'info':
53
- case 'show':
54
- case 'list':
55
- return dataInfo(ctx);
56
- case 'clean':
57
- case 'remove':
58
- return dataClean(ctx);
59
- default:
60
- return fail('Unknown data action "' + action + '".', 'Use: sandbox data (what is stored) or sandbox data clean <target...>');
61
- }
62
- }
@@ -1,2 +0,0 @@
1
- import { type Context } from '../context.js';
2
- export declare function clean(ctx: Context): Promise<number>;
@@ -1,24 +0,0 @@
1
- // `sandbox clean`: old launch folders, logs and leftovers. Shows what and how much, then asks (--yes skips).
2
- import _ from 'lodash';
3
- import { askRequired } from '../../../core/prompt.js';
4
- import { describePrune, pruneStorage } from '../../../host/storage/index.js';
5
- import { isSandboxRunning } from '../../../host/sandbox/index.js';
6
- import { RunDir } from '../../../shared/channel/index.js';
7
- import { nextStep } from '../../output/index.js';
8
- export async function clean(ctx) {
9
- const running = isSandboxRunning() ? new RunDir(ctx.dataPath).readSandboxStatus()?.launchId : undefined;
10
- const options = { launchDays: ctx.options.days, keep: _.compact([running]) };
11
- const found = pruneStorage(ctx.storageRoot, { ...options, dryRun: true });
12
- if (found.launches + found.logs + found.leftovers === 0) {
13
- console.log('Nothing to clean.');
14
- return 0;
15
- }
16
- console.log('Can be removed: ' + describePrune(found).replace(' removed', '') + '.');
17
- if (!ctx.options.yes && !(await askRequired('Delete them?', 'Add --yes to delete without asking.'))) {
18
- console.log('Nothing removed.');
19
- return 1;
20
- }
21
- console.log('Removed ' + describePrune(pruneStorage(ctx.storageRoot, options)).replace(' removed', '') + '.');
22
- nextStep('sandbox data (see what else is saved, and clean it)');
23
- return 0;
24
- }
@@ -1,12 +0,0 @@
1
- import { type ImportPlan } from '../../menu/settings/index.js';
2
- import type { Context } from '../context.js';
3
- /** The file `config export` writes when none is named. */
4
- export declare const DEFAULT_EXPORT = "sandbox-settings.json";
5
- /** Writes the settings that differ from the defaults (no secrets, no storage, no paths unless asked) to `file`. */
6
- export declare function writeExport(ctx: Context, file: string, withPaths: boolean, overwrite: boolean): string[];
7
- /** Reads a shared file and plans the import. Fails with the reason when it cannot be read. */
8
- export declare function readImport(ctx: Context, file: string): ImportPlan;
9
- /** Writes the planned changes to your settings file (comments stay); returns how many settings changed. */
10
- export declare function applyImport(ctx: Context, plan: ImportPlan): number;
11
- export declare function exportCommand(ctx: Context, file: string | undefined): number;
12
- export declare function importCommand(ctx: Context, file: string | undefined): Promise<number>;
@@ -1,80 +0,0 @@
1
- // `sandbox config export` and `import`: your settings as a shareable .json, and a shared file read back in.
2
- import fs from 'node:fs';
3
- import path from 'node:path';
4
- import { askRequired } from '../../../core/prompt.js';
5
- import { fail, safeText, writeJson } from '../../../core/util/index.js';
6
- import { c } from '../../output/index.js';
7
- import { ConfigFile } from '../../../app/features/settings/index.js';
8
- import { diffText, exportSettings, planImport, skippedLine } from '../../menu/settings/index.js';
9
- /** The file `config export` writes when none is named. */
10
- export const DEFAULT_EXPORT = 'sandbox-settings.json';
11
- /** A shared file is a few KB; anything bigger is not one. */
12
- const MAX_BYTES = 1024 * 1024;
13
- /** Writes the settings that differ from the defaults (no secrets, no storage, no paths unless asked) to `file`. */
14
- export function writeExport(ctx, file, withPaths, overwrite) {
15
- const target = path.resolve(file);
16
- if (!overwrite && fs.existsSync(target))
17
- fail(target + ' exists already.', 'Pick another name, or delete it first.');
18
- const { data, skipped } = exportSettings(ctx.loaded.config, withPaths);
19
- fs.mkdirSync(path.dirname(target), { recursive: true });
20
- writeJson(target, data);
21
- return skipped.map(skippedLine);
22
- }
23
- /** Reads a shared file and plans the import. Fails with the reason when it cannot be read. */
24
- export function readImport(ctx, file) {
25
- const source = path.resolve(file);
26
- if (!fs.existsSync(source))
27
- fail('There is no file ' + source + '.', 'Give the path of a file made by sandbox config export.');
28
- if (fs.statSync(source).size > MAX_BYTES)
29
- fail(source + ' is too big to be a settings file.');
30
- const plan = planImport(fs.readFileSync(source, 'utf8'), ctx.loaded.config);
31
- if (plan.problems.length)
32
- fail(source + ' is not valid settings:\n ' + plan.problems.map(safeText).join('\n '), 'Nothing was changed. Fix the file, or export a new one with: sandbox config export');
33
- return plan;
34
- }
35
- /** Writes the planned changes to your settings file (comments stay); returns how many settings changed. */
36
- export function applyImport(ctx, plan) {
37
- const outcome = ConfigFile.user(ctx.loaded.configPath).setMany(plan.changes);
38
- if (typeof outcome === 'object')
39
- fail('Could not import: ' + outcome.problems.join('; '), 'Nothing was written. Your settings are unchanged.');
40
- return plan.changes.length;
41
- }
42
- export function exportCommand(ctx, file) {
43
- const target = file ?? DEFAULT_EXPORT;
44
- const skipped = writeExport(ctx, target, ctx.options.withPaths, false);
45
- console.log('Wrote ' + path.resolve(target) + ' (only what differs from the defaults).');
46
- if (skipped.length) {
47
- console.log('Left out:');
48
- for (const line of skipped)
49
- console.log(' ' + line);
50
- }
51
- if (!ctx.options.withPaths && skipped.some((s) => s.includes('folder or file')))
52
- console.log("Keep this PC's folders and files in the file with --with-paths.");
53
- return 0;
54
- }
55
- export async function importCommand(ctx, file) {
56
- if (!file)
57
- fail('Which file?', 'Usage: sandbox config import <file>');
58
- const plan = readImport(ctx, file);
59
- if (plan.skipped.length) {
60
- console.log('Not imported (never taken from a file):');
61
- for (const s of plan.skipped)
62
- console.log(' ' + safeText(skippedLine(s)));
63
- }
64
- if (!plan.changes.length) {
65
- console.log('Nothing to change: your settings already match the file.');
66
- return 0;
67
- }
68
- console.log('This would change ' + plan.changes.length + ' setting' + (plan.changes.length === 1 ? '' : 's') + ':');
69
- for (const line of diffText(plan.lines))
70
- console.log(' ' + safeText(line));
71
- const yes = ctx.options.yes ||
72
- (await askRequired('Change your settings like this?', 'Add --yes to change them without asking.'));
73
- if (!yes) {
74
- console.log('Nothing was changed.');
75
- return 0;
76
- }
77
- const n = applyImport(ctx, plan);
78
- console.log(c.green('Imported ' + n + ' setting' + (n === 1 ? '' : 's') + '.') + ' New sandboxes use them.');
79
- return 0;
80
- }
@@ -1,2 +0,0 @@
1
- import { type Context } from '../context.js';
2
- export declare function projects(ctx: Context): Promise<number>;
@@ -1,162 +0,0 @@
1
- // `sandbox projects`: which projects a sandbox can open without a restart. Project roots (whole folders of projects),
2
- // the projects this tool has started before, and the all-projects and exclude settings. Changes to what is mapped take
3
- // effect at the next start; a project you start while a sandbox runs joins it when it can (projects.ts in host/).
4
- import path from 'node:path';
5
- import { checkbox } from '@inquirer/prompts';
6
- import { askChoice } from '../../../core/prompt.js';
7
- import { fail } from '../../../core/util/index.js';
8
- import { isSandboxRunning } from '../../../host/sandbox/index.js';
9
- import { c, nextStep, pageSizeFor, shortenMiddle, termWidth, printJson, table } from '../../output/index.js';
10
- import { ProjectsService } from '../../services/index.js';
11
- const NEXT_START = 'This changes what is mapped from the next start.';
12
- function runningNote() {
13
- return isSandboxRunning()
14
- ? ' The running sandbox keeps what it has; start a project in it (sandbox claude there) and it joins without a restart when it can, or you are offered one.'
15
- : '';
16
- }
17
- function list(ctx, service) {
18
- const listing = service.list();
19
- const rows = listing.projects;
20
- if (printJson(ctx, { all: listing.all, roots: listing.roots, exclude: listing.exclude, projects: rows }))
21
- return 0;
22
- console.log(c.bold('All projects') +
23
- ': ' +
24
- (listing.all ? 'on (every project below is mapped at every start, except excluded ones)' : 'off') +
25
- c.dim(' sandbox projects all on|off'));
26
- console.log(c.bold('Roots') +
27
- ': ' +
28
- (listing.roots.length ? listing.roots.join(', ') : c.dim('none (sandbox projects roots add <folder>)')));
29
- if (!rows.length) {
30
- console.log('No projects yet: start one with sandbox claude in its folder.');
31
- return 0;
32
- }
33
- const width = Math.max(20, termWidth() - 46);
34
- table([
35
- ['', 'FOLDER', 'AT START', 'RUNNING SANDBOX'],
36
- ...rows.map((r) => [
37
- r.here ? '*' : '',
38
- shortenMiddle(r.folder, width),
39
- r.root ? 'root' : r.excluded ? 'excluded' : r.mappedAtStart ? 'mapped' : '-',
40
- r.running ?? '-',
41
- ]),
42
- ]);
43
- console.log(c.dim('* = this folder. Choose with: sandbox projects choose'));
44
- return 0;
45
- }
46
- /** Ticks the projects mapped at every start (any ticked turns all-projects on); the rest are excluded. */
47
- async function choose(service) {
48
- const rows = service.rows().filter((r) => !r.root);
49
- if (!rows.length) {
50
- console.log('No projects to choose from yet (projects in a root are always mapped with it). Start one with sandbox claude in its folder.');
51
- return 0;
52
- }
53
- if (!process.stdin.isTTY)
54
- fail('sandbox projects choose needs an interactive terminal.', 'Use sandbox projects include|exclude <folder> instead.');
55
- const all = service.settings().all;
56
- const picked = await checkbox({
57
- message: 'Projects mapped at every start, so they open without a restart (every agent in the sandbox can see them):',
58
- pageSize: pageSizeFor(rows.length),
59
- choices: rows.map((r) => ({
60
- value: r.folder,
61
- name: shortenMiddle(r.folder, termWidth() - 12) + (r.here ? c.dim(' (this folder)') : ''),
62
- checked: all && !r.excluded,
63
- })),
64
- });
65
- const { mapped, excluded } = service.choose(rows, picked);
66
- console.log(mapped + ' project(s) mapped at every start, ' + excluded + ' excluded. ' + NEXT_START + runningNote());
67
- return 0;
68
- }
69
- /** The folder typed, or one picked from the known projects (or this folder) when it was left out. */
70
- async function folderOf(service, action, given) {
71
- if (given)
72
- return given;
73
- const rows = service.rows();
74
- return askChoice('Which folder?', [
75
- { name: 'This folder (' + shortenMiddle(process.cwd(), termWidth() - 30) + ')', value: '.' },
76
- ...rows.filter((r) => !r.here).map((r) => ({ name: shortenMiddle(r.folder, termWidth() - 12), value: r.folder })),
77
- ], 'Usage: sandbox projects ' + action + ' <folder> (. = this folder)');
78
- }
79
- function add(service, value) {
80
- const dir = service.add(value);
81
- const all = service.settings().all;
82
- console.log('Added ' + dir + ' to your projects.' + (all ? ' ' + NEXT_START : ''));
83
- if (!all)
84
- nextStep('sandbox projects all on (map every project at every start)');
85
- return 0;
86
- }
87
- function remove(service, value) {
88
- const { dir, removed } = service.forget(value);
89
- console.log(removed
90
- ? 'Removed ' + dir + ' from your projects (nothing in the folder was touched).'
91
- : dir + ' was not in your projects.');
92
- return 0;
93
- }
94
- function includeOrExclude(service, action, value) {
95
- const changed = action === 'exclude' ? service.exclude(value) : service.include(value);
96
- console.log((changed
97
- ? (action === 'exclude' ? 'Excluded ' : 'Included ') + path.resolve(value) + '. ' + NEXT_START
98
- : 'Nothing changed.') +
99
- (action === 'include' && !service.settings().all
100
- ? ' Mapping all projects is off: sandbox projects all on maps your projects at every start.'
101
- : '') +
102
- (changed ? runningNote() : ''));
103
- return 0;
104
- }
105
- function all(service, value) {
106
- if (value === undefined) {
107
- console.log('Mapping all projects at every start is ' + (service.settings().all ? 'on' : 'off') + '.');
108
- return 0;
109
- }
110
- service.setAll(value === 'on');
111
- console.log('Mapping all projects at every start is ' +
112
- value +
113
- '. ' +
114
- NEXT_START +
115
- (value === 'on' ? ' Every agent in the sandbox can then see all of those projects.' : '') +
116
- runningNote());
117
- return 0;
118
- }
119
- function roots(service, value, folder) {
120
- if (!value || value === 'list') {
121
- const list = service.settings().roots;
122
- console.log(list.length ? list.join('\n') : 'No project roots. Add one: sandbox projects roots add <folder>');
123
- return 0;
124
- }
125
- if (value === 'add') {
126
- const { dir, added } = service.addRoot(folder);
127
- console.log(added
128
- ? 'Added the project root ' +
129
- dir +
130
- ': every project in it (also new ones) opens without a restart. Every agent in the sandbox can see all of them. ' +
131
- NEXT_START +
132
- runningNote()
133
- : dir + ' is a root already.');
134
- return 0;
135
- }
136
- const { dir, removed } = service.removeRoot(folder);
137
- console.log(removed ? 'Removed the project root ' + dir + '. ' + NEXT_START : dir + ' was not a root.');
138
- return 0;
139
- }
140
- export async function projects(ctx) {
141
- const [action = 'list', value, folder] = ctx.options.positionals;
142
- const service = new ProjectsService(ctx);
143
- switch (action) {
144
- case 'list':
145
- return list(ctx, service);
146
- case 'choose':
147
- return choose(service);
148
- case 'add':
149
- return add(service, await folderOf(service, action, value));
150
- case 'remove':
151
- return remove(service, await folderOf(service, action, value));
152
- case 'include':
153
- case 'exclude':
154
- return includeOrExclude(service, action, await folderOf(service, action, value));
155
- case 'all':
156
- return all(service, value);
157
- case 'roots':
158
- return roots(service, value, folder);
159
- default:
160
- return fail('Unknown projects action "' + action + '".', 'Use: sandbox projects list | choose | add | remove | include | exclude | all | roots');
161
- }
162
- }
@@ -1,3 +0,0 @@
1
- import type { Context } from '../context.js';
2
- /** `sandbox storage contained [status|on|off]`. */
3
- export declare function contained(ctx: Context): Promise<number>;
@@ -1,179 +0,0 @@
1
- // `sandbox storage contained on|off|status` (beta): keep the data set's tools, state and logs in a
2
- // disk image that is mounted only while a sandbox runs. The work is in host/storage/contained; this file asks, shows
3
- // size and time, and prints.
4
- import fs from 'node:fs';
5
- import { userConfigPath } from '../../../core/config/index.js';
6
- import { humanBytes } from '../../../core/disk.js';
7
- import { askRequired } from '../../../core/prompt.js';
8
- import { fail } from '../../../core/util/index.js';
9
- import { isSandboxRunning, realContainedDeps } from '../../../host/sandbox/index.js';
10
- import { assertTargetsFree, containedAvailability, ContainedStorage, describeDuration, describeSize, planTransfer, runTransfer, setStateOf, StateFile, writeContainedSetting, } from '../../../host/storage/index.js';
11
- import { c, printJson, working } from '../../output/index.js';
12
- const BETA = 'Beta, and not yet tested on a real PC. ';
13
- function storageFor(ctx) {
14
- const { config } = ctx.loaded;
15
- return new ContainedStorage(realContainedDeps(ctx.storageRoot, config.storage.containedMaxGb), config.storage.dataName);
16
- }
17
- function requireAvailable() {
18
- const check = containedAvailability();
19
- if (!check.available)
20
- fail('Contained storage cannot be used: ' + check.reasons.join(' '), check.fixes.join(' '));
21
- }
22
- function requireNoSandbox() {
23
- if (isSandboxRunning())
24
- fail('A sandbox is running.', 'Close it (sandbox stop) first: the folders in the image are in use.');
25
- }
26
- async function status(ctx) {
27
- const storage = storageFor(ctx);
28
- const check = containedAvailability();
29
- const state = new StateFile(storage.paths).read();
30
- const record = setStateOf(state, storage.set);
31
- const reality = check.available && storage.imageExists() ? await storage.reality() : null;
32
- const answer = {
33
- setting: ctx.loaded.config.storage.contained,
34
- maxGb: ctx.loaded.config.storage.containedMaxGb,
35
- available: check.available,
36
- reasons: check.reasons,
37
- image: storage.paths.image,
38
- imageExists: storage.imageExists(),
39
- imageBytes: reality?.imageBytes ?? null,
40
- mountFolder: storage.paths.mount,
41
- recordedMounted: record.mounted,
42
- holders: record.holders.length,
43
- mountedNow: reality?.mountIsMountPoint ?? null,
44
- };
45
- if (printJson(ctx, answer))
46
- return 0;
47
- console.log(c.yellow('Contained storage (beta, untested on a real PC)'));
48
- console.log(' setting: storage.contained = ' + answer.setting + ' (limit ' + answer.maxGb + ' GB)');
49
- console.log(' this PC: ' +
50
- (check.available ? 'can use it' : 'cannot use it: ' + check.reasons.join(' ') + ' ' + check.fixes.join(' ')));
51
- console.log(' image: ' +
52
- answer.image +
53
- (answer.imageExists ? ' (' + humanBytes(answer.imageBytes ?? 0) + ' on disk)' : ' (not made yet)'));
54
- console.log(' mount folder: ' + answer.mountFolder);
55
- if (reality)
56
- console.log(' mounted now: ' +
57
- (reality.mountIsMountPoint ? 'yes' : 'no') +
58
- (record.mounted !== reality.mountIsMountPoint
59
- ? ' (the record says ' + (record.mounted ? 'yes' : 'no') + '; sandbox doctor looks into it)'
60
- : ''));
61
- console.log('\nTurn it on with: sandbox storage contained on Turn it off with: sandbox storage contained off');
62
- return 0;
63
- }
64
- function printPlan(plan, to) {
65
- for (const f of plan.folders)
66
- console.log(' ' + f.name + ': ' + describeSize(f.measured));
67
- console.log(' total: ' + describeSize(plan.total) + ' to ' + to);
68
- console.log(' time: about ' + describeDuration(plan.estimate.seconds) + ' (copied, then the originals are removed)');
69
- if (!plan.estimate.fits)
70
- fail('Not enough free space for the copy.', 'Free some space on that drive and try again.');
71
- }
72
- async function turnOn(ctx) {
73
- requireAvailable();
74
- requireNoSandbox();
75
- const storage = storageFor(ctx);
76
- const { config } = ctx.loaded;
77
- const configFile = ctx.loaded.configPath ?? userConfigPath();
78
- console.log(c.yellow(BETA + 'Contained storage keeps the sandbox tools, state and logs in one disk image file.'));
79
- console.log(' image: ' + storage.paths.image + (storage.imageExists() ? ' (exists, it is used as it is)' : ''));
80
- console.log(' limit: ' + config.storage.containedMaxGb + ' GB (storage.containedMaxGb; the file grows only as it fills)');
81
- console.log(' Windows asks for permission to mount it each time a sandbox starts (and once when it closes).');
82
- if (!ctx.options.yes &&
83
- !(await askRequired('Turn contained storage on?', 'Add --yes to turn it on without asking.', true)))
84
- return fail('Nothing was changed.', 'Run sandbox storage contained on when you want it.');
85
- const mount = await working('Making and mounting the image (Windows asks for permission)', () => storage.acquire({ id: 'cli', pid: process.pid }, { create: true }));
86
- try {
87
- const plan = planTransfer(ctx.dataPath, mount, ctx.storageRoot);
88
- if (plan.folders.length > 0) {
89
- console.log('\nThese folders hold your tools, state and logs now:');
90
- printPlan(plan, 'the image');
91
- assertTargetsFree(plan);
92
- const move = ctx.options.yes || (await askRequired('Move them into the image?', 'Add --yes to move without asking.', true));
93
- if (move) {
94
- let line = 'Copying';
95
- const result = await working(() => line, () => runTransfer(plan, ctx.dataPath, (p) => {
96
- line = 'Copying: ' + p.files.toLocaleString('en-US') + ' files, ' + humanBytes(p.bytes);
97
- }));
98
- console.log('Moved ' + result.files.toLocaleString('en-US') + ' files into the image.');
99
- for (const note of result.notes)
100
- console.log(c.yellow(note));
101
- }
102
- else
103
- console.log('They stay where they are and are not used: tools are downloaded again into the image. Delete them later with sandbox data clean.');
104
- }
105
- writeContainedSetting(configFile, 'vhdx');
106
- }
107
- finally {
108
- const done = await working('Dismounting the image (Windows asks for permission)', () => storage.release('cli'));
109
- if (!done.dismounted)
110
- console.log(c.yellow('The image stays mounted (' + (done.note ?? '') + '). sandbox repair dismounts it.'));
111
- }
112
- console.log('Contained storage is on. sandbox launch mounts the image first.');
113
- return 0;
114
- }
115
- async function turnOff(ctx) {
116
- requireAvailable();
117
- requireNoSandbox();
118
- const storage = storageFor(ctx);
119
- const configFile = ctx.loaded.configPath ?? userConfigPath();
120
- console.log(c.yellow(BETA + 'Turning contained storage off moves the files back into plain folders.'));
121
- if (!storage.imageExists()) {
122
- writeContainedSetting(configFile, 'off');
123
- console.log('There is no image, so there was nothing to move. Contained storage is off.');
124
- return 0;
125
- }
126
- const mount = await working('Mounting the image (Windows asks for permission)', () => storage.acquire({ id: 'cli', pid: process.pid }));
127
- let moved = false;
128
- try {
129
- const plan = planTransfer(mount, ctx.dataPath, ctx.dataPath);
130
- if (plan.folders.length > 0) {
131
- console.log('\nIn the image:');
132
- printPlan(plan, ctx.dataPath);
133
- assertTargetsFree(plan);
134
- if (!ctx.options.yes &&
135
- !(await askRequired('Move them back out of the image?', 'Add --yes to move without asking.', true)))
136
- return fail('Nothing was moved.', 'Contained storage is still on.');
137
- let line = 'Copying';
138
- const result = await working(() => line, () => runTransfer(plan, mount, (p) => {
139
- line = 'Copying: ' + p.files.toLocaleString('en-US') + ' files, ' + humanBytes(p.bytes);
140
- }));
141
- console.log('Moved ' + result.files.toLocaleString('en-US') + ' files back.');
142
- for (const note of result.notes)
143
- console.log(c.yellow(note));
144
- }
145
- writeContainedSetting(configFile, 'off');
146
- moved = true;
147
- }
148
- finally {
149
- const done = await working('Dismounting the image (Windows asks for permission)', () => storage.release('cli'));
150
- if (!done.dismounted)
151
- console.log(c.yellow('The image stays mounted (' + (done.note ?? '') + '). sandbox repair dismounts it.'));
152
- else if (!moved)
153
- console.log('The image was dismounted; contained storage is still on.');
154
- }
155
- console.log('Contained storage is off: tools, state and logs are plain folders in ' + ctx.dataPath + '.');
156
- const bytes = fs.statSync(storage.paths.image).size;
157
- if (!ctx.options.yes &&
158
- (await askRequired('Delete the image file now (' + humanBytes(bytes) + ')? Everything in it was moved out.', 'Answer no to keep it.', false))) {
159
- await storage.deleteImage();
160
- console.log('Deleted ' + storage.paths.image + '.');
161
- }
162
- else
163
- console.log('The image file is kept: ' + storage.paths.image + ' (delete it yourself when you are sure).');
164
- return 0;
165
- }
166
- /** `sandbox storage contained [status|on|off]`. */
167
- export function contained(ctx) {
168
- const [, mode = 'status'] = ctx.options.positionals;
169
- switch (mode) {
170
- case 'status':
171
- return status(ctx);
172
- case 'on':
173
- return turnOn(ctx);
174
- case 'off':
175
- return turnOff(ctx);
176
- default:
177
- return Promise.resolve(fail('Unknown action "' + mode + '" for contained storage.', 'Use: sandbox storage contained on, off or status'));
178
- }
179
- }
@@ -1,8 +0,0 @@
1
- import { type MoveResult } from '../../../host/storage/index.js';
2
- import { type Context } from '../context.js';
3
- /** Why a move cannot start (a background sync is still on a data folder in the old storage), or null. */
4
- export declare function storageBusy(root: string): string | null;
5
- /** Moves the data with progress on the terminal; remembers both folders. Used by the command and the start offer. */
6
- export declare function performMove(ctx: Context, to: string, keepOld: boolean): Promise<MoveResult>;
7
- /** `sandbox storage [show|move <folder>|use <folder>]`. */
8
- export declare function storage(ctx: Context): number | Promise<number>;