windows-development-sandbox 1.18.4 → 1.23.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 (438) hide show
  1. package/README.md +1 -1
  2. package/config.example.json +17 -1
  3. package/dist/app/features/access/access.def.js +5 -2
  4. package/dist/app/features/access/access.run.js +7 -3
  5. package/dist/app/features/accounts/accounts.def.d.ts +33 -1
  6. package/dist/app/features/accounts/accounts.def.js +10 -4
  7. package/dist/app/features/accounts/accounts.run.d.ts +2 -0
  8. package/dist/app/features/accounts/accounts.run.js +7 -2
  9. package/dist/app/features/accounts/services.def.d.ts +7 -1
  10. package/dist/app/features/accounts/services.def.js +19 -16
  11. package/dist/app/features/accounts/services.run.d.ts +2 -0
  12. package/dist/app/features/accounts/services.run.js +44 -16
  13. package/dist/app/features/agent-commands/agent-commands.def.d.ts +37 -0
  14. package/dist/app/features/agent-commands/agent-commands.def.js +91 -0
  15. package/dist/app/features/agent-commands/agent-commands.run.d.ts +28 -0
  16. package/dist/app/features/agent-commands/agent-commands.run.js +35 -0
  17. package/dist/app/features/agent-commands/index.d.ts +2 -0
  18. package/dist/app/features/agent-commands/index.js +3 -0
  19. package/dist/app/features/agents/agents.def.d.ts +14 -1
  20. package/dist/app/features/agents/agents.def.js +61 -6
  21. package/dist/app/features/agents/agents.run.d.ts +1 -0
  22. package/dist/app/features/agents/agents.run.js +8 -1
  23. package/dist/app/features/agents/claude-env.def.d.ts +36 -0
  24. package/dist/app/features/agents/claude-env.def.js +305 -0
  25. package/dist/app/features/agents/env.def.d.ts +163 -0
  26. package/dist/app/features/agents/env.def.js +184 -0
  27. package/dist/app/features/agents/env.run.d.ts +43 -0
  28. package/dist/app/features/agents/env.run.js +86 -0
  29. package/dist/app/features/agents/index.d.ts +2 -0
  30. package/dist/app/features/agents/index.js +2 -0
  31. package/dist/app/features/defs.d.ts +171 -3
  32. package/dist/app/features/defs.js +9 -0
  33. package/dist/app/features/engine/engine.run.js +1 -1
  34. package/dist/app/features/github/github.def.d.ts +44 -3
  35. package/dist/app/features/github/github.def.js +145 -63
  36. package/dist/app/features/github/github.run.d.ts +9 -2
  37. package/dist/app/features/github/github.run.js +43 -5
  38. package/dist/app/features/health/health.def.js +8 -2
  39. package/dist/app/features/logs/logs.def.js +0 -8
  40. package/dist/app/features/projects/projects.def.js +2 -2
  41. package/dist/app/features/projects/projects.run.js +5 -5
  42. package/dist/app/features/sandbox/sandbox.def.js +7 -3
  43. package/dist/app/features/sessions/sessions.def.d.ts +4 -4
  44. package/dist/app/features/sessions/sessions.def.js +0 -5
  45. package/dist/app/features/sessions/sessions.run.d.ts +1 -1
  46. package/dist/app/features/sessions/sessions.run.js +2 -2
  47. package/dist/app/features/settings/categories.def.js +7 -2
  48. package/dist/app/features/settings/settings-rows.js +6 -2
  49. package/dist/app/features/settings/settings.def.js +1 -1
  50. package/dist/app/features/settings/settings.run.d.ts +8 -0
  51. package/dist/app/features/settings/settings.run.js +12 -3
  52. package/dist/app/features/storage/storage.run.js +18 -9
  53. package/dist/app/features/updates/update-lines.js +2 -2
  54. package/dist/app/features/updates/updates.def.js +1 -1
  55. package/dist/app/features/updates/updates.run.js +13 -3
  56. package/dist/app/features/vpn/vpn.def.d.ts +33 -0
  57. package/dist/app/features/vpn/vpn.def.js +30 -6
  58. package/dist/app/features/vpn/vpn.run.d.ts +11 -0
  59. package/dist/app/features/vpn/vpn.run.js +4 -1
  60. package/dist/app/features/web/web.def.js +2 -2
  61. package/dist/app/features/web/web.run.js +12 -4
  62. package/dist/app/kernel/errors.d.ts +7 -0
  63. package/dist/app/kernel/errors.js +18 -3
  64. package/dist/app/kernel/rpc.d.ts +6 -1
  65. package/dist/app/kernel/view.d.ts +11 -1
  66. package/dist/app/registry.js +7 -1
  67. package/dist/bin/agent-sandbox.js +2 -2
  68. package/dist/bin/{chunk-N4GXYTLV.js → chunk-JETGP2C3.js} +239 -72
  69. package/dist/bin/{chunk-MY7NLQQY.js → chunk-XZKOPGNH.js} +1 -1
  70. package/dist/bin/{chunk-FRPLQLSY.js → chunk-ZTTOF5V3.js} +6566 -4964
  71. package/dist/bin/claude-host.js +2 -2
  72. package/dist/bin/claude-sbx.js +2 -2
  73. package/dist/bin/codex-sbx.js +2 -2
  74. package/dist/bin/gemini-sbx.js +2 -2
  75. package/dist/bin/sandbox.js +2 -2
  76. package/dist/bin/sbx-hide.js +2 -2
  77. package/dist/bin/sbx-show.js +2 -2
  78. package/dist/cli/commands/agent-commands.d.ts +0 -1
  79. package/dist/cli/commands/agent-commands.js +2 -32
  80. package/dist/cli/commands/index.d.ts +1 -1
  81. package/dist/cli/commands/index.js +1 -1
  82. package/dist/cli/commands/launch/launch.js +2 -2
  83. package/dist/cli/commands/registry.js +3 -2
  84. package/dist/cli/manifest.d.ts +3 -3
  85. package/dist/cli/manifest.js +3 -2
  86. package/dist/cli/menu/coverage-exempt.d.ts +17 -0
  87. package/dist/cli/menu/coverage-exempt.js +61 -0
  88. package/dist/cli/menu/io-menu.d.ts +2 -0
  89. package/dist/cli/menu/io-menu.js +50 -5
  90. package/dist/cli/menu/menu.d.ts +1 -1
  91. package/dist/cli/menu/menu.js +3 -3
  92. package/dist/cli/menu/pages/accounts-page.js +1 -1
  93. package/dist/cli/menu/pages/agents-page.d.ts +7 -2
  94. package/dist/cli/menu/pages/agents-page.js +75 -13
  95. package/dist/cli/menu/pages/maintenance-page.d.ts +6 -0
  96. package/dist/cli/menu/pages/maintenance-page.js +10 -4
  97. package/dist/cli/menu/pages/sessions-page.d.ts +2 -0
  98. package/dist/cli/menu/pages/sessions-page.js +12 -4
  99. package/dist/cli/menu/pages/settings-page.js +13 -1
  100. package/dist/cli/menu/remote-menu.js +1 -1
  101. package/dist/cli/menu/shell.d.ts +5 -0
  102. package/dist/cli/menu/shell.js +13 -0
  103. package/dist/cli/menu/views.js +2 -1
  104. package/dist/cli/report.js +2 -0
  105. package/dist/cli/services/agent-commands-service.d.ts +2 -0
  106. package/dist/cli/services/agent-commands-service.js +13 -7
  107. package/dist/cli/services/vpn-service.d.ts +5 -1
  108. package/dist/cli/services/vpn-service.js +6 -1
  109. package/dist/cli/tui/app.d.ts +5 -0
  110. package/dist/cli/tui/app.js +2 -0
  111. package/dist/cli/tui/dialogs/text-screen.js +2 -1
  112. package/dist/cli/tui/terminal.js +3 -1
  113. package/dist/core/config/defaults.js +12 -1
  114. package/dist/core/detect/toolchains.js +9 -0
  115. package/dist/core/disk.d.ts +1 -5
  116. package/dist/core/disk.js +1 -16
  117. package/dist/core/schema/accounts.d.ts +6 -0
  118. package/dist/core/schema/accounts.js +13 -11
  119. package/dist/core/schema/codex.d.ts +29 -0
  120. package/dist/core/schema/codex.js +24 -0
  121. package/dist/core/schema/config.d.ts +58 -14
  122. package/dist/core/schema/config.js +6 -4
  123. package/dist/core/schema/github.js +1 -1
  124. package/dist/core/schema/index.d.ts +1 -0
  125. package/dist/core/schema/index.js +1 -0
  126. package/dist/core/schema/profile.js +8 -4
  127. package/dist/core/schema/resume.js +1 -1
  128. package/dist/core/schema/sandbox.js +3 -3
  129. package/dist/core/schema/toolchains.d.ts +4 -0
  130. package/dist/core/schema/toolchains.js +3 -0
  131. package/dist/core/schema/vpn.js +1 -1
  132. package/dist/core/schema/web.js +3 -3
  133. package/dist/core/types.d.ts +8 -0
  134. package/dist/core/util/errors.d.ts +11 -1
  135. package/dist/core/util/errors.js +7 -1
  136. package/dist/core/util/index.d.ts +1 -1
  137. package/dist/core/util/index.js +1 -1
  138. package/dist/guest/accounts/adapter.d.ts +2 -0
  139. package/dist/guest/accounts/adapters.js +4 -0
  140. package/dist/guest/accounts/apply.d.ts +10 -6
  141. package/dist/guest/accounts/kinds/cfx.d.ts +7 -0
  142. package/dist/guest/accounts/kinds/cfx.js +33 -3
  143. package/dist/guest/accounts/kinds/comet.d.ts +7 -0
  144. package/dist/guest/accounts/kinds/comet.js +50 -0
  145. package/dist/guest/accounts/kinds/perplexity.d.ts +2 -0
  146. package/dist/guest/accounts/kinds/perplexity.js +12 -0
  147. package/dist/guest/accounts/watch.d.ts +2 -0
  148. package/dist/guest/accounts/watch.js +12 -2
  149. package/dist/guest/agents/agent-files.d.ts +26 -6
  150. package/dist/guest/agents/agent-files.js +84 -14
  151. package/dist/guest/agents/agent-installer.js +1 -1
  152. package/dist/guest/agents/local-state.d.ts +5 -2
  153. package/dist/guest/agents/local-state.js +24 -10
  154. package/dist/guest/agents/profile-links.d.ts +2 -0
  155. package/dist/guest/agents/profile-links.js +18 -4
  156. package/dist/guest/apps/after-install.js +19 -0
  157. package/dist/guest/apps/app-installer.d.ts +11 -0
  158. package/dist/guest/apps/app-installer.js +69 -6
  159. package/dist/guest/apps/comet-unpack.d.ts +20 -0
  160. package/dist/guest/apps/comet-unpack.js +127 -0
  161. package/dist/guest/apps/index.d.ts +1 -1
  162. package/dist/guest/apps/index.js +1 -1
  163. package/dist/guest/apps/resolvers-agents-web.d.ts +2 -0
  164. package/dist/guest/apps/resolvers-agents-web.js +7 -0
  165. package/dist/guest/apps/resolvers.js +2 -0
  166. package/dist/guest/apps/shortcuts.d.ts +2 -0
  167. package/dist/guest/apps/shortcuts.js +1 -0
  168. package/dist/guest/apps/unpack.js +14 -4
  169. package/dist/guest/boot/boot.d.ts +45 -16
  170. package/dist/guest/boot/boot.js +325 -149
  171. package/dist/guest/boot/graph.d.ts +252 -0
  172. package/dist/guest/boot/graph.js +257 -0
  173. package/dist/guest/boot/guide-lines.d.ts +25 -0
  174. package/dist/guest/boot/guide-lines.js +41 -0
  175. package/dist/guest/boot/guide.d.ts +1 -4
  176. package/dist/guest/boot/guide.js +6 -8
  177. package/dist/guest/boot/runner.d.ts +77 -0
  178. package/dist/guest/boot/runner.js +215 -0
  179. package/dist/guest/browser/cdp.d.ts +71 -0
  180. package/dist/guest/browser/cdp.js +306 -0
  181. package/dist/guest/browser/comet.d.ts +28 -0
  182. package/dist/guest/browser/comet.js +155 -0
  183. package/dist/guest/daemon/project-provisioner.js +6 -1
  184. package/dist/guest/daemon/sessions.js +2 -1
  185. package/dist/guest/devtools/fivem.d.ts +1 -1
  186. package/dist/guest/devtools/fivem.js +243 -3
  187. package/dist/guest/entries/daemon.js +2 -0
  188. package/dist/guest/runtime/log.d.ts +12 -0
  189. package/dist/guest/runtime/log.js +29 -5
  190. package/dist/guest/runtime/pools.d.ts +24 -0
  191. package/dist/guest/runtime/pools.js +60 -0
  192. package/dist/guest/runtime/process.d.ts +4 -0
  193. package/dist/guest/runtime/process.js +38 -1
  194. package/dist/guest/runtime/status.d.ts +5 -1
  195. package/dist/guest/runtime/status.js +19 -0
  196. package/dist/guest/setup/addon-mcp.d.ts +1 -1
  197. package/dist/guest/setup/addon-mcp.js +52 -12
  198. package/dist/guest/setup/agent-addons.d.ts +3 -2
  199. package/dist/guest/setup/agent-addons.js +12 -3
  200. package/dist/guest/setup/environment.d.ts +1 -1
  201. package/dist/guest/setup/environment.js +25 -12
  202. package/dist/guest/setup/headroom.d.ts +8 -3
  203. package/dist/guest/setup/headroom.js +44 -15
  204. package/dist/guest/setup/path-plan.d.ts +28 -0
  205. package/dist/guest/setup/path-plan.js +69 -2
  206. package/dist/guest/setup/shell-path.d.ts +1 -1
  207. package/dist/guest/setup/shell-path.js +3 -3
  208. package/dist/guest/toolchains/fivem/artifacts.d.ts +48 -1
  209. package/dist/guest/toolchains/fivem/artifacts.js +97 -4
  210. package/dist/guest/toolchains/fivem/fivem.d.ts +32 -1
  211. package/dist/guest/toolchains/fivem/fivem.js +168 -3
  212. package/dist/guest/toolchains/fivem/scaffold.d.ts +35 -0
  213. package/dist/guest/toolchains/fivem/scaffold.js +105 -0
  214. package/dist/guest/toolchains/fivem/serve-plan.d.ts +34 -0
  215. package/dist/guest/toolchains/fivem/serve-plan.js +61 -0
  216. package/dist/guest/toolchains/installers.d.ts +6 -10
  217. package/dist/guest/toolchains/installers.js +4 -12
  218. package/dist/guest/toolchains/languages/go.js +1 -1
  219. package/dist/guest/toolchains/languages/node.js +2 -1
  220. package/dist/guest/toolchains/languages/php.d.ts +2 -0
  221. package/dist/guest/toolchains/languages/php.js +13 -1
  222. package/dist/guest/toolchains/languages/python-tools.js +1 -1
  223. package/dist/guest/toolchains/languages/ruby.js +1 -1
  224. package/dist/guest/toolchains/native/autosdk.d.ts +3 -0
  225. package/dist/guest/toolchains/native/autosdk.js +50 -0
  226. package/dist/guest/toolchains/native/binstall.js +1 -1
  227. package/dist/guest/toolchains/native/msvc/packages.js +10 -4
  228. package/dist/guest/toolchains/native/rust.d.ts +2 -0
  229. package/dist/guest/toolchains/native/rust.js +11 -4
  230. package/dist/guest/toolchains/native/unreal.d.ts +2 -0
  231. package/dist/guest/toolchains/native/unreal.js +19 -6
  232. package/dist/guest/toolchains/native/vcruntime.d.ts +2 -3
  233. package/dist/guest/toolchains/native/vcruntime.js +12 -7
  234. package/dist/guest/toolchains/native/visual-studio.d.ts +5 -2
  235. package/dist/guest/toolchains/native/visual-studio.js +127 -25
  236. package/dist/guest/toolchains/native/vs-request.d.ts +23 -0
  237. package/dist/guest/toolchains/native/vs-request.js +62 -1
  238. package/dist/guest/toolchains/not-yet.d.ts +1 -1
  239. package/dist/guest/toolchains/not-yet.js +3 -3
  240. package/dist/guest/toolchains/persisted.js +2 -7
  241. package/dist/guest/toolchains/plan.js +27 -11
  242. package/dist/guest/toolchains/scheduler.d.ts +2 -21
  243. package/dist/guest/toolchains/scheduler.js +7 -121
  244. package/dist/guest/toolchains/setup.d.ts +15 -2
  245. package/dist/guest/toolchains/setup.js +39 -20
  246. package/dist/guest/toolchains/signature.d.ts +5 -0
  247. package/dist/guest/toolchains/signature.js +22 -0
  248. package/dist/guest/toolchains/split.d.ts +28 -0
  249. package/dist/guest/toolchains/split.js +60 -0
  250. package/dist/guest/toolchains/steam/client.js +2 -1
  251. package/dist/guest/toolchains/step-scheduler.d.ts +51 -0
  252. package/dist/guest/toolchains/step-scheduler.js +147 -0
  253. package/dist/guest/toolchains/step.d.ts +13 -0
  254. package/dist/guest/toolchains/tools/git.js +18 -0
  255. package/dist/guest/vpn/openvpn.js +3 -4
  256. package/dist/guest/vpn/tunnel.d.ts +3 -0
  257. package/dist/guest/vpn/tunnel.js +10 -12
  258. package/dist/guest/vpn/vpn.js +6 -1
  259. package/dist/guest/vpn/wireguard.js +11 -4
  260. package/dist/host/accounts/deliver.js +7 -0
  261. package/dist/host/accounts/handoff.js +2 -6
  262. package/dist/host/accounts/index.d.ts +1 -1
  263. package/dist/host/accounts/index.js +1 -1
  264. package/dist/host/accounts/kinds/cfx.d.ts +1 -1
  265. package/dist/host/accounts/kinds/cfx.js +47 -4
  266. package/dist/host/accounts/kinds/comet.d.ts +2 -0
  267. package/dist/host/accounts/kinds/comet.js +6 -0
  268. package/dist/host/accounts/kinds/perplexity.d.ts +2 -0
  269. package/dist/host/accounts/kinds/perplexity.js +30 -0
  270. package/dist/host/accounts/leases.d.ts +9 -3
  271. package/dist/host/accounts/leases.js +13 -2
  272. package/dist/host/accounts/source.d.ts +7 -1
  273. package/dist/host/accounts/source.js +28 -1
  274. package/dist/host/accounts/sources.js +4 -0
  275. package/dist/host/agent-commands/commands.js +1 -1
  276. package/dist/host/agent-commands/forwarders.d.ts +14 -2
  277. package/dist/host/agent-commands/forwarders.js +31 -13
  278. package/dist/host/agent-commands/reconcile.d.ts +2 -1
  279. package/dist/host/agent-commands/reconcile.js +7 -8
  280. package/dist/host/agent-commands/user-path.d.ts +5 -0
  281. package/dist/host/agent-commands/user-path.js +13 -0
  282. package/dist/host/github/deliver.d.ts +1 -1
  283. package/dist/host/github/deliver.js +20 -1
  284. package/dist/host/github/index.d.ts +2 -1
  285. package/dist/host/github/index.js +1 -0
  286. package/dist/host/github/token.d.ts +13 -1
  287. package/dist/host/github/token.js +19 -2
  288. package/dist/host/github/verify.d.ts +27 -0
  289. package/dist/host/github/verify.js +61 -0
  290. package/dist/host/launch/hints/fivem.d.ts +3 -1
  291. package/dist/host/launch/hints/fivem.js +68 -2
  292. package/dist/host/launch/session-file.js +5 -0
  293. package/dist/host/launch/toolchains.d.ts +2 -1
  294. package/dist/host/launch/toolchains.js +5 -3
  295. package/dist/host/profile/accounts.js +2 -4
  296. package/dist/host/profile/claude-login.d.ts +3 -2
  297. package/dist/host/profile/claude-login.js +3 -13
  298. package/dist/host/vpn/index.d.ts +2 -1
  299. package/dist/host/vpn/index.js +2 -1
  300. package/dist/host/vpn/last.d.ts +28 -0
  301. package/dist/host/vpn/last.js +43 -0
  302. package/dist/host/vpn/login.d.ts +3 -1
  303. package/dist/host/vpn/login.js +17 -3
  304. package/dist/host/vpn/nordvpn.d.ts +2 -4
  305. package/dist/host/vpn/nordvpn.js +2 -24
  306. package/dist/runtime/agent.js +433 -90
  307. package/dist/runtime/daemon.js +3378 -1546
  308. package/dist/runtime/db.js +363 -90
  309. package/dist/runtime/main.js +5134 -2096
  310. package/dist/runtime/netproxy.js +308 -69
  311. package/dist/runtime/tool.js +2867 -1765
  312. package/dist/runtime/view.js +308 -69
  313. package/dist/selftest/agent-commands.test.js +45 -7
  314. package/dist/selftest/agent-paths.test.js +40 -13
  315. package/dist/selftest/agent-settings.test.d.ts +2 -0
  316. package/dist/selftest/agent-settings.test.js +94 -0
  317. package/dist/selftest/agents-web.test.d.ts +2 -0
  318. package/dist/selftest/agents-web.test.js +647 -0
  319. package/dist/selftest/app.test.js +7 -3
  320. package/dist/selftest/boot-runner.test.d.ts +2 -0
  321. package/dist/selftest/boot-runner.test.js +456 -0
  322. package/dist/selftest/channel.test.js +15 -0
  323. package/dist/selftest/cli.test.js +4 -0
  324. package/dist/selftest/fivem.test.js +249 -3
  325. package/dist/selftest/github.test.js +94 -9
  326. package/dist/selftest/guest-boot.test.js +3 -0
  327. package/dist/selftest/health.test.js +1 -1
  328. package/dist/selftest/index.js +10 -0
  329. package/dist/selftest/layout.test.js +5 -0
  330. package/dist/selftest/menu-coverage.test.d.ts +2 -0
  331. package/dist/selftest/menu-coverage.test.js +46 -0
  332. package/dist/selftest/menu-screens.js +37 -1
  333. package/dist/selftest/menu.test.js +5 -3
  334. package/dist/selftest/pc-installs.test.js +5 -0
  335. package/dist/selftest/persisted-installs.test.js +72 -0
  336. package/dist/selftest/service-accounts.test.js +3 -2
  337. package/dist/selftest/support/engine-golden.js +28 -1
  338. package/dist/selftest/support/fixtures.d.ts +15 -0
  339. package/dist/selftest/support/web-preview.d.ts +34 -1
  340. package/dist/selftest/support/web-preview.js +21 -18
  341. package/dist/selftest/toolchains.test.js +23 -1
  342. package/dist/selftest/ui-text.test.d.ts +7 -0
  343. package/dist/selftest/ui-text.test.js +300 -0
  344. package/dist/selftest/vpn.test.js +51 -3
  345. package/dist/shared/accounts/anthropic.d.ts +5 -0
  346. package/dist/shared/accounts/anthropic.js +15 -0
  347. package/dist/shared/accounts/index.d.ts +3 -0
  348. package/dist/shared/accounts/index.js +3 -0
  349. package/dist/shared/accounts/kinds/comet.d.ts +12 -0
  350. package/dist/shared/accounts/kinds/comet.js +64 -0
  351. package/dist/shared/accounts/kinds/perplexity.d.ts +8 -0
  352. package/dist/shared/accounts/kinds/perplexity.js +37 -0
  353. package/dist/shared/accounts/kinds.d.ts +24 -5
  354. package/dist/shared/accounts/kinds.js +86 -4
  355. package/dist/shared/accounts/payloads.d.ts +81 -0
  356. package/dist/shared/accounts/payloads.js +39 -1
  357. package/dist/shared/apps/agent-addons.d.ts +33 -5
  358. package/dist/shared/apps/agent-addons.js +95 -3
  359. package/dist/shared/apps/catalogue-agents-web.d.ts +14 -0
  360. package/dist/shared/apps/catalogue-agents-web.js +112 -0
  361. package/dist/shared/apps/catalogue-modding.js +32 -1
  362. package/dist/shared/apps/catalogue.d.ts +27 -3
  363. package/dist/shared/apps/catalogue.js +2 -1
  364. package/dist/shared/apps/index.d.ts +3 -1
  365. package/dist/shared/apps/index.js +3 -1
  366. package/dist/shared/channel/schema.d.ts +40 -3
  367. package/dist/shared/channel/schema.js +9 -0
  368. package/dist/shared/channel/secrets.d.ts +19 -0
  369. package/dist/shared/concurrency/index.d.ts +3 -0
  370. package/dist/shared/concurrency/index.js +3 -0
  371. package/dist/shared/concurrency/installer-retry.d.ts +6 -0
  372. package/dist/shared/concurrency/installer-retry.js +10 -0
  373. package/dist/shared/concurrency/limiter.d.ts +19 -0
  374. package/dist/shared/concurrency/limiter.js +67 -0
  375. package/dist/shared/concurrency/pools.d.ts +7 -0
  376. package/dist/shared/concurrency/pools.js +9 -0
  377. package/dist/shared/download/archive.d.ts +2 -0
  378. package/dist/shared/download/archive.js +11 -1
  379. package/dist/shared/download/bounded-fetch.d.ts +13 -0
  380. package/dist/shared/download/bounded-fetch.js +40 -0
  381. package/dist/shared/download/downloader.d.ts +5 -0
  382. package/dist/shared/download/downloader.js +50 -38
  383. package/dist/shared/download/index.d.ts +2 -1
  384. package/dist/shared/download/index.js +2 -1
  385. package/dist/shared/io/disk.d.ts +9 -0
  386. package/dist/shared/io/disk.js +19 -0
  387. package/dist/shared/io/index.d.ts +1 -0
  388. package/dist/shared/io/index.js +1 -0
  389. package/dist/shared/readiness.d.ts +9 -0
  390. package/dist/shared/readiness.js +11 -0
  391. package/dist/shared/signer.d.ts +24 -0
  392. package/dist/shared/signer.js +15 -0
  393. package/dist/shared/vpn/failure.d.ts +10 -0
  394. package/dist/shared/vpn/failure.js +28 -0
  395. package/dist/sync/watcher.js +2 -0
  396. package/dist/web/index.html +1 -1
  397. package/dist/web/{main-GVZWWP4I.js → main-CCILLX2M.js} +75 -74
  398. package/native/csharp/HcsHost/AssemblyInfo.cs +3 -3
  399. package/native/csharp/HostTools/AssemblyInfo.cs +3 -3
  400. package/native/csharp/HostTools/Program.cs +14 -1
  401. package/native/csharp/HostTools/UserPath.cs +17 -0
  402. package/native/csharp/StorageHelper/AssemblyInfo.cs +3 -3
  403. package/native/scripts/edit-user-path.ps1 +6 -2
  404. package/package.json +1 -1
  405. package/sandbox/addons/browser-use-mcp/requirements.in +1 -0
  406. package/sandbox/addons/browser-use-mcp/requirements.txt +2350 -0
  407. package/sandbox/addons/chrome-devtools-mcp/package-lock.json +38 -0
  408. package/sandbox/addons/chrome-devtools-mcp/package.json +7 -0
  409. package/sandbox/addons/comet-mcp/package-lock.json +1277 -0
  410. package/sandbox/addons/comet-mcp/package.json +7 -0
  411. package/sandbox/addons/perplexity-mcp/package-lock.json +1655 -0
  412. package/sandbox/addons/perplexity-mcp/package.json +7 -0
  413. package/sandbox/scripts/add-firewall-port.ps1 +18 -4
  414. package/sandbox/scripts/get-signature.ps1 +13 -0
  415. package/sandbox/scripts/set-machine-environment.ps1 +30 -15
  416. package/sandbox/templates/fivem/README.txt +6 -2
  417. package/sandbox/templates/fivem/cs/Client/Client.csproj +15 -0
  418. package/sandbox/templates/fivem/cs/Client/ClientMain.cs +20 -0
  419. package/sandbox/templates/fivem/cs/Server/Server.csproj +14 -0
  420. package/sandbox/templates/fivem/cs/Server/ServerMain.cs +20 -0
  421. package/sandbox/templates/fivem/cs/fxmanifest.lua +11 -0
  422. package/sandbox/templates/fivem/js/client.js +12 -0
  423. package/sandbox/templates/fivem/js/fxmanifest.lua +9 -0
  424. package/sandbox/templates/fivem/js/server.js +6 -0
  425. package/sandbox/templates/fivem/lua/client.lua +8 -0
  426. package/sandbox/templates/fivem/lua/fxmanifest.lua +10 -0
  427. package/sandbox/templates/fivem/lua/server.lua +6 -0
  428. package/sandbox/templates/fivem/server.cfg +37 -0
  429. package/sandbox/templates/fivem/ts/build.js +17 -0
  430. package/sandbox/templates/fivem/ts/fxmanifest.lua +9 -0
  431. package/sandbox/templates/fivem/ts/package.json +16 -0
  432. package/sandbox/templates/fivem/ts/src/client/client.ts +12 -0
  433. package/sandbox/templates/fivem/ts/src/client/tsconfig.json +13 -0
  434. package/sandbox/templates/fivem/ts/src/server/server.ts +6 -0
  435. package/sandbox/templates/fivem/ts/src/server/tsconfig.json +13 -0
  436. package/schemas/config.schema.json +120 -27
  437. package/schemas/sandbox-config.schema.json +45 -14
  438. package/sandbox/scripts/get-signer.ps1 +0 -8
