windows-development-sandbox 1.5.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (709) hide show
  1. package/README.md +1 -0
  2. package/config.example.json +27 -1
  3. package/dist/app/context.d.ts +8 -0
  4. package/dist/app/context.js +12 -0
  5. package/dist/app/features/defs.d.ts +322 -0
  6. package/dist/app/features/defs.js +28 -0
  7. package/dist/app/features/sandbox/index.d.ts +2 -0
  8. package/dist/app/features/sandbox/index.js +3 -0
  9. package/dist/app/features/sandbox/sandbox.def.d.ts +193 -0
  10. package/dist/app/features/sandbox/sandbox.def.js +245 -0
  11. package/dist/app/features/sandbox/sandbox.run.d.ts +72 -0
  12. package/dist/app/features/sandbox/sandbox.run.js +98 -0
  13. package/dist/app/features/sessions/index.d.ts +2 -0
  14. package/dist/app/features/sessions/index.js +3 -0
  15. package/dist/app/features/sessions/sessions.def.d.ts +141 -0
  16. package/dist/app/features/sessions/sessions.def.js +176 -0
  17. package/dist/app/features/sessions/sessions.run.d.ts +39 -0
  18. package/dist/app/features/sessions/sessions.run.js +58 -0
  19. package/dist/{cli/menu/settings/categories.d.ts → app/features/settings/categories.def.d.ts} +4 -0
  20. package/dist/{cli/menu/settings/categories.js → app/features/settings/categories.def.js} +40 -46
  21. package/dist/app/features/settings/index.d.ts +5 -0
  22. package/dist/app/features/settings/index.js +6 -0
  23. package/dist/{cli/menu/settings/config-file.d.ts → app/features/settings/settings-file.d.ts} +1 -1
  24. package/dist/{cli/menu/settings/config-file.js → app/features/settings/settings-file.js} +1 -1
  25. package/dist/app/features/settings/settings-rows.d.ts +35 -0
  26. package/dist/app/features/settings/settings-rows.js +94 -0
  27. package/dist/app/features/settings/settings.def.d.ts +157 -0
  28. package/dist/app/features/settings/settings.def.js +179 -0
  29. package/dist/app/features/settings/settings.run.d.ts +67 -0
  30. package/dist/app/features/settings/settings.run.js +84 -0
  31. package/dist/app/kernel/define.d.ts +143 -0
  32. package/dist/app/kernel/define.js +42 -0
  33. package/dist/app/kernel/errors.d.ts +34 -0
  34. package/dist/app/kernel/errors.js +45 -0
  35. package/dist/app/kernel/fields.d.ts +70 -0
  36. package/dist/app/kernel/fields.js +243 -0
  37. package/dist/app/kernel/index.d.ts +8 -0
  38. package/dist/app/kernel/index.js +10 -0
  39. package/dist/app/kernel/io.d.ts +193 -0
  40. package/dist/app/kernel/io.js +126 -0
  41. package/dist/app/kernel/rpc.d.ts +156 -0
  42. package/dist/app/kernel/rpc.js +47 -0
  43. package/dist/{cli/menu/settings → app/kernel}/schema-node.d.ts +9 -0
  44. package/dist/{cli/menu/settings → app/kernel}/schema-node.js +26 -0
  45. package/dist/app/kernel/text.d.ts +6 -0
  46. package/dist/app/kernel/text.js +57 -0
  47. package/dist/app/kernel/view.d.ts +146 -0
  48. package/dist/app/kernel/view.js +28 -0
  49. package/dist/app/registry.d.ts +10 -0
  50. package/dist/app/registry.js +50 -0
  51. package/dist/cli/args.d.ts +18 -2
  52. package/dist/cli/args.js +101 -24
  53. package/dist/cli/commands/accounts.js +45 -17
  54. package/dist/cli/commands/context.d.ts +2 -0
  55. package/dist/cli/commands/context.js +9 -2
  56. package/dist/cli/commands/data/clean.js +32 -9
  57. package/dist/cli/commands/engine.d.ts +2 -0
  58. package/dist/cli/commands/engine.js +60 -0
  59. package/dist/cli/commands/index.d.ts +2 -1
  60. package/dist/cli/commands/index.js +2 -1
  61. package/dist/cli/commands/launch/add-root.d.ts +3 -2
  62. package/dist/cli/commands/launch/add-root.js +11 -10
  63. package/dist/cli/commands/launch/launch.js +102 -9
  64. package/dist/cli/commands/launch/prepare.js +6 -4
  65. package/dist/cli/commands/launch/running.js +2 -1
  66. package/dist/cli/commands/launch/summary.d.ts +2 -0
  67. package/dist/cli/commands/maintenance/audit.js +1 -1
  68. package/dist/cli/commands/maintenance/clean.d.ts +1 -1
  69. package/dist/cli/commands/maintenance/clean.js +17 -3
  70. package/dist/cli/commands/maintenance/config-share.d.ts +12 -0
  71. package/dist/cli/commands/maintenance/config-share.js +80 -0
  72. package/dist/cli/commands/maintenance/config.d.ts +1 -1
  73. package/dist/cli/commands/maintenance/config.js +38 -10
  74. package/dist/cli/commands/maintenance/doctor.d.ts +1 -1
  75. package/dist/cli/commands/maintenance/doctor.js +2 -4
  76. package/dist/cli/commands/maintenance/logs.js +14 -0
  77. package/dist/cli/commands/maintenance/migrate.d.ts +2 -1
  78. package/dist/cli/commands/maintenance/migrate.js +19 -4
  79. package/dist/cli/commands/maintenance/sync.js +2 -0
  80. package/dist/cli/commands/maintenance/update.d.ts +2 -0
  81. package/dist/cli/commands/maintenance/update.js +27 -4
  82. package/dist/cli/commands/projects/here.js +12 -7
  83. package/dist/cli/commands/projects/projects.js +26 -17
  84. package/dist/cli/commands/registry.js +10 -7
  85. package/dist/cli/commands/repair/checks/agents.d.ts +2 -0
  86. package/dist/cli/commands/repair/checks/agents.js +70 -0
  87. package/dist/cli/commands/repair/checks/common.d.ts +8 -0
  88. package/dist/cli/commands/repair/checks/common.js +22 -0
  89. package/dist/cli/commands/repair/checks/contained.d.ts +2 -0
  90. package/dist/cli/commands/repair/checks/contained.js +139 -0
  91. package/dist/cli/commands/repair/checks/data.d.ts +2 -0
  92. package/dist/cli/commands/repair/checks/data.js +241 -0
  93. package/dist/cli/commands/repair/checks/hcs.d.ts +7 -0
  94. package/dist/cli/commands/repair/checks/hcs.js +28 -0
  95. package/dist/cli/commands/repair/checks/index.d.ts +2 -0
  96. package/dist/cli/commands/repair/checks/index.js +24 -0
  97. package/dist/cli/commands/repair/checks/install.d.ts +5 -0
  98. package/dist/cli/commands/repair/checks/install.js +318 -0
  99. package/dist/cli/commands/repair/checks/machine.d.ts +2 -0
  100. package/dist/cli/commands/repair/checks/machine.js +232 -0
  101. package/dist/cli/commands/repair/checks/network.d.ts +6 -0
  102. package/dist/cli/commands/repair/checks/network.js +60 -0
  103. package/dist/cli/commands/repair/checks/pc.d.ts +4 -0
  104. package/dist/cli/commands/repair/checks/pc.js +86 -0
  105. package/dist/cli/commands/repair/checks/sandbox.d.ts +2 -0
  106. package/dist/cli/commands/repair/checks/sandbox.js +282 -0
  107. package/dist/cli/commands/repair/checks/settings.d.ts +2 -0
  108. package/dist/cli/commands/repair/checks/settings.js +169 -0
  109. package/dist/cli/commands/repair/checks/vpn.d.ts +2 -0
  110. package/dist/cli/commands/repair/checks/vpn.js +78 -0
  111. package/dist/cli/commands/repair/engine.d.ts +32 -0
  112. package/dist/cli/commands/repair/engine.js +127 -0
  113. package/dist/cli/commands/repair/env.d.ts +7 -0
  114. package/dist/cli/commands/repair/env.js +50 -0
  115. package/dist/cli/commands/repair/index.d.ts +1 -9
  116. package/dist/cli/commands/repair/index.js +2 -54
  117. package/dist/cli/commands/repair/log.d.ts +17 -0
  118. package/dist/cli/commands/repair/log.js +82 -0
  119. package/dist/cli/commands/repair/printer.d.ts +32 -0
  120. package/dist/cli/commands/repair/printer.js +132 -0
  121. package/dist/cli/commands/repair/run.d.ts +33 -0
  122. package/dist/cli/commands/repair/run.js +133 -0
  123. package/dist/cli/commands/repair/types.d.ts +97 -9
  124. package/dist/cli/commands/repair/types.js +11 -7
  125. package/dist/cli/commands/resume.js +2 -2
  126. package/dist/cli/commands/sessions/index.d.ts +0 -4
  127. package/dist/cli/commands/sessions/index.js +3 -7
  128. package/dist/cli/commands/setup/index.d.ts +5 -0
  129. package/dist/cli/commands/setup/index.js +25 -1
  130. package/dist/cli/commands/shared-use.d.ts +5 -2
  131. package/dist/cli/commands/shared-use.js +11 -8
  132. package/dist/cli/commands/storage/contained.d.ts +3 -0
  133. package/dist/cli/commands/storage/contained.js +179 -0
  134. package/dist/cli/commands/storage/index.d.ts +2 -0
  135. package/dist/cli/commands/storage/index.js +2 -0
  136. package/dist/cli/commands/storage/offer.d.ts +3 -0
  137. package/dist/cli/commands/storage/offer.js +91 -0
  138. package/dist/cli/commands/storage/storage.d.ts +8 -0
  139. package/dist/cli/commands/storage/storage.js +179 -0
  140. package/dist/cli/commands/user-config.js +2 -2
  141. package/dist/cli/commands/vpn.d.ts +4 -0
  142. package/dist/cli/commands/vpn.js +91 -0
  143. package/dist/cli/commands/web.d.ts +4 -0
  144. package/dist/cli/commands/web.js +97 -0
  145. package/dist/cli/history.js +1 -1
  146. package/dist/cli/index.js +48 -4
  147. package/dist/cli/manifest.d.ts +339 -97
  148. package/dist/cli/manifest.js +222 -67
  149. package/dist/cli/menu/add-agent.d.ts +47 -0
  150. package/dist/cli/menu/add-agent.js +168 -0
  151. package/dist/cli/menu/apps.d.ts +38 -3
  152. package/dist/cli/menu/apps.js +80 -5
  153. package/dist/cli/menu/command-fields.d.ts +18 -0
  154. package/dist/cli/menu/command-fields.js +61 -0
  155. package/dist/cli/menu/command-form.d.ts +22 -0
  156. package/dist/cli/menu/command-form.js +169 -46
  157. package/dist/cli/menu/data-folder.d.ts +18 -0
  158. package/dist/cli/menu/data-folder.js +99 -0
  159. package/dist/cli/menu/io-menu.d.ts +29 -0
  160. package/dist/cli/menu/io-menu.js +126 -0
  161. package/dist/cli/menu/live.d.ts +27 -0
  162. package/dist/cli/menu/live.js +69 -0
  163. package/dist/cli/menu/memory.d.ts +19 -0
  164. package/dist/cli/menu/memory.js +53 -0
  165. package/dist/cli/menu/menu.d.ts +11 -2
  166. package/dist/cli/menu/menu.js +36 -15
  167. package/dist/cli/menu/pages/accounts-page.js +55 -24
  168. package/dist/cli/menu/pages/agents-page.d.ts +68 -0
  169. package/dist/cli/menu/pages/agents-page.js +345 -0
  170. package/dist/cli/menu/pages/apps-page.d.ts +3 -1
  171. package/dist/cli/menu/pages/apps-page.js +20 -4
  172. package/dist/cli/menu/pages/list-page.d.ts +43 -3
  173. package/dist/cli/menu/pages/list-page.js +146 -12
  174. package/dist/cli/menu/pages/maintenance-page.d.ts +9 -5
  175. package/dist/cli/menu/pages/maintenance-page.js +172 -85
  176. package/dist/cli/menu/pages/sandbox-page.d.ts +7 -6
  177. package/dist/cli/menu/pages/sandbox-page.js +117 -120
  178. package/dist/cli/menu/pages/scopes.d.ts +1 -1
  179. package/dist/cli/menu/pages/sessions-page.d.ts +6 -8
  180. package/dist/cli/menu/pages/sessions-page.js +22 -75
  181. package/dist/cli/menu/pages/settings-page.d.ts +10 -14
  182. package/dist/cli/menu/pages/settings-page.js +95 -102
  183. package/dist/cli/menu/render-view.d.ts +28 -0
  184. package/dist/cli/menu/render-view.js +112 -0
  185. package/dist/cli/menu/settings/ask-path.d.ts +14 -0
  186. package/dist/cli/menu/settings/ask-path.js +14 -0
  187. package/dist/cli/menu/settings/collections/collection-editor.d.ts +8 -2
  188. package/dist/cli/menu/settings/collections/collection-editor.js +12 -8
  189. package/dist/cli/menu/settings/collections/map-editor.js +5 -1
  190. package/dist/cli/menu/settings/collections/object-list-editor.js +2 -2
  191. package/dist/cli/menu/settings/collections/object-map-editor.js +2 -2
  192. package/dist/cli/menu/settings/collections/string-list-editor.d.ts +10 -1
  193. package/dist/cli/menu/settings/collections/string-list-editor.js +23 -0
  194. package/dist/cli/menu/settings/draft.d.ts +1 -1
  195. package/dist/cli/menu/settings/format.d.ts +1 -3
  196. package/dist/cli/menu/settings/format.js +6 -36
  197. package/dist/cli/menu/settings/index.d.ts +1 -3
  198. package/dist/cli/menu/settings/index.js +3 -3
  199. package/dist/cli/menu/settings/object-editor.d.ts +6 -2
  200. package/dist/cli/menu/settings/object-editor.js +15 -4
  201. package/dist/cli/menu/settings/share.d.ts +36 -0
  202. package/dist/cli/menu/settings/share.js +131 -0
  203. package/dist/cli/menu/settings/value-editor.d.ts +10 -1
  204. package/dist/cli/menu/settings/value-editor.js +99 -63
  205. package/dist/cli/menu/several.js +7 -5
  206. package/dist/cli/menu/share-settings.d.ts +21 -0
  207. package/dist/cli/menu/share-settings.js +112 -0
  208. package/dist/cli/menu/shell.d.ts +53 -10
  209. package/dist/cli/menu/shell.js +115 -10
  210. package/dist/cli/menu/views.d.ts +7 -0
  211. package/dist/cli/menu/views.js +11 -0
  212. package/dist/cli/menu/vpn-login.d.ts +16 -0
  213. package/dist/cli/menu/vpn-login.js +74 -0
  214. package/dist/cli/operations/handler.d.ts +6 -0
  215. package/dist/cli/operations/handler.js +61 -0
  216. package/dist/cli/operations/index.d.ts +4 -0
  217. package/dist/cli/operations/index.js +5 -0
  218. package/dist/cli/operations/input.d.ts +6 -0
  219. package/dist/cli/operations/input.js +37 -0
  220. package/dist/cli/operations/io-cli.d.ts +7 -0
  221. package/dist/cli/operations/io-cli.js +62 -0
  222. package/dist/cli/operations/spec.d.ts +18 -0
  223. package/dist/cli/operations/spec.js +108 -0
  224. package/dist/cli/output/colors.d.ts +2 -2
  225. package/dist/cli/output/colors.js +2 -11
  226. package/dist/cli/output/index.d.ts +1 -0
  227. package/dist/cli/output/index.js +1 -0
  228. package/dist/cli/output/print.d.ts +5 -1
  229. package/dist/cli/output/print.js +15 -4
  230. package/dist/cli/output/progress.d.ts +15 -0
  231. package/dist/cli/output/progress.js +44 -0
  232. package/dist/cli/output/render-view.d.ts +4 -0
  233. package/dist/cli/output/render-view.js +63 -0
  234. package/dist/cli/services/accounts-service.d.ts +2 -0
  235. package/dist/cli/services/accounts-service.js +2 -2
  236. package/dist/cli/services/agent-commands-service.d.ts +2 -0
  237. package/dist/cli/services/agent-commands-service.js +11 -2
  238. package/dist/cli/services/health-service.d.ts +0 -6
  239. package/dist/cli/services/health-service.js +5 -42
  240. package/dist/cli/services/index.d.ts +3 -1
  241. package/dist/cli/services/index.js +3 -1
  242. package/dist/cli/services/logs-service.js +4 -3
  243. package/dist/cli/services/migrate-service.js +1 -1
  244. package/dist/cli/services/update-service.d.ts +2 -0
  245. package/dist/cli/services/update-service.js +13 -6
  246. package/dist/cli/services/vpn-service.d.ts +28 -0
  247. package/dist/cli/services/vpn-service.js +46 -0
  248. package/dist/cli/services/web-service.d.ts +22 -0
  249. package/dist/cli/services/web-service.js +111 -0
  250. package/dist/cli/tui/app.d.ts +12 -4
  251. package/dist/cli/tui/app.js +38 -9
  252. package/dist/cli/tui/dialogs/path-listing.d.ts +43 -0
  253. package/dist/cli/tui/dialogs/path-listing.js +127 -0
  254. package/dist/cli/tui/dialogs/path-picker.d.ts +67 -0
  255. package/dist/cli/tui/dialogs/path-picker.js +423 -0
  256. package/dist/cli/tui/dialogs/text-screen.d.ts +6 -0
  257. package/dist/cli/tui/dialogs/text-screen.js +10 -3
  258. package/dist/cli/tui/frame.d.ts +7 -10
  259. package/dist/cli/tui/frame.js +19 -10
  260. package/dist/cli/tui/index.d.ts +4 -3
  261. package/dist/cli/tui/index.js +2 -1
  262. package/dist/cli/tui/list/list-screen.d.ts +28 -2
  263. package/dist/cli/tui/list/list-screen.js +130 -66
  264. package/dist/cli/tui/list/list-types.d.ts +10 -4
  265. package/dist/cli/tui/nav.d.ts +29 -0
  266. package/dist/cli/tui/nav.js +67 -0
  267. package/dist/cli/tui/terminal.d.ts +7 -0
  268. package/dist/cli/tui/terminal.js +30 -10
  269. package/dist/cli/validate.d.ts +1 -1
  270. package/dist/cli/validate.js +3 -3
  271. package/dist/cli/version.d.ts +2 -0
  272. package/dist/cli/version.js +11 -0
  273. package/dist/core/config/defaults.js +13 -1
  274. package/dist/core/config/loader.js +12 -2
  275. package/dist/core/local-config/overrides.js +1 -0
  276. package/dist/core/prompt.d.ts +19 -0
  277. package/dist/core/prompt.js +43 -3
  278. package/dist/core/schema/common.d.ts +6 -0
  279. package/dist/core/schema/common.js +8 -0
  280. package/dist/core/schema/config.d.ts +36 -0
  281. package/dist/core/schema/config.js +26 -2
  282. package/dist/core/schema/harness.d.ts +2 -0
  283. package/dist/core/schema/harness.js +13 -2
  284. package/dist/core/schema/index.d.ts +3 -1
  285. package/dist/core/schema/index.js +3 -1
  286. package/dist/core/schema/profile.d.ts +1 -0
  287. package/dist/core/schema/profile.js +3 -0
  288. package/dist/core/schema/redact.d.ts +13 -0
  289. package/dist/core/schema/redact.js +75 -0
  290. package/dist/core/schema/sandbox.d.ts +6 -0
  291. package/dist/core/schema/sandbox.js +21 -3
  292. package/dist/core/schema/vpn.d.ts +18 -0
  293. package/dist/core/schema/vpn.js +22 -0
  294. package/dist/core/schema/web.d.ts +6 -0
  295. package/dist/core/schema/web.js +14 -0
  296. package/dist/core/types.d.ts +44 -0
  297. package/dist/core/util/fs.d.ts +2 -0
  298. package/dist/core/util/fs.js +9 -0
  299. package/dist/core/util/index.d.ts +1 -1
  300. package/dist/core/util/index.js +1 -1
  301. package/dist/guest/agents/agent-files.d.ts +54 -0
  302. package/dist/guest/agents/agent-files.js +67 -0
  303. package/dist/guest/agents/agent-installer.js +2 -9
  304. package/dist/guest/agents/local-state.d.ts +14 -0
  305. package/dist/guest/agents/local-state.js +218 -0
  306. package/dist/guest/agents/sbx-agent.d.ts +2 -0
  307. package/dist/guest/agents/sbx-agent.js +35 -0
  308. package/dist/guest/boot/boot.d.ts +4 -0
  309. package/dist/guest/boot/boot.js +51 -11
  310. package/dist/guest/daemon/daemon.js +8 -1
  311. package/dist/guest/daemon/exec.js +2 -1
  312. package/dist/guest/daemon/idle-shutdown.js +2 -0
  313. package/dist/guest/daemon/sessions.d.ts +5 -0
  314. package/dist/guest/daemon/sessions.js +20 -3
  315. package/dist/guest/entries/agent.d.ts +1 -0
  316. package/dist/guest/entries/agent.js +10 -0
  317. package/dist/guest/entries/daemon.js +5 -0
  318. package/dist/guest/governor/decide.d.ts +61 -0
  319. package/dist/guest/governor/decide.js +182 -0
  320. package/dist/guest/governor/governor.d.ts +42 -0
  321. package/dist/guest/governor/governor.js +214 -0
  322. package/dist/guest/governor/index.d.ts +2 -0
  323. package/dist/guest/governor/index.js +2 -0
  324. package/dist/guest/runtime/csc.d.ts +2 -0
  325. package/dist/guest/runtime/csc.js +2 -0
  326. package/dist/guest/runtime/secrets.d.ts +12 -0
  327. package/dist/guest/runtime/secrets.js +63 -0
  328. package/dist/guest/sessions/viewer.js +3 -1
  329. package/dist/guest/setup/claude-profile.d.ts +2 -1
  330. package/dist/guest/setup/claude-profile.js +12 -1
  331. package/dist/guest/setup/environment.d.ts +6 -0
  332. package/dist/guest/setup/environment.js +56 -6
  333. package/dist/guest/setup/path-plan.d.ts +32 -0
  334. package/dist/guest/setup/path-plan.js +67 -0
  335. package/dist/guest/setup/shell-path.d.ts +1 -0
  336. package/dist/guest/setup/shell-path.js +22 -0
  337. package/dist/guest/toolchains/languages/python.js +1 -1
  338. package/dist/guest/toolchains/native/rust-extras.js +4 -2
  339. package/dist/guest/toolchains/runtimes.js +2 -2
  340. package/dist/guest/vpn/index.d.ts +1 -0
  341. package/dist/guest/vpn/index.js +1 -0
  342. package/dist/guest/vpn/openvpn.d.ts +9 -0
  343. package/dist/guest/vpn/openvpn.js +47 -0
  344. package/dist/guest/vpn/tunnel.d.ts +17 -0
  345. package/dist/guest/vpn/tunnel.js +78 -0
  346. package/dist/guest/vpn/vpn.d.ts +6 -0
  347. package/dist/guest/vpn/vpn.js +174 -0
  348. package/dist/guest/vpn/wireguard.d.ts +32 -0
  349. package/dist/guest/vpn/wireguard.js +132 -0
  350. package/dist/host/agent-commands/commands.d.ts +4 -0
  351. package/dist/host/agent-commands/commands.js +31 -7
  352. package/dist/host/audit/log.d.ts +1 -1
  353. package/dist/host/channel/attach.d.ts +6 -2
  354. package/dist/host/channel/attach.js +6 -3
  355. package/dist/host/channel/channel.d.ts +9 -0
  356. package/dist/host/channel/channel.js +30 -2
  357. package/dist/host/engines/engine.d.ts +12 -0
  358. package/dist/host/engines/engine.js +1 -0
  359. package/dist/host/engines/hcs/check.d.ts +25 -0
  360. package/dist/host/engines/hcs/check.js +95 -0
  361. package/dist/host/engines/hcs/documents.d.ts +44 -0
  362. package/dist/host/engines/hcs/documents.js +155 -0
  363. package/dist/host/engines/hcs/engine.d.ts +39 -0
  364. package/dist/host/engines/hcs/engine.js +171 -0
  365. package/dist/host/engines/hcs/helper.d.ts +43 -0
  366. package/dist/host/engines/hcs/helper.js +173 -0
  367. package/dist/host/engines/hcs/images.d.ts +37 -0
  368. package/dist/host/engines/hcs/images.js +152 -0
  369. package/dist/host/engines/index.d.ts +7 -0
  370. package/dist/host/engines/index.js +5 -0
  371. package/dist/host/engines/registry.d.ts +16 -0
  372. package/dist/host/engines/registry.js +30 -0
  373. package/dist/host/engines/types.d.ts +58 -0
  374. package/dist/host/engines/types.js +1 -0
  375. package/dist/host/engines/windows-sandbox/engine.d.ts +16 -0
  376. package/dist/host/engines/windows-sandbox/engine.js +63 -0
  377. package/dist/host/engines/windows-sandbox/wsb-text.d.ts +2 -0
  378. package/dist/host/engines/windows-sandbox/wsb-text.js +29 -0
  379. package/dist/host/health/acl-read.d.ts +17 -0
  380. package/dist/host/health/acl-read.js +45 -0
  381. package/dist/host/health/config-backup.d.ts +11 -0
  382. package/dist/host/health/config-backup.js +73 -0
  383. package/dist/host/health/index.d.ts +6 -0
  384. package/dist/host/health/index.js +7 -0
  385. package/dist/host/health/install-state.d.ts +33 -0
  386. package/dist/host/health/install-state.js +110 -0
  387. package/dist/host/health/path-copies.d.ts +32 -0
  388. package/dist/host/health/path-copies.js +82 -0
  389. package/dist/host/health/stale.d.ts +45 -0
  390. package/dist/host/health/stale.js +120 -0
  391. package/dist/host/health/system.d.ts +37 -0
  392. package/dist/host/health/system.js +87 -0
  393. package/dist/host/install/copies.d.ts +13 -0
  394. package/dist/host/install/copies.js +63 -0
  395. package/dist/host/install/index.d.ts +1 -0
  396. package/dist/host/install/index.js +1 -0
  397. package/dist/host/launch/generate.d.ts +5 -1
  398. package/dist/host/launch/generate.js +73 -7
  399. package/dist/host/launch/index.d.ts +3 -1
  400. package/dist/host/launch/index.js +3 -1
  401. package/dist/host/launch/launch-plan.d.ts +13 -0
  402. package/dist/host/launch/launch-plan.js +26 -0
  403. package/dist/host/launch/mappings.js +2 -1
  404. package/dist/host/launch/risk-notes.d.ts +10 -0
  405. package/dist/host/launch/risk-notes.js +18 -0
  406. package/dist/host/launch/session-file.d.ts +2 -0
  407. package/dist/host/launch/session-file.js +11 -2
  408. package/dist/host/launch/stage.js +1 -1
  409. package/dist/host/launch/wsb-file.d.ts +28 -4
  410. package/dist/host/launch/wsb-file.js +61 -42
  411. package/dist/host/life/crash-report.d.ts +27 -1
  412. package/dist/host/life/crash-report.js +173 -7
  413. package/dist/host/life/host-memory.d.ts +40 -0
  414. package/dist/host/life/host-memory.js +137 -0
  415. package/dist/host/life/index.d.ts +2 -0
  416. package/dist/host/life/index.js +2 -0
  417. package/dist/host/life/stop-events.d.ts +2 -0
  418. package/dist/host/life/stop-events.js +20 -3
  419. package/dist/host/life/stop-warning.js +1 -1
  420. package/dist/host/life/watchdog.d.ts +54 -0
  421. package/dist/host/life/watchdog.js +108 -0
  422. package/dist/host/migrate/backup.js +3 -0
  423. package/dist/host/migrate/migrations/config-file.d.ts +2 -0
  424. package/dist/host/migrate/migrations/config-file.js +7 -0
  425. package/dist/host/migrate/migrations/follow-machine-storage.js +9 -1
  426. package/dist/host/migrate/migrations/pin-storage-root.d.ts +4 -0
  427. package/dist/host/migrate/migrations/pin-storage-root.js +46 -0
  428. package/dist/host/migrate/migrations/unpin-config-defaults.js +4 -1
  429. package/dist/host/migrate/registry.js +2 -1
  430. package/dist/host/native.d.ts +3 -2
  431. package/dist/host/native.js +22 -3
  432. package/dist/host/profile/accounts.d.ts +25 -1
  433. package/dist/host/profile/accounts.js +96 -13
  434. package/dist/host/profile/agent-accounts.d.ts +5 -1
  435. package/dist/host/profile/agent-accounts.js +35 -5
  436. package/dist/host/profile/claude-login.js +3 -2
  437. package/dist/host/profile/index.d.ts +2 -1
  438. package/dist/host/profile/index.js +1 -0
  439. package/dist/host/profile/plugin-share.d.ts +26 -0
  440. package/dist/host/profile/plugin-share.js +146 -0
  441. package/dist/host/projects/join.d.ts +7 -1
  442. package/dist/host/projects/join.js +21 -4
  443. package/dist/host/projects/registry.d.ts +16 -10
  444. package/dist/host/projects/registry.js +74 -6
  445. package/dist/host/sandbox/contained-deps.d.ts +2 -0
  446. package/dist/host/sandbox/contained-deps.js +17 -0
  447. package/dist/host/sandbox/index.d.ts +2 -0
  448. package/dist/host/sandbox/index.js +2 -0
  449. package/dist/host/sandbox/platform.d.ts +4 -0
  450. package/dist/host/sandbox/platform.js +23 -4
  451. package/dist/host/sandbox/tasklist.d.ts +13 -0
  452. package/dist/host/sandbox/tasklist.js +47 -0
  453. package/dist/host/secrets/index.d.ts +2 -0
  454. package/dist/host/secrets/index.js +2 -0
  455. package/dist/host/secrets/launch-secrets.d.ts +17 -0
  456. package/dist/host/secrets/launch-secrets.js +94 -0
  457. package/dist/host/secrets/secret-store.d.ts +25 -0
  458. package/dist/host/secrets/secret-store.js +89 -0
  459. package/dist/host/sharing/acl.d.ts +16 -2
  460. package/dist/host/sharing/acl.js +35 -10
  461. package/dist/host/sharing/current.js +8 -3
  462. package/dist/host/sharing/doctor.d.ts +2 -0
  463. package/dist/host/sharing/doctor.js +44 -0
  464. package/dist/host/sharing/group-access.d.ts +6 -0
  465. package/dist/host/sharing/group-access.js +24 -0
  466. package/dist/host/sharing/index.d.ts +2 -1
  467. package/dist/host/sharing/index.js +2 -1
  468. package/dist/host/sharing/lifecycle.d.ts +8 -2
  469. package/dist/host/sharing/lifecycle.js +16 -7
  470. package/dist/host/storage/cleanup.d.ts +2 -0
  471. package/dist/host/storage/cleanup.js +2 -1
  472. package/dist/host/storage/contained/check.d.ts +9 -0
  473. package/dist/host/storage/contained/check.js +37 -0
  474. package/dist/host/storage/contained/contained-storage.d.ts +66 -0
  475. package/dist/host/storage/contained/contained-storage.js +168 -0
  476. package/dist/host/storage/contained/disk-port.d.ts +43 -0
  477. package/dist/host/storage/contained/disk-port.js +122 -0
  478. package/dist/host/storage/contained/index.d.ts +9 -0
  479. package/dist/host/storage/contained/index.js +8 -0
  480. package/dist/host/storage/contained/layout.d.ts +28 -0
  481. package/dist/host/storage/contained/layout.js +45 -0
  482. package/dist/host/storage/contained/resolve.d.ts +4 -0
  483. package/dist/host/storage/contained/resolve.js +30 -0
  484. package/dist/host/storage/contained/setting.d.ts +1 -0
  485. package/dist/host/storage/contained/setting.js +5 -0
  486. package/dist/host/storage/contained/state.d.ts +89 -0
  487. package/dist/host/storage/contained/state.js +166 -0
  488. package/dist/host/storage/contained/transfer.d.ts +24 -0
  489. package/dist/host/storage/contained/transfer.js +121 -0
  490. package/dist/host/storage/history.d.ts +21 -0
  491. package/dist/host/storage/history.js +49 -0
  492. package/dist/host/storage/index.d.ts +6 -0
  493. package/dist/host/storage/index.js +6 -0
  494. package/dist/host/storage/move.d.ts +95 -0
  495. package/dist/host/storage/move.js +384 -0
  496. package/dist/host/storage/offer.d.ts +11 -0
  497. package/dist/host/storage/offer.js +36 -0
  498. package/dist/host/storage/providers/contained.d.ts +15 -0
  499. package/dist/host/storage/providers/contained.js +39 -0
  500. package/dist/host/storage/providers/folder.d.ts +12 -0
  501. package/dist/host/storage/providers/folder.js +20 -0
  502. package/dist/host/storage/providers/index.d.ts +4 -0
  503. package/dist/host/storage/providers/index.js +3 -0
  504. package/dist/host/storage/providers/registry.d.ts +9 -0
  505. package/dist/host/storage/providers/registry.js +14 -0
  506. package/dist/host/storage/providers/types.d.ts +33 -0
  507. package/dist/host/storage/providers/types.js +1 -0
  508. package/dist/host/storage/root.d.ts +18 -0
  509. package/dist/host/storage/root.js +77 -0
  510. package/dist/host/tools/conpty.js +3 -2
  511. package/dist/host/tools/windows-terminal.d.ts +2 -0
  512. package/dist/host/tools/windows-terminal.js +31 -12
  513. package/dist/host/update/index.d.ts +1 -1
  514. package/dist/host/update/index.js +1 -1
  515. package/dist/host/update/notice.d.ts +2 -0
  516. package/dist/host/update/notice.js +13 -1
  517. package/dist/host/update/update-state.d.ts +6 -0
  518. package/dist/host/update/update-state.js +2 -0
  519. package/dist/host/update/updater.d.ts +19 -0
  520. package/dist/host/update/updater.js +88 -12
  521. package/dist/host/vpn/index.d.ts +4 -0
  522. package/dist/host/vpn/index.js +4 -0
  523. package/dist/host/vpn/login.d.ts +24 -0
  524. package/dist/host/vpn/login.js +79 -0
  525. package/dist/host/vpn/nordvpn.d.ts +21 -0
  526. package/dist/host/vpn/nordvpn.js +77 -0
  527. package/dist/host/vpn/prepare.d.ts +19 -0
  528. package/dist/host/vpn/prepare.js +138 -0
  529. package/dist/host/vpn/status.d.ts +12 -0
  530. package/dist/host/vpn/status.js +53 -0
  531. package/dist/host/web/auth.d.ts +38 -0
  532. package/dist/host/web/auth.js +96 -0
  533. package/dist/host/web/backend.d.ts +14 -0
  534. package/dist/host/web/backend.js +1 -0
  535. package/dist/host/web/bridge.d.ts +27 -0
  536. package/dist/host/web/bridge.js +144 -0
  537. package/dist/host/web/browser.d.ts +3 -0
  538. package/dist/host/web/browser.js +23 -0
  539. package/dist/host/web/control.d.ts +17 -0
  540. package/dist/host/web/control.js +67 -0
  541. package/dist/host/web/index.d.ts +10 -0
  542. package/dist/host/web/index.js +9 -0
  543. package/dist/host/web/rpc.d.ts +24 -0
  544. package/dist/host/web/rpc.js +149 -0
  545. package/dist/host/web/runner.d.ts +16 -0
  546. package/dist/host/web/runner.js +44 -0
  547. package/dist/host/web/server.d.ts +47 -0
  548. package/dist/host/web/server.js +238 -0
  549. package/dist/host/web/state.d.ts +20 -0
  550. package/dist/host/web/state.js +41 -0
  551. package/dist/host/web/static-files.d.ts +13 -0
  552. package/dist/host/web/static-files.js +57 -0
  553. package/dist/runtime/agent.js +27675 -0
  554. package/dist/runtime/daemon.js +1950 -1122
  555. package/dist/runtime/db.js +302 -111
  556. package/dist/runtime/main.js +1560 -275
  557. package/dist/runtime/netproxy.js +168 -8
  558. package/dist/runtime/view.js +186 -13
  559. package/dist/selftest/accounts.test.js +40 -0
  560. package/dist/selftest/agent-paths.test.d.ts +2 -0
  561. package/dist/selftest/agent-paths.test.js +125 -0
  562. package/dist/selftest/app.test.d.ts +2 -0
  563. package/dist/selftest/app.test.js +324 -0
  564. package/dist/selftest/channel.test.js +18 -0
  565. package/dist/selftest/cli.test.js +35 -4
  566. package/dist/selftest/config.test.js +59 -0
  567. package/dist/selftest/contained.test.d.ts +2 -0
  568. package/dist/selftest/contained.test.js +544 -0
  569. package/dist/selftest/credentials.test.d.ts +2 -0
  570. package/dist/selftest/credentials.test.js +198 -0
  571. package/dist/selftest/engine.test.d.ts +2 -0
  572. package/dist/selftest/engine.test.js +127 -0
  573. package/dist/selftest/generate.test.js +1 -1
  574. package/dist/selftest/hcs.test.d.ts +2 -0
  575. package/dist/selftest/hcs.test.js +482 -0
  576. package/dist/selftest/health.test.d.ts +2 -0
  577. package/dist/selftest/health.test.js +470 -0
  578. package/dist/selftest/heavy-load.test.d.ts +2 -0
  579. package/dist/selftest/heavy-load.test.js +329 -0
  580. package/dist/selftest/host-sim.test.js +2 -0
  581. package/dist/selftest/index.js +31 -0
  582. package/dist/selftest/layout.test.js +14 -0
  583. package/dist/selftest/menu-perf.test.d.ts +2 -0
  584. package/dist/selftest/menu-perf.test.js +248 -0
  585. package/dist/selftest/menu-screens.d.ts +7 -0
  586. package/dist/selftest/menu-screens.js +68 -17
  587. package/dist/selftest/menu.test.js +603 -22
  588. package/dist/selftest/migrate.test.js +1 -1
  589. package/dist/selftest/personalization.test.js +3 -1
  590. package/dist/selftest/projects.test.js +39 -1
  591. package/dist/selftest/shared-use.test.js +64 -2
  592. package/dist/selftest/sharing.test.js +50 -1
  593. package/dist/selftest/storage.test.d.ts +2 -0
  594. package/dist/selftest/storage.test.js +363 -0
  595. package/dist/selftest/support/engine-cases.d.ts +8 -0
  596. package/dist/selftest/support/engine-cases.js +65 -0
  597. package/dist/selftest/support/engine-golden.d.ts +3 -0
  598. package/dist/selftest/support/engine-golden.js +66 -0
  599. package/dist/selftest/support/fixtures.d.ts +20 -0
  600. package/dist/selftest/support/hcs-probes.d.ts +17 -0
  601. package/dist/selftest/support/hcs-probes.js +41 -0
  602. package/dist/selftest/support/releases.js +1 -1
  603. package/dist/selftest/toolchains.test.js +21 -0
  604. package/dist/selftest/update-service.test.js +87 -3
  605. package/dist/selftest/vpn.test.d.ts +2 -0
  606. package/dist/selftest/vpn.test.js +412 -0
  607. package/dist/selftest/web.test.d.ts +2 -0
  608. package/dist/selftest/web.test.js +402 -0
  609. package/dist/shared/apps/catalogue.js +31 -0
  610. package/dist/shared/channel/index.d.ts +1 -0
  611. package/dist/shared/channel/index.js +1 -0
  612. package/dist/shared/channel/run-dir.d.ts +9 -1
  613. package/dist/shared/channel/run-dir.js +18 -1
  614. package/dist/shared/channel/schema.d.ts +53 -0
  615. package/dist/shared/channel/schema.js +38 -0
  616. package/dist/shared/channel/secrets.d.ts +29 -0
  617. package/dist/shared/channel/secrets.js +50 -0
  618. package/dist/shared/memory/index.d.ts +1 -0
  619. package/dist/shared/memory/index.js +1 -0
  620. package/dist/shared/memory/policy.d.ts +33 -0
  621. package/dist/shared/memory/policy.js +55 -0
  622. package/dist/shared/pty/output-filter.d.ts +14 -1
  623. package/dist/shared/pty/output-filter.js +22 -4
  624. package/dist/shared/pty/terminal.d.ts +4 -1
  625. package/dist/shared/pty/terminal.js +4 -2
  626. package/dist/shared/system.d.ts +1 -0
  627. package/dist/shared/system.js +1 -0
  628. package/dist/shared/vpn/download.d.ts +29 -0
  629. package/dist/shared/vpn/download.js +30 -0
  630. package/dist/shared/vpn/kill-switch.d.ts +18 -0
  631. package/dist/shared/vpn/kill-switch.js +81 -0
  632. package/dist/shared/vpn/ovpn.d.ts +23 -0
  633. package/dist/shared/vpn/ovpn.js +244 -0
  634. package/dist/shared/vpn/wireguard.d.ts +51 -0
  635. package/dist/shared/vpn/wireguard.js +227 -0
  636. package/dist/shared/web/index.d.ts +1 -0
  637. package/dist/shared/web/index.js +1 -0
  638. package/dist/shared/web/protocol.d.ts +61 -0
  639. package/dist/shared/web/protocol.js +35 -0
  640. package/dist/sync/sync-cycle.js +9 -5
  641. package/dist/sync/sync-state.d.ts +1 -0
  642. package/dist/sync/sync-state.js +1 -0
  643. package/dist/sync/watcher.d.ts +13 -0
  644. package/dist/sync/watcher.js +102 -3
  645. package/dist/web/index.html +14 -0
  646. package/dist/web/main-NRRS5O6Z.js +157 -0
  647. package/dist/web/main-T5DMCHYV.css +1 -0
  648. package/native/csharp/FolderSecurity.cs +29 -0
  649. package/native/csharp/HcsHost/AssemblyInfo.cs +14 -0
  650. package/native/csharp/HcsHost/Guard.cs +100 -0
  651. package/native/csharp/HcsHost/Hcs.cs +256 -0
  652. package/native/csharp/HcsHost/Json.cs +78 -0
  653. package/native/csharp/HcsHost/Program.cs +185 -0
  654. package/native/csharp/HcsHost/VirtualDisk.cs +95 -0
  655. package/native/csharp/HostTools/AssemblyInfo.cs +14 -0
  656. package/native/csharp/HostTools/MemoryStatus.cs +107 -0
  657. package/native/csharp/HostTools/Program.cs +58 -17
  658. package/native/scripts/check-contained.ps1 +28 -0
  659. package/native/scripts/contained-common.ps1 +241 -0
  660. package/native/scripts/dismount-contained.ps1 +66 -0
  661. package/native/scripts/memory-status.ps1 +34 -0
  662. package/native/scripts/mount-contained.ps1 +139 -0
  663. package/native/scripts/protect-data.ps1 +29 -0
  664. package/native/scripts/read-folder-sddl.ps1 +10 -0
  665. package/native/scripts/run-elevated.ps1 +17 -4
  666. package/native/scripts/set-folder-access.ps1 +49 -7
  667. package/native/scripts/stop-events.ps1 +23 -8
  668. package/node_modules/ws/LICENSE +20 -0
  669. package/node_modules/ws/README.md +548 -0
  670. package/node_modules/ws/browser.js +8 -0
  671. package/node_modules/ws/index.js +22 -0
  672. package/node_modules/ws/lib/buffer-util.js +131 -0
  673. package/node_modules/ws/lib/constants.js +19 -0
  674. package/node_modules/ws/lib/event-target.js +292 -0
  675. package/node_modules/ws/lib/extension.js +203 -0
  676. package/node_modules/ws/lib/limiter.js +55 -0
  677. package/node_modules/ws/lib/permessage-deflate.js +530 -0
  678. package/node_modules/ws/lib/receiver.js +743 -0
  679. package/node_modules/ws/lib/sender.js +607 -0
  680. package/node_modules/ws/lib/stream.js +161 -0
  681. package/node_modules/ws/lib/subprotocol.js +62 -0
  682. package/node_modules/ws/lib/validation.js +152 -0
  683. package/node_modules/ws/lib/websocket-server.js +562 -0
  684. package/node_modules/ws/lib/websocket.js +1421 -0
  685. package/node_modules/ws/package.json +74 -0
  686. package/node_modules/ws/wrapper.mjs +21 -0
  687. package/package.json +22 -5
  688. package/sandbox/csharp/EnvBroadcast.cs +33 -0
  689. package/sandbox/csharp/MemGov.cs +398 -0
  690. package/sandbox/csharp/PathSync.cs +90 -0
  691. package/sandbox/csharp/PtyHost.cs +111 -5
  692. package/sandbox/scripts/install-shell-path.ps1 +73 -0
  693. package/sandbox/scripts/set-machine-environment.ps1 +37 -4
  694. package/schemas/config.schema.json +136 -7
  695. package/schemas/sandbox-config.schema.json +17 -4
  696. package/dist/cli/commands/repair/checks.d.ts +0 -2
  697. package/dist/cli/commands/repair/checks.js +0 -246
  698. package/dist/cli/commands/sessions/control.d.ts +0 -4
  699. package/dist/cli/commands/sessions/control.js +0 -66
  700. package/dist/cli/commands/sessions/list.d.ts +0 -2
  701. package/dist/cli/commands/sessions/list.js +0 -45
  702. package/dist/cli/commands/sessions/status.d.ts +0 -2
  703. package/dist/cli/commands/sessions/status.js +0 -93
  704. package/dist/cli/commands/sessions/window.d.ts +0 -3
  705. package/dist/cli/commands/sessions/window.js +0 -18
  706. package/dist/cli/menu/pages/start-page.d.ts +0 -43
  707. package/dist/cli/menu/pages/start-page.js +0 -192
  708. package/dist/cli/tui/tab-bar.d.ts +0 -9
  709. package/dist/cli/tui/tab-bar.js +0 -33
