windows-development-sandbox 1.9.0 → 1.11.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/README.md +64 -17
  2. package/config.example.json +7 -2
  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 +201 -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 +952 -4
  32. package/dist/app/features/defs.js +147 -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 +281 -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 +225 -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 +225 -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 +23 -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 -88
  149. package/dist/cli/commands/web.d.ts +7 -1
  150. package/dist/cli/commands/web.js +45 -71
  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 +3 -2
  200. package/dist/core/schema/config.d.ts +6 -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/schema/vpn.js +1 -1
  211. package/dist/core/schema/web.d.ts +1 -0
  212. package/dist/core/schema/web.js +4 -1
  213. package/dist/core/types.d.ts +6 -3
  214. package/dist/guest/boot/boot.js +11 -1
  215. package/dist/guest/daemon/daemon.js +1 -1
  216. package/dist/guest/daemon/sessions.d.ts +3 -2
  217. package/dist/guest/daemon/sessions.js +38 -7
  218. package/dist/guest/governor/core.d.ts +44 -0
  219. package/dist/guest/governor/core.js +124 -0
  220. package/dist/guest/governor/decide.d.ts +53 -15
  221. package/dist/guest/governor/decide.js +155 -72
  222. package/dist/guest/governor/governor.d.ts +2 -35
  223. package/dist/guest/governor/governor.js +35 -99
  224. package/dist/guest/governor/index.d.ts +1 -0
  225. package/dist/guest/governor/index.js +1 -0
  226. package/dist/guest/network/firewall.d.ts +3 -0
  227. package/dist/guest/network/firewall.js +65 -23
  228. package/dist/guest/runtime/process.js +53 -5
  229. package/dist/guest/sessions/viewer.js +5 -1
  230. package/dist/guest/setup/claude-mem.js +12 -4
  231. package/dist/guest/setup/github-token.d.ts +7 -0
  232. package/dist/guest/setup/github-token.js +65 -0
  233. package/dist/guest/toolchains/languages/node.js +40 -4
  234. package/dist/guest/toolchains/native/rust-extras.js +2 -2
  235. package/dist/guest/toolchains/tools/cli.d.ts +8 -0
  236. package/dist/guest/toolchains/tools/cli.js +16 -2
  237. package/dist/guest/vpn/openvpn.d.ts +5 -0
  238. package/dist/guest/vpn/openvpn.js +14 -1
  239. package/dist/guest/vpn/vpn.js +55 -16
  240. package/dist/guest/vpn/wireguard.js +2 -0
  241. package/dist/host/channel/attach.d.ts +1 -0
  242. package/dist/host/channel/attach.js +1 -0
  243. package/dist/host/channel/channel.d.ts +1 -1
  244. package/dist/host/channel/channel.js +2 -2
  245. package/dist/host/engines/hcs/check.d.ts +1 -0
  246. package/dist/host/engines/hcs/check.js +1 -1
  247. package/dist/host/engines/hcs/engine.d.ts +1 -1
  248. package/dist/host/engines/hcs/engine.js +6 -4
  249. package/dist/host/engines/hcs/helper.d.ts +11 -0
  250. package/dist/host/engines/hcs/helper.js +31 -2
  251. package/dist/host/engines/hcs/leftovers.d.ts +42 -0
  252. package/dist/host/engines/hcs/leftovers.js +101 -0
  253. package/dist/host/engines/index.d.ts +1 -0
  254. package/dist/host/engines/index.js +1 -0
  255. package/dist/host/github/deliver.d.ts +13 -0
  256. package/dist/host/github/deliver.js +51 -0
  257. package/dist/host/github/index.d.ts +2 -0
  258. package/dist/host/github/index.js +3 -0
  259. package/dist/host/github/token.d.ts +21 -0
  260. package/dist/host/github/token.js +74 -0
  261. package/dist/host/launch/generate.js +11 -5
  262. package/dist/host/launch/index.d.ts +1 -1
  263. package/dist/host/launch/index.js +1 -1
  264. package/dist/host/launch/session-file.js +1 -2
  265. package/dist/host/launch/wsb-file.d.ts +11 -7
  266. package/dist/host/launch/wsb-file.js +30 -12
  267. package/dist/host/life/host-memory.d.ts +1 -0
  268. package/dist/host/life/host-memory.js +4 -1
  269. package/dist/host/life/watchdog.d.ts +11 -0
  270. package/dist/host/life/watchdog.js +36 -4
  271. package/dist/host/sandbox/tasklist.d.ts +6 -0
  272. package/dist/host/sandbox/tasklist.js +37 -0
  273. package/dist/host/secrets/launch-secrets.d.ts +2 -1
  274. package/dist/host/secrets/launch-secrets.js +4 -2
  275. package/dist/host/vpn/status.js +13 -3
  276. package/dist/host/web/backend.d.ts +1 -3
  277. package/dist/host/web/index.d.ts +2 -1
  278. package/dist/host/web/index.js +2 -1
  279. package/dist/host/web/live.d.ts +23 -0
  280. package/dist/host/web/live.js +107 -0
  281. package/dist/host/web/rpc.d.ts +6 -1
  282. package/dist/host/web/rpc.js +23 -31
  283. package/dist/host/web/runner.d.ts +4 -0
  284. package/dist/host/web/runner.js +12 -1
  285. package/dist/host/web/server.d.ts +30 -2
  286. package/dist/host/web/server.js +87 -29
  287. package/dist/host/web/state.d.ts +1 -0
  288. package/dist/host/web/state.js +2 -0
  289. package/dist/runtime/agent.js +44 -16
  290. package/dist/runtime/daemon.js +1154 -857
  291. package/dist/runtime/db.js +44 -16
  292. package/dist/runtime/main.js +532 -115
  293. package/dist/runtime/netproxy.js +34 -9
  294. package/dist/runtime/view.js +499 -149
  295. package/dist/selftest/app.test.js +620 -12
  296. package/dist/selftest/channel.test.js +18 -1
  297. package/dist/selftest/cli.test.js +1 -1
  298. package/dist/selftest/config.test.js +1 -1
  299. package/dist/selftest/contained.test.js +1 -1
  300. package/dist/selftest/data.test.js +1 -2
  301. package/dist/selftest/engine.test.js +3 -1
  302. package/dist/selftest/github.test.d.ts +2 -0
  303. package/dist/selftest/github.test.js +243 -0
  304. package/dist/selftest/guest-boot.test.js +47 -1
  305. package/dist/selftest/hcs.test.js +105 -8
  306. package/dist/selftest/health.test.js +71 -0
  307. package/dist/selftest/heavy-load.test.js +152 -66
  308. package/dist/selftest/index.js +4 -0
  309. package/dist/selftest/layout.test.js +8 -0
  310. package/dist/selftest/live-terminal.test.js +74 -0
  311. package/dist/selftest/menu-screens.js +171 -56
  312. package/dist/selftest/menu.test.js +54 -37
  313. package/dist/selftest/migrate.test.js +14 -12
  314. package/dist/selftest/network.test.js +20 -1
  315. package/dist/selftest/powershell-variables.test.d.ts +2 -0
  316. package/dist/selftest/powershell-variables.test.js +61 -0
  317. package/dist/selftest/support/engine-golden.js +1 -0
  318. package/dist/selftest/support/fixtures.d.ts +5 -0
  319. package/dist/selftest/support/web-preview.d.ts +1 -0
  320. package/dist/selftest/support/web-preview.js +856 -0
  321. package/dist/selftest/update-service.test.js +15 -8
  322. package/dist/selftest/vpn.test.js +86 -2
  323. package/dist/selftest/web.test.js +58 -11
  324. package/dist/shared/channel/run-dir.d.ts +2 -0
  325. package/dist/shared/channel/run-dir.js +3 -0
  326. package/dist/shared/channel/schema.d.ts +7 -0
  327. package/dist/shared/channel/schema.js +9 -1
  328. package/dist/shared/channel/secrets.d.ts +1 -0
  329. package/dist/shared/channel/secrets.js +3 -0
  330. package/dist/shared/github/index.d.ts +1 -0
  331. package/dist/shared/github/index.js +2 -0
  332. package/dist/shared/github/token.d.ts +29 -0
  333. package/dist/shared/github/token.js +89 -0
  334. package/dist/shared/io/copy-tree.d.ts +7 -0
  335. package/dist/shared/io/copy-tree.js +45 -0
  336. package/dist/shared/io/index.d.ts +2 -0
  337. package/dist/shared/io/index.js +2 -0
  338. package/dist/shared/io/robocopy-result.d.ts +6 -0
  339. package/dist/shared/io/robocopy-result.js +23 -0
  340. package/dist/shared/memory/policy.d.ts +38 -12
  341. package/dist/shared/memory/policy.js +58 -19
  342. package/dist/shared/network/firewall-rules.d.ts +8 -0
  343. package/dist/shared/network/firewall-rules.js +28 -0
  344. package/dist/shared/pty/ctrl-c.d.ts +18 -0
  345. package/dist/shared/pty/ctrl-c.js +36 -0
  346. package/dist/shared/pty/index.d.ts +1 -0
  347. package/dist/shared/pty/index.js +1 -0
  348. package/dist/shared/pty/terminal.d.ts +2 -0
  349. package/dist/shared/pty/terminal.js +21 -2
  350. package/dist/shared/vpn/kill-switch.d.ts +13 -2
  351. package/dist/shared/vpn/kill-switch.js +88 -8
  352. package/dist/shared/web/protocol.d.ts +0 -4
  353. package/dist/sync/watcher.js +1 -1
  354. package/dist/web/index.html +2 -2
  355. package/dist/web/{main-T5DMCHYV.css → main-6JF3ASB5.css} +1 -1
  356. package/dist/web/main-Z645W45E.js +219 -0
  357. package/native/csharp/HcsHost/AssemblyInfo.cs +3 -3
  358. package/native/csharp/HostTools/AssemblyInfo.cs +3 -3
  359. package/native/csharp/HostTools/MemoryStatus.cs +128 -107
  360. package/native/scripts/memory-status.ps1 +10 -2
  361. package/package.json +10 -3
  362. package/sandbox/csharp/MemGov.cs +668 -398
  363. package/sandbox/csharp/PtyHost.cs +104 -15
  364. package/sandbox/csharp/SandboxTools/CpuCap.cs +50 -1
  365. package/sandbox/csharp/SandboxTools/Program.cs +1 -1
  366. package/sandbox/scripts/new-shortcuts.ps1 +3 -1
  367. package/sandbox/scripts/repair-wmi-services.ps1 +26 -0
  368. package/schemas/config.schema.json +25 -7
  369. package/schemas/sandbox-config.schema.json +7 -3
  370. package/dist/cli/commands/accounts.d.ts +0 -2
  371. package/dist/cli/commands/accounts.js +0 -96
  372. package/dist/cli/commands/data/clean.d.ts +0 -3
  373. package/dist/cli/commands/data/clean.js +0 -60
  374. package/dist/cli/commands/data/index.d.ts +0 -4
  375. package/dist/cli/commands/data/index.js +0 -62
  376. package/dist/cli/commands/maintenance/clean.d.ts +0 -2
  377. package/dist/cli/commands/maintenance/clean.js +0 -24
  378. package/dist/cli/commands/maintenance/config-share.d.ts +0 -12
  379. package/dist/cli/commands/maintenance/config-share.js +0 -80
  380. package/dist/cli/commands/projects/projects.d.ts +0 -2
  381. package/dist/cli/commands/projects/projects.js +0 -162
  382. package/dist/cli/commands/storage/contained.d.ts +0 -3
  383. package/dist/cli/commands/storage/contained.js +0 -179
  384. package/dist/cli/commands/storage/storage.d.ts +0 -8
  385. package/dist/cli/commands/storage/storage.js +0 -179
  386. package/dist/cli/menu/add-agent.d.ts +0 -47
  387. package/dist/cli/menu/add-agent.js +0 -168
  388. package/dist/cli/menu/apps.d.ts +0 -69
  389. package/dist/cli/menu/apps.js +0 -214
  390. package/dist/cli/menu/data-folder.d.ts +0 -18
  391. package/dist/cli/menu/data-folder.js +0 -99
  392. package/dist/cli/menu/share-settings.d.ts +0 -21
  393. package/dist/cli/menu/share-settings.js +0 -112
  394. package/dist/cli/menu/vpn-login.d.ts +0 -16
  395. package/dist/cli/menu/vpn-login.js +0 -74
  396. package/dist/web/main-NRRS5O6Z.js +0 -157
  397. /package/dist/cli/{commands/data/collect.d.ts → services/data-collect.d.ts} +0 -0
  398. /package/dist/cli/{commands/data/remove.d.ts → services/data-remove.d.ts} +0 -0
