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
@@ -91,7 +91,34 @@ export const GuestRequestSchema = z.discriminatedUnion('kind', [
91
91
  createdAt: TimeSchema,
92
92
  }),
93
93
  z.strictObject({ kind: z.literal('ping'), id: IdSchema, createdAt: TimeSchema }),
94
+ /**
95
+ * The PC's own memory or CPU is running low (the host watchdog): the sandbox slows its heaviest builds down for
96
+ * `seconds` (it never stops them) so Windows does not have to close it. Repeated while the PC stays low.
97
+ */
98
+ z.strictObject({
99
+ kind: z.literal('pressure'),
100
+ id: IdSchema,
101
+ reason: Text(300),
102
+ seconds: z.number().int().min(10).max(300),
103
+ createdAt: TimeSchema,
104
+ }),
94
105
  ]);
106
+ /** C:\AgentData\run\pressure.json: what the memory governor in the sandbox is doing (guest-written, capped). */
107
+ export const PressureStatusSchema = z.object({
108
+ level: z.enum(['ok', 'throttled', 'suspending']),
109
+ profile: z.enum(['normal', 'gentle']),
110
+ /** Share of the sandbox's RAM still free and of its commit limit in use (percent). */
111
+ ramFreePercent: z.number().int().min(0).max(100),
112
+ commitPercent: z.number().int().min(0).max(100),
113
+ /** Programs running at lower priority because of it. */
114
+ lowered: z.number().int().min(0).max(1024),
115
+ /** Programs paused right now (name, process id, seconds left). */
116
+ paused: z.array(z.object({ name: Text(64), pid: z.number().int(), seconds: z.number().int().min(0).max(60) })).max(8),
117
+ /** The PC itself asked for slowing down (its memory or CPU is low). */
118
+ pcLow: z.boolean(),
119
+ lastAction: Text(300),
120
+ updatedAt: TimeSchema,
121
+ });
95
122
  /** C:\AgentData\run\responses\<id>.json: the guest's reply. */
