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
@@ -5,6 +5,9 @@ import { spawn } from 'node:child_process';
5
5
  import { writeGuides } from './guide.js';
6
6
  import { setupToolchains } from '../toolchains/index.js';
7
7
  import { agents } from '../agents/agent-installer.js';
8
+ import { agentShims, sbxAgentText, shimText } from '../agents/agent-files.js';
9
+ import { resetMachineBound, restoreLocalState } from '../agents/local-state.js';
10
+ import { installShellPath } from '../setup/shell-path.js';
8
11
  import { linkProfileDirs } from '../agents/profile-links.js';
9
12
  import { restoreClaudeMem } from '../setup/claude-mem.js';
10
13
  import { syncClaudeProfile } from '../setup/claude-profile.js';
@@ -20,6 +23,7 @@ import { pruneToolLeftovers } from '../toolchains/leftovers.js';
20
23
  import { wanted } from '../toolchains/detect.js';
21
24
  import { configureVscode } from '../toolchains/tools/vscode.js';
22
25
  import { enableProcessAudit } from '../audit/process-audit.js';
26
+ import { setupVpn } from '../vpn/index.js';
23
27
  import { now } from '../../shared/channel/run-dir.js';
24
28
  import { writeJsonAtomic } from '../../shared/io/json.js';
25
29
  import { viewSession } from '../sessions/viewer.js';
@@ -29,9 +33,10 @@ import { dryRun, isWin, localDir, logsDir, run, toolsDir } from '../runtime/path
29
33
  import { log, logPath, warn } from '../runtime/log.js';
30
34
  import { mkdirp } from '../runtime/fs.js';
31
35
  import { session, workspace } from '../runtime/session.js';
36
+ import { applyBootEnvironment, BOOT_SECRETS_VARIABLE, takeSecrets } from '../runtime/secrets.js';
32
37
  import { setSandboxStatus } from '../runtime/status.js';
33
38
  import { errMsg } from '../../core/util/errors.js';
34
- const STEPS = 8;
39
+ const STEPS = 9;
35
40
  const PRIMARY_POLLS = 600;
36
41
  const POLL_MS = 500;
37
42
  const VSCODE_LANGUAGES = ['python', 'java', 'go', 'rust', 'cpp', 'msvc', 'dotnet', 'ruby', 'php', 'deno', 'pwsh'];
@@ -56,12 +61,19 @@ async function soft(what, work) {
56
61
  warn(what + ' failed (continuing): ' + errMsg(e));
57
62
  }
58
63
  }
