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,100 @@
1
+ // What HcsHost may touch: only compute systems this tool created (id prefix and Owner), and only disk files it made
2
+ // (.vhdx, not a link). A wrong or tampered id can never reach Windows Sandbox, WSL, Docker or anything else on this PC.
3
+ using System;
4
+ using System.Collections.Generic;
5
+ using System.IO;
6
+ using System.Text.RegularExpressions;
7
+ using System.Web.Script.Serialization;
8
+
9
+ namespace AgentSandbox.HcsHost
10
+ {
11
+ public static class Guard
12
+ {
13
+ public const string IdPrefix = "agent-sandbox-";
14
+ public const string Owner = "agent-sandbox";
15
+ private const int MaxIdLength = 120;
16
+ private static readonly Regex SafeId = new Regex("^agent-sandbox-[A-Za-z0-9._-]{1,100}$");
17
+
18
+ /// <summary>Null when the id is one of ours by its shape; otherwise why not.</summary>
19
+ public static string IdProblem(string id)
20
+ {
21
+ if (id == null || id.Length > MaxIdLength || !SafeId.IsMatch(id))
22
+ {
23
+ return "only compute systems whose id starts with " + IdPrefix + " can be used";
24
+ }
25
+ return null;
26
+ }
27
+
28
+ /// <summary>Null when an HCS document says it belongs to this tool (top-level "Owner").</summary>
29
+ public static string DocumentProblem(string document)
30
+ {
31
+ Dictionary<string, object> parsed;
32
+ try
33
+ {
34
+ parsed = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(document);
35
+ }
36
+ catch (ArgumentException)
37
+ {
38
+ return "the document is not JSON";
39
+ }
40
+ catch (InvalidOperationException)
41
+ {
42
+ return "the document is not JSON";
43
+ }
44
+ object owner;
45
+ if (parsed == null || !parsed.TryGetValue("Owner", out owner) || !(owner is string) || (string)owner != Owner)
46
+ {
47
+ return "the document's Owner must be " + Owner;
48
+ }
49
+ return null;
50
+ }
51
+
52
+ /// <summary>Null when the running system `id` reports this tool as its Owner (asked from HCS itself).</summary>
53
+ public static string OwnerProblem(string id)
54
+ {
55
+ HcsReply reply = Hcs.Properties(id, "{\"PropertyTypes\":[]}");
56
+ if (!reply.Ok)
57
+ {
58
+ return "its properties could not be read: " + reply.Message();
59
+ }
60
+ Dictionary<string, object> parsed;
61
+ try
62
+ {
63
+ parsed = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(reply.Json);
64
+ }
65
+ catch (ArgumentException)
66
+ {
67
+ return "its properties are not JSON";
68
+ }
69
+ catch (InvalidOperationException)
70
+ {
71
+ return "its properties are not JSON";
72
+ }
73
+ object owner;
74
+ if (parsed == null || !parsed.TryGetValue("Owner", out owner) || !(owner is string) || (string)owner != Owner)
75
+ {
76
+ return "it does not belong to this tool (Owner is not " + Owner + ")";
77
+ }
78
+ return null;
79
+ }
80
+
81
+ /// <summary>Null when `path` is an existing .vhdx file that is not a link (a disk this tool made).</summary>
82
+ public static string DiskProblem(string path)
83
+ {
84
+ if (string.IsNullOrEmpty(path) || !Path.IsPathRooted(path) || !path.EndsWith(".vhdx", StringComparison.OrdinalIgnoreCase))
85
+ {
86
+ return "only a full path to a .vhdx file can be used";
87
+ }
88
+ FileInfo info = new FileInfo(path);
89
+ if (!info.Exists)
90
+ {
91
+ return "the disk file does not exist";
92
+ }
93
+ if ((info.Attributes & FileAttributes.ReparsePoint) != 0)
94
+ {
95
+ return "the disk file is a link";
96
+ }
97
+ return null;
98
+ }
99
+ }
100
+ }
@@ -0,0 +1,256 @@
1
+ // Calls into computecore.dll (Host Compute Service) and computestorage.dll (HcsGrantVmAccess). Signatures are from
2
+ // the Microsoft HCS API reference (learn.microsoft.com/virtualization/api/hcs/reference/*), checked there for the
3
+ // operation and compute-system functions; HcsGrantVmAccess is from the computestorage.h header (not re-checked).
4
+ // Nothing here has run against a real HCS: the PC this was written on had no Hyper-V.
5
+ using System;
6
+ using System.ComponentModel;
7
+ using System.Runtime.InteropServices;
8
+
9
+ namespace AgentSandbox.HcsHost
10
+ {
11
+ /// <summary>What an HCS call answered: the HRESULT and the JSON document (result or error) that came with it.</summary>
12
+ public sealed class HcsReply
13
+ {
14
+ public int HResult;
15
+ public string Json = "";
16
+
17
+ public bool Ok
18
+ {
19
+ get { return HResult == 0; }
20
+ }
21
+
22
+ public string Message()
23
+ {
24
+ if (HResult == 0)
25
+ {
26
+ return "ok";
27
+ }
28
+ string known = HcsErrorText((uint)HResult);
29
+ if (known != null)
30
+ {
31
+ return known;
32
+ }
33
+ Exception ex = Marshal.GetExceptionForHR(HResult);
34
+ return ex != null ? ex.Message : "error 0x" + HResult.ToString("X8");
35
+ }
36
+
37
+ /// <summary>The HCS-specific codes (learn.microsoft.com/virtualization/api/hcs/reference/hcshresult), or null.</summary>
38
+ private static string HcsErrorText(uint hr)
39
+ {
40
+ switch (hr)
41
+ {
42
+ case 0x80370102u:
43
+ return "a required Windows feature is not installed (HCS_E_HYPERV_NOT_INSTALLED)";
44
+ case 0x8037010Du:
45
+ return "the compute system document is invalid (HCS_E_INVALID_JSON)";
46
+ case 0x8037010Eu:
47
+ return "no compute system has that id (HCS_E_SYSTEM_NOT_FOUND)";
48
+ case 0x8037010Fu:
49
+ return "a compute system with that id already exists (HCS_E_SYSTEM_ALREADY_EXISTS)";
50
+ case 0x80370110u:
51
+ return "the compute system is not running (HCS_E_SYSTEM_ALREADY_STOPPED)";
52
+ case 0x80370114u:
53
+ return "a required Windows feature is not installed (HCS_E_SERVICE_NOT_AVAILABLE)";
54
+ case 0x80370118u:
55
+ return "the operation did not complete in time (HCS_E_OPERATION_TIMEOUT)";
56
+ case 0x8037011Bu:
57
+ return "only Administrators or Hyper-V Administrators may do this (HCS_E_ACCESS_DENIED, see https://aka.ms/hcsadmin)";
58
+ default:
59
+ return null;
60
+ }
61
+ }
62
+ }
63
+
64
+ public static class Hcs
65
+ {
66
+ private const uint GenericAll = 0x10000000;
67
+ private const uint QueryMs = 15000;
68
+ private const uint ChangeMs = 180000;
69
+
70
+ private delegate int Begin(IntPtr operation);
71
+
72
+ private delegate int BeginOn(IntPtr system, IntPtr operation);
73
+
74
+ private static class NativeMethods
75
+ {
76
+ [DllImport("computecore.dll", ExactSpelling = true, SetLastError = true)]
77
+ public static extern IntPtr HcsCreateOperation(IntPtr context, IntPtr callback);
78
+
79
+ [DllImport("computecore.dll", ExactSpelling = true)]
80
+ public static extern void HcsCloseOperation(IntPtr operation);
81
+
82
+ [DllImport("computecore.dll", ExactSpelling = true)]
83
+ public static extern int HcsWaitForOperationResult(IntPtr operation, uint timeoutMs, out IntPtr resultDocument);
84
+
85
+ [DllImport("computecore.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
86
+ public static extern int HcsEnumerateComputeSystems(string query, IntPtr operation);
87
+
88
+ [DllImport("computecore.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
89
+ public static extern int HcsCreateComputeSystem(string id, string configuration, IntPtr operation, IntPtr securityDescriptor, out IntPtr computeSystem);
90
+
91
+ [DllImport("computecore.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
92
+ public static extern int HcsOpenComputeSystem(string id, uint requestedAccess, out IntPtr computeSystem);
93
+
94
+ [DllImport("computecore.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
95
+ public static extern int HcsStartComputeSystem(IntPtr computeSystem, IntPtr operation, string options);
96
+
97
+ [DllImport("computecore.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
98
+ public static extern int HcsTerminateComputeSystem(IntPtr computeSystem, IntPtr operation, string options);
99
+
100
+ [DllImport("computecore.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
101
+ public static extern int HcsGetComputeSystemProperties(IntPtr computeSystem, IntPtr operation, string propertyQuery);
102
+
103
+ [DllImport("computecore.dll", ExactSpelling = true)]
104
+ public static extern void HcsCloseComputeSystem(IntPtr computeSystem);
105
+
106
+ [DllImport("computecore.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
107
+ public static extern int HcsGetServiceProperties(string propertyQuery, out IntPtr result);
108
+
109
+ [DllImport("computestorage.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
110
+ public static extern int HcsGrantVmAccess(string vmId, string filePath);
111
+
112
+ [DllImport("kernel32.dll", SetLastError = true)]
113
+ public static extern IntPtr LocalFree(IntPtr mem);
114
+
115
+ [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
116
+ public static extern IntPtr LoadLibrary(string fileName);
117
+
118
+ [DllImport("kernel32.dll", SetLastError = true)]
119
+ public static extern bool FreeLibrary(IntPtr module);
120
+ }
121
+
122
+ /// <summary>A LocalFree-able wide string from HCS, as text (empty when null).</summary>
123
+ private static string TakeString(IntPtr p)
124
+ {
125
+ if (p == IntPtr.Zero)
126
+ {
127
+ return "";
128
+ }
129
+ try
130
+ {
131
+ return Marshal.PtrToStringUni(p);
132
+ }
133
+ finally
134
+ {
135
+ NativeMethods.LocalFree(p);
136
+ }
137
+ }
138
+
139
+ /// <summary>Whether a DLL (computecore.dll) can be loaded at all on this PC.</summary>
140
+ public static bool CanLoad(string dll)
141
+ {
142
+ IntPtr module = NativeMethods.LoadLibrary(dll);
143
+ if (module == IntPtr.Zero)
144
+ {
145
+ return false;
146
+ }
147
+ NativeMethods.FreeLibrary(module);
148
+ return true;
149
+ }
150
+
151
+ public static HcsReply ServiceProperties(string queryJson)
152
+ {
153
+ HcsReply reply = new HcsReply();
154
+ IntPtr result = IntPtr.Zero;
155
+ reply.HResult = NativeMethods.HcsGetServiceProperties(queryJson, out result);
156
+ reply.Json = TakeString(result);
157
+ return reply;
158
+ }
159
+
160
+ /// <summary>Starts an operation with `begin`, waits for it and returns its result document.</summary>
161
+ private static HcsReply Run(Begin begin, uint waitMs)
162
+ {
163
+ HcsReply reply = new HcsReply();
164
+ IntPtr operation = NativeMethods.HcsCreateOperation(IntPtr.Zero, IntPtr.Zero);
165
+ if (operation == IntPtr.Zero)
166
+ {
167
+ reply.HResult = Marshal.GetHRForLastWin32Error();
168
+ return reply;
169
+ }
170
+ try
171
+ {
172
+ int hr = begin(operation);
173
+ if (hr != 0)
174
+ {
175
+ reply.HResult = hr;
176
+ return reply;
177
+ }
178
+ IntPtr doc = IntPtr.Zero;
179
+ reply.HResult = NativeMethods.HcsWaitForOperationResult(operation, waitMs, out doc);
180
+ reply.Json = TakeString(doc);
181
+ return reply;
182
+ }
183
+ finally
184
+ {
185
+ NativeMethods.HcsCloseOperation(operation);
186
+ }
187
+ }
188
+
189
+ public static HcsReply Enumerate(string queryJson)
190
+ {
191
+ return Run(delegate(IntPtr op) { return NativeMethods.HcsEnumerateComputeSystems(queryJson, op); }, QueryMs);
192
+ }
193
+
194
+ /// <summary>Creates a compute system from a document. The handle is closed again: the system stays.</summary>
195
+ public static HcsReply Create(string id, string document)
196
+ {
197
+ IntPtr system = IntPtr.Zero;
198
+ try
199
+ {
200
+ return Run(
201
+ delegate(IntPtr op) { return NativeMethods.HcsCreateComputeSystem(id, document, op, IntPtr.Zero, out system); },
202
+ ChangeMs);
203
+ }
204
+ finally
205
+ {
206
+ if (system != IntPtr.Zero)
207
+ {
208
+ NativeMethods.HcsCloseComputeSystem(system);
209
+ }
210
+ }
211
+ }
212
+
213
+ private static HcsReply WithSystem(string id, uint waitMs, BeginOn call)
214
+ {
215
+ IntPtr system = IntPtr.Zero;
216
+ int hr = NativeMethods.HcsOpenComputeSystem(id, GenericAll, out system);
217
+ if (hr != 0)
218
+ {
219
+ HcsReply failed = new HcsReply();
220
+ failed.HResult = hr;
221
+ return failed;
222
+ }
223
+ try
224
+ {
225
+ return Run(delegate(IntPtr op) { return call(system, op); }, waitMs);
226
+ }
227
+ finally
228
+ {
229
+ NativeMethods.HcsCloseComputeSystem(system);
230
+ }
231
+ }
232
+
233
+ public static HcsReply Start(string id)
234
+ {
235
+ return WithSystem(id, ChangeMs, delegate(IntPtr system, IntPtr op) { return NativeMethods.HcsStartComputeSystem(system, op, null); });
236
+ }
237
+
238
+ public static HcsReply Terminate(string id)
239
+ {
240
+ return WithSystem(id, ChangeMs, delegate(IntPtr system, IntPtr op) { return NativeMethods.HcsTerminateComputeSystem(system, op, null); });
241
+ }
242
+
243
+ public static HcsReply Properties(string id, string queryJson)
244
+ {
245
+ return WithSystem(id, QueryMs, delegate(IntPtr system, IntPtr op) { return NativeMethods.HcsGetComputeSystemProperties(system, op, queryJson); });
246
+ }
247
+
248
+ /// <summary>Lets the virtual machine `vmId` open the file (its disk). The file must exist.</summary>
249
+ public static HcsReply GrantVmAccess(string vmId, string filePath)
250
+ {
251
+ HcsReply reply = new HcsReply();
252
+ reply.HResult = NativeMethods.HcsGrantVmAccess(vmId, filePath);
253
+ return reply;
254
+ }
255
+ }
256
+ }
@@ -0,0 +1,78 @@
1
+ // Minimal JSON output for HcsHost's response file: one flat object of strings and a boolean. Requests are read with
2
+ // JavaScriptSerializer (System.Web.Extensions, part of .NET 4.x).
3
+ using System.Collections.Generic;
4
+ using System.Text;
5
+
6
+ namespace AgentSandbox.HcsHost
7
+ {
8
+ public static class Json
9
+ {
10
+ public static string Quote(string text)
11
+ {
12
+ StringBuilder sb = new StringBuilder();
13
+ sb.Append('"');
14
+ if (text != null)
15
+ {
16
+ foreach (char ch in text)
17
+ {
18
+ if (ch == '"')
19
+ {
20
+ sb.Append("\\\"");
21
+ }
22
+ else if (ch == '\\')
23
+ {
24
+ sb.Append("\\\\");
25
+ }
26
+ else if (ch == '\n')
27
+ {
28
+ sb.Append("\\n");
29
+ }
30
+ else if (ch == '\r')
31
+ {
32
+ sb.Append("\\r");
33
+ }
34
+ else if (ch == '\t')
35
+ {
36
+ sb.Append("\\t");
37
+ }
38
+ else if (ch < ' ')
39
+ {
40
+ sb.Append("\\u").Append(((int)ch).ToString("x4"));
41
+ }
42
+ else
43
+ {
44
+ sb.Append(ch);
45
+ }
46
+ }
47
+ }
48
+ sb.Append('"');
49
+ return sb.ToString();
50
+ }
51
+
52
+ /// <summary>{"ok":..,"hresult":"0x..","message":"..","json":"..","values":{..}}</summary>
53
+ public static string Response(bool ok, int hresult, string message, string json, IDictionary<string, string> values)
54
+ {
55
+ StringBuilder sb = new StringBuilder();
56
+ sb.Append("{\"ok\":").Append(ok ? "true" : "false");
57
+ sb.Append(",\"hresult\":").Append(Quote("0x" + hresult.ToString("X8")));
58
+ sb.Append(",\"message\":").Append(Quote(message));
59
+ sb.Append(",\"json\":").Append(Quote(json));
60
+ sb.Append(",\"values\":{");
61
+ bool first = true;
62
+ if (values != null)
63
+ {
64
+ foreach (KeyValuePair<string, string> pair in values)
65
+ {
66
+ if (!first)
67
+ {
68
+ sb.Append(',');
69
+ }
70
+ first = false;
71
+ sb.Append(Quote(pair.Key)).Append(':').Append(Quote(pair.Value));
72
+ }
73
+ }
74
+ sb.Append("}}");
75
+ return sb.ToString();
76
+ }
77
+ }
78
+ }
@@ -0,0 +1,185 @@
1
+ // HcsHost.exe <verb> [arguments] --out <response.json>
2
+ // Verbs: check, enumerate, properties <id>, create <request.json>, start <id>, terminate <id>,
3
+ // grant-vm-access <vmId> <file>, create-vhdx <path> <maxGb>.
4
+ // The answer is one JSON file (see Json.Response); exit code 0 = ok, 1 = failed, 2 = wrong use. A create request is
5
+ // {"id": "...", "document": "<the HCS document as a JSON string>"}. Never attaches a disk to this PC.
6
+ using System;
7
+ using System.Collections.Generic;
8
+ using System.IO;
9
+ using System.Security.Principal;
10
+ using System.Text;
11
+ using System.Web.Script.Serialization;
12
+
13
+ namespace AgentSandbox.HcsHost
14
+ {
15
+ public static class Program
16
+ {
17
+ private const long MaxRequestBytes = 1024 * 1024;
18
+ private const int ExitOk = 0;
19
+ private const int ExitFailed = 1;
20
+ private const int ExitUsage = 2;
21
+ private static readonly SecurityIdentifier HyperVAdministrators = new SecurityIdentifier("S-1-5-32-578");
22
+
23
+ public static int Main(string[] args)
24
+ {
25
+ string outFile = null;
26
+ List<string> rest = new List<string>();
27
+ for (int i = 0; i < args.Length; i++)
28
+ {
29
+ if (args[i] == "--out" && i + 1 < args.Length)
30
+ {
31
+ outFile = args[i + 1];
32
+ i++;
33
+ }
34
+ else
35
+ {
36
+ rest.Add(args[i]);
37
+ }
38
+ }
39
+ string response;
40
+ int code;
41
+ try
42
+ {
43
+ code = Dispatch(rest, out response);
44
+ }
45
+ catch (Exception ex)
46
+ {
47
+ response = Json.Response(false, ex.HResult, ex.Message, "", null);
48
+ code = ExitFailed;
49
+ }
50
+ Write(outFile, response);
51
+ return code;
52
+ }
53
+
54
+ private static void Write(string outFile, string text)
55
+ {
56
+ if (outFile == null)
57
+ {
58
+ Console.Out.WriteLine(text);
59
+ return;
60
+ }
61
+ File.WriteAllText(outFile, text, new UTF8Encoding(false));
62
+ }
63
+
64
+ private static int Usage(out string response, string what)
65
+ {
66
+ response = Json.Response(false, 0, "Usage: " + what, "", null);
67
+ return ExitUsage;
68
+ }
69
+
70
+ private static int FromReply(HcsReply reply, IDictionary<string, string> values, out string response)
71
+ {
72
+ response = Json.Response(reply.Ok, reply.HResult, reply.Message(), reply.Json, values);
73
+ return reply.Ok ? ExitOk : ExitFailed;
74
+ }
75
+
76
+ private static int Dispatch(List<string> args, out string response)
77
+ {
78
+ if (args.Count == 0)
79
+ {
80
+ return Usage(out response, "HcsHost <check|enumerate|properties|create|start|terminate|grant-vm-access|create-vhdx> ... --out file");
81
+ }
82
+ string verb = args[0];
83
+ if (verb == "check")
84
+ {
85
+ return Check(out response);
86
+ }
87
+ if (verb == "enumerate")
88
+ {
89
+ return FromReply(Hcs.Enumerate(null), null, out response);
90
+ }
91
+ if (verb == "properties" && args.Count == 2)
92
+ {
93
+ if (Refused(Guard.IdProblem(args[1]), out response))
94
+ {
95
+ return ExitUsage;
96
+ }
97
+ return FromReply(Hcs.Properties(args[1], "{\"PropertyTypes\":[]}"), null, out response);
98
+ }
99
+ if (verb == "create" && args.Count == 2)
100
+ {
101
+ return Create(args[1], out response);
102
+ }
103
+ if ((verb == "start" || verb == "terminate") && args.Count == 2)
104
+ {
105
+ // Twice guarded: the id must look like ours, and HCS itself must say the system is ours.
106
+ if (Refused(Guard.IdProblem(args[1]), out response) || Refused(Guard.OwnerProblem(args[1]), out response))
107
+ {
108
+ return ExitUsage;
109
+ }
110
+ return FromReply(verb == "start" ? Hcs.Start(args[1]) : Hcs.Terminate(args[1]), null, out response);
111
+ }
112
+ if (verb == "grant-vm-access" && args.Count == 3)
113
+ {
114
+ if (Refused(Guard.IdProblem(args[1]), out response) || Refused(Guard.DiskProblem(args[2]), out response))
115
+ {
116
+ return ExitUsage;
117
+ }
118
+ return FromReply(Hcs.GrantVmAccess(args[1], args[2]), null, out response);
119
+ }
120
+ if (verb == "create-vhdx" && args.Count == 3)
121
+ {
122
+ long maxGb;
123
+ if (!long.TryParse(args[2], out maxGb))
124
+ {
125
+ return Usage(out response, "create-vhdx <path> <maxGb>");
126
+ }
127
+ VirtualDisk.Create(args[1], maxGb);
128
+ response = Json.Response(true, 0, "ok", "", null);
129
+ return ExitOk;
130
+ }
131
+ return Usage(out response, "unknown verb or wrong number of arguments: " + verb);
132
+ }
133
+
134
+ /// <summary>Read-only facts: can computecore load, who am I, what does the service say.</summary>
135
+ private static int Check(out string response)
136
+ {
137
+ Dictionary<string, string> values = new Dictionary<string, string>();
138
+ values["computecore"] = Hcs.CanLoad("computecore.dll") ? "yes" : "no";
139
+ WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
140
+ values["administrator"] = principal.IsInRole(WindowsBuiltInRole.Administrator) ? "yes" : "no";
141
+ values["hyperVAdministrators"] = principal.IsInRole(HyperVAdministrators) ? "yes" : "no";
142
+ if (values["computecore"] != "yes")
143
+ {
144
+ response = Json.Response(false, 0, "computecore.dll is not on this PC", "", values);
145
+ return ExitFailed;
146
+ }
147
+ HcsReply reply = Hcs.ServiceProperties(null);
148
+ return FromReply(reply, values, out response);
149
+ }
150
+
151
+ private static int Create(string requestFile, out string response)
152
+ {
153
+ FileInfo info = new FileInfo(requestFile);
154
+ if (!info.Exists || info.Length > MaxRequestBytes)
155
+ {
156
+ return Usage(out response, "create <request.json> (a file of at most 1 MB)");
157
+ }
158
+ JavaScriptSerializer serializer = new JavaScriptSerializer();
159
+ Dictionary<string, object> request = serializer.Deserialize<Dictionary<string, object>>(File.ReadAllText(requestFile, Encoding.UTF8));
160
+ object id;
161
+ object document;
162
+ if (!request.TryGetValue("id", out id) || !request.TryGetValue("document", out document) || !(id is string) || !(document is string))
163
+ {
164
+ return Usage(out response, "the request needs a text id and a text document");
165
+ }
166
+ if (Refused(Guard.IdProblem((string)id), out response) || Refused(Guard.DocumentProblem((string)document), out response))
167
+ {
168
+ return ExitUsage;
169
+ }
170
+ return FromReply(Hcs.Create((string)id, (string)document), null, out response);
171
+ }
172
+
173
+ /// <summary>True (with the refusal as the response) when `problem` says why the request is not allowed.</summary>
174
+ private static bool Refused(string problem, out string response)
175
+ {
176
+ if (problem == null)
177
+ {
178
+ response = null;
179
+ return false;
180
+ }
181
+ response = Json.Response(false, 0, "Refused: " + problem, "", null);
182
+ return true;
183
+ }
184
+ }
185
+ }