workos 0.2.0 → 0.3.2
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/.claude-plugin/plugin.json +3 -3
- package/README.md +3 -2
- package/dist/bin.js +42 -20
- package/dist/bin.js.map +1 -1
- package/dist/cli.config.d.ts +6 -2
- package/dist/cli.config.js +8 -2
- package/dist/cli.config.js.map +1 -1
- package/dist/commands/install-skill.js.map +1 -0
- package/dist/{src/commands → commands}/install.js +8 -12
- package/dist/commands/install.js.map +1 -0
- package/dist/{src/commands → commands}/login.js +3 -2
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/craft-pre-release.sh +10 -0
- package/dist/dashboard/components/AnimatedLogo.js.map +1 -0
- package/dist/dashboard/components/CompletionView.js.map +1 -0
- package/dist/dashboard/components/ConfirmPrompt.js.map +1 -0
- package/dist/dashboard/components/CredentialsForm.js.map +1 -0
- package/dist/dashboard/components/Dashboard.js.map +1 -0
- package/dist/{src/dashboard → dashboard}/components/DashboardLayout.d.ts +2 -2
- package/dist/dashboard/components/DashboardLayout.js.map +1 -0
- package/dist/{src/dashboard → dashboard}/components/DiffPanel.d.ts +2 -2
- package/dist/dashboard/components/DiffPanel.js.map +1 -0
- package/dist/dashboard/components/InlinePrompt.js.map +1 -0
- package/dist/{src/dashboard → dashboard}/components/OutputPanel.d.ts +2 -2
- package/dist/dashboard/components/OutputPanel.js.map +1 -0
- package/dist/dashboard/components/Panel.js.map +1 -0
- package/dist/dashboard/components/TextInput.js.map +1 -0
- package/dist/dashboard/components/WelcomeArt.js.map +1 -0
- package/dist/dashboard/hooks/useAnimation.js.map +1 -0
- package/dist/dashboard/hooks/useKeyboard.js.map +1 -0
- package/dist/dashboard/hooks/useTerminalSize.js.map +1 -0
- package/dist/{src/dashboard → dashboard}/index.d.ts +2 -2
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/lib/diff-utils.js.map +1 -0
- package/dist/dashboard/lib/logo-frames.js.map +1 -0
- package/dist/dashboard/lib/welcome-art.js.map +1 -0
- package/dist/dashboard/types.d.ts +5 -0
- package/dist/dashboard/types.js.map +1 -0
- package/dist/{src/lib → lib}/adapters/cli-adapter.d.ts +5 -5
- package/dist/{src/lib → lib}/adapters/cli-adapter.js +5 -5
- package/dist/lib/adapters/cli-adapter.js.map +1 -0
- package/dist/{src/lib → lib}/adapters/dashboard-adapter.d.ts +4 -4
- package/dist/lib/adapters/dashboard-adapter.js.map +1 -0
- package/dist/{src/lib → lib}/adapters/index.d.ts +1 -1
- package/dist/lib/adapters/index.js.map +1 -0
- package/dist/{src/lib → lib}/adapters/types.d.ts +4 -4
- package/dist/lib/adapters/types.js.map +1 -0
- package/dist/{src/lib → lib}/agent-interface.d.ts +15 -9
- package/dist/{src/lib → lib}/agent-interface.js +146 -61
- package/dist/lib/agent-interface.js.map +1 -0
- package/dist/{src/lib → lib}/agent-runner.d.ts +2 -2
- package/dist/{src/lib → lib}/agent-runner.js +4 -4
- package/dist/lib/agent-runner.js.map +1 -0
- package/dist/{src/lib → lib}/ai-content.d.ts +6 -2
- package/dist/lib/ai-content.js +130 -0
- package/dist/lib/ai-content.js.map +1 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/background-refresh.d.ts +29 -0
- package/dist/lib/background-refresh.js +95 -0
- package/dist/lib/background-refresh.js.map +1 -0
- package/dist/{src/lib → lib}/config.d.ts +6 -6
- package/dist/lib/config.js.map +1 -0
- package/dist/{src/lib → lib}/constants.d.ts +1 -1
- package/dist/{src/lib → lib}/constants.js +1 -1
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/credential-discovery.js.map +1 -0
- package/dist/lib/credential-proxy.d.ts +36 -0
- package/dist/lib/credential-proxy.js +298 -0
- package/dist/lib/credential-proxy.js.map +1 -0
- package/dist/{src/lib → lib}/credentials.d.ts +6 -0
- package/dist/{src/lib → lib}/credentials.js +33 -0
- package/dist/lib/credentials.js.map +1 -0
- package/dist/{src/lib → lib}/device-auth.d.ts +1 -0
- package/dist/{src/lib → lib}/device-auth.js +2 -1
- package/dist/lib/device-auth.js.map +1 -0
- package/dist/lib/ensure-auth.d.ts +22 -0
- package/dist/lib/ensure-auth.js +83 -0
- package/dist/lib/ensure-auth.js.map +1 -0
- package/dist/lib/env-writer.js.map +1 -0
- package/dist/{src/lib → lib}/events.d.ts +8 -8
- package/dist/{src/lib → lib}/events.js +3 -3
- package/dist/{src/lib → lib}/events.js.map +1 -1
- package/dist/{src/lib → lib}/framework-config.d.ts +2 -2
- package/dist/{src/lib → lib}/framework-config.js +1 -1
- package/dist/lib/framework-config.js.map +1 -0
- package/dist/lib/helper-functions.js.map +1 -0
- package/dist/{src/lib/wizard-core.d.ts → lib/installer-core.d.ts} +21 -17
- package/dist/{src/lib/wizard-core.js → lib/installer-core.js} +19 -17
- package/dist/lib/installer-core.js.map +1 -0
- package/dist/{src/lib/wizard-core.types.d.ts → lib/installer-core.types.d.ts} +9 -9
- package/dist/lib/installer-core.types.js +2 -0
- package/dist/lib/installer-core.types.js.map +1 -0
- package/dist/lib/port-detection.js.map +1 -0
- package/dist/lib/post-install.js.map +1 -0
- package/dist/lib/progress-tracker.js.map +1 -0
- package/dist/lib/run-with-core.d.ts +2 -0
- package/dist/{src/lib → lib}/run-with-core.js +38 -48
- package/dist/lib/run-with-core.js.map +1 -0
- package/dist/lib/safe-tools.js.map +1 -0
- package/dist/{src/lib → lib}/settings.d.ts +3 -0
- package/dist/{src/lib → lib}/settings.js +2 -3
- package/dist/lib/settings.js.map +1 -0
- package/dist/lib/staging-api.js.map +1 -0
- package/dist/lib/token-refresh-client.d.ts +23 -0
- package/dist/lib/token-refresh-client.js +88 -0
- package/dist/lib/token-refresh-client.js.map +1 -0
- package/dist/{src/lib → lib}/token-refresh.js +1 -1
- package/dist/lib/token-refresh.js.map +1 -0
- package/dist/lib/validation/build-validator.js.map +1 -0
- package/dist/lib/validation/index.js.map +1 -0
- package/dist/lib/validation/types.js.map +1 -0
- package/dist/lib/validation/validator.js.map +1 -0
- package/dist/{src/lib → lib}/workos-management.js +3 -3
- package/dist/lib/workos-management.js.map +1 -0
- package/dist/nextjs/nextjs-installer-agent.d.ts +6 -0
- package/dist/{src/nextjs/nextjs-wizard-agent.js → nextjs/nextjs-installer-agent.js} +6 -6
- package/dist/nextjs/nextjs-installer-agent.js.map +1 -0
- package/dist/{src/nextjs → nextjs}/utils.d.ts +2 -2
- package/dist/nextjs/utils.js.map +1 -0
- package/dist/react/react-installer-agent.d.ts +2 -0
- package/dist/{src/react/react-wizard-agent.js → react/react-installer-agent.js} +4 -4
- package/dist/react/react-installer-agent.js.map +1 -0
- package/dist/react-router/react-router-installer-agent.d.ts +6 -0
- package/dist/{src/react-router/react-router-wizard-agent.js → react-router/react-router-installer-agent.js} +6 -6
- package/dist/react-router/react-router-installer-agent.js.map +1 -0
- package/dist/{src/react-router → react-router}/utils.d.ts +2 -2
- package/dist/react-router/utils.js.map +1 -0
- package/dist/{src/run.d.ts → run.d.ts} +2 -1
- package/dist/{src/run.js → run.js} +5 -4
- package/dist/run.js.map +1 -0
- package/dist/{src/steps → steps}/add-or-update-environment-variables.js +5 -5
- package/dist/steps/add-or-update-environment-variables.js.map +1 -0
- package/dist/steps/index.js.map +1 -0
- package/dist/{src/steps → steps}/run-prettier.d.ts +2 -2
- package/dist/{src/steps → steps}/run-prettier.js +1 -1
- package/dist/steps/run-prettier.js.map +1 -0
- package/dist/{src/steps → steps}/upload-environment-variables/EnvironmentProvider.d.ts +3 -3
- package/dist/steps/upload-environment-variables/EnvironmentProvider.js.map +1 -0
- package/dist/{src/steps → steps}/upload-environment-variables/index.d.ts +2 -2
- package/dist/{src/steps → steps}/upload-environment-variables/index.js +3 -3
- package/dist/steps/upload-environment-variables/index.js.map +1 -0
- package/dist/{src/steps → steps}/upload-environment-variables/providers/vercel.d.ts +2 -2
- package/dist/steps/upload-environment-variables/providers/vercel.js.map +1 -0
- package/dist/tanstack-start/tanstack-start-installer-agent.d.ts +2 -0
- package/dist/{src/tanstack-start/tanstack-start-wizard-agent.js → tanstack-start/tanstack-start-installer-agent.js} +4 -4
- package/dist/tanstack-start/tanstack-start-installer-agent.js.map +1 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/{src/utils → utils}/analytics.js +8 -8
- package/dist/utils/analytics.js.map +1 -0
- package/dist/utils/bash.js.map +1 -0
- package/dist/{src/utils → utils}/clack-utils.d.ts +9 -9
- package/dist/{src/utils → utils}/clack-utils.js +8 -8
- package/dist/utils/clack-utils.js.map +1 -0
- package/dist/utils/clack.js.map +1 -0
- package/dist/utils/cli-symbols.js.map +1 -0
- package/dist/{src/utils → utils}/debug.js +1 -1
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/env-parser.js.map +1 -0
- package/dist/utils/environment.d.ts +4 -0
- package/dist/{src/utils → utils}/environment.js +1 -1
- package/dist/utils/environment.js.map +1 -0
- package/dist/{src/utils → utils}/errors.js +1 -1
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/git-utils.js.map +1 -0
- package/dist/utils/logging.js.map +1 -0
- package/dist/utils/package-json.js.map +1 -0
- package/dist/{src/utils → utils}/package-manager.d.ts +4 -4
- package/dist/utils/package-manager.js.map +1 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/utils/semver.js.map +1 -0
- package/dist/utils/string.js.map +1 -0
- package/dist/{src/utils → utils}/telemetry-client.js +6 -2
- package/dist/utils/telemetry-client.js.map +1 -0
- package/dist/{src/utils → utils}/telemetry-types.d.ts +5 -5
- package/dist/utils/telemetry-types.js +6 -0
- package/dist/utils/telemetry-types.js.map +1 -0
- package/dist/{src/utils → utils}/types.d.ts +7 -2
- package/dist/{src/utils → utils}/types.js.map +1 -1
- package/dist/utils/urls.js.map +1 -0
- package/dist/utils/vendor/is-unicorn-supported.js.map +1 -0
- package/dist/vanilla-js/vanilla-js-installer-agent.d.ts +2 -0
- package/dist/{src/vanilla-js/vanilla-js-wizard-agent.js → vanilla-js/vanilla-js-installer-agent.js} +4 -4
- package/dist/vanilla-js/vanilla-js-installer-agent.js.map +1 -0
- package/package.json +10 -6
- package/dist/src/commands/install-skill.js.map +0 -1
- package/dist/src/commands/install.js.map +0 -1
- package/dist/src/commands/login.js.map +0 -1
- package/dist/src/commands/logout.js.map +0 -1
- package/dist/src/dashboard/components/AnimatedLogo.js.map +0 -1
- package/dist/src/dashboard/components/CompletionView.js.map +0 -1
- package/dist/src/dashboard/components/ConfirmPrompt.js.map +0 -1
- package/dist/src/dashboard/components/CredentialsForm.js.map +0 -1
- package/dist/src/dashboard/components/Dashboard.js.map +0 -1
- package/dist/src/dashboard/components/DashboardLayout.js.map +0 -1
- package/dist/src/dashboard/components/DiffPanel.js.map +0 -1
- package/dist/src/dashboard/components/InlinePrompt.js.map +0 -1
- package/dist/src/dashboard/components/OutputPanel.js.map +0 -1
- package/dist/src/dashboard/components/Panel.js.map +0 -1
- package/dist/src/dashboard/components/TextInput.js.map +0 -1
- package/dist/src/dashboard/components/WelcomeArt.js.map +0 -1
- package/dist/src/dashboard/hooks/useAnimation.js.map +0 -1
- package/dist/src/dashboard/hooks/useKeyboard.js.map +0 -1
- package/dist/src/dashboard/hooks/useTerminalSize.js.map +0 -1
- package/dist/src/dashboard/index.js.map +0 -1
- package/dist/src/dashboard/lib/diff-utils.js.map +0 -1
- package/dist/src/dashboard/lib/logo-frames.js.map +0 -1
- package/dist/src/dashboard/lib/welcome-art.js.map +0 -1
- package/dist/src/dashboard/types.d.ts +0 -5
- package/dist/src/dashboard/types.js.map +0 -1
- package/dist/src/lib/__tests__/test-utils.d.ts +0 -40
- package/dist/src/lib/__tests__/test-utils.js +0 -108
- package/dist/src/lib/__tests__/test-utils.js.map +0 -1
- package/dist/src/lib/adapters/cli-adapter.js.map +0 -1
- package/dist/src/lib/adapters/dashboard-adapter.js.map +0 -1
- package/dist/src/lib/adapters/index.js.map +0 -1
- package/dist/src/lib/adapters/types.js.map +0 -1
- package/dist/src/lib/agent-interface.js.map +0 -1
- package/dist/src/lib/agent-runner.js.map +0 -1
- package/dist/src/lib/ai-content.js +0 -68
- package/dist/src/lib/ai-content.js.map +0 -1
- package/dist/src/lib/api.js.map +0 -1
- package/dist/src/lib/config.js.map +0 -1
- package/dist/src/lib/constants.js.map +0 -1
- package/dist/src/lib/credential-discovery.js.map +0 -1
- package/dist/src/lib/credentials.js.map +0 -1
- package/dist/src/lib/device-auth.js.map +0 -1
- package/dist/src/lib/env-writer.js.map +0 -1
- package/dist/src/lib/framework-config.js.map +0 -1
- package/dist/src/lib/helper-functions.js.map +0 -1
- package/dist/src/lib/port-detection.js.map +0 -1
- package/dist/src/lib/post-install.js.map +0 -1
- package/dist/src/lib/progress-tracker.js.map +0 -1
- package/dist/src/lib/run-with-core.d.ts +0 -2
- package/dist/src/lib/run-with-core.js.map +0 -1
- package/dist/src/lib/safe-tools.js.map +0 -1
- package/dist/src/lib/settings.js.map +0 -1
- package/dist/src/lib/staging-api.js.map +0 -1
- package/dist/src/lib/token-refresh.js.map +0 -1
- package/dist/src/lib/validation/build-validator.js.map +0 -1
- package/dist/src/lib/validation/index.js.map +0 -1
- package/dist/src/lib/validation/types.js.map +0 -1
- package/dist/src/lib/validation/validator.js.map +0 -1
- package/dist/src/lib/wizard-core.js.map +0 -1
- package/dist/src/lib/wizard-core.types.js +0 -2
- package/dist/src/lib/wizard-core.types.js.map +0 -1
- package/dist/src/lib/workos-management.js.map +0 -1
- package/dist/src/nextjs/nextjs-wizard-agent.d.ts +0 -6
- package/dist/src/nextjs/nextjs-wizard-agent.js.map +0 -1
- package/dist/src/nextjs/utils.js.map +0 -1
- package/dist/src/react/react-wizard-agent.d.ts +0 -2
- package/dist/src/react/react-wizard-agent.js.map +0 -1
- package/dist/src/react-router/react-router-wizard-agent.d.ts +0 -6
- package/dist/src/react-router/react-router-wizard-agent.js.map +0 -1
- package/dist/src/react-router/utils.js.map +0 -1
- package/dist/src/run.js.map +0 -1
- package/dist/src/steps/add-or-update-environment-variables.js.map +0 -1
- package/dist/src/steps/index.js.map +0 -1
- package/dist/src/steps/run-prettier.js.map +0 -1
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js.map +0 -1
- package/dist/src/steps/upload-environment-variables/index.js.map +0 -1
- package/dist/src/steps/upload-environment-variables/providers/vercel.js.map +0 -1
- package/dist/src/tanstack-start/tanstack-start-wizard-agent.d.ts +0 -2
- package/dist/src/tanstack-start/tanstack-start-wizard-agent.js.map +0 -1
- package/dist/src/telemetry.js.map +0 -1
- package/dist/src/utils/analytics.js.map +0 -1
- package/dist/src/utils/bash.js.map +0 -1
- package/dist/src/utils/clack-utils.js.map +0 -1
- package/dist/src/utils/clack.js.map +0 -1
- package/dist/src/utils/cli-symbols.js.map +0 -1
- package/dist/src/utils/debug.js.map +0 -1
- package/dist/src/utils/env-parser.js.map +0 -1
- package/dist/src/utils/environment.d.ts +0 -4
- package/dist/src/utils/environment.js.map +0 -1
- package/dist/src/utils/errors.js.map +0 -1
- package/dist/src/utils/git-utils.js.map +0 -1
- package/dist/src/utils/logging.js.map +0 -1
- package/dist/src/utils/package-json.js.map +0 -1
- package/dist/src/utils/package-manager.js.map +0 -1
- package/dist/src/utils/redact.js.map +0 -1
- package/dist/src/utils/semver.js.map +0 -1
- package/dist/src/utils/string.js.map +0 -1
- package/dist/src/utils/telemetry-client.js.map +0 -1
- package/dist/src/utils/telemetry-types.js +0 -6
- package/dist/src/utils/telemetry-types.js.map +0 -1
- package/dist/src/utils/urls.js.map +0 -1
- package/dist/src/utils/vendor/is-unicorn-supported.js.map +0 -1
- package/dist/src/vanilla-js/vanilla-js-wizard-agent.d.ts +0 -2
- package/dist/src/vanilla-js/vanilla-js-wizard-agent.js.map +0 -1
- /package/dist/{src/commands → commands}/install-skill.d.ts +0 -0
- /package/dist/{src/commands → commands}/install-skill.js +0 -0
- /package/dist/{src/commands → commands}/install.d.ts +0 -0
- /package/dist/{src/commands → commands}/login.d.ts +0 -0
- /package/dist/{src/commands → commands}/logout.d.ts +0 -0
- /package/dist/{src/commands → commands}/logout.js +0 -0
- /package/dist/{src/dashboard → dashboard}/components/AnimatedLogo.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/components/AnimatedLogo.js +0 -0
- /package/dist/{src/dashboard → dashboard}/components/CompletionView.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/components/CompletionView.js +0 -0
- /package/dist/{src/dashboard → dashboard}/components/ConfirmPrompt.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/components/ConfirmPrompt.js +0 -0
- /package/dist/{src/dashboard → dashboard}/components/CredentialsForm.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/components/CredentialsForm.js +0 -0
- /package/dist/{src/dashboard → dashboard}/components/Dashboard.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/components/Dashboard.js +0 -0
- /package/dist/{src/dashboard → dashboard}/components/DashboardLayout.js +0 -0
- /package/dist/{src/dashboard → dashboard}/components/DiffPanel.js +0 -0
- /package/dist/{src/dashboard → dashboard}/components/InlinePrompt.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/components/InlinePrompt.js +0 -0
- /package/dist/{src/dashboard → dashboard}/components/OutputPanel.js +0 -0
- /package/dist/{src/dashboard → dashboard}/components/Panel.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/components/Panel.js +0 -0
- /package/dist/{src/dashboard → dashboard}/components/TextInput.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/components/TextInput.js +0 -0
- /package/dist/{src/dashboard → dashboard}/components/WelcomeArt.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/components/WelcomeArt.js +0 -0
- /package/dist/{src/dashboard → dashboard}/hooks/useAnimation.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/hooks/useAnimation.js +0 -0
- /package/dist/{src/dashboard → dashboard}/hooks/useKeyboard.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/hooks/useKeyboard.js +0 -0
- /package/dist/{src/dashboard → dashboard}/hooks/useTerminalSize.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/hooks/useTerminalSize.js +0 -0
- /package/dist/{src/dashboard → dashboard}/index.js +0 -0
- /package/dist/{src/dashboard → dashboard}/lib/diff-utils.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/lib/diff-utils.js +0 -0
- /package/dist/{src/dashboard → dashboard}/lib/logo-frames.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/lib/logo-frames.js +0 -0
- /package/dist/{src/dashboard → dashboard}/lib/welcome-art.d.ts +0 -0
- /package/dist/{src/dashboard → dashboard}/lib/welcome-art.js +0 -0
- /package/dist/{src/dashboard → dashboard}/types.js +0 -0
- /package/dist/{src/lib → lib}/adapters/dashboard-adapter.js +0 -0
- /package/dist/{src/lib → lib}/adapters/index.js +0 -0
- /package/dist/{src/lib → lib}/adapters/types.js +0 -0
- /package/dist/{src/lib → lib}/api.d.ts +0 -0
- /package/dist/{src/lib → lib}/api.js +0 -0
- /package/dist/{src/lib → lib}/config.js +0 -0
- /package/dist/{src/lib → lib}/credential-discovery.d.ts +0 -0
- /package/dist/{src/lib → lib}/credential-discovery.js +0 -0
- /package/dist/{src/lib → lib}/env-writer.d.ts +0 -0
- /package/dist/{src/lib → lib}/env-writer.js +0 -0
- /package/dist/{src/lib → lib}/helper-functions.d.ts +0 -0
- /package/dist/{src/lib → lib}/helper-functions.js +0 -0
- /package/dist/{src/lib → lib}/port-detection.d.ts +0 -0
- /package/dist/{src/lib → lib}/port-detection.js +0 -0
- /package/dist/{src/lib → lib}/post-install.d.ts +0 -0
- /package/dist/{src/lib → lib}/post-install.js +0 -0
- /package/dist/{src/lib → lib}/progress-tracker.d.ts +0 -0
- /package/dist/{src/lib → lib}/progress-tracker.js +0 -0
- /package/dist/{src/lib → lib}/safe-tools.d.ts +0 -0
- /package/dist/{src/lib → lib}/safe-tools.js +0 -0
- /package/dist/{src/lib → lib}/staging-api.d.ts +0 -0
- /package/dist/{src/lib → lib}/staging-api.js +0 -0
- /package/dist/{src/lib → lib}/token-refresh.d.ts +0 -0
- /package/dist/{src/lib → lib}/validation/build-validator.d.ts +0 -0
- /package/dist/{src/lib → lib}/validation/build-validator.js +0 -0
- /package/dist/{src/lib → lib}/validation/index.d.ts +0 -0
- /package/dist/{src/lib → lib}/validation/index.js +0 -0
- /package/dist/{src/lib → lib}/validation/types.d.ts +0 -0
- /package/dist/{src/lib → lib}/validation/types.js +0 -0
- /package/dist/{src/lib → lib}/validation/validator.d.ts +0 -0
- /package/dist/{src/lib → lib}/validation/validator.js +0 -0
- /package/dist/{src/lib → lib}/workos-management.d.ts +0 -0
- /package/dist/{src/nextjs → nextjs}/utils.js +0 -0
- /package/dist/{src/react-router → react-router}/utils.js +0 -0
- /package/dist/{src/steps → steps}/add-or-update-environment-variables.d.ts +0 -0
- /package/dist/{src/steps → steps}/index.d.ts +0 -0
- /package/dist/{src/steps → steps}/index.js +0 -0
- /package/dist/{src/steps → steps}/upload-environment-variables/EnvironmentProvider.js +0 -0
- /package/dist/{src/steps → steps}/upload-environment-variables/providers/vercel.js +0 -0
- /package/dist/{src/telemetry.d.ts → telemetry.d.ts} +0 -0
- /package/dist/{src/telemetry.js → telemetry.js} +0 -0
- /package/dist/{src/utils → utils}/analytics.d.ts +0 -0
- /package/dist/{src/utils → utils}/bash.d.ts +0 -0
- /package/dist/{src/utils → utils}/bash.js +0 -0
- /package/dist/{src/utils → utils}/clack.d.ts +0 -0
- /package/dist/{src/utils → utils}/clack.js +0 -0
- /package/dist/{src/utils → utils}/cli-symbols.d.ts +0 -0
- /package/dist/{src/utils → utils}/cli-symbols.js +0 -0
- /package/dist/{src/utils → utils}/debug.d.ts +0 -0
- /package/dist/{src/utils → utils}/env-parser.d.ts +0 -0
- /package/dist/{src/utils → utils}/env-parser.js +0 -0
- /package/dist/{src/utils → utils}/errors.d.ts +0 -0
- /package/dist/{src/utils → utils}/git-utils.d.ts +0 -0
- /package/dist/{src/utils → utils}/git-utils.js +0 -0
- /package/dist/{src/utils → utils}/logging.d.ts +0 -0
- /package/dist/{src/utils → utils}/logging.js +0 -0
- /package/dist/{src/utils → utils}/package-json.d.ts +0 -0
- /package/dist/{src/utils → utils}/package-json.js +0 -0
- /package/dist/{src/utils → utils}/package-manager.js +0 -0
- /package/dist/{src/utils → utils}/redact.d.ts +0 -0
- /package/dist/{src/utils → utils}/redact.js +0 -0
- /package/dist/{src/utils → utils}/semver.d.ts +0 -0
- /package/dist/{src/utils → utils}/semver.js +0 -0
- /package/dist/{src/utils → utils}/string.d.ts +0 -0
- /package/dist/{src/utils → utils}/string.js +0 -0
- /package/dist/{src/utils → utils}/telemetry-client.d.ts +0 -0
- /package/dist/{src/utils → utils}/types.js +0 -0
- /package/dist/{src/utils → utils}/urls.d.ts +0 -0
- /package/dist/{src/utils → utils}/urls.js +0 -0
- /package/dist/{src/utils → utils}/vendor/is-unicorn-supported.d.ts +0 -0
- /package/dist/{src/utils → utils}/vendor/is-unicorn-supported.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiffPanel.js","sourceRoot":"","sources":["../../../src/dashboard/components/DiffPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect, useMemo, useRef } from 'react';\nimport { Box, Text, useStdout, useInput } from 'ink';\nimport type { InstallerEventEmitter } from '../../lib/events.js';\nimport { WelcomeArt } from './WelcomeArt.js';\nimport {\n computeDiff,\n filterWithContext,\n formatDiffLine,\n getLanguage,\n tokenize,\n type FileDiff,\n type Token,\n type TokenType,\n} from '../lib/diff-utils.js';\n\ninterface DiffPanelProps {\n emitter: InstallerEventEmitter;\n focused?: boolean;\n height?: number;\n}\n\n// Color mapping for syntax tokens\nconst TOKEN_COLORS: Record<TokenType, string | undefined> = {\n keyword: 'magenta',\n string: 'yellow',\n comment: 'gray',\n number: 'cyan',\n function: 'blue',\n type: 'green',\n operator: 'white',\n punctuation: 'gray',\n plain: undefined,\n};\n\n// Render a line with syntax highlighting\nfunction HighlightedLine({\n content,\n language,\n prefix,\n dimmed,\n}: {\n content: string;\n language: string;\n prefix: string;\n dimmed?: boolean;\n}): React.ReactElement {\n const tokens = tokenize(content, language);\n\n return (\n <Text dimColor={dimmed}>\n {prefix}\n {tokens.map((token, i) => (\n <Text key={i} color={dimmed ? undefined : TOKEN_COLORS[token.type]}>\n {token.value}\n </Text>\n ))}\n </Text>\n );\n}\n\nexport function DiffPanel({ emitter, focused = true, height }: DiffPanelProps): React.ReactElement {\n const [diffs, setDiffs] = useState<FileDiff[]>([]);\n const [scrollOffset, setScrollOffset] = useState(0);\n const lastKeyRef = useRef<string>('');\n const { stdout } = useStdout();\n // Use provided height or fall back to calculated height\n const visibleLines = height ?? Math.floor((stdout?.rows || 24) * 0.55) - 4;\n\n useEffect(() => {\n const handleWrite = ({ path, content }: { path: string; content: string }) => {\n const diff = computeDiff(path, null, content);\n setDiffs((prev) => [diff, ...prev].slice(0, 10));\n setScrollOffset(0);\n };\n\n const handleEdit = ({ path, oldContent, newContent }: { path: string; oldContent: string; newContent: string }) => {\n const diff = computeDiff(path, oldContent, newContent);\n setDiffs((prev) => [diff, ...prev].slice(0, 10));\n setScrollOffset(0);\n };\n\n emitter.on('file:write', handleWrite);\n emitter.on('file:edit', handleEdit);\n\n return () => {\n emitter.off('file:write', handleWrite);\n emitter.off('file:edit', handleEdit);\n };\n }, [emitter]);\n\n // Flatten all diffs for display with language info\n const allLines = useMemo(() => {\n const lines: Array<{\n type: 'header' | 'add' | 'remove' | 'unchanged';\n content: string;\n language: string;\n }> = [];\n\n for (const diff of diffs) {\n const language = getLanguage(diff.path);\n lines.push({\n type: 'header',\n content: `── ${diff.path} ${diff.isNew ? '(new file)' : '(modified)'} ──`,\n language: 'plain',\n });\n\n const filteredChanges = filterWithContext(diff.changes, 3);\n for (const change of filteredChanges) {\n lines.push({\n type: change.type,\n content: formatDiffLine(change),\n language,\n });\n }\n\n lines.push({ type: 'unchanged', content: '', language: 'plain' });\n }\n\n return lines;\n }, [diffs]);\n\n // Vim-style keyboard navigation (only when focused)\n useInput((input, key) => {\n if (!focused || diffs.length === 0) return;\n\n const maxOffset = Math.max(0, allLines.length - visibleLines);\n const halfPage = Math.floor(visibleLines / 2);\n\n // j/k or arrow keys for line-by-line\n if (input === 'j' || key.downArrow) {\n setScrollOffset((prev) => Math.min(maxOffset, prev + 1));\n } else if (input === 'k' || key.upArrow) {\n setScrollOffset((prev) => Math.max(0, prev - 1));\n }\n // Ctrl-d / Ctrl-u for half-page\n else if (key.ctrl && input === 'd') {\n setScrollOffset((prev) => Math.min(maxOffset, prev + halfPage));\n } else if (key.ctrl && input === 'u') {\n setScrollOffset((prev) => Math.max(0, prev - halfPage));\n }\n // G for bottom, gg for top\n else if (input === 'G') {\n setScrollOffset(maxOffset);\n } else if (input === 'g') {\n if (lastKeyRef.current === 'g') {\n setScrollOffset(0);\n lastKeyRef.current = '';\n } else {\n lastKeyRef.current = 'g';\n setTimeout(() => {\n lastKeyRef.current = '';\n }, 500);\n }\n }\n });\n\n // Show welcome art if no diffs yet\n if (diffs.length === 0) {\n return <WelcomeArt />;\n }\n\n // Reserve 1 line for scroll indicator if needed\n const hasScroll = allLines.length > visibleLines - 1;\n const contentLines = hasScroll ? visibleLines - 1 : visibleLines;\n const displayLines = allLines.slice(scrollOffset, scrollOffset + contentLines);\n const maxOffset = Math.max(0, allLines.length - contentLines);\n\n // Calculate scrollbar position\n const scrollbarHeight = Math.max(1, Math.floor((contentLines / allLines.length) * contentLines));\n const scrollbarPosition =\n maxOffset > 0 ? Math.floor((scrollOffset / maxOffset) * (contentLines - scrollbarHeight)) : 0;\n\n return (\n <Box flexDirection=\"row\" flexGrow={1}>\n <Box flexDirection=\"column\" flexGrow={1}>\n {displayLines.map((line, i) => {\n if (line.type === 'header') {\n return (\n <Text key={i} color=\"cyan\" bold>\n {line.content}\n </Text>\n );\n }\n\n // Extract the prefix (+ - or space) and the actual content\n const prefix = line.content.slice(0, 2);\n const codeContent = line.content.slice(2);\n\n if (line.type === 'add') {\n return (\n <Box key={i}>\n <Text color=\"green\" bold>\n {prefix}\n </Text>\n <HighlightedLine content={codeContent} language={line.language} prefix=\"\" dimmed={false} />\n </Box>\n );\n }\n\n if (line.type === 'remove') {\n return (\n <Box key={i}>\n <Text color=\"red\" bold>\n {prefix}\n </Text>\n <HighlightedLine content={codeContent} language={line.language} prefix=\"\" dimmed={false} />\n </Box>\n );\n }\n\n // Unchanged lines - dimmed with syntax highlighting\n return (\n <HighlightedLine key={i} content={codeContent} language={line.language} prefix={prefix} dimmed={true} />\n );\n })}\n {hasScroll && (\n <Text dimColor>\n [{scrollOffset + 1}-{Math.min(scrollOffset + contentLines, allLines.length)}/{allLines.length}]\n </Text>\n )}\n </Box>\n {hasScroll && (\n <Box flexDirection=\"column\" width={1}>\n {Array.from({ length: contentLines }).map((_, i) => (\n <Text key={i} color={i >= scrollbarPosition && i < scrollbarPosition + scrollbarHeight ? 'cyan' : 'gray'}>\n {i >= scrollbarPosition && i < scrollbarPosition + scrollbarHeight ? '█' : '░'}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlinePrompt.js","sourceRoot":"","sources":["../../../src/dashboard/components/InlinePrompt.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAQ1C,MAAM,UAAU,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAqB;IAC5E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEtD,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACzE,CAAC;aAAM,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YACzB,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACtB,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACpC,MAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,QAAQ,mBACpB,OAAO,IACL,EACP,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,YACtC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAC1B,MAAC,IAAI,IAAS,KAAK,EAAE,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,aAC1D,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EACjC,MAAM,KAFE,CAAC,CAGL,CACR,CAAC,GACE,EACN,KAAC,IAAI,IAAC,QAAQ,iEAAwC,IAClD,CACP,CAAC;AACJ,CAAC","sourcesContent":["import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\ninterface InlinePromptProps {\n message: string;\n options: string[];\n onSelect: (value: string) => void;\n}\n\nexport function InlinePrompt({ message, options, onSelect }: InlinePromptProps): React.ReactElement {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : options.length - 1));\n } else if (key.downArrow) {\n setSelectedIndex((prev) => (prev < options.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n onSelect(options[selectedIndex]);\n }\n });\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Text bold color=\"yellow\">\n ? {message}\n </Text>\n <Box flexDirection=\"column\" marginLeft={2}>\n {options.map((option, i) => (\n <Text key={i} color={i === selectedIndex ? 'cyan' : undefined}>\n {i === selectedIndex ? '› ' : ' '}\n {option}\n </Text>\n ))}\n </Box>\n <Text dimColor>↑/↓ to navigate, Enter to select</Text>\n </Box>\n );\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import type {
|
|
2
|
+
import type { InstallerEventEmitter } from '../../lib/events.js';
|
|
3
3
|
interface OutputPanelProps {
|
|
4
|
-
emitter:
|
|
4
|
+
emitter: InstallerEventEmitter;
|
|
5
5
|
maxLines?: number;
|
|
6
6
|
focused?: boolean;
|
|
7
7
|
height?: number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutputPanel.js","sourceRoot":"","sources":["../../../src/dashboard/components/OutputPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect, useRef } from 'react';\nimport { Box, Text, useStdout, useInput } from 'ink';\nimport type { InstallerEventEmitter } from '../../lib/events.js';\nimport { InlinePrompt } from './InlinePrompt.js';\n\ninterface OutputPanelProps {\n emitter: InstallerEventEmitter;\n maxLines?: number;\n focused?: boolean;\n height?: number;\n}\n\ninterface OutputLine {\n text: string;\n isError?: boolean;\n isStatus?: boolean;\n}\n\ninterface ActivePrompt {\n id: string;\n message: string;\n options: string[];\n}\n\nexport function OutputPanel({\n emitter,\n maxLines = 100,\n focused = false,\n height,\n}: OutputPanelProps): React.ReactElement {\n const [lines, setLines] = useState<OutputLine[]>([]);\n const [scrollOffset, setScrollOffset] = useState<number | null>(null); // null = auto-scroll to bottom\n const [activePrompt, setActivePrompt] = useState<ActivePrompt | null>(null);\n const lastKeyRef = useRef<string>('');\n const { stdout } = useStdout();\n // Use provided height or fall back to calculated height\n const visibleLines = height ?? Math.floor((stdout?.rows || 24) * 0.35) - 4;\n\n useEffect(() => {\n const handleOutput = ({ text, isError }: { text: string; isError?: boolean }) => {\n const newLines = text.split('\\n').map((line) => ({\n text: line,\n isError,\n isStatus: line.includes('[STATUS]'),\n }));\n\n setLines((prev) => [...prev, ...newLines].slice(-maxLines));\n // Auto-scroll to bottom when new content arrives (if not manually scrolled)\n setScrollOffset(null);\n };\n\n const handleStatus = ({ message }: { message: string }) => {\n setLines((prev) => [...prev, { text: `[STATUS] ${message}`, isStatus: true }].slice(-maxLines));\n setScrollOffset(null);\n };\n\n const handlePromptRequest = ({ id, message, options }: { id: string; message: string; options?: string[] }) => {\n if (options && options.length > 0) {\n setActivePrompt({ id, message, options });\n }\n };\n\n emitter.on('output', handleOutput);\n emitter.on('status', handleStatus);\n emitter.on('prompt:request', handlePromptRequest);\n\n return () => {\n emitter.off('output', handleOutput);\n emitter.off('status', handleStatus);\n emitter.off('prompt:request', handlePromptRequest);\n };\n }, [emitter, maxLines]);\n\n // Vim-style keyboard navigation (only when focused)\n useInput((input, key) => {\n if (!focused) return;\n\n const maxOffset = Math.max(0, lines.length - visibleLines);\n const halfPage = Math.floor(visibleLines / 2);\n const currentOffset = scrollOffset ?? maxOffset;\n\n // j/k or arrow keys for line-by-line\n if (input === 'j' || key.downArrow) {\n setScrollOffset(Math.min(maxOffset, currentOffset + 1));\n } else if (input === 'k' || key.upArrow) {\n setScrollOffset(Math.max(0, currentOffset - 1));\n }\n // Ctrl-d / Ctrl-u for half-page\n else if (key.ctrl && input === 'd') {\n setScrollOffset(Math.min(maxOffset, currentOffset + halfPage));\n } else if (key.ctrl && input === 'u') {\n setScrollOffset(Math.max(0, currentOffset - halfPage));\n }\n // G for bottom (and resume auto-scroll), gg for top\n else if (input === 'G') {\n setScrollOffset(null); // Resume auto-scroll\n } else if (input === 'g') {\n if (lastKeyRef.current === 'g') {\n setScrollOffset(0);\n lastKeyRef.current = '';\n } else {\n lastKeyRef.current = 'g';\n setTimeout(() => {\n lastKeyRef.current = '';\n }, 500);\n }\n }\n });\n\n const handlePromptSelect = (value: string) => {\n if (activePrompt) {\n emitter.emit('prompt:response', { id: activePrompt.id, value });\n setLines((prev) =>\n [...prev, { text: `? ${activePrompt.message}`, isStatus: true }, { text: ` → ${value}` }].slice(-maxLines),\n );\n setActivePrompt(null);\n }\n };\n\n // Calculate display range\n const promptHeight = activePrompt ? 5 + activePrompt.options.length : 0;\n // Reserve 1 line for scroll indicator if needed\n const hasScroll = lines.length > visibleLines - promptHeight - 1;\n const contentLines = hasScroll ? visibleLines - promptHeight - 1 : visibleLines - promptHeight;\n const maxOffset = Math.max(0, lines.length - contentLines);\n const effectiveOffset = scrollOffset ?? maxOffset;\n const displayLines = lines.slice(Math.max(0, effectiveOffset), Math.max(0, effectiveOffset) + contentLines);\n\n // Calculate scrollbar position\n const scrollbarHeight = lines.length > 0 ? Math.max(1, Math.floor((contentLines / lines.length) * contentLines)) : 1;\n const scrollbarPosition =\n maxOffset > 0 ? Math.floor((effectiveOffset / maxOffset) * (contentLines - scrollbarHeight)) : 0;\n\n return (\n <Box flexDirection=\"row\" flexGrow={1}>\n <Box flexDirection=\"column\" flexGrow={1}>\n {displayLines.length === 0 && !activePrompt ? (\n <Text dimColor>Waiting for output...</Text>\n ) : (\n displayLines.map((line, i) => (\n <Text key={i} color={line.isError ? 'red' : line.isStatus ? 'yellow' : undefined}>\n {line.text}\n </Text>\n ))\n )}\n\n {activePrompt && (\n <InlinePrompt message={activePrompt.message} options={activePrompt.options} onSelect={handlePromptSelect} />\n )}\n\n {hasScroll && (\n <Text dimColor>\n [{effectiveOffset + 1}-{Math.min(effectiveOffset + contentLines, lines.length)}/{lines.length}]\n {scrollOffset === null ? ' (following)' : ''}\n </Text>\n )}\n </Box>\n {hasScroll && (\n <Box flexDirection=\"column\" width={1}>\n {Array.from({ length: contentLines }).map((_, i) => (\n <Text key={i} color={i >= scrollbarPosition && i < scrollbarPosition + scrollbarHeight ? 'cyan' : 'gray'}>\n {i >= scrollbarPosition && i < scrollbarPosition + scrollbarHeight ? '█' : '░'}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Panel.js","sourceRoot":"","sources":["../../../src/dashboard/components/Panel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAYhC,MAAM,UAAU,KAAK,CAAC,EACpB,KAAK,EACL,QAAQ,EACR,WAAW,GAAG,MAAM,EACpB,QAAQ,EACR,KAAK,EACL,MAAM,GACK;IACX,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,aAEb,KAAK,IAAI,CACR,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,YAChB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,YACpB,KAAK,GACD,GACH,CACP,EACD,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,YACjD,QAAQ,GACL,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["import React from 'react';\nimport { Box, Text } from 'ink';\n\ninterface PanelProps {\n title?: string;\n children: React.ReactNode;\n borderColor?: string;\n flexGrow?: number;\n width?: string | number;\n height?: string | number;\n contentHeight?: number;\n}\n\nexport function Panel({\n title,\n children,\n borderColor = 'gray',\n flexGrow,\n width,\n height,\n}: PanelProps): React.ReactElement {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={borderColor}\n flexGrow={flexGrow}\n width={width}\n height={height}\n >\n {title && (\n <Box marginLeft={1}>\n <Text bold color=\"cyan\">\n {title}\n </Text>\n </Box>\n )}\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1}>\n {children}\n </Box>\n </Box>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextInput.js","sourceRoot":"","sources":["../../../src/dashboard/components/TextInput.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect, useRef } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\ninterface TextInputProps {\n label: string;\n placeholder?: string;\n mask?: boolean;\n value: string;\n onChange: (value: string) => void;\n onSubmit: () => void;\n focused?: boolean;\n error?: string;\n}\n\nexport function TextInput({\n label,\n placeholder = '',\n mask = false,\n value,\n onChange,\n onSubmit,\n focused = true,\n error,\n}: TextInputProps): React.ReactElement {\n const [cursorVisible, setCursorVisible] = useState(true);\n // Use ref for synchronous value tracking (fixes snippet tool race conditions)\n const valueRef = useRef(value);\n valueRef.current = value;\n\n // Blink cursor\n useEffect(() => {\n if (!focused) return;\n const interval = setInterval(() => {\n setCursorVisible((v) => !v);\n }, 500);\n return () => clearInterval(interval);\n }, [focused]);\n\n useInput(\n (input, key) => {\n if (!focused) return;\n\n if (key.return) {\n onSubmit();\n } else if (key.ctrl && input === 'u') {\n // Ctrl+U: clear entire line\n valueRef.current = '';\n onChange('');\n } else if (key.backspace || key.delete) {\n // Use ref for current value to avoid stale closure\n const newValue = valueRef.current.slice(0, -1);\n valueRef.current = newValue;\n onChange(newValue);\n } else if (!key.ctrl && !key.meta && input && !key.upArrow && !key.downArrow) {\n // Handle snippet tool expansion: input may contain backspaces (\\x7f or \\x08)\n // followed by the replacement text\n let newValue = valueRef.current;\n\n for (const char of input) {\n if (char === '\\x7f' || char === '\\x08') {\n // Backspace - delete last character\n newValue = newValue.slice(0, -1);\n } else if (char.charCodeAt(0) >= 32) {\n // Only add printable characters\n newValue += char;\n }\n }\n\n valueRef.current = newValue;\n onChange(newValue);\n }\n },\n { isActive: focused },\n );\n\n const displayValue = mask ? '*'.repeat(value.length) : value;\n const showPlaceholder = value.length === 0;\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\" bold>\n {label}:{' '}\n </Text>\n <Text dimColor={showPlaceholder}>{showPlaceholder ? placeholder : displayValue}</Text>\n {focused && cursorVisible && <Text color=\"cyan\">|</Text>}\n </Box>\n {error && (\n <Text color=\"red\" dimColor>\n {error}\n </Text>\n )}\n </Box>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WelcomeArt.js","sourceRoot":"","sources":["../../../src/dashboard/components/WelcomeArt.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE9B,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,cAAc,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,YACjF,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACxB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,KAAC,IAAI,IAAS,KAAK,EAAC,MAAM,YACvB,IAAI,IADI,CAAC,CAEL,CACR,CAAC,GACE,GACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["import React from 'react';\nimport { Box, Text } from 'ink';\nimport { getWelcomeArt } from '../lib/welcome-art.js';\n\nexport function WelcomeArt(): React.ReactElement {\n const art = getWelcomeArt();\n const lines = art.split('\\n');\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" justifyContent=\"center\" flexGrow={1}>\n <Box flexDirection=\"column\">\n {lines.map((line, i) => (\n <Text key={i} color=\"cyan\">\n {line}\n </Text>\n ))}\n </Box>\n </Box>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAnimation.js","sourceRoot":"","sources":["../../../src/dashboard/hooks/useAnimation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAQpD,MAAM,UAAU,YAAY,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,KAAK,EAAuB;IAC5F,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBACnC,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7B,CAAC;YACD,OAAO;QACT,CAAC;QAED,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QACnD,CAAC,EAAE,YAAY,CAAC,CAAC;QAEjB,OAAO,GAAG,EAAE;YACV,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAEvC,OAAO,UAAU,CAAC;AACpB,CAAC","sourcesContent":["import { useState, useEffect, useRef } from 'react';\n\ninterface UseAnimationOptions {\n frameCount: number;\n frameDelayMs: number;\n paused?: boolean;\n}\n\nexport function useAnimation({ frameCount, frameDelayMs, paused = false }: UseAnimationOptions): number {\n const [frameIndex, setFrameIndex] = useState(0);\n const intervalRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n if (paused) {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n return;\n }\n\n intervalRef.current = setInterval(() => {\n setFrameIndex((prev) => (prev + 1) % frameCount);\n }, frameDelayMs);\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n };\n }, [frameCount, frameDelayMs, paused]);\n\n return frameIndex;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useKeyboard.js","sourceRoot":"","sources":["../../../src/dashboard/hooks/useKeyboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAS/B,MAAM,UAAU,mBAAmB,CAAC,EAClC,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,eAAe,GACE;IACjB,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YACzB,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,YAAY,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;QACzE,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACtB,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACxB,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,YAAY,EAAE,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC;QACpF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { useInput } from 'ink';\n\ninterface UseScrollOptions {\n totalItems: number;\n visibleItems: number;\n scrollOffset: number;\n setScrollOffset: (offset: number) => void;\n}\n\nexport function useScrollNavigation({\n totalItems,\n visibleItems,\n scrollOffset,\n setScrollOffset,\n}: UseScrollOptions): void {\n useInput((input, key) => {\n if (key.upArrow) {\n setScrollOffset(Math.max(0, scrollOffset - 1));\n } else if (key.downArrow) {\n setScrollOffset(Math.min(totalItems - visibleItems, scrollOffset + 1));\n } else if (key.pageUp) {\n setScrollOffset(Math.max(0, scrollOffset - visibleItems));\n } else if (key.pageDown) {\n setScrollOffset(Math.min(totalItems - visibleItems, scrollOffset + visibleItems));\n }\n });\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTerminalSize.js","sourceRoot":"","sources":["../../../src/dashboard/hooks/useTerminalSize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAO5C,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAe;QAC7C,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;QACrC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;KAChC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,OAAO,CAAC;gBACN,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;gBACrC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;aAChC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC7C,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC9B,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,CAAC","sourcesContent":["import { useState, useEffect } from 'react';\n\ninterface TerminalSize {\n columns: number;\n rows: number;\n}\n\nexport function useTerminalSize(): TerminalSize {\n const [size, setSize] = useState<TerminalSize>({\n columns: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n });\n\n useEffect(() => {\n const handleResize = () => {\n setSize({\n columns: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n });\n };\n\n process.stdout.on('resize', handleResize);\n return () => {\n process.stdout.off('resize', handleResize);\n };\n }, []);\n\n return size;\n}\n\nexport const MIN_COLUMNS = 80;\nexport const MIN_ROWS = 24;\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { InstallerEventEmitter } from '../lib/events.js';
|
|
2
2
|
export interface DashboardOptions {
|
|
3
|
-
emitter:
|
|
3
|
+
emitter: InstallerEventEmitter;
|
|
4
4
|
}
|
|
5
5
|
export declare function startDashboard(options: DashboardOptions): Promise<void>;
|
|
6
6
|
export declare function stopDashboard(): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dashboard/index.ts"],"names":[],"mappings":"AAMA,IAAI,OAAO,GAAwB,IAAI,CAAC;AACxC,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,mDAAmD;AACnD,SAAS,eAAe;IACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,yBAAyB;IAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB;IACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,+BAA+B;IAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;AACnD,CAAC;AAED,+BAA+B;AAC/B,SAAS,cAAc;IACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;IACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,wBAAwB;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAyB;IAC5D,IAAI,SAAS;QAAE,OAAO,CAAC,gCAAgC;IACvD,SAAS,GAAG,IAAI,CAAC;IAEjB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IAEhE,eAAe,EAAE,CAAC;IAElB,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE;QAC9E,WAAW,EAAE,KAAK;KACnB,CAAC,CAAC;IACH,OAAO,GAAG,GAAG,EAAE;QACb,QAAQ,CAAC,OAAO,EAAE,CAAC;QACnB,cAAc,EAAE,CAAC;QACjB,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,EAAE,EAAE,CAAC;IACZ,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC","sourcesContent":["import type { InstallerEventEmitter } from '../lib/events.js';\n\nexport interface DashboardOptions {\n emitter: InstallerEventEmitter;\n}\n\nlet cleanup: (() => void) | null = null;\nlet isRunning = false;\n\n// Enter alternate screen buffer for fullscreen TUI\nfunction enterFullscreen(): void {\n process.stdout.write('\\x1b[?1049h'); // Enter alternate screen\n process.stdout.write('\\x1b[2J'); // Clear entire screen\n process.stdout.write('\\x1b[H'); // Move cursor to home position\n process.stdout.write('\\x1b[?25l'); // Hide cursor\n}\n\n// Exit alternate screen buffer\nfunction exitFullscreen(): void {\n process.stdout.write('\\x1b[?25h'); // Show cursor\n process.stdout.write('\\x1b[?1049l'); // Exit alternate screen\n}\n\nexport async function startDashboard(options: DashboardOptions): Promise<void> {\n if (isRunning) return; // Prevent double initialization\n isRunning = true;\n\n const { render } = await import('ink');\n const { createElement } = await import('react');\n const { Dashboard } = await import('./components/Dashboard.js');\n\n enterFullscreen();\n\n const instance = render(createElement(Dashboard, { emitter: options.emitter }), {\n exitOnCtrlC: false,\n });\n cleanup = () => {\n instance.unmount();\n exitFullscreen();\n isRunning = false;\n };\n}\n\nexport async function stopDashboard(): Promise<void> {\n cleanup?.();\n cleanup = null;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-utils.js","sourceRoot":"","sources":["../../../src/dashboard/lib/diff-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { diffLines } from 'diff';\n\nexport interface FileDiff {\n path: string;\n isNew: boolean;\n changes: DiffLine[];\n timestamp: number;\n}\n\nexport interface DiffLine {\n type: 'add' | 'remove' | 'unchanged';\n content: string;\n lineNumber?: number;\n}\n\n// Token types for syntax highlighting\nexport type TokenType =\n | 'keyword'\n | 'string'\n | 'comment'\n | 'number'\n | 'function'\n | 'type'\n | 'operator'\n | 'punctuation'\n | 'plain';\n\nexport interface Token {\n type: TokenType;\n value: string;\n}\n\n// Detect file language from path\nexport function getLanguage(path: string): string {\n const ext = path.split('.').pop()?.toLowerCase() || '';\n const langMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n json: 'json',\n css: 'css',\n scss: 'css',\n html: 'html',\n md: 'markdown',\n env: 'env',\n };\n return langMap[ext] || 'plain';\n}\n\n// Keywords for JS/TS\nconst JS_KEYWORDS = new Set([\n 'async',\n 'await',\n 'break',\n 'case',\n 'catch',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'enum',\n 'export',\n 'extends',\n 'false',\n 'finally',\n 'for',\n 'from',\n 'function',\n 'if',\n 'import',\n 'in',\n 'instanceof',\n 'interface',\n 'let',\n 'new',\n 'null',\n 'of',\n 'private',\n 'protected',\n 'public',\n 'readonly',\n 'return',\n 'static',\n 'super',\n 'switch',\n 'this',\n 'throw',\n 'true',\n 'try',\n 'type',\n 'typeof',\n 'undefined',\n 'var',\n 'void',\n 'while',\n 'with',\n 'yield',\n]);\n\n// Tokenize a line of code for syntax highlighting\nexport function tokenize(line: string, language: string): Token[] {\n if (language === 'plain' || language === 'env') {\n // For .env files, highlight key=value\n if (language === 'env') {\n const match = line.match(/^(\\w+)(=)(.*)$/);\n if (match) {\n return [\n { type: 'type', value: match[1] },\n { type: 'operator', value: match[2] },\n { type: 'string', value: match[3] },\n ];\n }\n }\n return [{ type: 'plain', value: line }];\n }\n\n const tokens: Token[] = [];\n let remaining = line;\n\n while (remaining.length > 0) {\n // Comments\n const commentMatch = remaining.match(/^(\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\/)/);\n if (commentMatch) {\n tokens.push({ type: 'comment', value: commentMatch[1] });\n remaining = remaining.slice(commentMatch[1].length);\n continue;\n }\n\n // Strings (single, double, template)\n const stringMatch = remaining.match(/^(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|`(?:[^`\\\\]|\\\\.)*`)/);\n if (stringMatch) {\n tokens.push({ type: 'string', value: stringMatch[1] });\n remaining = remaining.slice(stringMatch[1].length);\n continue;\n }\n\n // JSX/HTML tags\n const tagMatch = remaining.match(/^(<\\/?[A-Za-z][A-Za-z0-9]*)/);\n if (tagMatch) {\n tokens.push({ type: 'keyword', value: tagMatch[1] });\n remaining = remaining.slice(tagMatch[1].length);\n continue;\n }\n\n // Numbers\n const numberMatch = remaining.match(/^(\\d+\\.?\\d*)/);\n if (numberMatch) {\n tokens.push({ type: 'number', value: numberMatch[1] });\n remaining = remaining.slice(numberMatch[1].length);\n continue;\n }\n\n // Identifiers and keywords\n const identMatch = remaining.match(/^([a-zA-Z_$][a-zA-Z0-9_$]*)/);\n if (identMatch) {\n const word = identMatch[1];\n if (JS_KEYWORDS.has(word)) {\n tokens.push({ type: 'keyword', value: word });\n } else if (word[0] === word[0].toUpperCase() && word !== word.toUpperCase()) {\n // PascalCase = likely a type or component\n tokens.push({ type: 'type', value: word });\n } else if (remaining.slice(word.length).match(/^\\s*[(<]/)) {\n // Followed by ( or < = function call\n tokens.push({ type: 'function', value: word });\n } else {\n tokens.push({ type: 'plain', value: word });\n }\n remaining = remaining.slice(word.length);\n continue;\n }\n\n // Operators\n const opMatch = remaining.match(/^(=>|===|!==|==|!=|<=|>=|&&|\\|\\||[+\\-*/%=<>!&|^~?:])/);\n if (opMatch) {\n tokens.push({ type: 'operator', value: opMatch[1] });\n remaining = remaining.slice(opMatch[1].length);\n continue;\n }\n\n // Punctuation\n const punctMatch = remaining.match(/^([{}[\\]();,.])/);\n if (punctMatch) {\n tokens.push({ type: 'punctuation', value: punctMatch[1] });\n remaining = remaining.slice(1);\n continue;\n }\n\n // Whitespace and other characters\n const wsMatch = remaining.match(/^(\\s+)/);\n if (wsMatch) {\n tokens.push({ type: 'plain', value: wsMatch[1] });\n remaining = remaining.slice(wsMatch[1].length);\n continue;\n }\n\n // Single character fallback\n tokens.push({ type: 'plain', value: remaining[0] });\n remaining = remaining.slice(1);\n }\n\n return tokens;\n}\n\nexport function computeDiff(path: string, oldContent: string | null, newContent: string): FileDiff {\n const isNew = oldContent === null || oldContent === '';\n\n if (isNew) {\n // New file - all lines are additions\n const lines = newContent.split('\\n');\n return {\n path,\n isNew: true,\n changes: lines.map((content, i) => ({\n type: 'add' as const,\n content,\n lineNumber: i + 1,\n })),\n timestamp: Date.now(),\n };\n }\n\n // Compute unified diff\n const changes = diffLines(oldContent, newContent);\n const resultLines: DiffLine[] = [];\n let lineNumber = 1;\n\n for (const change of changes) {\n const lines = change.value.split('\\n').filter(\n (l, i, arr) =>\n // Filter out empty last line from split\n i < arr.length - 1 || l !== '',\n );\n\n for (const line of lines) {\n if (change.added) {\n resultLines.push({\n type: 'add',\n content: line,\n lineNumber: lineNumber++,\n });\n } else if (change.removed) {\n resultLines.push({ type: 'remove', content: line });\n } else {\n resultLines.push({\n type: 'unchanged',\n content: line,\n lineNumber: lineNumber++,\n });\n }\n }\n }\n\n // Truncate very large diffs\n const MAX_LINES = 500;\n if (resultLines.length > MAX_LINES) {\n return {\n path,\n isNew: false,\n changes: [\n ...resultLines.slice(0, MAX_LINES),\n {\n type: 'unchanged' as const,\n content: `... (${resultLines.length - MAX_LINES} more lines)`,\n },\n ],\n timestamp: Date.now(),\n };\n }\n\n return {\n path,\n isNew: false,\n changes: resultLines,\n timestamp: Date.now(),\n };\n}\n\n// Helper: filter diff lines to show only changes with context\nexport function filterWithContext(changes: DiffLine[], contextLines: number): DiffLine[] {\n const result: DiffLine[] = [];\n const indices = new Set<number>();\n\n // Mark indices of changed lines and their context\n changes.forEach((change, i) => {\n if (change.type === 'add' || change.type === 'remove') {\n for (let j = Math.max(0, i - contextLines); j <= Math.min(changes.length - 1, i + contextLines); j++) {\n indices.add(j);\n }\n }\n });\n\n // Build filtered result\n let lastIncluded = -2;\n for (let i = 0; i < changes.length; i++) {\n if (indices.has(i)) {\n if (lastIncluded < i - 1 && lastIncluded >= 0) {\n result.push({ type: 'unchanged', content: '...' });\n }\n result.push(changes[i]);\n lastIncluded = i;\n }\n }\n\n return result;\n}\n\n// Helper: format diff line with prefix\nexport function formatDiffLine(change: DiffLine): string {\n switch (change.type) {\n case 'add':\n return `+ ${change.content}`;\n case 'remove':\n return `- ${change.content}`;\n default:\n return ` ${change.content}`;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logo-frames.js","sourceRoot":"","sources":["../../../src/dashboard/lib/logo-frames.ts"],"names":[],"mappings":"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","sourcesContent":["// Scaled-down WorkOS logo frames for animation\n// Original is 20 lines tall; this is ~10 lines for panel fit\n\nconst LOGO_SMALL = [\n ' *+++++++*++++* ',\n ' *++++++++*++++++ ',\n ' *+++++* *+++++* ',\n ' *+++++* *+++++* ',\n ' *++++* *++++* ',\n ' *+++++* *+++++* ',\n ' *+++++* *+++++* ',\n ' *++++++**++++++* ',\n ' *++++*++*++++* ',\n];\n\n// Purple gradient colors (256 color mode)\nexport const COLORS = {\n brightest: '38;5;225', // light lavender\n bright: '38;5;183', // lavender\n medium: '38;5;141', // medium purple\n dark: '38;5;135', // purple\n darker: '38;5;93', // deep purple\n darkest: '38;5;54', // dark purple\n};\n\nexport type AnimationMode = 'spin' | 'pulse';\n\nexport interface LogoFrame {\n lines: string[];\n color: string;\n}\n\n// Pre-generate frames for spin animation\nexport function generateSpinFrames(): LogoFrame[] {\n const NUM_FRAMES = 32;\n const frames: LogoFrame[] = [];\n\n for (let f = 0; f < NUM_FRAMES; f++) {\n const angle = (f / NUM_FRAMES) * 2 * Math.PI;\n const cosA = Math.cos(angle);\n const absCos = Math.abs(cosA);\n\n // Color based on facing angle\n let color: string;\n if (absCos > 0.9) color = COLORS.brightest;\n else if (absCos > 0.7) color = COLORS.bright;\n else if (absCos > 0.5) color = COLORS.medium;\n else if (absCos > 0.3) color = COLORS.dark;\n else if (absCos > 0.15) color = COLORS.darker;\n else color = COLORS.darkest;\n\n // Project characters\n const projectedLines = LOGO_SMALL.map((line) => {\n const centerX = line.length / 2;\n const outChars = new Array(line.length).fill(' ');\n\n for (let col = 0; col < line.length; col++) {\n const ch = line[col];\n if (ch === ' ') continue;\n\n const x = col - centerX;\n const newX = x * cosA;\n const screenX = Math.round(centerX + newX);\n\n if (screenX >= 0 && screenX < line.length) {\n outChars[screenX] = ch;\n }\n }\n\n return outChars.join('');\n });\n\n frames.push({ lines: projectedLines, color });\n }\n\n return frames;\n}\n\n// Pre-generate frames for pulse animation\nexport function generatePulseFrames(): LogoFrame[] {\n const NUM_FRAMES = 24;\n const frames: LogoFrame[] = [];\n\n for (let f = 0; f < NUM_FRAMES; f++) {\n const angle = (f / NUM_FRAMES) * 2 * Math.PI;\n const brightness = (Math.cos(angle) + 1) / 2; // 0 to 1\n\n let color: string;\n if (brightness > 0.85) color = COLORS.brightest;\n else if (brightness > 0.7) color = COLORS.bright;\n else if (brightness > 0.5) color = COLORS.medium;\n else if (brightness > 0.35) color = COLORS.dark;\n else if (brightness > 0.2) color = COLORS.darker;\n else color = COLORS.darkest;\n\n frames.push({ lines: [...LOGO_SMALL], color });\n }\n\n return frames;\n}\n\n// Cache frames on first use\nlet spinFramesCache: LogoFrame[] | null = null;\nlet pulseFramesCache: LogoFrame[] | null = null;\n\nexport function getFrames(mode: AnimationMode): LogoFrame[] {\n if (mode === 'spin') {\n if (!spinFramesCache) spinFramesCache = generateSpinFrames();\n return spinFramesCache;\n } else {\n if (!pulseFramesCache) pulseFramesCache = generatePulseFrames();\n return pulseFramesCache;\n }\n}\n\nexport const FRAME_DELAYS = {\n spin: 55,\n pulse: 80,\n} as const;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"welcome-art.js","sourceRoot":"","sources":["../../../src/dashboard/lib/welcome-art.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,UAAU,aAAa;IAC3B,OAAO,SAAS,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACvC,CAAC","sourcesContent":["import { getConfig } from '../../lib/settings.js';\n\nexport function getWelcomeArt(): string {\n return getConfig().branding.asciiArt;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/dashboard/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { InstallerEventEmitter, InstallerEvents } from '../lib/events.js';\n\nexport interface DashboardProps {\n emitter: InstallerEventEmitter;\n}\n\n// Re-export for convenience\nexport type { InstallerEvents, InstallerEventEmitter };\n"]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { InstallerAdapter, AdapterConfig } from './types.js';
|
|
2
|
+
import type { InstallerEventEmitter } from '../events.js';
|
|
3
3
|
/**
|
|
4
4
|
* CLI adapter that renders wizard events via clack.
|
|
5
5
|
*
|
|
6
|
-
* Subscribes to
|
|
6
|
+
* Subscribes to InstallerEventEmitter and translates events into
|
|
7
7
|
* clack UI operations (logs, spinners, prompts).
|
|
8
8
|
*/
|
|
9
|
-
export declare class CLIAdapter implements
|
|
10
|
-
readonly emitter:
|
|
9
|
+
export declare class CLIAdapter implements InstallerAdapter {
|
|
10
|
+
readonly emitter: InstallerEventEmitter;
|
|
11
11
|
private sendEvent;
|
|
12
12
|
private debug;
|
|
13
13
|
private spinner;
|
|
@@ -5,7 +5,7 @@ import { ProgressTracker } from '../progress-tracker.js';
|
|
|
5
5
|
/**
|
|
6
6
|
* CLI adapter that renders wizard events via clack.
|
|
7
7
|
*
|
|
8
|
-
* Subscribes to
|
|
8
|
+
* Subscribes to InstallerEventEmitter and translates events into
|
|
9
9
|
* clack UI operations (logs, spinners, prompts).
|
|
10
10
|
*/
|
|
11
11
|
export class CLIAdapter {
|
|
@@ -59,7 +59,7 @@ export class CLIAdapter {
|
|
|
59
59
|
console.log();
|
|
60
60
|
}
|
|
61
61
|
else {
|
|
62
|
-
clack.intro('Welcome to the WorkOS AuthKit
|
|
62
|
+
clack.intro('Welcome to the WorkOS AuthKit installer');
|
|
63
63
|
}
|
|
64
64
|
// Handle Ctrl+C gracefully
|
|
65
65
|
const handleSigInt = () => {
|
|
@@ -68,7 +68,7 @@ export class CLIAdapter {
|
|
|
68
68
|
this.spinner = null;
|
|
69
69
|
}
|
|
70
70
|
this.stopAgentUpdates();
|
|
71
|
-
clack.log.warn('
|
|
71
|
+
clack.log.warn('Installer cancelled');
|
|
72
72
|
clack.outro('Your project was not modified');
|
|
73
73
|
process.exit(0);
|
|
74
74
|
};
|
|
@@ -239,7 +239,7 @@ export class CLIAdapter {
|
|
|
239
239
|
type: clack.isCancel(confirmed) || !confirmed ? 'GIT_CANCELLED' : 'GIT_CONFIRMED',
|
|
240
240
|
});
|
|
241
241
|
};
|
|
242
|
-
handleCredentialsRequest = async ({ requiresApiKey }) => {
|
|
242
|
+
handleCredentialsRequest = async ({ requiresApiKey, }) => {
|
|
243
243
|
clack.log.step(`Get your credentials from ${chalk.cyan('https://dashboard.workos.com')}`);
|
|
244
244
|
const clientId = await clack.text({
|
|
245
245
|
message: 'Enter your WorkOS Client ID:',
|
|
@@ -355,7 +355,7 @@ export class CLIAdapter {
|
|
|
355
355
|
clack.log.error(message);
|
|
356
356
|
// Add actionable hints for common errors
|
|
357
357
|
if (message.includes('authentication') || message.includes('auth')) {
|
|
358
|
-
clack.log.info('Try running:
|
|
358
|
+
clack.log.info('Try running: workos logout && workos install');
|
|
359
359
|
}
|
|
360
360
|
if (message.includes('ENOENT') || message.includes('not found')) {
|
|
361
361
|
clack.log.info('Ensure you are in a project directory');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-adapter.js","sourceRoot":"","sources":["../../../src/lib/adapters/cli-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InstallerAdapter, AdapterConfig } from './types.js';\nimport type { InstallerEventEmitter, InstallerEvents } from '../events.js';\nimport clack from '../../utils/clack.js';\nimport chalk from 'chalk';\nimport { getConfig } from '../settings.js';\nimport { ProgressTracker } from '../progress-tracker.js';\n\n/**\n * CLI adapter that renders wizard events via clack.\n *\n * Subscribes to InstallerEventEmitter and translates events into\n * clack UI operations (logs, spinners, prompts).\n */\nexport class CLIAdapter implements InstallerAdapter {\n readonly emitter: InstallerEventEmitter;\n private sendEvent: AdapterConfig['sendEvent'];\n private debug: boolean;\n private spinner: ReturnType<typeof clack.spinner> | null = null;\n private isStarted = false;\n private progress = new ProgressTracker();\n\n // Store bound handlers for cleanup\n private handlers = new Map<string, (...args: unknown[]) => void>();\n\n // Queue for logs while prompt is active (parallel state issue)\n private isPromptActive = false;\n private pendingLogs: Array<() => void> = [];\n\n // SIGINT handler for cleanup\n private sigIntHandler: (() => void) | null = null;\n\n // Long-running agent update interval\n private agentUpdateInterval: NodeJS.Timeout | null = null;\n\n constructor(config: AdapterConfig) {\n this.emitter = config.emitter;\n this.sendEvent = config.sendEvent;\n this.debug = config.debug ?? false;\n }\n\n /**\n * Queue a log call if a prompt is active, otherwise execute immediately.\n */\n private queueableLog(logFn: () => void): void {\n if (this.isPromptActive) {\n this.pendingLogs.push(logFn);\n } else {\n logFn();\n }\n }\n\n /**\n * Flush any queued logs after prompt completes.\n */\n private flushPendingLogs(): void {\n const logs = this.pendingLogs.splice(0);\n logs.forEach((fn) => fn());\n }\n\n async start(): Promise<void> {\n if (this.isStarted) return;\n this.isStarted = true;\n\n // Show intro\n const config = getConfig();\n if (config.branding.showAsciiArt) {\n const art = config.branding.useCompact ? config.branding.compactAsciiArt : config.branding.asciiArt;\n console.log(chalk.cyan(art));\n console.log();\n } else {\n clack.intro('Welcome to the WorkOS AuthKit installer');\n }\n\n // Handle Ctrl+C gracefully\n const handleSigInt = () => {\n if (this.spinner) {\n this.spinner.stop('Cancelled');\n this.spinner = null;\n }\n this.stopAgentUpdates();\n clack.log.warn('Installer cancelled');\n clack.outro('Your project was not modified');\n process.exit(0);\n };\n process.on('SIGINT', handleSigInt);\n this.sigIntHandler = handleSigInt;\n\n // Subscribe to state events for progress tracking\n this.subscribe('state:enter', this.handleStateEnter);\n this.subscribe('state:exit', this.handleStateExit);\n\n // Subscribe to events that require UI rendering\n this.subscribe('auth:success', this.handleAuthSuccess);\n this.subscribe('auth:failure', this.handleAuthFailure);\n this.subscribe('detection:complete', this.handleDetectionComplete);\n this.subscribe('detection:none', this.handleDetectionNone);\n this.subscribe('git:dirty', this.handleGitDirty);\n this.subscribe('credentials:found', this.handleCredentialsFound);\n this.subscribe('credentials:request', this.handleCredentialsRequest);\n this.subscribe('credentials:env:prompt', this.handleEnvScanPrompt);\n this.subscribe('device:started', this.handleDeviceStarted);\n this.subscribe('device:success', this.handleDeviceSuccess);\n this.subscribe('staging:fetching', this.handleStagingFetching);\n this.subscribe('staging:success', this.handleStagingSuccess);\n this.subscribe('credentials:env:found', this.handleEnvCredentialsFound);\n this.subscribe('config:complete', this.handleConfigComplete);\n this.subscribe('agent:start', this.handleAgentStart);\n this.subscribe('agent:progress', this.handleAgentProgress);\n this.subscribe('validation:start', this.handleValidationStart);\n this.subscribe('validation:issues', this.handleValidationIssues);\n this.subscribe('validation:complete', this.handleValidationComplete);\n this.subscribe('complete', this.handleComplete);\n this.subscribe('error', this.handleError);\n // Branch check events\n this.subscribe('branch:prompt', this.handleBranchPrompt);\n this.subscribe('branch:created', this.handleBranchCreated);\n\n // Post-install events\n this.subscribe('postinstall:changes', this.handlePostInstallChanges);\n this.subscribe('postinstall:commit:prompt', this.handleCommitPrompt);\n this.subscribe('postinstall:commit:generating', this.handleCommitGenerating);\n this.subscribe('postinstall:commit:success', this.handleCommitSuccess);\n this.subscribe('postinstall:commit:failed', this.handleCommitFailed);\n this.subscribe('postinstall:pr:prompt', this.handlePrPrompt);\n this.subscribe('postinstall:pr:generating', this.handlePrGenerating);\n this.subscribe('postinstall:pr:pushing', this.handlePrPushing);\n this.subscribe('postinstall:pr:success', this.handlePrSuccess);\n this.subscribe('postinstall:pr:failed', this.handlePrFailed);\n this.subscribe('postinstall:push:failed', this.handlePushFailed);\n this.subscribe('postinstall:manual', this.handleManualInstructions);\n }\n\n async stop(): Promise<void> {\n if (!this.isStarted) return;\n\n // Remove SIGINT handler\n if (this.sigIntHandler) {\n process.off('SIGINT', this.sigIntHandler);\n this.sigIntHandler = null;\n }\n\n // Stop agent updates\n this.stopAgentUpdates();\n\n // Unsubscribe from all events\n for (const [event, handler] of this.handlers) {\n this.emitter.off(event as keyof InstallerEvents, handler as never);\n }\n this.handlers.clear();\n\n // Stop any active spinner\n this.spinner?.stop();\n this.spinner = null;\n\n this.isStarted = false;\n }\n\n private stopAgentUpdates = (): void => {\n if (this.agentUpdateInterval) {\n clearInterval(this.agentUpdateInterval);\n this.agentUpdateInterval = null;\n }\n };\n\n private stopSpinner(message: string): void {\n if (this.spinner) {\n this.spinner.stop(message);\n this.spinner = null;\n }\n }\n\n /** Debug logging - only outputs when debug mode is enabled */\n private debugLog = (message: string): void => {\n if (this.debug) {\n console.log(chalk.dim(`[debug] ${message}`));\n }\n };\n\n /**\n * Helper to subscribe and track handlers for cleanup.\n */\n private subscribe<K extends keyof InstallerEvents>(\n event: K,\n handler: (payload: InstallerEvents[K]) => void | Promise<void>,\n ): void {\n const boundHandler = handler.bind(this);\n this.handlers.set(event, boundHandler as (...args: unknown[]) => void);\n this.emitter.on(event, boundHandler);\n }\n\n // ===== Event Handlers =====\n\n private handleStateEnter = ({ state }: InstallerEvents['state:enter']): void => {\n this.progress.enterPhase(state);\n };\n\n private handleStateExit = ({ state }: InstallerEvents['state:exit']): void => {\n this.progress.exitPhase(state);\n };\n\n private handleAuthSuccess = (): void => {\n clack.log.success('Authenticated');\n };\n\n private handleAuthFailure = ({ message }: InstallerEvents['auth:failure']): void => {\n clack.log.error(`Auth failed: ${message}`);\n clack.log.info('Visit https://dashboard.workos.com to verify your account');\n };\n\n private handleDetectionComplete = ({ integration }: InstallerEvents['detection:complete']): void => {\n this.queueableLog(() => clack.log.success(`Detected ${chalk.bold(integration)}`));\n };\n\n private handleDetectionNone = (): void => {\n this.queueableLog(() => clack.log.warn('Could not detect framework automatically'));\n };\n\n private handleCredentialsFound = (): void => {\n clack.log.success('Found existing WorkOS credentials in .env.local');\n };\n\n private handleEnvScanPrompt = async ({ files }: InstallerEvents['credentials:env:prompt']): Promise<void> => {\n this.isPromptActive = true;\n const fileList = files.length === 1 ? files[0] : files.slice(0, 2).join(', ');\n const confirmed = await clack.confirm({\n message: `Found ${fileList}. Check for existing WorkOS credentials?`,\n initialValue: true,\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n this.sendEvent({\n type: clack.isCancel(confirmed) || !confirmed ? 'ENV_SCAN_DECLINED' : 'ENV_SCAN_APPROVED',\n });\n };\n\n private handleDeviceStarted = ({ verificationUri, userCode }: InstallerEvents['device:started']): void => {\n clack.log.info(`\\nOpen this URL in your browser:\\n`);\n console.log(` ${chalk.cyan(verificationUri)}`);\n console.log(`\\nEnter code: ${chalk.bold(userCode)}\\n`);\n\n this.spinner = clack.spinner();\n this.spinner.start('Waiting for authentication...');\n };\n\n private handleDeviceSuccess = (): void => {\n // Spinner will be stopped by handleStagingFetching\n };\n\n private handleStagingFetching = (): void => {\n if (this.spinner) {\n this.spinner.stop('Authenticated');\n }\n this.spinner = clack.spinner();\n this.spinner.start('Fetching your WorkOS credentials...');\n };\n\n private handleStagingSuccess = (): void => {\n this.stopSpinner('Credentials fetched');\n clack.log.success('WorkOS credentials retrieved automatically');\n };\n\n private handleEnvCredentialsFound = ({ sourcePath }: InstallerEvents['credentials:env:found']): void => {\n clack.log.success(`Found existing WorkOS credentials in ${sourcePath}`);\n };\n\n private handleGitDirty = async ({ files }: InstallerEvents['git:dirty']): Promise<void> => {\n clack.log.warn('You have uncommitted or untracked files:');\n files.slice(0, 5).forEach((f) => clack.log.info(chalk.dim(` ${f}`)));\n if (files.length > 5) {\n clack.log.info(chalk.dim(` ... and ${files.length - 5} more`));\n }\n\n this.isPromptActive = true;\n const confirmed = await clack.confirm({\n message: 'Continue anyway?',\n initialValue: false,\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n this.sendEvent({\n type: clack.isCancel(confirmed) || !confirmed ? 'GIT_CANCELLED' : 'GIT_CONFIRMED',\n });\n };\n\n private handleCredentialsRequest = async ({\n requiresApiKey,\n }: InstallerEvents['credentials:request']): Promise<void> => {\n clack.log.step(`Get your credentials from ${chalk.cyan('https://dashboard.workos.com')}`);\n\n const clientId = await clack.text({\n message: 'Enter your WorkOS Client ID:',\n placeholder: 'client_...',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Client ID is required';\n }\n if (!value.startsWith('client_')) {\n return 'Client ID should start with \"client_\"';\n }\n return undefined;\n },\n });\n\n if (clack.isCancel(clientId)) {\n this.sendEvent({ type: 'CANCEL' });\n return;\n }\n\n let apiKey = '';\n if (requiresApiKey) {\n clack.log.info(chalk.dim('ℹ️ Your API key will be hidden for security and saved to .env.local'));\n const apiKeyResult = await clack.password({\n message: 'Enter your WorkOS API Key:',\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'API Key is required';\n }\n if (!value.startsWith('sk_')) {\n return 'API Key should start with \"sk_\"';\n }\n return undefined;\n },\n });\n\n if (clack.isCancel(apiKeyResult)) {\n this.sendEvent({ type: 'CANCEL' });\n return;\n }\n apiKey = apiKeyResult as string;\n } else {\n clack.log.info(chalk.dim('ℹ️ Client-only SDK - API key not required'));\n }\n\n this.sendEvent({\n type: 'CREDENTIALS_SUBMITTED',\n apiKey,\n clientId: clientId as string,\n });\n };\n\n private handleConfigComplete = (): void => {\n clack.log.success('Environment configured');\n };\n\n private handleAgentStart = (): void => {\n this.spinner = clack.spinner();\n this.spinner.start('Running AI agent...');\n\n // Periodic status updates for long-running operations\n let dots = 0;\n this.agentUpdateInterval = setInterval(() => {\n dots = (dots + 1) % 4;\n const dotStr = '.'.repeat(dots + 1);\n this.spinner?.message(`Running AI agent${dotStr}`);\n }, 2000);\n };\n\n private handleAgentProgress = ({ step, detail }: InstallerEvents['agent:progress']): void => {\n const message = detail ? `${step}: ${detail}` : step;\n this.spinner?.message(message);\n };\n\n private handleValidationStart = (): void => {\n this.stopAgentUpdates();\n this.stopSpinner('Agent completed');\n };\n\n private handleValidationIssues = ({ issues }: InstallerEvents['validation:issues']): void => {\n for (const issue of issues) {\n if (issue.severity === 'error') {\n clack.log.error(issue.message);\n } else {\n clack.log.warn(issue.message);\n }\n if (issue.hint) {\n clack.log.info(`Hint: ${issue.hint}`);\n }\n }\n };\n\n private handleValidationComplete = ({ passed, issueCount }: InstallerEvents['validation:complete']): void => {\n if (passed) {\n clack.log.success('Validation passed');\n } else {\n clack.log.warn(`Validation found ${issueCount} issue(s)`);\n }\n };\n\n private handleComplete = ({ success, summary }: InstallerEvents['complete']): void => {\n this.stopAgentUpdates();\n this.stopSpinner(success ? 'Done' : 'Failed');\n\n if (success) {\n clack.log.success('WorkOS AuthKit installed!');\n clack.log.message('Next steps:');\n clack.log.message(' • Start dev server to test authentication');\n clack.log.message(' • Visit WorkOS Dashboard to manage users');\n clack.outro(chalk.dim('Docs: https://workos.com/docs/authkit'));\n } else {\n clack.log.error('Installation failed');\n if (summary) {\n clack.log.info(summary);\n }\n clack.outro(chalk.dim('Report issues: https://github.com/workos/installer/issues'));\n }\n };\n\n private handleError = ({ message, stack }: InstallerEvents['error']): void => {\n this.stopSpinner('Error');\n this.stopAgentUpdates();\n\n clack.log.error(message);\n\n // Add actionable hints for common errors\n if (message.includes('authentication') || message.includes('auth')) {\n clack.log.info('Try running: workos logout && workos install');\n }\n if (message.includes('ENOENT') || message.includes('not found')) {\n clack.log.info('Ensure you are in a project directory');\n }\n\n if (stack && this.debug) {\n this.debugLog(stack);\n }\n };\n\n private handleBranchPrompt = async ({ branch }: InstallerEvents['branch:prompt']): Promise<void> => {\n this.isPromptActive = true;\n const choice = await clack.select({\n message: `You are on ${chalk.bold(branch)}. Create a feature branch?`,\n options: [\n { value: 'create', label: 'Create feat/add-workos-authkit' },\n { value: 'continue', label: 'Continue on current branch' },\n { value: 'cancel', label: 'Cancel' },\n ],\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n if (clack.isCancel(choice) || choice === 'cancel') {\n this.sendEvent({ type: 'BRANCH_CANCEL' });\n } else if (choice === 'create') {\n this.sendEvent({ type: 'BRANCH_CREATE' });\n } else {\n this.sendEvent({ type: 'BRANCH_CONTINUE' });\n }\n };\n\n private handleBranchCreated = ({ branch }: InstallerEvents['branch:created']): void => {\n this.queueableLog(() => clack.log.success(`Created branch ${chalk.bold(branch)}`));\n };\n\n // ===== Post-install Event Handlers =====\n\n private handlePostInstallChanges = ({ files }: InstallerEvents['postinstall:changes']): void => {\n this.debugLog(`Post-install: ${files.length} changed files detected`);\n };\n\n private handleCommitPrompt = async (): Promise<void> => {\n this.isPromptActive = true;\n const confirmed = await clack.confirm({\n message: 'Commit the changes?',\n initialValue: true,\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n this.sendEvent({\n type: clack.isCancel(confirmed) || !confirmed ? 'COMMIT_DECLINED' : 'COMMIT_APPROVED',\n });\n };\n\n private handleCommitGenerating = (): void => {\n this.spinner = clack.spinner();\n this.spinner.start('Generating commit message...');\n };\n\n private handleCommitSuccess = ({ message }: InstallerEvents['postinstall:commit:success']): void => {\n this.stopSpinner('Committed');\n clack.log.success(`Committed: ${chalk.dim(message)}`);\n };\n\n private handleCommitFailed = ({ error }: InstallerEvents['postinstall:commit:failed']): void => {\n this.stopSpinner('Commit failed');\n clack.log.error(`Commit failed: ${error}`);\n };\n\n private handlePrPrompt = async (): Promise<void> => {\n this.isPromptActive = true;\n const confirmed = await clack.confirm({\n message: 'Create a pull request?',\n initialValue: true,\n });\n this.isPromptActive = false;\n this.flushPendingLogs();\n\n this.sendEvent({\n type: clack.isCancel(confirmed) || !confirmed ? 'PR_DECLINED' : 'PR_APPROVED',\n });\n };\n\n private handlePrGenerating = (): void => {\n this.spinner = clack.spinner();\n this.spinner.start('Generating PR description...');\n };\n\n private handlePrPushing = (): void => {\n if (this.spinner) {\n this.spinner.message('Pushing to remote...');\n } else {\n this.spinner = clack.spinner();\n this.spinner.start('Pushing to remote...');\n }\n };\n\n private handlePrSuccess = ({ url }: InstallerEvents['postinstall:pr:success']): void => {\n this.stopSpinner('PR created');\n clack.log.success(`Pull request created: ${chalk.cyan(url)}`);\n };\n\n private handlePrFailed = ({ error }: InstallerEvents['postinstall:pr:failed']): void => {\n this.stopSpinner('PR creation failed');\n clack.log.error(`PR creation failed: ${error}`);\n };\n\n private handlePushFailed = ({ error }: InstallerEvents['postinstall:push:failed']): void => {\n this.stopSpinner('Push failed');\n clack.log.error(`Push failed: ${error}`);\n };\n\n private handleManualInstructions = ({ instructions }: InstallerEvents['postinstall:manual']): void => {\n clack.log.info('GitHub CLI not found. Manual steps:');\n console.log(chalk.dim(instructions));\n };\n}\n"]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { InstallerAdapter, AdapterConfig } from './types.js';
|
|
2
|
+
import type { InstallerEventEmitter } from '../events.js';
|
|
3
3
|
/**
|
|
4
4
|
* Dashboard adapter that renders wizard events via Ink/React TUI.
|
|
5
5
|
*
|
|
6
6
|
* Wraps the existing Dashboard component and passes the emitter to it.
|
|
7
7
|
* The Dashboard component already handles most event rendering internally.
|
|
8
8
|
*/
|
|
9
|
-
export declare class DashboardAdapter implements
|
|
10
|
-
readonly emitter:
|
|
9
|
+
export declare class DashboardAdapter implements InstallerAdapter {
|
|
10
|
+
readonly emitter: InstallerEventEmitter;
|
|
11
11
|
private sendEvent;
|
|
12
12
|
private cleanup;
|
|
13
13
|
private isStarted;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-adapter.js","sourceRoot":"","sources":["../../../src/lib/adapters/dashboard-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InstallerAdapter, AdapterConfig } from './types.js';\nimport type { InstallerEventEmitter, InstallerEvents } from '../events.js';\nimport chalk from 'chalk';\n\n/**\n * Dashboard adapter that renders wizard events via Ink/React TUI.\n *\n * Wraps the existing Dashboard component and passes the emitter to it.\n * The Dashboard component already handles most event rendering internally.\n */\nexport class DashboardAdapter implements InstallerAdapter {\n readonly emitter: InstallerEventEmitter;\n private sendEvent: AdapterConfig['sendEvent'];\n private cleanup: (() => void) | null = null;\n private isStarted = false;\n private completionData: { success: boolean; summary?: string } | null = null;\n\n constructor(config: AdapterConfig) {\n this.emitter = config.emitter;\n this.sendEvent = config.sendEvent;\n }\n\n async start(): Promise<void> {\n if (this.isStarted) return;\n this.isStarted = true;\n\n // Dynamic imports to avoid loading Ink when not needed\n const { render } = await import('ink');\n const { createElement } = await import('react');\n const { Dashboard } = await import('../../dashboard/components/Dashboard.js');\n\n // Enter fullscreen (alternate screen buffer)\n process.stdout.write('\\x1b[?1049h'); // Enter alternate screen\n process.stdout.write('\\x1b[2J'); // Clear entire screen\n process.stdout.write('\\x1b[H'); // Move cursor to home\n process.stdout.write('\\x1b[?25l'); // Hide cursor\n\n // Render the Dashboard component with emitter\n const instance = render(createElement(Dashboard, { emitter: this.emitter }));\n\n // Setup cleanup function\n this.cleanup = () => {\n instance.unmount();\n process.stdout.write('\\x1b[?25h'); // Show cursor\n process.stdout.write('\\x1b[?1049l'); // Exit alternate screen\n };\n\n // Wire up Dashboard responses back to the machine\n // The Dashboard component emits these when user interacts\n this.emitter.on('confirm:response', this.handleConfirmResponse);\n this.emitter.on('credentials:response', this.handleCredentialsResponse);\n\n // Track completion for post-exit summary\n this.emitter.on('complete', this.handleComplete);\n }\n\n /**\n * Capture completion data for display after exit.\n */\n private handleComplete = ({ success, summary }: InstallerEvents['complete']): void => {\n this.completionData = { success, summary };\n };\n\n async stop(): Promise<void> {\n if (!this.isStarted) return;\n\n // Unsubscribe from events\n this.emitter.off('confirm:response', this.handleConfirmResponse);\n this.emitter.off('credentials:response', this.handleCredentialsResponse);\n this.emitter.off('complete', this.handleComplete);\n\n // Run cleanup (unmount Ink, exit fullscreen)\n this.cleanup?.();\n this.cleanup = null;\n\n // Print completion summary to terminal after exiting alternate screen\n if (this.completionData) {\n console.log(); // blank line\n if (this.completionData.success) {\n console.log(chalk.green('✓ Installation Complete'));\n if (this.completionData.summary) {\n console.log();\n console.log(this.completionData.summary);\n }\n } else {\n console.log(chalk.red('✗ Installation Failed'));\n if (this.completionData.summary) {\n console.log(chalk.dim(this.completionData.summary));\n }\n }\n console.log();\n }\n\n this.isStarted = false;\n }\n\n /**\n * Handle confirm dialog responses from Dashboard.\n */\n private handleConfirmResponse = ({ id, confirmed }: { id: string; confirmed: boolean }): void => {\n if (id === 'git-status') {\n this.sendEvent({ type: confirmed ? 'GIT_CONFIRMED' : 'GIT_CANCELLED' });\n } else if (id === 'env-scan') {\n this.sendEvent({ type: confirmed ? 'ENV_SCAN_APPROVED' : 'ENV_SCAN_DECLINED' });\n } else if (id === 'branch-check') {\n // For dashboard, confirmed=true means create branch, false means continue on current\n this.sendEvent({ type: confirmed ? 'BRANCH_CREATE' : 'BRANCH_CONTINUE' });\n } else if (id === 'commit') {\n this.sendEvent({ type: confirmed ? 'COMMIT_APPROVED' : 'COMMIT_DECLINED' });\n } else if (id === 'pr') {\n this.sendEvent({ type: confirmed ? 'PR_APPROVED' : 'PR_DECLINED' });\n }\n };\n\n /**\n * Handle credentials form submission from Dashboard.\n */\n private handleCredentialsResponse = ({ apiKey, clientId }: { apiKey: string; clientId: string }): void => {\n this.sendEvent({ type: 'CREDENTIALS_SUBMITTED', apiKey, clientId });\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC","sourcesContent":["export { CLIAdapter } from './cli-adapter.js';\nexport { DashboardAdapter } from './dashboard-adapter.js';\nexport type { InstallerAdapter, AdapterConfig } from './types.js';\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { InstallerEventEmitter } from '../events.js';
|
|
2
2
|
/**
|
|
3
3
|
* Configuration passed to adapter constructors.
|
|
4
4
|
*/
|
|
5
5
|
export interface AdapterConfig {
|
|
6
6
|
/** Event emitter to subscribe to */
|
|
7
|
-
emitter:
|
|
7
|
+
emitter: InstallerEventEmitter;
|
|
8
8
|
/**
|
|
9
9
|
* Callback to send events back to the machine.
|
|
10
10
|
* Used for user responses (confirmations, credentials, etc.)
|
|
@@ -23,7 +23,7 @@ export interface AdapterConfig {
|
|
|
23
23
|
* into framework-specific UI rendering. They don't control flow—
|
|
24
24
|
* they react to it.
|
|
25
25
|
*/
|
|
26
|
-
export interface
|
|
26
|
+
export interface InstallerAdapter {
|
|
27
27
|
/**
|
|
28
28
|
* Start the adapter.
|
|
29
29
|
* - Subscribe to emitter events
|
|
@@ -37,5 +37,5 @@ export interface WizardAdapter {
|
|
|
37
37
|
*/
|
|
38
38
|
stop(): Promise<void>;
|
|
39
39
|
/** The emitter this adapter subscribes to */
|
|
40
|
-
readonly emitter:
|
|
40
|
+
readonly emitter: InstallerEventEmitter;
|
|
41
41
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/adapters/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { InstallerEventEmitter } from '../events.js';\n\n/**\n * Configuration passed to adapter constructors.\n */\nexport interface AdapterConfig {\n /** Event emitter to subscribe to */\n emitter: InstallerEventEmitter;\n\n /**\n * Callback to send events back to the machine.\n * Used for user responses (confirmations, credentials, etc.)\n */\n sendEvent: (event: { type: string; [key: string]: unknown }) => void;\n\n /** Enable verbose debug output (stack traces, etc.) */\n debug?: boolean;\n}\n\n/**\n * Interface all UI adapters must implement.\n *\n * Adapters are event subscribers that translate machine events\n * into framework-specific UI rendering. They don't control flow—\n * they react to it.\n */\nexport interface InstallerAdapter {\n /**\n * Start the adapter.\n * - Subscribe to emitter events\n * - Initialize UI framework (show intro, enter fullscreen, etc.)\n */\n start(): Promise<void>;\n\n /**\n * Stop the adapter.\n * - Unsubscribe from all events\n * - Clean up UI (exit fullscreen, restore terminal, etc.)\n */\n stop(): Promise<void>;\n\n /** The emitter this adapter subscribes to */\n readonly emitter: InstallerEventEmitter;\n}\n"]}
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
* Shared agent interface for WorkOS wizards
|
|
3
3
|
* Uses Claude Agent SDK directly with WorkOS MCP server
|
|
4
4
|
*/
|
|
5
|
-
import type {
|
|
6
|
-
import type {
|
|
5
|
+
import type { InstallerOptions } from '../utils/types.js';
|
|
6
|
+
import type { InstallerEventEmitter } from './events.js';
|
|
7
|
+
import { type CredentialProxyHandle } from './credential-proxy.js';
|
|
7
8
|
type McpServersConfig = any;
|
|
8
9
|
export declare const AgentSignals: {
|
|
9
10
|
/** Signal emitted when the agent reports progress to the user */
|
|
@@ -20,11 +21,11 @@ export type AgentSignal = (typeof AgentSignals)[keyof typeof AgentSignals];
|
|
|
20
21
|
*/
|
|
21
22
|
export declare enum AgentErrorType {
|
|
22
23
|
/** Agent could not access the WorkOS MCP server */
|
|
23
|
-
MCP_MISSING = "
|
|
24
|
+
MCP_MISSING = "INSTALLER_MCP_MISSING",
|
|
24
25
|
/** Agent could not access the setup resource */
|
|
25
|
-
RESOURCE_MISSING = "
|
|
26
|
+
RESOURCE_MISSING = "INSTALLER_RESOURCE_MISSING",
|
|
26
27
|
/** Agent execution failed (API error, auth error, etc.) */
|
|
27
|
-
EXECUTION_ERROR = "
|
|
28
|
+
EXECUTION_ERROR = "INSTALLER_EXECUTION_ERROR"
|
|
28
29
|
}
|
|
29
30
|
export type AgentConfig = {
|
|
30
31
|
workingDirectory: string;
|
|
@@ -39,6 +40,7 @@ type AgentRunConfig = {
|
|
|
39
40
|
mcpServers: McpServersConfig;
|
|
40
41
|
model: string;
|
|
41
42
|
allowedTools: string[];
|
|
43
|
+
sdkEnv: Record<string, string | undefined>;
|
|
42
44
|
};
|
|
43
45
|
/**
|
|
44
46
|
* Permission hook that allows only safe commands.
|
|
@@ -47,7 +49,7 @@ type AgentRunConfig = {
|
|
|
47
49
|
* - Piping to tail/head for output limiting is allowed
|
|
48
50
|
* - Stderr redirection (2>&1) is allowed
|
|
49
51
|
*/
|
|
50
|
-
export declare function
|
|
52
|
+
export declare function installerCanUseTool(toolName: string, input: Record<string, unknown>): {
|
|
51
53
|
behavior: 'allow';
|
|
52
54
|
updatedInput: Record<string, unknown>;
|
|
53
55
|
} | {
|
|
@@ -57,19 +59,23 @@ export declare function wizardCanUseTool(toolName: string, input: Record<string,
|
|
|
57
59
|
/**
|
|
58
60
|
* Initialize agent configuration for the LLM gateway
|
|
59
61
|
*/
|
|
60
|
-
export declare function initializeAgent(config: AgentConfig, options:
|
|
62
|
+
export declare function initializeAgent(config: AgentConfig, options: InstallerOptions): Promise<AgentRunConfig>;
|
|
61
63
|
/**
|
|
62
64
|
* Execute an agent with the provided prompt and options
|
|
63
65
|
* Handles the full lifecycle via event emissions - adapters handle UI rendering.
|
|
64
66
|
*
|
|
65
67
|
* @returns An object containing any error detected in the agent's output
|
|
66
68
|
*/
|
|
67
|
-
export declare function runAgent(agentConfig: AgentRunConfig, prompt: string, options:
|
|
69
|
+
export declare function runAgent(agentConfig: AgentRunConfig, prompt: string, options: InstallerOptions, config?: {
|
|
68
70
|
spinnerMessage?: string;
|
|
69
71
|
successMessage?: string;
|
|
70
72
|
errorMessage?: string;
|
|
71
|
-
}, emitter?:
|
|
73
|
+
}, emitter?: InstallerEventEmitter): Promise<{
|
|
72
74
|
error?: AgentErrorType;
|
|
73
75
|
errorMessage?: string;
|
|
74
76
|
}>;
|
|
77
|
+
/**
|
|
78
|
+
* Get the active proxy handle (for testing/debugging).
|
|
79
|
+
*/
|
|
80
|
+
export declare function getActiveProxyHandle(): CredentialProxyHandle | null;
|
|
75
81
|
export {};
|