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
package/README.md CHANGED
@@ -65,6 +65,7 @@ The first start downloads what the project needs (a few minutes, once). Later st
65
65
  | **Several projects** | `sandbox claude` from another project joins the running sandbox, with that project's own folder, tools, versions, databases and environment. Start several agents at once (`--session claude@A --session codex@B`, or the menu) and attach to any of them from any terminal. |
66
66
  | **Pick up again** | After a crash or restart, `sandbox resume` reopens the last sessions. `sandbox restart` restarts the agents in place, and they continue their conversations. |
67
67
  | **Leaves nothing behind** | When an agent's session ends, everything it started ends too, background servers included. Nothing of this tool keeps running on your PC once the sandbox is closed. |
68
+ | **Agent commands** | Turn them on (menu: Agents, or `sandbox agent-commands on`) and typing `claude`, `codex` ... in any folder starts that agent in a hidden sandbox and attaches your terminal. |
68
69
  | **GitHub, safely** | Give sandboxes a fine-grained GitHub token made just for them (`sandbox github login`, `github.shareToken`). `gh` and `git push` then work inside, and the token is never written to the sandbox's files. |
69
70
  | **Feels like home** | Your desktop look, Claude settings, MCP servers and conversation history come along, and history syncs back. Saved logins (`sandbox account`) are encrypted for your Windows user. |
70
71
 
@@ -122,7 +123,6 @@ and keeps all its features.
122
123
  | Feature | Status | What it does |
123
124
  | ------------------------------------------------------ | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
124
125
  | **Web UI** (`sandbox web`, `web.enabled`) | Beta | Agents, live terminals, status, apps, accounts and settings in your browser, with search (Ctrl+K). This PC only, signed in with a token; devices on your network if you allow them. [web-ui.md](docs/web-ui.md) |
125
- | **Agent commands** (`sandbox agent-commands on`) | Beta | Typing `claude`, `codex` ... in any folder starts that agent in a hidden sandbox and attaches your terminal. |
126
126
  | **Contained storage** (`sandbox storage contained on`) | Beta | Tools, logins and logs in one disk image, mounted only while a sandbox runs. One admin prompt per launch. [Details](docs/configuration.md#contained-storage-beta) |
127
127
  | **VPN** (`sandbox vpn`, `vpn.enabled`) | Alpha | The sandbox's traffic through NordVPN, your own OpenVPN profile or a WireGuard config, with a kill switch. A tunnel carrying traffic is not confirmed yet: read [vpn.md](docs/vpn.md) first. |
128
128
  | **HCS engine** (`sandbox.engine: hcs`) | Alpha | Headless agents in a Hyper-V isolated Server Core container. `sandbox engine check hcs` shows what your PC lacks. Starting it is not enabled yet. |
@@ -68,6 +68,14 @@
68
68
  "github": {
69
69
  "shareToken": false
70
70
  },
71
+ "codex": {
72
+ "sandboxMode": "danger-full-access",
73
+ "approvalPolicy": "never",
74
+ "model": "",
75
+ "reasoningEffort": "default",
76
+ "windowsSandbox": "off",
77
+ "mcpLoginsInFile": true
78
+ },
71
79
  "accounts": {
72
80
  "epic": {
73
81
  "share": false
@@ -92,6 +100,12 @@
92
100
  },
93
101
  "appstore": {
94
102
  "share": false
103
+ },
104
+ "perplexity": {
105
+ "share": false
106
+ },
107
+ "comet": {
108
+ "share": false
95
109
  }
96
110
  },
97
111
  "pcInstalls": {
@@ -155,6 +169,7 @@
155
169
  "acceptLicense": false,
156
170
  "components": [],
157
171
  "keepInstallFiles": true,
172
+ "visualStudio": "full",
158
173
  "persistEngines": true,
159
174
  "derivedDataCache": "persisted"
160
175
  },
@@ -412,7 +427,8 @@
412
427
  "CODEX_HOME": "codex"
413
428
  },
414
429
  "loginFiles": [
415
- "auth.json"
430
+ "auth.json",
431
+ ".credentials.json"
416
432
  ],
417
433
  "hostDir": "~/.codex"
418
434
  },
@@ -3,7 +3,7 @@
3
3
  // page; access.run.ts does the work. Everything here is the owner's: a device or another Windows user never manages
4
4
  // access, whatever their role.
5
5
  import { z } from 'zod';
6
- import { action, defineOperation, defineQuery, defineView, fieldOf } from '../../kernel/index.js';
6
+ import { action, defineOperation, defineQuery, defineView, fieldOf, link, } from '../../kernel/index.js';
7
7
  const RoleSchema = z.enum(['view', 'control']);