96
123
  export const GuestResponseSchema = z.object({
97
124
  id: IdSchema,
@@ -131,3 +158,14 @@ export const ProjectStatusSchema = z.object({
131
158
  databases: z.array(z.object({ database: Text(32), port: z.number().int() })).max(16),
132
159
  summary: z.array(Text(512)).max(64),
133
160
  });
161
+ /** The guest writes run/vpn.json: whether the VPN tunnel is up (validated and capped on the host). */
162
+ export const VpnStatusSchema = z.object({
163
+ state: z.enum(['off', 'starting', 'up', 'failed']),
164
+ message: Text(2000),
165
+ killSwitch: z.boolean(),
166
+ /** The server's name, e.g. uk2201.nordvpn.com. */
167
+ server: Text(128).optional(),
168
+ /** What the sandbox's traffic looks like from outside, once the tunnel is up. */
169
+ publicIp: Text(64).optional(),
170
+ updatedAt: TimeSchema,
171
+ });
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ export declare const SecretsFileSchema: z.ZodObject<{
3
+ harnessEnvironment: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
4
+ harnessSpecEnvironment: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
5
+ projectHarnessEnvironment: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>>>;
6
+ claudeCredentials: z.ZodOptional<z.ZodString>;
7
+ vpn: z.ZodOptional<z.ZodObject<{
8
+ username: z.ZodString;
9
+ password: z.ZodString;
10
+ }, z.core.$strict>>;
11
+ wireguardConfig: z.ZodOptional<z.ZodString>;
12
+ }, z.core.$strict>;
13
+ export type SecretsFile = z.output<typeof SecretsFileSchema>;
14
+ interface WithHarnesses {
15
+ readonly harnessSpec?: {
16
+ environment: Record<string, string>;
17
+ };
18
+ readonly project?: {
19
+ harnesses: Record<string, {
20
+ environment: Record<string, string>;
21
+ }>;
22
+ };
23
+ }
24
+ /**
25
+ * A session or project request with the agent environment values from its secrets file put back (the reverse of
26
+ * host/secrets withoutSecrets). In memory only: the sandbox never writes them out again.
27
+ */
28
+ export declare function mergeRequestSecrets<R extends WithHarnesses>(request: R, secrets: SecretsFile): R;
29
+ export {};
@@ -0,0 +1,50 @@
1
+ // What the host hands the sandbox that must not sit in session.json or in anything in the launch folder (which is
2
+ // mapped read-only into the sandbox and kept for days): one file per launch or request in <data>\secrets\<id>.json,
3
+ // which the sandbox reads and deletes at once. The folder is next to run\ (not in it): other users of a shared
4
+ // sandbox may change run\, never this folder. The agent in the sandbox can still read what it was given (its own
5
+ // environment, its login): that is inherent. Every part is optional.
6
+ import { z } from 'zod';
7
+ const Environment = z.record(z.string().max(256), z.string().max(65536));
8
+ export const SecretsFileSchema = z.strictObject({
9
+ /** The agent the sandbox booted with: its harness environment. */
10
+ harnessEnvironment: Environment.optional(),
11
+ /** harnessSpec of a session request (an agent the sandbox did not boot with). */
12
+ harnessSpecEnvironment: Environment.optional(),
13
+ /** project.harnesses of a request, by agent name. */
14
+ projectHarnessEnvironment: z.record(z.string().max(64), Environment).optional(),
15
+ /** The login of this PC's Claude (claudeProfile.copyCredentials): the text of .credentials.json. */
16
+ claudeCredentials: z
17
+ .string()
18
+ .max(1024 * 1024)
19
+ .optional(),
20
+ /** VPN service credentials (vpn.provider's login), only for the launch's own sandbox. */
21
+ vpn: z.strictObject({ username: z.string().min(1).max(256), password: z.string().min(1).max(1024) }).optional(),
22
+ /** The checked WireGuard config of vpn.provider wireguard-file (holds the private key). */
23
+ wireguardConfig: z
24
+ .string()
25
+ .min(1)
26
+ .max(32 * 1024)
27
+ .optional(),
28
+ });
29
+ /** The environment a harness gets: its own, then the values that travelled in the secrets file. */
30
+ const withEnvironment = (harness, environment) => (environment ? { ...harness, environment: { ...harness.environment, ...environment } } : harness);
31
+ /**
32
+ * A session or project request with the agent environment values from its secrets file put back (the reverse of
33
+ * host/secrets withoutSecrets). In memory only: the sandbox never writes them out again.
34
+ */
35
+ export function mergeRequestSecrets(request, secrets) {
36
+ let merged = request;
37
+ if (request.harnessSpec && secrets.harnessSpecEnvironment)
38
+ merged = { ...merged, harnessSpec: withEnvironment(request.harnessSpec, secrets.harnessSpecEnvironment) };
39
+ if (request.project && secrets.projectHarnessEnvironment) {
40
+ const given = secrets.projectHarnessEnvironment;
41
+ merged = {
42
+ ...merged,
43
+ project: {
44
+ ...request.project,
45
+ harnesses: Object.fromEntries(Object.entries(request.project.harnesses).map(([name, h]) => [name, withEnvironment(h, given[name])])),
46
+ },
47
+ };
48
+ }
49
+ return merged;
50
+ }
@@ -0,0 +1 @@
1
+ export * from './policy.js';
@@ -0,0 +1 @@
1
+ export * from './policy.js';
@@ -0,0 +1,33 @@
1
+ export type LoadProfile = 'normal' | 'gentle';
2
+ /** The guest governor: when memory inside the sandbox counts as under pressure, and when it has recovered. */
3
+ export interface GuestThresholds {
4
+ /** Pressure starts when available RAM is below this share of the sandbox's RAM (percent)... */
5
+ readonly enterAvailablePercent: number;
6
+ /** ...or commit is above this share of its limit. */
7
+ readonly enterCommitPercent: number;
8
+ /** Pressure ends only when available RAM is above this and commit is below the next, for `calmSamples` in a row. */
9
+ readonly exitAvailablePercent: number;
10
+ readonly exitCommitPercent: number;
11
+ readonly calmSamples: number;
12
+ }
13
+ export declare const GUEST_THRESHOLDS: Readonly<Record<LoadProfile, GuestThresholds>>;
14
+ /** The PC watchdog: when this PC itself is low. */
15
+ export interface HostThresholds {
16
+ /** Low when available RAM is below max(this, availableShare of total RAM)... */
17
+ readonly availableMinMb: number;
18
+ readonly availablePercent: number;
19
+ /** ...or available commit is below this share of the commit limit (percent)... */
20
+ readonly commitAvailablePercent: number;
21
+ /** ...or below half the reserveHostMb. Recovered above 1.25 times each limit for `calmSamples` samples. */
22
+ readonly calmSamples: number;
23
+ /** Total CPU above this (percent) for cpuSeconds. */
24
+ readonly cpuPercent: number;
25
+ readonly cpuSeconds: number;
26
+ }
27
+ export declare const HOST_THRESHOLDS: Readonly<Record<LoadProfile, HostThresholds>>;
28
+ /** The CPU cap (percent of the PC) the gentle profile uses: 15 points lower, never below 50. "none" = 100. */
29
+ export declare function gentleCpuLimit(cpuLimit: 'none' | number): number;
30
+ /** The CPU cap the sandbox runs with (percent; null = none) for a profile. */
31
+ export declare function effectiveCpuLimit(cpuLimit: 'none' | number, profile: LoadProfile): number | null;
32
+ /** Cargo jobs that fit the memory (about 4 GB per rustc) and the CPUs, fewer when several agent sessions build. */
33
+ export declare function cargoJobs(cpus: number, memoryGb: number, sessions: number): number;
@@ -0,0 +1,55 @@
1
+ // What "heavy load" means, decided once for the host watchdog and the guest governor (pure, no I/O). Every
2
+ // protection is on by default; the gentle profile (vGPU on: a graphics driver hang can freeze the whole PC) triggers
3
+ // earlier and runs the sandbox with less CPU.
4
+ export const GUEST_THRESHOLDS = {
5
+ normal: {
6
+ enterAvailablePercent: 8,
7
+ enterCommitPercent: 92,
8
+ exitAvailablePercent: 12,
9
+ exitCommitPercent: 88,
10
+ calmSamples: 3,
11
+ },
12
+ gentle: {
13
+ enterAvailablePercent: 15,
14
+ enterCommitPercent: 85,
15
+ exitAvailablePercent: 20,
16
+ exitCommitPercent: 80,
17
+ calmSamples: 3,
18
+ },
19
+ };
20
+ export const HOST_THRESHOLDS = {
21
+ normal: {
22
+ availableMinMb: 4096,
23
+ availablePercent: 12,
24
+ commitAvailablePercent: 15,
25
+ calmSamples: 3,
26
+ cpuPercent: 95,
27
+ cpuSeconds: 60,
28
+ },
29
+ gentle: {
30
+ availableMinMb: 6144,
31
+ availablePercent: 15,
32
+ commitAvailablePercent: 20,
33
+ calmSamples: 3,
34
+ cpuPercent: 90,
35
+ cpuSeconds: 45,
36
+ },
37
+ };
38
+ /** The CPU cap (percent of the PC) the gentle profile uses: 15 points lower, never below 50. "none" = 100. */
39
+ export function gentleCpuLimit(cpuLimit) {
40
+ return Math.max(50, (cpuLimit === 'none' ? 100 : cpuLimit) - 15);
41
+ }
42
+ /** The CPU cap the sandbox runs with (percent; null = none) for a profile. */
43
+ export function effectiveCpuLimit(cpuLimit, profile) {
44
+ if (profile === 'gentle')
45
+ return Math.min(gentleCpuLimit(cpuLimit), cpuLimit === 'none' ? 100 : cpuLimit);
46
+ return cpuLimit === 'none' ? null : cpuLimit;
47
+ }
48
+ /** Cargo jobs that fit the memory (about 4 GB per rustc) and the CPUs, fewer when several agent sessions build. */
49
+ export function cargoJobs(cpus, memoryGb, sessions) {
50
+ const byCpu = Math.max(2, Math.min(4, Math.floor(cpus / 4)));
51
+ const byMemory = Math.max(1, Math.floor(memoryGb / 4));
52
+ const jobs = Math.min(byCpu, byMemory);
53
+ // All the agents' builds share the sandbox: about 8 jobs in total however many sessions there are.
54
+ return Math.max(1, Math.min(jobs, Math.floor(8 / Math.max(1, sessions))));
55
+ }
@@ -1,10 +1,19 @@
1
+ export interface OutputFilterOptions {
2
+ /**
3
+ * Let clipboard writes (OSC 52) through: the agent's "copy" reaches your clipboard. Only where the sandbox can reach
4
+ * that clipboard anyway (its own terminal, or sandbox.clipboard on). Clipboard reads are always dropped.
5
+ */
6
+ readonly clipboardWrites?: boolean;
7
+ }
1
8
  /**
2
9
  * Removes the terminal "strings" an untrusted program could abuse from the sandbox's output before it reaches your
3
- * terminal: clipboard writes (OSC 52), terminal macros (ConEmu's OSC 9), DCS / APC / PM / SOS, and their C1 forms.
10
+ * terminal: clipboard writes (OSC 52, unless clipboardWrites) and reads, terminal macros (ConEmu's OSC 9), DCS / APC /
11
+ * PM / SOS, and their C1 forms.
4
12
  * Titles, links, progress and colours pass. A byte-level state machine, so no split across chunks, leading zero
5
13
  * (ESC]052) or huge payload slips through: a dropped string stays dropped until its terminator, however long it is.
6
14
  */
7
15
  export declare class OutputFilter {
16
+ private readonly options;
8
17
  /**
9
18
  * text: normal output; esc: after ESC; c2: after a 0xC2 lead byte; string: inside an OSC/DCS/...; stringEsc /
10
19
  * stringC2: a possible terminator inside one.
@@ -12,5 +21,9 @@ export declare class OutputFilter {
12
21
  private state;
13
22
  /** The string being read: an OSC worth keeping is collected until its terminator; null = being dropped. */
14
23
  private body;
24
+ private readonly maxString;
25
+ constructor(options?: OutputFilterOptions);
26
+ /** An OSC that may pass: a short title, link, progress or mark, or (when allowed) a clipboard write. */
27
+ private kept;
15
28
  push(chunk: Buffer): Buffer;
16
29
  }
@@ -8,13 +8,19 @@ const KEPT_OSC = (body) => {
8
8
  };
9
9
  /** Longest OSC kept (a title or a link); anything longer is dropped whole. */
10
10
  const MAX_KEPT_STRING = 4096;
11
+ /** Longest clipboard write kept (about 750 KB of text); anything longer is dropped whole. */
12
+ const MAX_CLIPBOARD_STRING = 1024 * 1024;
13
+ /** A clipboard write (OSC 52: selection, then base64): never a read ("?"), which would send the clipboard back. */
14
+ const CLIPBOARD_WRITE = /^0{0,2}52;[cpqs0-7]{0,8};[A-Za-z0-9+/=]*$/;
11
15
  /**
12
16
  * Removes the terminal "strings" an untrusted program could abuse from the sandbox's output before it reaches your
13
- * terminal: clipboard writes (OSC 52), terminal macros (ConEmu's OSC 9), DCS / APC / PM / SOS, and their C1 forms.
17
+ * terminal: clipboard writes (OSC 52, unless clipboardWrites) and reads, terminal macros (ConEmu's OSC 9), DCS / APC /
18
+ * PM / SOS, and their C1 forms.
14
19
  * Titles, links, progress and colours pass. A byte-level state machine, so no split across chunks, leading zero
15
20
  * (ESC]052) or huge payload slips through: a dropped string stays dropped until its terminator, however long it is.
16
21
  */
17
22
  export class OutputFilter {
23
+ options;
18
24
  /**
19
25
  * text: normal output; esc: after ESC; c2: after a 0xC2 lead byte; string: inside an OSC/DCS/...; stringEsc /
20
26
  * stringC2: a possible terminator inside one.
@@ -22,8 +28,20 @@ export class OutputFilter {
22
28
  state = 'text';
23
29
  /** The string being read: an OSC worth keeping is collected until its terminator; null = being dropped. */
24
30
  body = null;
31
+ maxString;
32
+ constructor(options = {}) {
33
+ this.options = options;
34
+ this.maxString = options.clipboardWrites ? MAX_CLIPBOARD_STRING : MAX_KEPT_STRING;
35
+ }
36
+ /** An OSC that may pass: a short title, link, progress or mark, or (when allowed) a clipboard write. */
37
+ kept(body) {
38
+ if (this.options.clipboardWrites && CLIPBOARD_WRITE.test(body))
39
+ return true;
40
+ return body.length <= MAX_KEPT_STRING && KEPT_OSC(body);
41
+ }
25
42
  push(chunk) {
26
- const out = Buffer.allocUnsafe(chunk.length + MAX_KEPT_STRING + 8);
43
+ // At most: the string carried over from the last chunk, this chunk, and an OSC prefix and terminator.
44
+ const out = Buffer.allocUnsafe(chunk.length + (this.body?.length ?? 0) + 8);
27
45
  let n = 0;
28
46
  const put = (...bytes) => {
29
47
  for (const b of bytes)
@@ -45,7 +63,7 @@ export class OutputFilter {
45
63
  };
46
64
  const endString = (terminator) => {
47
65
  const body = this.body && Buffer.from(this.body).toString('latin1');
48
- if (body !== null && KEPT_OSC(body)) {
66
+ if (body !== null && this.kept(body)) {
49
67
  put(0x1b, 0x5d);
50
68
  out.write(body, n, 'latin1');
51
69
  n += body.length;
@@ -55,7 +73,7 @@ export class OutputFilter {
55
73
  this.state = 'text';
56
74
  };
57
75
  const collect = (b) => {
58
- if (this.body && this.body.push(b) > MAX_KEPT_STRING)
76
+ if (this.body && this.body.push(b) > this.maxString)
59
77
  this.body = null;
60
78
  };
61
79
  for (const b of chunk) {
@@ -22,6 +22,9 @@ export declare function fixWindowsKeys(chunk: Buffer): Buffer;
22
22
  * Bridges this process's terminal to the remote program until it exits, the connection drops, or the user presses
23
23
  * the detach key. Restores the terminal before resolving.
24
24
  */
25
- export declare function runTerminalClient(socket: net.Socket, token: string, options?: {
25
+ export declare function runTerminalClient(socket: net.Socket, token: string,
26
+ /** clipboardWrites: the agent's "copy" (OSC 52) reaches the clipboard; see OutputFilterOptions. */
27
+ options?: {
26
28
  detachKey?: number;
29
+ clipboardWrites?: boolean;
27
30
  }): Promise<ClientResult>;
@@ -20,7 +20,9 @@ export function fixWindowsKeys(chunk) {
20
20
  * Bridges this process's terminal to the remote program until it exits, the connection drops, or the user presses
21
21
  * the detach key. Restores the terminal before resolving.
22
22
  */
23
- export function runTerminalClient(socket, token, options = {}) {
23
+ export function runTerminalClient(socket, token,
24
+ /** clipboardWrites: the agent's "copy" (OSC 52) reaches the clipboard; see OutputFilterOptions. */
25
+ options = {}) {
24
26
  const stdin = process.stdin;
25
27
  const stdout = process.stdout;
26
28
  // getWindowSize asks the console every time; columns/rows only change when Node noticed a resize.
@@ -33,7 +35,7 @@ export function runTerminalClient(socket, token, options = {}) {
33
35
  return new Promise((resolve) => {
34
36
  let done = false;
35
37
  const reader = new FrameReader();
36
- const filter = new OutputFilter();
38
+ const filter = new OutputFilter({ clipboardWrites: options.clipboardWrites });
37
39
  let sent = size();
38
40
  let resizeTimer;
39
41
  // Set once raw mode is on (below); finish() may run before that.
@@ -15,6 +15,7 @@ export declare const SYSTEM: {
15
15
  readonly shutdown: () => string;
16
16
  readonly dism: () => string;
17
17
  readonly msiexec: () => string;
18
+ readonly sc: () => string;
18
19
  /** The .NET Framework C# compiler that ships with Windows (C# 5). */
19
20
  readonly csc: () => string;
20
21
  };
@@ -21,6 +21,7 @@ export const SYSTEM = {
21
21
  shutdown: () => system32('shutdown.exe'),
22
22
  dism: () => system32('Dism.exe'),
23
23
  msiexec: () => system32('msiexec.exe'),
24
+ sc: () => system32('sc.exe'),
24
25
  /** The .NET Framework C# compiler that ships with Windows (C# 5). */
25
26
  csc: () => path.join(systemRoot(), 'Microsoft.NET', 'Framework64', 'v4.0.30319', 'csc.exe'),
26
27
  };
@@ -0,0 +1,29 @@
1
+ /** The release page lists no checksums: these were computed from the files on swupdate.openvpn.org (https). */
2
+ export declare const OPENVPN_MSI: {
3
+ readonly version: "2.7.8";
4
+ readonly x64: {
5
+ readonly file: "OpenVPN-2.7.8-I001-amd64.msi";
6
+ readonly sha256: "1ea61a3056905b90607d4b0f084c04e5cf3043e07cf192d9cd44b0474f29cc49";
7
+ };
8
+ readonly arm64: {
9
+ readonly file: "OpenVPN-2.7.8-I001-arm64.msi";
10
+ readonly sha256: "6fc0e8899cc5275ee297fb837bc84aa2bc49f8ef96d7ad93ee3fee1e7163a25c";
11
+ };
12
+ readonly base: "https://swupdate.openvpn.org/community/releases/";
13
+ };
14
+ /**
15
+ * WireGuard for Windows (brings wireguard.exe and wg.exe). Hashes computed from the files on download.wireguard.com
16
+ * (https); both files carry a valid WireGuard LLC signature.
17
+ */
18
+ export declare const WIREGUARD_MSI: {
19
+ readonly version: "1.1.1";
20
+ readonly x64: {
21
+ readonly file: "wireguard-amd64-1.1.1.msi";
22
+ readonly sha256: "7bfed60ad61b785c914b38b61555a975488e1d3ec472dbfb2fcdf498fca75242";
23
+ };
24
+ readonly arm64: {
25
+ readonly file: "wireguard-arm64-1.1.1.msi";
26
+ readonly sha256: "8336335c738d4aff040fa9d11b752da65a80b6f41d3262d6ba5e82f97ebd1bd4";
27
+ };
28
+ readonly base: "https://download.wireguard.com/windows-client/";
29
+ };
@@ -0,0 +1,30 @@
1
+ // The OpenVPN download entry (shared: the sandbox installs it, doctor checks that its host is reachable).
2
+ /** The release page lists no checksums: these were computed from the files on swupdate.openvpn.org (https). */
3
+ export const OPENVPN_MSI = {
4
+ version: '2.7.8',
5
+ x64: {
6
+ file: 'OpenVPN-2.7.8-I001-amd64.msi',
7
+ sha256: '1ea61a3056905b90607d4b0f084c04e5cf3043e07cf192d9cd44b0474f29cc49',
8
+ },
9
+ arm64: {
10
+ file: 'OpenVPN-2.7.8-I001-arm64.msi',
11
+ sha256: '6fc0e8899cc5275ee297fb837bc84aa2bc49f8ef96d7ad93ee3fee1e7163a25c',
12
+ },
13
+ base: 'https://swupdate.openvpn.org/community/releases/',
14
+ };
15
+ /**
16
+ * WireGuard for Windows (brings wireguard.exe and wg.exe). Hashes computed from the files on download.wireguard.com
17
+ * (https); both files carry a valid WireGuard LLC signature.
18
+ */
19
+ export const WIREGUARD_MSI = {
20
+ version: '1.1.1',
21
+ x64: {
22
+ file: 'wireguard-amd64-1.1.1.msi',
23
+ sha256: '7bfed60ad61b785c914b38b61555a975488e1d3ec472dbfb2fcdf498fca75242',
24
+ },
25
+ arm64: {
26
+ file: 'wireguard-arm64-1.1.1.msi',
27
+ sha256: '8336335c738d4aff040fa9d11b752da65a80b6f41d3262d6ba5e82f97ebd1bd4',
28
+ },
29
+ base: 'https://download.wireguard.com/windows-client/',
30
+ };
@@ -0,0 +1,18 @@
1
+ export declare const VPN_RULE_PREFIX = "AgentSandbox-VPN-";
2
+ export interface KillSwitchServer {
3
+ readonly ip: string;
4
+ readonly port: number;
5
+ readonly proto: 'udp' | 'tcp';
6
+ }
7
+ /** The rule names phase 1 and 2 may create (the servers get a number each). */
8
+ export declare function ruleNames(serverCount: number): string[];
9
+ /** Servers worth a rule: valid IPv4 addresses and ports, each endpoint once. */
10
+ export declare function cleanServers(servers: readonly KillSwitchServer[]): KillSwitchServer[];
11
+ /** Phase 1: block everything that goes out, then allow only what the tunnel and the attach channel need. */
12
+ export declare function killSwitchCommands(servers: readonly KillSwitchServer[], ptyHostExe: string | null): string[][];
13
+ /** Phase 2: everything that leaves from the tunnel's own address goes (it is inside the tunnel). */
14
+ export declare function tunnelCommands(tunnelIp: string): string[][];
15
+ /** Takes the kill switch away again: its rules go and outbound traffic is allowed by default as before. */
16
+ export declare function removeKillSwitchCommands(): string[][];
17
+ /** The tunnel's own IPv4 address from OpenVPN's log (its "net_addr_v4_add" or "ifconfig" line), or null. */
18
+ export declare function tunnelAddressFromLog(log: string): string | null;
@@ -0,0 +1,81 @@
1
+ // The kill switch as netsh argument lists (pure, so it is tested without a firewall). Phase 1 runs BEFORE the tunnel
2
+ // starts: everything that goes out is blocked except loopback, the VPN servers themselves, DHCP and the host's attach
3
+ // channel. Phase 2 runs once the tunnel is up: traffic from the tunnel's own address is allowed, which is everything
4
+ // that goes through the tunnel (DNS included). Windows keeps the block rules for private ranges
5
+ // (network.blockPrivateRanges) on top of this: a block rule always beats an allow rule.
6
+ import { isIPv4 } from '../network/firewall-rules.js';
7
+ export const VPN_RULE_PREFIX = 'AgentSandbox-VPN-';
8
+ const rule = (name, extra) => [
9
+ 'advfirewall',
10
+ 'firewall',
11
+ 'add',
12
+ 'rule',
13
+ 'name=' + VPN_RULE_PREFIX + name,
14
+ 'dir=out',
15
+ 'action=allow',
16
+ 'enable=yes',
17
+ 'profile=any',
18
+ ...extra,
19
+ ];
20
+ const drop = (name) => [
21
+ 'advfirewall',
22
+ 'firewall',
23
+ 'delete',
24
+ 'rule',
25
+ 'name=' + VPN_RULE_PREFIX + name,
26
+ ];
27
+ /** The rule names phase 1 and 2 may create (the servers get a number each). */
28
+ export function ruleNames(serverCount) {
29
+ return [
30
+ 'Loopback',
31
+ 'DHCP',
32
+ 'Host',
33
+ 'Tunnel',
34
+ ...Array.from({ length: Math.max(serverCount, 0) }, (_v, i) => 'Server-' + (i + 1)),
35
+ ];
36
+ }
37
+ /** Servers worth a rule: valid IPv4 addresses and ports, each endpoint once. */
38
+ export function cleanServers(servers) {
39
+ const seen = new Set();
40
+ return servers.filter((s) => {
41
+ const key = s.proto + ':' + s.ip + ':' + s.port;
42
+ if (!isIPv4(s.ip) || !Number.isInteger(s.port) || s.port < 1 || s.port > 65535 || seen.has(key))
43
+ return false;
44
+ seen.add(key);
45
+ return true;
46
+ });
47
+ }
48
+ /** Phase 1: block everything that goes out, then allow only what the tunnel and the attach channel need. */
49
+ export function killSwitchCommands(servers, ptyHostExe) {
50
+ const list = cleanServers(servers);
51
+ return [
52
+ ...ruleNames(Math.max(list.length, 8)).map(drop),
53
+ ['advfirewall', 'set', 'allprofiles', 'state', 'on'],
54
+ ['advfirewall', 'set', 'allprofiles', 'firewallpolicy', 'blockinbound,blockoutbound'],
55
+ rule('Loopback', ['protocol=any', 'remoteip=127.0.0.0/8']),
56
+ rule('DHCP', ['protocol=udp', 'localport=68', 'remoteport=67']),
57
+ ...(ptyHostExe ? [rule('Host', ['protocol=any', 'remoteip=LocalSubnet', 'program=' + ptyHostExe])] : []),
58
+ ...list.map((s, i) => rule('Server-' + (i + 1), ['protocol=' + s.proto, 'remoteip=' + s.ip, 'remoteport=' + s.port])),
59
+ ];
60
+ }
61
+ /** Phase 2: everything that leaves from the tunnel's own address goes (it is inside the tunnel). */
62
+ export function tunnelCommands(tunnelIp) {
63
+ if (!isIPv4(tunnelIp))
64
+ throw new Error('Not an IPv4 address: ' + tunnelIp);
65
+ return [drop('Tunnel'), rule('Tunnel', ['protocol=any', 'localip=' + tunnelIp])];
66
+ }
67
+ /** Takes the kill switch away again: its rules go and outbound traffic is allowed by default as before. */
68
+ export function removeKillSwitchCommands() {
69
+ return [
70
+ ...ruleNames(64).map(drop),
71
+ ['advfirewall', 'set', 'allprofiles', 'firewallpolicy', 'blockinbound,allowoutbound'],
72
+ ];
73
+ }
74
+ /** The tunnel's own IPv4 address from OpenVPN's log (its "net_addr_v4_add" or "ifconfig" line), or null. */
75
+ export function tunnelAddressFromLog(log) {
76
+ const add = /net_addr_v4_add:\s*(\d{1,3}(?:\.\d{1,3}){3})\/\d+/.exec(log);
77
+ if (add && isIPv4(add[1]))
78
+ return add[1];
79
+ const ifconfig = /(?:ifconfig|ip addr add|Notified TAP-Windows driver to set a DHCP IP\/netmask of)\s+(\d{1,3}(?:\.\d{1,3}){3})/i.exec(log);
80
+ return ifconfig && isIPv4(ifconfig[1]) ? ifconfig[1] : null;
81
+ }
@@ -0,0 +1,23 @@
1
+ /** Directives that run a program, load code or touch a file on this machine. Refused with a clear reason. */
2
+ export declare const PROGRAM_DIRECTIVES: readonly ["script-security", "up", "down", "up-restart", "down-pre", "route-up", "route-pre-down", "ipchange", "tls-verify", "plugin", "client-connect", "client-disconnect", "learn-address", "auth-user-pass-verify", "setenv-safe", "management", "management-client", "management-client-auth", "management-hold", "management-query-passwords", "config", "daemon", "service", "cd", "chroot", "setcon", "log", "log-append", "writepid", "status", "askpass", "engine", "bcast-dev", "dev-node", "cryptoapicert", "pkcs11-providers", "pkcs12", "http-proxy-user-pass", "tmp-dir"];
3
+ export declare const MAX_OVPN_BYTES: number;
4
+ /** Where the tunnel connects. `host` is an IPv4 address or a name. */
5
+ export interface OvpnRemote {
6
+ readonly host: string;
7
+ readonly port: number;
8
+ readonly proto: 'udp' | 'tcp';
9
+ }
10
+ export type OvpnReport = {
11
+ readonly ok: true;
12
+ readonly remotes: readonly OvpnRemote[];
13
+ } | {
14
+ readonly ok: false;
15
+ readonly problems: readonly string[];
16
+ };
17
+ /**
18
+ * Checks a profile. `ok: false` lists the problems; `ok: true` gives the servers it connects to. A profile must name at
19
+ * least one remote, and every certificate must be inside it.
20
+ */
21
+ export declare function inspectOvpn(text: string): OvpnReport;
22
+ /** The servers of a safe profile; throws, saying why, when it is not (`what` names the file or source). */
23
+ export declare function assertSafeOvpn(text: string, what: string): readonly OvpnRemote[];