59
- function startDaemon(env) {
64
+ function startDaemon(env, secrets) {
60
65
  spawn(process.execPath, [path.join(path.dirname(process.argv[1]), 'daemon.js')], {
61
66
  detached: true,
62
67
  stdio: 'ignore',
63
68
  windowsHide: true,
64
- env: { ...env, AGENT_LOG_PREFIX: 'daemon' },
69
+ env: {
70
+ ...env,
71
+ AGENT_LOG_PREFIX: 'daemon',
72
+ // The agent's environment (it may hold API keys): the daemon moves it into memory and removes this at once.
73
+ ...(secrets.harnessEnvironment
74
+ ? { [BOOT_SECRETS_VARIABLE]: JSON.stringify({ harnessEnvironment: secrets.harnessEnvironment }) }
75
+ : {}),
76
+ },
65
77
  }).unref();
66
78
  }
67
79
  /**
@@ -72,8 +84,19 @@ function writeDbCommand() {
72
84
  const dir = mkdirp(path.join(localDir, 'bin'));
73
85
  const db = path.join(path.dirname(process.argv[1]), 'db.js');
74
86
  fs.writeFileSync(path.join(dir, 'sbx-db.cmd'), '@setlocal\r\n@set AGENT_LOG_PREFIX=db\r\n@"' + process.execPath + '" "' + db + '" %*\r\n');
87
+ writeAgentCommands(dir);
75
88
  return dir;
76
89
  }
90
+ /**
91
+ * `claude`, `codex` ... by name in every terminal tab, installed yet or not (the command installs the agent on first
92
+ * use), and `sbx-agent`. Written to the sandbox's disk each boot, next to `sbx-db`.
93
+ */
94
+ function writeAgentCommands(dir) {
95
+ const install = { node: process.execPath, script: path.join(path.dirname(process.argv[1]), 'agent.js') };
96
+ for (const shim of agentShims(toolsDir, session.agents ?? {}))
97
+ fs.writeFileSync(path.join(dir, shim.command + '.cmd'), shimText(shim, install));
98
+ fs.writeFileSync(path.join(dir, 'sbx-agent.cmd'), sbxAgentText(install));
99
+ }
77
100
  async function waitForPrimary() {
78
101
  for (let i = 0; i < PRIMARY_POLLS; i++) {
79
102
  const s = run.readSession(session.launchId);
@@ -97,6 +120,8 @@ export class Boot {
97
120
  ptyHost = null;
98
121
  lan = session.networking ? 'open' : 'offline';
99
122
  gitAccess = session.provisioning.git.access ?? 'full';
123
+ /** What the host handed over in its one-shot file (read and deleted at the start of run()). */
124
+ secrets = {};
100
125
  async run() {
101
126
  log('Agent sandbox: ' +
102
127
  session.project +
@@ -110,9 +135,12 @@ export class Boot {
110
135
  throw new Error('Workspace folder is missing in the sandbox: ' + workspace);
111
136
  mkdirp(toolsDir);
112
137
  mkdirp(run.root);
138
+ this.secrets = takeSecrets(session.launchId);
139
+ applyBootEnvironment(this.secrets.harnessEnvironment);
113
140
  await this.networkAndSessionHost();
114
141
  await this.hooksAndDesktop();
115
142
  const { tools, env } = await this.developerTools();
143
+ await this.vpn();
116
144
  await this.gitIdentity(env);
117
145
  await this.claude(tools);
118
146
  await this.agent(env);
@@ -165,6 +193,7 @@ export class Boot {
165
193
  }));
166
194
  const env = agentEnv(tools);
167
195
  persistEnvironment(env, Object.keys(tools.vars));
196
+ await soft('Shell start-up PATH', installShellPath);
168
197
  saveBootEnv({
169
198
  basePath,
170
199
  toolVars: Object.keys(tools.vars),
@@ -178,36 +207,47 @@ export class Boot {
178
207
  await soft('Cleaning old tool builds', () => pruneToolLeftovers());
179
208
  return { tools, env };
180
209
  }
210
+ /** vpn.enabled: the tunnel and its kill switch, before anything else uses the network (git, the agent). */
211
+ async vpn() {
212
+ step(4, session.vpn ? 'VPN (' + session.vpn.server + ')' : 'VPN (off)');
213
+ if (!session.vpn)
214
+ return;
215
+ await soft('VPN', async () => {
216
+ await setupVpn(this.secrets, this.ptyHost);
217
+ });
218
+ }
181
219
  async gitIdentity(env) {
182
- step(4, 'Git identity');
220
+ step(5, 'Git identity');
183
221
  await soft('Git config', () => setupGitConfig(env));
184
222
  }
185
223
  async claude(tools) {
186
- step(5, 'Claude settings, history and claude-mem');
224
+ step(6, 'Claude settings, history and claude-mem');
187
225
  if (session.harnessName === 'claude')
188
- await soft('Claude settings', syncClaudeProfile);
226
+ await soft('Claude settings', () => syncClaudeProfile(this.secrets.claudeCredentials));
189
227
  await soft('claude-mem restore', restoreClaudeMem);
228
+ await soft('Agent files of the last sandbox', resetMachineBound);
229
+ await soft('Agent databases restore', restoreLocalState);
190
230
  await soft('Sandbox guide for the agent', () => writeGuides(tools.summary, this.lan));
191
231
  await soft('Claude managed settings', () => writeManagedSettings(this.gitAccess));
192
232
  }
193
233
  async agent(env) {
194
- step(6, 'Agent: ' + session.harnessName);
234
+ step(7, 'Agent: ' + session.harnessName);
195
235
  linkProfileDirs(session.agentProfileDirs ?? {});
196
236
  if (session.harness)
197
237
  await agents.provision(session.harnessName, session.harness, env);
198
238
  }
199
239
  preAgentHooks(env) {
200
- step(7, 'Pre-agent hooks');
240
+ step(8, 'Pre-agent hooks');
201
241
  runHooks('pre-agent', env);
202
242
  }
203
243
  /** Ready: starts the session daemon and, with an agent, its first session, shown in this window. */
204
244
  async start(env) {
205
- step(8, 'Starting ' + session.harnessName);
245
+ step(9, 'Starting ' + session.harnessName);
206
246
  setSandboxStatus('ready', 'Ready');
207
247
  // No agent, or a restart that adds a project (the host opens its sessions itself once the sandbox is ready).
208
248
  if (!session.harness || session.autoSession === false) {
209
249
  if (!dryRun)
210
- startDaemon(env);
250
+ startDaemon(env, this.secrets);
211
251
  log('Ready' + (session.harness ? '' : ' (no agent requested)') + '. Workspace: ' + workspace);
212
252
  return;
213
253
  }
@@ -220,7 +260,7 @@ export class Boot {
220
260
  runHooks('post-agent', env);
221
261
  return;
222
262
  }
223
- startDaemon(env);
263
+ startDaemon(env, this.secrets);
224
264
  writeJsonAtomic(run.requestFile(session.launchId), {
225
265
  kind: 'session',
226
266
  id: session.launchId,
@@ -1,10 +1,13 @@
1
1
  // The session daemon's polling loop: claims each valid request in run\requests and hands it to its handler.
2
2
  import fs from 'node:fs';
3
3
  import { saveClaudeMem } from '../setup/claude-mem.js';
4
+ import { saveLocalState } from '../agents/local-state.js';
4
5
  import { execCommand } from './exec.js';
5
6
  import { sessions } from './sessions.js';
7
+ import { governor } from '../governor/index.js';
6
8
  import { respond, safely } from './state.js';
7
9
  import { run } from '../runtime/paths.js';
10
+ import { withRequestSecrets } from '../runtime/secrets.js';
8
11
  import { warn } from '../runtime/log.js';
9
12
  import { errMsg } from '../../core/util/errors.js';
10
13
  const POLL_MS = 400;
@@ -33,11 +36,12 @@ export class Daemon {
33
36
  if (run.readSession(req.id))
34
37
  continue;
35
38
  // Not awaited: starting a session or running a command must not hold up other requests.
36
- void Promise.resolve(this.handle(req)).catch((e) => respond(req.id, { ok: false, message: errMsg(e) }));
39
+ void Promise.resolve(this.handle(withRequestSecrets(req))).catch((e) => respond(req.id, { ok: false, message: errMsg(e) }));
37
40
  }
38
41
  if (Date.now() - this.lastMemSave > MEM_SAVE_MS) {
39
42
  this.lastMemSave = Date.now();
40
43
  safely('claude-mem save', saveClaudeMem);
44
+ safely('agent databases save', saveLocalState);
41
45
  }
42
46
  }
43
47
  handle(req) {
@@ -50,6 +54,9 @@ export class Daemon {
50
54
  return execCommand(req);
51
55
  case 'restart':
52
56
  return sessions.restart(req);
57
+ case 'pressure':
58
+ // No response: the host repeats it every few seconds while its memory stays low.
59
+ return governor.hostPressure(req.seconds, req.reason);
53
60
  case 'ping':
54
61
  return respond(req.id, { ok: true, message: 'pong (' + sessions.count + ' session(s) running)' });
55
62
  }
@@ -2,6 +2,7 @@
2
2
  import { spawn } from 'node:child_process';
3
3
  import { SYSTEM } from '../../shared/system.js';
4
4
  import { exists } from '../runtime/fs.js';
5
+ import { withRegistryPath } from '../setup/environment.js';
5
6
  import { errMsg } from '../../core/util/errors.js';
6
7
  import { provisioner } from './project-provisioner.js';
7
8
  import { insideWorkspace, respond } from './state.js';
@@ -20,7 +21,7 @@ export function execCommand(req) {
20
21
  }
21
22
  // chcp 65001 first: console programs then write UTF-8 (not the OEM code page) into the pipes.
22
23
  // In a project registered after boot, its own environment (its Node, Python, database variables).
23
- const env = provisioner.provisionedFor(req.cwd)?.env ?? process.env;
24
+ const env = withRegistryPath(provisioner.provisionedFor(req.cwd)?.env ?? process.env);
24
25
  const child = spawn(SYSTEM.cmd(), ['/d', '/s', '/c', '"chcp 65001>nul & ' + req.command.map(quoteForCmd).join(' ') + '"'], { cwd: req.cwd, env, windowsHide: true, windowsVerbatimArguments: true });
25
26
  const output = { stdout: '', stderr: '' };
26
27
  // setEncoding decodes across chunks: a multi-byte character split between two reads is not mangled.
@@ -2,6 +2,7 @@
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { SYSTEM } from '../../shared/system.js';
4
4
  import { saveClaudeMem } from '../setup/claude-mem.js';
5
+ import { saveLocalState } from '../agents/local-state.js';
5
6
  import { isWin, run } from '../runtime/paths.js';
6
7
  import { log } from '../runtime/log.js';
7
8
  import { session } from '../runtime/session.js';
@@ -25,6 +26,7 @@ export class IdleShutdown {
25
26
  return;
26
27
  log('Headless sandbox has no sessions left; shutting down.');
27
28
  safely('claude-mem save', saveClaudeMem);
29
+ safely('agent databases save', saveLocalState);
28
30
  spawnSync(SYSTEM.shutdown(), ['/s', '/t', '5'], { windowsHide: true });
29
31
  }, GRACE_MS);
30
32
  }
@@ -2,6 +2,11 @@ import type { GuestRequest } from '../../core/types.js';
2
2
  type SessionRequest = Extract<GuestRequest, {
3
3
  kind: 'session';
4
4
  }>;
5
+ /**
6
+ * What keeps heavy load from taking the sandbox down: the job object's memory limit for everything the agents start
7
+ * (ptyhost reads PTYHOST_JOB_MB) and cargo's parallel jobs sized to the sandbox's memory and the sessions building.
8
+ */
9
+ export declare function memoryEnv(env: NodeJS.ProcessEnv, sessions: number): NodeJS.ProcessEnv;
5
10
  /** The agent sessions of this sandbox: the running ones, the ones starting, and what happens when one ends. */
6
11
  export declare class SessionManager {
7
12
  private readonly live;
@@ -3,19 +3,23 @@
3
3
  // (daemon/project).
4
4
  import path from 'node:path';
5
5
  import crypto from 'node:crypto';
6
+ import os from 'node:os';
6
7
  import { spawn } from 'node:child_process';
7
8
  import { FrameType, sendControl } from '../../shared/pty/index.js';
8
9
  import { isWithin } from '../../shared/paths/projects.js';
9
10
  import { now } from '../../shared/channel/run-dir.js';
10
11
  import { SYSTEM } from '../../shared/system.js';
12
+ import { cargoJobs } from '../../shared/memory/index.js';
11
13
  import { commandLine } from '../sessions/cmdline.js';
12
14
  import { freePort } from '../runtime/ports.js';
13
15
  import { primaryProject } from '../boot/project-status.js';
14
16
  import { ensurePtyHost, ptyHostLogTail, startPtyHost, waitForPtyHost } from '../sessions/pty-host.js';
15
17
  import { agents } from '../agents/agent-installer.js';
16
18
  import { saveClaudeMem } from '../setup/claude-mem.js';
19
+ import { saveLocalState } from '../agents/local-state.js';
17
20
  import { projectHooks, runHooks, runHooksAsync } from '../setup/hooks.js';
18
21
  import { guestAddresses } from '../network/addresses.js';
22
+ import { withRegistryPath } from '../setup/environment.js';
19
23
  import { dataDir, toolsDir } from '../runtime/paths.js';
20
24
  import { exists } from '../runtime/fs.js';
21
25
  import { log, warn } from '../runtime/log.js';
@@ -46,8 +50,20 @@ const harnessFor = (req) => {
46
50
  return sent;
47
51
  throw new Error('Agent "' + req.harness + '" is not configured for this sandbox (it runs ' + session.harnessName + ').');
48
52
  };
53
+ /**
54
+ * What keeps heavy load from taking the sandbox down: the job object's memory limit for everything the agents start
55
+ * (ptyhost reads PTYHOST_JOB_MB) and cargo's parallel jobs sized to the sandbox's memory and the sessions building.
56
+ */
57
+ export function memoryEnv(env, sessions) {
58
+ const out = {};
59
+ if (session.agentMemoryLimitMb)
60
+ out.PTYHOST_JOB_MB = String(session.agentMemoryLimitMb);
61
+ if (!env.CARGO_BUILD_JOBS)
62
+ out.CARGO_BUILD_JOBS = String(cargoJobs(os.cpus().length, os.totalmem() / 1024 ** 3, sessions));
63
+ return out;
64
+ }
49
65
  /** Starts ptyhost for the agent and waits until it listens; a failure carries the tail of ptyhost's own log. */
50
- const launchPtyHost = async (req, remote, env, say) => {
66
+ const launchPtyHost = async (req, remote, env, say, sessions) => {
51
67
  const harness = harnessFor(req);
52
68
  // Never refresh here: main already did, and replacing a running agent's executable would fail.
53
69
  say('Preparing ' + req.harness);
@@ -64,7 +80,7 @@ const launchPtyHost = async (req, remote, env, say) => {
64
80
  rows: 32,
65
81
  id: req.id,
66
82
  cwd: req.cwd,
67
- env: { ...env, ...harness.environment },
83
+ env: { ...withRegistryPath(env), ...harness.environment, ...memoryEnv(env, sessions) },
68
84
  remote,
69
85
  command: commandLine(launch.file, [...base, ...req.args]),
70
86
  restartCommand: commandLine(launch.file, [...base, ...(harness.resumeArguments ?? [])]),
@@ -143,7 +159,7 @@ export class SessionManager {
143
159
  try {
144
160
  const place = await placeFor(req, say);
145
161
  const remote = session.networking && session.attach.enabled;
146
- const { child, port, token } = await launchPtyHost(req, remote, place.env, say);
162
+ const { child, port, token } = await launchPtyHost(req, remote, place.env, say, this.live.size + 1);
147
163
  const resumed = req.harness === 'claude' ? resumedConversation(req.args) : undefined;
148
164
  const running = {
149
165
  ...status,
@@ -257,6 +273,7 @@ export class SessionManager {
257
273
  else
258
274
  safely('post-agent hooks', () => runHooks('post-agent', process.env));
259
275
  safely('claude-mem save', saveClaudeMem);
276
+ safely('agent databases save', saveLocalState);
260
277
  this.idle.check();
261
278
  }
262
279
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ // `sbx-agent`: list agents and install a configured one inside the sandbox. Usage: sbx-agent list | install <agent>
2
+ import { dropInheritedModulePath } from '../../shared/system.js';
3
+ import { runSbxAgent } from '../agents/sbx-agent.js';
4
+ dropInheritedModulePath();
5
+ runSbxAgent(process.argv.slice(2)).then((code) => {
6
+ process.exitCode = code;
7
+ }, (e) => {
8
+ console.error(e instanceof Error ? e.message : String(e));
9
+ process.exitCode = 1;
10
+ });
@@ -6,11 +6,16 @@ import { startRelays } from '../daemon/relays.js';
6
6
  import { startProcessCollector } from '../audit/process-audit.js';
7
7
  import { safely } from '../daemon/state.js';
8
8
  import { log, warn } from '../runtime/log.js';
9
+ import { adoptBootSecrets } from '../runtime/secrets.js';
9
10
  import { errMsg } from '../../core/util/errors.js';
10
11
  import { Daemon } from '../daemon/daemon.js';
12
+ import { governor } from '../governor/index.js';
11
13
  process.on('uncaughtException', (e) => warn('daemon: unexpected error (continuing): ' + (e.stack ?? errMsg(e))));
12
14
  process.on('unhandledRejection', (e) => warn('daemon: unexpected error (continuing): ' + errMsg(e)));
15
+ adoptBootSecrets();
13
16
  log('Session daemon started (pid ' + process.pid + ').');
14
17
  safely('port forwards', startRelays);
15
18
  safely('audit', startProcessCollector);
19
+ safely('memory governor', () => governor.start());
20
+ log('Memory governor: ' + governor.describe());
16
21
  new Daemon().start();
@@ -0,0 +1,61 @@
1
+ import type { GuestThresholds, LoadProfile } from '../../shared/memory/index.js';
2
+ export type Priority = 'idle' | 'below' | 'normal';
3
+ export interface ProcSample {
4
+ readonly pid: number;
5
+ readonly name: string;
6
+ /** Private memory in MB. */
7
+ readonly mb: number;
8
+ readonly prio: Priority;
9
+ }
10
+ export interface MemSample {
11
+ readonly ramTotalMb: number;
12
+ readonly ramAvailMb: number;
13
+ readonly commitLimitMb: number;
14
+ readonly commitAvailMb: number;
15
+ /** Only the processes in the agents' job. */
16
+ readonly procs: readonly ProcSample[];
17
+ }
18
+ export declare const isNeverTouched: (name: string) => boolean;
19
+ export declare const canLower: (name: string) => boolean;
20
+ export declare const canPause: (name: string) => boolean;
21
+ export type Level = 'ok' | 'throttled' | 'suspending';
22
+ export interface GovernorState {
23
+ /** Under pressure now (with hysteresis). */
24
+ readonly pressure: boolean;
25
+ /** Samples in a row that looked calm while under pressure. */
26
+ readonly calm: number;
27
+ /** Samples under pressure so far (resets when it ends). */
28
+ readonly samples: number;
29
+ /** What was lowered and to what, by pid. */
30
+ readonly lowered: Readonly<Record<number, Priority>>;
31
+ /** Until when (ms) the last pause lasts, and when another may start. */
32
+ readonly pausedUntil: number;
33
+ readonly nextPauseAt: number;
34
+ /** The PC asked for slowing down until this time (ms). */
35
+ readonly hostUntil: number;
36
+ }
37
+ export declare const INITIAL_STATE: GovernorState;
38
+ export type Action = {
39
+ readonly kind: 'priority';
40
+ readonly pid: number;
41
+ readonly name: string;
42
+ readonly to: Priority;
43
+ } | {
44
+ readonly kind: 'pause';
45
+ readonly pid: number;
46
+ readonly name: string;
47
+ readonly ms: number;
48
+ };
49
+ export interface Decision {
50
+ readonly state: GovernorState;
51
+ readonly actions: readonly Action[];
52
+ readonly level: Level;
53
+ readonly ramFreePercent: number;
54
+ readonly commitPercent: number;
55
+ }
56
+ export declare const PAUSE_MS = 5000;
57
+ /**
58
+ * One step. `gentle` (vGPU on): compilers start below normal even without pressure. Programs go back to their normal
59
+ * priority only when pressure ends (several calm samples in a row).
60
+ */
61
+ export declare function decide(prev: GovernorState, sample: MemSample, nowMs: number, thresholds: GuestThresholds, profile: LoadProfile): Decision;
@@ -0,0 +1,182 @@
1
+ /** Programs that compile or link: they may be slowed down and, as the last resort, paused for a few seconds. */
2
+ const COMPILERS = new Set([
3
+ 'rustc',
4
+ 'clippy-driver',
5
+ 'rustdoc',
6
+ 'cc1',
7
+ 'cc1plus',
8
+ 'cc1obj',
9
+ 'collect2',
10
+ 'gcc',
11
+ 'g++',
12
+ 'c++',
13
+ 'cc',
14
+ 'clang',
15
+ 'clang++',
16
+ 'clang-cl',
17
+ 'cl',
18
+ 'link',
19
+ 'lld',
20
+ 'lld-link',
21
+ 'ld',
22
+ 'ld.lld',
23
+ 'as',
24
+ 'tsc',
25
+ 'javac',
26
+ ]);
27
+ /** Build tools and workers: slowed down but never paused (a node process may be a dev server or an agent). */
28
+ const BUILD_TOOLS = new Set([
29
+ 'node',
30
+ 'dotnet',
31
+ 'msbuild',
32
+ 'vbcscompiler',
33
+ 'ninja',
34
+ 'make',
35
+ 'mingw32-make',
36
+ 'cmake',
37
+ 'cargo',
38
+ 'go',
39
+ 'java',
40
+ 'gradle',
41
+ 'python',
42
+ ]);
43
+ /** Never touched: the agents themselves, shells, terminals, this tool's own programs, Windows. */
44
+ const NEVER = new Set([
45
+ 'claude',
46
+ 'codex',
47
+ 'gemini',
48
+ 'opencode',
49
+ 'aider',
50
+ 'cursor-agent',
51
+ 'cmd',
52
+ 'powershell',
53
+ 'pwsh',
54
+ 'bash',
55
+ 'sh',
56
+ 'zsh',
57
+ 'git',
58
+ 'conhost',
59
+ 'openconsole',
60
+ 'windowsterminal',
61
+ 'wt',
62
+ 'ptyhost',
63
+ 'memgov',
64
+ 'sandboxtools',
65
+ 'sbx-db',
66
+ 'explorer',
67
+ 'csrss',
68
+ 'wininit',
69
+ 'winlogon',
70
+ 'services',
71
+ 'svchost',
72
+ 'lsass',
73
+ 'system',
74
+ 'smss',
75
+ 'dwm',
76
+ ]);
77
+ const key = (name) => name.toLowerCase().replace(/\.exe$/, '');
78
+ export const isNeverTouched = (name) => NEVER.has(key(name));
79
+ export const canLower = (name) => !isNeverTouched(name) && (COMPILERS.has(key(name)) || BUILD_TOOLS.has(key(name)));
80
+ export const canPause = (name) => !isNeverTouched(name) && COMPILERS.has(key(name));
81
+ export const INITIAL_STATE = {
82
+ pressure: false,
83
+ calm: 0,
84
+ samples: 0,
85
+ lowered: {},
86
+ pausedUntil: 0,
87
+ nextPauseAt: 0,
88
+ hostUntil: 0,
89
+ };
90
+ export const PAUSE_MS = 5000;
91
+ const PAUSE_COOLDOWN_MS = 10000;
92
+ /** Samples under pressure before programs go from below-normal to idle, and before one is paused. */
93
+ const IDLE_AFTER = 3;
94
+ const PAUSE_AFTER = 4;
95
+ /** Only a program this big is worth pausing. */
96
+ const PAUSE_MIN_MB = 300;
97
+ /**
98
+ * One step. `gentle` (vGPU on): compilers start below normal even without pressure. Programs go back to their normal
99
+ * priority only when pressure ends (several calm samples in a row).
100
+ */
101
+ export function decide(prev, sample, nowMs, thresholds, profile) {
102
+ const ramFree = (sample.ramAvailMb / Math.max(1, sample.ramTotalMb)) * 100;
103
+ const commit = ((sample.commitLimitMb - sample.commitAvailMb) / Math.max(1, sample.commitLimitMb)) * 100;
104
+ const pcLow = nowMs < prev.hostUntil;
105
+ const low = ramFree < thresholds.enterAvailablePercent || commit > thresholds.enterCommitPercent || pcLow;
106
+ const recovered = ramFree > thresholds.exitAvailablePercent && commit < thresholds.exitCommitPercent && !pcLow;
107
+ let pressure = prev.pressure;
108
+ let calm = prev.calm;
109
+ let samples = prev.samples;
110
+ if (low) {
111
+ pressure = true;
112
+ calm = 0;
113
+ samples = prev.samples + 1;
114
+ }
115
+ else if (prev.pressure) {
116
+ calm = recovered ? prev.calm + 1 : 0;
117
+ if (calm >= thresholds.calmSamples) {
118
+ pressure = false;
119
+ calm = 0;
120
+ samples = 0;
121
+ }
122
+ }
123
+ const actions = [];
124
+ const present = new Set(sample.procs.map((p) => p.pid));
125
+ const lowered = {};
126
+ for (const [pid, to] of Object.entries(prev.lowered))
127
+ if (present.has(Number(pid)))
128
+ lowered[Number(pid)] = to;
129
+ if (pressure) {
130
+ const target = samples > IDLE_AFTER ? 'idle' : 'below';
131
+ for (const p of sample.procs) {
132
+ if (!canLower(p.name) || lowered[p.pid] === target)
133
+ continue;
134
+ // Already as low as asked (or lower): only remember it.
135
+ if (p.prio !== target && !(target === 'below' && p.prio === 'idle'))
136
+ actions.push({ kind: 'priority', pid: p.pid, name: p.name, to: target });
137
+ lowered[p.pid] = target;
138
+ }
139
+ }
140
+ else {
141
+ for (const p of sample.procs) {
142
+ if (!canLower(p.name))
143
+ continue;
144
+ // Where a program rests when nothing is wrong: compilers below normal in the gentle profile.
145
+ const base = profile === 'gentle' && canPause(p.name) ? 'below' : 'normal';
146
+ const was = lowered[p.pid];
147
+ if (prev.pressure && was !== undefined && was !== base) {
148
+ if (p.prio !== base)
149
+ actions.push({ kind: 'priority', pid: p.pid, name: p.name, to: base });
150
+ if (base === 'normal')
151
+ delete lowered[p.pid];
152
+ else
153
+ lowered[p.pid] = base;
154
+ }
155
+ else if (!prev.pressure && base === 'below' && was === undefined) {
156
+ if (p.prio === 'normal')
157
+ actions.push({ kind: 'priority', pid: p.pid, name: p.name, to: 'below' });
158
+ lowered[p.pid] = 'below';
159
+ }
160
+ }
161
+ }
162
+ let pausedUntil = prev.pausedUntil;
163
+ let nextPauseAt = prev.nextPauseAt;
164
+ if (pressure && samples >= PAUSE_AFTER && nowMs >= prev.nextPauseAt && nowMs >= prev.pausedUntil) {
165
+ const victim = [...sample.procs]
166
+ .filter((p) => canPause(p.name) && p.mb >= PAUSE_MIN_MB)
167
+ .sort((a, b) => b.mb - a.mb)[0];
168
+ if (victim) {
169
+ actions.push({ kind: 'pause', pid: victim.pid, name: victim.name, ms: PAUSE_MS });
170
+ pausedUntil = nowMs + PAUSE_MS;
171
+ nextPauseAt = pausedUntil + PAUSE_COOLDOWN_MS;
172
+ }
173
+ }
174
+ const level = nowMs < pausedUntil ? 'suspending' : pressure ? 'throttled' : 'ok';
175
+ return {
176
+ state: { pressure, calm, samples, lowered, pausedUntil, nextPauseAt, hostUntil: prev.hostUntil },
177
+ actions,
178
+ level,
179
+ ramFreePercent: Math.round(ramFree),
180
+ commitPercent: Math.round(commit),
181
+ };
182
+ }
@@ -0,0 +1,42 @@
1
+ import type { PressureStatus } from '../../shared/channel/schema.js';
2
+ import { type LoadProfile } from '../../shared/memory/index.js';
3
+ import { type GovernorState, type MemSample } from './decide.js';
4
+ /** What the governor needs from Windows (injectable: the tests use a fake). */
5
+ export interface GovernorPort {
6
+ setPriority(pid: number, to: 'idle' | 'below' | 'normal'): void;
7
+ pause(pid: number, ms: number): void;
8
+ }
9
+ /** Everything a step changes outside the decision, behind injectable functions. */
10
+ export interface GovernorDeps {
11
+ readonly port: GovernorPort;
12
+ readonly profile: LoadProfile;
13
+ readonly now: () => number;
14
+ /** A line in the memory log. */
15
+ readonly logLine: (line: string) => void;
16
+ /** run\pressure.json. */
17
+ readonly saveStatus: (status: PressureStatus) => void;
18
+ }
19
+ /** The governor's logic over a port: feed it samples; the host's "slow down" requests go to hostPressure. */
20
+ export declare class GovernorCore {
21
+ private readonly deps;
22
+ private state;
23
+ private lastAction;
24
+ private lastWrite;
25
+ private lastWriteAt;
26
+ private pausedName;
27
+ private pausedPid;
28
+ constructor(deps: GovernorDeps);
29
+ hostPressure(seconds: number, reason: string): void;
30
+ get current(): GovernorState;
31
+ onSample(sample: MemSample): void;
32
+ private apply;
33
+ }
34
+ /** The daemon's governor: on unless sandbox.pressureResponse is off. */
35
+ export declare class Governor {
36
+ private core;
37
+ describe(): string;
38
+ start(): void;
39
+ /** The host's watchdog: this PC is low for a while. */
40
+ hostPressure(seconds: number, reason: string): void;
41
+ }
42
+ export declare const governor: Governor;