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,156 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type OperationIO } from './io.js';
|
|
3
|
+
/** One call or subscription on the socket (chosen by the browser, unique while it runs). */
|
|
4
|
+
export declare const RpcIdSchema: z.ZodString;
|
|
5
|
+
/** A definition's id (sessions.restart). */
|
|
6
|
+
export declare const DefinitionIdSchema: z.ZodString;
|
|
7
|
+
export declare const CallMessageSchema: z.ZodObject<{
|
|
8
|
+
t: z.ZodLiteral<"call">;
|
|
9
|
+
id: z.ZodString;
|
|
10
|
+
op: z.ZodString;
|
|
11
|
+
input: z.ZodUnknown;
|
|
12
|
+
}, z.core.$strict>;
|
|
13
|
+
export declare const AnswerMessageSchema: z.ZodObject<{
|
|
14
|
+
t: z.ZodLiteral<"answer">;
|
|
15
|
+
id: z.ZodString;
|
|
16
|
+
value: z.ZodUnknown;
|
|
17
|
+
}, z.core.$strict>;
|
|
18
|
+
export declare const SubscribeMessageSchema: z.ZodObject<{
|
|
19
|
+
t: z.ZodLiteral<"subscribe">;
|
|
20
|
+
id: z.ZodString;
|
|
21
|
+
query: z.ZodString;
|
|
22
|
+
input: z.ZodUnknown;
|
|
23
|
+
}, z.core.$strict>;
|
|
24
|
+
export declare const UnsubscribeMessageSchema: z.ZodObject<{
|
|
25
|
+
t: z.ZodLiteral<"unsubscribe">;
|
|
26
|
+
id: z.ZodString;
|
|
27
|
+
}, z.core.$strict>;
|
|
28
|
+
/** Browser -> server. */
|
|
29
|
+
export declare const ClientMessageSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
30
|
+
t: z.ZodLiteral<"call">;
|
|
31
|
+
id: z.ZodString;
|
|
32
|
+
op: z.ZodString;
|
|
33
|
+
input: z.ZodUnknown;
|
|
34
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
35
|
+
t: z.ZodLiteral<"answer">;
|
|
36
|
+
id: z.ZodString;
|
|
37
|
+
value: z.ZodUnknown;
|
|
38
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
39
|
+
t: z.ZodLiteral<"subscribe">;
|
|
40
|
+
id: z.ZodString;
|
|
41
|
+
query: z.ZodString;
|
|
42
|
+
input: z.ZodUnknown;
|
|
43
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
44
|
+
t: z.ZodLiteral<"unsubscribe">;
|
|
45
|
+
id: z.ZodString;
|
|
46
|
+
}, z.core.$strict>], "t">;
|
|
47
|
+
export type ClientMessage = z.output<typeof ClientMessageSchema>;
|
|
48
|
+
/** Server -> browser. */
|
|
49
|
+
export declare const ServerMessageSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
50
|
+
t: z.ZodLiteral<"progress">;
|
|
51
|
+
id: z.ZodString;
|
|
52
|
+
text: z.ZodString;
|
|
53
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
54
|
+
t: z.ZodLiteral<"log">;
|
|
55
|
+
id: z.ZodString;
|
|
56
|
+
text: z.ZodString;
|
|
57
|
+
tone: z.ZodOptional<z.ZodEnum<{
|
|
58
|
+
ok: "ok";
|
|
59
|
+
muted: "muted";
|
|
60
|
+
warn: "warn";
|
|
61
|
+
danger: "danger";
|
|
62
|
+
accent: "accent";
|
|
63
|
+
}>>;
|
|
64
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
65
|
+
t: z.ZodLiteral<"ask">;
|
|
66
|
+
id: z.ZodString;
|
|
67
|
+
question: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
68
|
+
kind: z.ZodLiteral<"confirm">;
|
|
69
|
+
title: z.ZodString;
|
|
70
|
+
lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
71
|
+
yes: z.ZodOptional<z.ZodString>;
|
|
72
|
+
danger: z.ZodOptional<z.ZodBoolean>;
|
|
73
|
+
typed: z.ZodOptional<z.ZodString>;
|
|
74
|
+
implied: z.ZodOptional<z.ZodBoolean>;
|
|
75
|
+
noTerminal: z.ZodOptional<z.ZodObject<{
|
|
76
|
+
message: z.ZodString;
|
|
77
|
+
fix: z.ZodString;
|
|
78
|
+
}, z.core.$strict>>;
|
|
79
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
80
|
+
kind: z.ZodLiteral<"choose">;
|
|
81
|
+
title: z.ZodString;
|
|
82
|
+
lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
83
|
+
choices: z.ZodArray<z.ZodObject<{
|
|
84
|
+
value: z.ZodString;
|
|
85
|
+
label: z.ZodString;
|
|
86
|
+
description: z.ZodOptional<z.ZodString>;
|
|
87
|
+
}, z.core.$strict>>;
|
|
88
|
+
initial: z.ZodOptional<z.ZodString>;
|
|
89
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
90
|
+
kind: z.ZodLiteral<"text">;
|
|
91
|
+
title: z.ZodString;
|
|
92
|
+
lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
93
|
+
initial: z.ZodOptional<z.ZodString>;
|
|
94
|
+
allowEmpty: z.ZodOptional<z.ZodBoolean>;
|
|
95
|
+
problem: z.ZodOptional<z.ZodString>;
|
|
96
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
97
|
+
kind: z.ZodLiteral<"secret">;
|
|
98
|
+
title: z.ZodString;
|
|
99
|
+
lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
100
|
+
problem: z.ZodOptional<z.ZodString>;
|
|
101
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
102
|
+
kind: z.ZodLiteral<"path">;
|
|
103
|
+
title: z.ZodString;
|
|
104
|
+
lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
105
|
+
pathKind: z.ZodEnum<{
|
|
106
|
+
file: "file";
|
|
107
|
+
dir: "dir";
|
|
108
|
+
}>;
|
|
109
|
+
initial: z.ZodOptional<z.ZodString>;
|
|
110
|
+
literals: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
111
|
+
problem: z.ZodOptional<z.ZodString>;
|
|
112
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
113
|
+
kind: z.ZodLiteral<"checklist">;
|
|
114
|
+
title: z.ZodString;
|
|
115
|
+
lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
116
|
+
choices: z.ZodArray<z.ZodObject<{
|
|
117
|
+
value: z.ZodString;
|
|
118
|
+
label: z.ZodString;
|
|
119
|
+
description: z.ZodOptional<z.ZodString>;
|
|
120
|
+
}, z.core.$strict>>;
|
|
121
|
+
checked: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
122
|
+
}, z.core.$strict>], "kind">;
|
|
123
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
124
|
+
t: z.ZodLiteral<"result">;
|
|
125
|
+
id: z.ZodString;
|
|
126
|
+
output: z.ZodUnknown;
|
|
127
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
128
|
+
t: z.ZodLiteral<"error">;
|
|
129
|
+
id: z.ZodString;
|
|
130
|
+
error: z.ZodObject<{
|
|
131
|
+
kind: z.ZodEnum<{
|
|
132
|
+
user: "user";
|
|
133
|
+
cancelled: "cancelled";
|
|
134
|
+
invalid: "invalid";
|
|
135
|
+
bug: "bug";
|
|
136
|
+
}>;
|
|
137
|
+
message: z.ZodString;
|
|
138
|
+
fix: z.ZodOptional<z.ZodString>;
|
|
139
|
+
}, z.core.$strict>;
|
|
140
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
141
|
+
t: z.ZodLiteral<"data">;
|
|
142
|
+
id: z.ZodString;
|
|
143
|
+
output: z.ZodUnknown;
|
|
144
|
+
}, z.core.$strict>], "t">;
|
|
145
|
+
export type ServerMessage = z.output<typeof ServerMessageSchema>;
|
|
146
|
+
/** Most calls and subscriptions one socket may have open at once. */
|
|
147
|
+
export declare const MAX_OPEN_PER_SOCKET = 32;
|
|
148
|
+
/** What the RPC endpoint needs from the program: the definitions allowed on the web, and a way to run them. */
|
|
149
|
+
export interface RpcHost {
|
|
150
|
+
/** 'operation' or 'query' when the id is registered and allowed on the web, else undefined. */
|
|
151
|
+
kind(id: string): 'operation' | 'query' | undefined;
|
|
152
|
+
/** How often a query is read again while subscribed (undefined: once). */
|
|
153
|
+
liveMs(id: string): number | undefined;
|
|
154
|
+
/** Runs an allowed definition (input and output checked). */
|
|
155
|
+
run(id: string, input: unknown, io: OperationIO): Promise<unknown>;
|
|
156
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// The messages of the web UI's RPC socket (/api/rpc), shared by the server and the browser. The browser calls
|
|
2
|
+
// operations and queries by id, answers questions, and subscribes to live queries; the server streams progress, log
|
|
3
|
+
// lines and questions, then a result or an error. A subscription gets `data` whenever the result changes (an `error`
|
|
4
|
+
// does not end it; `unsubscribe` does). The server checks every message against these schemas.
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { WireErrorSchema } from './errors.js';
|
|
7
|
+
import { QuestionSchema } from './io.js';
|
|
8
|
+
/** One call or subscription on the socket (chosen by the browser, unique while it runs). */
|
|
9
|
+
export const RpcIdSchema = z.string().regex(/^[A-Za-z0-9_-]{1,64}$/);
|
|
10
|
+
/** A definition's id (sessions.restart). */
|
|
11
|
+
export const DefinitionIdSchema = z
|
|
12
|
+
.string()
|
|
13
|
+
.regex(/^[a-z][A-Za-z0-9]*(\.[a-z][A-Za-z0-9]*)+$/)
|
|
14
|
+
.max(80);
|
|
15
|
+
const ToneSchema = z.enum(['ok', 'warn', 'danger', 'muted', 'accent']);
|
|
16
|
+
export const CallMessageSchema = z.strictObject({
|
|
17
|
+
t: z.literal('call'),
|
|
18
|
+
id: RpcIdSchema,
|
|
19
|
+
op: DefinitionIdSchema,
|
|
20
|
+
input: z.unknown(),
|
|
21
|
+
});
|
|
22
|
+
export const AnswerMessageSchema = z.strictObject({ t: z.literal('answer'), id: RpcIdSchema, value: z.unknown() });
|
|
23
|
+
export const SubscribeMessageSchema = z.strictObject({
|
|
24
|
+
t: z.literal('subscribe'),
|
|
25
|
+
id: RpcIdSchema,
|
|
26
|
+
query: DefinitionIdSchema,
|
|
27
|
+
input: z.unknown(),
|
|
28
|
+
});
|
|
29
|
+
export const UnsubscribeMessageSchema = z.strictObject({ t: z.literal('unsubscribe'), id: RpcIdSchema });
|
|
30
|
+
/** Browser -> server. */
|
|
31
|
+
export const ClientMessageSchema = z.discriminatedUnion('t', [
|
|
32
|
+
CallMessageSchema,
|
|
33
|
+
AnswerMessageSchema,
|
|
34
|
+
SubscribeMessageSchema,
|
|
35
|
+
UnsubscribeMessageSchema,
|
|
36
|
+
]);
|
|
37
|
+
/** Server -> browser. */
|
|
38
|
+
export const ServerMessageSchema = z.discriminatedUnion('t', [
|
|
39
|
+
z.strictObject({ t: z.literal('progress'), id: RpcIdSchema, text: z.string() }),
|
|
40
|
+
z.strictObject({ t: z.literal('log'), id: RpcIdSchema, text: z.string(), tone: ToneSchema.optional() }),
|
|
41
|
+
z.strictObject({ t: z.literal('ask'), id: RpcIdSchema, question: QuestionSchema }),
|
|
42
|
+
z.strictObject({ t: z.literal('result'), id: RpcIdSchema, output: z.unknown() }),
|
|
43
|
+
z.strictObject({ t: z.literal('error'), id: RpcIdSchema, error: WireErrorSchema }),
|
|
44
|
+
z.strictObject({ t: z.literal('data'), id: RpcIdSchema, output: z.unknown() }),
|
|
45
|
+
]);
|
|
46
|
+
/** Most calls and subscriptions one socket may have open at once. */
|
|
47
|
+
export const MAX_OPEN_PER_SOCKET = 32;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** "just now", "5 min ago", "3 h ago", "2 d ago". */
|
|
2
|
+
export declare function ago(then: number | string | Date, now?: number): string;
|
|
3
|
+
/** "1 session", "2 sessions". */
|
|
4
|
+
export declare function plural(n: number, noun: string, many?: string): string;
|
|
5
|
+
/** "memoryMb" -> "Memory MB", "vGpu" -> "V GPU": a readable label from a setting's key. */
|
|
6
|
+
export declare function humanize(key: string): string;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Small text helpers every surface formats with the same way: times as "5 min ago", keys as readable labels, counts
|
|
2
|
+
// with the right noun. Pure (the browser bundle imports them too).
|
|
3
|
+
/** "just now", "5 min ago", "3 h ago", "2 d ago". */
|
|
4
|
+
export function ago(then, now = Date.now()) {
|
|
5
|
+
const secs = Math.max(0, Math.round((now - new Date(then).getTime()) / 1000));
|
|
6
|
+
if (Number.isNaN(secs))
|
|
7
|
+
return '';
|
|
8
|
+
if (secs < 45)
|
|
9
|
+
return 'just now';
|
|
10
|
+
if (secs < 3600)
|
|
11
|
+
return Math.round(secs / 60) + ' min ago';
|
|
12
|
+
if (secs < 86400)
|
|
13
|
+
return Math.round(secs / 3600) + ' h ago';
|
|
14
|
+
return Math.round(secs / 86400) + ' d ago';
|
|
15
|
+
}
|
|
16
|
+
/** "1 session", "2 sessions". */
|
|
17
|
+
export function plural(n, noun, many = noun + 's') {
|
|
18
|
+
return n + ' ' + (n === 1 ? noun : many);
|
|
19
|
+
}
|
|
20
|
+
/** Words written in capitals wherever they appear in a key. */
|
|
21
|
+
const UPPER = new Set([
|
|
22
|
+
'mb',
|
|
23
|
+
'gb',
|
|
24
|
+
'cpu',
|
|
25
|
+
'gpu',
|
|
26
|
+
'jdk',
|
|
27
|
+
'sdk',
|
|
28
|
+
'id',
|
|
29
|
+
'url',
|
|
30
|
+
'ui',
|
|
31
|
+
'npm',
|
|
32
|
+
'msvc',
|
|
33
|
+
'uv',
|
|
34
|
+
'api',
|
|
35
|
+
'ssh',
|
|
36
|
+
'vm',
|
|
37
|
+
'io',
|
|
38
|
+
]);
|
|
39
|
+
/** "harness" is the code's word for an agent; screens say agent. */
|
|
40
|
+
const PLAIN = { harness: 'agent', harnesses: 'agents' };
|
|
41
|
+
/** "memoryMb" -> "Memory MB", "vGpu" -> "V GPU": a readable label from a setting's key. */
|
|
42
|
+
export function humanize(key) {
|
|
43
|
+
const words = key
|
|
44
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
45
|
+
.replace(/[_-]+/g, ' ')
|
|
46
|
+
.split(' ')
|
|
47
|
+
.filter(Boolean)
|
|
48
|
+
.map((w) => PLAIN[w.toLowerCase()] ?? w);
|
|
49
|
+
return words
|
|
50
|
+
.map((w, i) => {
|
|
51
|
+
const lower = w.toLowerCase();
|
|
52
|
+
if (UPPER.has(lower))
|
|
53
|
+
return w.toUpperCase();
|
|
54
|
+
return i === 0 ? w[0].toUpperCase() + w.slice(1) : lower;
|
|
55
|
+
})
|
|
56
|
+
.join(' ');
|
|
57
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
import type { OperationDef } from './define.js';
|
|
3
|
+
import type { Field } from './fields.js';
|
|
4
|
+
/** The one palette: the TUI theme and the web colours both map these. */
|
|
5
|
+
export type Tone = 'ok' | 'warn' | 'danger' | 'muted' | 'accent';
|
|
6
|
+
/** A short label the web shows as a pill next to an item ("running"); the menu and the CLI show the hint. */
|
|
7
|
+
export interface Badge {
|
|
8
|
+
readonly text: string;
|
|
9
|
+
readonly tone?: Tone;
|
|
10
|
+
}
|
|
11
|
+
/** Where a link goes. Each surface maps a target to what it can do (attach / terminal page / a command to type). */
|
|
12
|
+
export type Target =
|
|
13
|
+
/** A running session's terminal: the menu attaches, the web opens its terminal page. */
|
|
14
|
+
{
|
|
15
|
+
readonly kind: 'terminal';
|
|
16
|
+
readonly session: string;
|
|
17
|
+
}
|
|
18
|
+
/** Start an agent: the menu runs `launch`, the web opens its new-session dialog. */
|
|
19
|
+
| {
|
|
20
|
+
readonly kind: 'start-agent';
|
|
21
|
+
readonly agent: string;
|
|
22
|
+
}
|
|
23
|
+
/** A command line of an area that is not a feature yet: the menu runs it, the web does not offer it. */
|
|
24
|
+
| {
|
|
25
|
+
readonly kind: 'command';
|
|
26
|
+
readonly argv: readonly string[];
|
|
27
|
+
}
|
|
28
|
+
/** Another view. */
|
|
29
|
+
| {
|
|
30
|
+
readonly kind: 'view';
|
|
31
|
+
readonly view: string;
|
|
32
|
+
};
|
|
33
|
+
interface ActionBase {
|
|
34
|
+
/** The words on a button or a row ("Stop the sandbox…"). */
|
|
35
|
+
readonly label: string;
|
|
36
|
+
/** One word for a key bar or an Enter hint ("stop"). */
|
|
37
|
+
readonly verb?: string;
|
|
38
|
+
/** The menu key that does it (one letter). */
|
|
39
|
+
readonly key?: string;
|
|
40
|
+
/** How long it survives in a narrow key bar: 0 never goes, bigger goes earlier (menu). */
|
|
41
|
+
readonly importance?: number;
|
|
42
|
+
readonly description?: string;
|
|
43
|
+
}
|
|
44
|
+
/** Runs an operation with this input (plus the answers to `fields`, asked first). */
|
|
45
|
+
export interface OperationAction extends ActionBase {
|
|
46
|
+
readonly kind: 'operation';
|
|
47
|
+
readonly op: string;
|
|
48
|
+
readonly input: Readonly<Record<string, unknown>>;
|
|
49
|
+
/** Asks for a confirmation before running (from the operation's `danger`). */
|
|
50
|
+
readonly danger?: boolean;
|
|
51
|
+
/** Values to ask for before running; each answer goes into the input under the field's name. */
|
|
52
|
+
readonly fields?: readonly Field[];
|
|
53
|
+
/** What `fields` start as (the current value of a setting), by field name. */
|
|
54
|
+
readonly initial?: Readonly<Record<string, unknown>>;
|
|
55
|
+
}
|
|
56
|
+
export interface LinkAction extends ActionBase {
|
|
57
|
+
readonly kind: 'link';
|
|
58
|
+
readonly target: Target;
|
|
59
|
+
}
|
|
60
|
+
export type Action = OperationAction | LinkAction;
|
|
61
|
+
/** One label: value line (a status fact, a setting). */
|
|
62
|
+
export interface Fact {
|
|
63
|
+
readonly id: string;
|
|
64
|
+
readonly label: string;
|
|
65
|
+
readonly value: string;
|
|
66
|
+
readonly tone?: Tone;
|
|
67
|
+
readonly description?: string;
|
|
68
|
+
readonly details?: readonly string[];
|
|
69
|
+
}
|
|
70
|
+
/** A column of a section shown as a table (CLI table, web table); items fill it through `cells`. */
|
|
71
|
+
export interface Column {
|
|
72
|
+
readonly key: string;
|
|
73
|
+
readonly label: string;
|
|
74
|
+
}
|
|
75
|
+
/** One entry of a list. */
|
|
76
|
+
export interface Item {
|
|
77
|
+
readonly id: string;
|
|
78
|
+
readonly label: string;
|
|
79
|
+
/** The right-hand text (a state, a value). */
|
|
80
|
+
readonly hint?: string;
|
|
81
|
+
readonly tone?: Tone;
|
|
82
|
+
readonly badges?: readonly Badge[];
|
|
83
|
+
readonly description?: string;
|
|
84
|
+
/** Extra lines (the menu's details pane, the CLI's indented lines, the web's card body). */
|
|
85
|
+
readonly details?: readonly string[];
|
|
86
|
+
/** A heading inside the section ("This folder's project"). */
|
|
87
|
+
readonly group?: string;
|
|
88
|
+
/** Marked as "the one this is about" (the project of this folder): `*` in the CLI. */
|
|
89
|
+
readonly marked?: boolean;
|
|
90
|
+
/** The values for the section's columns. */
|
|
91
|
+
readonly cells?: Readonly<Record<string, string>>;
|
|
92
|
+
/** What Enter / a click does. */
|
|
93
|
+
readonly primary?: Action;
|
|
94
|
+
readonly actions?: readonly Action[];
|
|
95
|
+
/** Why it cannot be used now. */
|
|
96
|
+
readonly disabled?: string;
|
|
97
|
+
/** More words a search finds it by. */
|
|
98
|
+
readonly keywords?: string;
|
|
99
|
+
}
|
|
100
|
+
/** A line under a section; `only` limits it to one surface (a CLI flag hint). */
|
|
101
|
+
export interface Note {
|
|
102
|
+
readonly text: string;
|
|
103
|
+
readonly tone?: Tone;
|
|
104
|
+
readonly only?: 'cli' | 'menu' | 'web';
|
|
105
|
+
}
|
|
106
|
+
export interface Section {
|
|
107
|
+
readonly id: string;
|
|
108
|
+
readonly title?: string;
|
|
109
|
+
/** A short line next to the title ("2 folders guarded"). */
|
|
110
|
+
readonly summary?: string;
|
|
111
|
+
readonly description?: string;
|
|
112
|
+
readonly facts?: readonly Fact[];
|
|
113
|
+
readonly items?: readonly Item[];
|
|
114
|
+
/** Show the items as a table with these columns where a surface can (CLI, web). */
|
|
115
|
+
readonly columns?: readonly Column[];
|
|
116
|
+
/** Where `columns` is used: everywhere (default), or only on the command line (the web lists the items in full). */
|
|
117
|
+
readonly columnsOn?: 'all' | 'cli';
|
|
118
|
+
readonly actions?: readonly Action[];
|
|
119
|
+
readonly notes?: readonly Note[];
|
|
120
|
+
}
|
|
121
|
+
/** What a page shows when it has nothing: the text and the next step (the CLI prints `cliText`, naming a command). */
|
|
122
|
+
export interface Empty {
|
|
123
|
+
readonly title?: string;
|
|
124
|
+
readonly text: string;
|
|
125
|
+
readonly action?: Action;
|
|
126
|
+
readonly cliText?: string;
|
|
127
|
+
}
|
|
128
|
+
export interface Page {
|
|
129
|
+
readonly title: string;
|
|
130
|
+
/** One line above everything (whose sandbox this is). */
|
|
131
|
+
readonly notice?: Note;
|
|
132
|
+
readonly sections: readonly Section[];
|
|
133
|
+
/** Actions for the whole page (refresh-like, start). */
|
|
134
|
+
readonly actions?: readonly Action[];
|
|
135
|
+
/** Shown instead of the sections when they have no facts and no items. */
|
|
136
|
+
readonly empty?: Empty;
|
|
137
|
+
}
|
|
138
|
+
/** An action that runs `def` with `input` (typed from its input schema; `fields` may ask for the rest). */
|
|
139
|
+
export declare function action<I extends z.ZodType, O extends z.ZodType>(def: OperationDef<I, O>, input: Partial<z.input<I>>, extra?: Partial<Omit<OperationAction, 'kind' | 'op' | 'input'>>): OperationAction;
|
|
140
|
+
/** An action that goes somewhere. */
|
|
141
|
+
export declare function link(target: Target, label: string, extra?: Partial<Omit<LinkAction, 'kind' | 'target'>>): LinkAction;
|
|
142
|
+
/** Does the page show anything besides its empty state? */
|
|
143
|
+
export declare function pageHasContent(page: Page): boolean;
|
|
144
|
+
/** Every action a page offers, wherever it sits (for parity checks and key bars). */
|
|
145
|
+
export declare function pageActions(page: Page): Action[];
|
|
146
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** An action that runs `def` with `input` (typed from its input schema; `fields` may ask for the rest). */
|
|
2
|
+
export function action(def, input, extra = {}) {
|
|
3
|
+
return {
|
|
4
|
+
kind: 'operation',
|
|
5
|
+
op: def.id,
|
|
6
|
+
input: input,
|
|
7
|
+
label: def.title,
|
|
8
|
+
...(def.danger ? { danger: true } : {}),
|
|
9
|
+
...extra,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/** An action that goes somewhere. */
|
|
13
|
+
export function link(target, label, extra = {}) {
|
|
14
|
+
return { kind: 'link', target, label, ...extra };
|
|
15
|
+
}
|
|
16
|
+
/** Does the page show anything besides its empty state? */
|
|
17
|
+
export function pageHasContent(page) {
|
|
18
|
+
return page.sections.some((s) => (s.facts?.length ?? 0) > 0 || (s.items?.length ?? 0) > 0);
|
|
19
|
+
}
|
|
20
|
+
/** Every action a page offers, wherever it sits (for parity checks and key bars). */
|
|
21
|
+
export function pageActions(page) {
|
|
22
|
+
const fromItem = (i) => [...(i.primary ? [i.primary] : []), ...(i.actions ?? [])];
|
|
23
|
+
return [
|
|
24
|
+
...(page.actions ?? []),
|
|
25
|
+
...(page.empty?.action ? [page.empty.action] : []),
|
|
26
|
+
...page.sections.flatMap((s) => [...(s.actions ?? []), ...(s.items ?? []).flatMap(fromItem)]),
|
|
27
|
+
];
|
|
28
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AppContext } from './context.js';
|
|
2
|
+
import { type AnyDefinition, type Implementation, type OperationIO, type OutputOf, type QueryDef, type RpcHost } from './kernel/index.js';
|
|
3
|
+
export declare const IMPLEMENTATIONS: readonly Implementation<AnyDefinition, AppContext>[];
|
|
4
|
+
export declare function implementationOf(id: string): Implementation<AnyDefinition, AppContext> | undefined;
|
|
5
|
+
/** Runs a definition by id: input checked before, output checked after. */
|
|
6
|
+
export declare function runDefinition(id: string, ctx: AppContext, input: unknown, io: OperationIO): Promise<unknown>;
|
|
7
|
+
/** Reads a query in-process (the menu): typed output, and no questions. */
|
|
8
|
+
export declare function readQuery<D extends QueryDef>(def: D, ctx: AppContext, input?: unknown): Promise<OutputOf<D>>;
|
|
9
|
+
/** What the web server may run: the registered definitions whose surfaces include the web. */
|
|
10
|
+
export declare function createRpcHost(ctx: AppContext): RpcHost;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { invoke, NO_QUESTIONS, onSurface, } from './kernel/index.js';
|
|
2
|
+
import { hideWindowRun, sandboxStatusRun, showWindowRun, stopSandboxRun } from './features/sandbox/index.js';
|
|
3
|
+
import { listSessionsRun, restartSessionsRun } from './features/sessions/index.js';
|
|
4
|
+
import { getSettingRun, listSettingsRun, resetSettingRun, setSettingRun } from './features/settings/index.js';
|
|
5
|
+
export const IMPLEMENTATIONS = [
|
|
6
|
+
sandboxStatusRun,
|
|
7
|
+
showWindowRun,
|
|
8
|
+
hideWindowRun,
|
|
9
|
+
stopSandboxRun,
|
|
10
|
+
listSessionsRun,
|
|
11
|
+
restartSessionsRun,
|
|
12
|
+
listSettingsRun,
|
|
13
|
+
getSettingRun,
|
|
14
|
+
setSettingRun,
|
|
15
|
+
resetSettingRun,
|
|
16
|
+
];
|
|
17
|
+
export function implementationOf(id) {
|
|
18
|
+
return IMPLEMENTATIONS.find((i) => i.def.id === id);
|
|
19
|
+
}
|
|
20
|
+
/** Runs a definition by id: input checked before, output checked after. */
|
|
21
|
+
export function runDefinition(id, ctx, input, io) {
|
|
22
|
+
const impl = implementationOf(id);
|
|
23
|
+
if (!impl)
|
|
24
|
+
throw new Error('No implementation for ' + id);
|
|
25
|
+
return invoke(impl, ctx, input, io);
|
|
26
|
+
}
|
|
27
|
+
/** Reads a query in-process (the menu): typed output, and no questions. */
|
|
28
|
+
export async function readQuery(def, ctx, input = {}) {
|
|
29
|
+
return (await runDefinition(def.id, ctx, input, NO_QUESTIONS));
|
|
30
|
+
}
|
|
31
|
+
/** What the web server may run: the registered definitions whose surfaces include the web. */
|
|
32
|
+
export function createRpcHost(ctx) {
|
|
33
|
+
const allowed = (id) => {
|
|
34
|
+
const impl = implementationOf(id);
|
|
35
|
+
return impl && onSurface(impl.def, 'web') ? impl : undefined;
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
kind: (id) => allowed(id)?.def.kind,
|
|
39
|
+
liveMs: (id) => {
|
|
40
|
+
const def = allowed(id)?.def;
|
|
41
|
+
return def?.kind === 'query' ? def.live?.everyMs : undefined;
|
|
42
|
+
},
|
|
43
|
+
run: (id, input, io) => {
|
|
44
|
+
const impl = allowed(id);
|
|
45
|
+
if (!impl)
|
|
46
|
+
throw new Error('Not allowed on the web: ' + id);
|
|
47
|
+
return invoke(impl, ctx, input, io);
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
package/dist/cli/args.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ export interface CliOptions {
|
|
|
3
3
|
command: string;
|
|
4
4
|
positionals: string[];
|
|
5
5
|
passthrough: string[];
|
|
6
|
+
/** The options as commander parsed them, by attribute name (operation commands build their input from these). */
|
|
7
|
+
raw: Readonly<Record<string, unknown>>;
|
|
6
8
|
config?: string;
|
|
7
9
|
workspace?: string;
|
|
8
10
|
harness?: string;
|
|
@@ -25,12 +27,15 @@ export interface CliOptions {
|
|
|
25
27
|
accountTo?: string;
|
|
26
28
|
noRestart: boolean;
|
|
27
29
|
follow: boolean;
|
|
30
|
+
crash: boolean;
|
|
28
31
|
json: boolean;
|
|
29
32
|
yes: boolean;
|
|
30
33
|
/** sessions --wide: also the folder column. */
|
|
31
34
|
wide: boolean;
|
|
32
35
|
/** storage move: keep the old folder (copy instead of rename). */
|
|
33
36
|
keepOld: boolean;
|
|
37
|
+
/** config export: keep folders and files of this PC in the file. */
|
|
38
|
+
withPaths: boolean;
|
|
34
39
|
timeout: number;
|
|
35
40
|
days: number;
|
|
36
41
|
/** restart: every session, not only this folder's project's. */
|
package/dist/cli/args.js
CHANGED
|
@@ -186,6 +186,7 @@ export function parseCli(argv, wrapper = false) {
|
|
|
186
186
|
command: name === 'start' ? 'launch' : name,
|
|
187
187
|
positionals: forAgent || name === 'exec' ? [] : operands,
|
|
188
188
|
passthrough: forAgent || name === 'exec' ? operands : [],
|
|
189
|
+
raw: o,
|
|
189
190
|
config: o.config,
|
|
190
191
|
workspace: o.workspace,
|
|
191
192
|
harness: o.harness ?? (name !== 'account' && typeof o.agent === 'string' ? o.agent : undefined),
|
|
@@ -209,10 +210,12 @@ export function parseCli(argv, wrapper = false) {
|
|
|
209
210
|
accountTo: name === 'account' && typeof o.to === 'string' ? o.to : undefined,
|
|
210
211
|
noRestart: o.restart === false,
|
|
211
212
|
follow: Boolean(o.follow),
|
|
213
|
+
crash: Boolean(o.crash),
|
|
212
214
|
json: Boolean(o.json),
|
|
213
215
|
yes: Boolean(o.yes),
|
|
214
216
|
wide: Boolean(o.wide),
|
|
215
217
|
keepOld: Boolean(o.keepOld),
|
|
218
|
+
withPaths: Boolean(o.withPaths),
|
|
216
219
|
all: Boolean(o.all),
|
|
217
220
|
sessions: (o.session ?? []).map((s) => parseSessionWant(s)),
|
|
218
221
|
timeout: o.timeout ?? 600,
|
|
@@ -243,6 +246,7 @@ function defaults() {
|
|
|
243
246
|
command: '',
|
|
244
247
|
positionals: [],
|
|
245
248
|
passthrough: [],
|
|
249
|
+
raw: {},
|
|
246
250
|
scripts: [],
|
|
247
251
|
databases: [],
|
|
248
252
|
terminal: false,
|
|
@@ -254,6 +258,7 @@ function defaults() {
|
|
|
254
258
|
fromHost: false,
|
|
255
259
|
noRestart: false,
|
|
256
260
|
follow: false,
|
|
261
|
+
crash: false,
|
|
257
262
|
dryRun: false,
|
|
258
263
|
fix: false,
|
|
259
264
|
auto: false,
|
|
@@ -264,6 +269,7 @@ function defaults() {
|
|
|
264
269
|
yes: false,
|
|
265
270
|
wide: false,
|
|
266
271
|
keepOld: false,
|
|
272
|
+
withPaths: false,
|
|
267
273
|
all: false,
|
|
268
274
|
sessions: [],
|
|
269
275
|
timeout: 600,
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// `sandbox engine`: the engine in use and, for each engine, what it can do and whether this PC can run it.
|
|
2
|
+
import { fail } from '../../core/util/index.js';
|
|
3
|
+
import { engineReports } from '../../host/engines/index.js';
|
|
4
|
+
import { c, printJson, table } from '../output/index.js';
|
|
5
|
+
const CAPABILITY_NAMES = {
|
|
6
|
+
desktop: 'desktop window',
|
|
7
|
+
gpu: 'GPU',
|
|
8
|
+
clipboard: 'clipboard',
|
|
9
|
+
audio: 'audio',
|
|
10
|
+
video: 'camera',
|
|
11
|
+
printers: 'printers',
|
|
12
|
+
liveFolderAdd: 'add folders while running',
|
|
13
|
+
attachedDisks: 'attached disks',
|
|
14
|
+
multipleInstances: 'several at once',
|
|
15
|
+
hvsocket: 'Hyper-V sockets',
|
|
16
|
+
};
|
|
17
|
+
/** sandbox engine check <engine>: the reasons and the exact commands, in plain words. Nothing is run or changed. */
|
|
18
|
+
async function checkEngine(ctx, name) {
|
|
19
|
+
const report = (await engineReports(ctx.loaded.config)).find((r) => r.id === name);
|
|
20
|
+
if (!report)
|
|
21
|
+
return fail('Unknown engine: ' + name, 'Use windows-sandbox or hcs.');
|
|
22
|
+
if (printJson(ctx, report))
|
|
23
|
+
return report.check.available ? 0 : 1;
|
|
24
|
+
if (report.check.available) {
|
|
25
|
+
console.log(c.green(name + ' can be used on this PC.'));
|
|
26
|
+
if (name === 'hcs')
|
|
27
|
+
console.log('HCS is in alpha: starting it is not enabled yet (docs/design/engines.md).');
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
console.log(c.yellow(name + ' cannot be used on this PC yet:'));
|
|
31
|
+
report.check.reasons.forEach((reason, i) => {
|
|
32
|
+
console.log('\n ' + (i + 1) + '. ' + reason);
|
|
33
|
+
console.log(' To fix: ' + (report.check.fixes[i] ?? 'see docs/design/engines.md'));
|
|
34
|
+
});
|
|
35
|
+
console.log('\nNothing was changed. These commands change Windows, so they are yours to run (or not).');
|
|
36
|
+
return 1;
|
|
37
|
+
}
|
|
38
|
+
export async function engine(ctx) {
|
|
39
|
+
const [action = 'show', name = 'hcs'] = ctx.options.positionals;
|
|
40
|
+
if (action === 'check')
|
|
41
|
+
return checkEngine(ctx, name);
|
|
42
|
+
const reports = await engineReports(ctx.loaded.config);
|
|
43
|
+
const using = reports.find((r) => r.inUse);
|
|
44
|
+
if (printJson(ctx, { engine: using?.id, engines: reports }))
|
|
45
|
+
return 0;
|
|
46
|
+
console.log('Engine in use: ' + (using?.id ?? ctx.loaded.config.sandbox.engine) + ' (setting: sandbox.engine)');
|
|
47
|
+
for (const report of reports) {
|
|
48
|
+
console.log('\n' + report.id + (report.inUse ? ' (in use)' : ''));
|
|
49
|
+
console.log(' ' + (report.check.available ? c.green('can be used on this PC') : c.yellow('cannot be used yet')));
|
|
50
|
+
for (const reason of report.check.reasons)
|
|
51
|
+
console.log(' ' + reason);
|
|
52
|
+
for (const fix of report.check.fixes)
|
|
53
|
+
console.log(' Fix: ' + fix);
|
|
54
|
+
table(Object.entries(CAPABILITY_NAMES).map(([key, name]) => [
|
|
55
|
+
' ' + name,
|
|
56
|
+
report.capabilities[key] ? 'yes' : 'no',
|
|
57
|
+
]));
|
|
58
|
+
}
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
@@ -4,7 +4,7 @@ export { setup } from './setup/index.js';
|
|
|
4
4
|
export { data } from './data/index.js';
|
|
5
5
|
export { storage, storageBeforeCommand } from './storage/index.js';
|
|
6
6
|
export { repairCommand } from './repair/index.js';
|
|
7
|
-
export { attach, db, exec
|
|
7
|
+
export { attach, db, exec } from './sessions/index.js';
|
|
8
8
|
export { account } from './accounts.js';
|
|
9
9
|
export { resume } from './resume.js';
|
|
10
10
|
export { projects } from './projects/index.js';
|
|
@@ -4,7 +4,7 @@ export { setup } from './setup/index.js';
|
|
|
4
4
|
export { data } from './data/index.js';
|
|
5
5
|
export { storage, storageBeforeCommand } from './storage/index.js';
|
|
6
6
|
export { repairCommand } from './repair/index.js';
|
|
7
|
-
export { attach, db, exec
|
|
7
|
+
export { attach, db, exec } from './sessions/index.js';
|
|
8
8
|
export { account } from './accounts.js';
|
|
9
9
|
export { resume } from './resume.js';
|
|
10
10
|
export { projects } from './projects/index.js';
|