@@ -4,7 +4,7 @@
4
4
  // are on.
5
5
  import fs from 'node:fs';
6
6
  import path from 'node:path';
7
- import { agentsPage, listAgents } from '../../../app/features/agents/index.js';
7
+ import { agentEnv, agentEnvPage, agentsPage, listAgents, } from '../../../app/features/agents/index.js';
8
8
  import { readQuery } from '../../../app/registry.js';
9
9
  import { commandLine, readHistory } from '../../history.js';
10
10
  import { AgentCommandsService } from '../../services/index.js';
@@ -16,6 +16,10 @@ import { menuView } from '../render-view.js';
16
16
  import { askPath } from '../settings/ask-path.js';
17
17
  import { SeveralAgents } from '../several.js';
18
18
  import { ListPage } from './list-page.js';
19
+ /** What the agent commands section shows (before the status is read: off, nothing found). Pure. */
20
+ function commandsOf(m) {
21
+ return m.agentCommands ?? { enabled: m.hostAgents.length > 0, dir: '', found: [] };
22
+ }
19
23
  /** The agents page's data as the agents view takes it. Pure. */
20
24
  export function agentsList(m) {
21
25
  const removable = m.removable ?? [];
@@ -32,7 +36,13 @@ export function agentsList(m) {
32
36
  }
33
37
  /** The Start category: the agents view's rows and keys, as the menu draws them. Pure. */
34
38
  function startView(m) {
35
- return menuView(agentsPage(agentsList(m)), { category: 'start', refresh: false });
39
+ const page = agentsPage(agentsList(m), commandsOf(m));
40
+ return menuView({ ...page, sections: page.sections.slice(0, 1) }, { category: 'start', refresh: false });
41
+ }
42
+ /** The On this PC category: the agent commands switch and the agents it covers (the view's second section). Pure. */
43
+ function commandsView(m) {
44
+ const page = agentsPage(agentsList(m), commandsOf(m));
45
+ return menuView({ ...page, sections: page.sections.slice(1) }, { category: 'host', refresh: false });
36
46
  }
37
47
  /**
38
48
  * The "not sandboxed" entries: only while agent commands are on (typing the agent then starts the sandbox, so a way to
@@ -65,16 +75,21 @@ export function agentCategories(m) {
65
75
  label: 'Start',
66
76
  description: 'Agents you can start in ' + m.folder + '. Add an agent at the end of the list.',
67
77
  },
68
- { id: 'options', label: 'Options', description: 'How a start goes, and the other ways to start.' },
69
- ...(m.hostAgents.length
78
+ ...(m.claudeEnv
70
79
  ? [
71
80
  {
72
- id: 'host',
73
- label: 'On this PC',
74
- description: 'The real agents on this PC, with no sandbox around them.',
81
+ id: 'env',
82
+ label: 'Claude environment',
83
+ description: 'Models, limits, how many subagents run at once, and other variables of Claude.',
75
84
  },
76
85
  ]
77
86
  : []),
87
+ { id: 'options', label: 'Options', description: 'How a start goes, and the other ways to start.' },
88
+ {
89
+ id: 'host',
90
+ label: 'On this PC',
91
+ description: 'Agent commands: typing claude, codex ... here starts them in a sandbox. The real agents are listed too.',
92
+ },
78
93
  ];
79
94
  }
80
95
  /** A Start row of the view with the menu's own lines: the default's accent and the command a start runs. Pure. */
@@ -88,9 +103,21 @@ function startRow(item, m, cwd) {
88
103
  details: [Theme.muted('Command ') + commandLine(startArgv(m, name, cwd))],
89
104
  };
90
105
  }
