windows-development-sandbox 1.7.0 → 1.10.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/config.example.json +12 -1
- package/dist/app/context.d.ts +8 -0
- package/dist/app/context.js +12 -0
- package/dist/app/features/defs.d.ts +322 -0
- package/dist/app/features/defs.js +28 -0
- package/dist/app/features/sandbox/index.d.ts +2 -0
- package/dist/app/features/sandbox/index.js +3 -0
- package/dist/app/features/sandbox/sandbox.def.d.ts +193 -0
- package/dist/app/features/sandbox/sandbox.def.js +245 -0
- package/dist/app/features/sandbox/sandbox.run.d.ts +72 -0
- package/dist/app/features/sandbox/sandbox.run.js +98 -0
- package/dist/app/features/sessions/index.d.ts +2 -0
- package/dist/app/features/sessions/index.js +3 -0
- package/dist/app/features/sessions/sessions.def.d.ts +141 -0
- package/dist/app/features/sessions/sessions.def.js +176 -0
- package/dist/app/features/sessions/sessions.run.d.ts +39 -0
- package/dist/app/features/sessions/sessions.run.js +58 -0
- package/dist/{cli/menu/settings/categories.d.ts → app/features/settings/categories.def.d.ts} +2 -0
- package/dist/{cli/menu/settings/categories.js → app/features/settings/categories.def.js} +24 -5
- package/dist/app/features/settings/index.d.ts +5 -0
- package/dist/app/features/settings/index.js +6 -0
- package/dist/{cli/menu/settings/config-file.d.ts → app/features/settings/settings-file.d.ts} +1 -1
- package/dist/{cli/menu/settings/config-file.js → app/features/settings/settings-file.js} +1 -1
- package/dist/app/features/settings/settings-rows.d.ts +35 -0
- package/dist/app/features/settings/settings-rows.js +94 -0
- package/dist/app/features/settings/settings.def.d.ts +157 -0
- package/dist/app/features/settings/settings.def.js +179 -0
- package/dist/app/features/settings/settings.run.d.ts +67 -0
- package/dist/app/features/settings/settings.run.js +84 -0
- package/dist/app/kernel/define.d.ts +143 -0
- package/dist/app/kernel/define.js +42 -0
- package/dist/app/kernel/errors.d.ts +34 -0
- package/dist/app/kernel/errors.js +45 -0
- package/dist/app/kernel/fields.d.ts +70 -0
- package/dist/app/kernel/fields.js +243 -0
- package/dist/app/kernel/index.d.ts +8 -0
- package/dist/app/kernel/index.js +10 -0
- package/dist/app/kernel/io.d.ts +193 -0
- package/dist/app/kernel/io.js +126 -0
- package/dist/app/kernel/rpc.d.ts +156 -0
- package/dist/app/kernel/rpc.js +47 -0
- package/dist/app/kernel/text.d.ts +6 -0
- package/dist/app/kernel/text.js +57 -0
- package/dist/app/kernel/view.d.ts +146 -0
- package/dist/app/kernel/view.js +28 -0
- package/dist/app/registry.d.ts +10 -0
- package/dist/app/registry.js +50 -0
- package/dist/cli/args.d.ts +5 -0
- package/dist/cli/args.js +6 -0
- package/dist/cli/commands/engine.d.ts +2 -0
- package/dist/cli/commands/engine.js +60 -0
- package/dist/cli/commands/index.d.ts +1 -1
- package/dist/cli/commands/index.js +1 -1
- package/dist/cli/commands/launch/launch.js +49 -7
- package/dist/cli/commands/launch/prepare.js +3 -3
- package/dist/cli/commands/launch/running.js +2 -1
- package/dist/cli/commands/launch/summary.d.ts +2 -0
- package/dist/cli/commands/maintenance/config-share.d.ts +12 -0
- package/dist/cli/commands/maintenance/config-share.js +80 -0
- package/dist/cli/commands/maintenance/config.js +8 -82
- package/dist/cli/commands/maintenance/logs.js +14 -0
- package/dist/cli/commands/registry.js +3 -7
- package/dist/cli/commands/repair/checks/contained.d.ts +2 -0
- package/dist/cli/commands/repair/checks/contained.js +139 -0
- package/dist/cli/commands/repair/checks/hcs.d.ts +7 -0
- package/dist/cli/commands/repair/checks/hcs.js +28 -0
- package/dist/cli/commands/repair/checks/index.js +4 -0
- package/dist/cli/commands/repair/checks/pc.js +32 -1
- package/dist/cli/commands/repair/checks/sandbox.js +16 -1
- package/dist/cli/commands/repair/checks/vpn.js +34 -9
- package/dist/cli/commands/repair/env.js +2 -1
- package/dist/cli/commands/sessions/index.d.ts +0 -4
- package/dist/cli/commands/sessions/index.js +3 -7
- package/dist/cli/commands/shared-use.d.ts +5 -2
- package/dist/cli/commands/shared-use.js +11 -8
- package/dist/cli/commands/storage/contained.d.ts +3 -0
- package/dist/cli/commands/storage/contained.js +179 -0
- package/dist/cli/commands/storage/offer.js +7 -1
- package/dist/cli/commands/storage/storage.js +10 -2
- package/dist/cli/commands/user-config.js +1 -1
- package/dist/cli/commands/vpn.js +20 -3
- package/dist/cli/commands/web.d.ts +5 -0
- package/dist/cli/commands/web.js +40 -0
- package/dist/cli/index.js +2 -1
- package/dist/cli/manifest.d.ts +72 -104
- package/dist/cli/manifest.js +64 -39
- package/dist/cli/menu/add-agent.d.ts +1 -1
- package/dist/cli/menu/add-agent.js +1 -1
- package/dist/cli/menu/apps.d.ts +7 -1
- package/dist/cli/menu/apps.js +36 -0
- package/dist/cli/menu/command-fields.d.ts +1 -1
- package/dist/cli/menu/command-form.js +2 -2
- package/dist/cli/menu/io-menu.d.ts +29 -0
- package/dist/cli/menu/io-menu.js +126 -0
- package/dist/cli/menu/live.d.ts +27 -0
- package/dist/cli/menu/live.js +69 -0
- package/dist/cli/menu/memory.d.ts +19 -0
- package/dist/cli/menu/memory.js +53 -0
- package/dist/cli/menu/menu.d.ts +10 -1
- package/dist/cli/menu/menu.js +27 -9
- package/dist/cli/menu/pages/agents-page.d.ts +3 -1
- package/dist/cli/menu/pages/agents-page.js +12 -5
- package/dist/cli/menu/pages/apps-page.d.ts +3 -1
- package/dist/cli/menu/pages/apps-page.js +19 -2
- package/dist/cli/menu/pages/list-page.d.ts +27 -0
- package/dist/cli/menu/pages/list-page.js +109 -7
- package/dist/cli/menu/pages/maintenance-page.d.ts +0 -5
- package/dist/cli/menu/pages/maintenance-page.js +17 -19
- package/dist/cli/menu/pages/sandbox-page.d.ts +4 -6
- package/dist/cli/menu/pages/sandbox-page.js +26 -118
- package/dist/cli/menu/pages/scopes.d.ts +1 -1
- package/dist/cli/menu/pages/sessions-page.d.ts +5 -11
- package/dist/cli/menu/pages/sessions-page.js +19 -88
- package/dist/cli/menu/pages/settings-page.d.ts +2 -10
- package/dist/cli/menu/pages/settings-page.js +64 -94
- package/dist/cli/menu/render-view.d.ts +28 -0
- package/dist/cli/menu/render-view.js +112 -0
- package/dist/cli/menu/settings/{path-kind.d.ts → ask-path.d.ts} +1 -7
- package/dist/cli/menu/settings/ask-path.js +14 -0
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +1 -1
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +1 -2
- package/dist/cli/menu/settings/collections/string-list-editor.js +1 -1
- package/dist/cli/menu/settings/draft.d.ts +1 -1
- package/dist/cli/menu/settings/format.d.ts +1 -3
- package/dist/cli/menu/settings/format.js +6 -36
- package/dist/cli/menu/settings/index.d.ts +1 -3
- package/dist/cli/menu/settings/index.js +3 -3
- package/dist/cli/menu/settings/object-editor.d.ts +1 -1
- package/dist/cli/menu/settings/share.d.ts +36 -0
- package/dist/cli/menu/settings/share.js +131 -0
- package/dist/cli/menu/settings/value-editor.d.ts +5 -1
- package/dist/cli/menu/settings/value-editor.js +57 -54
- package/dist/cli/menu/several.js +1 -1
- package/dist/cli/menu/share-settings.d.ts +21 -0
- package/dist/cli/menu/share-settings.js +112 -0
- package/dist/cli/menu/shell.d.ts +21 -5
- package/dist/cli/menu/shell.js +31 -6
- package/dist/cli/menu/views.d.ts +7 -0
- package/dist/cli/menu/views.js +11 -0
- package/dist/cli/menu/vpn-login.js +8 -0
- package/dist/cli/operations/handler.d.ts +6 -0
- package/dist/cli/operations/handler.js +61 -0
- package/dist/cli/operations/index.d.ts +4 -0
- package/dist/cli/operations/index.js +5 -0
- package/dist/cli/operations/input.d.ts +6 -0
- package/dist/cli/operations/input.js +37 -0
- package/dist/cli/operations/io-cli.d.ts +7 -0
- package/dist/cli/operations/io-cli.js +62 -0
- package/dist/cli/operations/spec.d.ts +18 -0
- package/dist/cli/operations/spec.js +108 -0
- package/dist/cli/output/colors.d.ts +2 -2
- package/dist/cli/output/colors.js +2 -11
- package/dist/cli/output/index.d.ts +1 -0
- package/dist/cli/output/index.js +1 -0
- package/dist/cli/output/print.d.ts +3 -1
- package/dist/cli/output/print.js +7 -3
- package/dist/cli/output/progress.d.ts +15 -0
- package/dist/cli/output/progress.js +44 -0
- package/dist/cli/output/render-view.d.ts +4 -0
- package/dist/cli/output/render-view.js +63 -0
- package/dist/cli/services/agent-commands-service.d.ts +2 -0
- package/dist/cli/services/agent-commands-service.js +11 -2
- package/dist/cli/services/logs-service.js +4 -3
- package/dist/cli/tui/app.d.ts +6 -1
- package/dist/cli/tui/app.js +26 -4
- package/dist/cli/tui/list/list-screen.d.ts +14 -0
- package/dist/cli/tui/list/list-screen.js +64 -36
- package/dist/cli/tui/list/list-types.d.ts +2 -0
- package/dist/cli/tui/terminal.d.ts +7 -0
- package/dist/cli/tui/terminal.js +30 -10
- package/dist/core/config/defaults.js +9 -1
- package/dist/core/schema/config.d.ts +14 -0
- package/dist/core/schema/config.js +16 -1
- package/dist/core/schema/harness.d.ts +1 -0
- package/dist/core/schema/harness.js +5 -0
- package/dist/core/schema/sandbox.d.ts +6 -0
- package/dist/core/schema/sandbox.js +20 -3
- package/dist/core/schema/vpn.d.ts +2 -1
- package/dist/core/schema/vpn.js +4 -4
- package/dist/core/schema/web.d.ts +1 -0
- package/dist/core/schema/web.js +4 -1
- package/dist/core/types.d.ts +23 -5
- package/dist/core/util/fs.d.ts +2 -0
- package/dist/core/util/fs.js +9 -0
- package/dist/core/util/index.d.ts +1 -1
- package/dist/core/util/index.js +1 -1
- package/dist/guest/agents/agent-files.d.ts +5 -0
- package/dist/guest/agents/agent-files.js +4 -0
- package/dist/guest/agents/local-state.d.ts +2 -0
- package/dist/guest/agents/local-state.js +21 -1
- package/dist/guest/boot/boot.js +5 -2
- package/dist/guest/daemon/daemon.js +4 -0
- package/dist/guest/daemon/sessions.d.ts +5 -0
- package/dist/guest/daemon/sessions.js +17 -3
- package/dist/guest/entries/daemon.js +3 -0
- package/dist/guest/governor/decide.d.ts +71 -0
- package/dist/guest/governor/decide.js +211 -0
- package/dist/guest/governor/governor.d.ts +45 -0
- package/dist/guest/governor/governor.js +230 -0
- package/dist/guest/governor/index.d.ts +2 -0
- package/dist/guest/governor/index.js +2 -0
- package/dist/guest/network/firewall.d.ts +1 -0
- package/dist/guest/network/firewall.js +65 -23
- package/dist/guest/runtime/csc.d.ts +1 -0
- package/dist/guest/runtime/csc.js +1 -0
- package/dist/guest/runtime/process.js +53 -5
- package/dist/guest/sessions/viewer.js +3 -1
- package/dist/guest/setup/claude-mem.js +12 -4
- package/dist/guest/toolchains/languages/node.js +29 -3
- package/dist/guest/toolchains/native/rust-extras.js +4 -2
- package/dist/guest/vpn/vpn.js +69 -21
- package/dist/guest/vpn/wireguard.d.ts +32 -0
- package/dist/guest/vpn/wireguard.js +132 -0
- package/dist/host/agent-commands/commands.d.ts +4 -0
- package/dist/host/agent-commands/commands.js +31 -7
- package/dist/host/audit/log.d.ts +1 -1
- package/dist/host/channel/attach.d.ts +3 -1
- package/dist/host/channel/attach.js +5 -2
- package/dist/host/channel/channel.d.ts +2 -0
- package/dist/host/channel/channel.js +4 -0
- package/dist/host/engines/engine.d.ts +12 -0
- package/dist/host/engines/engine.js +1 -0
- package/dist/host/engines/hcs/check.d.ts +25 -0
- package/dist/host/engines/hcs/check.js +95 -0
- package/dist/host/engines/hcs/documents.d.ts +44 -0
- package/dist/host/engines/hcs/documents.js +155 -0
- package/dist/host/engines/hcs/engine.d.ts +39 -0
- package/dist/host/engines/hcs/engine.js +171 -0
- package/dist/host/engines/hcs/helper.d.ts +43 -0
- package/dist/host/engines/hcs/helper.js +173 -0
- package/dist/host/engines/hcs/images.d.ts +37 -0
- package/dist/host/engines/hcs/images.js +152 -0
- package/dist/host/engines/index.d.ts +7 -0
- package/dist/host/engines/index.js +5 -0
- package/dist/host/engines/registry.d.ts +16 -0
- package/dist/host/engines/registry.js +30 -0
- package/dist/host/engines/types.d.ts +58 -0
- package/dist/host/engines/types.js +1 -0
- package/dist/host/engines/windows-sandbox/engine.d.ts +16 -0
- package/dist/host/engines/windows-sandbox/engine.js +63 -0
- package/dist/host/engines/windows-sandbox/wsb-text.d.ts +2 -0
- package/dist/host/engines/windows-sandbox/wsb-text.js +29 -0
- package/dist/host/launch/generate.d.ts +5 -1
- package/dist/host/launch/generate.js +50 -8
- package/dist/host/launch/index.d.ts +3 -1
- package/dist/host/launch/index.js +3 -1
- package/dist/host/launch/launch-plan.d.ts +13 -0
- package/dist/host/launch/launch-plan.js +26 -0
- package/dist/host/launch/mappings.js +2 -1
- package/dist/host/launch/risk-notes.d.ts +10 -0
- package/dist/host/launch/risk-notes.js +18 -0
- package/dist/host/launch/session-file.d.ts +2 -0
- package/dist/host/launch/session-file.js +7 -1
- package/dist/host/launch/wsb-file.d.ts +28 -4
- package/dist/host/launch/wsb-file.js +61 -42
- package/dist/host/life/crash-report.d.ts +27 -1
- package/dist/host/life/crash-report.js +173 -7
- package/dist/host/life/host-memory.d.ts +41 -0
- package/dist/host/life/host-memory.js +140 -0
- package/dist/host/life/index.d.ts +2 -0
- package/dist/host/life/index.js +2 -0
- package/dist/host/life/stop-events.d.ts +2 -0
- package/dist/host/life/stop-events.js +20 -3
- package/dist/host/life/stop-warning.js +1 -1
- package/dist/host/life/watchdog.d.ts +56 -0
- package/dist/host/life/watchdog.js +124 -0
- package/dist/host/native.d.ts +3 -2
- package/dist/host/native.js +22 -3
- package/dist/host/profile/claude-login.js +3 -2
- package/dist/host/sandbox/contained-deps.d.ts +2 -0
- package/dist/host/sandbox/contained-deps.js +17 -0
- package/dist/host/sandbox/index.d.ts +2 -0
- package/dist/host/sandbox/index.js +2 -0
- package/dist/host/sandbox/platform.d.ts +2 -0
- package/dist/host/sandbox/platform.js +7 -7
- package/dist/host/sandbox/tasklist.d.ts +13 -0
- package/dist/host/sandbox/tasklist.js +47 -0
- package/dist/host/secrets/launch-secrets.js +2 -1
- package/dist/host/sharing/current.js +2 -6
- package/dist/host/storage/contained/check.d.ts +9 -0
- package/dist/host/storage/contained/check.js +37 -0
- package/dist/host/storage/contained/contained-storage.d.ts +66 -0
- package/dist/host/storage/contained/contained-storage.js +168 -0
- package/dist/host/storage/contained/disk-port.d.ts +43 -0
- package/dist/host/storage/contained/disk-port.js +122 -0
- package/dist/host/storage/contained/index.d.ts +9 -0
- package/dist/host/storage/contained/index.js +8 -0
- package/dist/host/storage/contained/layout.d.ts +28 -0
- package/dist/host/storage/contained/layout.js +45 -0
- package/dist/host/storage/contained/resolve.d.ts +4 -0
- package/dist/host/storage/contained/resolve.js +30 -0
- package/dist/host/storage/contained/setting.d.ts +1 -0
- package/dist/host/storage/contained/setting.js +5 -0
- package/dist/host/storage/contained/state.d.ts +89 -0
- package/dist/host/storage/contained/state.js +166 -0
- package/dist/host/storage/contained/transfer.d.ts +24 -0
- package/dist/host/storage/contained/transfer.js +121 -0
- package/dist/host/storage/index.d.ts +2 -0
- package/dist/host/storage/index.js +2 -0
- package/dist/host/storage/providers/contained.d.ts +15 -0
- package/dist/host/storage/providers/contained.js +39 -0
- package/dist/host/storage/providers/folder.d.ts +12 -0
- package/dist/host/storage/providers/folder.js +20 -0
- package/dist/host/storage/providers/index.d.ts +4 -0
- package/dist/host/storage/providers/index.js +3 -0
- package/dist/host/storage/providers/registry.d.ts +9 -0
- package/dist/host/storage/providers/registry.js +14 -0
- package/dist/host/storage/providers/types.d.ts +33 -0
- package/dist/host/storage/providers/types.js +1 -0
- package/dist/host/tools/conpty.js +3 -2
- package/dist/host/tools/windows-terminal.js +8 -7
- package/dist/host/vpn/index.d.ts +1 -1
- package/dist/host/vpn/index.js +1 -1
- package/dist/host/vpn/prepare.d.ts +2 -0
- package/dist/host/vpn/prepare.js +63 -2
- package/dist/host/web/browser.d.ts +2 -0
- package/dist/host/web/browser.js +14 -1
- package/dist/host/web/index.d.ts +3 -2
- package/dist/host/web/index.js +3 -2
- package/dist/host/web/rpc.d.ts +24 -0
- package/dist/host/web/rpc.js +149 -0
- package/dist/host/web/runner.d.ts +2 -0
- package/dist/host/web/runner.js +1 -2
- package/dist/host/web/server.d.ts +7 -0
- package/dist/host/web/server.js +23 -3
- package/dist/runtime/agent.js +83 -18
- package/dist/runtime/daemon.js +1805 -1221
- package/dist/runtime/db.js +83 -18
- package/dist/runtime/main.js +779 -219
- package/dist/runtime/netproxy.js +73 -11
- package/dist/runtime/view.js +91 -16
- package/dist/selftest/agent-paths.test.js +11 -1
- package/dist/selftest/app.test.d.ts +2 -0
- package/dist/selftest/app.test.js +324 -0
- package/dist/selftest/channel.test.js +13 -0
- package/dist/selftest/cli.test.js +2 -1
- package/dist/selftest/config.test.js +59 -0
- package/dist/selftest/contained.test.d.ts +2 -0
- package/dist/selftest/contained.test.js +544 -0
- package/dist/selftest/credentials.test.js +1 -1
- package/dist/selftest/engine.test.d.ts +2 -0
- package/dist/selftest/engine.test.js +127 -0
- package/dist/selftest/guest-boot.test.js +47 -1
- package/dist/selftest/hcs.test.d.ts +2 -0
- package/dist/selftest/hcs.test.js +482 -0
- package/dist/selftest/heavy-load.test.d.ts +2 -0
- package/dist/selftest/heavy-load.test.js +355 -0
- package/dist/selftest/index.js +12 -0
- package/dist/selftest/layout.test.js +12 -0
- package/dist/selftest/menu-perf.test.d.ts +2 -0
- package/dist/selftest/menu-perf.test.js +248 -0
- package/dist/selftest/menu-screens.js +4 -2
- package/dist/selftest/menu.test.js +36 -8
- package/dist/selftest/network.test.js +20 -1
- package/dist/selftest/support/engine-cases.d.ts +8 -0
- package/dist/selftest/support/engine-cases.js +65 -0
- package/dist/selftest/support/engine-golden.d.ts +3 -0
- package/dist/selftest/support/engine-golden.js +66 -0
- package/dist/selftest/support/fixtures.d.ts +8 -1
- package/dist/selftest/support/hcs-probes.d.ts +17 -0
- package/dist/selftest/support/hcs-probes.js +41 -0
- package/dist/selftest/vpn.test.js +136 -3
- package/dist/selftest/web.test.js +101 -3
- package/dist/shared/channel/run-dir.d.ts +4 -1
- package/dist/shared/channel/run-dir.js +7 -1
- package/dist/shared/channel/schema.d.ts +35 -1
- package/dist/shared/channel/schema.js +27 -0
- package/dist/shared/channel/secrets.d.ts +1 -0
- package/dist/shared/channel/secrets.js +6 -0
- package/dist/shared/io/copy-tree.d.ts +7 -0
- package/dist/shared/io/copy-tree.js +45 -0
- package/dist/shared/io/index.d.ts +2 -0
- package/dist/shared/io/index.js +2 -0
- package/dist/shared/io/robocopy-result.d.ts +6 -0
- package/dist/shared/io/robocopy-result.js +23 -0
- package/dist/shared/memory/index.d.ts +1 -0
- package/dist/shared/memory/index.js +1 -0
- package/dist/shared/memory/policy.d.ts +38 -0
- package/dist/shared/memory/policy.js +63 -0
- package/dist/shared/network/firewall-rules.d.ts +8 -0
- package/dist/shared/network/firewall-rules.js +28 -0
- package/dist/shared/pty/output-filter.d.ts +14 -1
- package/dist/shared/pty/output-filter.js +22 -4
- package/dist/shared/pty/terminal.d.ts +4 -1
- package/dist/shared/pty/terminal.js +4 -2
- package/dist/shared/system.d.ts +1 -0
- package/dist/shared/system.js +1 -0
- package/dist/shared/vpn/download.d.ts +16 -0
- package/dist/shared/vpn/download.js +16 -0
- package/dist/shared/vpn/wireguard.d.ts +51 -0
- package/dist/shared/vpn/wireguard.js +227 -0
- package/dist/sync/sync-cycle.js +5 -5
- package/dist/sync/watcher.d.ts +13 -0
- package/dist/sync/watcher.js +92 -3
- package/dist/web/index.html +4 -3
- package/dist/web/main-NRRS5O6Z.js +157 -0
- package/dist/web/main-T5DMCHYV.css +1 -0
- package/native/csharp/HcsHost/AssemblyInfo.cs +14 -0
- package/native/csharp/HcsHost/Guard.cs +100 -0
- package/native/csharp/HcsHost/Hcs.cs +256 -0
- package/native/csharp/HcsHost/Json.cs +78 -0
- package/native/csharp/HcsHost/Program.cs +185 -0
- package/native/csharp/HcsHost/VirtualDisk.cs +95 -0
- package/native/csharp/HostTools/AssemblyInfo.cs +14 -0
- package/native/csharp/HostTools/MemoryStatus.cs +128 -0
- package/native/csharp/HostTools/Program.cs +58 -17
- package/native/scripts/check-contained.ps1 +28 -0
- package/native/scripts/contained-common.ps1 +241 -0
- package/native/scripts/dismount-contained.ps1 +66 -0
- package/native/scripts/memory-status.ps1 +42 -0
- package/native/scripts/mount-contained.ps1 +139 -0
- package/native/scripts/run-elevated.ps1 +17 -4
- package/native/scripts/stop-events.ps1 +23 -8
- package/package.json +9 -2
- package/sandbox/csharp/MemGov.cs +466 -0
- package/sandbox/csharp/PtyHost.cs +111 -5
- package/sandbox/scripts/new-shortcuts.ps1 +3 -1
- package/schemas/config.schema.json +66 -8
- package/schemas/sandbox-config.schema.json +3 -3
- package/dist/cli/commands/sessions/control.d.ts +0 -4
- package/dist/cli/commands/sessions/control.js +0 -66
- package/dist/cli/commands/sessions/list.d.ts +0 -2
- package/dist/cli/commands/sessions/list.js +0 -48
- package/dist/cli/commands/sessions/status.d.ts +0 -4
- package/dist/cli/commands/sessions/status.js +0 -114
- package/dist/cli/commands/sessions/window.d.ts +0 -3
- package/dist/cli/commands/sessions/window.js +0 -18
- package/dist/cli/menu/settings/path-kind.js +0 -44
- package/dist/web/main-CXESL347.js +0 -45
- package/dist/web/main-VLR7DVQ4.css +0 -1
- /package/dist/{cli/menu/settings → app/kernel}/schema-node.d.ts +0 -0
- /package/dist/{cli/menu/settings → app/kernel}/schema-node.js +0 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
// The running sandbox as a whole: what it is doing (a live query), its window, and stopping it. Pure: schemas, labels
|
|
2
|
+
// and the view; sandbox.run.ts does the work.
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { action, ago, defineOperation, defineQuery, defineView, plural, } from '../../kernel/index.js';
|
|
5
|
+
const ProjectSchema = z.object({
|
|
6
|
+
name: z.string().describe('The project'),
|
|
7
|
+
host: z.string().describe('Its folder on this PC'),
|
|
8
|
+
guest: z.string().describe('Its folder in the sandbox'),
|
|
9
|
+
mechanism: z.string().describe('How it got into the sandbox (launch, root, boot or share)'),
|
|
10
|
+
here: z.boolean().describe('The project of the current folder'),
|
|
11
|
+
setup: z.object({ phase: z.string(), message: z.string() }).describe('How far its setup is'),
|
|
12
|
+
databases: z.array(z.object({ database: z.string(), port: z.number(), state: z.string() })),
|
|
13
|
+
sessions: z.array(z.object({ id: z.string(), harness: z.string(), viewers: z.string(), started: z.string() })),
|
|
14
|
+
repoGuard: z.array(z.string()).describe('Repo guard findings in its folder'),
|
|
15
|
+
});
|
|
16
|
+
const StateSchema = z.object({
|
|
17
|
+
running: z.boolean().describe('A Windows Sandbox is running'),
|
|
18
|
+
phase: z.string().describe('What it is doing (ready, provisioning ...)'),
|
|
19
|
+
message: z.string().optional().describe('Its last message'),
|
|
20
|
+
headless: z.boolean().optional().describe('Its window is hidden'),
|
|
21
|
+
startedAt: z.number().nullable().describe('When it started (ms), if known'),
|
|
22
|
+
daemon: z.string().describe("The sandbox helper's answer"),
|
|
23
|
+
account: z.string().nullable().describe('The Claude login it uses'),
|
|
24
|
+
syncWatcher: z.boolean().describe('The background history sync runs'),
|
|
25
|
+
});
|
|
26
|
+
export const SandboxStatusSchema = z.object({
|
|
27
|
+
/** Present when the running sandbox is another user's. */
|
|
28
|
+
shared: z
|
|
29
|
+
.object({
|
|
30
|
+
line: z.string().describe('"Running, started by alice (shared with you)"'),
|
|
31
|
+
limited: z.boolean().describe('Not shared with you: nothing more is shown'),
|
|
32
|
+
startedBy: z.string().nullable().describe('Whose it is'),
|
|
33
|
+
})
|
|
34
|
+
.optional(),
|
|
35
|
+
sandbox: StateSchema,
|
|
36
|
+
here: z.object({ folder: z.string(), project: z.string().nullable(), guest: z.string().nullable() }),
|
|
37
|
+
roots: z.array(z.object({ host: z.string(), guest: z.string() })),
|
|
38
|
+
projects: z.array(ProjectSchema),
|
|
39
|
+
otherSessions: z.array(z.object({ id: z.string(), harness: z.string(), cwd: z.string() })),
|
|
40
|
+
repoGuard: z.object({ guarded: z.number(), findings: z.array(z.string()) }),
|
|
41
|
+
});
|
|
42
|
+
const MessageSchema = z.object({ message: z.string().describe('What happened') });
|
|
43
|
+
/** "pong (2 session(s) running)" from the helper in the sandbox, in plain words. */
|
|
44
|
+
export function helperText(answer) {
|
|
45
|
+
const sessions = /^pong \((\d+) session/.exec(answer);
|
|
46
|
+
if (!sessions)
|
|
47
|
+
return answer;
|
|
48
|
+
return 'responding, ' + plural(Number(sessions[1]), 'session') + ' running';
|
|
49
|
+
}
|
|
50
|
+
/** How long it has been up ("3 h"), or null. */
|
|
51
|
+
function uptime(s) {
|
|
52
|
+
return s.running && s.startedAt ? ago(s.startedAt).replace(' ago', '') : null;
|
|
53
|
+
}
|
|
54
|
+
export const sandboxStatus = defineQuery({
|
|
55
|
+
id: 'sandbox.status',
|
|
56
|
+
title: 'Sandbox status',
|
|
57
|
+
summary: 'show what the sandbox is doing',
|
|
58
|
+
input: z.object({}),
|
|
59
|
+
output: SandboxStatusSchema,
|
|
60
|
+
live: { everyMs: 2500 },
|
|
61
|
+
cli: {
|
|
62
|
+
name: 'status',
|
|
63
|
+
group: 'Sessions',
|
|
64
|
+
json: true,
|
|
65
|
+
// The --json shape `sandbox status` has always printed.
|
|
66
|
+
shapeJson: (o) => {
|
|
67
|
+
if (o.shared?.limited)
|
|
68
|
+
return { sandbox: { running: true, shared: false, startedBy: o.shared.startedBy } };
|
|
69
|
+
const s = o.sandbox;
|
|
70
|
+
const borrowed = o.shared?.startedBy ? { startedBy: o.shared.startedBy, shared: true } : {};
|
|
71
|
+
return {
|
|
72
|
+
sandbox: {
|
|
73
|
+
...borrowed,
|
|
74
|
+
running: s.running,
|
|
75
|
+
phase: s.phase,
|
|
76
|
+
message: s.message,
|
|
77
|
+
headless: s.headless,
|
|
78
|
+
uptime: uptime(s),
|
|
79
|
+
daemon: s.daemon,
|
|
80
|
+
account: s.account,
|
|
81
|
+
syncWatcher: s.syncWatcher,
|
|
82
|
+
},
|
|
83
|
+
here: o.here,
|
|
84
|
+
roots: o.roots,
|
|
85
|
+
projects: o.projects,
|
|
86
|
+
otherSessions: o.otherSessions,
|
|
87
|
+
repoGuard: o.repoGuard,
|
|
88
|
+
};
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
export const showWindow = defineOperation({
|
|
93
|
+
id: 'sandbox.showWindow',
|
|
94
|
+
title: 'Show the window',
|
|
95
|
+
summary: 'show the sandbox window',
|
|
96
|
+
input: z.object({}),
|
|
97
|
+
output: MessageSchema,
|
|
98
|
+
text: (o) => o.message,
|
|
99
|
+
cli: { name: 'show', group: 'Sessions' },
|
|
100
|
+
});
|
|
101
|
+
export const hideWindow = defineOperation({
|
|
102
|
+
id: 'sandbox.hideWindow',
|
|
103
|
+
title: 'Hide the window',
|
|
104
|
+
summary: 'hide the sandbox window (it keeps running)',
|
|
105
|
+
input: z.object({}),
|
|
106
|
+
output: MessageSchema,
|
|
107
|
+
text: (o) => o.message,
|
|
108
|
+
cli: { name: 'hide', group: 'Sessions' },
|
|
109
|
+
});
|
|
110
|
+
export const stopSandbox = defineOperation({
|
|
111
|
+
id: 'sandbox.stop',
|
|
112
|
+
title: 'Stop the sandbox…',
|
|
113
|
+
summary: "shut the sandbox down (every project's sessions end)",
|
|
114
|
+
input: z.object({}),
|
|
115
|
+
output: z.object({ stopped: z.boolean().describe('It was asked to shut down'), message: z.string() }),
|
|
116
|
+
danger: true,
|
|
117
|
+
text: (o) => o.message,
|
|
118
|
+
cli: { name: 'stop', group: 'Agents', yes: "do not ask when other projects' sessions would end" },
|
|
119
|
+
});
|
|
120
|
+
const MECHANISM_TEXT = {
|
|
121
|
+
launch: 'started from here',
|
|
122
|
+
root: 'in a project root',
|
|
123
|
+
boot: 'mapped at start',
|
|
124
|
+
};
|
|
125
|
+
function projectItem(p) {
|
|
126
|
+
return {
|
|
127
|
+
id: 'project:' + p.name,
|
|
128
|
+
label: p.name,
|
|
129
|
+
hint: p.host + ' -> ' + p.guest + ' (' + (MECHANISM_TEXT[p.mechanism] ?? 'wsb share') + ')',
|
|
130
|
+
marked: p.here,
|
|
131
|
+
details: [
|
|
132
|
+
'setup: ' + p.setup.phase + (p.setup.phase === 'ready' ? '' : ' - ' + p.setup.message),
|
|
133
|
+
...(p.databases.length
|
|
134
|
+
? ['databases: ' + p.databases.map((d) => d.database + ' :' + d.port + ' ' + d.state).join(', ')]
|
|
135
|
+
: []),
|
|
136
|
+
...p.sessions.map((s) => 'session ' + s.id + ' ' + s.harness + ' ' + s.viewers + ' ' + ago(s.started)),
|
|
137
|
+
...p.repoGuard.map((f) => 'guard: ' + f),
|
|
138
|
+
],
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function facts(o) {
|
|
142
|
+
const s = o.sandbox;
|
|
143
|
+
const sessions = o.projects.reduce((n, p) => n + p.sessions.length, 0) + o.otherSessions.length;
|
|
144
|
+
const fact = (id, label, value, extra = {}) => ({
|
|
145
|
+
id,
|
|
146
|
+
label,
|
|
147
|
+
value,
|
|
148
|
+
...extra,
|
|
149
|
+
});
|
|
150
|
+
return [
|
|
151
|
+
...(o.shared?.startedBy ? [fact('owner', 'Started by', o.shared.startedBy)] : []),
|
|
152
|
+
fact('running', 'Running', s.running ? 'yes' : 'no', { tone: s.running ? 'ok' : 'muted' }),
|
|
153
|
+
...(s.running
|
|
154
|
+
? [
|
|
155
|
+
fact('phase', 'Phase', s.phase, { tone: s.phase === 'ready' ? 'ok' : 'warn' }),
|
|
156
|
+
fact('message', 'Message', s.message || '-'),
|
|
157
|
+
fact('window', 'Window', s.headless ? 'hidden (sandbox show opens it)' : 'shown'),
|
|
158
|
+
fact('uptime', 'Uptime', uptime(s) ?? '-'),
|
|
159
|
+
fact('helper', 'Helper', s.daemon === '-' ? '-' : helperText(s.daemon)),
|
|
160
|
+
fact('sessions', 'Sessions', String(sessions)),
|
|
161
|
+
]
|
|
162
|
+
: []),
|
|
163
|
+
fact('account', 'Account', s.account ?? 'none selected (sandbox account use)'),
|
|
164
|
+
fact('sync', 'Background sync', s.syncWatcher ? 'on' : 'off'),
|
|
165
|
+
];
|
|
166
|
+
}
|
|
167
|
+
function projectsSection(o) {
|
|
168
|
+
const roots = o.roots.map((r) => ({
|
|
169
|
+
id: 'root:' + r.host,
|
|
170
|
+
label: 'root',
|
|
171
|
+
hint: r.host + ' -> ' + r.guest + ' (every project in it opens without a restart)',
|
|
172
|
+
}));
|
|
173
|
+
const here = o.projects.some((p) => p.here);
|
|
174
|
+
return {
|
|
175
|
+
id: 'projects',
|
|
176
|
+
title: 'Projects',
|
|
177
|
+
items: [...o.projects.map(projectItem), ...roots],
|
|
178
|
+
notes: [
|
|
179
|
+
here
|
|
180
|
+
? { text: '* = the project of this folder', tone: 'muted' }
|
|
181
|
+
: { text: o.here.folder + ' is not in this sandbox (start it here: sandbox claude)', tone: 'muted' },
|
|
182
|
+
],
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function guardSection(o) {
|
|
186
|
+
const findings = o.repoGuard.findings;
|
|
187
|
+
return {
|
|
188
|
+
id: 'guard',
|
|
189
|
+
title: 'Repo guard',
|
|
190
|
+
summary: o.repoGuard.guarded +
|
|
191
|
+
' folder(s) guarded; ' +
|
|
192
|
+
(findings.length ? findings.length + ' change(s) neutralised:' : 'nothing from the sandbox needed neutralising'),
|
|
193
|
+
items: findings.slice(-10).map((f, i) => ({ id: 'guard:' + i, label: f, tone: 'warn' })),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/** The status page: the facts, the window and stop actions, the projects, and the repo guard. */
|
|
197
|
+
export function sandboxPage(o) {
|
|
198
|
+
const notice = o.shared
|
|
199
|
+
? {
|
|
200
|
+
text: o.shared.line + (o.shared.limited ? '' : '. Its window is on their desktop; use its agents here.'),
|
|
201
|
+
tone: 'accent',
|
|
202
|
+
}
|
|
203
|
+
: undefined;
|
|
204
|
+
if (o.shared?.limited)
|
|
205
|
+
return { title: 'Sandbox', notice, sections: [] };
|
|
206
|
+
const running = o.sandbox.running;
|
|
207
|
+
const status = {
|
|
208
|
+
id: 'status',
|
|
209
|
+
facts: facts(o),
|
|
210
|
+
actions: running
|
|
211
|
+
? [
|
|
212
|
+
action(showWindow, {}, { key: 'w', verb: 'show', importance: 3 }),
|
|
213
|
+
action(hideWindow, {}, { key: 'h', verb: 'hide', importance: 3 }),
|
|
214
|
+
action(stopSandbox, {}, { key: 'x', verb: 'stop', importance: 1 }),
|
|
215
|
+
]
|
|
216
|
+
: [],
|
|
217
|
+
};
|
|
218
|
+
const others = {
|
|
219
|
+
id: 'other-sessions',
|
|
220
|
+
title: 'Other sessions',
|
|
221
|
+
items: o.otherSessions.map((s) => ({
|
|
222
|
+
id: 'session:' + s.id,
|
|
223
|
+
label: 'session ' + s.id,
|
|
224
|
+
hint: s.harness + ' ' + s.cwd,
|
|
225
|
+
})),
|
|
226
|
+
};
|
|
227
|
+
return {
|
|
228
|
+
title: 'Sandbox',
|
|
229
|
+
notice,
|
|
230
|
+
sections: [
|
|
231
|
+
status,
|
|
232
|
+
...(running ? [projectsSection(o)] : []),
|
|
233
|
+
...(others.items?.length ? [others] : []),
|
|
234
|
+
guardSection(o),
|
|
235
|
+
],
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
export const sandboxView = defineView({
|
|
239
|
+
id: 'sandbox',
|
|
240
|
+
title: 'Sandbox',
|
|
241
|
+
summary: 'What the sandbox is doing, its window, and stopping it.',
|
|
242
|
+
queries: { status: sandboxStatus },
|
|
243
|
+
operations: [showWindow, hideWindow, stopSandbox],
|
|
244
|
+
build: ({ status }) => sandboxPage(status),
|
|
245
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export declare const sandboxStatusRun: import("../../kernel/define.js").Implementation<import("../../kernel/define.js").QueryDef<import("zod").ZodObject<{}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
|
|
2
|
+
shared: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
3
|
+
line: import("zod").ZodString;
|
|
4
|
+
limited: import("zod").ZodBoolean;
|
|
5
|
+
startedBy: import("zod").ZodNullable<import("zod").ZodString>;
|
|
6
|
+
}, import("zod/v4/core").$strip>>;
|
|
7
|
+
sandbox: import("zod").ZodObject<{
|
|
8
|
+
running: import("zod").ZodBoolean;
|
|
9
|
+
phase: import("zod").ZodString;
|
|
10
|
+
message: import("zod").ZodOptional<import("zod").ZodString>;
|
|
11
|
+
headless: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
12
|
+
startedAt: import("zod").ZodNullable<import("zod").ZodNumber>;
|
|
13
|
+
daemon: import("zod").ZodString;
|
|
14
|
+
account: import("zod").ZodNullable<import("zod").ZodString>;
|
|
15
|
+
syncWatcher: import("zod").ZodBoolean;
|
|
16
|
+
}, import("zod/v4/core").$strip>;
|
|
17
|
+
here: import("zod").ZodObject<{
|
|
18
|
+
folder: import("zod").ZodString;
|
|
19
|
+
project: import("zod").ZodNullable<import("zod").ZodString>;
|
|
20
|
+
guest: import("zod").ZodNullable<import("zod").ZodString>;
|
|
21
|
+
}, import("zod/v4/core").$strip>;
|
|
22
|
+
roots: import("zod").ZodArray<import("zod").ZodObject<{
|
|
23
|
+
host: import("zod").ZodString;
|
|
24
|
+
guest: import("zod").ZodString;
|
|
25
|
+
}, import("zod/v4/core").$strip>>;
|
|
26
|
+
projects: import("zod").ZodArray<import("zod").ZodObject<{
|
|
27
|
+
name: import("zod").ZodString;
|
|
28
|
+
host: import("zod").ZodString;
|
|
29
|
+
guest: import("zod").ZodString;
|
|
30
|
+
mechanism: import("zod").ZodString;
|
|
31
|
+
here: import("zod").ZodBoolean;
|
|
32
|
+
setup: import("zod").ZodObject<{
|
|
33
|
+
phase: import("zod").ZodString;
|
|
34
|
+
message: import("zod").ZodString;
|
|
35
|
+
}, import("zod/v4/core").$strip>;
|
|
36
|
+
databases: import("zod").ZodArray<import("zod").ZodObject<{
|
|
37
|
+
database: import("zod").ZodString;
|
|
38
|
+
port: import("zod").ZodNumber;
|
|
39
|
+
state: import("zod").ZodString;
|
|
40
|
+
}, import("zod/v4/core").$strip>>;
|
|
41
|
+
sessions: import("zod").ZodArray<import("zod").ZodObject<{
|
|
42
|
+
id: import("zod").ZodString;
|
|
43
|
+
harness: import("zod").ZodString;
|
|
44
|
+
viewers: import("zod").ZodString;
|
|
45
|
+
started: import("zod").ZodString;
|
|
46
|
+
}, import("zod/v4/core").$strip>>;
|
|
47
|
+
repoGuard: import("zod").ZodArray<import("zod").ZodString>;
|
|
48
|
+
}, import("zod/v4/core").$strip>>;
|
|
49
|
+
otherSessions: import("zod").ZodArray<import("zod").ZodObject<{
|
|
50
|
+
id: import("zod").ZodString;
|
|
51
|
+
harness: import("zod").ZodString;
|
|
52
|
+
cwd: import("zod").ZodString;
|
|
53
|
+
}, import("zod/v4/core").$strip>>;
|
|
54
|
+
repoGuard: import("zod").ZodObject<{
|
|
55
|
+
guarded: import("zod").ZodNumber;
|
|
56
|
+
findings: import("zod").ZodArray<import("zod").ZodString>;
|
|
57
|
+
}, import("zod/v4/core").$strip>;
|
|
58
|
+
}, import("zod/v4/core").$strip>, "sandbox.status">, import("../../../cli/commands/context.js").Context>;
|
|
59
|
+
export declare const showWindowRun: import("../../kernel/define.js").Implementation<import("../../kernel/define.js").OperationDef<import("zod").ZodObject<{}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
|
|
60
|
+
message: import("zod").ZodString;
|
|
61
|
+
}, import("zod/v4/core").$strip>, "sandbox.showWindow">, import("../../../cli/commands/context.js").Context>;
|
|
62
|
+
export declare const hideWindowRun: import("../../kernel/define.js").Implementation<import("../../kernel/define.js").OperationDef<import("zod").ZodObject<{}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
|
|
63
|
+
message: import("zod").ZodString;
|
|
64
|
+
}, import("zod/v4/core").$strip>, "sandbox.hideWindow">, import("../../../cli/commands/context.js").Context>;
|
|
65
|
+
/**
|
|
66
|
+
* Stopping ends every project's sessions: it says which, and the sessions of other projects need a yes (also on the
|
|
67
|
+
* command line, where --yes gives it; a script without it fails rather than end them by accident).
|
|
68
|
+
*/
|
|
69
|
+
export declare const stopSandboxRun: import("../../kernel/define.js").Implementation<import("../../kernel/define.js").OperationDef<import("zod").ZodObject<{}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
|
|
70
|
+
stopped: import("zod").ZodBoolean;
|
|
71
|
+
message: import("zod").ZodString;
|
|
72
|
+
}, import("zod/v4/core").$strip>, "sandbox.stop">, import("../../../cli/commands/context.js").Context>;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// The sandbox feature's work: its status (from the services, as this user may see it), its window and stopping it.
|
|
2
|
+
// Talks only through `io`; another user's sandbox follows the sharing rules (cli/commands/shared-use.ts).
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { safeText } from '../../../core/util/index.js';
|
|
5
|
+
import { SandboxChannel } from '../../../host/channel/index.js';
|
|
6
|
+
import { runningOwner } from '../../../host/sharing/index.js';
|
|
7
|
+
import { requireOnPc, requireRunning } from '../../../cli/commands/context.js';
|
|
8
|
+
import { hereDir } from '../../../cli/commands/projects/here.js';
|
|
9
|
+
import { lookAtSandbox, useSharedSandbox } from '../../../cli/commands/shared-use.js';
|
|
10
|
+
import { SandboxService } from '../../../cli/services/index.js';
|
|
11
|
+
import { implement, typedConfirm } from '../../context.js';
|
|
12
|
+
import { cancelled } from '../../kernel/index.js';
|
|
13
|
+
import { hideWindow, sandboxStatus, showWindow, stopSandbox } from './sandbox.def.js';
|
|
14
|
+
/** Another user's sandbox that is not shared: whose it is, and nothing else. */
|
|
15
|
+
function limitedStatus(view, folder) {
|
|
16
|
+
const owner = view.owner;
|
|
17
|
+
return {
|
|
18
|
+
shared: { line: view.line ?? '', limited: true, startedBy: owner?.kind === 'other' ? owner.user : null },
|
|
19
|
+
sandbox: {
|
|
20
|
+
running: true,
|
|
21
|
+
phase: 'unknown',
|
|
22
|
+
startedAt: null,
|
|
23
|
+
daemon: '-',
|
|
24
|
+
account: null,
|
|
25
|
+
syncWatcher: false,
|
|
26
|
+
},
|
|
27
|
+
here: { folder, project: null, guest: null },
|
|
28
|
+
roots: [],
|
|
29
|
+
projects: [],
|
|
30
|
+
otherSessions: [],
|
|
31
|
+
repoGuard: { guarded: 0, findings: [] },
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export const sandboxStatusRun = implement(sandboxStatus, async (asked) => {
|
|
35
|
+
const view = lookAtSandbox(asked);
|
|
36
|
+
if (view.limited)
|
|
37
|
+
return limitedStatus(view, hereDir(asked));
|
|
38
|
+
const report = await new SandboxService(view.ctx).status();
|
|
39
|
+
return {
|
|
40
|
+
...(view.line ? { shared: { line: view.line, limited: false, startedBy: view.ctx.borrowed?.user ?? null } } : {}),
|
|
41
|
+
...report,
|
|
42
|
+
sandbox: { ...report.sandbox, daemon: safeText(report.sandbox.daemon) },
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
export const showWindowRun = implement(showWindow, async (ctx, _input, io) => {
|
|
46
|
+
requireOnPc('show');
|
|
47
|
+
requireRunning();
|
|
48
|
+
await useSharedSandbox(ctx, { kind: 'owner-only', what: 'show the window', window: true }, typedConfirm(io));
|
|
49
|
+
new SandboxService(ctx).showWindow();
|
|
50
|
+
return { message: 'Sandbox window shown.' };
|
|
51
|
+
});
|
|
52
|
+
export const hideWindowRun = implement(hideWindow, async (ctx, _input, io) => {
|
|
53
|
+
requireOnPc('hide');
|
|
54
|
+
requireRunning();
|
|
55
|
+
await useSharedSandbox(ctx, { kind: 'owner-only', what: 'hide the window', window: true }, typedConfirm(io));
|
|
56
|
+
io.progress('Hiding the window');
|
|
57
|
+
await new SandboxService(ctx).hideWindow();
|
|
58
|
+
return { message: 'Sandbox window hidden. Bring it back with: sbx-show' };
|
|
59
|
+
});
|
|
60
|
+
/**
|
|
61
|
+
* Stopping ends every project's sessions: it says which, and the sessions of other projects need a yes (also on the
|
|
62
|
+
* command line, where --yes gives it; a script without it fails rather than end them by accident).
|
|
63
|
+
*/
|
|
64
|
+
export const stopSandboxRun = implement(stopSandbox, async (asked, _input, io) => {
|
|
65
|
+
requireOnPc('stop');
|
|
66
|
+
if (!new SandboxService(asked).isRunning())
|
|
67
|
+
return { stopped: false, message: 'No Windows Sandbox is running.' };
|
|
68
|
+
// Another user's sandbox: only when shared, and only after typing their name (--yes in scripts).
|
|
69
|
+
const ctx = runningOwner().kind === 'mine'
|
|
70
|
+
? asked
|
|
71
|
+
: await useSharedSandbox(asked, (shared) => ({ kind: 'stop', sessions: new SandboxChannel(shared.dataPath).currentSessions().length }), typedConfirm(io));
|
|
72
|
+
const service = new SandboxService(ctx);
|
|
73
|
+
const { sandbox, running, others } = service.stopPlan();
|
|
74
|
+
if (running.length)
|
|
75
|
+
io.log('Stopping ends ' +
|
|
76
|
+
running.length +
|
|
77
|
+
' session(s): ' +
|
|
78
|
+
running
|
|
79
|
+
.map((s) => safeText(s.harness) + ' in ' + safeText(s.project ?? path.win32.basename(s.cwd)))
|
|
80
|
+
.join(', ') +
|
|
81
|
+
'.');
|
|
82
|
+
const yes = await io.confirm({
|
|
83
|
+
title: others.length ? 'Stop the whole sandbox?' : 'Stop the sandbox?',
|
|
84
|
+
lines: others.length ? [others.length + ' of them belong to other projects.'] : [],
|
|
85
|
+
yes: 'Stop',
|
|
86
|
+
danger: true,
|
|
87
|
+
implied: others.length === 0,
|
|
88
|
+
noTerminal: {
|
|
89
|
+
message: others.length + ' of these sessions belong to other projects, so the sandbox was not stopped.',
|
|
90
|
+
fix: 'Stop it anyway with: sandbox stop --yes',
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
if (!yes)
|
|
94
|
+
cancelled();
|
|
95
|
+
io.progress('Asking the sandbox to shut down');
|
|
96
|
+
await service.shutdown(sandbox);
|
|
97
|
+
return { stopped: true, message: 'Sandbox is shutting down; history and claude-mem sync back when it closes.' };
|
|
98
|
+
});
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type Page } from '../../kernel/index.js';
|
|
3
|
+
/** A session as every surface may see it: never its attach address or token. */
|
|
4
|
+
export declare const SessionRowSchema: z.ZodObject<{
|
|
5
|
+
id: z.ZodString;
|
|
6
|
+
launchId: z.ZodString;
|
|
7
|
+
harness: z.ZodString;
|
|
8
|
+
cwd: z.ZodString;
|
|
9
|
+
project: z.ZodOptional<z.ZodString>;
|
|
10
|
+
phase: z.ZodEnum<{
|
|
11
|
+
failed: "failed";
|
|
12
|
+
starting: "starting";
|
|
13
|
+
running: "running";
|
|
14
|
+
exited: "exited";
|
|
15
|
+
}>;
|
|
16
|
+
message: z.ZodString;
|
|
17
|
+
updatedAt: z.ZodString;
|
|
18
|
+
startedAt: z.ZodString;
|
|
19
|
+
conversation: z.ZodOptional<z.ZodString>;
|
|
20
|
+
exitCode: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
projectName: z.ZodOptional<z.ZodString>;
|
|
22
|
+
here: z.ZodOptional<z.ZodBoolean>;
|
|
23
|
+
viewers: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
24
|
+
viewers: z.ZodNumber;
|
|
25
|
+
remote: z.ZodNumber;
|
|
26
|
+
}, z.core.$strip>>>;
|
|
27
|
+
canOpen: z.ZodBoolean;
|
|
28
|
+
}, z.core.$strip>;
|
|
29
|
+
export type SessionRow = z.output<typeof SessionRowSchema>;
|
|
30
|
+
export declare const SessionsListSchema: z.ZodObject<{
|
|
31
|
+
sandboxRunning: z.ZodBoolean;
|
|
32
|
+
defaultAgent: z.ZodString;
|
|
33
|
+
wide: z.ZodBoolean;
|
|
34
|
+
owner: z.ZodOptional<z.ZodString>;
|
|
35
|
+
sessions: z.ZodArray<z.ZodObject<{
|
|
36
|
+
id: z.ZodString;
|
|
37
|
+
launchId: z.ZodString;
|
|
38
|
+
harness: z.ZodString;
|
|
39
|
+
cwd: z.ZodString;
|
|
40
|
+
project: z.ZodOptional<z.ZodString>;
|
|
41
|
+
phase: z.ZodEnum<{
|
|
42
|
+
failed: "failed";
|
|
43
|
+
starting: "starting";
|
|
44
|
+
running: "running";
|
|
45
|
+
exited: "exited";
|
|
46
|
+
}>;
|
|
47
|
+
message: z.ZodString;
|
|
48
|
+
updatedAt: z.ZodString;
|
|
49
|
+
startedAt: z.ZodString;
|
|
50
|
+
conversation: z.ZodOptional<z.ZodString>;
|
|
51
|
+
exitCode: z.ZodOptional<z.ZodNumber>;
|
|
52
|
+
projectName: z.ZodOptional<z.ZodString>;
|
|
53
|
+
here: z.ZodOptional<z.ZodBoolean>;
|
|
54
|
+
viewers: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
55
|
+
viewers: z.ZodNumber;
|
|
56
|
+
remote: z.ZodNumber;
|
|
57
|
+
}, z.core.$strip>>>;
|
|
58
|
+
canOpen: z.ZodBoolean;
|
|
59
|
+
}, z.core.$strip>>;
|
|
60
|
+
}, z.core.$strip>;
|
|
61
|
+
export type SessionsList = z.output<typeof SessionsListSchema>;
|
|
62
|
+
/** "1 here, 0 in sandbox" for a session's viewers. */
|
|
63
|
+
export declare function viewerText(v: SessionRow['viewers']): string;
|
|
64
|
+
/** This folder's project first, newest first within each group. */
|
|
65
|
+
export declare function orderedSessions(list: readonly SessionRow[]): SessionRow[];
|
|
66
|
+
export declare const listSessions: import("../../kernel/define.js").QueryDef<z.ZodObject<{
|
|
67
|
+
wide: z.ZodDefault<z.ZodBoolean>;
|
|
68
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
69
|
+
sandboxRunning: z.ZodBoolean;
|
|
70
|
+
defaultAgent: z.ZodString;
|
|
71
|
+
wide: z.ZodBoolean;
|
|
72
|
+
owner: z.ZodOptional<z.ZodString>;
|
|
73
|
+
sessions: z.ZodArray<z.ZodObject<{
|
|
74
|
+
id: z.ZodString;
|
|
75
|
+
launchId: z.ZodString;
|
|
76
|
+
harness: z.ZodString;
|
|
77
|
+
cwd: z.ZodString;
|
|
78
|
+
project: z.ZodOptional<z.ZodString>;
|
|
79
|
+
phase: z.ZodEnum<{
|
|
80
|
+
failed: "failed";
|
|
81
|
+
starting: "starting";
|
|
82
|
+
running: "running";
|
|
83
|
+
exited: "exited";
|
|
84
|
+
}>;
|
|
85
|
+
message: z.ZodString;
|
|
86
|
+
updatedAt: z.ZodString;
|
|
87
|
+
startedAt: z.ZodString;
|
|
88
|
+
conversation: z.ZodOptional<z.ZodString>;
|
|
89
|
+
exitCode: z.ZodOptional<z.ZodNumber>;
|
|
90
|
+
projectName: z.ZodOptional<z.ZodString>;
|
|
91
|
+
here: z.ZodOptional<z.ZodBoolean>;
|
|
92
|
+
viewers: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
93
|
+
viewers: z.ZodNumber;
|
|
94
|
+
remote: z.ZodNumber;
|
|
95
|
+
}, z.core.$strip>>>;
|
|
96
|
+
canOpen: z.ZodBoolean;
|
|
97
|
+
}, z.core.$strip>>;
|
|
98
|
+
}, z.core.$strip>, "sessions.list">;
|
|
99
|
+
export declare const restartSessions: import("../../kernel/define.js").OperationDef<z.ZodObject<{
|
|
100
|
+
harness: z.ZodOptional<z.ZodString>;
|
|
101
|
+
all: z.ZodDefault<z.ZodBoolean>;
|
|
102
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
103
|
+
message: z.ZodString;
|
|
104
|
+
}, z.core.$strip>, "sessions.restart">;
|
|
105
|
+
/** The sessions page: one list (a table on the command line), this folder's project first. */
|
|
106
|
+
export declare function sessionsPage(o: SessionsList): Page;
|
|
107
|
+
export declare const sessionsView: import("../../kernel/define.js").ViewDef<{
|
|
108
|
+
sessions: import("../../kernel/define.js").QueryDef<z.ZodObject<{
|
|
109
|
+
wide: z.ZodDefault<z.ZodBoolean>;
|
|
110
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
111
|
+
sandboxRunning: z.ZodBoolean;
|
|
112
|
+
defaultAgent: z.ZodString;
|
|
113
|
+
wide: z.ZodBoolean;
|
|
114
|
+
owner: z.ZodOptional<z.ZodString>;
|
|
115
|
+
sessions: z.ZodArray<z.ZodObject<{
|
|
116
|
+
id: z.ZodString;
|
|
117
|
+
launchId: z.ZodString;
|
|
118
|
+
harness: z.ZodString;
|
|
119
|
+
cwd: z.ZodString;
|
|
120
|
+
project: z.ZodOptional<z.ZodString>;
|
|
121
|
+
phase: z.ZodEnum<{
|
|
122
|
+
failed: "failed";
|
|
123
|
+
starting: "starting";
|
|
124
|
+
running: "running";
|
|
125
|
+
exited: "exited";
|
|
126
|
+
}>;
|
|
127
|
+
message: z.ZodString;
|
|
128
|
+
updatedAt: z.ZodString;
|
|
129
|
+
startedAt: z.ZodString;
|
|
130
|
+
conversation: z.ZodOptional<z.ZodString>;
|
|
131
|
+
exitCode: z.ZodOptional<z.ZodNumber>;
|
|
132
|
+
projectName: z.ZodOptional<z.ZodString>;
|
|
133
|
+
here: z.ZodOptional<z.ZodBoolean>;
|
|
134
|
+
viewers: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
135
|
+
viewers: z.ZodNumber;
|
|
136
|
+
remote: z.ZodNumber;
|
|
137
|
+
}, z.core.$strip>>>;
|
|
138
|
+
canOpen: z.ZodBoolean;
|
|
139
|
+
}, z.core.$strip>>;
|
|
140
|
+
}, z.core.$strip>, "sessions.list">;
|
|
141
|
+
}, Record<string, never>, "sessions">;
|