@@ -9,6 +9,8 @@ import { generateSandbox, GUEST, vgpuSource, vgpuWarning } from '../../../host/l
9
9
  import { findSecretFiles } from '../../../host/profile/index.js';
10
10
  import { RepoGuardStore } from '../../../host/guard/index.js';
11
11
  import { hostPublicIp, prepareVpn, readVpnLine, vpnNotes } from '../../../host/vpn/index.js';
12
+ import { prepareGithubToken } from '../../../host/github/index.js';
13
+ import { clearSecrets } from '../../../host/secrets/index.js';
12
14
  import { assertCanLaunch, isSandboxRunning, spawnDetached, probeHost, hideSandboxWindow, realContainedDeps, } from '../../../host/sandbox/index.js';
13
15
  import { KnownProjects, ProjectRegistry } from '../../../host/projects/index.js';
14
16
  import { LifeRecord, pageFileRisk, readHostMemory, SessionLedger, takePageFileHint } from '../../../host/life/index.js';
@@ -29,6 +31,7 @@ import { packageVersion } from '../../../core/package-info.js';
29
31
  import { reopenedText, reopenSessions } from '../sessions/reopen.js';
30
32
  import { sessionsToResume } from './resume-offer.js';
31
33
  import { startIntoRunning, launchIntoRunning, contextFor, waitForBoot, attachHere, waitForStart, openSession, readySandbox, } from './running.js';