106
+ /** The Claude environment tab: the environment view's rows and keys, as the menu draws them. Pure. */
107
+ function envView(m) {
108
+ return m.claudeEnv ? menuView(agentEnvPage(m.claudeEnv), { category: 'env', refresh: false }) : undefined;
109
+ }
110
+ /** What the last start was, in words: the agent and the folder it was for (never the command line). */
111
+ function lastStart(argv) {
112
+ const at = argv.indexOf('--harness');
113
+ const agent = at >= 0 ? argv[at + 1] : argv[0];
114
+ return agent ?? 'last start';
115
+ }
91
116
  /** The list for the agents section. Pure. */
92
117
  export function agentsOptions(m, cwd = process.cwd()) {
93
118
  const view = startView(m);
119
+ const env = envView(m);
120
+ const commands = commandsView(m);
94
121
  return {
95
122
  path: [],
96
123
  categories: agentCategories(m),
@@ -102,12 +129,14 @@ export function agentsOptions(m, cwd = process.cwd()) {
102
129
  label: 'Repeat last',
103
130
  category: 'start',
104
131
  section: 'Quick start',
105
- hint: Theme.muted(Text.truncate(commandLine(m.last), 50)),
106
- description: 'Runs the last command again.',
132
+ hint: Theme.muted(Text.truncate(lastStart(m.last), 50)),
133
+ description: 'Starts the same agent again with the same options.',
107
134
  },
108
135
  ]
109
136
  : []),