8
8
  export const DeviceRowSchema = z.object({
9
9
  id: z.string().describe('Its id (for revoke)'),
@@ -253,11 +253,14 @@ export function accessPage(o, now = Date.now()) {
253
253
  label: 'Windows sign-in',
254
254
  value: o.windowsSignIn ? 'on' : 'off',
255
255
  tone: o.windowsSignIn ? 'ok' : 'muted',
256
- description: 'They run sandbox remote (or sandbox remote --browser) as themselves. Turn on web.remote.windowsSignIn and list them in web.remote.users (Settings).',
256
+ description: 'They sign in to the web UI with their own Windows account. Turn it on and list them in Settings (web.remote.windowsSignIn and web.remote.users).',
257
257
  },
258
258
  ...o.users.map((u, i) => ({ id: 'user-' + i, label: u.name, value: u.role })),
259
259
  ],
260
260
  items: windowsItems,
261
+ actions: [
262
+ link({ kind: 'setting', key: 'web.remote.windowsSignIn' }, 'Windows sign-in setting…', { verb: 'settings' }),
263
+ ],
261
264
  },
262
265
  ],
263
266
  actions: [action(revokeAllAccess, {}, { key: 'X', verb: 'sign out all' })],
@@ -3,7 +3,7 @@
3
3
  // remote settings, the firewall rule and the network check of LAN mode. The one-time code is returned once and only
4
4
  // its hash is kept.
5
5
  import { requireOnPc } from '../../../cli/commands/context.js';
6
- import { fail } from '../../../core/util/index.js';
6
+ import { fail, failWith } from '../../../core/util/index.js';
7
7
  import { AccessStore, addRuleRequest, applyFirewall, chooseLanAddress, lanUrl, networkProblem, networkProfile, removeRuleRequest, showCode, } from '../../../host/remote/index.js';
8
8
  import { SecretStore } from '../../../host/secrets/index.js';
9
9
  import { protectPrivateFolder } from '../../../host/sharing/index.js';
