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