windows-development-sandbox 1.5.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/config.example.json +27 -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} +4 -0
- package/dist/{cli/menu/settings/categories.js → app/features/settings/categories.def.js} +40 -46
- 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/{cli/menu/settings → app/kernel}/schema-node.d.ts +9 -0
- package/dist/{cli/menu/settings → app/kernel}/schema-node.js +26 -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 +18 -2
- package/dist/cli/args.js +101 -24
- package/dist/cli/commands/accounts.js +45 -17
- package/dist/cli/commands/context.d.ts +2 -0
- package/dist/cli/commands/context.js +9 -2
- package/dist/cli/commands/data/clean.js +32 -9
- package/dist/cli/commands/engine.d.ts +2 -0
- package/dist/cli/commands/engine.js +60 -0
- package/dist/cli/commands/index.d.ts +2 -1
- package/dist/cli/commands/index.js +2 -1
- package/dist/cli/commands/launch/add-root.d.ts +3 -2
- package/dist/cli/commands/launch/add-root.js +11 -10
- package/dist/cli/commands/launch/launch.js +102 -9
- package/dist/cli/commands/launch/prepare.js +6 -4
- package/dist/cli/commands/launch/running.js +2 -1
- package/dist/cli/commands/launch/summary.d.ts +2 -0
- package/dist/cli/commands/maintenance/audit.js +1 -1
- package/dist/cli/commands/maintenance/clean.d.ts +1 -1
- package/dist/cli/commands/maintenance/clean.js +17 -3
- 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.d.ts +1 -1
- package/dist/cli/commands/maintenance/config.js +38 -10
- package/dist/cli/commands/maintenance/doctor.d.ts +1 -1
- package/dist/cli/commands/maintenance/doctor.js +2 -4
- package/dist/cli/commands/maintenance/logs.js +14 -0
- package/dist/cli/commands/maintenance/migrate.d.ts +2 -1
- package/dist/cli/commands/maintenance/migrate.js +19 -4
- package/dist/cli/commands/maintenance/sync.js +2 -0
- package/dist/cli/commands/maintenance/update.d.ts +2 -0
- package/dist/cli/commands/maintenance/update.js +27 -4
- package/dist/cli/commands/projects/here.js +12 -7
- package/dist/cli/commands/projects/projects.js +26 -17
- package/dist/cli/commands/registry.js +10 -7
- package/dist/cli/commands/repair/checks/agents.d.ts +2 -0
- package/dist/cli/commands/repair/checks/agents.js +70 -0
- package/dist/cli/commands/repair/checks/common.d.ts +8 -0
- package/dist/cli/commands/repair/checks/common.js +22 -0
- 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/data.d.ts +2 -0
- package/dist/cli/commands/repair/checks/data.js +241 -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.d.ts +2 -0
- package/dist/cli/commands/repair/checks/index.js +24 -0
- package/dist/cli/commands/repair/checks/install.d.ts +5 -0
- package/dist/cli/commands/repair/checks/install.js +318 -0
- package/dist/cli/commands/repair/checks/machine.d.ts +2 -0
- package/dist/cli/commands/repair/checks/machine.js +232 -0
- package/dist/cli/commands/repair/checks/network.d.ts +6 -0
- package/dist/cli/commands/repair/checks/network.js +60 -0
- package/dist/cli/commands/repair/checks/pc.d.ts +4 -0
- package/dist/cli/commands/repair/checks/pc.js +86 -0
- package/dist/cli/commands/repair/checks/sandbox.d.ts +2 -0
- package/dist/cli/commands/repair/checks/sandbox.js +282 -0
- package/dist/cli/commands/repair/checks/settings.d.ts +2 -0
- package/dist/cli/commands/repair/checks/settings.js +169 -0
- package/dist/cli/commands/repair/checks/vpn.d.ts +2 -0
- package/dist/cli/commands/repair/checks/vpn.js +78 -0
- package/dist/cli/commands/repair/engine.d.ts +32 -0
- package/dist/cli/commands/repair/engine.js +127 -0
- package/dist/cli/commands/repair/env.d.ts +7 -0
- package/dist/cli/commands/repair/env.js +50 -0
- package/dist/cli/commands/repair/index.d.ts +1 -9
- package/dist/cli/commands/repair/index.js +2 -54
- package/dist/cli/commands/repair/log.d.ts +17 -0
- package/dist/cli/commands/repair/log.js +82 -0
- package/dist/cli/commands/repair/printer.d.ts +32 -0
- package/dist/cli/commands/repair/printer.js +132 -0
- package/dist/cli/commands/repair/run.d.ts +33 -0
- package/dist/cli/commands/repair/run.js +133 -0
- package/dist/cli/commands/repair/types.d.ts +97 -9
- package/dist/cli/commands/repair/types.js +11 -7
- package/dist/cli/commands/resume.js +2 -2
- package/dist/cli/commands/sessions/index.d.ts +0 -4
- package/dist/cli/commands/sessions/index.js +3 -7
- package/dist/cli/commands/setup/index.d.ts +5 -0
- package/dist/cli/commands/setup/index.js +25 -1
- 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/index.d.ts +2 -0
- package/dist/cli/commands/storage/index.js +2 -0
- package/dist/cli/commands/storage/offer.d.ts +3 -0
- package/dist/cli/commands/storage/offer.js +91 -0
- package/dist/cli/commands/storage/storage.d.ts +8 -0
- package/dist/cli/commands/storage/storage.js +179 -0
- package/dist/cli/commands/user-config.js +2 -2
- package/dist/cli/commands/vpn.d.ts +4 -0
- package/dist/cli/commands/vpn.js +91 -0
- package/dist/cli/commands/web.d.ts +4 -0
- package/dist/cli/commands/web.js +97 -0
- package/dist/cli/history.js +1 -1
- package/dist/cli/index.js +48 -4
- package/dist/cli/manifest.d.ts +339 -97
- package/dist/cli/manifest.js +222 -67
- package/dist/cli/menu/add-agent.d.ts +47 -0
- package/dist/cli/menu/add-agent.js +168 -0
- package/dist/cli/menu/apps.d.ts +38 -3
- package/dist/cli/menu/apps.js +80 -5
- package/dist/cli/menu/command-fields.d.ts +18 -0
- package/dist/cli/menu/command-fields.js +61 -0
- package/dist/cli/menu/command-form.d.ts +22 -0
- package/dist/cli/menu/command-form.js +169 -46
- package/dist/cli/menu/data-folder.d.ts +18 -0
- package/dist/cli/menu/data-folder.js +99 -0
- 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 +11 -2
- package/dist/cli/menu/menu.js +36 -15
- package/dist/cli/menu/pages/accounts-page.js +55 -24
- package/dist/cli/menu/pages/agents-page.d.ts +68 -0
- package/dist/cli/menu/pages/agents-page.js +345 -0
- package/dist/cli/menu/pages/apps-page.d.ts +3 -1
- package/dist/cli/menu/pages/apps-page.js +20 -4
- package/dist/cli/menu/pages/list-page.d.ts +43 -3
- package/dist/cli/menu/pages/list-page.js +146 -12
- package/dist/cli/menu/pages/maintenance-page.d.ts +9 -5
- package/dist/cli/menu/pages/maintenance-page.js +172 -85
- package/dist/cli/menu/pages/sandbox-page.d.ts +7 -6
- package/dist/cli/menu/pages/sandbox-page.js +117 -120
- package/dist/cli/menu/pages/scopes.d.ts +1 -1
- package/dist/cli/menu/pages/sessions-page.d.ts +6 -8
- package/dist/cli/menu/pages/sessions-page.js +22 -75
- package/dist/cli/menu/pages/settings-page.d.ts +10 -14
- package/dist/cli/menu/pages/settings-page.js +95 -102
- package/dist/cli/menu/render-view.d.ts +28 -0
- package/dist/cli/menu/render-view.js +112 -0
- package/dist/cli/menu/settings/ask-path.d.ts +14 -0
- package/dist/cli/menu/settings/ask-path.js +14 -0
- package/dist/cli/menu/settings/collections/collection-editor.d.ts +8 -2
- package/dist/cli/menu/settings/collections/collection-editor.js +12 -8
- package/dist/cli/menu/settings/collections/map-editor.js +5 -1
- package/dist/cli/menu/settings/collections/object-list-editor.js +2 -2
- package/dist/cli/menu/settings/collections/object-map-editor.js +2 -2
- package/dist/cli/menu/settings/collections/string-list-editor.d.ts +10 -1
- package/dist/cli/menu/settings/collections/string-list-editor.js +23 -0
- 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 +6 -2
- package/dist/cli/menu/settings/object-editor.js +15 -4
- 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 +10 -1
- package/dist/cli/menu/settings/value-editor.js +99 -63
- package/dist/cli/menu/several.js +7 -5
- 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 +53 -10
- package/dist/cli/menu/shell.js +115 -10
- package/dist/cli/menu/views.d.ts +7 -0
- package/dist/cli/menu/views.js +11 -0
- package/dist/cli/menu/vpn-login.d.ts +16 -0
- package/dist/cli/menu/vpn-login.js +74 -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 +5 -1
- package/dist/cli/output/print.js +15 -4
- 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/accounts-service.d.ts +2 -0
- package/dist/cli/services/accounts-service.js +2 -2
- 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/health-service.d.ts +0 -6
- package/dist/cli/services/health-service.js +5 -42
- package/dist/cli/services/index.d.ts +3 -1
- package/dist/cli/services/index.js +3 -1
- package/dist/cli/services/logs-service.js +4 -3
- package/dist/cli/services/migrate-service.js +1 -1
- package/dist/cli/services/update-service.d.ts +2 -0
- package/dist/cli/services/update-service.js +13 -6
- package/dist/cli/services/vpn-service.d.ts +28 -0
- package/dist/cli/services/vpn-service.js +46 -0
- package/dist/cli/services/web-service.d.ts +22 -0
- package/dist/cli/services/web-service.js +111 -0
- package/dist/cli/tui/app.d.ts +12 -4
- package/dist/cli/tui/app.js +38 -9
- package/dist/cli/tui/dialogs/path-listing.d.ts +43 -0
- package/dist/cli/tui/dialogs/path-listing.js +127 -0
- package/dist/cli/tui/dialogs/path-picker.d.ts +67 -0
- package/dist/cli/tui/dialogs/path-picker.js +423 -0
- package/dist/cli/tui/dialogs/text-screen.d.ts +6 -0
- package/dist/cli/tui/dialogs/text-screen.js +10 -3
- package/dist/cli/tui/frame.d.ts +7 -10
- package/dist/cli/tui/frame.js +19 -10
- package/dist/cli/tui/index.d.ts +4 -3
- package/dist/cli/tui/index.js +2 -1
- package/dist/cli/tui/list/list-screen.d.ts +28 -2
- package/dist/cli/tui/list/list-screen.js +130 -66
- package/dist/cli/tui/list/list-types.d.ts +10 -4
- package/dist/cli/tui/nav.d.ts +29 -0
- package/dist/cli/tui/nav.js +67 -0
- package/dist/cli/tui/terminal.d.ts +7 -0
- package/dist/cli/tui/terminal.js +30 -10
- package/dist/cli/validate.d.ts +1 -1
- package/dist/cli/validate.js +3 -3
- package/dist/cli/version.d.ts +2 -0
- package/dist/cli/version.js +11 -0
- package/dist/core/config/defaults.js +13 -1
- package/dist/core/config/loader.js +12 -2
- package/dist/core/local-config/overrides.js +1 -0
- package/dist/core/prompt.d.ts +19 -0
- package/dist/core/prompt.js +43 -3
- package/dist/core/schema/common.d.ts +6 -0
- package/dist/core/schema/common.js +8 -0
- package/dist/core/schema/config.d.ts +36 -0
- package/dist/core/schema/config.js +26 -2
- package/dist/core/schema/harness.d.ts +2 -0
- package/dist/core/schema/harness.js +13 -2
- package/dist/core/schema/index.d.ts +3 -1
- package/dist/core/schema/index.js +3 -1
- package/dist/core/schema/profile.d.ts +1 -0
- package/dist/core/schema/profile.js +3 -0
- package/dist/core/schema/redact.d.ts +13 -0
- package/dist/core/schema/redact.js +75 -0
- package/dist/core/schema/sandbox.d.ts +6 -0
- package/dist/core/schema/sandbox.js +21 -3
- package/dist/core/schema/vpn.d.ts +18 -0
- package/dist/core/schema/vpn.js +22 -0
- package/dist/core/schema/web.d.ts +6 -0
- package/dist/core/schema/web.js +14 -0
- package/dist/core/types.d.ts +44 -0
- 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 +54 -0
- package/dist/guest/agents/agent-files.js +67 -0
- package/dist/guest/agents/agent-installer.js +2 -9
- package/dist/guest/agents/local-state.d.ts +14 -0
- package/dist/guest/agents/local-state.js +218 -0
- package/dist/guest/agents/sbx-agent.d.ts +2 -0
- package/dist/guest/agents/sbx-agent.js +35 -0
- package/dist/guest/boot/boot.d.ts +4 -0
- package/dist/guest/boot/boot.js +51 -11
- package/dist/guest/daemon/daemon.js +8 -1
- package/dist/guest/daemon/exec.js +2 -1
- package/dist/guest/daemon/idle-shutdown.js +2 -0
- package/dist/guest/daemon/sessions.d.ts +5 -0
- package/dist/guest/daemon/sessions.js +20 -3
- package/dist/guest/entries/agent.d.ts +1 -0
- package/dist/guest/entries/agent.js +10 -0
- package/dist/guest/entries/daemon.js +5 -0
- package/dist/guest/governor/decide.d.ts +61 -0
- package/dist/guest/governor/decide.js +182 -0
- package/dist/guest/governor/governor.d.ts +42 -0
- package/dist/guest/governor/governor.js +214 -0
- package/dist/guest/governor/index.d.ts +2 -0
- package/dist/guest/governor/index.js +2 -0
- package/dist/guest/runtime/csc.d.ts +2 -0
- package/dist/guest/runtime/csc.js +2 -0
- package/dist/guest/runtime/secrets.d.ts +12 -0
- package/dist/guest/runtime/secrets.js +63 -0
- package/dist/guest/sessions/viewer.js +3 -1
- package/dist/guest/setup/claude-profile.d.ts +2 -1
- package/dist/guest/setup/claude-profile.js +12 -1
- package/dist/guest/setup/environment.d.ts +6 -0
- package/dist/guest/setup/environment.js +56 -6
- package/dist/guest/setup/path-plan.d.ts +32 -0
- package/dist/guest/setup/path-plan.js +67 -0
- package/dist/guest/setup/shell-path.d.ts +1 -0
- package/dist/guest/setup/shell-path.js +22 -0
- package/dist/guest/toolchains/languages/python.js +1 -1
- package/dist/guest/toolchains/native/rust-extras.js +4 -2
- package/dist/guest/toolchains/runtimes.js +2 -2
- package/dist/guest/vpn/index.d.ts +1 -0
- package/dist/guest/vpn/index.js +1 -0
- package/dist/guest/vpn/openvpn.d.ts +9 -0
- package/dist/guest/vpn/openvpn.js +47 -0
- package/dist/guest/vpn/tunnel.d.ts +17 -0
- package/dist/guest/vpn/tunnel.js +78 -0
- package/dist/guest/vpn/vpn.d.ts +6 -0
- package/dist/guest/vpn/vpn.js +174 -0
- 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 +6 -2
- package/dist/host/channel/attach.js +6 -3
- package/dist/host/channel/channel.d.ts +9 -0
- package/dist/host/channel/channel.js +30 -2
- 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/health/acl-read.d.ts +17 -0
- package/dist/host/health/acl-read.js +45 -0
- package/dist/host/health/config-backup.d.ts +11 -0
- package/dist/host/health/config-backup.js +73 -0
- package/dist/host/health/index.d.ts +6 -0
- package/dist/host/health/index.js +7 -0
- package/dist/host/health/install-state.d.ts +33 -0
- package/dist/host/health/install-state.js +110 -0
- package/dist/host/health/path-copies.d.ts +32 -0
- package/dist/host/health/path-copies.js +82 -0
- package/dist/host/health/stale.d.ts +45 -0
- package/dist/host/health/stale.js +120 -0
- package/dist/host/health/system.d.ts +37 -0
- package/dist/host/health/system.js +87 -0
- package/dist/host/install/copies.d.ts +13 -0
- package/dist/host/install/copies.js +63 -0
- package/dist/host/install/index.d.ts +1 -0
- package/dist/host/install/index.js +1 -0
- package/dist/host/launch/generate.d.ts +5 -1
- package/dist/host/launch/generate.js +73 -7
- 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 +11 -2
- package/dist/host/launch/stage.js +1 -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 +40 -0
- package/dist/host/life/host-memory.js +137 -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 +54 -0
- package/dist/host/life/watchdog.js +108 -0
- package/dist/host/migrate/backup.js +3 -0
- package/dist/host/migrate/migrations/config-file.d.ts +2 -0
- package/dist/host/migrate/migrations/config-file.js +7 -0
- package/dist/host/migrate/migrations/follow-machine-storage.js +9 -1
- package/dist/host/migrate/migrations/pin-storage-root.d.ts +4 -0
- package/dist/host/migrate/migrations/pin-storage-root.js +46 -0
- package/dist/host/migrate/migrations/unpin-config-defaults.js +4 -1
- package/dist/host/migrate/registry.js +2 -1
- package/dist/host/native.d.ts +3 -2
- package/dist/host/native.js +22 -3
- package/dist/host/profile/accounts.d.ts +25 -1
- package/dist/host/profile/accounts.js +96 -13
- package/dist/host/profile/agent-accounts.d.ts +5 -1
- package/dist/host/profile/agent-accounts.js +35 -5
- package/dist/host/profile/claude-login.js +3 -2
- package/dist/host/profile/index.d.ts +2 -1
- package/dist/host/profile/index.js +1 -0
- package/dist/host/profile/plugin-share.d.ts +26 -0
- package/dist/host/profile/plugin-share.js +146 -0
- package/dist/host/projects/join.d.ts +7 -1
- package/dist/host/projects/join.js +21 -4
- package/dist/host/projects/registry.d.ts +16 -10
- package/dist/host/projects/registry.js +74 -6
- 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 +4 -0
- package/dist/host/sandbox/platform.js +23 -4
- package/dist/host/sandbox/tasklist.d.ts +13 -0
- package/dist/host/sandbox/tasklist.js +47 -0
- package/dist/host/secrets/index.d.ts +2 -0
- package/dist/host/secrets/index.js +2 -0
- package/dist/host/secrets/launch-secrets.d.ts +17 -0
- package/dist/host/secrets/launch-secrets.js +94 -0
- package/dist/host/secrets/secret-store.d.ts +25 -0
- package/dist/host/secrets/secret-store.js +89 -0
- package/dist/host/sharing/acl.d.ts +16 -2
- package/dist/host/sharing/acl.js +35 -10
- package/dist/host/sharing/current.js +8 -3
- package/dist/host/sharing/doctor.d.ts +2 -0
- package/dist/host/sharing/doctor.js +44 -0
- package/dist/host/sharing/group-access.d.ts +6 -0
- package/dist/host/sharing/group-access.js +24 -0
- package/dist/host/sharing/index.d.ts +2 -1
- package/dist/host/sharing/index.js +2 -1
- package/dist/host/sharing/lifecycle.d.ts +8 -2
- package/dist/host/sharing/lifecycle.js +16 -7
- package/dist/host/storage/cleanup.d.ts +2 -0
- package/dist/host/storage/cleanup.js +2 -1
- 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/history.d.ts +21 -0
- package/dist/host/storage/history.js +49 -0
- package/dist/host/storage/index.d.ts +6 -0
- package/dist/host/storage/index.js +6 -0
- package/dist/host/storage/move.d.ts +95 -0
- package/dist/host/storage/move.js +384 -0
- package/dist/host/storage/offer.d.ts +11 -0
- package/dist/host/storage/offer.js +36 -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/storage/root.d.ts +18 -0
- package/dist/host/storage/root.js +77 -0
- package/dist/host/tools/conpty.js +3 -2
- package/dist/host/tools/windows-terminal.d.ts +2 -0
- package/dist/host/tools/windows-terminal.js +31 -12
- package/dist/host/update/index.d.ts +1 -1
- package/dist/host/update/index.js +1 -1
- package/dist/host/update/notice.d.ts +2 -0
- package/dist/host/update/notice.js +13 -1
- package/dist/host/update/update-state.d.ts +6 -0
- package/dist/host/update/update-state.js +2 -0
- package/dist/host/update/updater.d.ts +19 -0
- package/dist/host/update/updater.js +88 -12
- package/dist/host/vpn/index.d.ts +4 -0
- package/dist/host/vpn/index.js +4 -0
- package/dist/host/vpn/login.d.ts +24 -0
- package/dist/host/vpn/login.js +79 -0
- package/dist/host/vpn/nordvpn.d.ts +21 -0
- package/dist/host/vpn/nordvpn.js +77 -0
- package/dist/host/vpn/prepare.d.ts +19 -0
- package/dist/host/vpn/prepare.js +138 -0
- package/dist/host/vpn/status.d.ts +12 -0
- package/dist/host/vpn/status.js +53 -0
- package/dist/host/web/auth.d.ts +38 -0
- package/dist/host/web/auth.js +96 -0
- package/dist/host/web/backend.d.ts +14 -0
- package/dist/host/web/backend.js +1 -0
- package/dist/host/web/bridge.d.ts +27 -0
- package/dist/host/web/bridge.js +144 -0
- package/dist/host/web/browser.d.ts +3 -0
- package/dist/host/web/browser.js +23 -0
- package/dist/host/web/control.d.ts +17 -0
- package/dist/host/web/control.js +67 -0
- package/dist/host/web/index.d.ts +10 -0
- package/dist/host/web/index.js +9 -0
- package/dist/host/web/rpc.d.ts +24 -0
- package/dist/host/web/rpc.js +149 -0
- package/dist/host/web/runner.d.ts +16 -0
- package/dist/host/web/runner.js +44 -0
- package/dist/host/web/server.d.ts +47 -0
- package/dist/host/web/server.js +238 -0
- package/dist/host/web/state.d.ts +20 -0
- package/dist/host/web/state.js +41 -0
- package/dist/host/web/static-files.d.ts +13 -0
- package/dist/host/web/static-files.js +57 -0
- package/dist/runtime/agent.js +27675 -0
- package/dist/runtime/daemon.js +1950 -1122
- package/dist/runtime/db.js +302 -111
- package/dist/runtime/main.js +1560 -275
- package/dist/runtime/netproxy.js +168 -8
- package/dist/runtime/view.js +186 -13
- package/dist/selftest/accounts.test.js +40 -0
- package/dist/selftest/agent-paths.test.d.ts +2 -0
- package/dist/selftest/agent-paths.test.js +125 -0
- package/dist/selftest/app.test.d.ts +2 -0
- package/dist/selftest/app.test.js +324 -0
- package/dist/selftest/channel.test.js +18 -0
- package/dist/selftest/cli.test.js +35 -4
- 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.d.ts +2 -0
- package/dist/selftest/credentials.test.js +198 -0
- package/dist/selftest/engine.test.d.ts +2 -0
- package/dist/selftest/engine.test.js +127 -0
- package/dist/selftest/generate.test.js +1 -1
- package/dist/selftest/hcs.test.d.ts +2 -0
- package/dist/selftest/hcs.test.js +482 -0
- package/dist/selftest/health.test.d.ts +2 -0
- package/dist/selftest/health.test.js +470 -0
- package/dist/selftest/heavy-load.test.d.ts +2 -0
- package/dist/selftest/heavy-load.test.js +329 -0
- package/dist/selftest/host-sim.test.js +2 -0
- package/dist/selftest/index.js +31 -0
- package/dist/selftest/layout.test.js +14 -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.d.ts +7 -0
- package/dist/selftest/menu-screens.js +68 -17
- package/dist/selftest/menu.test.js +603 -22
- package/dist/selftest/migrate.test.js +1 -1
- package/dist/selftest/personalization.test.js +3 -1
- package/dist/selftest/projects.test.js +39 -1
- package/dist/selftest/shared-use.test.js +64 -2
- package/dist/selftest/sharing.test.js +50 -1
- package/dist/selftest/storage.test.d.ts +2 -0
- package/dist/selftest/storage.test.js +363 -0
- 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 +20 -0
- package/dist/selftest/support/hcs-probes.d.ts +17 -0
- package/dist/selftest/support/hcs-probes.js +41 -0
- package/dist/selftest/support/releases.js +1 -1
- package/dist/selftest/toolchains.test.js +21 -0
- package/dist/selftest/update-service.test.js +87 -3
- package/dist/selftest/vpn.test.d.ts +2 -0
- package/dist/selftest/vpn.test.js +412 -0
- package/dist/selftest/web.test.d.ts +2 -0
- package/dist/selftest/web.test.js +402 -0
- package/dist/shared/apps/catalogue.js +31 -0
- package/dist/shared/channel/index.d.ts +1 -0
- package/dist/shared/channel/index.js +1 -0
- package/dist/shared/channel/run-dir.d.ts +9 -1
- package/dist/shared/channel/run-dir.js +18 -1
- package/dist/shared/channel/schema.d.ts +53 -0
- package/dist/shared/channel/schema.js +38 -0
- package/dist/shared/channel/secrets.d.ts +29 -0
- package/dist/shared/channel/secrets.js +50 -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 +33 -0
- package/dist/shared/memory/policy.js +55 -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 +29 -0
- package/dist/shared/vpn/download.js +30 -0
- package/dist/shared/vpn/kill-switch.d.ts +18 -0
- package/dist/shared/vpn/kill-switch.js +81 -0
- package/dist/shared/vpn/ovpn.d.ts +23 -0
- package/dist/shared/vpn/ovpn.js +244 -0
- package/dist/shared/vpn/wireguard.d.ts +51 -0
- package/dist/shared/vpn/wireguard.js +227 -0
- package/dist/shared/web/index.d.ts +1 -0
- package/dist/shared/web/index.js +1 -0
- package/dist/shared/web/protocol.d.ts +61 -0
- package/dist/shared/web/protocol.js +35 -0
- package/dist/sync/sync-cycle.js +9 -5
- package/dist/sync/sync-state.d.ts +1 -0
- package/dist/sync/sync-state.js +1 -0
- package/dist/sync/watcher.d.ts +13 -0
- package/dist/sync/watcher.js +102 -3
- package/dist/web/index.html +14 -0
- package/dist/web/main-NRRS5O6Z.js +157 -0
- package/dist/web/main-T5DMCHYV.css +1 -0
- package/native/csharp/FolderSecurity.cs +29 -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 +107 -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 +34 -0
- package/native/scripts/mount-contained.ps1 +139 -0
- package/native/scripts/protect-data.ps1 +29 -0
- package/native/scripts/read-folder-sddl.ps1 +10 -0
- package/native/scripts/run-elevated.ps1 +17 -4
- package/native/scripts/set-folder-access.ps1 +49 -7
- package/native/scripts/stop-events.ps1 +23 -8
- package/node_modules/ws/LICENSE +20 -0
- package/node_modules/ws/README.md +548 -0
- package/node_modules/ws/browser.js +8 -0
- package/node_modules/ws/index.js +22 -0
- package/node_modules/ws/lib/buffer-util.js +131 -0
- package/node_modules/ws/lib/constants.js +19 -0
- package/node_modules/ws/lib/event-target.js +292 -0
- package/node_modules/ws/lib/extension.js +203 -0
- package/node_modules/ws/lib/limiter.js +55 -0
- package/node_modules/ws/lib/permessage-deflate.js +530 -0
- package/node_modules/ws/lib/receiver.js +743 -0
- package/node_modules/ws/lib/sender.js +607 -0
- package/node_modules/ws/lib/stream.js +161 -0
- package/node_modules/ws/lib/subprotocol.js +62 -0
- package/node_modules/ws/lib/validation.js +152 -0
- package/node_modules/ws/lib/websocket-server.js +562 -0
- package/node_modules/ws/lib/websocket.js +1421 -0
- package/node_modules/ws/package.json +74 -0
- package/node_modules/ws/wrapper.mjs +21 -0
- package/package.json +22 -5
- package/sandbox/csharp/EnvBroadcast.cs +33 -0
- package/sandbox/csharp/MemGov.cs +398 -0
- package/sandbox/csharp/PathSync.cs +90 -0
- package/sandbox/csharp/PtyHost.cs +111 -5
- package/sandbox/scripts/install-shell-path.ps1 +73 -0
- package/sandbox/scripts/set-machine-environment.ps1 +37 -4
- package/schemas/config.schema.json +136 -7
- package/schemas/sandbox-config.schema.json +17 -4
- package/dist/cli/commands/repair/checks.d.ts +0 -2
- package/dist/cli/commands/repair/checks.js +0 -246
- 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 -45
- package/dist/cli/commands/sessions/status.d.ts +0 -2
- package/dist/cli/commands/sessions/status.js +0 -93
- package/dist/cli/commands/sessions/window.d.ts +0 -3
- package/dist/cli/commands/sessions/window.js +0 -18
- package/dist/cli/menu/pages/start-page.d.ts +0 -43
- package/dist/cli/menu/pages/start-page.js +0 -192
- package/dist/cli/tui/tab-bar.d.ts +0 -9
- package/dist/cli/tui/tab-bar.js +0 -33
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// The only way an operation talks to the person using it: progress and log lines, and questions (confirm, choose,
|
|
2
|
+
// text, secret, path, checklist). Each surface answers them its own way (the CLI with prompts, the menu with dialogs,
|
|
3
|
+
// the web with modals over RPC); a feature never knows which. Questions are plain data (QuestionSchema), so the web can
|
|
4
|
+
// receive them; every surface builds its OperationIO from one `Asker` with ioFromAsker().
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
const Lines = z.array(z.string()).optional();
|
|
7
|
+
const ChoiceSchema = z.strictObject({ value: z.string(), label: z.string(), description: z.string().optional() });
|
|
8
|
+
export const ConfirmQuestionSchema = z.strictObject({
|
|
9
|
+
kind: z.literal('confirm'),
|
|
10
|
+
title: z.string(),
|
|
11
|
+
lines: Lines,
|
|
12
|
+
/** The word on the yes button ("Stop"). */
|
|
13
|
+
yes: z.string().optional(),
|
|
14
|
+
danger: z.boolean().optional(),
|
|
15
|
+
/** A stronger confirmation: yes means typing this word (another user's name). */
|
|
16
|
+
typed: z.string().optional(),
|
|
17
|
+
/**
|
|
18
|
+
* A command typed on purpose is answer enough: the CLI does not ask (the menu and web still do). Without it the CLI
|
|
19
|
+
* asks on a terminal, takes --yes, and fails without a terminal (with `noTerminal`, or "Add --yes").
|
|
20
|
+
*/
|
|
21
|
+
implied: z.boolean().optional(),
|
|
22
|
+
noTerminal: z.strictObject({ message: z.string(), fix: z.string() }).optional(),
|
|
23
|
+
});
|
|
24
|
+
export const ChooseQuestionSchema = z.strictObject({
|
|
25
|
+
kind: z.literal('choose'),
|
|
26
|
+
title: z.string(),
|
|
27
|
+
lines: Lines,
|
|
28
|
+
choices: z.array(ChoiceSchema).min(1),
|
|
29
|
+
initial: z.string().optional(),
|
|
30
|
+
});
|
|
31
|
+
export const TextQuestionSchema = z.strictObject({
|
|
32
|
+
kind: z.literal('text'),
|
|
33
|
+
title: z.string(),
|
|
34
|
+
lines: Lines,
|
|
35
|
+
initial: z.string().optional(),
|
|
36
|
+
allowEmpty: z.boolean().optional(),
|
|
37
|
+
/** What was wrong with the last answer (asked again). */
|
|
38
|
+
problem: z.string().optional(),
|
|
39
|
+
});
|
|
40
|
+
export const SecretQuestionSchema = z.strictObject({
|
|
41
|
+
kind: z.literal('secret'),
|
|
42
|
+
title: z.string(),
|
|
43
|
+
lines: Lines,
|
|
44
|
+
problem: z.string().optional(),
|
|
45
|
+
});
|
|
46
|
+
export const PathQuestionSchema = z.strictObject({
|
|
47
|
+
kind: z.literal('path'),
|
|
48
|
+
title: z.string(),
|
|
49
|
+
lines: Lines,
|
|
50
|
+
pathKind: z.enum(['dir', 'file']),
|
|
51
|
+
initial: z.string().optional(),
|
|
52
|
+
/** Words allowed instead of a path ("auto"). */
|
|
53
|
+
literals: z.array(z.string()).optional(),
|
|
54
|
+
problem: z.string().optional(),
|
|
55
|
+
});
|
|
56
|
+
export const ChecklistQuestionSchema = z.strictObject({
|
|
57
|
+
kind: z.literal('checklist'),
|
|
58
|
+
title: z.string(),
|
|
59
|
+
lines: Lines,
|
|
60
|
+
choices: z.array(ChoiceSchema),
|
|
61
|
+
checked: z.array(z.string()).optional(),
|
|
62
|
+
});
|
|
63
|
+
export const QuestionSchema = z.discriminatedUnion('kind', [
|
|
64
|
+
ConfirmQuestionSchema,
|
|
65
|
+
ChooseQuestionSchema,
|
|
66
|
+
TextQuestionSchema,
|
|
67
|
+
SecretQuestionSchema,
|
|
68
|
+
PathQuestionSchema,
|
|
69
|
+
ChecklistQuestionSchema,
|
|
70
|
+
]);
|
|
71
|
+
/** The wire shape of an answer for each kind (the server checks what the browser sends). */
|
|
72
|
+
export const ANSWER_SCHEMAS = {
|
|
73
|
+
confirm: z.boolean(),
|
|
74
|
+
choose: z.string().max(1000).optional(),
|
|
75
|
+
text: z.string().max(10000).optional(),
|
|
76
|
+
secret: z.string().max(10000).optional(),
|
|
77
|
+
path: z.string().max(2000).optional(),
|
|
78
|
+
checklist: z.array(z.string().max(1000)).max(1000).optional(),
|
|
79
|
+
};
|
|
80
|
+
/** Asks a typed question until `validate` accepts the answer (each new try names the problem). */
|
|
81
|
+
async function untilValid(asker, question, validate) {
|
|
82
|
+
for (let q = question;;) {
|
|
83
|
+
const answer = (await asker(q));
|
|
84
|
+
if (answer === undefined || !validate)
|
|
85
|
+
return answer;
|
|
86
|
+
const verdict = validate(answer);
|
|
87
|
+
if (verdict === true)
|
|
88
|
+
return answer;
|
|
89
|
+
q = { ...q, problem: verdict };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** An OperationIO from one way of asking and one place for output lines. */
|
|
93
|
+
export function ioFromAsker(asker, sink) {
|
|
94
|
+
return {
|
|
95
|
+
progress: (text) => sink.progress(text),
|
|
96
|
+
log: (text, tone) => sink.log(text, tone),
|
|
97
|
+
confirm: (q) => asker({ ...q, kind: 'confirm' }),
|
|
98
|
+
choose: (q) => asker({ ...q, kind: 'choose' }),
|
|
99
|
+
text: ({ validate, ...q }) => untilValid(asker, { ...q, kind: 'text' }, validate),
|
|
100
|
+
secret: ({ validate, ...q }) => untilValid(asker, { ...q, kind: 'secret' }, validate),
|
|
101
|
+
path: ({ validate, ...q }) => untilValid(asker, { ...q, kind: 'path' }, validate),
|
|
102
|
+
checklist: (q) => asker({ ...q, kind: 'checklist' }),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* An OperationIO for tests: answers come from a list in order (a function gets the question). Running out of answers
|
|
107
|
+
* fails the test with the question that had none.
|
|
108
|
+
*/
|
|
109
|
+
export function fakeIO(answers = []) {
|
|
110
|
+
const queue = [...answers];
|
|
111
|
+
const seen = { questions: [], progress: [], logs: [] };
|
|
112
|
+
const asker = (question) => {
|
|
113
|
+
seen.questions.push(question);
|
|
114
|
+
if (!queue.length)
|
|
115
|
+
return Promise.reject(new Error('No answer for: ' + question.title));
|
|
116
|
+
const next = queue.shift();
|
|
117
|
+
return Promise.resolve((typeof next === 'function' ? next(question) : next));
|
|
118
|
+
};
|
|
119
|
+
const io = ioFromAsker(asker, {
|
|
120
|
+
progress: (text) => seen.progress.push(text),
|
|
121
|
+
log: (text, tone) => seen.logs.push({ text, ...(tone ? { tone } : {}) }),
|
|
122
|
+
});
|
|
123
|
+
return { io, seen };
|
|
124
|
+
}
|
|
125
|
+
/** For reads that never ask (queries): output is dropped, and a question is a bug. */
|
|
126
|
+
export const NO_QUESTIONS = ioFromAsker((question) => Promise.reject(new Error('A query asked a question: ' + question.title)), { progress: () => undefined, log: () => undefined });
|
|
@@ -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;
|
|
@@ -20,6 +20,7 @@ type ZodLike = z.ZodType & {
|
|
|
20
20
|
description?: string;
|
|
21
21
|
minValue?: number | null;
|
|
22
22
|
maxValue?: number | null;
|
|
23
|
+
isInt?: boolean;
|
|
23
24
|
};
|
|
24
25
|
/** The editor a setting gets. */
|
|
25
26
|
export type EditorKind = 'boolean' | 'choice' | 'union' | 'number' | 'string' | 'string-list' | 'choice-list' | 'object-list' | 'string-map' | 'object-map' | 'object' | 'json';
|
|
@@ -35,6 +36,14 @@ export declare class SchemaNode {
|
|
|
35
36
|
get description(): string | undefined;
|
|
36
37
|
get min(): number | undefined;
|
|
37
38
|
get max(): number | undefined;
|
|
39
|
+
/** A number that must be whole. */
|
|
40
|
+
get integer(): boolean;
|
|
41
|
+
/** A secret (an API key): shown as ***, typed with each character hidden. */
|
|
42
|
+
get secret(): boolean;
|
|
43
|
+
/** May the setting be left out (optional or with a default)? */
|
|
44
|
+
get optional(): boolean;
|
|
45
|
+
/** The numbers allowed, in words: "1 to 65535", "at least 2048", "more than 0", "" without limits. */
|
|
46
|
+
rangeText(): string;
|
|
38
47
|
/** The fields of an object, in schema order. */
|
|
39
48
|
children(): [string, SchemaNode][];
|
|
40
49
|
child(name: string): SchemaNode | undefined;
|
|
@@ -35,6 +35,32 @@ export class SchemaNode {
|
|
|
35
35
|
get max() {
|
|
36
36
|
return this.inner.maxValue ?? undefined;
|
|
37
37
|
}
|
|
38
|
+
/** A number that must be whole. */
|
|
39
|
+
get integer() {
|
|
40
|
+
return Boolean(this.inner.isInt);
|
|
41
|
+
}
|
|
42
|
+
/** A secret (an API key): shown as ***, typed with each character hidden. */
|
|
43
|
+
get secret() {
|
|
44
|
+
const meta = (z) => z.meta?.();
|
|
45
|
+
return meta(this.schema)?.secret === true || meta(this.inner)?.secret === true;
|
|
46
|
+
}
|
|
47
|
+
/** May the setting be left out (optional or with a default)? */
|
|
48
|
+
get optional() {
|
|
49
|
+
return ['optional', 'default'].includes(this.schema._zod.def.type);
|
|
50
|
+
}
|
|
51
|
+
/** The numbers allowed, in words: "1 to 65535", "at least 2048", "more than 0", "" without limits. */
|
|
52
|
+
rangeText() {
|
|
53
|
+
const checks = (this.inner._zod.def.checks ?? []).map((c) => c._zod.def);
|
|
54
|
+
const lower = checks.find((c) => c.check === 'greater_than');
|
|
55
|
+
const upper = checks.find((c) => c.check === 'less_than');
|
|
56
|
+
const lo = lower?.value;
|
|
57
|
+
const hi = upper?.value;
|
|
58
|
+
if (lo !== undefined && hi !== undefined && lower?.inclusive !== false && upper?.inclusive !== false)
|
|
59
|
+
return lo + ' to ' + hi;
|
|
60
|
+
const low = lo === undefined ? '' : (lower?.inclusive === false ? 'more than ' : 'at least ') + lo;
|
|
61
|
+
const high = hi === undefined ? '' : (upper?.inclusive === false ? 'less than ' : 'at most ') + hi;
|
|
62
|
+
return [low, high].filter(Boolean).join(' and ');
|
|
63
|
+
}
|
|
38
64
|
/** The fields of an object, in schema order. */
|
|
39
65
|
children() {
|
|
40
66
|
return Object.entries(this.inner.shape ?? {})
|
|
@@ -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;
|