@@ -68,7 +68,11 @@ export const accessStatusRun = implement(accessStatus, (ctx) => {
68
68
  export const allowDeviceRun = implement(allowDevice, (ctx, input) => {
69
69
  requireOnPc('web');
70
70
  if (!ctx.loaded.config.web.remote.lan.enabled)
71
- fail('LAN mode is off, so no device on your network can reach the web UI.', 'Turn it on first: sandbox web lan-on');
71
+ failWith('LAN mode is off, so no device on your network can reach the web UI.', 'Turn it on first.', {
72
+ op: 'access.lanOn',
73
+ label: 'Turn on LAN mode',
74
+ cli: 'sandbox web lan-on',
75
+ });
72
76
  const { code, expiresAt } = accessStoreOf(ctx).newDeviceCode(input.role);
73
77
  const lan = lanStateOf(ctx);
74
78
  return { code: showCode(code), expiresAt, role: input.role, address: lan.url, fingerprint: lan.fingerprint };
@@ -76,7 +80,7 @@ export const allowDeviceRun = implement(allowDevice, (ctx, input) => {
76
80
  export const revokeAccessRun = implement(revokeAccess, (ctx, input) => {
77
81
  requireOnPc('web');
78
82
  if (!accessStoreOf(ctx).revoke(input.id))
79
- fail('There is no device or sign-in ' + input.id + '.', 'See sandbox web devices.');
83
+ fail('There is no device or sign-in ' + input.id + '.', 'Check the list of devices and sign-ins.');
80
84
  return { message: 'Signed out. Its open pages close within half a minute.' };
81
85
  });
82
86
  export const revokeAllAccessRun = implement(revokeAllAccess, async (ctx, _input, io) => {
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { type Page, type Section } from '../../kernel/index.js';
3
+ import { type GithubStatus } from '../github/github.def.js';
3
4
  import { type ServicesList } from './services.def.js';
4
5
  export declare const AccountRowSchema: z.ZodObject<{
5
6
  name: z.ZodString;
@@ -70,10 +71,12 @@ export declare const AccountsListSchema: z.ZodObject<{
70
71
  summary: z.ZodNullable<z.ZodString>;
71
72
  heldBy: z.ZodNullable<z.ZodString>;
72
73
  usedBy: z.ZodArray<z.ZodString>;
74
+ usedFor: z.ZodString;
73
75
  warnings: z.ZodArray<z.ZodString>;
74
76
  canImport: z.ZodBoolean;
75
77
  canLogin: z.ZodBoolean;
76
78
  needsFile: z.ZodBoolean;
79
+ ready: z.ZodBoolean;
77
80
  }, z.core.$strip>>;
78
81
  }, z.core.$strip>;
79
82
  export type AccountsList = z.output<typeof AccountsListSchema>;
@@ -117,10 +120,12 @@ export declare const listAccounts: import("../../kernel/define.js").QueryDef<z.Z
117
120
  summary: z.ZodNullable<z.ZodString>;
118
121
  heldBy: z.ZodNullable<z.ZodString>;
119
122
  usedBy: z.ZodArray<z.ZodString>;
123
+ usedFor: z.ZodString;
120
124
  warnings: z.ZodArray<z.ZodString>;
121
125
  canImport: z.ZodBoolean;
122
126
  canLogin: z.ZodBoolean;
123
127
  needsFile: z.ZodBoolean;
128
+ ready: z.ZodBoolean;
124
129
  }, z.core.$strip>>;
125
130
  }, z.core.$strip>, "accounts.list">;
126
131
  export declare const saveAccount: import("../../kernel/define.js").OperationDef<z.ZodObject<{
@@ -162,7 +167,7 @@ export declare const removeAccount: import("../../kernel/define.js").OperationDe
162
167
  /** One agent's card: its save rows and logins (a card to pick from), or the note that its login is not kept. */
163
168
  export declare function agentSection(a: AgentAccounts): Section;
164
169
  /** The web's page: one card per agent (its logins and the save rows), then one section per service sign-in. */
165
- export declare function accountsPage(o: AccountsList, services?: ServicesList): Page;
170
+ export declare function accountsPage(o: AccountsList, services?: ServicesList, github?: GithubStatus): Page;
166
171
  /**
167
172
  * One agent's page for the menu: its section, and the keys of its save rows (s, p) which the menu's key bar shows
168
173
  * while the agent's category is open. The keys of a login row (d, r, x) are on the row itself.
@@ -205,10 +210,12 @@ export declare const accountsView: import("../../kernel/define.js").ViewDef<{
205
210
  summary: z.ZodNullable<z.ZodString>;
206
211
  heldBy: z.ZodNullable<z.ZodString>;
207
212
  usedBy: z.ZodArray<z.ZodString>;
213
+ usedFor: z.ZodString;
208
214
  warnings: z.ZodArray<z.ZodString>;
209
215
  canImport: z.ZodBoolean;
210
216
  canLogin: z.ZodBoolean;
211
217
  needsFile: z.ZodBoolean;
218
+ ready: z.ZodBoolean;
212
219
  }, z.core.$strip>>;
213
220
  }, z.core.$strip>, "accounts.list">;
214
221
  services: import("../../kernel/define.js").QueryDef<z.ZodObject<{
@@ -228,10 +235,35 @@ export declare const accountsView: import("../../kernel/define.js").ViewDef<{
228
235
  summary: z.ZodNullable<z.ZodString>;
229
236
  heldBy: z.ZodNullable<z.ZodString>;
230
237
  usedBy: z.ZodArray<z.ZodString>;
238
+ usedFor: z.ZodString;
231
239
  warnings: z.ZodArray<z.ZodString>;
232
240
  canImport: z.ZodBoolean;
233
241
  canLogin: z.ZodBoolean;
234
242
  needsFile: z.ZodBoolean;
243
+ ready: z.ZodBoolean;
235
244
  }, z.core.$strip>>;
236
245
  }, z.core.$strip>, "accounts.services">;
246
+ github: import("../../kernel/define.js").QueryDef<z.ZodObject<{}, z.core.$strict>, z.ZodObject<{
247
+ shareToken: z.ZodBoolean;
248
+ gitAccess: z.ZodEnum<{
249
+ readonly: "readonly";
250
+ none: "none";
251
+ full: "full";
252
+ }>;
253
+ token: z.ZodEnum<{
254
+ none: "none";
255
+ saved: "saved";
256
+ unreadable: "unreadable";
257
+ }>;
258
+ kind: z.ZodNullable<z.ZodEnum<{
259
+ "fine-grained": "fine-grained";
260
+ classic: "classic";
261
+ }>>;
262
+ savedAt: z.ZodNullable<z.ZodString>;
263
+ login: z.ZodNullable<z.ZodString>;
264
+ expiresAt: z.ZodNullable<z.ZodString>;
265
+ repoCount: z.ZodNullable<z.ZodNumber>;
266
+ checkedAt: z.ZodNullable<z.ZodString>;
267
+ tokenUrl: z.ZodString;
268
+ }, z.core.$strip>, "github.status">;
237
269
  }, Record<string, never>, "accounts">;
@@ -3,6 +3,7 @@
3
3
  // accounts.run.ts does the work over AccountsService.
4
4
  import { z } from 'zod';
5
5
  import { action, defineOperation, defineQuery, defineView, plural, } from '../../kernel/index.js';
6
+ import { githubLogin, githubLogout, githubStatus, githubSection } from '../github/github.def.js';
6
7
  import { setSetting } from '../settings/settings.def.js';
7
8
  import { listServices, SERVICE_OPERATIONS, serviceSections, ServiceRowSchema, } from './services.def.js';
8
9
  const AgentSchema = z.string().default('claude').describe('whose login: an agent that keeps one (default: claude)');
@@ -279,8 +280,11 @@ export function agentSection(a) {
279
280
  };
280
281
  }
281
282
  /** The web's page: one card per agent (its logins and the save rows), then one section per service sign-in. */
282
- export function accountsPage(o, services = { services: o.services }) {
283
- return { title: 'Accounts', sections: [...o.agents.map(agentSection), ...serviceSections(services)] };
283
+ export function accountsPage(o, services = { services: o.services }, github) {
284
+ return {
285
+ title: 'Accounts',
286
+ sections: [...o.agents.map(agentSection), ...serviceSections(services), ...(github ? [githubSection(github)] : [])],
287
+ };
284
288
  }
285
289
  /**
286
290
  * One agent's page for the menu: its section, and the keys of its save rows (s, p) which the menu's key bar shows
@@ -306,7 +310,7 @@ export const accountsView = defineView({
306
310
  id: 'accounts',
307
311
  title: 'Accounts',
308
312
  summary: 'Logins saved on this PC for each agent (every launch starts with the default; "Use this login" switches now), and the service sign-ins sandboxes may get (Epic, Steam, Unity, signing keys ...).',
309
- queries: { accounts: listAccounts, services: listServices },
313
+ queries: { accounts: listAccounts, services: listServices, github: githubStatus },
310
314
  operations: [
311
315
  saveAccount,
312
316
  useAccount,
@@ -314,7 +318,9 @@ export const accountsView = defineView({
314
318
  renameAccount,
315
319
  removeAccount,
316
320
  ...SERVICE_OPERATIONS,
321
+ githubLogin,
322
+ githubLogout,
317
323
  setSetting,
318
324
  ],
319
- build: ({ accounts, services }) => accountsPage(accounts, services),
325
+ build: ({ accounts, services, github }) => accountsPage(accounts, services, github),
320
326
  });
@@ -35,10 +35,12 @@ export declare const listAccountsRun: import("../../kernel/define.js").Implement
35
35
  summary: import("zod").ZodNullable<import("zod").ZodString>;
36
36
  heldBy: import("zod").ZodNullable<import("zod").ZodString>;
37
37
  usedBy: import("zod").ZodArray<import("zod").ZodString>;
38
+ usedFor: import("zod").ZodString;
38
39
  warnings: import("zod").ZodArray<import("zod").ZodString>;
39
40
  canImport: import("zod").ZodBoolean;
40
41
  canLogin: import("zod").ZodBoolean;
41
42
  needsFile: import("zod").ZodBoolean;
43
+ ready: import("zod").ZodBoolean;
42
44
  }, import("zod/v4/core").$strip>>;
43
45
  }, import("zod/v4/core").$strip>, "accounts.list">, import("../../../cli/commands/context.js").Context>;
44
46
  /** Asks for an API key (one hidden question). The validator answers with fixed texts only, never the key. */
@@ -1,7 +1,7 @@
1
1
  // The accounts feature's work: the saved logins of each agent, and saving, using, defaulting, renaming and removing
2
2
  // them (through AccountsService). Talks only through io; prints nothing. Emails and the sandbox's own words go through
3
3
  // safeText. Logins are never read here: the store keeps them sealed, and outputs hold names, emails and dates only.
4
- import { fail, safeText } from '../../../core/util/index.js';
4
+ import { fail, failWith, safeText } from '../../../core/util/index.js';
5
5
  import { AccountsService } from '../../../cli/services/index.js';
6
6
  import { AccountLeases, ServiceAccountStore } from '../../../host/accounts/index.js';
7
7
  import { SERVICE_KINDS } from '../../../shared/accounts/index.js';
@@ -48,7 +48,12 @@ async function accountName(io, service, verb, agent, given) {
48
48
  }
49
49
  const rows = service.list(agent);
50
50
  if (!rows.length)
51
- fail('No saved accounts.', 'Sign in inside the sandbox, then run: sandbox account save <name>');
51
+ failWith('No saved accounts.', 'Sign in inside the sandbox, then save the login.', {
52
+ op: 'accounts.save',
53
+ input: { agent },
54
+ label: 'Save a login…',
55
+ cli: 'sandbox account save <name>',
56
+ });
52
57
  const picked = await io.choose({
53
58
  title: 'Which account?',
54
59
  choices: rows.map((a) => {
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { type Page, type Section } from '../../kernel/index.js';
3
3
  /** The kinds, as the help says them (the self-test checks this against shared/accounts SERVICE_KINDS). */
4
- export declare const SERVICE_NAMES_TEXT = "epic, steam, unity, cfx, keystore, play, expo or appstore";
4
+ export declare const SERVICE_NAMES_TEXT = "epic, steam, unity, cfx, keystore, play, expo, appstore, perplexity or comet";
5
5
  export declare const ServiceRowSchema: z.ZodObject<{
6
6
  kind: z.ZodString;
7
7
  label: z.ZodString;
@@ -16,10 +16,12 @@ export declare const ServiceRowSchema: z.ZodObject<{
16
16
  summary: z.ZodNullable<z.ZodString>;
17
17
  heldBy: z.ZodNullable<z.ZodString>;
18
18
  usedBy: z.ZodArray<z.ZodString>;
19
+ usedFor: z.ZodString;
19
20
  warnings: z.ZodArray<z.ZodString>;
20
21
  canImport: z.ZodBoolean;
21
22
  canLogin: z.ZodBoolean;
22
23
  needsFile: z.ZodBoolean;
24
+ ready: z.ZodBoolean;
23
25
  }, z.core.$strip>;
24
26
  export type ServiceRow = z.output<typeof ServiceRowSchema>;
25
27
  export declare const ServicesListSchema: z.ZodObject<{
@@ -37,10 +39,12 @@ export declare const ServicesListSchema: z.ZodObject<{
37
39
  summary: z.ZodNullable<z.ZodString>;
38
40
  heldBy: z.ZodNullable<z.ZodString>;
39
41
  usedBy: z.ZodArray<z.ZodString>;
42
+ usedFor: z.ZodString;
40
43
  warnings: z.ZodArray<z.ZodString>;
41
44
  canImport: z.ZodBoolean;
42
45
  canLogin: z.ZodBoolean;
43
46
  needsFile: z.ZodBoolean;
47
+ ready: z.ZodBoolean;
44
48
  }, z.core.$strip>>;
45
49
  }, z.core.$strip>;
46
50
  export type ServicesList = z.output<typeof ServicesListSchema>;
@@ -63,10 +67,12 @@ export declare const listServices: import("../../kernel/define.js").QueryDef<z.Z
63
67
  summary: z.ZodNullable<z.ZodString>;
64
68
  heldBy: z.ZodNullable<z.ZodString>;
65
69
  usedBy: z.ZodArray<z.ZodString>;
70
+ usedFor: z.ZodString;
66
71
  warnings: z.ZodArray<z.ZodString>;
67
72
  canImport: z.ZodBoolean;
68
73
  canLogin: z.ZodBoolean;
69
74
  needsFile: z.ZodBoolean;
75
+ ready: z.ZodBoolean;
70
76
  }, z.core.$strip>>;
71
77
  }, z.core.$strip>, "accounts.services">;
72
78
  export declare const serviceImport: import("../../kernel/define.js").OperationDef<z.ZodObject<{
@@ -1,13 +1,14 @@
1
- // Service sign-ins for sandboxes (accounts.<kind>.share): Epic, Steam, Unity, Cfx.re, signing keys and app-store
2
- // keys. Whether each one is shared and saved (where it came from and when, never its value), taking one from this PC
3
- // or a file, typing one, and forgetting it. Pure: schemas, labels and page builders; services.run.ts does the work.
4
- // The kinds live in shared/accounts (a def imports no shared code): the query's rows carry everything a page shows.
1
+ // Service sign-ins for sandboxes (accounts.<kind>.share): Epic, Steam, Unity, Cfx.re, signing keys, app-store keys
2
+ // and Perplexity (its API key, Comet's sign-in). Whether each one is shared and saved (where it came from and when,
3
+ // never its value), taking one from this PC or a file, typing one, and forgetting it. Pure: schemas, labels and page
4
+ // builders; services.run.ts does the work. The kinds live in shared/accounts (a def imports no shared code): the
5
+ // query's rows carry everything a page shows.
5
6
  import { z } from 'zod';
6
7
  import { action } from '../../kernel/index.js';
7
8
  import { defineOperation, defineQuery } from '../../kernel/index.js';
8
9
  import { setSetting } from '../settings/settings.def.js';
9
10
  /** The kinds, as the help says them (the self-test checks this against shared/accounts SERVICE_KINDS). */
10
- export const SERVICE_NAMES_TEXT = 'epic, steam, unity, cfx, keystore, play, expo or appstore';
11
+ export const SERVICE_NAMES_TEXT = 'epic, steam, unity, cfx, keystore, play, expo, appstore, perplexity or comet';
11
12
  const KindSchema = z
12
13
  .string()
13
14
  .max(40)
@@ -22,11 +23,13 @@ export const ServiceRowSchema = z.object({
22
23
  savedAt: z.string().nullable().describe('When it was saved'),
23
24
  summary: z.string().nullable().describe('Which account (never the secret)'),
24
25
  heldBy: z.string().nullable().describe('The data set whose sandbox holds it now (one-holder services)'),
25
- usedBy: z.array(z.string()).describe('The toolchains it is handed over for'),
26
+ usedBy: z.array(z.string()).describe('The toolchains (or apps) it is handed over for'),
27
+ usedFor: z.string().describe('The same, in words ("unreal", "the Comet app")'),
26
28
  warnings: z.array(z.string()).describe('What everyone who shares it must know'),
27
29
  canImport: z.boolean().describe('It can be taken from this PC or a file (sandbox account import)'),
28
30
  canLogin: z.boolean().describe('It can be typed (sandbox account login)'),
29
31
  needsFile: z.boolean().describe('Importing it needs --from <file>'),
32
+ ready: z.boolean().describe('Its sign-in is written; false: the menu and the web leave it out (the CLI says coming)'),
30
33
  });
31
34
  export const ServicesListSchema = z.object({ services: z.array(ServiceRowSchema) });
32
35
  const STATE_TEXT = {
@@ -55,7 +58,8 @@ export function servicesText(o) {
55
58
  s.share ? 'on' : 'off',
56
59
  STATE_TEXT[s.state],
57
60
  day(s.savedAt) || '-',
58
- [s.summary, s.heldBy ? 'in use by sandbox ' + s.heldBy : null].filter(Boolean).join(', ') || '-',
61
+ [s.ready ? s.summary : 'coming', s.heldBy ? 'in use by sandbox ' + s.heldBy : null].filter(Boolean).join(', ') ||
62
+ '-',
59
63
  ]),
60
64
  ];
61
65
  const widths = table[0].map((_, i) => Math.max(...table.map((r) => r[i].length)));
@@ -125,13 +129,12 @@ function serviceActions(s) {
125
129
  : []),
126
130
  ];
127
131
  }
128
- /** How to get a first sign-in, in words. */
132
+ /** How to get a first sign-in, in words (the actions below do it). */
129
133
  function howTo(s) {
130
- const ways = [
131
- ...(s.canImport ? ['sandbox account import ' + s.kind + (s.needsFile ? ' --from <file>' : '')] : []),
132
- ...(s.canLogin ? ['sandbox account login ' + s.kind] : []),
133
- ];
134
- return ways.length ? ways.join(', or ') : 'sign in once inside a sandbox';
134
+ const ways = [...(s.canImport ? ['import it'] : []), ...(s.canLogin ? ['type it in'] : [])];
135
+ return ways.length
136
+ ? ways.join(' or ')
137
+ : "sign in once inside a sandbox (it can't be copied from this PC: Windows locks it to your PC account)";
135
138
  }
136
139
  /** One service's section: its facts, its warnings and its actions. */
137
140
  export function serviceSection(s) {
@@ -139,9 +142,9 @@ export function serviceSection(s) {
139
142
  {
140
143
  id: s.kind + ':share',
141
144
  label: 'Shared with sandboxes',
142
- value: s.share ? 'on' : 'off (sandbox config set accounts.' + s.kind + '.share true)',
145
+ value: s.share ? 'on' : 'off',
143
146
  tone: s.share ? 'ok' : 'muted',
144
- description: 'For sandboxes that use ' + s.usedBy.join(' or ') + '. ' + s.warnings.join(' '),
147
+ description: 'For sandboxes that use ' + s.usedFor + '. ' + s.warnings.join(' '),
145
148
  },
146
149
  {
147
150
  id: s.kind + ':state',
@@ -179,7 +182,7 @@ export function serviceSection(s) {
179
182
  }
180
183
  /** The sections of every service (appended to the accounts page on the web). */
181
184
  export function serviceSections(o) {
182
- return o.services.map(serviceSection);
185
+ return o.services.filter((s) => s.ready).map(serviceSection);
183
186
  }
184
187
  /** One service's page for the menu: its section, and its actions as keys. */
185
188
  export function servicePage(s) {
@@ -40,10 +40,12 @@ export declare const listServicesRun: import("../../kernel/define.js").Implement
40
40
  summary: import("zod").ZodNullable<import("zod").ZodString>;
41
41
  heldBy: import("zod").ZodNullable<import("zod").ZodString>;
42
42
  usedBy: import("zod").ZodArray<import("zod").ZodString>;
43
+ usedFor: import("zod").ZodString;
43
44
  warnings: import("zod").ZodArray<import("zod").ZodString>;
44
45
  canImport: import("zod").ZodBoolean;
45
46
  canLogin: import("zod").ZodBoolean;
46
47
  needsFile: import("zod").ZodBoolean;
48
+ ready: import("zod").ZodBoolean;
47
49
  }, import("zod/v4/core").$strip>>;
48
50
  }, import("zod/v4/core").$strip>, "accounts.services">, import("../../../cli/commands/context.js").Context>;
49
51
  export declare const serviceImportRun: import("../../kernel/define.js").Implementation<import("../../kernel/define.js").OperationDef<import("zod").ZodObject<{
@@ -4,12 +4,13 @@
4
4
  import fs from 'node:fs';
5
5
  import path from 'node:path';
6
6
  import { requireOnPc } from '../../../cli/commands/context.js';
7
- import { fail, safeText } from '../../../core/util/index.js';
7
+ import { fail, failWith, safeText } from '../../../core/util/index.js';
8
8
  import { AccountLeases, forgetEverywhere, HOST_SOURCES, pcEnv, ServiceAccountStore, } from '../../../host/accounts/index.js';
9
- import { isServiceKind, SERVICE_KINDS, SERVICE_SPECS, } from '../../../shared/accounts/index.js';
9
+ import { isServiceKind, SERVICE_KINDS, SERVICE_SPECS, usedByText, } from '../../../shared/accounts/index.js';
10
10
  import { readBoundedFile } from '../../../shared/io/index.js';
11
11
  import { implement } from '../../context.js';
12
12
  import { cancelled } from '../../kernel/index.js';
13
+ import { isKindReady } from '../../../shared/readiness.js';
13
14
  import { listServices, serviceImport, serviceLogin, serviceLogout } from './services.def.js';
14
15
  /** One service's row: never the sign-in, and the store's summary through safeText. */
15
16
  export function serviceRow(kind, config, store, leases) {
@@ -28,10 +29,12 @@ export function serviceRow(kind, config, store, leases) {
28
29
  summary: info?.summary ? safeText(info.summary) : null,
29
30
  heldBy: holder ? safeText(holder.dataSet) : null,
30
31
  usedBy: [...spec.usedBy],
32
+ usedFor: usedByText(spec.usedBy),
31
33
  warnings: [...spec.warnings],
32
34
  canImport: Boolean(source.fromPc || source.fromFile),
33
35
  canLogin: Boolean(source.fromAnswers),
34
36
  needsFile: Boolean(source.fromFile && !source.fromPc),
37
+ ready: isKindReady(kind),
35
38
  };
36
39
  }
37
40
  /** The kind an operation is about: the name given (checked), else asked. */
@@ -42,7 +45,7 @@ async function kindOf(io, given, verb, offered = () => true) {
42
45
  fail('There is no service called "' + safeText(given) + '".', 'Use one of: ' + SERVICE_KINDS.join(', '));
43
46
  return name;
44
47
  }
45
- const choices = SERVICE_KINDS.filter((k) => offered(SERVICE_SPECS[k])).map((k) => ({
48
+ const choices = SERVICE_KINDS.filter((k) => isKindReady(k) && offered(SERVICE_SPECS[k])).map((k) => ({
46
49
  value: k,
47
50
  label: SERVICE_SPECS[k].label,
48
51
  }));
@@ -53,10 +56,10 @@ async function kindOf(io, given, verb, offered = () => true) {
53
56
  cancelled();
54
57
  return picked;
55
58
  }
56
- /** Asks for the kind's fields; optional ones may stay empty. */
57
- async function askFields(io, spec) {
59
+ /** Asks for the kind's fields (those for typing it, or for a file); optional ones may stay empty. */
60
+ async function askFields(io, spec, mode) {
58
61
  const answers = {};
59
- for (const field of spec.fields) {
62
+ for (const field of spec.fields.filter((f) => !f.only || f.only === mode)) {
60
63
  const validate = (value) => {
61
64
  const v = value.trim();
62
65
  if (!v)
@@ -77,18 +80,31 @@ async function askFields(io, spec) {
77
80
  }
78
81
  return answers;
79
82
  }
83
+ /** A kind that only ever comes from a sandbox (Comet): why it cannot be taken from this PC, and what to do instead. */
84
+ function refuseSandboxOnly(spec) {
85
+ if (spec.sources.length !== 1 || spec.sources[0] !== 'sandbox')
86
+ return;
87
+ fail('Your ' + spec.label + " sign-in can't be copied from this PC: Windows locks it to your PC account.", 'Sign in once inside a sandbox (with accounts.' + spec.kind + '.share on): it is kept for the next ones.');
88
+ }
80
89
  function savedMessage(kind, share) {
81
90
  return ('Saved your ' +
82
91
  SERVICE_SPECS[kind].label +
83
92
  ' sign-in (encrypted for your Windows user).' +
84
- (share ? '' : ' Sandboxes get it once you share it: sandbox config set accounts.' + kind + '.share true'));
93
+ (share ? '' : ' Sandboxes get it once you turn on Share with sandboxes.'));
85
94
  }
86
95
  /** Saves a kind's sign-in from this PC's program or from a file, after a confirmation (--yes answers it). */
87
96
  export async function importServiceFlow(io, kind, from, deps) {
88
97
  const spec = SERVICE_SPECS[kind];
89
98
  const source = HOST_SOURCES[kind];
90
99
  if (!source.fromPc && !source.fromFile)
91
- fail(spec.label + ' cannot be imported.', 'Type it instead: sandbox account login ' + kind);
100
+ refuseSandboxOnly(spec);
101
+ if (!source.fromPc && !source.fromFile)
102
+ failWith(spec.label + ' cannot be imported.', 'Type it instead.', {
103
+ op: 'accounts.service.login',
104
+ input: { name: kind },
105
+ label: 'Sign in…',
106
+ cli: 'sandbox account login ' + kind,
107
+ });
92
108
  let file = from === undefined ? undefined : path.resolve(from);
93
109
  const isFile = (p) => {
94
110
  try {
@@ -118,10 +134,11 @@ export async function importServiceFlow(io, kind, from, deps) {
118
134
  let payload;
119
135
  let saved;
120
136
  if (useFile) {
121
- const bytes = readBoundedFile(file, spec.maxBytes);
137
+ const maxBytes = spec.maxFileBytes ?? spec.maxBytes;
138
+ const bytes = readBoundedFile(file, maxBytes);
122
139
  if (!bytes)
123
- fail('Cannot read ' + file + ' (missing, a link, or bigger than ' + spec.maxBytes / 1024 + ' KB).');
124
- payload = source.fromFile(bytes, await askFields(io, spec));
140
+ fail('Cannot read ' + file + ' (missing, a link, or bigger than ' + maxBytes / 1024 + ' KB).');
141
+ payload = source.fromFile(bytes, await askFields(io, spec, 'file'));
125
142
  saved = 'file';
126
143
  }
127
144
  else {
@@ -134,7 +151,11 @@ export async function importServiceFlow(io, kind, from, deps) {
134
151
  spec.label +
135
152
  ' sign-in found on this PC' +
136
153
  (file ? ' in ' + file : '') +
137
- (spec.returns ? ' (sign in there first, or sign in once inside a sandbox).' : '.'),
154
+ (spec.returns
155
+ ? ' (sign in there first, or sign in once inside a sandbox).'
156
+ : kind === 'perplexity'
157
+ ? ' (PERPLEXITY_API_KEY is not set for your Windows user: import a .env file, or type the key).'
158
+ : '.'),
138
159
  };
139
160
  deps.store.save(kind, payload, saved, source.summary(payload));
140
161
  for (const w of spec.warnings)
@@ -146,10 +167,17 @@ export async function loginServiceFlow(io, kind, deps) {
146
167
  const spec = SERVICE_SPECS[kind];
147
168
  const source = HOST_SOURCES[kind];
148
169
  if (!source.fromAnswers)
149
- fail(spec.label + ' has nothing to type.', spec.sources.includes('sandbox')
150
- ? 'Sign in once inside a sandbox (it is kept), or: sandbox account import ' + kind
151
- : 'Run: sandbox account import ' + kind + ' --from <file>');
152
- const payload = source.fromAnswers(await askFields(io, spec));
170
+ refuseSandboxOnly(spec);
171
+ if (!source.fromAnswers)
172
+ failWith(spec.label + ' has nothing to type.', spec.sources.includes('sandbox')
173
+ ? 'Sign in once inside a sandbox (it is kept), or import it.'
174
+ : 'Import it from a file.', {
175
+ op: 'accounts.service.import',
176
+ input: { name: kind },
177
+ label: 'Import…',
178
+ cli: 'sandbox account import ' + kind + (spec.sources.includes('sandbox') ? '' : ' --from <file>'),
179
+ });
180
+ const payload = source.fromAnswers(await askFields(io, spec, 'typed'));
153
181
  deps.store.save(kind, payload, 'typed', source.summary(payload));
154
182
  for (const w of spec.warnings)
155
183
  io.log(w, 'warn');
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ import { type Section } from '../../kernel/index.js';
3
+ export declare const AgentCommandsStatusSchema: z.ZodObject<{
4
+ enabled: z.ZodBoolean;
5
+ dir: z.ZodString;
6
+ found: z.ZodArray<z.ZodObject<{
7
+ command: z.ZodString;
8
+ harness: z.ZodString;
9
+ real: z.ZodString;
10
+ }, z.core.$strip>>;
11
+ }, z.core.$strip>;
12
+ export type AgentCommandsStatus = z.output<typeof AgentCommandsStatusSchema>;
13
+ export declare const agentCommandsStatus: import("../../kernel/define.js").QueryDef<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
14
+ enabled: z.ZodBoolean;
15
+ dir: z.ZodString;
16
+ found: z.ZodArray<z.ZodObject<{
17
+ command: z.ZodString;
18
+ harness: z.ZodString;
19
+ real: z.ZodString;
20
+ }, z.core.$strip>>;
21
+ }, z.core.$strip>, "agentCommands.status">;
22
+ export declare const agentCommandsOn: import("../../kernel/define.js").OperationDef<z.ZodObject<{}, z.core.$strict>, z.ZodObject<{
23
+ on: z.ZodBoolean;
24
+ commands: z.ZodArray<z.ZodString>;
25
+ message: z.ZodString;
26
+ }, z.core.$strip>, "agentCommands.on">;
27
+ export declare const agentCommandsOff: import("../../kernel/define.js").OperationDef<z.ZodObject<{}, z.core.$strict>, z.ZodObject<{
28
+ on: z.ZodBoolean;
29
+ commands: z.ZodArray<z.ZodString>;
30
+ message: z.ZodString;
31
+ }, z.core.$strip>, "agentCommands.off">;
32
+ /** The words printed by `sandbox agent-commands status`. Pure. */
33
+ export declare function agentCommandsText(s: AgentCommandsStatus): string;
34
+ /** What turning them on does, in words (also the message after it). */
35
+ export declare const AGENT_COMMANDS_EXPLAINED = "Typing claude, codex ... in a folder on this PC starts that agent in a hidden sandbox and attaches your terminal. Open a new terminal after turning it on or off. To run the real program once, set SANDBOX_AGENT_DIRECT=1.";
36
+ /** The "Agent commands" section of the agents page: the switch, then one row per agent found. Pure. */
37
+ export declare function agentCommandsSection(s: AgentCommandsStatus): Section;