110
137
  ...view.items.map((item) => startRow(item, m, cwd)),
138
+ ...(env?.items ?? []),
139
+ ...commands.items,
111
140
  {
112
141
  value: 'opt:attach',
113
142
  label: 'Attach this terminal',
@@ -161,8 +190,21 @@ export function agentsOptions(m, cwd = process.cwd()) {
161
190
  description: 'Runs the real ' + agent + ' on this PC, with no sandbox around it.',
162
191
  })),
163
192
  ],
164
- enterLabel: (_category, id) => ENTER[id ?? ''] ?? (id?.startsWith('agent:') ? 'start' : id?.startsWith('host:') ? 'run' : 'open'),
165
- actions: (category) => (category === 'start' ? view.actions : []),
193
+ enterLabel: (category, id) => ENTER[id ?? ''] ??
194
+ (id?.startsWith('agent:')
195
+ ? 'start'
196
+ : id?.startsWith('host:')
197
+ ? 'run'
198
+ : category === 'host'
199
+ ? commands.enterLabel(category, id)
200
+ : 'open'),
201
+ actions: (category) => category === 'start'
202
+ ? view.actions
203
+ : category === 'env'
204
+ ? (env?.actions ?? [])
205
+ : category === 'host'
206
+ ? commands.actions
207
+ : [],
166
208
  };