@@ -0,0 +1,171 @@
1
+ // The HCS engine (alpha): a Hyper-V isolated Windows container for agents, behind the SandboxEngine interface.
2
+ // plan() is pure and tested; start() is DISABLED until the owner's go/no-go test (docs/design/engines.md) has passed
3
+ // on a real PC.
4
+ import fs from 'node:fs';
5
+ import os from 'node:os';
6
+ import path from 'node:path';
7
+ import { z } from 'zod';
8
+ import { fail, UserError } from '../../../core/util/index.js';
9
+ import { selfTestRunning } from '../../test-guard.js';
10
+ import { checkHcs, realHcsProbes } from './check.js';
11
+ import { buildDocuments, HCS_OWNER } from './documents.js';
12
+ import { HcsHelper, hcsHostExe } from './helper.js';
13
+ import { findImage } from './images.js';
14
+ export const HCS_CAPABILITIES = {
15
+ desktop: false,
16
+ gpu: false,
17
+ clipboard: false,
18
+ audio: false,
19
+ video: false,
20
+ printers: false,
21
+ liveFolderAdd: true,
22
+ attachedDisks: true,
23
+ multipleInstances: true,
24
+ hvsocket: true,
25
+ };
26
+ export const HCS_ALPHA_MESSAGE = 'The HCS engine is in alpha and starting it is not enabled yet; see docs/design/engines.md';
27
+ export const HCS_FLAG = 'AGENT_SANDBOX_HCS_EXPERIMENTAL';
28
+ /** Starting is allowed only with the owner's flag, and never inside the self-test. */
29
+ export function hcsStartEnabled(env, selfTest) {
30
+ return env[HCS_FLAG] === '1' && !selfTest;
31
+ }
32
+ const PlanFileSchema = z.object({
33
+ version: z.literal(1),
34
+ uvmId: z.string().regex(/^agent-sandbox-[A-Za-z0-9._-]{1,100}$/),
35
+ containerId: z.string().regex(/^agent-sandbox-[A-Za-z0-9._-]{1,100}$/),
36
+ uvmFile: z.string(),
37
+ containerFile: z.string(),
38
+ scratchVhdx: z.string(),
39
+ disks: z.array(z.object({ image: z.string(), maxGb: z.number().int().min(1).max(4096), lun: z.number().int() })),
40
+ logonCommand: z.string(),
41
+ notes: z.array(z.string()),
42
+ });
43
+ const SystemListSchema = z.array(z.object({ Id: z.string(), Owner: z.string().optional() }).passthrough());
44
+ export class HcsEngine {
45
+ image;
46
+ probes;
47
+ storageRoot;
48
+ deps;
49
+ id = 'hcs';
50
+ /** `image` and `probes` come from the check (see HcsEngine.open); `storageRoot` is where HcsHost.exe is built. */
51
+ constructor(image, probes, storageRoot, deps = {}) {
52
+ this.image = image;
53
+ this.probes = probes;
54
+ this.storageRoot = storageRoot;
55
+ this.deps = deps;
56
+ }
57
+ /** The engine for this PC when its check passes; otherwise a clear stop with the check's reasons and fixes. */
58
+ static async open(storageRoot, probes = realHcsProbes(), deps = {}) {
59
+ const check = checkHcs(probes);
60
+ if (!check.available)
61
+ fail('The HCS engine cannot run on this PC: ' + check.reasons.join(' '), 'Fix: ' + check.fixes.join(' | '));
62
+ return new HcsEngine(findImage(probes.imageStores()).image, probes, storageRoot, deps);
63
+ }
64
+ capabilities() {
65
+ return HCS_CAPABILITIES;
66
+ }
67
+ check() {
68
+ return Promise.resolve(checkHcs(this.probes));
69
+ }
70
+ plan(launch) {
71
+ if (!this.image)
72
+ fail('No base image is available for the HCS engine.', 'Run: sandbox engine check hcs');
73
+ const slug = path.basename(launch.launchPath).replace(/[^A-Za-z0-9._-]/g, '-');
74
+ const dir = path.join(launch.launchPath, 'hcs');
75
+ const scratchVhdx = path.join(dir, 'scratch.vhdx');
76
+ const docs = buildDocuments({
77
+ launch,
78
+ image: this.image,
79
+ id: 'agent-sandbox-' + slug,
80
+ scratchVhdx,
81
+ hostCpus: (this.deps.hostCpus ?? (() => os.cpus().length))(),
82
+ });
83
+ const planFile = {
84
+ version: 1,
85
+ uvmId: docs.uvmId,
86
+ containerId: docs.containerId,
87
+ uvmFile: path.join(dir, 'uvm.json'),
88
+ containerFile: path.join(dir, 'container.json'),
89
+ scratchVhdx,
90
+ disks: [...docs.disks],
91
+ logonCommand: launch.logonCommand,
92
+ notes: [...docs.notes],
93
+ };
94
+ const entry = path.join(dir, 'plan.json');
95
+ const pretty = (v) => JSON.stringify(v, null, 2) + '\n';
96
+ return {
97
+ engine: this.id,
98
+ entry,
99
+ files: [
100
+ { path: planFile.uvmFile, text: pretty(docs.uvm) },
101
+ { path: planFile.containerFile, text: pretty(docs.container) },
102
+ { path: entry, text: pretty(planFile) },
103
+ ],
104
+ };
105
+ }
106
+ helper() {
107
+ return this.deps.helper ?? new HcsHelper(() => hcsHostExe(this.storageRoot));
108
+ }
109
+ async start(plan) {
110
+ const enabled = hcsStartEnabled(this.deps.env ?? process.env, (this.deps.selfTest ?? selfTestRunning)());
111
+ if (!enabled)
112
+ fail(HCS_ALPHA_MESSAGE);
113
+ const file = PlanFileSchema.parse(JSON.parse(fs.readFileSync(plan.entry, 'utf8')));
114
+ const exists = this.deps.exists ?? fs.existsSync;
115
+ const helper = this.helper();
116
+ const disks = [...file.disks.map((d) => d.image), file.scratchVhdx];
117
+ for (const d of file.disks)
118
+ if (!exists(d.image))
119
+ helper.createVhdx(d.image, d.maxGb);
120
+ // The writable layer is made by HcsInitializeWritableLayer, which this phase does not have.
121
+ if (!exists(file.scratchVhdx))
122
+ fail('The writable layer of this sandbox has not been prepared (not built yet).');
123
+ const created = [];
124
+ try {
125
+ for (const disk of disks)
126
+ helper.grantVmAccess(file.uvmId, disk);
127
+ helper.create(file.uvmId, fs.readFileSync(file.uvmFile, 'utf8'));
128
+ created.push(file.uvmId);
129
+ helper.start(file.uvmId);
130
+ helper.create(file.containerId, fs.readFileSync(file.containerFile, 'utf8'));
131
+ created.push(file.containerId);
132
+ helper.start(file.containerId);
133
+ }
134
+ catch (e) {
135
+ for (const id of created.reverse())
136
+ this.tryTerminate(helper, id);
137
+ throw e;
138
+ }
139
+ return { id: file.uvmId, engine: this.id, started: Date.now() };
140
+ }
141
+ tryTerminate(helper, id) {
142
+ try {
143
+ helper.terminate(id);
144
+ }
145
+ catch (e) {
146
+ if (!(e instanceof UserError))
147
+ throw e; // a system that is already gone is fine
148
+ }
149
+ }
150
+ /** Ours: the compute systems the helper lists with our owner name. */
151
+ ours(helper) {
152
+ const parsed = SystemListSchema.safeParse(JSON.parse(helper.enumerate().json || '[]'));
153
+ return parsed.success ? parsed.data.filter((s) => s.Owner === HCS_OWNER).map((s) => s.Id) : [];
154
+ }
155
+ running() {
156
+ try {
157
+ return Promise.resolve(this.ours(this.helper()).length > 0);
158
+ }
159
+ catch {
160
+ return Promise.resolve(false); // no helper or no service: nothing of ours can be running
161
+ }
162
+ }
163
+ stop() {
164
+ const helper = this.helper();
165
+ // The container goes before the machine that hosts it.
166
+ const ids = this.ours(helper).sort((a, b) => Number(b.endsWith('-c')) - Number(a.endsWith('-c')));
167
+ for (const id of ids)
168
+ this.tryTerminate(helper, id);
169
+ return Promise.resolve();
170
+ }
171
+ }
@@ -0,0 +1,43 @@
1
+ import { z } from 'zod';
2
+ export declare const HcsReplySchema: z.ZodObject<{
3
+ ok: z.ZodBoolean;
4
+ hresult: z.ZodString;
5
+ message: z.ZodString;
6
+ json: z.ZodString;
7
+ values: z.ZodRecord<z.ZodString, z.ZodString>;
8
+ }, z.core.$strip>;
9
+ export type HcsReply = z.infer<typeof HcsReplySchema>;
10
+ export interface RunResult {
11
+ readonly status: number | null;
12
+ readonly error?: string;
13
+ }
14
+ /** Starts the helper: replaceable in tests. */
15
+ export type HelperRunner = (exe: string, args: readonly string[], timeoutMs: number) => RunResult;
16
+ export declare const spawnRunner: HelperRunner;
17
+ /** Compiles the helper's sources to `exe` with the .NET Framework csc (C# 5). False when it cannot be built. */
18
+ export declare function buildHcsHostTo(exe: string): boolean;
19
+ /**
20
+ * <storage>\bin\hcs\<hash of its sources>\HcsHost.exe, built the first time. Its own folder: HostTools' cleanup of old
21
+ * builds only touches twelve-digit hash folders directly in bin. Null when it cannot be built.
22
+ */
23
+ export declare function hcsHostExe(storageRoot: string): string | null;
24
+ export declare class HcsHelper {
25
+ private readonly exe;
26
+ private readonly run;
27
+ private readonly tempRoot;
28
+ /** `exe`: where HcsHost.exe is (built when asked); `tempRoot`: where the private folders for one call go. */
29
+ constructor(exe: () => string | null, run?: HelperRunner, tempRoot?: string);
30
+ /** One helper call: `args` then `--out <response>`. Returns the checked answer, whatever it says. */
31
+ call(args: readonly string[], request?: unknown): HcsReply;
32
+ /** The same, but a failed answer stops with the helper's own message. */
33
+ private must;
34
+ check(): HcsReply;
35
+ enumerate(): HcsReply;
36
+ properties(id: string): HcsReply;
37
+ /** `document` is the HCS JSON text; it travels as a string inside the request file. */
38
+ create(id: string, document: string): HcsReply;
39
+ start(id: string): HcsReply;
40
+ terminate(id: string): HcsReply;
41
+ grantVmAccess(vmId: string, file: string): HcsReply;
42
+ createVhdx(file: string, maxGb: number): HcsReply;
43
+ }
@@ -0,0 +1,173 @@
1
+ // Runs HcsHost.exe (native\csharp\HcsHost, built on first use) with JSON files in a private temp folder. The answer
2
+ // is a file too: size-bounded and checked with zod, never trusted as it is. HcsHost only talks to the Windows Host
3
+ // Compute Service and virtdisk; it takes no guest data.
4
+ import crypto from 'node:crypto';
5
+ import fs from 'node:fs';
6
+ import os from 'node:os';
7
+ import path from 'node:path';
8
+ import { spawnSync } from 'node:child_process';
9
+ import { z } from 'zod';
10
+ import { fail, UserError } from '../../../core/util/index.js';
11
+ import { SYSTEM } from '../../../shared/system.js';
12
+ import { nativeFile } from '../../native.js';
13
+ import { refuseInSelfTest } from '../../test-guard.js';
14
+ const MAX_RESPONSE_BYTES = 2 * 1024 * 1024;
15
+ const CALL_TIMEOUT_MS = 240000;
16
+ /** Only ids this tool gives its compute systems (HcsHost.exe refuses any other, and checks the Owner too). */
17
+ const SAFE_ID = /^agent-sandbox-[A-Za-z0-9._-]{1,100}$/;
18
+ export const HcsReplySchema = z.object({
19
+ ok: z.boolean(),
20
+ hresult: z.string().max(16),
21
+ message: z.string().max(4000),
22
+ json: z.string().max(MAX_RESPONSE_BYTES),
23
+ values: z.record(z.string().max(64), z.string().max(2000)),
24
+ });
25
+ export const spawnRunner = (exe, args, timeoutMs) => {
26
+ const r = spawnSync(exe, [...args], {
27
+ windowsHide: true,
28
+ timeout: timeoutMs,
29
+ maxBuffer: 1024 * 1024,
30
+ stdio: 'ignore',
31
+ });
32
+ return { status: r.status, error: r.error?.message };
33
+ };
34
+ /** Compiles the helper's sources to `exe` with the .NET Framework csc (C# 5). False when it cannot be built. */
35
+ export function buildHcsHostTo(exe) {
36
+ const dir = nativeFile('csharp', 'HcsHost');
37
+ let sources;
38
+ try {
39
+ sources = fs
40
+ .readdirSync(dir)
41
+ .filter((f) => f.endsWith('.cs'))
42
+ .sort()
43
+ .map((f) => path.join(dir, f));
44
+ }
45
+ catch {
46
+ return false; // no sources next to this package
47
+ }
48
+ if (!fs.existsSync(SYSTEM.csc()))
49
+ return false;
50
+ fs.mkdirSync(path.dirname(exe), { recursive: true });
51
+ const r = spawnSync(SYSTEM.csc(), ['/nologo', '/optimize', '/target:exe', '/r:System.Web.Extensions.dll', '/out:' + exe, ...sources], { windowsHide: true, timeout: 120000 });
52
+ return r.status === 0 && fs.existsSync(exe);
53
+ }
54
+ /**
55
+ * <storage>\bin\hcs\<hash of its sources>\HcsHost.exe, built the first time. Its own folder: HostTools' cleanup of old
56
+ * builds only touches twelve-digit hash folders directly in bin. Null when it cannot be built.
57
+ */
58
+ export function hcsHostExe(storageRoot) {
59
+ refuseInSelfTest('build HcsHost.exe');
60
+ const dir = nativeFile('csharp', 'HcsHost');
61
+ const hash = crypto.createHash('sha256');
62
+ try {
63
+ for (const f of fs
64
+ .readdirSync(dir)
65
+ .filter((n) => n.endsWith('.cs'))
66
+ .sort())
67
+ hash.update(fs.readFileSync(path.join(dir, f)));
68
+ }
69
+ catch {
70
+ return null; // no sources
71
+ }
72
+ const exe = path.join(storageRoot, 'bin', 'hcs', hash.digest('hex').slice(0, 12), 'HcsHost.exe');
73
+ return fs.existsSync(exe) || buildHcsHostTo(exe) ? exe : null;
74
+ }
75
+ /** A path argument: absolute, not an option. Nothing else reaches the helper's command line. */
76
+ function pathArg(value, what) {
77
+ if (!path.isAbsolute(value) || value.startsWith('-'))
78
+ fail('Not a full path for ' + what + ': ' + value);
79
+ return value;
80
+ }
81
+ function idArg(value) {
82
+ if (!SAFE_ID.test(value))
83
+ fail('Not a valid sandbox id: ' + value);
84
+ return value;
85
+ }
86
+ export class HcsHelper {
87
+ exe;
88
+ run;
89
+ tempRoot;
90
+ /** `exe`: where HcsHost.exe is (built when asked); `tempRoot`: where the private folders for one call go. */
91
+ constructor(exe, run = spawnRunner, tempRoot = os.tmpdir()) {
92
+ this.exe = exe;
93
+ this.run = run;
94
+ this.tempRoot = tempRoot;
95
+ }
96
+ /** One helper call: `args` then `--out <response>`. Returns the checked answer, whatever it says. */
97
+ call(args, request) {
98
+ const exe = this.exe();
99
+ if (!exe)
100
+ fail('HcsHost.exe could not be built.', 'It needs the .NET Framework compiler that ships with Windows.');
101
+ const dir = fs.mkdtempSync(path.join(this.tempRoot, 'agent-sandbox-hcs-'));
102
+ try {
103
+ const out = path.join(dir, 'response.json');
104
+ const full = [...args];
105
+ if (request !== undefined) {
106
+ const file = path.join(dir, 'request.json');
107
+ fs.writeFileSync(file, JSON.stringify(request), 'utf8');
108
+ full.push(file);
109
+ }
110
+ const result = this.run(exe, [...full, '--out', out], CALL_TIMEOUT_MS);
111
+ return readReply(out, result);
112
+ }
113
+ finally {
114
+ fs.rmSync(dir, { recursive: true, force: true });
115
+ }
116
+ }
117
+ /** The same, but a failed answer stops with the helper's own message. */
118
+ must(args, request) {
119
+ const reply = this.call(args, request);
120
+ if (!reply.ok)
121
+ fail('The Host Compute Service said: ' + reply.message + ' (' + reply.hresult + ')');
122
+ return reply;
123
+ }
124
+ check() {
125
+ return this.call(['check']);
126
+ }
127
+ enumerate() {
128
+ return this.must(['enumerate']);
129
+ }
130
+ properties(id) {
131
+ return this.must(['properties', idArg(id)]);
132
+ }
133
+ /** `document` is the HCS JSON text; it travels as a string inside the request file. */
134
+ create(id, document) {
135
+ return this.must(['create'], { id: idArg(id), document });
136
+ }
137
+ start(id) {
138
+ return this.must(['start', idArg(id)]);
139
+ }
140
+ terminate(id) {
141
+ return this.must(['terminate', idArg(id)]);
142
+ }
143
+ grantVmAccess(vmId, file) {
144
+ return this.must(['grant-vm-access', idArg(vmId), pathArg(file, 'the disk')]);
145
+ }
146
+ createVhdx(file, maxGb) {
147
+ if (!Number.isInteger(maxGb) || maxGb < 1 || maxGb > 4096)
148
+ fail('The disk size must be 1 to 4096 GB.');
149
+ return this.must(['create-vhdx', pathArg(file, 'the disk'), String(maxGb)]);
150
+ }
151
+ }
152
+ function readReply(file, result) {
153
+ let text;
154
+ try {
155
+ if (fs.statSync(file).size > MAX_RESPONSE_BYTES)
156
+ fail('HcsHost.exe answered with too much text.');
157
+ text = fs.readFileSync(file, 'utf8');
158
+ }
159
+ catch (e) {
160
+ if (e instanceof UserError)
161
+ throw e;
162
+ fail('HcsHost.exe gave no answer' + (result.error ? ': ' + result.error : '') + '.');
163
+ }
164
+ let json;
165
+ try {
166
+ json = JSON.parse(text);
167
+ }
168
+ catch {
169
+ return fail('HcsHost.exe answered with something that is not JSON.');
170
+ }
171
+ const parsed = HcsReplySchema.safeParse(json);
172
+ return parsed.success ? parsed.data : fail('HcsHost.exe answered in a form this version does not know.');
173
+ }
@@ -0,0 +1,37 @@
1
+ import type { HcsImage } from './documents.js';
2
+ /** What a store says when it has no image: said to the user in plain words. */
3
+ export interface ImageResult {
4
+ readonly image: HcsImage | null;
5
+ readonly reason: string;
6
+ }
7
+ export interface ImageStore {
8
+ readonly name: string;
9
+ find(): ImageResult;
10
+ }
11
+ /** The file reads a store does, so tests give it a fake disk. Every read is bounded and a miss is null. */
12
+ export interface ImageFiles {
13
+ readText(file: string): string | null;
14
+ isDir(folder: string): boolean;
15
+ }
16
+ export declare const REAL_IMAGE_FILES: ImageFiles;
17
+ /** Docker's chain ids: id(1) = diffId(1); id(n) = sha256(id(n-1) + " " + diffId(n)). */
18
+ export declare function chainIds(diffIds: readonly string[]): string[];
19
+ /** An image Docker Desktop (Windows containers) already pulled: found by reading its metadata, never changed. */
20
+ export declare class DockerImageStore implements ImageStore {
21
+ private readonly root;
22
+ private readonly files;
23
+ readonly name = "an image Docker already pulled";
24
+ constructor(root?: string, files?: ImageFiles);
25
+ find(): ImageResult;
26
+ }
27
+ /** Your own image folder (AGENT_SANDBOX_HCS_IMAGE): a folder with image.json {layers (base first), utilityVmFiles}. */
28
+ export declare class FolderImageStore implements ImageStore {
29
+ private readonly folder;
30
+ private readonly files;
31
+ readonly name = "an image folder you named";
32
+ constructor(folder?: string | undefined, files?: ImageFiles);
33
+ find(): ImageResult;
34
+ }
35
+ export declare function defaultImageStores(): ImageStore[];
36
+ /** The first image any store has, or every store's reason. */
37
+ export declare function findImage(stores: readonly ImageStore[]): ImageResult;
@@ -0,0 +1,152 @@
1
+ // Where the HCS engine gets its base image (Windows Server Core, ltsc2022). This phase never downloads one: it only
2
+ // finds an image that is already on this PC, read-only. The layout of Docker's image store is from memory of Docker's
3
+ // windowsfilter graph driver [U]; nothing here writes to it.
4
+ import crypto from 'node:crypto';
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import { z } from 'zod';
8
+ const MAX_TEXT = 4 * 1024 * 1024;
9
+ export const REAL_IMAGE_FILES = {
10
+ readText: (file) => {
11
+ try {
12
+ if (fs.statSync(file).size > MAX_TEXT)
13
+ return null;
14
+ return fs.readFileSync(file, 'utf8');
15
+ }
16
+ catch {
17
+ return null; // missing or unreadable: the store reports "not found"
18
+ }
19
+ },
20
+ isDir: (folder) => {
21
+ try {
22
+ return fs.statSync(folder).isDirectory();
23
+ }
24
+ catch {
25
+ return false; // missing: not a folder
26
+ }
27
+ },
28
+ };
29
+ /** The repository and tag of the image we look for: Windows Server Core 2022, any registry spelling. */
30
+ const WANTED = /(^|\/)windows\/servercore:ltsc2022$/i;
31
+ const RepositoriesSchema = z.object({ Repositories: z.record(z.string(), z.record(z.string(), z.string())) });
32
+ const ImageConfigSchema = z.object({
33
+ rootfs: z.object({
34
+ diff_ids: z
35
+ .array(z.string().regex(/^sha256:[0-9a-f]{64}$/))
36
+ .min(1)
37
+ .max(200),
38
+ }),
39
+ });
40
+ const HEX64 = /^[0-9a-f]{64}$/;
41
+ const CACHE_ID = /^[0-9a-zA-Z]{1,128}$/;
42
+ /** Docker's chain ids: id(1) = diffId(1); id(n) = sha256(id(n-1) + " " + diffId(n)). */
43
+ export function chainIds(diffIds) {
44
+ const out = [];
45
+ for (const diff of diffIds) {
46
+ const prev = out[out.length - 1];
47
+ out.push(prev
48
+ ? 'sha256:' +
49
+ crypto
50
+ .createHash('sha256')
51
+ .update(prev + ' ' + diff)
52
+ .digest('hex')
53
+ : diff);
54
+ }
55
+ return out;
56
+ }
57
+ /** An image Docker Desktop (Windows containers) already pulled: found by reading its metadata, never changed. */
58
+ export class DockerImageStore {
59
+ root;
60
+ files;
61
+ name = 'an image Docker already pulled';
62
+ constructor(root = path.join(process.env.ProgramData ?? 'C:\\ProgramData', 'docker'), files = REAL_IMAGE_FILES) {
63
+ this.root = root;
64
+ this.files = files;
65
+ }
66
+ find() {
67
+ const meta = path.join(this.root, 'image', 'windowsfilter');
68
+ const repos = this.files.readText(path.join(meta, 'repositories.json'));
69
+ if (repos === null)
70
+ return { image: null, reason: 'Docker has no Windows images on this PC.' };
71
+ const parsed = RepositoriesSchema.safeParse(safeJson(repos));
72
+ if (!parsed.success)
73
+ return { image: null, reason: "Docker's image list could not be read." };
74
+ let imageId = null;
75
+ for (const tags of Object.values(parsed.data.Repositories))
76
+ for (const [name, id] of Object.entries(tags))
77
+ if (!imageId && WANTED.test(name) && /^sha256:[0-9a-f]{64}$/.test(id))
78
+ imageId = id;
79
+ if (!imageId)
80
+ return { image: null, reason: 'Docker has no windows/servercore:ltsc2022 image.' };
81
+ const config = ImageConfigSchema.safeParse(safeJson(this.files.readText(path.join(meta, 'imagedb', 'content', 'sha256', imageId.slice(7))) ?? ''));
82
+ if (!config.success)
83
+ return { image: null, reason: "Docker's record of the Server Core image could not be read." };
84
+ const layers = [];
85
+ for (const chain of chainIds(config.data.rootfs.diff_ids)) {
86
+ const hex = chain.slice(7);
87
+ if (!HEX64.test(hex))
88
+ return { image: null, reason: 'A layer id of the Server Core image is not valid.' };
89
+ const cacheId = (this.files.readText(path.join(meta, 'layerdb', 'sha256', hex, 'cache-id')) ?? '').trim();
90
+ if (!CACHE_ID.test(cacheId))
91
+ return { image: null, reason: 'A layer of the Server Core image is not on disk.' };
92
+ const folder = path.join(this.root, 'windowsfilter', cacheId);
93
+ if (!this.files.isDir(folder))
94
+ return { image: null, reason: 'A layer of the Server Core image is missing.' };
95
+ layers.push(folder);
96
+ }
97
+ const utilityVmFiles = path.join(layers[0], 'UtilityVM', 'Files');
98
+ if (!this.files.isDir(utilityVmFiles))
99
+ return { image: null, reason: 'The Server Core image has no UtilityVM folder (Hyper-V isolation needs it).' };
100
+ return { image: { id: imageId, layers, utilityVmFiles }, reason: '' };
101
+ }
102
+ }
103
+ const FolderImageSchema = z.object({
104
+ layers: z.array(z.string().min(3).max(260)).min(1).max(200),
105
+ utilityVmFiles: z.string().min(3).max(260),
106
+ });
107
+ /** Your own image folder (AGENT_SANDBOX_HCS_IMAGE): a folder with image.json {layers (base first), utilityVmFiles}. */
108
+ export class FolderImageStore {
109
+ folder;
110
+ files;
111
+ name = 'an image folder you named';
112
+ constructor(folder = process.env.AGENT_SANDBOX_HCS_IMAGE, files = REAL_IMAGE_FILES) {
113
+ this.folder = folder;
114
+ this.files = files;
115
+ }
116
+ find() {
117
+ if (!this.folder)
118
+ return { image: null, reason: 'No image folder is set (AGENT_SANDBOX_HCS_IMAGE).' };
119
+ const parsed = FolderImageSchema.safeParse(safeJson(this.files.readText(path.join(this.folder, 'image.json')) ?? ''));
120
+ if (!parsed.success)
121
+ return { image: null, reason: 'There is no valid image.json in ' + this.folder + '.' };
122
+ const all = [...parsed.data.layers, parsed.data.utilityVmFiles];
123
+ if (!all.every((p) => path.isAbsolute(p) && this.files.isDir(p)))
124
+ return { image: null, reason: 'A folder named in ' + path.join(this.folder, 'image.json') + ' is missing.' };
125
+ return {
126
+ image: { id: 'folder', layers: parsed.data.layers, utilityVmFiles: parsed.data.utilityVmFiles },
127
+ reason: '',
128
+ };
129
+ }
130
+ }
131
+ function safeJson(text) {
132
+ try {
133
+ return JSON.parse(text);
134
+ }
135
+ catch {
136
+ return null; // not JSON: the schema check then fails with a plain message
137
+ }
138
+ }
139
+ export function defaultImageStores() {
140
+ return [new FolderImageStore(), new DockerImageStore()];
141
+ }
142
+ /** The first image any store has, or every store's reason. */
143
+ export function findImage(stores) {
144
+ const reasons = [];
145
+ for (const store of stores) {
146
+ const result = store.find();
147
+ if (result.image)
148
+ return result;
149
+ reasons.push(result.reason);
150
+ }
151
+ return { image: null, reason: reasons.join(' ') };
152
+ }
@@ -0,0 +1,7 @@
1
+ export type { SandboxEngine } from './engine.js';
2
+ export type { EngineCapabilities, EngineCheck, EngineId, EnginePlan, LaunchDevices, LaunchPlan, RunningSandbox, } from './types.js';
3
+ export { engineFor, engineReports, openEngine, type EngineReport } from './registry.js';
4
+ export { WindowsSandboxEngine } from './windows-sandbox/engine.js';
5
+ export { wsbText } from './windows-sandbox/wsb-text.js';
6
+ export { HcsEngine, HCS_CAPABILITIES, hcsStartEnabled } from './hcs/engine.js';
7
+ export { checkHcs, realHcsProbes, type HcsProbes } from './hcs/check.js';
@@ -0,0 +1,5 @@
1
+ export { engineFor, engineReports, openEngine } from './registry.js';
2
+ export { WindowsSandboxEngine } from './windows-sandbox/engine.js';
3
+ export { wsbText } from './windows-sandbox/wsb-text.js';
4
+ export { HcsEngine, HCS_CAPABILITIES, hcsStartEnabled } from './hcs/engine.js';
5
+ export { checkHcs, realHcsProbes } from './hcs/check.js';
@@ -0,0 +1,16 @@
1
+ import type { Config } from '../../core/types.js';
2
+ import type { SandboxEngine } from './engine.js';
3
+ import { type HcsProbes } from './hcs/check.js';
4
+ import type { EngineCapabilities, EngineCheck, EngineId } from './types.js';
5
+ /** The engine for the settings when nothing is looked up first (Windows Sandbox); hcs is opened with openEngine. */
6
+ export declare function engineFor(config: Config): SandboxEngine;
7
+ /** The engine to launch with. HCS is returned only when its check passes; otherwise this stops with the reasons. */
8
+ export declare function openEngine(config: Config, hcsProbes?: HcsProbes): Promise<SandboxEngine>;
9
+ export interface EngineReport {
10
+ readonly id: EngineId;
11
+ readonly inUse: boolean;
12
+ readonly capabilities: EngineCapabilities;
13
+ readonly check: EngineCheck;
14
+ }
15
+ /** Every engine with its capabilities and whether it can be used on this PC. */
16
+ export declare function engineReports(config: Config, hcsProbes?: HcsProbes): Promise<EngineReport[]>;
@@ -0,0 +1,30 @@
1
+ import { fail } from '../../core/util/index.js';
2
+ import { checkHcs, realHcsProbes } from './hcs/check.js';
3
+ import { HCS_CAPABILITIES, HcsEngine } from './hcs/engine.js';
4
+ import { WindowsSandboxEngine } from './windows-sandbox/engine.js';
5
+ /** The engine for the settings when nothing is looked up first (Windows Sandbox); hcs is opened with openEngine. */
6
+ export function engineFor(config) {
7
+ if (config.sandbox.engine === 'hcs')
8
+ fail('The HCS engine has to be opened first (its check looks at this PC).', 'Run: sandbox engine check hcs');
9
+ return new WindowsSandboxEngine(config.sandbox);
10
+ }
11
+ /** The engine to launch with. HCS is returned only when its check passes; otherwise this stops with the reasons. */
12
+ export async function openEngine(config, hcsProbes) {
13
+ if (config.sandbox.engine === 'hcs')
14
+ return HcsEngine.open(config.storage.root, hcsProbes);
15
+ return engineFor(config);
16
+ }
17
+ /** Every engine with its capabilities and whether it can be used on this PC. */
18
+ export async function engineReports(config, hcsProbes = realHcsProbes()) {
19
+ const windows = new WindowsSandboxEngine(config.sandbox);
20
+ const inUse = config.sandbox.engine;
21
+ return [
22
+ {
23
+ id: 'windows-sandbox',
24
+ inUse: inUse === 'windows-sandbox',
25
+ capabilities: windows.capabilities(),
26
+ check: await windows.check(),
27
+ },
28
+ { id: 'hcs', inUse: inUse === 'hcs', capabilities: HCS_CAPABILITIES, check: checkHcs(hcsProbes) },
29
+ ];
30
+ }