34
+ import { startWebOnLaunch } from '../web.js';
32
35
  import { maybeAddRoot } from './add-root.js';
33
36
  import { prepare, firstBootNotice } from './prepare.js';
34
37
  import { bootWantsFor } from './boot-wants.js';
@@ -166,6 +169,10 @@ class Launcher {
166
169
  sandboxRunning: isSandboxRunning(),
167
170
  base: run.workspaceHost,
168
171
  });
172
+ // github.shareToken: the saved token, read only for this launch's one-shot file (a note says when it is not).
173
+ const github = generateOnly
174
+ ? null
175
+ : prepareGithubToken(config, ctx.storageRoot, undefined, bootWants.wants.projects);
169
176
  // This PC's commit (RAM plus paging file) bounds the sandbox's memory as much as free RAM does.
170
177
  const hostMemory = generateOnly ? null : readHostMemory(ctx.storageRoot);
171
178
  const generated = generateSandbox({
@@ -178,6 +185,7 @@ class Launcher {
178
185
  autoSession: extras.autoSession,
179
186
  bootWants: bootWants.wants,
180
187
  ...(vpn ? { vpn } : {}),
188
+ ...(github?.token ? { githubToken: github.token } : {}),
181
189
  ...(dataMappings ? { dataMappings } : {}),
182
190
  }, engine);
183
191
  const notes = [...run.notes, ...bootWants.notes, ...generated.projects.notes, ...generated.mappingNotes];
@@ -193,15 +201,26 @@ class Launcher {
193
201
  this.warnSecretFiles(run);
194
202
  for (const line of vpnNotes(config.vpn))
195
203
  console.log(c.yellow(line));
204
+ for (const line of github?.notes ?? [])
205
+ console.log(c.yellow(line));
196
206
  table(launchSummary(run, generated, prepared));
197
207
  if (generateOnly)
198
208
  return 0;
199
209
  // A restart or sandbox resume reopens sessions itself (they pass the projects they keep).
200
- const reopen = extras.extraProjects ? [] : await sessionsToResume(ctx, run);
201
- this.record(run, generated);
202
- this.share(generated);
203
- await engine.start(generated.enginePlan);
210
+ let reopen;
211
+ try {
212
+ reopen = extras.extraProjects ? [] : await sessionsToResume(ctx, run);
213
+ this.record(run, generated);
214
+ this.share(generated);
215
+ await engine.start(generated.enginePlan);
216
+ }
217
+ catch (e) {
218
+ // No sandbox will read the one-shot file (logins, the GitHub token): it does not wait for the next launch.
219
+ clearSecrets(ctx.storageRoot, run.dataPath);
220
+ throw e;
221
+ }
204
222
  this.startWatcher();
223
+ await startWebOnLaunch(this.ctx);
205
224
  if (reopen.length)
206
225
  await this.reopenAfterBoot(generated.launchId, reopen);
207
226
  return this.afterStart(run, generated);
@@ -18,7 +18,10 @@ export function attachHere(ctx, session) {
18
18
  if (ctx.loaded.config.attach.autoHide && !insideSandbox())
19
19
  void hideSandboxWindow(ctx.storageRoot, 120).catch(() => false);
20
20
  // A copy in the agent reaches this PC's clipboard only when sandbox.clipboard already shares it with the sandbox.
21
- return attachTerminal(session, { clipboardWrites: ctx.loaded.config.sandbox.clipboard });
21
+ return attachTerminal(session, {
22
+ clipboardWrites: ctx.loaded.config.sandbox.clipboard,
23
+ confirmCtrlC: ctx.loaded.config.attach.confirmCtrlC,
24
+ });
22
25
  }
23
26
  /** The sandbox writes sandbox.json a few seconds into its boot; a second launch right after the first waits for it. */
24
27
  export async function runningSandboxStatus(dataPath) {
@@ -11,7 +11,6 @@ import { dirExists, fail, safeText, writeJson } from '../../../core/util/index.j
11
11
  import { system32 } from '../../../shared/system.js';
12
12
  import { refuseInSelfTest } from '../../../host/test-guard.js';
13
13
  import { c, nextStep, table } from '../../output/index.js';
14
- import { exportCommand, importCommand } from './config-share.js';
15
14
  /** The settings file exists already: open it, start over, or leave it (no terminal: say how). */
16
15
  async function existingFile(file) {
17
16
  return askChoice(file + ' exists already.', [
@@ -134,7 +133,7 @@ function previewFolders(ctx, dir, filePath, overrides) {
134
133
  }
135
134
  export function config(ctx) {
136
135
  // get, set, reset and list are the settings feature's operations (cli/operations runs them before this).
137
- const [action = 'summary', key] = ctx.options.positionals;
136
+ const [action = 'summary'] = ctx.options.positionals;
138
137
  switch (action) {
139
138
  case 'summary':
140
139
  table([
@@ -159,10 +158,6 @@ export function config(ctx) {
159
158
  case 'show':
160
159
  console.log(JSON.stringify(redactSecrets(ctx.loaded.config), null, 2));
161
160
  return 0;
162
- case 'export':
163
- return exportCommand(ctx, key);
164
- case 'import':
165
- return importCommand(ctx, key);
166
161
  case 'schema':
167
162
  return printSchemaSettings();
168
163
  case 'check':
@@ -1,6 +1,5 @@
1
1
  export * from './sync.js';
2
2
  export * from './logs.js';
3
- export * from './clean.js';
4
3
  export * from './config.js';
5
4
  export * from './doctor.js';
6
5
  export * from './host-claude.js';
@@ -1,7 +1,6 @@
1
- // sync, logs, clean, config, doctor, host-claude and the internal sync watcher.
1
+ // sync, logs, config, doctor, host-claude and the internal sync watcher.
2
2
  export * from './sync.js';
3
3
  export * from './logs.js';
4
- export * from './clean.js';
5
4
  export * from './config.js';
6
5
  export * from './doctor.js';
7
6
  export * from './host-claude.js';
@@ -1,38 +1,33 @@
1
- import { sleep } from '../../../core/util/index.js';
2
- import { newestCrashReport } from '../../../host/life/index.js';
3
- import { LogsService } from '../../services/index.js';
4
- /** The newest crash report (written by the background sync when the sandbox or this PC went down). */
5
- function printCrashReport(ctx) {
6
- const report = newestCrashReport(ctx.storageRoot);
7
- if (!report) {
1
+ // `sandbox logs`: the end of the newest log, the last crash report (--crash), and with --follow the new text until
2
+ // Ctrl+C. It reads through the logs feature's queries (readQuery) and only prints and loops: --follow cannot be a
3
+ // one-shot operation (see logs.def.ts).
4
+ import { CRASH, listLogs, tailLog } from '../../../app/features/logs/index.js';
5
+ import { readQuery } from '../../../app/registry.js';
6
+ import { fail, sleep } from '../../../core/util/index.js';
7
+ export async function logs(ctx) {
8
+ const crash = Boolean(ctx.options.crash);
9
+ if (crash && !(await readQuery(listLogs, ctx)).crash) {
8
10
  console.log('No crash report yet: no sandbox has ended in a crash since this was installed.');
9
11
  return 0;
10
12
  }
11
- console.log('== ' + report.file + ' ==');
12
- console.log(report.text);
13
- return 0;
14
- }
15
- export async function logs(ctx) {
16
- if (ctx.options.crash)
17
- return printCrashReport(ctx);
18
- const service = new LogsService(ctx);
19
- const file = service.newest();
20
- console.log('== ' + file + ' ==');
21
- let printed = 0;
22
- // The log is written inside the sandbox: read only its tail, and make it safe for your terminal.
23
- const print = () => {
24
- const chunk = service.read(file, printed);
25
- if (!chunk)
26
- return;
27
- process.stdout.write(printed === 0 ? chunk.text.split('\n').slice(-120).join('\n') : chunk.text);
28
- printed = chunk.next;
29
- };
30
- print();
31
- if (ctx.options.follow)
32
- console.error('(following; Ctrl+C to stop)');
33
- while (ctx.options.follow) {
13
+ let tail = await readQuery(tailLog, ctx, { name: crash ? CRASH : undefined });
14
+ if (!tail.file) {
15
+ const listed = await readQuery(listLogs, ctx);
16
+ fail('No sandbox logs yet in ' + listed.folder + '.', 'Logs appear after the first start (sandbox claude).');
17
+ }
18
+ console.log('== ' + tail.file + ' ==');
19
+ if (crash) {
20
+ console.log(tail.text);
21
+ return 0;
22
+ }
23
+ process.stdout.write(tail.text);
24
+ if (!ctx.options.follow)
25
+ return 0;
26
+ console.error('(following; Ctrl+C to stop)');
27
+ for (;;) {
34
28
  await sleep(1000);
35
- print();
29
+ const more = await readQuery(tailLog, ctx, { name: tail.name, from: tail.next });
30
+ process.stdout.write(more.text);
31
+ tail = { ...tail, next: more.next };
36
32
  }
37
- return 0;
38
33
  }
@@ -1,12 +1,4 @@
1
- import { MigrateService } from '../../services/index.js';
2
1
  import { type Context } from '../context.js';
3
- /** `sandbox migrate`: the work, with the service and the output given so a test can drive it. */
4
- export declare function runMigrate(service: MigrateService, options: {
5
- readonly dryRun: boolean;
6
- readonly restore?: string;
7
- readonly yes?: boolean;
8
- }, print: (line: string) => void): Promise<number>;
9
- export declare function migrate(ctx: Context): Promise<number>;
10
2
  /**
11
3
  * Before a command: brings the settings up to date when the version changed (one small file is read otherwise).
12
4
  * A failure stops the command (throws), except for doctor, which prints it and goes on.
@@ -1,51 +1,9 @@
1
- import { userDir } from '../../../core/config/index.js';
2
- import { autoMigrates, continuesAfterFailedMigration, MigrateService, } from '../../services/index.js';
3
- import { askRequired } from '../../../core/prompt.js';
1
+ import { autoMigrates, continuesAfterFailedMigration, MigrateService } from '../../services/index.js';
4
2
  import { c } from '../../output/index.js';
5
3
  import { errMsg, UserError } from '../../../core/util/index.js';
6
4
  import { insideSandbox } from '../../../host/sandbox/index.js';
7
- import { holdsData, oldDefaultRoot } from '../../../host/storage/index.js';
5
+ import { whereOf } from '../../../app/features/updates/index.js';
8
6
  import { refreshStorage } from '../context.js';
9
- /**
10
- * Where this context keeps the saved settings. Backups go where the data is: an upgrade that has not pinned the old
11
- * folder yet would otherwise fill the new, empty default folder with them.
12
- */
13
- function whereOf(ctx) {
14
- const old = oldDefaultRoot();
15
- const unpinned = old !== null && !holdsData(ctx.storageRoot) && holdsData(old) && !ctx.loaded.layers?.machine;
16
- return { storageRoot: unpinned ? old : ctx.storageRoot, userDir: userDir(), configPath: ctx.loaded.configPath };
17
- }
18
- /** `sandbox migrate`: the work, with the service and the output given so a test can drive it. */
19
- export async function runMigrate(service, options, print) {
20
- if (options.restore) {
21
- if (!options.yes &&
22
- !(await askRequired('Put back the files saved in ' + options.restore + '? Your current settings files are replaced.', 'Add --yes to put them back without asking.'))) {
23
- print('Nothing was changed.');
24
- return 1;
25
- }
26
- service.restore(options.restore);
27
- print('Put back the files saved in ' + options.restore + '.');
28
- return 0;
29
- }
30
- if (options.dryRun) {
31
- const plan = service.plan();
32
- print(plan.length ? 'Would update:' : 'Nothing to update.');
33
- for (const line of plan)
34
- print(' ' + line);
35
- return 0;
36
- }
37
- const result = await service.run((line) => print(c.dim(line)));
38
- if (result.applied.length)
39
- print('Updated: ' + result.applied.join(', ') + '.');
40
- else if (!result.postponed.length)
41
- print('Nothing to update.');
42
- if (result.postponed.length)
43
- print('Waiting for no sandbox to run: ' + result.postponed.join(', ') + '.');
44
- return 0;
45
- }
46
- export function migrate(ctx) {
47
- return runMigrate(new MigrateService(whereOf(ctx)), { dryRun: ctx.options.dryRun, restore: ctx.options.restore, yes: ctx.options.yes }, (line) => console.log(line));
48
- }
49
7
  /**
50
8
  * Before a command: brings the settings up to date when the version changed (one small file is read otherwise).
51
9
  * A failure stops the command (throws), except for doctor, which prints it and goes on.
@@ -1,22 +1,3 @@
1
- import type { UpdateResult } from '../../../host/update/index.js';
2
- import type { CliOptions } from '../../args.js';
3
- import { UpdateService } from '../../services/index.js';
4
- export interface UpdateRequest {
5
- readonly check: boolean;
6
- readonly rollback: boolean;
7
- readonly auto?: 'on' | 'off';
8
- readonly unattended: boolean;
9
- /** Do not ask before going back. */
10
- readonly yes?: boolean;
11
- }
12
- /** One sentence for what an update run did, and whether it counts as done. */
13
- export declare function describeResult(result: UpdateResult | null, unattended: boolean): {
14
- line: string;
15
- code: number;
16
- };
17
- /** `sandbox update`: the work, with the service and the output given so a test can drive it. */
18
- export declare function runUpdate(service: UpdateService, request: UpdateRequest, print: (line: string) => void): Promise<number>;
19
- export declare function update(options: CliOptions): Promise<number>;
20
1
  /**
21
2
  * At the start of a command: tells this user once about an update that ran without them, and (current-user installs
22
3
  * with automatic updates on) starts the daily check in the background. Never stops the command.
@@ -1,107 +1,9 @@
1
1
  import { userDir } from '../../../core/config/index.js';
2
- import { askRequired } from '../../../core/prompt.js';
3
2
  import { errMsg } from '../../../core/util/index.js';
4
3
  import { PACKAGE_ROOT } from '../../../core/package-info.js';
5
4
  import { insideSandbox, spawnDetached } from '../../../host/sandbox/index.js';
6
5
  import { c } from '../../output/index.js';
7
- import { NPM_UPDATE_COMMAND, UpdateService } from '../../services/index.js';
8
- /** One sentence for what an update run did, and whether it counts as done. */
9
- export function describeResult(result, unattended) {
10
- if (!result)
11
- return { line: 'Another update is running right now.', code: 0 };
12
- if (result.kind === 'installed')
13
- return {
14
- line: 'Updated ' +
15
- (result.previous ? 'from ' + result.previous + ' ' : '') +
16
- 'to ' +
17
- result.version +
18
- '. Open a new terminal to use it.',
19
- code: 0,
20
- };
21
- if (result.kind === 'failed')
22
- return {
23
- line: 'Update to ' +
24
- result.version +
25
- ' failed: ' +
26
- result.reason.replace(/\.?\s*$/, '.') +
27
- (result.rolledBack
28
- ? ' The change was undone: you are on the version you had.'
29
- : ' Going back to your previous version did not fully work: run sandbox update --rollback or the installer.') +
30
- (result.autoUpdateOff
31
- ? ' Automatic updates are off; turn them back on in Maintenance > Updates or with sandbox update --auto on.'
32
- : result.blocked
33
- ? ' It is not tried again; the next release is.'
34
- : ' It is tried again later.'),
35
- code: 1,
36
- };
37
- switch (result.reason) {
38
- case 'up-to-date':
39
- return { line: 'You have the newest version (' + result.current + ').', code: 0 };
40
- case 'sandbox-running':
41
- return {
42
- line: 'A Windows Sandbox is running, so nothing was installed. Close it (sandbox stop), then update again.',
43
- code: unattended ? 0 : 1,
44
- };
45
- case 'failed-before':
46
- return {
47
- line: 'The newest version failed to install before. It is not tried again until a newer one is released.',
48
- code: 0,
49
- };
50
- case 'no-release':
51
- return { line: 'No release was found.', code: 0 };
52
- case 'too-soon':
53
- return { line: 'Looked a short while ago; nothing to do yet.', code: 0 };
54
- }
55
- }
56
- /** `sandbox update`: the work, with the service and the output given so a test can drive it. */
57
- export async function runUpdate(service, request, print) {
58
- if (!service.managed) {
59
- print('This copy was installed with npm. Update it with: ' + NPM_UPDATE_COMMAND);
60
- return 0;
61
- }
62
- // The scheduled task (it may outlive a removal that needed admin) and background starts only run when updates are on.
63
- if (request.unattended && !request.auto && !service.status().autoUpdate)
64
- return 0;
65
- if (request.auto) {
66
- service.setAuto(request.auto === 'on');
67
- print('Automatic updates are ' + request.auto + '.');
68
- return 0;
69
- }
70
- if (request.rollback) {
71
- const { version, state } = service.status();
72
- const target = state.previous ? 'version ' + state.previous : 'the version before the last update';
73
- if (!request.yes &&
74
- !(await askRequired('Go back from version ' + version + ' to ' + target + '?', 'Add --yes to go back without asking.'))) {
75
- print('Nothing was changed.');
76
- return 1;
77
- }
78
- print('Went back to version ' + service.rollback() + '.');
79
- return 0;
80
- }
81
- if (request.check) {
82
- const found = await service.check();
83
- if (found.available && found.latest)
84
- print('Version ' + found.latest.version + ' is available (you have ' + found.current + '). Run: sandbox update');
85
- else if (found.blocked)
86
- print('A newer version exists but failed to install before; you have ' + found.current + '.');
87
- else
88
- print('You have the newest version (' + found.current + ').');
89
- return 0;
90
- }
91
- const done = describeResult(await service.run(), request.unattended);
92
- print(done.line);
93
- return done.code;
94
- }
95
- export function update(options) {
96
- const service = UpdateService.forPackage(PACKAGE_ROOT, options.feed, { userDir: userDir() });
97
- return runUpdate(service, {
98
- check: options.check,
99
- rollback: options.rollback,
100
- auto: options.autoUpdate,
101
- unattended: options.unattended,
102
- yes: options.yes,
103
- }, (line) => console.log(line));
104
- }
6
+ import { UpdateService } from '../../services/index.js';
105
7
  /** Commands that never look for updates first: they are how updates run, or they must stay quiet. */
106
8
  const NO_STARTUP_UPDATE = ['self-test', 'update', '_watch', '_web'];
107
9
  /**
@@ -1,4 +1,3 @@
1
1
  export * from './here.js';
2
- export * from './projects.js';
3
2
  export * from './restart.js';
4
3
  export * from './describe-sessions.js';
@@ -1,4 +1,3 @@
1
1
  export * from './here.js';
2
- export * from './projects.js';
3
2
  export * from './restart.js';
4
3
  export * from './describe-sessions.js';
@@ -1,3 +1,3 @@
1
- import type { Context } from './context.js';
1
+ import { type Context } from './context.js';
2
2
  export type Handler = (ctx: Context) => number | Promise<number | void>;
3
3
  export declare const HANDLERS: Readonly<Partial<Record<string, Handler>>>;
@@ -1,15 +1,19 @@
1
+ import { requireOnPc } from './context.js';
1
2
  import { launch } from './launch/index.js';
2
3
  import { setup } from './setup/index.js';
3
- import { data } from './data/index.js';
4
- import { storage } from './storage/index.js';
4
+ import { cleanData, showData } from '../../app/features/data/index.js';
5
5
  import { attach, db, exec } from './sessions/index.js';
6
- import { account } from './accounts.js';
7
- import { projects } from './projects/index.js';
8
- import { audit, claudeHost, clean, config, doctor, hostCommand, logs, migrate, sync, watcher, } from './maintenance/index.js';
6
+ import { listAccounts } from '../../app/features/accounts/index.js';
7
+ import { containedStatus, showStorage } from '../../app/features/storage/index.js';
8
+ import { listProjects } from '../../app/features/projects/index.js';
9
+ import { definitionHandler } from '../operations/index.js';
10
+ import { fail } from '../../core/util/index.js';
11
+ import { audit, claudeHost, config, doctor, hostCommand, logs, sync, watcher } from './maintenance/index.js';
9
12
  import { engine } from './engine.js';
10
13
  import { resume } from './resume.js';
11
14
  import { agentCommandsCommand } from './agent-commands.js';
12
15
  import { vpn } from './vpn.js';
16
+ import { github } from './github.js';
13
17
  import { web, webServer } from './web.js';
14
18
  export const HANDLERS = {
15
19
  launch: (ctx) => launch(ctx),
@@ -19,23 +23,37 @@ export const HANDLERS = {
19
23
  'agent-commands': agentCommandsCommand,
20
24
  db: db,
21
25
  resume: resume,
22
- account: account,
23
- projects: projects,
26
+ // The bare command lists; its actions (save, use ...) are the operations' hints.
27
+ account: definitionHandler(listAccounts),
28
+ // The bare command lists; its actions (add, remove, roots ...) are the operations' hints.
29
+ projects: definitionHandler(listProjects),
24
30
  sync: sync,
25
31
  logs: logs,
26
32
  audit: audit,
27
- clean: clean,
28
33
  config: config,
29
34
  doctor: doctor,
30
- migrate: migrate,
31
35
  setup: setup,
32
- data: data,
33
- storage: storage,
36
+ // `data`, `data info` and `data list` show; `data remove` is `data clean` (its actions are the operations' hints).
37
+ data: (ctx) => ctx.options.positionals[0] === 'remove' ? definitionHandler(cleanData)(ctx) : definitionHandler(showData)(ctx),
38
+ // The bare command and `info` show; `contained` alone shows the beta status (the other actions are the operations'
39
+ // hints in src/app/features/storage).
40
+ storage: (ctx) => {
41
+ requireOnPc('storage');
42
+ const [action = 'show', mode] = ctx.options.positionals;
43
+ if (action === 'show' || action === 'info')
44
+ return definitionHandler(showStorage)(ctx);
45
+ if (action === 'contained' && mode === undefined)
46
+ return definitionHandler(containedStatus)(ctx);
47
+ if (action === 'contained')
48
+ return fail('Unknown action "' + mode + '" for contained storage.', 'Use: sandbox storage contained on, off or status');
49
+ return fail('Unknown storage action "' + action + '".', 'Use: sandbox storage, sandbox storage move <folder>, sandbox storage use <folder> or sandbox storage contained on|off|status');
50
+ },
34
51
  engine: engine,
35
52
  'host-claude': claudeHost,
36
53
  host: hostCommand,
37
54
  _watch: watcher,
38
55
  vpn: vpn,
56
+ github: github,
39
57
  web: web,
40
58
  _web: webServer,
41
59
  };
@@ -8,7 +8,7 @@ import { dirExists, isLink, removeLink } from '../../../../core/util/index.js';
8
8
  import { writeProblem } from '../../../../host/health/index.js';
9
9
  import { assertTestWritable } from '../../../../host/test-guard.js';
10
10
  import { OLD_DEFAULT_ROOT, StorageHistory, holdsData, oldDefaultRoot, otherDataFolders, sharedDefaultRoot, } from '../../../../host/storage/index.js';
11
- import { removeTree } from '../../data/remove.js';
11
+ import { removeTree } from '../../../services/data-remove.js';
12
12
  import { findHalfInstalled, findLinks, findStagingLeftovers, resolvedVersionsValid } from '../finders.js';
13
13
  import { guard, ok, plural, rel } from './common.js';
14
14
  const same = (a, b) => path.resolve(a).toLowerCase() === path.resolve(b).toLowerCase();
@@ -1,6 +1,6 @@
1
1
  // The HCS engine (alpha), only when sandbox.engine is "hcs": can this PC run it. Looks only; the fixes are commands for
2
2
  // you to run (they change Windows), never run by repair.
3
- import { checkHcs, realHcsProbes } from '../../../../host/engines/index.js';
3
+ import { checkHcs, lookForLeftovers, realHcsProbes } from '../../../../host/engines/index.js';
4
4
  import { ok } from './common.js';
5
5
  const hcsInUse = (env) => env.ctx.loaded.config.sandbox.engine === 'hcs';
6
6
  /** Replaceable by tests: the probes the row looks through. */
@@ -25,4 +25,31 @@ export const HCS_CHECKS = [
25
25
  };
26
26
  },
27
27
  },
28
+ {
29
+ id: 'hcs-leftovers',
30
+ group: 'Sandbox',
31
+ name: 'HCS systems left running',
32
+ checking: 'HCS systems left running',
33
+ // Shown for the HCS engine, and on any PC where one of ours is found (never builds HcsHost.exe to look).
34
+ applies: (env) => hcsInUse(env) || lookQuietly(env).length > 0,
35
+ timeoutMs: 60000,
36
+ run: (env) => {
37
+ const look = lookForLeftovers(env.ctx.loaded.config.storage.root);
38
+ if (!look.available)
39
+ return { status: 'skipped', detail: look.reason, means: 'No HCS system can be left running here.' };
40
+ if (!look.systems.length)
41
+ return ok('none of ours is running');
42
+ return {
43
+ status: 'warn',
44
+ detail: look.systems.length + ' running: ' + look.systems.map((s) => s.id).join(', '),
45
+ means: 'They hold memory until stopped (a crashed command can leave one up). If a sandbox is running on purpose, leave them.',
46
+ fix: 'sandbox engine clean',
47
+ };
48
+ },
49
+ },
28
50
  ];
51
+ /** The ids of ours that are running ([] when HCS is not there or has never been used). */
52
+ function lookQuietly(env) {
53
+ const look = lookForLeftovers(env.ctx.loaded.config.storage.root);
54
+ return look.available ? look.systems.map((s) => s.id) : [];
55
+ }
@@ -13,7 +13,7 @@ import { assertTestWritable, refuseInSelfTest } from '../../../../host/test-guar
13
13
  import { conptyDir, terminalDir, terminalExe } from '../../../../host/tools/index.js';
14
14
  import { RunDir } from '../../../../shared/channel/index.js';
15
15
  import { safeRemove } from '../../../../shared/io/index.js';
16
- import { removeTree } from '../../data/remove.js';
16
+ import { removeTree } from '../../../services/data-remove.js';
17
17
  import { deadPidFiles } from '../finders.js';
18
18
  import { fromFacts } from './pc.js';
19
19
  import { ok, plural, rel } from './common.js';
@@ -0,0 +1,30 @@
1
+ import { type RunHooks } from './engine.js';
2
+ import type { Check, CheckResult, RepairEnv, Summary } from './types.js';
3
+ /** Where the results of a run go while it runs: the CLI's HealthPrinter, or the shared core's io (ioEvents). */
4
+ export interface HealthEvents {
5
+ hooks(): RunHooks;
6
+ plan(fixable: readonly CheckResult[]): void;
7
+ line(text: string): void;
8
+ }
9
+ /** What happens to the fixes: applied without asking, asked (when allowed), or not at all. */
10
+ export interface HealthPlan {
11
+ /** Fix without asking. */
12
+ readonly yes: boolean;
13
+ /** May ask (a terminal, and not --json). */
14
+ readonly ask: boolean;
15
+ /** The question asked after the list of what will change. */
16
+ readonly question: (n: number) => string;
17
+ }
18
+ /** What both commands find, and what they do about it. */
19
+ export interface HealthReport {
20
+ readonly found: CheckResult[];
21
+ readonly final: CheckResult[];
22
+ readonly summary: Summary;
23
+ /** Fixes were applied. */
24
+ readonly changed: boolean;
25
+ }
26
+ /**
27
+ * Runs the checks, then (when allowed) the fixes. `events` is null for --json. Without a `confirmFix` a question is
28
+ * answered no, so nothing is fixed unless the plan says yes.
29
+ */
30
+ export declare function runHealth(env: RepairEnv, events: HealthEvents | null, plan: HealthPlan, checks?: readonly Check[], confirmFix?: (question: string) => Promise<boolean>): Promise<HealthReport>;
@@ -0,0 +1,32 @@
1
+ // The look -> ask -> fix decision of doctor and repair, with no surface in it: results go to `events` (the CLI's
2
+ // HealthPrinter, or the shared core's io), and the question is asked through `confirmFix`. Used by run.ts (the CLI) and
3
+ // by the health feature (the menu and the web).
4
+ import { ALL_CHECKS } from './checks/index.js';
5
+ import { HealthRun, summarize } from './engine.js';
6
+ /**
7
+ * Runs the checks, then (when allowed) the fixes. `events` is null for --json. Without a `confirmFix` a question is
8
+ * answered no, so nothing is fixed unless the plan says yes.
9
+ */
10
+ export async function runHealth(env, events, plan, checks = ALL_CHECKS, confirmFix = () => Promise.resolve(false)) {
11
+ const run = new HealthRun(checks, env, events?.hooks());
12
+ const found = await run.look();
13
+ const fixable = found.filter((r) => r.fixable);
14
+ let final = found;
15
+ let changed = false;
16
+ if (fixable.length) {
17
+ let go = plan.yes;
18
+ if (!go && plan.ask) {
19
+ events?.plan(fixable);
20
+ go = await confirmFix(plan.question(fixable.length));
21
+ }
22
+ if (go) {
23
+ if (plan.yes)
24
+ events?.plan(fixable);
25
+ final = await run.fix(found);
26
+ changed = true;
27
+ }
28
+ else
29
+ events?.line('\nNothing was changed.');
30
+ }
31
+ return { found, final, summary: summarize(final), changed };
32
+ }
@@ -1,11 +1,11 @@
1
+ import { summaryText } from '../../../app/features/health/index.js';
1
2
  import type { CheckResult, Summary } from './types.js';
2
3
  import type { RunHooks } from './engine.js';
4
+ export { summaryText };
3
5
  /** Where text goes (the terminal; a test collects it). */
4
6
  export interface Out {
5
7
  write(text: string): void;
6
8
  }
7
- /** "12 ok, 2 fixed, 1 needs you": the parts that are zero are left out (except ok). */
8
- export declare function summaryText(s: Summary): string;
9
9
  export declare class HealthPrinter {
10
10
  private readonly out;
11
11
  /** Redraw lines in place (a terminal); otherwise each result is one finished line. */