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
@@ -26,7 +26,7 @@ export function stageScripts(target, scripts) {
26
26
  fs.copyFileSync(script, path.join(target, '90-extra-' + index + '-' + path.basename(script)));
27
27
  });
28
28
  }
29
- export const RUNTIME_FILES = ['main.js', 'daemon.js', 'view.js', 'gitguard.js', 'db.js', 'netproxy.js'];
29
+ export const RUNTIME_FILES = ['main.js', 'daemon.js', 'view.js', 'gitguard.js', 'db.js', 'netproxy.js', 'agent.js'];
30
30
  /** The bundled sandbox runtime (dist/runtime: one self-contained file per entry point) and the sandbox/ scripts. */
31
31
  export function copyRuntime(packageRoot, launchPath) {
32
32
  const runtime = path.join(packageRoot, 'dist', 'runtime');
@@ -1,4 +1,4 @@
1
- import type { Config, ResolvedMapping } from '../../core/types.js';
1
+ import type { Config } from '../../core/types.js';
2
2
  export declare const GUEST: {
3
3
  readonly launch: "C:\\AgentLaunch";
4
4
  readonly data: "C:\\AgentData";
@@ -6,7 +6,31 @@ export declare const GUEST: {
6
6
  readonly mirror: "C:\\Mirror";
7
7
  };
8
8
  type SandboxSettings = Config['sandbox'];
9
- /** "auto": free RAM minus the reserve, but never more than maxMemoryMb or maxMemoryPercent of the PC's total RAM. */
10
- export declare function resolveMemoryMb(sandbox: SandboxSettings, freeMemoryBytes?: number, totalMemoryBytes?: number): number;
11
- export declare function buildWsb(config: Config, memoryMb: number, mappings: ResolvedMapping[]): string;
9
+ export type MemoryLimit = 'free' | 'share' | 'max' | 'commit';
10
+ export interface MemoryDecision {
11
+ readonly mb: number;
12
+ /** What set the size. */
13
+ readonly limitedBy: MemoryLimit;
14
+ /** What it would have been without looking at the commit (the old rule). */
15
+ readonly withoutCommitMb: number;
16
+ /** The inputs of the refusal, when mb is below the minimum. */
17
+ readonly freeMb: number;
18
+ readonly commitAvailableMb: number | null;
19
+ }
20
+ /**
21
+ * "auto" (pure): free RAM minus the reserve, never more than maxMemoryMb or maxMemoryPercent of the PC's total RAM,
22
+ * and, when the PC's available commit (RAM plus paging file, what the sandbox's memory is charged against) is known,
23
+ * never more than that minus the reserve either.
24
+ */
25
+ export declare function decideMemory(sandbox: SandboxSettings, freeMb: number, totalMb: number, commitAvailableMb: number | null): MemoryDecision;
26
+ /**
27
+ * The most memory everything the agents start may use together (pure): the sandbox's memory minus the headroom
28
+ * ("auto" =
29
+ * the larger of 2048 MB and 10 %), at least half of it so a tiny sandbox still works; null = no limit ("none").
30
+ */
31
+ export declare function agentMemoryLimitMb(memoryMb: number, headroom: SandboxSettings['agentMemoryHeadroomMb']): number | null;
32
+ /** A plain-words note when the commit made the sandbox's memory much smaller (2 GB or more) than free RAM allowed. */
33
+ export declare function memoryNote(decision: MemoryDecision): string | null;
34
+ /** "auto": see decideMemory. commitAvailableMb: from HostTools memory-status (omitted = not checked). */
35
+ export declare function resolveMemoryMb(sandbox: SandboxSettings, freeMemoryBytes?: number, totalMemoryBytes?: number, commitAvailableMb?: number | null): number;
12
36
  export {};
@@ -1,56 +1,75 @@
1
- // The .wsb file Windows Sandbox starts from: memory, devices and the folders mapped in.
1
+ // The guest's fixed folders, and how much memory the sandbox gets.
2
2
  import os from 'node:os';
3
- import { fail, xmlEscape } from '../../core/util/index.js';
4
- import { MIRROR_ROOT, sandboxFolder } from '../../shared/paths/index.js';
3
+ import { fail } from '../../core/util/index.js';
4
+ import { MIRROR_ROOT } from '../../shared/paths/index.js';
5
5
  export const GUEST = {
6
6
  launch: 'C:\\AgentLaunch',
7
7
  data: 'C:\\AgentData',
8
8
  hostTools: 'C:\\HostTools',
9
9
  mirror: MIRROR_ROOT,
10
10
  };
11
- /** The .wsb elements switched on or off by a sandbox setting, in the order Windows Sandbox expects them. */
12
- const DEVICES = [
13
- ['vGPU', 'vGpu'],
14
- ['Networking', 'networking'],
15
- ['ClipboardRedirection', 'clipboard'],
16
- ['AudioInput', 'audioInput'],
17
- ['VideoInput', 'videoInput'],
18
- ['PrinterRedirection', 'printerRedirection'],
19
- ['ProtectedClient', 'protectedClient'],
20
- ];
21
11
  const MB = 1048576;
22
12
  const MIN_AUTO_MEMORY_MB = 4096;
23
- function element(name, value) {
24
- return '<' + name + '>' + value + '</' + name + '>';
13
+ const roundDown = (mb) => Math.floor(mb / 1024) * 1024;
14
+ /**
15
+ * "auto" (pure): free RAM minus the reserve, never more than maxMemoryMb or maxMemoryPercent of the PC's total RAM,
16
+ * and, when the PC's available commit (RAM plus paging file, what the sandbox's memory is charged against) is known,
17
+ * never more than that minus the reserve either.
18
+ */
19
+ export function decideMemory(sandbox, freeMb, totalMb, commitAvailableMb) {
20
+ const shareMb = Math.floor((totalMb * sandbox.maxMemoryPercent) / 100);
21
+ const byFree = freeMb - sandbox.reserveHostMb;
22
+ const byCommit = commitAvailableMb === null ? Infinity : commitAvailableMb - sandbox.reserveHostMb;
23
+ const candidates = [
24
+ ['max', sandbox.maxMemoryMb],
25
+ ['share', shareMb],
26
+ ['free', byFree],
27
+ ['commit', byCommit],
28
+ ];
29
+ const lowest = candidates.reduce((a, b) => (b[1] < a[1] ? b : a));
30
+ const withoutCommit = roundDown(Math.min(sandbox.maxMemoryMb, shareMb, byFree));
31
+ return { mb: roundDown(lowest[1]), limitedBy: lowest[0], withoutCommitMb: withoutCommit, freeMb, commitAvailableMb };
25
32
  }
26
- function toggle(value) {
27
- return value ? 'Enable' : 'Disable';
33
+ /**
34
+ * The most memory everything the agents start may use together (pure): the sandbox's memory minus the headroom
35
+ * ("auto" =
36
+ * the larger of 2048 MB and 10 %), at least half of it so a tiny sandbox still works; null = no limit ("none").
37
+ */
38
+ export function agentMemoryLimitMb(memoryMb, headroom) {
39
+ if (headroom === 'none')
40
+ return null;
41
+ const keep = headroom === 'auto' ? Math.max(2048, Math.floor(memoryMb / 10)) : headroom;
42
+ return Math.max(Math.floor(memoryMb / 2), memoryMb - keep);
28
43
  }
29
- /** "auto": free RAM minus the reserve, but never more than maxMemoryMb or maxMemoryPercent of the PC's total RAM. */
30
- export function resolveMemoryMb(sandbox, freeMemoryBytes = os.freemem(), totalMemoryBytes = os.totalmem()) {
44
+ /** A plain-words note when the commit made the sandbox's memory much smaller (2 GB or more) than free RAM allowed. */
45
+ export function memoryNote(decision) {
46
+ if (decision.limitedBy !== 'commit' || decision.withoutCommitMb - decision.mb < 2048)
47
+ return null;
48
+ return ('The sandbox gets ' +
49
+ decision.mb / 1024 +
50
+ ' GB of memory instead of ' +
51
+ decision.withoutCommitMb / 1024 +
52
+ ' GB: this PC has only ' +
53
+ Math.floor((decision.commitAvailableMb ?? 0) / 1024) +
54
+ ' GB of memory (RAM plus paging file) left to hand out, and if it runs out Windows closes the sandbox. ' +
55
+ 'A bigger Windows paging file, or closing other programs, gives it more.');
56
+ }
57
+ /** "auto": see decideMemory. commitAvailableMb: from HostTools memory-status (omitted = not checked). */
58
+ export function resolveMemoryMb(sandbox, freeMemoryBytes = os.freemem(), totalMemoryBytes = os.totalmem(), commitAvailableMb = null) {
31
59
  if (sandbox.memoryMb !== 'auto')
32
60
  return sandbox.memoryMb;
33
- const freeMb = Math.floor(freeMemoryBytes / MB);
34
- const shareMb = Math.floor(((totalMemoryBytes / MB) * sandbox.maxMemoryPercent) / 100);
35
- const rounded = Math.floor(Math.min(sandbox.maxMemoryMb, shareMb, freeMb - sandbox.reserveHostMb) / 1024) * 1024;
36
- if (rounded < MIN_AUTO_MEMORY_MB)
37
- fail('Not enough free RAM for the sandbox (' +
38
- freeMb +
39
- ' MB free, ' +
40
- sandbox.reserveHostMb +
41
- ' MB kept for this PC).', 'Close some apps, lower sandbox.reserveHostMb, or set sandbox.memoryMb to a fixed value (>= 4096).');
42
- return rounded;
43
- }
44
- export function buildWsb(config, memoryMb, mappings) {
45
- const s = config.sandbox;
46
- // Guest paths on other drive letters (F:\x) really live under C:\Mirror\F; bootstrap.ps1 substs F: onto it at boot.
47
- const folders = mappings
48
- .map((m) => element('MappedFolder', element('HostFolder', xmlEscape(m.host)) +
49
- element('SandboxFolder', xmlEscape(sandboxFolder(m.guest))) +
50
- element('ReadOnly', String(m.readOnly))))
51
- .join('');
52
- return element('Configuration', element('MemoryInMB', String(memoryMb)) +
53
- DEVICES.map(([name, setting]) => element(name, toggle(s[setting]))).join('') +
54
- element('MappedFolders', folders) +
55
- element('LogonCommand', element('Command', xmlEscape(GUEST.launch + '\\sandbox\\boot\\logon.cmd'))));
61
+ const decision = decideMemory(sandbox, Math.floor(freeMemoryBytes / MB), Math.floor(totalMemoryBytes / MB), commitAvailableMb);
62
+ if (decision.mb < MIN_AUTO_MEMORY_MB)
63
+ fail(decision.limitedBy === 'commit'
64
+ ? 'Not enough memory left on this PC for the sandbox (' +
65
+ decision.commitAvailableMb +
66
+ ' MB of RAM plus paging file left, ' +
67
+ sandbox.reserveHostMb +
68
+ ' MB kept for this PC).'
69
+ : 'Not enough free RAM for the sandbox (' +
70
+ decision.freeMb +
71
+ ' MB free, ' +
72
+ sandbox.reserveHostMb +
73
+ ' MB kept for this PC).', 'Close some apps, enlarge the Windows paging file, lower sandbox.reserveHostMb, or set sandbox.memoryMb to a fixed value (>= 4096).');
74
+ return decision.mb;
56
75
  }
@@ -1,9 +1,35 @@
1
1
  import { type StopCause, type StopEvent } from './stop-events.js';
2
+ /** A crash dump Windows left (name and time only; never read). */
3
+ export interface DumpFile {
4
+ readonly name: string;
5
+ readonly at: string;
6
+ }
7
+ /** Extra evidence for the report (all optional): this PC's own memory log lines and the dumps found. */
8
+ export interface CrashExtra {
9
+ readonly hostMemoryLog?: string;
10
+ readonly dumps?: readonly DumpFile[];
11
+ readonly hostMemoryNow?: string;
12
+ /** The frozen sandbox's launch had vGPU on (read from its .wsb). */
13
+ readonly vgpu?: boolean;
14
+ }
15
+ /** "This PC stopped responding at X and was restarted at Y (n minutes later)", or null when there was no long gap. */
16
+ export declare function freezeLine(cause: StopCause, lastSeen: string): string | null;
17
+ /** What each kind of event usually means, one line per kind that appears (pure). */
18
+ export declare function findingLines(events: readonly StopEvent[]): string[];
19
+ /** Crash dumps in these folders newer than `since`: names and times only. */
20
+ export declare function findDumps(dirs: readonly string[], since: Date): DumpFile[];
21
+ /** Whether the newest launch started at or before `lastSeen` had vGPU on (host-only .wsb in <storage>\launches). */
22
+ export declare function launchHadVgpu(storageRoot: string, lastSeen: string): boolean;
2
23
  /**
3
24
  * The report text (pure): what happened (the sandbox's or this PC's stop code, where the dump is) and the memory log's
4
25
  * last lines. `memoryLog` is the sandbox's own file, so it is shown through safeText.
5
26
  */
6
- export declare function crashReportText(cause: StopCause, events: readonly StopEvent[], memoryLog: string, lastSeen: string): string;
27
+ export declare function crashReportText(cause: StopCause, events: readonly StopEvent[], memoryLog: string, lastSeen: string, extra?: CrashExtra): string;
28
+ /** The newest crash report in <storage>\logs\crashes (at most 64 KB of it), or null. */
29
+ export declare function newestCrashReport(storageRoot: string): {
30
+ file: string;
31
+ text: string;
32
+ } | null;
7
33
  /**
8
34
  * When the sandbox ended in a crash (its own, this PC's, power, low memory): writes the report and returns its path.
9
35
  */
@@ -3,19 +3,137 @@
3
3
  import fs from 'node:fs';
4
4
  import path from 'node:path';
5
5
  import { assertNoLinks, safeText } from '../../core/util/index.js';
6
- import { explainStop, readStopEvents } from './stop-events.js';
6
+ import { vgpuWarning } from '../launch/risk-notes.js';
7
+ import { hostMemoryLine, readHostMemory } from './host-memory.js';
8
+ import { hostDataFolder, hostDataRoot } from '../storage/index.js';
9
+ import { bugcheckCode, explainStop, readStopEvents } from './stop-events.js';
7
10
  const KEEP_REPORTS = 20;
8
11
  const MEMORY_TAIL_BYTES = 16 * 1024;
12
+ /** A gap longer than this between "last seen running" and the restart means the PC stopped responding first. */
13
+ const FREEZE_GAP_MS = 5 * 60 * 1000;
9
14
  function crashDir(storageRoot) {
10
15
  return path.join(storageRoot, 'logs', 'crashes');
11
16
  }
17
+ /** "This PC stopped responding at X and was restarted at Y (n minutes later)", or null when there was no long gap. */
18
+ export function freezeLine(cause, lastSeen) {
19
+ if (cause.kind !== 'crash')
20
+ return null;
21
+ const gap = Date.parse(cause.at) - Date.parse(lastSeen);
22
+ if (!Number.isFinite(gap) || gap <= FREEZE_GAP_MS)
23
+ return null;
24
+ return ('This PC stopped responding at ' +
25
+ lastSeen +
26
+ ' (the last time anything was seen running) and was restarted at ' +
27
+ cause.at +
28
+ ' (' +
29
+ Math.round(gap / 60000) +
30
+ ' minutes later).');
31
+ }
32
+ /** What each kind of event usually means, one line per kind that appears (pure). */
33
+ export function findingLines(events) {
34
+ const lines = [];
35
+ const has = (pred) => events.find(pred);
36
+ const lower = (e) => e.provider.toLowerCase();
37
+ const resource = has((e) => e.id === 2004 && lower(e).includes('resource-exhaustion'));
38
+ if (resource)
39
+ lines.push('Resource-Exhaustion-Detector 2004: memory ran out (RAM plus paging file). Programs were using too much at once.');
40
+ const bug = has((e) => e.id === 1001 && lower(e).includes('systemerrorreporting'));
41
+ const bugCode = bug ? /bugcheck was:\s*(0x[0-9a-f]{1,8})/i.exec(bug.process)?.[1] : undefined;
42
+ const power = has((e) => e.id === 41 && lower(e).includes('kernel-power'));
43
+ const powerCode = power ? bugcheckCode(power.process) : null;
44
+ if (bug || powerCode)
45
+ lines.push('Blue screen with stop code ' +
46
+ (bugCode ?? powerCode) +
47
+ ': search that code on Microsoft Learn; drivers, memory or hardware are the usual causes.');
48
+ else if (power)
49
+ lines.push('Kernel-Power 41 without a stop code: the PC froze, lost power or was reset by hand, with no blue screen.');
50
+ if (has((e) => lower(e).includes('whea-logger')))
51
+ lines.push('WHEA-Logger: Windows reported a hardware error (CPU, memory, a bus or a disk): heat or failing hardware.');
52
+ if (has((e) => lower(e).startsWith('hyper-v')))
53
+ lines.push("Hyper-V events: the sandbox's virtual machine (or the service that runs it) reported a problem.");
54
+ if (has((e) => /^(application error|windows error reporting)$/i.test(e.provider)))
55
+ lines.push("A crash report names vmwp.exe or vmmem, the programs that hold the sandbox's VM.");
56
+ return lines;
57
+ }
58
+ /** Crash dumps in these folders newer than `since`: names and times only. */
59
+ export function findDumps(dirs, since) {
60
+ const found = [];
61
+ for (const dir of dirs) {
62
+ try {
63
+ for (const name of fs.readdirSync(dir)) {
64
+ if (!/\.dmp$/i.test(name))
65
+ continue;
66
+ const stat = fs.lstatSync(path.join(dir, name));
67
+ if (stat.isFile() && stat.mtime >= since)
68
+ found.push({ name: path.join(dir, name), at: stat.mtime.toISOString() });
69
+ }
70
+ }
71
+ catch {
72
+ // No such folder, or no access: no dumps to list.
73
+ }
74
+ }
75
+ return found.sort((a, b) => a.at.localeCompare(b.at)).slice(0, 10);
76
+ }
77
+ /** Whether the newest launch started at or before `lastSeen` had vGPU on (host-only .wsb in <storage>\launches). */
78
+ export function launchHadVgpu(storageRoot, lastSeen) {
79
+ try {
80
+ const root = path.join(storageRoot, 'launches');
81
+ const limit = Date.parse(lastSeen) + 60 * 1000;
82
+ const newest = fs
83
+ .readdirSync(root)
84
+ .map((name) => ({ name, at: fs.lstatSync(path.join(root, name)).mtimeMs }))
85
+ .filter((l) => l.at <= limit)
86
+ .sort((a, b) => b.at - a.at)[0];
87
+ if (!newest)
88
+ return false;
89
+ const dir = path.join(root, newest.name);
90
+ const wsb = fs.readdirSync(dir).find((f) => f.endsWith('.wsb'));
91
+ return wsb
92
+ ? /<VGpu>\s*Enable\s*<\/VGpu>/i.test(fs.readFileSync(path.join(dir, wsb), 'utf8').slice(0, 65536))
93
+ : false;
94
+ }
95
+ catch {
96
+ // No launch folder to read: unknown, so nothing is claimed.
97
+ return false;
98
+ }
99
+ }
100
+ /** A tail of this PC's own memory log (written by the watcher), without following links. */
101
+ function hostMemoryTail(storageRoot, dataPath) {
102
+ try {
103
+ const file = path.join(storageRoot, 'logs', 'host-memory-' + path.basename(dataPath) + '.log');
104
+ const stat = fs.lstatSync(file);
105
+ if (!stat.isFile())
106
+ return '';
107
+ const length = Math.min(stat.size, MEMORY_TAIL_BYTES);
108
+ const fd = fs.openSync(file, 'r');
109
+ try {
110
+ const buffer = Buffer.alloc(length);
111
+ fs.readSync(fd, buffer, 0, length, stat.size - length);
112
+ return buffer.toString('utf8');
113
+ }
114
+ finally {
115
+ fs.closeSync(fd);
116
+ }
117
+ }
118
+ catch {
119
+ return '';
120
+ }
121
+ }
12
122
  /**
13
123
  * The report text (pure): what happened (the sandbox's or this PC's stop code, where the dump is) and the memory log's
14
124
  * last lines. `memoryLog` is the sandbox's own file, so it is shown through safeText.
15
125
  */
16
- export function crashReportText(cause, events, memoryLog, lastSeen) {
17
- const eventLines = events.length
18
- ? events.map((e) => ' ' + e.at + ' ' + e.provider + ' ' + e.id + (e.process ? ': ' + e.process.replace(/\s+/g, ' ') : ''))
126
+ export function crashReportText(cause, events, memoryLog, lastSeen, extra = {}) {
127
+ const seen = new Set();
128
+ const unique = events.filter((e) => {
129
+ const key = e.at + '|' + e.id + '|' + e.provider;
130
+ if (seen.has(key))
131
+ return false;
132
+ seen.add(key);
133
+ return true;
134
+ });
135
+ const eventLines = unique.length
136
+ ? unique.map((e) => ' ' + e.at + ' ' + e.provider + ' ' + e.id + (e.process ? ': ' + e.process.replace(/\s+/g, ' ') : ''))
19
137
  : [' (none)'];
20
138
  const memoryLines = memoryLog
21
139
  ? memoryLog
@@ -24,23 +142,63 @@ export function crashReportText(cause, events, memoryLog, lastSeen) {
24
142
  .slice(-30)
25
143
  .map((l) => ' ' + safeText(l))
26
144
  : [' (none found)'];
145
+ const hostLines = (extra.hostMemoryLog ?? '')
146
+ .split(/\r?\n/)
147
+ .filter(Boolean)
148
+ .slice(-20)
149
+ .map((l) => ' ' + safeText(l));
150
+ const freeze = freezeLine(cause, lastSeen);
151
+ const meaning = findingLines(unique);
152
+ const dumps = extra.dumps ?? [];
153
+ const vgpu = extra.vgpu ? ['vGPU was on for this sandbox. ' + vgpuWarning('its launch settings'), ''] : [];
27
154
  return [
28
155
  'Sandbox crash report, written ' + new Date().toISOString(),
29
156
  'What happened: ' + cause.text + ' at ' + cause.at + ' (the sandbox was last seen running at ' + lastSeen + ').',
157
+ ...(freeze ? [freeze] : []),
30
158
  '',
31
159
  'Windows events around then:',
32
160
  ...eventLines,
33
161
  '',
162
+ ...vgpu,
163
+ 'What that usually means:',
164
+ ...(meaning.length ? meaning.map((l) => ' ' + l) : [' (no memory, blue screen or hardware event was logged)']),
165
+ '',
166
+ 'Crash dumps Windows left (C:\\Windows\\Minidump, MEMORY.DMP):',
167
+ ...(dumps.length ? dumps.map((d) => ' ' + d.name + ' ' + d.at) : [' (none from that time)']),
168
+ '',
169
+ "This PC's memory while the sandbox ran (host-memory log):",
170
+ ...(hostLines.length ? hostLines : [' (none: the background sync was not running)']),
171
+ ...(extra.hostMemoryNow ? [' after the restart: ' + extra.hostMemoryNow] : []),
172
+ '',
34
173
  "The sandbox's memory log, last lines (C:\\AgentData\\logs\\memory-*.log inside it):",
35
174
  ...memoryLines,
36
175
  '',
37
176
  ].join('\n');
38
177
  }
178
+ /** The newest crash report in <storage>\logs\crashes (at most 64 KB of it), or null. */
179
+ export function newestCrashReport(storageRoot) {
180
+ try {
181
+ const dir = crashDir(storageRoot);
182
+ const newest = fs
183
+ .readdirSync(dir)
184
+ .filter((f) => /^crash-.*\.txt$/.test(f))
185
+ .sort()
186
+ .pop();
187
+ if (!newest)
188
+ return null;
189
+ const file = path.join(dir, newest);
190
+ return { file, text: safeText(fs.readFileSync(file, 'utf8').slice(0, 64 * 1024)) };
191
+ }
192
+ catch {
193
+ // No reports folder: none yet.
194
+ return null;
195
+ }
196
+ }
39
197
  /** The newest memory log the sandbox wrote, last 16 KB at most, without following links in the data folder. */
40
198
  function memoryLogTail(dataPath) {
41
199
  try {
42
- const logs = path.join(dataPath, 'logs');
43
- assertNoLinks(dataPath, logs);
200
+ const logs = hostDataFolder(dataPath, 'logs');
201
+ assertNoLinks(hostDataRoot(dataPath), logs);
44
202
  const newest = fs
45
203
  .readdirSync(logs)
46
204
  .filter((f) => /^memory-\d{8}-\d{6}\.log$/.test(f))
@@ -78,7 +236,15 @@ export function saveCrashReport(storageRoot, dataPath, lastSeen) {
78
236
  const dir = crashDir(storageRoot);
79
237
  fs.mkdirSync(dir, { recursive: true });
80
238
  const file = path.join(dir, 'crash-' + cause.at.replace(/[:.]/g, '-') + '.txt');
81
- fs.writeFileSync(file, crashReportText(cause, events, memoryLogTail(dataPath), lastSeen));
239
+ const since = new Date(Date.parse(lastSeen) - 10 * 60 * 1000);
240
+ const windir = process.env.SystemRoot ?? 'C:\\Windows';
241
+ const memoryNow = readHostMemory(storageRoot);
242
+ fs.writeFileSync(file, crashReportText(cause, events, memoryLogTail(dataPath), lastSeen, {
243
+ hostMemoryLog: hostMemoryTail(storageRoot, dataPath),
244
+ vgpu: launchHadVgpu(storageRoot, lastSeen),
245
+ dumps: findDumps([path.join(windir, 'Minidump'), windir], since),
246
+ ...(memoryNow ? { hostMemoryNow: hostMemoryLine(memoryNow) } : {}),
247
+ }));
82
248
  for (const old of fs
83
249
  .readdirSync(dir)
84
250
  .filter((f) => f.startsWith('crash-'))
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+ export declare const HostMemorySchema: z.ZodObject<{
3
+ totalMb: z.ZodNumber;
4
+ availableMb: z.ZodNumber;
5
+ commitLimitMb: z.ZodNumber;
6
+ commitAvailableMb: z.ZodNumber;
7
+ pageFile: z.ZodCatch<z.ZodEnum<{
8
+ auto: "auto";
9
+ none: "none";
10
+ fixed: "fixed";
11
+ }>>;
12
+ pageFileMaxMb: z.ZodCatch<z.ZodNumber>;
13
+ }, z.core.$strip>;
14
+ export type HostMemory = z.output<typeof HostMemorySchema>;
15
+ /** The parsed answer of memory-status, or null (not Windows, unreadable, nonsense). */
16
+ export declare function parseHostMemory(text: string): HostMemory | null;
17
+ /** This PC's memory now, or null when it cannot be read (and always during the self-test: it never asks Windows). */
18
+ export declare function readHostMemory(storageRoot: string): HostMemory | null;
19
+ /** The same without blocking: for the watcher, which must never wait on it. */
20
+ export declare function readHostMemoryAsync(storageRoot: string): Promise<HostMemory | null>;
21
+ /** How low this PC's memory is: what the host watchdog acts on (pure). */
22
+ export interface HostPressure {
23
+ readonly low: boolean;
24
+ /** Plain words for the log and the sandbox. */
25
+ readonly reason: string;
26
+ }
27
+ /** Low = available commit under half the reserve, or available RAM under 2 GB. */
28
+ export declare function hostPressure(memory: HostMemory, reserveHostMb: number): HostPressure;
29
+ /** One line for the host memory log. */
30
+ export declare function hostMemoryLine(memory: HostMemory, at?: Date): string;
31
+ /**
32
+ * Whether Windows Sandbox could push this PC past its commit limit (pure): the paging file is fixed or off and the
33
+ * commit limit leaves less than the sandbox's memory plus what this PC already uses. Null when all is well.
34
+ */
35
+ export declare function pageFileRisk(memory: HostMemory, sandboxMb: number): {
36
+ neededGb: number;
37
+ text: string;
38
+ } | null;
39
+ /** Whether the page file hint may be shown now (once a day at most); records that it was. */
40
+ export declare function takePageFileHint(storageRoot: string, now?: Date): boolean;
@@ -0,0 +1,137 @@
1
+ // This PC's memory (RAM and commit) for sizing the sandbox, the host watchdog and the doctor. HostTools.exe
2
+ // memory-status reads it (built in <storage>\bin), else native\scripts\memory-status.ps1. Windows Sandbox takes its
3
+ // memory from this PC as it goes (the setting is a ceiling, not a reservation), so what decides "slow or closed" is the
4
+ // PC's commit limit (RAM plus paging files), not only free RAM.
5
+ import { spawn, spawnSync } from 'node:child_process';
6
+ import fs from 'node:fs';
7
+ import path from 'node:path';
8
+ import { z } from 'zod';
9
+ import { isWin } from '../../core/util/index.js';
10
+ import { SYSTEM } from '../../shared/system.js';
11
+ import { hostToolsExe, nativeScript } from '../native.js';
12
+ import { selfTestRunning } from '../test-guard.js';
13
+ export const HostMemorySchema = z.object({
14
+ totalMb: z.number().int().nonnegative(),
15
+ availableMb: z.number().int().nonnegative(),
16
+ commitLimitMb: z.number().int().nonnegative(),
17
+ commitAvailableMb: z.number().int().nonnegative(),
18
+ /** How the paging file is set up: Windows manages it, a fixed size, or none. */
19
+ pageFile: z.enum(['auto', 'fixed', 'none']).catch('auto'),
20
+ /** Fixed: the total of its maximum sizes (MB). */
21
+ pageFileMaxMb: z.number().int().nonnegative().catch(0),
22
+ });
23
+ const TIMEOUT_MS = 20000;
24
+ /** The parsed answer of memory-status, or null (not Windows, unreadable, nonsense). */
25
+ export function parseHostMemory(text) {
26
+ try {
27
+ const parsed = HostMemorySchema.safeParse(JSON.parse(text));
28
+ return parsed.success && parsed.data.totalMb > 0 ? parsed.data : null;
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ function command(storageRoot) {
35
+ const tools = hostToolsExe(storageRoot);
36
+ return tools
37
+ ? { file: tools, args: ['memory-status'] }
38
+ : { file: SYSTEM.powershell(), args: nativeScript('memory-status.ps1') };
39
+ }
40
+ /** This PC's memory now, or null when it cannot be read (and always during the self-test: it never asks Windows). */
41
+ export function readHostMemory(storageRoot) {
42
+ if (!isWin || selfTestRunning())
43
+ return null;
44
+ const { file, args } = command(storageRoot);
45
+ const result = spawnSync(file, args, { encoding: 'utf8', windowsHide: true, timeout: TIMEOUT_MS });
46
+ return parseHostMemory(result.stdout || '');
47
+ }
48
+ /** The same without blocking: for the watcher, which must never wait on it. */
49
+ export function readHostMemoryAsync(storageRoot) {
50
+ if (!isWin || selfTestRunning())
51
+ return Promise.resolve(null);
52
+ return new Promise((resolve) => {
53
+ try {
54
+ const { file, args } = command(storageRoot);
55
+ const child = spawn(file, args, { windowsHide: true, stdio: ['ignore', 'pipe', 'ignore'] });
56
+ let out = '';
57
+ child.stdout.on('data', (d) => (out += d.toString('utf8').slice(0, 4096)));
58
+ const timer = setTimeout(() => child.kill(), TIMEOUT_MS);
59
+ child.on('error', () => resolve(null));
60
+ child.on('close', () => {
61
+ clearTimeout(timer);
62
+ resolve(parseHostMemory(out));
63
+ });
64
+ }
65
+ catch {
66
+ // Could not even start it: no answer this time.
67
+ resolve(null);
68
+ }
69
+ });
70
+ }
71
+ /** Low = available commit under half the reserve, or available RAM under 2 GB. */
72
+ export function hostPressure(memory, reserveHostMb) {
73
+ if (memory.commitAvailableMb < reserveHostMb / 2)
74
+ return {
75
+ low: true,
76
+ reason: 'this PC has only ' + memory.commitAvailableMb + ' MB of memory (RAM plus paging file) left to hand out',
77
+ };
78
+ if (memory.availableMb < 2048)
79
+ return { low: true, reason: 'this PC has only ' + memory.availableMb + ' MB of free RAM left' };
80
+ return { low: false, reason: '' };
81
+ }
82
+ /** One line for the host memory log. */
83
+ export function hostMemoryLine(memory, at = new Date()) {
84
+ return (at.toISOString() +
85
+ ' | RAM free/total MB ' +
86
+ memory.availableMb +
87
+ '/' +
88
+ memory.totalMb +
89
+ ' | commit free/limit MB ' +
90
+ memory.commitAvailableMb +
91
+ '/' +
92
+ memory.commitLimitMb +
93
+ ' | page file ' +
94
+ memory.pageFile);
95
+ }
96
+ /**
97
+ * Whether Windows Sandbox could push this PC past its commit limit (pure): the paging file is fixed or off and the
98
+ * commit limit leaves less than the sandbox's memory plus what this PC already uses. Null when all is well.
99
+ */
100
+ export function pageFileRisk(memory, sandboxMb) {
101
+ if (memory.pageFile === 'auto')
102
+ return null;
103
+ const inUseMb = memory.commitLimitMb - memory.commitAvailableMb;
104
+ const neededMb = inUseMb + sandboxMb;
105
+ if (memory.commitLimitMb >= neededMb)
106
+ return null;
107
+ // The commit limit is RAM plus the paging files: the paging file has to make up the difference.
108
+ const neededGb = Math.max(1, Math.ceil((neededMb - memory.totalMb) / 1024));
109
+ return {
110
+ neededGb,
111
+ text: 'Windows Sandbox takes its memory from this PC as it goes; if this PC runs out, Windows closes the sandbox instead of slowing it down. ' +
112
+ 'Let Windows manage the page file size (System > Advanced system settings > Performance > Settings > Advanced > Virtual memory: "Automatically manage paging file size"), or make the page file at least ' +
113
+ neededGb +
114
+ ' GB.',
115
+ };
116
+ }
117
+ const HINT_EVERY_MS = 24 * 60 * 60 * 1000;
118
+ /** Whether the page file hint may be shown now (once a day at most); records that it was. */
119
+ export function takePageFileHint(storageRoot, now = new Date()) {
120
+ const file = path.join(storageRoot, 'run', 'pagefile-hint.txt');
121
+ try {
122
+ const last = Number(fs.readFileSync(file, 'utf8'));
123
+ if (Number.isFinite(last) && now.getTime() - last < HINT_EVERY_MS)
124
+ return false;
125
+ }
126
+ catch {
127
+ // Never shown: show it.
128
+ }
129
+ try {
130
+ fs.mkdirSync(path.dirname(file), { recursive: true });
131
+ fs.writeFileSync(file, String(now.getTime()));
132
+ }
133
+ catch {
134
+ // Cannot record it: showing it again next time is fine.
135
+ }
136
+ return true;
137
+ }
@@ -5,3 +5,5 @@ export * from './keep-awake.js';
5
5
  export * from './windows-update.js';
6
6
  export * from './crash-report.js';
7
7
  export * from './session-ledger.js';
8
+ export * from './host-memory.js';
9
+ export * from './watchdog.js';
@@ -5,3 +5,5 @@ export * from './keep-awake.js';
5
5
  export * from './windows-update.js';
6
6
  export * from './crash-report.js';
7
7
  export * from './session-ledger.js';
8
+ export * from './host-memory.js';
9
+ export * from './watchdog.js';
@@ -12,6 +12,8 @@ export interface StopCause {
12
12
  at: string;
13
13
  text: string;
14
14
  }
15
+ /** The stop code in Kernel-Power 41's detail ("BugcheckCode 209" -> "0xD1"); null for 0 (no blue screen). */
16
+ export declare function bugcheckCode(detail: string): string | null;
15
17
  /**
16
18
  * The first event that ends a running sandbox (pure): Windows inside the sandbox crashing (Hyper-V 18590; `process`
17
19
  * holds its message with the stop code), a restart or shutdown, a crash or power loss, sleep, low memory. Switching