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
@@ -33,6 +33,7 @@ import {
33
33
  REQUEST_APP,
34
34
  RunDir,
35
35
  SAVED,
36
+ SYSTEM,
36
37
  SandboxChannel,
37
38
  SchemaNode,
38
39
  ServerMessageSchema,
@@ -44,10 +45,16 @@ import {
44
45
  __commonJS,
45
46
  __require,
46
47
  __toESM,
48
+ accessView,
49
+ accountsView,
47
50
  action,
48
- agentCommandsCommand,
51
+ agentCommandsStatus,
52
+ agentEnv,
53
+ agentEnvPage,
54
+ agentEnvView,
49
55
  agentPage,
50
56
  agentsPage,
57
+ agentsView,
51
58
  allowStorePath,
52
59
  allowedAnswer,
53
60
  allows,
@@ -55,11 +62,13 @@ import {
55
62
  appIsOn,
56
63
  appRows,
57
64
  applyOverrides,
65
+ appsView,
58
66
  askChoice,
59
67
  assertSafeWorkspace,
60
68
  attach,
61
69
  auditArgv,
62
70
  auditPage,
71
+ auditView,
63
72
  autoMigrates,
64
73
  c,
65
74
  canAnimate,
@@ -76,6 +85,7 @@ import {
76
85
  currentUserName,
77
86
  customRows,
78
87
  dataPage,
88
+ dataView,
79
89
  defaultsContext,
80
90
  definitionHandler,
81
91
  describeCopy,
@@ -89,6 +99,7 @@ import {
89
99
  engineLeftovers,
90
100
  enginePage,
91
101
  engineStatus,
102
+ engineView,
92
103
  ensureStorageRoot,
93
104
  entriesOf,
94
105
  errMsg,
@@ -106,8 +117,10 @@ import {
106
117
  githubLogout,
107
118
  githubStatus,
108
119
  githubTokenRowOf,
120
+ githubView,
109
121
  guestWorkspaceOf,
110
122
  healthPage,
123
+ healthView,
111
124
  healthWith,
112
125
  hereDir,
113
126
  hostAgent,
@@ -125,6 +138,7 @@ import {
125
138
  lastHealth,
126
139
  launch,
127
140
  ledgerToReopen,
141
+ link,
128
142
  listAccounts,
129
143
  listAgents,
130
144
  listAudit,
@@ -134,6 +148,7 @@ import {
134
148
  listSettings,
135
149
  loadConfig,
136
150
  logsPage,
151
+ logsView,
137
152
  lookAtSandbox,
138
153
  loosenedRequests,
139
154
  measureFolder,
@@ -157,6 +172,7 @@ import {
157
172
  previewGuest,
158
173
  printJson,
159
174
  projectsPage,
175
+ projectsView,
160
176
  protectPrivateFolder,
161
177
  provisionJoined,
162
178
  readLocalConfig,
@@ -179,13 +195,16 @@ import {
179
195
  sandboxPage,
180
196
  sandboxPids,
181
197
  sandboxStatus,
198
+ sandboxView,
182
199
  serviceCategory,
183
200
  servicePage,
184
201
  sessionsPage,
185
202
  sessionsToReopen,
203
+ sessionsView,
186
204
  settingRow,
187
205
  settingsOf,
188
206
  settingsPage,
207
+ settingsView,
189
208
  setup,
190
209
  shouldReopen,
191
210
  showData,
@@ -194,6 +213,7 @@ import {
194
213
  spawnDetached,
195
214
  staleMountNote,
196
215
  storagePage,
216
+ storageView,
197
217
  summary,
198
218
  summaryText,
199
219
  syncBack,
@@ -205,6 +225,7 @@ import {
205
225
  trustStorePath,
206
226
  updatesPage,
207
227
  updatesStatus,
228
+ updatesView,
208
229
  useSharedSandbox,
209
230
  useTasklistCache,
210
231
  userConfigPath,
@@ -219,16 +240,18 @@ import {
219
240
  vpnLoginRowOf,
220
241
  vpnLogout,
221
242
  vpnStatus,
243
+ vpnView,
222
244
  watch,
223
245
  web,
224
246
  webPage,
225
247
  webServer,
226
248
  webStatus,
249
+ webView,
227
250
  whereOf,
228
251
  withOperationCommands,
229
252
  working,
230
253
  writeJson
231
- } from "./chunk-FRPLQLSY.js";
254
+ } from "./chunk-ZTTOF5V3.js";
232
255
 
233
256
  // node_modules/commander/lib/error.js
234
257
  var require_error = __commonJS({
@@ -3948,6 +3971,7 @@ var COMMAND_LIST = [
3948
3971
  "sandbox account status the service sign-ins (Epic, Steam, Unity, signing keys ...)",
3949
3972
  "sandbox account import epic take this PC's Epic Games Launcher sign-in for sandboxes",
3950
3973
  "sandbox account login cfx type a FiveM server key to keep for sandboxes",
3974
+ "sandbox account login perplexity type a Perplexity API key (or: import perplexity --from .env)",
3951
3975
  "sandbox account logout steam forget a service sign-in",
3952
3976
  "sandbox account save free --api-key save an Anthropic API key you paste in (not shown)"
3953
3977
  ],
@@ -3960,7 +3984,7 @@ var COMMAND_LIST = [
3960
3984
  },
3961
3985
  {
3962
3986
  name: "name",
3963
- description: "account name, or the service (status, import, login, logout): epic, steam, unity, cfx, keystore, play, expo or appstore",
3987
+ description: "account name, or the service (status, import, login, logout): epic, steam, unity, cfx, keystore, play, expo, appstore, perplexity or comet",
3964
3988
  required: false,
3965
3989
  choices: "accounts"
3966
3990
  }
@@ -4153,7 +4177,7 @@ var COMMAND_LIST = [
4153
4177
  },
4154
4178
  {
4155
4179
  name: "agent-commands",
4156
- summary: "(Beta) make claude, codex ... on this PC start in a hidden sandbox and attach",
4180
+ summary: "make claude, codex ... on this PC start in a hidden sandbox and attach",
4157
4181
  group: "Advanced",
4158
4182
  args: [{ name: "action", description: "on, off or status", required: false, choices: ["status", "on", "off"] }],
4159
4183
  options: []
@@ -4887,7 +4911,9 @@ var TextScreen = class {
4887
4911
  }
4888
4912
  if (key.text) {
4889
4913
  const accept = this.o.accept;
4890
- const add = [...key.text.replace(/[\r\n]/g, "")].filter((c2) => !accept || accept.test(c2));
4914
+ const add = [...key.text.replace(/\x1b?\[20[01]~/g, "").replace(/[\r\n]/g, "")].filter(
4915
+ (c2) => !accept || accept.test(c2)
4916
+ );
4891
4917
  if (!add.length) return;
4892
4918
  set([...chars.slice(0, this.cursor), ...add, ...chars.slice(this.cursor)], this.cursor + add.length);
4893
4919
  }
@@ -6054,9 +6080,10 @@ var Terminal = class {
6054
6080
  });
6055
6081
  }
6056
6082
  push(str, key) {
6083
+ const marker = key?.name === "paste-start" || key?.name === "paste-end";
6057
6084
  const event = {
6058
6085
  name: key?.name ?? "",
6059
- text: str && !key?.ctrl && !key?.meta && str.length >= 1 && str >= " " && str !== "\x7F" ? str : "",
6086
+ text: str && !marker && !key?.ctrl && !key?.meta && str.length >= 1 && str >= " " && str !== "\x7F" ? str : "",
6060
6087
  ctrl: Boolean(key?.ctrl),
6061
6088
  meta: Boolean(key?.meta),
6062
6089
  shift: Boolean(key?.shift)
@@ -6091,6 +6118,8 @@ var App = class {
6091
6118
  onKey = () => void 0;
6092
6119
  /** The navigation on the left of every screen (none: no navigation column). */
6093
6120
  nav = () => void 0;
6121
+ /** Opens another section of the menu (the shell sets it): what a link to a setting or a view does. */
6122
+ goTo = () => Promise.resolve();
6094
6123
  /** The screens being shown, innermost last: a dialog is drawn over the one below it. */
6095
6124
  shown = [];
6096
6125
  redrawNow = null;
@@ -6200,6 +6229,9 @@ var App = class {
6200
6229
  }
6201
6230
  };
6202
6231
 
6232
+ // src/cli/menu/io-menu.ts
6233
+ import { spawn } from "node:child_process";
6234
+
6203
6235
  // src/cli/menu/settings/ask-path.ts
6204
6236
  function askPath(app, o) {
6205
6237
  return app.pickPath({
@@ -6696,6 +6728,31 @@ var ValueEditor = class {
6696
6728
  }
6697
6729
  };
6698
6730
 
6731
+ // src/cli/menu/views.ts
6732
+ var MENU_VIEWS = [
6733
+ { view: agentsView, section: "Agents" },
6734
+ { view: agentEnvView, section: "Agents" },
6735
+ { view: sessionsView, section: "Sessions" },
6736
+ { view: sandboxView, section: "Sandbox" },
6737
+ { view: settingsView, section: "Settings" },
6738
+ { view: accountsView, section: "Accounts" },
6739
+ { view: appsView, section: "Apps" },
6740
+ { view: projectsView, section: "Sandbox" },
6741
+ { view: healthView, section: "Maintenance" },
6742
+ { view: dataView, section: "Maintenance" },
6743
+ { view: storageView, section: "Maintenance" },
6744
+ { view: logsView, section: "Maintenance" },
6745
+ { view: auditView, section: "Maintenance" },
6746
+ { view: updatesView, section: "Maintenance" },
6747
+ { view: engineView, section: "Maintenance" },
6748
+ { view: webView, section: "Maintenance" },
6749
+ { view: accessView, section: "Maintenance" },
6750
+ // The Settings page draws the VPN row itself (its login is staged with the settings); the view lists its operations.
6751
+ { view: vpnView, section: "Settings" },
6752
+ // The same for the GitHub token row.
6753
+ { view: githubView, section: "Settings" }
6754
+ ];
6755
+
6699
6756
  // src/cli/menu/io-menu.ts
6700
6757
  async function ask(app, where, q, said) {
6701
6758
  const lines = [...said, ...q.lines ?? [], ..."problem" in q && q.problem ? [Theme.warn(q.problem)] : []];
@@ -6738,7 +6795,22 @@ async function ask(app, where, q, said) {
6738
6795
  });
6739
6796
  }
6740
6797
  }
6741
- function follow(target) {
6798
+ function placeOf(view) {
6799
+ const place = MENU_VIEWS.find((m) => m.view.id === view);
6800
+ if (!place) return void 0;
6801
+ return { section: place.section, ...view === "agentEnv" ? { category: "env" } : {} };
6802
+ }
6803
+ function openUrl(href) {
6804
+ if (!/^https:\/\/github\.com\//.test(href)) return;
6805
+ const child = spawn(SYSTEM.cmd(), ["/c", "start", '""', href.replace(/&/g, "^&")], {
6806
+ stdio: "ignore",
6807
+ detached: true,
6808
+ windowsHide: true
6809
+ });
6810
+ child.on("error", () => void 0);
6811
+ child.unref();
6812
+ }
6813
+ function follow(target, app) {
6742
6814
  switch (target.kind) {
6743
6815
  case "terminal":
6744
6816
  return { exit: { kind: "run", argv: ["attach", target.session] } };
@@ -6746,8 +6818,17 @@ function follow(target) {
6746
6818
  return { exit: { kind: "run", argv: ["launch", "--harness", target.agent] } };
6747
6819
  case "command":
6748
6820
  return { exit: { kind: "run", argv: [...target.argv] } };
6749
- case "view":
6750
- return {};
6821
+ case "view": {
6822
+ const place = placeOf(target.view);
6823
+ if (!place || !app) return {};
6824
+ return app.goTo(place.section, { category: place.category }).then(() => ({}));
6825
+ }
6826
+ case "setting":
6827
+ if (!app) return {};
6828
+ return app.goTo("Settings", { search: target.key }).then(() => ({}));
6829
+ case "url":
6830
+ openUrl(target.href);
6831
+ return { notice: Theme.muted("Opened " + target.href + " in your browser.") };
6751
6832
  }
6752
6833
  }
6753
6834
  var MenuOperations = class {
@@ -6759,7 +6840,7 @@ var MenuOperations = class {
6759
6840
  runner;
6760
6841
  /** Does what an action of a page says: follows a link, or asks for its fields and runs its operation. */
6761
6842
  async perform(action2, where, busy, onOutput) {
6762
- if (action2.kind === "link") return follow(action2.target);
6843
+ if (action2.kind === "link") return follow(action2.target, this.app);
6763
6844
  const def = operationById(action2.op);
6764
6845
  if (!def) return { notice: Theme.error(Theme.glyph.cross + " Unknown operation " + action2.op + ".") };
6765
6846
  const answers = await this.fields(action2, def, where);
@@ -6785,6 +6866,15 @@ var MenuOperations = class {
6785
6866
  }
6786
6867
  return answers;
6787
6868
  }
6869
+ /** A failure that names a fix: a dialog with the fix as a button; its result replaces the failure notice. */
6870
+ async offerFix(problem, where, busy) {
6871
+ const fix = problem.action;
6872
+ const def = fix ? operationById(fix.op) : void 0;
6873
+ if (!fix || !def) return void 0;
6874
+ const yes = await this.app.ask(problem.message, problem.fix ? [problem.fix] : [], fix.label);
6875
+ if (!yes) return void 0;
6876
+ return await this.run(def, fix.input ?? {}, where, busy) ?? Theme.ok(Theme.glyph.ok + " Done.");
6877
+ }
6788
6878
  /**
6789
6879
  * Runs a definition with this input and returns the notice to show: its text (✓), the problem and its fix (✘), or
6790
6880
  * undefined when a question was declined (nothing changed, nothing to say).
@@ -6805,7 +6895,8 @@ var MenuOperations = class {
6805
6895
  if (e instanceof Cancelled) return void 0;
6806
6896
  const problem = toWireError(e);
6807
6897
  if (problem.kind === "bug") return Theme.error(Theme.glyph.cross + " " + errMsg(e));
6808
- return Theme.error(Theme.glyph.cross + " " + problem.message) + (problem.fix ? Theme.muted(" " + problem.fix) : "");
6898
+ const notice = Theme.error(Theme.glyph.cross + " " + problem.message) + (problem.fix ? Theme.muted(" " + problem.fix) : "");
6899
+ return await this.offerFix(problem, where, busy) ?? notice;
6809
6900
  }
6810
6901
  }
6811
6902
  };
@@ -7130,7 +7221,7 @@ function accountsOptions(m) {
7130
7221
  ...m.services.map((s) => ({
7131
7222
  id: serviceCategory(s.kind),
7132
7223
  label: s.label,
7133
- description: "Your " + s.label + " sign-in for sandboxes that use " + s.usedBy.join(" or ") + "."
7224
+ description: "Your " + s.label + " sign-in for sandboxes that use " + s.usedFor + "."
7134
7225
  }))
7135
7226
  ],
7136
7227
  items: [
@@ -7714,6 +7805,9 @@ var SeveralAgents = class {
7714
7805
  };
7715
7806
 
7716
7807
  // src/cli/menu/pages/agents-page.ts
7808
+ function commandsOf(m) {
7809
+ return m.agentCommands ?? { enabled: m.hostAgents.length > 0, dir: "", found: [] };
7810
+ }
7717
7811
  function agentsList(m) {
7718
7812
  const removable = m.removable ?? [];
7719
7813
  return {
@@ -7728,7 +7822,12 @@ function agentsList(m) {
7728
7822
  };
7729
7823
  }
7730
7824
  function startView(m) {
7731
- return menuView(agentsPage(agentsList(m)), { category: "start", refresh: false });
7825
+ const page = agentsPage(agentsList(m), commandsOf(m));
7826
+ return menuView({ ...page, sections: page.sections.slice(0, 1) }, { category: "start", refresh: false });
7827
+ }
7828
+ function commandsView(m) {
7829
+ const page = agentsPage(agentsList(m), commandsOf(m));
7830
+ return menuView({ ...page, sections: page.sections.slice(1) }, { category: "host", refresh: false });
7732
7831
  }
7733
7832
  function hostAgentsToShow(enabled, found) {
7734
7833
  return enabled ? found.map((a) => a.harness) : [];
@@ -7754,14 +7853,19 @@ function agentCategories(m) {
7754
7853
  label: "Start",
7755
7854
  description: "Agents you can start in " + m.folder + ". Add an agent at the end of the list."
7756
7855
  },
7757
- { id: "options", label: "Options", description: "How a start goes, and the other ways to start." },
7758
- ...m.hostAgents.length ? [
7856
+ ...m.claudeEnv ? [
7759
7857
  {
7760
- id: "host",
7761
- label: "On this PC",
7762
- description: "The real agents on this PC, with no sandbox around them."
7858
+ id: "env",
7859
+ label: "Claude environment",
7860
+ description: "Models, limits, how many subagents run at once, and other variables of Claude."
7763
7861
  }
7764
- ] : []
7862
+ ] : [],
7863
+ { id: "options", label: "Options", description: "How a start goes, and the other ways to start." },
7864
+ {
7865
+ id: "host",
7866
+ label: "On this PC",
7867
+ description: "Agent commands: typing claude, codex ... here starts them in a sandbox. The real agents are listed too."
7868
+ }
7765
7869
  ];
7766
7870
  }
7767
7871
  function startRow(item2, m, cwd) {
@@ -7773,8 +7877,18 @@ function startRow(item2, m, cwd) {
7773
7877
  details: [Theme.muted("Command ") + commandLine(startArgv(m, name, cwd))]
7774
7878
  };
7775
7879
  }
7880
+ function envView(m) {
7881
+ return m.claudeEnv ? menuView(agentEnvPage(m.claudeEnv), { category: "env", refresh: false }) : void 0;
7882
+ }
7883
+ function lastStart(argv) {
7884
+ const at = argv.indexOf("--harness");
7885
+ const agent = at >= 0 ? argv[at + 1] : argv[0];
7886
+ return agent ?? "last start";
7887
+ }
7776
7888
  function agentsOptions(m, cwd = process.cwd()) {
7777
- const view2 = startView(m);
7889
+ const view = startView(m);
7890
+ const env = envView(m);
7891
+ const commands = commandsView(m);
7778
7892
  return {
7779
7893
  path: [],
7780
7894
  categories: agentCategories(m),
@@ -7785,11 +7899,13 @@ function agentsOptions(m, cwd = process.cwd()) {
7785
7899
  label: "Repeat last",
7786
7900
  category: "start",
7787
7901
  section: "Quick start",
7788
- hint: Theme.muted(Text.truncate(commandLine(m.last), 50)),
7789
- description: "Runs the last command again."
7902
+ hint: Theme.muted(Text.truncate(lastStart(m.last), 50)),
7903
+ description: "Starts the same agent again with the same options."
7790
7904
  }
7791
7905
  ] : [],
7792
- ...view2.items.map((item2) => startRow(item2, m, cwd)),
7906
+ ...view.items.map((item2) => startRow(item2, m, cwd)),
7907
+ ...env?.items ?? [],
7908
+ ...commands.items,
7793
7909
  {
7794
7910
  value: "opt:attach",
7795
7911
  label: "Attach this terminal",
@@ -7843,8 +7959,8 @@ function agentsOptions(m, cwd = process.cwd()) {
7843
7959
  description: "Runs the real " + agent + " on this PC, with no sandbox around it."
7844
7960
  }))
7845
7961
  ],
7846
- enterLabel: (_category, id) => ENTER[id ?? ""] ?? (id?.startsWith("agent:") ? "start" : id?.startsWith("host:") ? "run" : "open"),
7847
- actions: (category) => category === "start" ? view2.actions : []
7962
+ enterLabel: (category, id) => ENTER[id ?? ""] ?? (id?.startsWith("agent:") ? "start" : id?.startsWith("host:") ? "run" : category === "host" ? commands.enterLabel(category, id) : "open"),
7963
+ actions: (category) => category === "start" ? view.actions : category === "env" ? env?.actions ?? [] : category === "host" ? commands.actions : []
7848
7964
  };
7849
7965
  }
7850
7966
  var ENTER = {
@@ -7875,7 +7991,7 @@ var AgentsPage = class extends ListPage {
7875
7991
  facts;
7876
7992
  current() {
7877
7993
  if (!this.facts) throw new Error("The agents tab was not loaded");
7878
- const { agents, commands, last } = this.facts;
7994
+ const { agents, commands, last, env } = this.facts;
7879
7995
  return {
7880
7996
  folder: this.folder,
7881
7997
  defaultAgent: agents.defaultAgent,
@@ -7884,7 +8000,13 @@ var AgentsPage = class extends ListPage {
7884
8000
  attach: this.attach,
7885
8001
  window: this.window,
7886
8002
  hostAgents: hostAgentsToShow(commands.enabled, commands.found),
7887
- removable: agents.agents.filter((a) => a.removable).map((a) => a.name)
8003
+ agentCommands: {
8004
+ enabled: commands.enabled,
8005
+ dir: commands.dir,
8006
+ found: commands.found.map((a) => ({ command: a.command, harness: a.harness, real: a.real }))
8007
+ },
8008
+ removable: agents.agents.filter((a) => a.removable).map((a) => a.name),
8009
+ ...env ? { claudeEnv: env } : {}
7888
8010
  };
7889
8011
  }
7890
8012
  /** The cursor starts on the default agent. */
@@ -7895,7 +8017,8 @@ var AgentsPage = class extends ListPage {
7895
8017
  this.facts = {
7896
8018
  agents: await readQuery(listAgents, this.ctx),
7897
8019
  commands: await new AgentCommandsService(this.ctx).statusAsync(),
7898
- last: readHistory()[0]?.argv
8020
+ last: readHistory()[0]?.argv,
8021
+ env: "claude" in this.ctx.loaded.config.harnesses ? await readQuery(agentEnv, this.ctx, { agent: "claude" }) : void 0
7899
8022
  };
7900
8023
  this.model = this.current();
7901
8024
  }
@@ -7905,9 +8028,19 @@ var AgentsPage = class extends ListPage {
7905
8028
  }
7906
8029
  async act(result) {
7907
8030
  const model = this.current();
7908
- const chosen = startView(model).resolve(result);
8031
+ const env = this.category === "env" ? envView(model) : void 0;
8032
+ if (env) {
8033
+ const picked = env.resolve(result);
8034
+ if (picked?.kind === "action") return this.operate(picked.action);
8035
+ return {};
8036
+ }
8037
+ const chosen = startView(model).resolve(result) ?? commandsView(model).resolve(result);
7909
8038
  if (chosen?.kind === "action") {
7910
8039
  const { action: action2 } = chosen;
8040
+ if (action2.kind === "link" && action2.target.kind === "view") {
8041
+ await this.selectCategory("env");
8042
+ return {};
8043
+ }
7911
8044
  if (action2.kind === "link" && action2.target.kind === "start-agent")
7912
8045
  return { exit: { kind: "run", argv: startArgv(model, action2.target.agent, process.cwd()) } };
7913
8046
  return this.operate(action2);
@@ -8158,15 +8291,14 @@ var CATEGORIES2 = [
8158
8291
  },
8159
8292
  { id: "more", label: "More commands", description: "Less common commands." }
8160
8293
  ];
8161
- var MORE_COMMANDS = ["sync", "config", "generate", "exec", "agent-commands"];
8294
+ var MORE_COMMANDS = ["sync", "config", "generate", "exec"];
8162
8295
  var NO_LOGS = { folder: "", files: [], crash: false };
8163
8296
  var NO_WEB = { running: false, port: null, address: null };
8164
8297
  var MORE_LABELS = {
8165
8298
  sync: "Copy history back now",
8166
8299
  config: "Your settings file",
8167
8300
  generate: "Preview a start",
8168
- exec: "Run a command in the sandbox",
8169
- "agent-commands": "Agent commands (Beta)"
8301
+ exec: "Run a command in the sandbox"
8170
8302
  };
8171
8303
  function dataMenuView(data) {
8172
8304
  return data ? menuView(dataPage(data), { category: "data", prefix: "data:", refresh: false }) : void 0;
@@ -8205,7 +8337,12 @@ var NO_UPDATES = {
8205
8337
  settings: { pending: [], error: null }
8206
8338
  };
8207
8339
  function logsMenu(files) {
8208
- return menuView({ ...logsPage(files), empty: void 0 }, { category: "logs", refresh: false });
8340
+ const follow2 = link({ kind: "command", argv: ["logs", "--follow"] }, "Follow the newest log", {
8341
+ key: "f",
8342
+ verb: "follow in the terminal",
8343
+ importance: 2
8344
+ });
8345
+ return menuView({ ...logsPage(files), empty: void 0, actions: [follow2] }, { category: "logs", refresh: false });
8209
8346
  }
8210
8347
  function auditMenu(m) {
8211
8348
  return m.audit ? menuView(auditPage(m.audit), { category: "activity", prefix: "audit:", refresh: false }) : void 0;
@@ -8482,18 +8619,18 @@ var CATEGORIES3 = [
8482
8619
  function statusView(m) {
8483
8620
  return menuView(sandboxPage(m.report), { category: "status", prefix: "status:", refresh: false });
8484
8621
  }
8485
- function projectsView(m) {
8622
+ function projectsView2(m) {
8486
8623
  return menuView(projectsPage(m.projects), { category: "projects", refresh: false });
8487
8624
  }
8488
8625
  function viewFor(m, category) {
8489
- if (category === "projects") return projectsView(m);
8626
+ if (category === "projects") return projectsView2(m);
8490
8627
  if (category === "status" || category === void 0) return statusView(m);
8491
8628
  return void 0;
8492
8629
  }
8493
8630
  function sandboxOptions(m) {
8494
8631
  const running = m.report.sandbox.running;
8495
8632
  const status = statusView(m);
8496
- const projects = projectsView(m);
8633
+ const projects = projectsView2(m);
8497
8634
  const statusItems = [...running ? [] : startRows(m.defaultAgent, "status"), ...status.items];
8498
8635
  const noDatabases = m.databases ? [] : running ? [
8499
8636
  {
@@ -8623,11 +8760,17 @@ var SandboxPage = class extends ListPage {
8623
8760
  };
8624
8761
 
8625
8762
  // src/cli/menu/pages/sessions-page.ts
8626
- function view(m) {
8627
- return menuView(sessionsPage({ ...m, wide: false }));
8763
+ function sessionsMenu(m) {
8764
+ const resume2 = link({ kind: "command", argv: ["resume"] }, "Reopen last sessions", {
8765
+ key: "o",
8766
+ verb: "reopen last sessions",
8767
+ importance: 2
8768
+ });
8769
+ const page = sessionsPage({ ...m, wide: false });
8770
+ return menuView({ ...page, actions: [...page.actions ?? [], resume2] });
8628
8771
  }
8629
8772
  function sessionsOptions(m) {
8630
- const v = view(m);
8773
+ const v = sessionsMenu(m);
8631
8774
  return { path: [], items: v.items, actions: v.actions, enterLabel: v.enterLabel };
8632
8775
  }
8633
8776
  var SessionsPage = class extends ListPage {
@@ -8648,7 +8791,7 @@ var SessionsPage = class extends ListPage {
8648
8791
  return sessionsOptions(this.model);
8649
8792
  }
8650
8793
  async act(result) {
8651
- const chosen = view(this.model).resolve(result);
8794
+ const chosen = sessionsMenu(this.model).resolve(result);
8652
8795
  if (!chosen) return {};
8653
8796
  if (chosen.kind === "refresh") return { reload: true };
8654
8797
  return this.operations.perform(chosen.action, [this.label], (text2) => this.busy(text2));
@@ -8781,10 +8924,22 @@ var SettingsPage = class extends ListPage {
8781
8924
  killSwitch: true,
8782
8925
  login: "none",
8783
8926
  loginSavedAt: null,
8784
- running: null
8927
+ running: null,
8928
+ lastFailure: null
8785
8929
  };
8786
8930
  /** Whether a GitHub token is saved (never the token): the token row needs only its state. */
8787
- github = { shareToken: false, gitAccess: "full", token: "none", kind: null, savedAt: null };
8931
+ github = {
8932
+ shareToken: false,
8933
+ gitAccess: "full",
8934
+ token: "none",
8935
+ kind: null,
8936
+ savedAt: null,
8937
+ login: null,
8938
+ expiresAt: null,
8939
+ repoCount: null,
8940
+ checkedAt: null,
8941
+ tokenUrl: ""
8942
+ };
8788
8943
  get file() {
8789
8944
  return this.files[this.scope];
8790
8945
  }
@@ -9057,11 +9212,11 @@ var MenuStateSchema = external_exports.strictObject({
9057
9212
  function stateFile(dir) {
9058
9213
  return new JsonFile(MenuStateSchema, path8.join(dir, "menu-state.json"));
9059
9214
  }
9060
- function viewToState(view2, labels) {
9215
+ function viewToState(view, labels) {
9061
9216
  const screens = {};
9062
- for (const [label, screen] of Object.entries(view2.screens))
9217
+ for (const [label, screen] of Object.entries(view.screens))
9063
9218
  if (labels.includes(label) && (screen.category || screen.search)) screens[label] = screen;
9064
- return { section: labels[view2.section] ?? labels[0] ?? "", screens };
9219
+ return { section: labels[view.section] ?? labels[0] ?? "", screens };
9065
9220
  }
9066
9221
  function stateToView(state, labels) {
9067
9222
  const section = labels.indexOf(state.section);
@@ -9078,9 +9233,9 @@ function readMenuView(labels, dir = userDir()) {
9078
9233
  return void 0;
9079
9234
  }
9080
9235
  }
9081
- function saveMenuView(view2, labels, dir = userDir()) {
9236
+ function saveMenuView(view, labels, dir = userDir()) {
9082
9237
  try {
9083
- stateFile(dir).write(viewToState(view2, labels));
9238
+ stateFile(dir).write(viewToState(view, labels));
9084
9239
  } catch {
9085
9240
  }
9086
9241
  }
@@ -9101,6 +9256,7 @@ var Shell = class {
9101
9256
  this.draft = draft;
9102
9257
  this.afterSave = afterSave;
9103
9258
  app.nav = () => this.nav();
9259
+ app.goTo = (section, where) => this.goTo(section, where);
9104
9260
  }
9105
9261
  app;
9106
9262
  pages;
@@ -9145,10 +9301,10 @@ var Shell = class {
9145
9301
  return { section: this.active, screens: Object.fromEntries(this.screens) };
9146
9302
  }
9147
9303
  /** Opens the section a view names and puts each section back where it was (what is gone is ignored). */
9148
- async restore(view2) {
9304
+ async restore(view) {
9149
9305
  this.restored.clear();
9150
- for (const [label, screen] of Object.entries(view2.screens)) this.screens.set(label, screen);
9151
- await this.openTab(view2.section);
9306
+ for (const [label, screen] of Object.entries(view.screens)) this.screens.set(label, screen);
9307
+ await this.openTab(view.section);
9152
9308
  }
9153
9309
  /** Opens a section by index (loads its data); the first time, it goes back to the category and search it had. */
9154
9310
  async openTab(index) {
@@ -9163,6 +9319,15 @@ var Shell = class {
9163
9319
  await this.page.selectCategory(wanted.category);
9164
9320
  if (wanted?.search) this.page.restoreSearch?.(wanted.search);
9165
9321
  }
9322
+ /** Opens a section by name, on a category and/or with a search typed (a link from another page). */
9323
+ async goTo(section, where = {}) {
9324
+ const index = this.pages.findIndex((p) => p.label === section);
9325
+ if (index < 0) return;
9326
+ await this.openTab(index);
9327
+ if (where.category) await this.page.selectCategory(where.category);
9328
+ if (where.search) this.page.restoreSearch?.(where.search);
9329
+ this.setFocus("list");
9330
+ }
9166
9331
  /** Puts the keyboard in the navigation or in the list. */
9167
9332
  setFocus(focus) {
9168
9333
  this.focus = focus;
@@ -9311,10 +9476,10 @@ var Menu = class {
9311
9476
  status() {
9312
9477
  const folder = Theme.muted(Text.middle(process.cwd(), 70));
9313
9478
  if (!isSandboxRunning()) return Theme.muted(Theme.glyph.off + " No sandbox running") + " " + folder;
9314
- const view2 = lookAtSandbox(this.ctx);
9315
- if (view2.line)
9316
- return Theme.ok(Theme.glyph.on + " " + view2.line) + Theme.muted(
9317
- view2.limited ? ". You can use it when they share it, or start your own after it stops." : ". Its window is on their desktop; use its agents here."
9479
+ const view = lookAtSandbox(this.ctx);
9480
+ if (view.line)
9481
+ return Theme.ok(Theme.glyph.on + " " + view.line) + Theme.muted(
9482
+ view.limited ? ". You can use it when they share it, or start your own after it stops." : ". Its window is on their desktop; use its agents here."
9318
9483
  );
9319
9484
  const n = new SandboxChannel(this.ctx.dataPath).runningSessions().length;
9320
9485
  return Theme.ok(Theme.glyph.on + " Sandbox running") + Theme.muted(" \xB7 " + n + " session" + (n === 1 ? "" : "s")) + " " + folder;
@@ -9400,7 +9565,7 @@ var Menu = class {
9400
9565
  await pressAnyKey(Theme.muted("Press any key for the menu\u2026"));
9401
9566
  });
9402
9567
  }
9403
- /** After a save: agent commands (Beta) may have been switched, which changes this PC. */
9568
+ /** After a save: agent commands may have been switched, which changes this PC. */
9404
9569
  applyAgentCommands(saved) {
9405
9570
  if (!saved.files.some((f) => !f.isProject)) return void 0;
9406
9571
  try {
@@ -9408,9 +9573,9 @@ var Menu = class {
9408
9573
  loadConfig(this.ctx.loaded.configPath ?? void 0).config
9409
9574
  );
9410
9575
  if (!result?.changed) return void 0;
9411
- return result.on ? "Agent commands (Beta) are on: open a new terminal." : "Agent commands are off: claude, codex ... run on this PC again (open a new terminal).";
9576
+ return result.on ? "Agent commands are on: open a new terminal." : "Agent commands are off: claude, codex ... run on this PC again (open a new terminal).";
9412
9577
  } catch (e) {
9413
- return "Agent commands (Beta): " + errMsg(e);
9578
+ return "Agent commands: " + errMsg(e);
9414
9579
  }
9415
9580
  }
9416
9581
  };
@@ -9800,7 +9965,7 @@ async function logs(ctx) {
9800
9965
  }
9801
9966
 
9802
9967
  // src/cli/commands/maintenance/config.ts
9803
- import { spawn } from "node:child_process";
9968
+ import { spawn as spawn2 } from "node:child_process";
9804
9969
  import fs7 from "node:fs";
9805
9970
  import path11 from "node:path";
9806
9971
  import { pathToFileURL } from "node:url";
@@ -9822,7 +9987,7 @@ async function initConfig() {
9822
9987
  if (answer === "cancel") return 0;
9823
9988
  if (answer === "open") {
9824
9989
  refuseInSelfTest("open files");
9825
- spawn(system32("notepad.exe"), [file], { detached: true, stdio: "ignore" }).unref();
9990
+ spawn2(system32("notepad.exe"), [file], { detached: true, stdio: "ignore" }).unref();
9826
9991
  console.log("Opened " + file + ".");
9827
9992
  return 0;
9828
9993
  }
@@ -10055,30 +10220,30 @@ var RemoteMenu = class {
10055
10220
  });
10056
10221
  if (picked.kind !== "pick") return;
10057
10222
  at = picked.value;
10058
- const view2 = views.find((v) => v.id === picked.value);
10059
- if (view2) await this.showView(view2);
10223
+ const view = views.find((v) => v.id === picked.value);
10224
+ if (view) await this.showView(view);
10060
10225
  }
10061
10226
  }
10062
- async page(view2) {
10063
- const inputs = viewInputs(view2, {});
10227
+ async page(view) {
10228
+ const inputs = viewInputs(view, {});
10064
10229
  const data = {};
10065
- for (const [name, query] of Object.entries(view2.queries))
10230
+ for (const [name, query] of Object.entries(view.queries))
10066
10231
  data[name] = await this.client.run(query.id, inputs[name], NO_QUESTIONS);
10067
- return view2.build(data, {});
10232
+ return view.build(data, {});
10068
10233
  }
10069
- async showView(view2) {
10234
+ async showView(view) {
10070
10235
  let notice;
10071
10236
  for (; ; ) {
10072
10237
  let page;
10073
10238
  try {
10074
- page = await this.page(view2);
10239
+ page = await this.page(view);
10075
10240
  } catch (e) {
10076
- await this.app.message({ path: [this.title(), view2.title], lines: [safeText(errMsg(e))], tone: "error" });
10241
+ await this.app.message({ path: [this.title(), view.title], lines: [safeText(errMsg(e))], tone: "error" });
10077
10242
  return;
10078
10243
  }
10079
10244
  const mv = menuView(page);
10080
10245
  const result = await this.app.list({
10081
- path: [this.title(), view2.title],
10246
+ path: [this.title(), view.title],
10082
10247
  intro: page.notice ? [safeText(page.notice.text)] : void 0,
10083
10248
  items: mv.items,
10084
10249
  actions: mv.actions,
@@ -10092,10 +10257,10 @@ var RemoteMenu = class {
10092
10257
  if (!chosen || chosen.kind === "refresh") continue;
10093
10258
  const action2 = chosen.action;
10094
10259
  if (action2.kind === "link") {
10095
- notice = action2.target.kind === "terminal" ? Theme.muted("Attach to it from your own terminal: sandbox attach " + safeText(action2.target.session)) : Theme.muted("That opens on " + safeText(this.owner) + "'s side only.");
10260
+ notice = action2.target.kind === "terminal" ? Theme.muted("Attach to it from your own terminal (session " + safeText(action2.target.session) + ").") : Theme.muted("That opens on " + safeText(this.owner) + "'s side only.");
10096
10261
  continue;
10097
10262
  }
10098
- const done = await this.operations.perform(action2, [this.title(), view2.title], (text2) => {
10263
+ const done = await this.operations.perform(action2, [this.title(), view.title], (text2) => {
10099
10264
  notice = text2;
10100
10265
  this.app.redraw();
10101
10266
  });
@@ -10282,7 +10447,6 @@ var HANDLERS = {
10282
10447
  generate: (ctx) => launch(ctx, true),
10283
10448
  attach,
10284
10449
  exec,
10285
- "agent-commands": agentCommandsCommand,
10286
10450
  db,
10287
10451
  resume,
10288
10452
  // The bare command lists; its actions (save, use ...) are the operations' hints.
@@ -10317,6 +10481,8 @@ var HANDLERS = {
10317
10481
  "host-claude": claudeHost,
10318
10482
  host: hostCommand,
10319
10483
  _watch: watcher,
10484
+ // The bare command shows the status; on and off are the operations' hints (src/app/features/agent-commands).
10485
+ "agent-commands": definitionHandler(agentCommandsStatus),
10320
10486
  vpn,
10321
10487
  github,
10322
10488
  web,
@@ -10364,6 +10530,7 @@ function report(e) {
10364
10530
  if (e instanceof UserError) {
10365
10531
  console.error(c.red("Error: ") + plainText(e.message));
10366
10532
  if (e.fix) console.error(" Fix: " + plainText(e.fix));
10533
+ if (e.action?.cli) console.error(" Run: " + plainText(e.action.cli));
10367
10534
  return 1;
10368
10535
  }
10369
10536
  console.error(c.red("Unexpected error: ") + errMsg(e));