167
209
  }
168
210
  /** What Enter does on the rows that are not an agent. */
@@ -199,7 +241,7 @@ export class AgentsPage extends ListPage {
199
241
  current() {
200
242
  if (!this.facts)
201
243
  throw new Error('The agents tab was not loaded');
202
- const { agents, commands, last } = this.facts;
244
+ const { agents, commands, last, env } = this.facts;
203
245
  return {
204
246
  folder: this.folder,
205
247
  defaultAgent: agents.defaultAgent,
@@ -208,7 +250,13 @@ export class AgentsPage extends ListPage {
208
250
  attach: this.attach,
209
251
  window: this.window,
210
252
  hostAgents: hostAgentsToShow(commands.enabled, commands.found),
253
+ agentCommands: {
254
+ enabled: commands.enabled,
255
+ dir: commands.dir,
256
+ found: commands.found.map((a) => ({ command: a.command, harness: a.harness, real: a.real })),
257
+ },
211
258
  removable: agents.agents.filter((a) => a.removable).map((a) => a.name),
259
+ ...(env ? { claudeEnv: env } : {}),
212
260
  };
213
261
  }
214
262
  /** The cursor starts on the default agent. */
@@ -220,6 +268,9 @@ export class AgentsPage extends ListPage {
220
268
  agents: await readQuery(listAgents, this.ctx),
221
269
  commands: await new AgentCommandsService(this.ctx).statusAsync(),
222
270
  last: readHistory()[0]?.argv,
271
+ env: 'claude' in this.ctx.loaded.config.harnesses
272
+ ? await readQuery(agentEnv, this.ctx, { agent: 'claude' })
273
+ : undefined,
223
274
  };
224
275
  this.model = this.current();
225
276
  }
@@ -229,9 +280,20 @@ export class AgentsPage extends ListPage {
229
280
  }
230
281
  async act(result) {
231
282
  const model = this.current();
232
- const chosen = startView(model).resolve(result);
283
+ const env = this.category === 'env' ? envView(model) : undefined;
284
+ if (env) {
285
+ const picked = env.resolve(result);
286
+ if (picked?.kind === 'action')
287
+ return this.operate(picked.action);
288
+ return {};
289
+ }
290
+ const chosen = startView(model).resolve(result) ?? commandsView(model).resolve(result);
233
291
  if (chosen?.kind === 'action') {
234
292
  const { action } = chosen;
293
+ if (action.kind === 'link' && action.target.kind === 'view') {
294
+ await this.selectCategory('env');
295
+ return {};
296
+ }
235
297
  // A start keeps the options of this page (attach, window, folder), which the plain link does not know.
236
298
  if (action.kind === 'link' && action.target.kind === 'start-agent')
237
299
  return { exit: { kind: 'run', argv: startArgv(model, action.target.agent, process.cwd()) } };
@@ -8,6 +8,7 @@ import { type UpdatesStatus } from '../../../app/features/updates/updates.def.js
8
8
  import { type WebStatus } from '../../../app/features/web/index.js';
9
9
  import type { Context } from '../../commands/context.js';
10
10
  import { type App, type ListOptions, type ListResult } from '../../tui/index.js';
11
+ import { type MenuView } from '../render-view.js';
11
12
  import { ListPage, type Outcome } from './list-page.js';
12
13
  export interface MaintenanceModel {
13
14
  /** The Data & storage category's storage rows: the data folder and contained storage (null until read). */
@@ -42,6 +43,11 @@ export interface MaintenanceModel {
42
43
  summary: string;
43
44
  }[];
44
45
  }
46
+ /**
47
+ * The logs view's rows and keys for the Logs category (its own empty row is left out: the category shows the page's
48
+ * "Nothing here yet.").
49
+ */
50
+ export declare function logsMenu(files: LogFiles): MenuView;
45
51
  /** The list for the maintenance tab. Pure. */
46
52
  export declare function maintenanceOptions(m: MaintenanceModel): ListOptions<string>;
47
53
  export declare class MaintenancePage extends ListPage<string> {
@@ -2,6 +2,7 @@
2
2
  // what is stored, clean-up), Health (doctor, repair and this PC's setup together), Activity (the audit log), the logs,
3
3
  // and the less common commands. Each is a category on the left and loads when you open it.
4
4
  import { dataPage, showData } from '../../../app/features/data/index.js';
5
+ import { link } from '../../../app/kernel/index.js';
5
6
  import { readQuery } from '../../../app/registry.js';
6
7
  import { errMsg } from '../../../core/util/index.js';
7
8
  import { enginePage, engineLeftovers, engineStatus, } from '../../../app/features/engine/index.js';
@@ -51,7 +52,7 @@ const CATEGORIES = [
51
52
  },
52
53
  { id: 'more', label: 'More commands', description: 'Less common commands.' },
53
54
  ];
54
- const MORE_COMMANDS = ['sync', 'config', 'generate', 'exec', 'agent-commands'];
55
+ const MORE_COMMANDS = ['sync', 'config', 'generate', 'exec'];
55
56
  const NO_LOGS = { folder: '', files: [], crash: false };
56
57
  /** Until the status is read: the server counts as not running. */
57
58
  const NO_WEB = { running: false, port: null, address: null };
@@ -61,7 +62,6 @@ const MORE_LABELS = {
61
62
  config: 'Your settings file',
62
63
  generate: 'Preview a start',
63
64
  exec: 'Run a command in the sandbox',
64
- 'agent-commands': 'Agent commands (Beta)',
65
65
  };
66
66
  /** The Data & storage category's rows and keys once measured: the data view (src/app/features/data) as menu rows. */
67
67
  function dataMenuView(data) {
@@ -109,8 +109,14 @@ const NO_UPDATES = {
109
109
  * The logs view's rows and keys for the Logs category (its own empty row is left out: the category shows the page's
110
110
  * "Nothing here yet.").
111
111
  */
112
- function logsMenu(files) {
113
- return menuView({ ...logsPage(files), empty: undefined }, { category: 'logs', refresh: false });
112
+ export function logsMenu(files) {
113
+ // Following a log runs the hand-written `logs --follow` on the normal screen: a menu key, not a page link.
114
+ const follow = link({ kind: 'command', argv: ['logs', '--follow'] }, 'Follow the newest log', {
115
+ key: 'f',
116
+ verb: 'follow in the terminal',
117
+ importance: 2,
118
+ });
119
+ return menuView({ ...logsPage(files), empty: undefined, actions: [follow] }, { category: 'logs', refresh: false });
114
120
  }
115
121
  /** The audit view (src/app/features/audit) as the Activity category's rows and keys (none until it was read). */
116
122
  function auditMenu(m) {
@@ -1,9 +1,11 @@
1
1
  import { type SessionsList } from '../../../app/features/sessions/index.js';
2
2
  import type { Context } from '../../commands/context.js';
3
3
  import type { App, ListOptions, ListResult } from '../../tui/index.js';
4
+ import { type MenuView } from '../render-view.js';
4
5
  import { ListPage, type Outcome } from './list-page.js';
5
6
  /** What the page shows: the sessions query's result (the folder column is never shown here). */
6
7
  export type SessionsModel = Omit<SessionsList, 'wide'>;
8
+ export declare function sessionsMenu(m: SessionsModel): MenuView;
7
9
  /** The list for the sessions tab. Pure. */
8
10
  export declare function sessionsOptions(m: SessionsModel): ListOptions<string>;
9
11
  export declare class SessionsPage extends ListPage<string> {
@@ -1,16 +1,24 @@
1
1
  // Section 2: the agent sessions of the running sandbox, as the sessions view shows them (src/app/features/sessions).
2
2
  // Enter shows one in this terminal (the one thing that leaves the menu), r restarts the agents.
3
+ import { link } from '../../../app/kernel/index.js';
3
4
  import { listSessions, sessionsPage } from '../../../app/features/sessions/index.js';
4
5
  import { readQuery } from '../../../app/registry.js';
5
6
  import { MenuOperations } from '../io-menu.js';
6
7
  import { menuView } from '../render-view.js';
7
8
  import { ListPage } from './list-page.js';
8
- function view(m) {
9
- return menuView(sessionsPage({ ...m, wide: false }));
9
+ export function sessionsMenu(m) {
10
+ // Reopening the last sessions runs the hand-written `resume` on the normal screen: a key of the menu, not a link.
11
+ const resume = link({ kind: 'command', argv: ['resume'] }, 'Reopen last sessions', {
12
+ key: 'o',
13
+ verb: 'reopen last sessions',
14
+ importance: 2,
15
+ });
16
+ const page = sessionsPage({ ...m, wide: false });
17
+ return menuView({ ...page, actions: [...(page.actions ?? []), resume] });
10
18
  }
11
19
  /** The list for the sessions tab. Pure. */
12
20
  export function sessionsOptions(m) {
13
- const v = view(m);
21
+ const v = sessionsMenu(m);
14
22
  return { path: [], items: v.items, actions: v.actions, enterLabel: v.enterLabel };
15
23
  }
16
24
  export class SessionsPage extends ListPage {
@@ -31,7 +39,7 @@ export class SessionsPage extends ListPage {
31
39
  return sessionsOptions(this.model);
32
40
  }
33
41
  async act(result) {
34
- const chosen = view(this.model).resolve(result);
42
+ const chosen = sessionsMenu(this.model).resolve(result);
35
43
  if (!chosen)
36
44
  return {};
37
45
  if (chosen.kind === 'refresh')
@@ -158,9 +158,21 @@ export class SettingsPage extends ListPage {
158
158
  login: 'none',
159
159
  loginSavedAt: null,
160
160
  running: null,
161
+ lastFailure: null,
161
162
  };
162
163
  /** Whether a GitHub token is saved (never the token): the token row needs only its state. */
163
- github = { shareToken: false, gitAccess: 'full', token: 'none', kind: null, savedAt: null };
164
+ github = {
165
+ shareToken: false,
166
+ gitAccess: 'full',
167
+ token: 'none',
168
+ kind: null,
169
+ savedAt: null,
170
+ login: null,
171
+ expiresAt: null,
172
+ repoCount: null,
173
+ checkedAt: null,
174
+ tokenUrl: '',
175
+ };
164
176
  constructor(app, files, draft, ctx) {
165
177
  super(app);
166
178
  this.files = files;
@@ -94,7 +94,7 @@ export class RemoteMenu {
94
94
  if (action.kind === 'link') {
95
95
  notice =
96
96
  action.target.kind === 'terminal'
97
- ? Theme.muted('Attach to it from your own terminal: sandbox attach ' + safeText(action.target.session))
97
+ ? Theme.muted('Attach to it from your own terminal (session ' + safeText(action.target.session) + ').')
98
98
  : Theme.muted('That opens on ' + safeText(this.owner) + "'s side only.");
99
99
  continue;
100
100
  }
@@ -82,6 +82,11 @@ export declare class Shell implements Screen<ShellExit> {
82
82
  restore(view: MenuView): Promise<void>;
83
83
  /** Opens a section by index (loads its data); the first time, it goes back to the category and search it had. */
84
84
  openTab(index: number): Promise<void>;
85
+ /** Opens a section by name, on a category and/or with a search typed (a link from another page). */
86
+ goTo(section: string, where?: {
87
+ category?: string;
88
+ search?: string;
89
+ }): Promise<void>;
85
90
  /** Puts the keyboard in the navigation or in the list. */
86
91
  setFocus(focus: 'nav' | 'list'): void;
87
92
  /** Loads the open section again (after a command ran). */
@@ -27,6 +27,7 @@ export class Shell {
27
27
  this.draft = draft;
28
28
  this.afterSave = afterSave;
29
29
  app.nav = () => this.nav();
30
+ app.goTo = (section, where) => this.goTo(section, where);
30
31
  }
31
32
  get page() {
32
33
  return this.pages[this.active];
@@ -86,6 +87,18 @@ export class Shell {
86
87
  if (wanted?.search)
87
88
  this.page.restoreSearch?.(wanted.search);
88
89
  }
90
+ /** Opens a section by name, on a category and/or with a search typed (a link from another page). */
91
+ async goTo(section, where = {}) {
92
+ const index = this.pages.findIndex((p) => p.label === section);
93
+ if (index < 0)
94
+ return;
95
+ await this.openTab(index);
96
+ if (where.category)
97
+ await this.page.selectCategory(where.category);
98
+ if (where.search)
99
+ this.page.restoreSearch?.(where.search);
100
+ this.setFocus('list');
101
+ }
89
102
  /** Puts the keyboard in the navigation or in the list. */
90
103
  setFocus(focus) {
91
104
  this.focus = focus;
@@ -1,7 +1,7 @@
1
1
  // The shared core's views the menu shows, and in which section (the parity self-test reads this list: an operation or
2
2
  // query is reachable in the menu when a view here offers it). Settings is drawn by its own page over the same rows,
3
3
  // because the menu stages changes until Ctrl+S.
4
- import { agentsView } from '../../app/features/agents/index.js';
4
+ import { agentEnvView, agentsView } from '../../app/features/agents/index.js';
5
5
  import { dataView } from '../../app/features/data/index.js';
6
6
  import { accountsView } from '../../app/features/accounts/index.js';
7
7
  import { appsView } from '../../app/features/apps/index.js';
@@ -21,6 +21,7 @@ import { githubView } from '../../app/features/github/index.js';
21
21
  import { accessView } from '../../app/features/access/index.js';
22
22
  export const MENU_VIEWS = [
23
23
  { view: agentsView, section: 'Agents' },
24
+ { view: agentEnvView, section: 'Agents' },
24
25
  { view: sessionsView, section: 'Sessions' },
25
26
  { view: sandboxView, section: 'Sandbox' },
26
27
  { view: settingsView, section: 'Settings' },
@@ -41,6 +41,8 @@ export function report(e) {
41
41
  console.error(c.red('Error: ') + plainText(e.message));
42
42
  if (e.fix)
43
43
  console.error(' Fix: ' + plainText(e.fix));
44
+ if (e.action?.cli)
45
+ console.error(' Run: ' + plainText(e.action.cli));
44
46
  return 1;
45
47
  }
46
48
  console.error(c.red('Unexpected error: ') + errMsg(e));
@@ -14,6 +14,8 @@ export declare class AgentCommandsService {
14
14
  constructor(ctx: Context);
15
15
  /** Agent commands change this PC's PATH, so they are set up from the PC, not inside the sandbox. */
16
16
  assertOnPc(): void;
17
+ /** Your settings as they are on disk now (a switch made a moment ago, here or in Settings, counts). */
18
+ private config;
17
19
  status(): AgentCommandsStatus;
18
20
  /** status() that does not block the program (the menu asks while it stays responsive). */
19
21
  statusAsync(): Promise<AgentCommandsStatus>;
@@ -1,12 +1,12 @@
1
- // "Agent commands" (Beta): typing claude, codex ... on this PC starts them in a hidden sandbox. Never prints.
1
+ // "Agent commands": typing claude, codex ... on this PC starts them in a hidden sandbox. Never prints.
2
2
  import fs from 'node:fs';
3
- import path from 'node:path';
4
3
  import { loadConfig, userConfigPath } from '../../core/config/index.js';
5
4
  import { fail } from '../../core/util/index.js';
6
- import { agentCommands, agentCommandsAsync, commandsDir, reconcileAgentCommands, } from '../../host/agent-commands/index.js';
5
+ import { agentCommands, agentCommandsAsync, commandsDir, forwardTarget, reconcileAgentCommands, } from '../../host/agent-commands/index.js';
6
+ import { InstallLayout } from '../../host/install/layout.js';
7
7
  import { insideSandbox } from '../../host/sandbox/index.js';
8
8
  import { writeFileAtomic } from '../../shared/io/index.js';
9
- import { editConfigText } from '../../app/features/settings/index.js';
9
+ import { editConfigText } from '../../app/features/settings/settings-file.js';
10
10
  export class AgentCommandsService {
11
11
  ctx;
12
12
  constructor(ctx) {
@@ -17,8 +17,12 @@ export class AgentCommandsService {
17
17
  if (insideSandbox())
18
18
  fail("Agent commands change your PC's PATH, so they are set up from your PC, not inside the sandbox.", 'Run sandbox agent-commands on in a terminal on your PC.');
19
19
  }
20
+ /** Your settings as they are on disk now (a switch made a moment ago, here or in Settings, counts). */
21
+ config() {
22
+ return loadConfig(this.ctx.loaded.configPath ?? undefined).config;
23
+ }
20
24
  status() {
21
- const { config } = this.ctx.loaded;
25
+ const config = this.config();
22
26
  return {
23
27
  enabled: config.agentCommands.enabled,
24
28
  dir: commandsDir(this.ctx.storageRoot),
@@ -27,7 +31,7 @@ export class AgentCommandsService {
27
31
  }
28
32
  /** status() that does not block the program (the menu asks while it stays responsive). */
29
33
  async statusAsync() {
30
- const { config } = this.ctx.loaded;
34
+ const config = this.config();
31
35
  return {
32
36
  enabled: config.agentCommands.enabled,
33
37
  dir: commandsDir(this.ctx.storageRoot),
@@ -48,6 +52,8 @@ export class AgentCommandsService {
48
52
  reconcile(config) {
49
53
  if (insideSandbox())
50
54
  return null;
51
- return reconcileAgentCommands(config, this.ctx.storageRoot, process.execPath, path.join(this.ctx.packageRoot, 'dist', 'bin', 'sandbox.js'));
55
+ // Under a managed install the forwarding files call its launcher, which keeps working after an update.
56
+ const installRoot = InstallLayout.detect(this.ctx.packageRoot)?.root ?? null;
57
+ return reconcileAgentCommands(config, this.ctx.storageRoot, forwardTarget(this.ctx.packageRoot, installRoot, process.execPath));
52
58
  }
53
59
  }
@@ -1,7 +1,7 @@
1
1
  import type { Config } from '../../core/types.js';
2
2
  import type { VpnProvider } from '../../core/schema/index.js';
3
3
  import type { SecretStore } from '../../host/secrets/index.js';
4
- import { type LoginState, type VpnCredentials, type VpnLine } from '../../host/vpn/index.js';
4
+ import { type VpnFailureInfo, type LoginState, type VpnCredentials, type VpnLine } from '../../host/vpn/index.js';
5
5
  import type { Context } from '../commands/context.js';
6
6
  export interface VpnReport {
7
7
  readonly enabled: boolean;
@@ -13,6 +13,8 @@ export interface VpnReport {
13
13
  readonly loginSavedAt: string | null;
14
14
  /** The running sandbox's tunnel, when one runs with the VPN on. */
15
15
  readonly running: VpnLine | null;
16
+ /** The last sandbox's VPN attempt, when it failed (kept after it closed). */
17
+ readonly lastFailure: VpnFailureInfo | null;
16
18
  }
17
19
  export declare class VpnService {
18
20
  private readonly ctx;
@@ -26,5 +28,7 @@ export declare class VpnService {
26
28
  }): Promise<VpnReport>;
27
29
  loginState(): LoginState;
28
30
  save(credentials: VpnCredentials): void;
31
+ /** A hint when the login does not look like it belongs to the provider (null when it looks right). */
32
+ warning(credentials: VpnCredentials): string | null;
29
33
  remove(): boolean;
30
34
  }
@@ -1,5 +1,5 @@
1
1
  import { isSandboxRunning } from '../../host/sandbox/index.js';
2
- import { hostPublicIp, readVpnLine, VpnLogin, } from '../../host/vpn/index.js';
2
+ import { hostPublicIp, loginWarning, readLastFailure, readVpnLine, VpnLogin, } from '../../host/vpn/index.js';
3
3
  export class VpnService {
4
4
  ctx;
5
5
  login;
@@ -25,6 +25,7 @@ export class VpnService {
25
25
  killSwitch: c.killSwitch,
26
26
  login: this.login.state(c.provider),
27
27
  loginSavedAt: this.login.savedAt(c.provider),
28
+ lastFailure: readLastFailure(this.ctx.storageRoot),
28
29
  running: running ? readVpnLine(this.ctx.dataPath, await hostPublicIp()) : null,
29
30
  };
30
31
  }
@@ -34,6 +35,10 @@ export class VpnService {
34
35
  save(credentials) {
35
36
  this.login.save(this.provider, credentials);
36
37
  }
38
+ /** A hint when the login does not look like it belongs to the provider (null when it looks right). */
39
+ warning(credentials) {
40
+ return loginWarning(credentials, this.provider);
41
+ }
37
42
  remove() {
38
43
  return this.login.remove(this.provider);
39
44
  }
@@ -19,6 +19,11 @@ export declare class App {
19
19
  onKey: () => void;
20
20
  /** The navigation on the left of every screen (none: no navigation column). */
21
21
  nav: () => NavState | undefined;
22
+ /** Opens another section of the menu (the shell sets it): what a link to a setting or a view does. */
23
+ goTo: (section: string, where?: {
24
+ category?: string;
25
+ search?: string;
26
+ }) => Promise<void>;
22
27
  /** The screens being shown, innermost last: a dialog is drawn over the one below it. */
23
28
  private readonly shown;
24
29
  private redrawNow;
@@ -25,6 +25,8 @@ export class App {
25
25
  onKey = () => undefined;
26
26
  /** The navigation on the left of every screen (none: no navigation column). */
27
27
  nav = () => undefined;
28
+ /** Opens another section of the menu (the shell sets it): what a link to a setting or a view does. */
29
+ goTo = () => Promise.resolve();
28
30
  /** The screens being shown, innermost last: a dialog is drawn over the one below it. */
29
31
  shown = [];
30
32
  redrawNow = null;
@@ -100,7 +100,8 @@ export class TextScreen {
100
100
  }
101
101
  if (key.text) {
102
102
  const accept = this.o.accept;
103
- const add = [...key.text.replace(/[\r\n]/g, '')].filter((c) => !accept || accept.test(c));
103
+ // Line breaks and the bracketed-paste markers a terminal wraps around pasted text are not part of the text.
104
+ const add = [...key.text.replace(/\x1b?\[20[01]~/g, '').replace(/[\r\n]/g, '')].filter((c) => !accept || accept.test(c));
104
105
  if (!add.length)
105
106
  return;
106
107
  set([...chars.slice(0, this.cursor), ...add, ...chars.slice(this.cursor)], this.cursor + add.length);
@@ -119,9 +119,11 @@ export class Terminal {
119
119
  });
120
120
  }
121
121
  push(str, key) {
122
+ // The markers around a paste (readline names them paste-start / paste-end) carry no text.
123
+ const marker = key?.name === 'paste-start' || key?.name === 'paste-end';
122
124
  const event = {
123
125
  name: key?.name ?? '',
124
- text: str && !key?.ctrl && !key?.meta && str.length >= 1 && str >= ' ' && str !== '\x7f' ? str : '',
126
+ text: str && !marker && !key?.ctrl && !key?.meta && str.length >= 1 && str >= ' ' && str !== '\x7f' ? str : '',
125
127
  ctrl: Boolean(key?.ctrl),
126
128
  meta: Boolean(key?.meta),
127
129
  shift: Boolean(key?.shift),
@@ -38,6 +38,14 @@ export const DEFAULTS = {
38
38
  network: { blockPrivateRanges: true, allowOnly: [], blockHosts: [], forwardPorts: [], dns: [], proxy: '' },
39
39
  vpn: { enabled: false, provider: 'nordvpn', protocol: 'udp', country: '', configFile: '', killSwitch: true },
40
40
  github: { shareToken: false },
41
+ codex: {
42
+ sandboxMode: 'danger-full-access',
43
+ approvalPolicy: 'never',
44
+ model: '',
45
+ reasoningEffort: 'default',
46
+ windowsSandbox: 'off',
47
+ mcpLoginsInFile: true,
48
+ },
41
49
  accounts: {
42
50
  epic: { share: false },
43
51
  steam: { share: false },
@@ -47,6 +55,8 @@ export const DEFAULTS = {
47
55
  play: { share: false },
48
56
  expo: { share: false },
49
57
  appstore: { share: false },
58
+ perplexity: { share: false },
59
+ comet: { share: false },
50
60
  },
51
61
  pcInstalls: { steamGames: false, epicGames: false, unrealEngines: false, unityEditors: false },
52
62
  provisioning: {
@@ -78,6 +88,7 @@ export const DEFAULTS = {
78
88
  acceptLicense: false,
79
89
  components: [],
80
90
  keepInstallFiles: true,
91
+ visualStudio: 'full',
81
92
  persistEngines: true,
82
93
  derivedDataCache: 'persisted',
83
94
  },
@@ -183,7 +194,7 @@ export const DEFAULTS = {
183
194
  npmBin: 'codex',
184
195
  arguments: [],
185
196
  environment: {},
186
- home: { env: { CODEX_HOME: 'codex' }, loginFiles: ['auth.json'], hostDir: '~/.codex' },
197
+ home: { env: { CODEX_HOME: 'codex' }, loginFiles: ['auth.json', '.credentials.json'], hostDir: '~/.codex' },
187
198
  localState: { CODEX_SQLITE_HOME: 'sqlite' },
188
199
  // Its own command sandbox keeps local users' passwords sealed with DPAPI: unreadable in the next sandbox
189
200
  // ("CryptUnprotectData" on every command), so it sets that sandbox up again at each boot. tmp\arg0: folders
@@ -1,3 +1,4 @@
1
+ import { isToolchainReady } from '../../shared/readiness.js';
1
2
  import { projectUses } from './versions.js';
2
3
  /** Files that show a project uses a language (looked for in the workspace and one folder down). */
3
4
  export const MARKERS = {
@@ -84,6 +85,8 @@ export function decideToolchains(settings, entries, pcHas, hints = {}) {
84
85
  const setting = settings[name].enabled;
85
86
  if (setting !== 'auto')
86
87
  return { on: setting, reason: setting ? 'enabled in config' : 'disabled in config' };
88
+ if (!isToolchainReady(name))
89
+ return { on: false, reason: 'coming in a later version' };
87
90
  const marker = MARKERS[name].map((m) => entries.find((e) => projectUses([e], [m]))).find(Boolean);
88
91
  if (marker)
89
92
  return { on: true, reason: marker };
@@ -124,9 +127,15 @@ function applyImplications(settings, result) {
124
127
  imply(settings, result, 'android', 'React Native builds for Android');
125
128
  if (result.godot.on && settings.godot.dotnet === true)
126
129
  imply(settings, result, 'dotnet', "Godot's .NET build");
130
+ if (result.unreal.on && settings.unreal.visualStudio === 'autosdk')
131
+ imply(settings, result, 'msvc', 'Unreal builds from the portable MSVC (AutoSDK)');
132
+ // Unreal's licence acceptance covers the MSVC it builds from (the same Visual Studio terms).
133
+ const autosdkLicence = settings.unreal.visualStudio === 'autosdk' && settings.unreal.acceptLicense;
127
134
  for (const name of LICENSED_TOOLCHAINS) {
128
135
  if (settings[name].enabled !== 'auto' || !result[name].on || settings[name].acceptLicense)
129
136
  continue;
137
+ if (name === 'msvc' && autosdkLicence)
138
+ continue;
130
139
  result[name] = {
131
140
  on: false,
132
141
  reason: 'would be used (' + result[name].reason + '); set toolchains.' + name + '.acceptLicense to install it',
@@ -8,11 +8,7 @@ export declare function humanBytes(bytes: number): string;
8
8
  export declare function sizeOf(p: string): number;
9
9
  /** sizeOf with a time budget: null when measuring would take longer than `ms` (a big data folder can take minutes). */
10
10
  export declare function sizeWithin(p: string, ms: number): number | null;
11
- /**
12
- * Free bytes on the drive that holds `dir` (which may not exist yet: the nearest existing parent is asked); null if
13
- * unknown.
14
- */
15
- export declare function freeBytesAt(dir: string): number | null;
11
+ export { freeBytesAt } from '../shared/io/disk.js';
16
12
  export interface DiskUsage {
17
13
  drive: string;
18
14
  totalBytes: number;