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
@@ -5622,7 +5622,14 @@ var KEPT_OSC = (body) => {
5622
5622
  return n <= 2 || n === 8 || n === 133 || n === 9 && body.startsWith(number4[1] + ";4;");
5623
5623
  };
5624
5624
  var MAX_KEPT_STRING = 4096;
5625
+ var MAX_CLIPBOARD_STRING = 1024 * 1024;
5626
+ var CLIPBOARD_WRITE = /^0{0,2}52;[cpqs0-7]{0,8};[A-Za-z0-9+/=]*$/;
5625
5627
  var OutputFilter = class {
5628
+ constructor(options = {}) {
5629
+ this.options = options;
5630
+ this.maxString = options.clipboardWrites ? MAX_CLIPBOARD_STRING : MAX_KEPT_STRING;
5631
+ }
5632
+ options;
5626
5633
  /**
5627
5634
  * text: normal output; esc: after ESC; c2: after a 0xC2 lead byte; string: inside an OSC/DCS/...; stringEsc /
5628
5635
  * stringC2: a possible terminator inside one.
@@ -5630,8 +5637,14 @@ var OutputFilter = class {
5630
5637
  state = "text";
5631
5638
  /** The string being read: an OSC worth keeping is collected until its terminator; null = being dropped. */
5632
5639
  body = null;
5640
+ maxString;
5641
+ /** An OSC that may pass: a short title, link, progress or mark, or (when allowed) a clipboard write. */
5642
+ kept(body) {
5643
+ if (this.options.clipboardWrites && CLIPBOARD_WRITE.test(body)) return true;
5644
+ return body.length <= MAX_KEPT_STRING && KEPT_OSC(body);
5645
+ }
5633
5646
  push(chunk) {
5634
- const out = Buffer.allocUnsafe(chunk.length + MAX_KEPT_STRING + 8);
5647
+ const out = Buffer.allocUnsafe(chunk.length + (this.body?.length ?? 0) + 8);
5635
5648
  let n = 0;
5636
5649
  const put = (...bytes) => {
5637
5650
  for (const b of bytes) out[n++] = b;
@@ -5651,7 +5664,7 @@ var OutputFilter = class {
5651
5664
  };
5652
5665
  const endString = (terminator) => {
5653
5666
  const body = this.body && Buffer.from(this.body).toString("latin1");
5654
- if (body !== null && KEPT_OSC(body)) {
5667
+ if (body !== null && this.kept(body)) {
5655
5668
  put(27, 93);
5656
5669
  out.write(body, n, "latin1");
5657
5670
  n += body.length;
@@ -5661,7 +5674,7 @@ var OutputFilter = class {
5661
5674
  this.state = "text";
5662
5675
  };
5663
5676
  const collect = (b) => {
5664
- if (this.body && this.body.push(b) > MAX_KEPT_STRING) this.body = null;
5677
+ if (this.body && this.body.push(b) > this.maxString) this.body = null;
5665
5678
  };
5666
5679
  for (const b of chunk) {
5667
5680
  switch (this.state) {
@@ -5751,6 +5764,7 @@ var SYSTEM = {
5751
5764
  shutdown: () => system32("shutdown.exe"),
5752
5765
  dism: () => system32("Dism.exe"),
5753
5766
  msiexec: () => system32("msiexec.exe"),
5767
+ sc: () => system32("sc.exe"),
5754
5768
  /** The .NET Framework C# compiler that ships with Windows (C# 5). */
5755
5769
  csc: () => path.join(systemRoot(), "Microsoft.NET", "Framework64", "v4.0.30319", "csc.exe")
5756
5770
  };
@@ -5861,7 +5875,7 @@ function runTerminalClient(socket, token, options = {}) {
5861
5875
  return new Promise((resolve) => {
5862
5876
  let done = false;
5863
5877
  const reader = new FrameReader();
5864
- const filter = new OutputFilter();
5878
+ const filter = new OutputFilter({ clipboardWrites: options.clipboardWrites });
5865
5879
  let sent = size();
5866
5880
  let resizeTimer;
5867
5881
  let vtInput;
@@ -25665,6 +25679,9 @@ function enabled(what, markers) {
25665
25679
  function Packages(what, example) {
25666
25680
  return StringsSchema.describe(what + ", installed once and kept (e.g. " + example + ").");
25667
25681
  }
25682
+ function secret(schema) {
25683
+ return schema.meta({ secret: true });
25684
+ }
25668
25685
 
25669
25686
  // src/core/schema/config.ts
25670
25687
  var import_lodash = __toESM(require_lodash(), 1);
@@ -25733,10 +25750,18 @@ var HarnessSchema = external_exports.strictObject({
25733
25750
  uvPackage: external_exports.string().optional().describe("Python package installed with `uv tool install` inside the sandbox (e.g. aider-chat)."),
25734
25751
  uvBin: external_exports.string().optional().describe("Command the uv package provides."),
25735
25752
  arguments: StringsSchema.describe("Arguments always passed to the agent."),
25736
- environment: external_exports.record(external_exports.string(), external_exports.string()).describe("Environment variables for the agent."),
25753
+ environment: external_exports.record(external_exports.string(), secret(external_exports.string())).describe(
25754
+ "Environment variables for the agent (API keys go here). Their values are shown as *** and are handed to the sandbox in a one-shot file, never kept in the launch folder. The agent can read its own environment."
25755
+ ),
25737
25756
  home: HarnessHomeSchema.optional().describe(
25738
25757
  "Where its login lives inside the sandbox; leave out when the agent cannot be pointed at a folder (then its login is not kept between sandboxes)."
25739
25758
  ),
25759
+ localState: external_exports.record(external_exports.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/), SubfolderSchema).optional().describe(
25760
+ "Environment variable -> folder below the agent's own state folder (state\\<agent>) for SQLite databases. SQLite cannot run in a mapped folder, so the agent runs from a copy on the sandbox's disk (the variable points to it) that is copied from and back to that folder."
25761
+ ),
25762
+ bootReset: external_exports.array(SubfolderSchema).max(32).optional().describe(
25763
+ "Files and folders below the agent's own state folder (state\\<agent>) that only work on the machine that wrote them (keys sealed with Windows DPAPI, local accounts it created). Every sandbox is a new machine, so they are deleted at each boot and the agent sets them up again."
25764
+ ),
25740
25765
  resumeArguments: StringsSchema.optional().describe(
25741
25766
  "Arguments used when the agent is restarted in place (e.g. after an account switch) so it resumes the conversation."
25742
25767
  ),
@@ -25788,6 +25813,9 @@ var ClaudeProfileSchema = external_exports.strictObject({
25788
25813
  globalStateFile: external_exports.string().describe('Your .claude.json, or "auto". Empty string = do not copy.'),
25789
25814
  copyCredentials: external_exports.boolean().describe("Copy your Claude LOGIN into the sandbox. Prefer sandbox account instead."),
25790
25815
  overwrite: external_exports.boolean().describe("Refresh these settings from this PC on every launch."),
25816
+ sharePluginsAcrossAccounts: external_exports.boolean().describe(
25817
+ "When you switch Claude accounts, copy your Claude plugins (and which ones are enabled) into a data set that has none yet. Off by default: plugins are code that runs in your sessions."
25818
+ ),
25791
25819
  syncHistory: external_exports.boolean().describe("Bring conversation history in, and sync new history back (path-translated)."),
25792
25820
  historyScope: external_exports.enum(["project", "all"]).describe(
25793
25821
  `Which history comes in: "project" = only the projects in this sandbox (other projects' conversations, file backups and prompts stay on this PC), "all" = everything. Only this sandbox's projects ever sync back.`
@@ -25811,6 +25839,9 @@ var MappingSchema = external_exports.strictObject({
25811
25839
  optional: external_exports.boolean().optional().describe("true = skip it quietly when the host folder does not exist.")
25812
25840
  });
25813
25841
  var SandboxSchema = external_exports.strictObject({
25842
+ engine: external_exports.enum(["windows-sandbox", "hcs"]).describe(
25843
+ '(alpha) What runs the sandbox. "windows-sandbox" = Windows Sandbox (the default: desktop, Windows Terminal, GPU, clipboard, audio, printers). "hcs" = a headless Hyper-V isolated Server Core container for agents (no desktop, GPU or clipboard); it needs Windows features and an image on this PC (sandbox engine check hcs lists what is missing), and starting it is not enabled yet in this alpha. sandbox engine shows what each engine can do. Yours only: a project file (.sandbox-config.json) cannot set it.'
25844
+ ),
25814
25845
  memoryMb: external_exports.union([external_exports.literal("auto"), external_exports.number().int().min(2048)]).describe('Sandbox RAM in MB (>= 2048), or "auto": free RAM minus reserveHostMb, capped at maxMemoryMb.'),
25815
25846
  maxMemoryMb: external_exports.number().int().positive().describe('Upper limit for memoryMb "auto".'),
25816
25847
  maxMemoryPercent: external_exports.number().int().min(10).max(100).describe(`memoryMb "auto" never takes more than this share of this PC's total RAM (percent).`),
@@ -25820,10 +25851,22 @@ var SandboxSchema = external_exports.strictObject({
25820
25851
  pageFileMb: external_exports.number().int().min(0).max(262144).describe(
25821
25852
  `Size of the sandbox's paging file in MB, created at full size when it starts so it never grows while builds run (8 GB of its disk always stays free). Windows Sandbox starts with about 1 GB: parallel builds then fail with "The paging file is too small", and Windows grows the file under load. 0 = leave Windows' own.`
25822
25853
  ),
25823
- reserveHostMb: external_exports.number().int().nonnegative().describe('RAM always left for this PC when memoryMb is "auto".'),
25824
- vGpu: external_exports.boolean().describe("Virtual GPU. Off by default: Microsoft notes it widens the sandbox attack surface."),
25854
+ reserveHostMb: external_exports.number().int().nonnegative().describe(
25855
+ 'Memory always left for this PC when memoryMb is "auto": the sandbox gets at most (free RAM, and RAM plus paging file still unused) minus this.'
25856
+ ),
25857
+ agentMemoryHeadroomMb: external_exports.union([external_exports.literal("auto"), external_exports.literal("none"), external_exports.number().int().min(0)]).describe(
25858
+ 'Memory kept out of the agents reach inside the sandbox, in MB: everything the agents start (their builds, tests, tools) together may use at most the sandbox memory minus this; a runaway parallel build then gets out-of-memory errors in its own session instead of freezing or crashing the whole sandbox. "auto" = the larger of 2048 MB and 10 % of the sandbox memory; "none" = no limit. Yours only: a project file cannot change it.'
25859
+ ),
25860
+ pressureResponse: external_exports.boolean().describe(
25861
+ "When the sandbox (or this PC) runs low on memory, slow the heaviest build programs down (lower priority) and, if that is not enough, pause the biggest compiler for a few seconds at a time, so heavy parallel builds slow down instead of closing the sandbox. Never touches the agents themselves. Yours only: a project file cannot change it."
25862
+ ),
25863
+ vGpu: external_exports.boolean().describe(
25864
+ "Virtual GPU. Off by default: Microsoft notes it widens the sandbox attack surface. The sandbox then uses this PC's graphics card, and with some graphics drivers heavy use can freeze the whole PC: turn it on only when a program in the sandbox needs the GPU (the mesa toolchain gives software OpenGL without it)."
25865
+ ),
25825
25866
  networking: external_exports.boolean().describe("Internet access. false is the only hard network isolation Windows Sandbox offers."),
25826
- clipboard: external_exports.boolean().describe("Shared clipboard between this PC and the sandbox."),
25867
+ clipboard: external_exports.boolean().describe(
25868
+ "Shared clipboard between this PC and the sandbox. Also lets an agent's copy (in sandbox attach) reach this PC's clipboard."
25869
+ ),
25827
25870
  audioInput: external_exports.boolean().describe("Microphone access."),
25828
25871
  videoInput: external_exports.boolean().describe("Camera access."),
25829
25872
  printerRedirection: external_exports.boolean().describe("Printers from this PC."),
@@ -25864,7 +25907,10 @@ var NetworkSchema = external_exports.strictObject({
25864
25907
  "Reach servers in the sandbox from this PC: http://localhost:<pc> here goes to <sandbox> inside, while it runs. Nothing else on your network can use them."
25865
25908
  ),
25866
25909
  dns: external_exports.array(external_exports.string().regex(/^\d{1,3}(\.\d{1,3}){3}$/, "an IPv4 address like 1.1.1.1")).describe("DNS servers for the sandbox instead of your network's, e.g. 1.1.1.1 and 9.9.9.9."),
25867
- proxy: external_exports.string().regex(/^(https?:\/\/[^\s]+)?$/, "http://host:port").describe(
25910
+ proxy: external_exports.string().regex(/^(https?:\/\/[^\s]+)?$/, "http://host:port").refine(
25911
+ (v) => !/^https?:\/\/[^/?#]*@/i.test(v),
25912
+ "no user name or password in the address (it would be stored in plain text and visible to the agent): use a proxy that needs no login"
25913
+ ).describe(
25868
25914
  "An HTTP proxy the sandbox uses to reach the internet (HTTP_PROXY / HTTPS_PROXY for everything in it), e.g. http://proxy.corp:8080. Empty = none."
25869
25915
  )
25870
25916
  });
@@ -26266,6 +26312,17 @@ var APPS = [
26266
26312
  exe: "lazygit.exe",
26267
26313
  cli: true
26268
26314
  },
26315
+ {
26316
+ id: "jj",
26317
+ name: "Jujutsu (jj)",
26318
+ category: "git",
26319
+ about: "Git-compatible version control; conflicts do not block a rebase. Pilot, untested with worktrees.",
26320
+ size: "10 MB",
26321
+ source: gh("jj-vcs/jj", "^jj-v[\\d.]+-x86_64-pc-windows-msvc\\.zip$"),
26322
+ exe: "jj.exe",
26323
+ cli: true,
26324
+ fullGitOnly: true
26325
+ },
26269
26326
  // ---- utilities
26270
26327
  {
26271
26328
  id: "7zip",
@@ -26794,6 +26851,26 @@ var APPS = [
26794
26851
  source: gh("gitleaks/gitleaks", "^gitleaks_[\\d.]+_windows_x64\\.zip$"),
26795
26852
  exe: "gitleaks.exe",
26796
26853
  cli: true
26854
+ },
26855
+ {
26856
+ id: "ast-grep",
26857
+ name: "ast-grep",
26858
+ category: "cli",
26859
+ about: "Search and rewrite code by its syntax tree (ast-grep, sg); prints only the matches.",
26860
+ size: "15 MB",
26861
+ source: gh("ast-grep/ast-grep", "^app-x86_64-pc-windows-msvc\\.zip$"),
26862
+ exe: "ast-grep.exe",
26863
+ cli: true
26864
+ },
26865
+ {
26866
+ id: "rust-analyzer",
26867
+ name: "rust-analyzer",
26868
+ category: "cli",
26869
+ about: "Rust language server: type errors and go-to-definition without cargo (for editors and the Claude LSP plugin).",
26870
+ size: "18 MB",
26871
+ source: gh("rust-lang/rust-analyzer", "^rust-analyzer-x86_64-pc-windows-msvc\\.zip$"),
26872
+ exe: "rust-analyzer.exe",
26873
+ cli: true
26797
26874
  }
26798
26875
  ];
26799
26876
 
@@ -26862,6 +26939,33 @@ var ResumeSchema = external_exports.strictObject({
26862
26939
  )
26863
26940
  });
26864
26941
 
26942
+ // src/core/schema/web.ts
26943
+ var WebSchema = external_exports.strictObject({
26944
+ enabled: external_exports.boolean().describe(
26945
+ "(Beta) Allow the web UI: your sandbox sessions in a browser on this PC. Off by default, and nothing starts it by itself yet: sandbox web start works either way and runs it until sandbox web stop (or a restart of the PC)."
26946
+ ),
26947
+ port: external_exports.number().int().min(1024).max(65535).describe("Port of the web UI on 127.0.0.1 (this PC only). Pick another when it is taken.")
26948
+ });
26949
+
26950
+ // src/core/schema/vpn.ts
26951
+ var VPN_PROVIDERS = ["nordvpn", "openvpn-file", "wireguard-file"];
26952
+ var VpnSchema = external_exports.strictObject({
26953
+ enabled: external_exports.boolean().describe(
26954
+ "Send the sandbox's traffic through a VPN. Only the sandbox: your PC's own connection is untouched. Needs a saved login first (sandbox vpn login). The agent in the sandbox can read that login and can turn the tunnel off (it is the administrator there)."
26955
+ ),
26956
+ provider: external_exports.enum(VPN_PROVIDERS).describe(
26957
+ "nordvpn: a recommended NordVPN server is picked at every launch. openvpn-file: your own .ovpn file (configFile). wireguard-file: your own WireGuard .conf (configFile), e.g. from your company."
26958
+ ),
26959
+ protocol: external_exports.enum(["udp", "tcp"]).describe("udp is faster; tcp gets through networks that block udp."),
26960
+ country: external_exports.string().regex(/^([A-Za-z][A-Za-z .'-]{0,39})?$/, "a country name or code like uk or Germany").describe("nordvpn: the country of the server, e.g. uk, us or Germany. Empty = the best server anywhere."),
26961
+ configFile: external_exports.string().describe(
26962
+ "openvpn-file / wireguard-file: the .ovpn or .conf file on this PC (an .ovpn has its certificates inside it). Files that run programs (script-security, up, down, plugin, PostUp ...) are refused. A WireGuard file holds your private key: it is read when a sandbox starts and handed over in a one-shot file. A project's file can never set this."
26963
+ ),
26964
+ killSwitch: external_exports.boolean().describe(
26965
+ "Block all traffic that does not go through the tunnel: when the tunnel cannot start, the sandbox stays offline instead of using your normal connection. A project can only turn this on, never off."
26966
+ )
26967
+ });
26968
+
26865
26969
  // src/core/schema/config.ts
26866
26970
  var ConfigSchema = external_exports.strictObject({
26867
26971
  $schema: SchemaRefSchema.optional(),
@@ -26874,17 +26978,24 @@ var ConfigSchema = external_exports.strictObject({
26874
26978
  sandbox: SandboxSchema,
26875
26979
  sharing: SharingSchema,
26876
26980
  storage: external_exports.strictObject({
26877
- root: external_exports.string().min(1).describe("Where everything is kept on this PC (tools, databases, logins, launches)."),
26981
+ root: external_exports.string().min(1).describe(
26982
+ "Where everything is kept on this PC (tools, databases, logins, launches). The default is a private folder for you under %ProgramData%\\AgentSandbox\\users, which works for installs for one user and for everyone. sandbox storage move <folder> moves it."
26983
+ ),
26878
26984
  persistAgentState: external_exports.boolean().describe("Keep agent logins and history between sandboxes."),
26879
26985
  dataName: NameSchema.describe("Name of the persistent data set (C:\\AgentData) shared by all workspaces."),
26880
26986
  markSandboxFiles: external_exports.boolean().describe(
26881
26987
  `Programs and scripts (.exe, .ps1, .bat, .cmd, .msi, .lnk ...) that appear or change in your project while a sandbox runs get Windows' "downloaded from the internet" mark, so SmartScreen and PowerShell ask before they run on this PC.`
26882
26988
  ),
26989
+ contained: external_exports.enum(["off", "vhdx"]).describe(
26990
+ '(beta) Keep the sandbox tools, state and logs inside one disk image file (vhdx) instead of loose folders, so scanning programs on this PC see one file. Not yet tried on a real PC. Turn it on with sandbox storage contained on (it moves your files and asks first); Windows asks for permission to mount the image when a sandbox starts. "off" = loose folders, as always. Yours only: a project file (.sandbox-config.json) cannot set it.'
26991
+ ),
26992
+ containedMaxGb: external_exports.number().int().min(8).max(4096).describe("(beta) Largest size, in GB, the disk image of storage.contained may grow to."),
26883
26993
  warnDataGb: external_exports.number().min(0).describe(
26884
26994
  "Say at launch when the persisted data (tools, databases, logins) is bigger than this many GB; 0 = never. sandbox data shows what takes the space."
26885
26995
  )
26886
26996
  }),
26887
26997
  network: NetworkSchema,
26998
+ vpn: VpnSchema,
26888
26999
  provisioning: ProvisioningSchema,
26889
27000
  downloads: DownloadsSchema,
26890
27001
  toolchains: ToolchainsSchema,
@@ -26892,6 +27003,7 @@ var ConfigSchema = external_exports.strictObject({
26892
27003
  "Databases running inside the sandbox. Data persists in C:\\AgentData\\databases; each one starts at boot."
26893
27004
  ),
26894
27005
  attach: AttachSchema,
27006
+ web: WebSchema,
26895
27007
  agentCommands: AgentCommandsSchema,
26896
27008
  secrets: SecretsSchema,
26897
27009
  personalization: toggle("Copy your desktop look (theme, accent, taskbar, wallpaper, ...) into the sandbox."),
@@ -26921,9 +27033,17 @@ var LocalOverridesSchema = external_exports.strictObject({
26921
27033
  "Scripts (.ps1 / .mjs / .cmd, relative to this file) run inside the sandbox before the agent."
26922
27034
  ),
26923
27035
  // This PC's resources are yours to share: CPU and paging file (this PC's disk) are not a project's to set.
26924
- sandbox: SandboxSchema.omit({ cpuLimit: true, pageFileMb: true }).partial(),
27036
+ sandbox: SandboxSchema.omit({
27037
+ cpuLimit: true,
27038
+ pageFileMb: true,
27039
+ engine: true,
27040
+ agentMemoryHeadroomMb: true,
27041
+ pressureResponse: true
27042
+ }).partial(),
26925
27043
  // A project may block more (the LAN, hosts); it never opens hosts, ports, DNS or a proxy.
26926
27044
  network: NetworkSchema.pick({ blockPrivateRanges: true, blockHosts: true }).partial(),
27045
+ // A project may turn the kill switch on, never off, and never choose a VPN, a server, a file or a login.
27046
+ vpn: VpnSchema.pick({ killSwitch: true }).partial(),
26927
27047
  provisioning: ProvisioningSchema.pick({ copyFromHost: true, fallbackToInstall: true, refresh: true }).extend({ git: GitSchema.partial(), terminal: toggle("Windows Terminal as the sandbox window.").partial() }).partial(),
26928
27048
  downloads: DownloadsSchema.partial(),
26929
27049
  // Every toolchain setting, each one optional (a project usually only switches languages on or pins a version).
@@ -27028,8 +27148,34 @@ var GuestRequestSchema = external_exports.discriminatedUnion("kind", [
27028
27148
  cwd: Text().optional(),
27029
27149
  createdAt: TimeSchema
27030
27150
  }),
27031
- external_exports.strictObject({ kind: external_exports.literal("ping"), id: IdSchema, createdAt: TimeSchema })
27151
+ external_exports.strictObject({ kind: external_exports.literal("ping"), id: IdSchema, createdAt: TimeSchema }),
27152
+ /**
27153
+ * The PC's own memory or CPU is running low (the host watchdog): the sandbox slows its heaviest builds down for
27154
+ * `seconds` (it never stops them) so Windows does not have to close it. Repeated while the PC stays low.
27155
+ */
27156
+ external_exports.strictObject({
27157
+ kind: external_exports.literal("pressure"),
27158
+ id: IdSchema,
27159
+ reason: Text(300),
27160
+ seconds: external_exports.number().int().min(10).max(300),
27161
+ createdAt: TimeSchema
27162
+ })
27032
27163
  ]);
27164
+ var PressureStatusSchema = external_exports.object({
27165
+ level: external_exports.enum(["ok", "throttled", "suspending"]),
27166
+ profile: external_exports.enum(["normal", "gentle"]),
27167
+ /** Share of the sandbox's RAM still free and of its commit limit in use (percent). */
27168
+ ramFreePercent: external_exports.number().int().min(0).max(100),
27169
+ commitPercent: external_exports.number().int().min(0).max(100),
27170
+ /** Programs running at lower priority because of it. */
27171
+ lowered: external_exports.number().int().min(0).max(1024),
27172
+ /** Programs paused right now (name, process id, seconds left). */
27173
+ paused: external_exports.array(external_exports.object({ name: Text(64), pid: external_exports.number().int(), seconds: external_exports.number().int().min(0).max(60) })).max(8),
27174
+ /** The PC itself asked for slowing down (its memory or CPU is low). */
27175
+ pcLow: external_exports.boolean(),
27176
+ lastAction: Text(300),
27177
+ updatedAt: TimeSchema
27178
+ });
27033
27179
  var GuestResponseSchema = external_exports.object({
27034
27180
  id: IdSchema,
27035
27181
  ok: external_exports.boolean(),
@@ -27064,6 +27210,16 @@ var ProjectStatusSchema = external_exports.object({
27064
27210
  databases: external_exports.array(external_exports.object({ database: Text(32), port: external_exports.number().int() })).max(16),
27065
27211
  summary: external_exports.array(Text(512)).max(64)
27066
27212
  });
27213
+ var VpnStatusSchema = external_exports.object({
27214
+ state: external_exports.enum(["off", "starting", "up", "failed"]),
27215
+ message: Text(2e3),
27216
+ killSwitch: external_exports.boolean(),
27217
+ /** The server's name, e.g. uk2201.nordvpn.com. */
27218
+ server: Text(128).optional(),
27219
+ /** What the sandbox's traffic looks like from outside, once the tunnel is up. */
27220
+ publicIp: Text(64).optional(),
27221
+ updatedAt: TimeSchema
27222
+ });
27067
27223
 
27068
27224
  // src/shared/io/json.ts
27069
27225
  import fs2 from "node:fs";
@@ -27100,20 +27256,28 @@ var scan = (schema, dir) => {
27100
27256
  var RunDir = class {
27101
27257
  root;
27102
27258
  sandboxFile;
27259
+ vpnFile;
27260
+ /** What the memory governor in the sandbox is doing (pressure.json). */
27261
+ pressureFile;
27103
27262
  requestsDir;
27104
27263
  responsesDir;
27105
27264
  sessionsDir;
27106
27265
  projectsDir;
27107
27266
  /** audit.processes: programs the sandbox started, in small .jsonl files the host takes in and deletes. */
27108
27267
  auditDir;
27268
+ /** One-shot secrets the host hands over (see secrets.ts). Next to run, not in it: shared-use users can change run. */
27269
+ secretsDir;
27109
27270
  constructor(dataDir2) {
27110
27271
  this.root = path3.join(dataDir2, "run");
27111
27272
  this.sandboxFile = path3.join(this.root, "sandbox.json");
27273
+ this.vpnFile = path3.join(this.root, "vpn.json");
27274
+ this.pressureFile = path3.join(this.root, "pressure.json");
27112
27275
  this.requestsDir = path3.join(this.root, "requests");
27113
27276
  this.responsesDir = path3.join(this.root, "responses");
27114
27277
  this.sessionsDir = path3.join(this.root, "sessions");
27115
27278
  this.projectsDir = path3.join(this.root, "projects");
27116
27279
  this.auditDir = path3.join(this.root, "audit");
27280
+ this.secretsDir = path3.join(dataDir2, "secrets");
27117
27281
  }
27118
27282
  requestFile(id) {
27119
27283
  return path3.join(this.requestsDir, safeId(id) + ".json");
@@ -27127,9 +27291,18 @@ var RunDir = class {
27127
27291
  projectFile(name) {
27128
27292
  return path3.join(this.projectsDir, safeId(name) + ".json");
27129
27293
  }
27294
+ secretFile(id) {
27295
+ return path3.join(this.secretsDir, safeId(id) + ".json");
27296
+ }
27130
27297
  readSandboxStatus() {
27131
27298
  return readValid(SandboxStatusSchema, this.sandboxFile);
27132
27299
  }
27300
+ readVpnStatus() {
27301
+ return readValid(VpnStatusSchema, this.vpnFile);
27302
+ }
27303
+ readPressure() {
27304
+ return readValid(PressureStatusSchema, this.pressureFile);
27305
+ }
27133
27306
  readSession(id) {
27134
27307
  return readValid(SessionStatusSchema, this.sessionFile(id));
27135
27308
  }
@@ -27188,7 +27361,7 @@ async function viewSession(id) {
27188
27361
  return 1;
27189
27362
  }
27190
27363
  const socket = await connect({ ...session.attach, addresses: ["127.0.0.1"] });
27191
- const result = await runTerminalClient(socket, session.attach.token);
27364
+ const result = await runTerminalClient(socket, session.attach.token, { clipboardWrites: true });
27192
27365
  if (result.reason === "exit") console.log(session.harness + " exited with code " + result.exitCode + ".");
27193
27366
  else if (result.reason === "error") console.log("Session error: " + result.message);
27194
27367
  return result.reason === "exit" ? result.exitCode : 1;
@@ -32,6 +32,46 @@ export const accountsSuite = {
32
32
  stateAfter.other === 1 &&
33
33
  new AccountStore(storage).activeFor(dataA) === 'work', 'switching swaps in the other credentials and account, keeps the rest of the sandbox state, and marks it active');
34
34
  t.includes(JSON.stringify(new AccountStore(storage).read('personal')?.credentials), 'personal-2', "the outgoing account's refreshed tokens are saved back before switching");
35
+ t.section('sharing plugins between data sets');
36
+ const plugA = path.join(storage, 'data', 'p1', 'state', 'claude');
37
+ const plugB = path.join(storage, 'data', 'p2', 'state', 'claude');
38
+ const plugC = path.join(storage, 'data', 'p3', 'state', 'claude');
39
+ const login = '{"claudeAiOauth":{"refreshToken":"x"}}';
40
+ for (const dir of [plugA, plugB, plugC])
41
+ t.write(path.join(dir, '.credentials.json'), login);
42
+ t.write(path.join(plugA, 'plugins', 'installed_plugins.json'), '{"version":2,"plugins":{}}');
43
+ t.write(path.join(plugA, 'plugins', 'cache', 'm', 'p', 'a.js'), 'x');
44
+ t.write(path.join(plugA, 'settings.json'), '{"theme":"dark","enabledPlugins":{"p@m":true}}');
45
+ t.write(path.join(plugB, 'settings.json'), '{"theme":"light","enabledPlugins":{"q@m":false}}');
46
+ const dataP = (n) => path.join(storage, 'data', n);
47
+ const off = new AccountStore(storage);
48
+ off.save(dataP('p1'), 'one', null);
49
+ off.activate(dataP('p2'), 'one');
50
+ t.check(!fs.existsSync(path.join(plugB, 'plugins')), 'plugins are not copied when the setting is off (default)');
51
+ const on = new AccountStore(storage, true);
52
+ on.activate(dataP('p1'), 'one');
53
+ on.activate(dataP('p2'), 'one');
54
+ const settingsB = f.readJson(path.join(plugB, 'settings.json'));
55
+ t.check(fs.existsSync(path.join(plugB, 'plugins', 'cache', 'm', 'p', 'a.js')) &&
56
+ settingsB.theme === 'light' &&
57
+ settingsB.enabledPlugins['p@m'] === true &&
58
+ settingsB.enabledPlugins['q@m'] === false &&
59
+ !fs.existsSync(path.join(storage, 'accounts', 'shared-plugins', '.credentials.json')), 'on: plugins and enabledPlugins reach the other data set; its own settings win and no login travels');
60
+ t.write(path.join(plugC, 'plugins', 'installed_plugins.json'), '{}');
61
+ const outside = t.dir('plugin-victim');
62
+ t.write(path.join(outside, 'secret.txt'), 's');
63
+ fs.symlinkSync(outside, path.join(plugC, 'plugins', 'cache'), 'junction');
64
+ on.activate(dataP('p3'), 'one');
65
+ t.check((on.pluginNote ?? '').includes('link') &&
66
+ !fs.existsSync(path.join(storage, 'accounts', 'shared-plugins', 'plugins', 'cache', 'secret.txt')), 'a link in the plugins is refused (the switch still works) and nothing behind it is copied');
67
+ const dataQ = dataP('p4');
68
+ const plugQ = path.join(dataQ, 'state', 'claude');
69
+ t.write(path.join(plugQ, 'plugins', 'installed_plugins.json'), '{"version":2}');
70
+ t.write(path.join(plugQ, 'plugins', 'cache', 'new.js'), 'n');
71
+ on.syncPlugins(dataQ);
72
+ const plugR = path.join(storage, 'data', 'p5', 'state', 'claude');
73
+ on.syncPlugins(dataP('p5'));
74
+ t.check(fs.existsSync(path.join(plugR, 'plugins', 'cache', 'new.js')), 'launch-time refresh: plugins installed in one data set reach the shared set and the next empty data set');
35
75
  t.section('removing and refusing');
36
76
  new AccountStore(storage).setDefault('work');
37
77
  new AccountStore(storage).remove('work');
@@ -0,0 +1,2 @@
1
+ import type { Suite } from './support/suite.js';
2
+ export declare const agentPathsSuite: Suite;
@@ -0,0 +1,125 @@
1
+ // Agent commands in every terminal, SQLite folders of agents, and the PATH rules (planner, rebuild, shell start-up).
2
+ import { spawnSync } from 'node:child_process';
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { DEFAULTS, mergeConfig, validateConfig } from '../core/config/index.js';
6
+ import { isWin } from '../core/util/index.js';
7
+ import { SYSTEM } from '../shared/system.js';
8
+ import { agentCommand, agentShims, bootResetPaths, isCopyableDatabaseFile, isDatabaseFile, localStateEntries, shimText, } from '../guest/agents/agent-files.js';
9
+ import { appendMissing, expandVars, isPinnedNodeDir, parseRegPath, pathKey, planPath, rebuildPath, splitPath, } from '../guest/setup/path-plan.js';
10
+ import { withReloadEnvironment } from '../host/tools/index.js';
11
+ import { HarnessSchema } from '../core/schema/index.js';
12
+ export const agentPathsSuite = {
13
+ name: 'agent-paths',
14
+ title: 'agent commands, agent SQLite folders and PATH rules',
15
+ run: (t) => {
16
+ t.section('agent commands');
17
+ const tools = 'C:\\AgentData\\tools';
18
+ const shims = agentShims(tools, DEFAULTS.harnesses);
19
+ const codex = shims.find((s) => s.name === 'codex');
20
+ t.equal(codex?.command, 'codex', 'codex is typed as codex');
21
+ t.equal(codex?.target, tools + '\\agents\\codex\\codex.cmd', 'an npm agent runs its .cmd');
22
+ t.equal(shims.find((s) => s.name === 'claude')?.target, tools + '\\agents\\claude\\claude.exe', 'claude runs its .exe');
23
+ t.check(shims.length === Object.keys(DEFAULTS.harnesses).length, 'every built-in agent gets a command');
24
+ t.equal(agentCommand('aider', DEFAULTS.harnesses.aider), 'aider', 'a uv agent is typed as its uv command');
25
+ const text = shimText(codex, { node: 'C:\\n\\node.exe', script: 'C:\\r\\agent.js' });
26
+ t.check(text.includes('\r\n') && text.includes('install codex') && text.endsWith('%*\r\n'), 'the command installs on first use');
27
+ t.check(text.includes('if exist "%SBX_REAL%" goto run'), 'an installed agent starts at once');
28
+ t.equal(agentShims(tools, { 'bad name': DEFAULTS.harnesses.codex }).length, 0, 'an agent name that is not a plain word gets no command file');
29
+ t.section('agent SQLite folders');
30
+ t.equal(DEFAULTS.harnesses.codex.localState, { CODEX_SQLITE_HOME: 'sqlite' }, 'codex runs its databases locally');
31
+ const entries = localStateEntries(DEFAULTS.harnesses, 'C:\\AgentData\\state', 'C:\\nvm\\agent-state');
32
+ t.equal(entries.map((e) => [e.agent, e.env, e.store, e.local, e.processes[0]]), [
33
+ [
34
+ 'codex',
35
+ 'CODEX_SQLITE_HOME',
36
+ 'C:\\AgentData\\state\\codex\\sqlite',
37
+ 'C:\\nvm\\agent-state\\codex\\sqlite',
38
+ 'codex.exe',
39
+ ],
40
+ ], 'saved copy in the state folder, working copy on the sandbox disk');
41
+ // A user's own harnesses.codex is merged over the built-in one: fields it leaves out (localState) stay.
42
+ const { localState: _omitted, ...pinned } = DEFAULTS.harnesses.codex;
43
+ const merged = (harnesses) => validateConfig(mergeConfig(DEFAULTS, { harnesses }), 'test').harnesses;
44
+ t.equal([
45
+ merged({ codex: { npmPackage: '@openai/codex@0.9.0' } }).codex.localState,
46
+ merged({ codex: pinned }).codex.localState,
47
+ ], [{ CODEX_SQLITE_HOME: 'sqlite' }, { CODEX_SQLITE_HOME: 'sqlite' }], 'a customized or pinned built-in agent keeps localState from the defaults');
48
+ t.check(HarnessSchema.safeParse({ ...DEFAULTS.harnesses.codex, localState: { X: '..\\up' } }).success === false, 'a local state folder cannot leave the agent state folder');
49
+ t.equal(['state_5.sqlite', 'x.sqlite-wal', 'x.sqlite-shm', 'a.db', 'auth.json'].map(isDatabaseFile), [true, true, true, true, false], 'database files are told apart');
50
+ t.equal(['state_5.sqlite', 'x.sqlite-wal', 'x.sqlite-shm'].map(isCopyableDatabaseFile), [true, true, false], 'the -shm file is not copied (SQLite rebuilds it)');
51
+ t.section('agent files sealed to the last sandbox');
52
+ t.equal(bootResetPaths(DEFAULTS.harnesses, 'C:\\AgentData\\state')
53
+ .filter((p) => p.agent === 'codex')
54
+ .map((p) => p.path), [
55
+ 'C:\\AgentData\\state\\codex\\.sandbox-secrets',
56
+ 'C:\\AgentData\\state\\codex\\.sandbox\\setup_marker.json',
57
+ 'C:\\AgentData\\state\\codex\\.sandbox\\deny_read_acl_state.json',
58
+ ], "codex's DPAPI-sealed sandbox users and setup marker are removed at boot (CryptUnprotectData otherwise)");
59
+ t.check(HarnessSchema.safeParse({ ...DEFAULTS.harnesses.codex, bootReset: ['..\\login'] }).success === false &&
60
+ HarnessSchema.safeParse({ ...DEFAULTS.harnesses.codex, bootReset: ['C:\\Windows'] }).success === false, 'bootReset takes only plain paths below the agent state folder');
61
+ t.section('PATH planner');
62
+ const present = new Set(['c:\\a', 'c:\\b', 'c:\\c\\d', 'c:\\nvm\\v24.1.0']);
63
+ const exists = (f) => present.has(pathKey(f));
64
+ t.equal(planPath({ entries: ['C:\\A\\;c:\\b', 'C:\\a', 'C:\\missing;"C:\\C\\D"', '', 'c:/B'], exists }), ['C:\\A\\', 'c:\\b', 'C:\\C\\D'], 'ordered, no duplicates (case, slash, quotes), no missing folders');
65
+ t.equal(planPath({ entries: ['C:\\a;C:\\nvm\\v24.1.0'], exists, drop: (f) => isPinnedNodeDir(f, 'C:\\NVM') }), ['C:\\a'], 'a pinned node version is never machine-wide');
66
+ t.check(isPinnedNodeDir('C:\\nvm\\v24.1.0\\', 'C:\\nvm') && !isPinnedNodeDir('C:\\nvm', 'C:\\nvm'), 'only versions are pinned');
67
+ t.equal(pathKey('C:\\'), 'c:\\', 'a drive root keeps its slash');
68
+ t.equal(splitPath(' "C:\\a" ;; C:\\b;'), ['C:\\a', 'C:\\b'], 'splitting drops empty parts and quotes');
69
+ t.equal(expandVars('%SystemRoot%\\x;%nope%', { SYSTEMROOT: 'C:\\W' }), 'C:\\W\\x;%nope%', 'variables expand in any case');
70
+ t.equal(appendMissing('C:\\a;C:\\b', 'c:\\B;C:\\n;C:\\skip', (f) => f === 'C:\\skip'), 'C:\\a;C:\\b;C:\\n', 'missing folders go last');
71
+ t.equal(rebuildPath({
72
+ machine: 'C:\\a\\;%SystemRoot%;C:\\b',
73
+ user: 'c:\\B;C:\\u',
74
+ process: 'C:\\only;C:\\A;C:\\AgentData\\tools\\node',
75
+ env: { SystemRoot: 'C:\\Windows' },
76
+ skip: (f) => pathKey(f) === 'c:\\agentdata\\tools\\node',
77
+ }), 'C:\\only;C:\\a\\;C:\\Windows;C:\\b;C:\\u', 'a new shell: process-only entries first, then the registry, no duplicates, no runner node');
78
+ t.equal(parseRegPath('\r\nHKEY_LOCAL_MACHINE\\X\r\n Path REG_EXPAND_SZ C:\\a;%SystemRoot%\r\n\r\n'), 'C:\\a;%SystemRoot%', 'reg query output is parsed');
79
+ t.equal(parseRegPath('ERROR: nothing'), '', 'no Path value is an empty PATH');
80
+ t.section('Windows Terminal reloads the environment');
81
+ t.equal(withReloadEnvironment({ compatibility: { reloadEnvironmentVariables: true } }), null, 'already set: unchanged');
82
+ t.equal(withReloadEnvironment({ theme: 'dark', compatibility: { other: 1 } })?.compatibility, { other: 1, reloadEnvironmentVariables: true }, 'set without touching the rest of compatibility');
83
+ if (!isWin)
84
+ return;
85
+ t.section('shell start-up (pathsync.exe and the start-up files)');
86
+ const dir = t.at('pathsync');
87
+ const exe = path.join(dir, 'pathsync.exe');
88
+ fs.mkdirSync(dir, { recursive: true });
89
+ const csc = spawnSync(SYSTEM.csc(), ['/nologo', '/out:' + exe, path.join(t.packageRoot, 'sandbox', 'csharp', 'PathSync.cs')], { encoding: 'utf8', windowsHide: true });
90
+ t.check(csc.status === 0, 'PathSync.cs compiles', csc.stdout);
91
+ if (csc.status !== 0)
92
+ return;
93
+ const sync = spawnSync(exe, [
94
+ '--machine',
95
+ 'C:\\a\\;%SystemRoot%;C:\\b',
96
+ '--user',
97
+ 'c:\\B;C:\\u',
98
+ '--process',
99
+ 'C:\\only;C:\\A;C:\\AgentData\\tools\\node',
100
+ ], { encoding: 'utf8', windowsHide: true, env: { ...process.env, AGENT_TOOLS: 'C:\\AgentData\\tools' } });
101
+ t.equal(sync.stdout, 'C:\\only;C:\\a\\;' + (process.env.SystemRoot ?? 'C:\\Windows') + ';C:\\b;C:\\u', 'pathsync.exe follows the same rules');
102
+ const root = t.at('shell-root');
103
+ const install = spawnSync(SYSTEM.powershell(), [
104
+ '-NoLogo',
105
+ '-NoProfile',
106
+ '-ExecutionPolicy',
107
+ 'Bypass',
108
+ '-File',
109
+ path.join(t.packageRoot, 'sandbox', 'scripts', 'install-shell-path.ps1'),
110
+ '-Helper',
111
+ exe,
112
+ '-Root',
113
+ root,
114
+ ], { encoding: 'utf8', windowsHide: true });
115
+ t.check(install.status === 0, 'install-shell-path.ps1 runs (to a temp folder, no registry)', install.stderr);
116
+ const cmdFile = path.join(dir, 'shell-path.cmd');
117
+ // Quotes and & in the command line of cmd /c must not run the script again (that once looped for ever).
118
+ const nested = spawnSync(SYSTEM.cmd(), ['/d', '/c', 'echo "a & b" & call "' + cmdFile + '" && echo guard-ok'], {
119
+ encoding: 'utf8',
120
+ windowsHide: true,
121
+ windowsVerbatimArguments: true,
122
+ });
123
+ t.check(nested.stdout.includes('guard-ok') && !nested.stdout.includes('RECURSION'), 'the cmd start-up file leaves `cmd /c` alone');
124
+ },
125
+ };
@@ -0,0 +1,2 @@
1
+ import type { Suite } from './support/suite.js';
2
+ export declare const appSuite: Suite;