eve 0.7.3 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -0
- package/README.md +11 -11
- package/dist/src/chunks/{use-eve-agent-DErQj5hs.js → use-eve-agent-BSXZSn-R.js} +6 -1
- package/dist/src/chunks/{use-eve-agent-DoR8C4i6.js → use-eve-agent-Dlut2Qzt.js} +6 -1
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/dev/tui/blocks.d.ts +1 -1
- package/dist/src/cli/dev/tui/blocks.js +8 -7
- package/dist/src/cli/dev/tui/command-typeahead.d.ts +13 -3
- package/dist/src/cli/dev/tui/command-typeahead.js +1 -1
- package/dist/src/cli/dev/tui/line-editor.d.ts +6 -0
- package/dist/src/cli/dev/tui/line-editor.js +1 -1
- package/dist/src/cli/dev/tui/prompt-command-handler.d.ts +2 -0
- package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
- package/dist/src/cli/dev/tui/runner.d.ts +10 -0
- package/dist/src/cli/dev/tui/runner.js +1 -1
- package/dist/src/cli/dev/tui/setup-commands.d.ts +11 -7
- package/dist/src/cli/dev/tui/setup-commands.js +2 -2
- package/dist/src/cli/dev/tui/setup-flow.d.ts +72 -10
- package/dist/src/cli/dev/tui/setup-issues.js +1 -1
- package/dist/src/cli/dev/tui/setup-panel.d.ts +91 -39
- package/dist/src/cli/dev/tui/setup-panel.js +3 -1
- package/dist/src/cli/dev/tui/setup-selection-input.d.ts +48 -0
- package/dist/src/cli/dev/tui/setup-selection-input.js +1 -0
- package/dist/src/cli/dev/tui/status-line.d.ts +13 -7
- package/dist/src/cli/dev/tui/status-line.js +1 -1
- package/dist/src/cli/dev/tui/stream-format.d.ts +2 -0
- package/dist/src/cli/dev/tui/stream-format.js +2 -2
- package/dist/src/cli/dev/tui/terminal-renderer.d.ts +4 -2
- package/dist/src/cli/dev/tui/terminal-renderer.js +7 -6
- package/dist/src/cli/dev/tui/terminal-text.d.ts +1 -0
- package/dist/src/cli/dev/tui/terminal-text.js +1 -1
- package/dist/src/cli/dev/tui/theme.d.ts +3 -1
- package/dist/src/cli/dev/tui/theme.js +1 -1
- package/dist/src/cli/dev/tui/tool-format.d.ts +1 -1
- package/dist/src/cli/dev/tui/tool-format.js +2 -2
- package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
- package/dist/src/cli/dev/tui/tui.d.ts +6 -0
- package/dist/src/cli/dev/tui/tui.js +1 -1
- package/dist/src/cli/dev/tui/vercel-status.d.ts +4 -4
- package/dist/src/cli/dev/tui/vercel-status.js +1 -1
- package/dist/src/cli/run.d.ts +4 -3
- package/dist/src/cli/run.js +2 -2
- package/dist/src/cli/ui/output.d.ts +1 -0
- package/dist/src/cli/ui/output.js +8 -8
- package/dist/src/client/client.js +1 -1
- package/dist/src/client/session-utils.d.ts +1 -0
- package/dist/src/client/session-utils.js +1 -1
- package/dist/src/client/session.d.ts +1 -0
- package/dist/src/client/session.js +1 -1
- package/dist/src/client/types.d.ts +19 -0
- package/dist/src/compiled/.vendor-stamp.json +1 -2
- package/dist/src/compiler/compile-from-memory.js +1 -1
- package/dist/src/compiler/manifest.d.ts +28 -7
- package/dist/src/compiler/manifest.js +1 -1
- package/dist/src/compiler/normalize-agent-config.js +1 -1
- package/dist/src/compiler/normalize-sandbox.js +1 -1
- package/dist/src/context/providers/session.js +1 -1
- package/dist/src/evals/cli/eval-client.js +1 -1
- package/dist/src/execution/durable-session-store.js +1 -1
- package/dist/src/execution/sandbox/bash-tool.js +1 -1
- package/dist/src/execution/sandbox/bindings/docker-base-setup.d.ts +9 -0
- package/dist/src/execution/sandbox/bindings/docker-base-setup.js +2 -0
- package/dist/src/execution/sandbox/bindings/docker-cli.d.ts +77 -0
- package/dist/src/execution/sandbox/bindings/docker-cli.js +2 -0
- package/dist/src/execution/sandbox/bindings/docker-container.d.ts +16 -0
- package/dist/src/execution/sandbox/bindings/docker-container.js +1 -0
- package/dist/src/execution/sandbox/bindings/docker-network.d.ts +8 -0
- package/dist/src/execution/sandbox/bindings/docker-network.js +1 -0
- package/dist/src/execution/sandbox/bindings/docker-options.d.ts +21 -0
- package/dist/src/execution/sandbox/bindings/docker-options.js +1 -0
- package/dist/src/execution/sandbox/bindings/docker-session.d.ts +7 -0
- package/dist/src/execution/sandbox/bindings/docker-session.js +2 -0
- package/dist/src/execution/sandbox/bindings/docker-templates.d.ts +35 -0
- package/dist/src/execution/sandbox/bindings/docker-templates.js +1 -0
- package/dist/src/execution/sandbox/bindings/docker-utils.d.ts +2 -0
- package/dist/src/execution/sandbox/bindings/docker-utils.js +1 -0
- package/dist/src/execution/sandbox/bindings/docker.d.ts +33 -0
- package/dist/src/execution/sandbox/bindings/docker.js +1 -0
- package/dist/src/execution/sandbox/bindings/just-bash-runtime.d.ts +30 -0
- package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -0
- package/dist/src/execution/sandbox/bindings/just-bash.d.ts +33 -0
- package/dist/src/execution/sandbox/bindings/just-bash.js +1 -0
- package/dist/src/execution/sandbox/bindings/local-backend-utils.d.ts +23 -0
- package/dist/src/execution/sandbox/bindings/local-backend-utils.js +1 -0
- package/dist/src/execution/sandbox/bindings/local-template-prune.d.ts +16 -0
- package/dist/src/execution/sandbox/bindings/local-template-prune.js +1 -0
- package/dist/src/execution/sandbox/bindings/local.d.ts +16 -25
- package/dist/src/execution/sandbox/bindings/local.js +1 -1
- package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.d.ts +16 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-metadata.d.ts +21 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-metadata.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-network.d.ts +18 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-network.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-options.d.ts +34 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-options.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-platform.d.ts +22 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-platform.js +178 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-process.d.ts +3 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-process.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-runtime.d.ts +75 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-templates.d.ts +13 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox.d.ts +22 -0
- package/dist/src/execution/sandbox/bindings/microsandbox.js +1 -0
- package/dist/src/execution/sandbox/bindings/vercel-create-api.d.ts +20 -0
- package/dist/src/execution/sandbox/bindings/vercel-create-api.js +1 -0
- package/dist/src/execution/sandbox/bindings/vercel.d.ts +7 -8
- package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
- package/dist/src/execution/sandbox/development-cleanup.d.ts +4 -0
- package/dist/src/execution/sandbox/development-cleanup.js +1 -0
- package/dist/src/execution/sandbox/development-prewarm.d.ts +11 -0
- package/dist/src/execution/sandbox/development-prewarm.js +1 -0
- package/dist/src/execution/sandbox/development-run.d.ts +8 -0
- package/dist/src/execution/sandbox/development-run.js +1 -0
- package/dist/src/execution/sandbox/ensure.js +1 -1
- package/dist/src/execution/sandbox/grep-tool.js +1 -1
- package/dist/src/execution/sandbox/lazy-backend.d.ts +1 -1
- package/dist/src/execution/sandbox/logging-session.d.ts +5 -0
- package/dist/src/execution/sandbox/logging-session.js +1 -0
- package/dist/src/execution/sandbox/prewarm.js +1 -1
- package/dist/src/execution/sandbox/template-prewarm-lock.d.ts +8 -0
- package/dist/src/execution/sandbox/template-prewarm-lock.js +1 -0
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/step-hooks.js +1 -1
- package/dist/src/harness/tool-loop.js +1 -1
- package/dist/src/internal/application/optional-package-install.d.ts +40 -0
- package/dist/src/internal/application/optional-package-install.js +1 -0
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/authored-definition/sandbox.d.ts +1 -1
- package/dist/src/internal/authored-definition/sandbox.js +1 -1
- package/dist/src/internal/authored-module-loader.js +2 -2
- package/dist/src/internal/classify-model-routing.d.ts +24 -0
- package/dist/src/internal/classify-model-routing.js +1 -0
- package/dist/src/internal/nitro/host/channel-routes.js +2 -2
- package/dist/src/internal/nitro/host/compiled-sandbox-backend-prune-plugin.d.ts +5 -2
- package/dist/src/internal/nitro/host/compiled-sandbox-backend-prune-plugin.js +1 -1
- package/dist/src/internal/nitro/host/create-application-nitro.d.ts +10 -0
- package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
- package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
- package/dist/src/internal/nitro/host/dev-live-virtual-modules.d.ts +15 -0
- package/dist/src/internal/nitro/host/dev-live-virtual-modules.js +1 -0
- package/dist/src/internal/nitro/host/optional-engine-dependency-plugin.d.ts +28 -0
- package/dist/src/internal/nitro/host/optional-engine-dependency-plugin.js +1 -0
- package/dist/src/internal/nitro/host/start-development-server.js +1 -1
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.d.ts +2 -0
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -1
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.d.ts +4 -0
- package/dist/src/internal/nitro/routes/info.js +1 -1
- package/dist/src/internal/nitro/routes/runtime-artifacts.js +1 -1
- package/dist/src/internal/resolve-model-endpoint-status.d.ts +23 -0
- package/dist/src/internal/resolve-model-endpoint-status.js +1 -0
- package/dist/src/internal/workflow-bundle/builder-support.js +2 -2
- package/dist/src/internal/workflow-bundle/vercel-workflow-output.d.ts +1 -1
- package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
- package/dist/src/public/definitions/sandbox-backend.js +1 -1
- package/dist/src/public/sandbox/backends/default.d.ts +37 -10
- package/dist/src/public/sandbox/backends/default.js +1 -1
- package/dist/src/public/sandbox/backends/docker.d.ts +14 -0
- package/dist/src/public/sandbox/backends/docker.js +1 -0
- package/dist/src/public/sandbox/backends/just-bash.d.ts +17 -0
- package/dist/src/public/sandbox/backends/just-bash.js +1 -0
- package/dist/src/public/sandbox/backends/microsandbox.d.ts +17 -0
- package/dist/src/public/sandbox/backends/microsandbox.js +1 -0
- package/dist/src/public/sandbox/backends/vercel.d.ts +5 -2
- package/dist/src/public/sandbox/backends/vercel.js +1 -1
- package/dist/src/public/sandbox/docker-sandbox.d.ts +45 -0
- package/dist/src/public/sandbox/index.d.ts +8 -4
- package/dist/src/public/sandbox/index.js +1 -1
- package/dist/src/public/sandbox/just-bash-sandbox.d.ts +17 -0
- package/dist/src/public/sandbox/just-bash-sandbox.js +1 -0
- package/dist/src/public/sandbox/microsandbox-sandbox.d.ts +54 -0
- package/dist/src/public/sandbox/microsandbox-sandbox.js +1 -0
- package/dist/src/public/sandbox/vercel-sandbox.d.ts +1 -1
- package/dist/src/runtime/compiled-artifacts-source.d.ts +11 -0
- package/dist/src/runtime/compiled-artifacts-source.js +1 -1
- package/dist/src/runtime/resolve-sandbox.js +1 -1
- package/dist/src/runtime/sandbox/keys.js +1 -1
- package/dist/src/runtime/sandbox/registry.d.ts +2 -2
- package/dist/src/runtime/types.d.ts +1 -1
- package/dist/src/runtime/workspace/spec.js +1 -1
- package/dist/src/setup/boxes/add-channels.d.ts +3 -2
- package/dist/src/setup/boxes/add-channels.js +2 -2
- package/dist/src/setup/boxes/apply-ai-gateway-credential.js +1 -1
- package/dist/src/setup/boxes/deploy-project.js +1 -1
- package/dist/src/setup/boxes/link-project.js +1 -1
- package/dist/src/setup/boxes/resolve-provisioning.d.ts +6 -0
- package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
- package/dist/src/setup/boxes/select-model.d.ts +2 -2
- package/dist/src/setup/boxes/select-model.js +1 -1
- package/dist/src/setup/cli/channel-setup-prompter.d.ts +28 -0
- package/dist/src/setup/cli/channel-setup-prompter.js +1 -1
- package/dist/src/setup/cli/index.d.ts +2 -2
- package/dist/src/setup/cli/index.js +1 -1
- package/dist/src/setup/cli/option-row.d.ts +89 -0
- package/dist/src/setup/cli/option-row.js +1 -0
- package/dist/src/setup/cli/prompt-ui.d.ts +15 -29
- package/dist/src/setup/cli/prompt-ui.js +2 -2
- package/dist/src/setup/cli/select-component.d.ts +4 -3
- package/dist/src/setup/cli/select-component.js +1 -1
- package/dist/src/setup/cli/select-state.d.ts +3 -3
- package/dist/src/setup/cli/select-state.js +1 -1
- package/dist/src/setup/flows/channels.d.ts +29 -14
- package/dist/src/setup/flows/channels.js +1 -1
- package/dist/src/setup/flows/deploy.d.ts +1 -0
- package/dist/src/setup/flows/deploy.js +1 -1
- package/dist/src/setup/flows/link.d.ts +1 -0
- package/dist/src/setup/flows/link.js +1 -1
- package/dist/src/setup/flows/model.d.ts +30 -6
- package/dist/src/setup/flows/model.js +1 -1
- package/dist/src/setup/flows/vercel.d.ts +4 -1
- package/dist/src/setup/flows/vercel.js +2 -2
- package/dist/src/setup/index.js +1 -1
- package/dist/src/setup/primitives/open-url.d.ts +14 -0
- package/dist/src/setup/primitives/open-url.js +1 -0
- package/dist/src/setup/primitives/pm/pnpm.d.ts +9 -0
- package/dist/src/setup/primitives/pm/pnpm.js +2 -2
- package/dist/src/setup/primitives/pm/run.d.ts +12 -4
- package/dist/src/setup/primitives/pm/run.js +1 -1
- package/dist/src/setup/primitives/pm/types.d.ts +3 -0
- package/dist/src/setup/primitives/process-abort.d.ts +7 -0
- package/dist/src/setup/primitives/process-abort.js +1 -0
- package/dist/src/setup/primitives/run-vercel.d.ts +2 -0
- package/dist/src/setup/primitives/run-vercel.js +1 -1
- package/dist/src/setup/project-resolution.d.ts +6 -3
- package/dist/src/setup/project-resolution.js +1 -1
- package/dist/src/setup/prompter.d.ts +63 -6
- package/dist/src/setup/prompter.js +1 -1
- package/dist/src/setup/run-vercel-link.d.ts +1 -1
- package/dist/src/setup/run-vercel-link.js +1 -1
- package/dist/src/setup/runner.d.ts +2 -0
- package/dist/src/setup/runner.js +1 -1
- package/dist/src/setup/scaffold/channels-catalog.d.ts +2 -0
- package/dist/src/setup/scaffold/channels-catalog.js +1 -1
- package/dist/src/setup/scaffold/create/add-to-project.d.ts +1 -0
- package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
- package/dist/src/setup/scaffold/create/project.d.ts +2 -0
- package/dist/src/setup/scaffold/create/project.js +6 -3
- package/dist/src/setup/scaffold/update/channels.d.ts +2 -0
- package/dist/src/setup/scaffold/update/channels.js +3 -3
- package/dist/src/setup/slack-connect-lifecycle.d.ts +97 -0
- package/dist/src/setup/slack-connect-lifecycle.js +1 -0
- package/dist/src/setup/slack-connect.d.ts +51 -0
- package/dist/src/setup/slack-connect.js +1 -0
- package/dist/src/setup/slackbot.d.ts +60 -47
- package/dist/src/setup/slackbot.js +1 -1
- package/dist/src/setup/state.d.ts +2 -1
- package/dist/src/setup/state.js +1 -1
- package/dist/src/setup/step.d.ts +4 -0
- package/dist/src/setup/validate-gateway-key.d.ts +30 -0
- package/dist/src/setup/validate-gateway-key.js +1 -0
- package/dist/src/setup/vercel-project.d.ts +19 -12
- package/dist/src/setup/vercel-project.js +1 -1
- package/dist/src/shared/agent-definition.d.ts +26 -0
- package/dist/src/shared/model-endpoint-status.d.ts +27 -0
- package/dist/src/shared/model-endpoint-status.js +1 -0
- package/dist/src/shared/sandbox-backend.d.ts +8 -2
- package/dist/src/shared/sandbox-definition.d.ts +4 -3
- package/dist/src/shared/sandbox-network-policy.d.ts +4 -2
- package/dist/src/shared/sandbox-session.d.ts +3 -2
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/{dist/docs/public → docs}/getting-started.mdx +14 -4
- package/{dist/docs/public → docs}/guides/deployment.md +3 -3
- package/{dist/docs/public → docs}/guides/dev-tui.md +2 -2
- package/{dist/docs/public → docs}/reference/cli.md +2 -1
- package/{dist/docs/public → docs}/sandbox.mdx +39 -15
- package/package.json +11 -1
- package/dist/src/compiled/just-bash/LICENSE +0 -201
- package/dist/src/compiled/just-bash/index.d.ts +0 -139
- package/dist/src/compiled/just-bash/index.js +0 -2200
- package/dist/src/compiled/just-bash/network/types.d.ts +0 -155
- package/dist/src/public/sandbox/backends/local.d.ts +0 -16
- package/dist/src/public/sandbox/backends/local.js +0 -1
- package/dist/src/public/sandbox/local-sandbox.d.ts +0 -7
- /package/dist/src/public/sandbox/{local-sandbox.js → docker-sandbox.js} +0 -0
- /package/{dist/docs/public → docs}/README.md +0 -0
- /package/{dist/docs/public → docs}/agent-config.md +0 -0
- /package/{dist/docs/public → docs}/channels/custom.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/discord.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/eve.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/github.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/linear.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/meta.json +0 -0
- /package/{dist/docs/public → docs}/channels/overview.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/slack.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/teams.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/telegram.mdx +0 -0
- /package/{dist/docs/public → docs}/channels/twilio.mdx +0 -0
- /package/{dist/docs/public → docs}/concepts/context-control.md +0 -0
- /package/{dist/docs/public → docs}/concepts/default-harness.md +0 -0
- /package/{dist/docs/public → docs}/concepts/execution-model-and-durability.md +0 -0
- /package/{dist/docs/public → docs}/concepts/meta.json +0 -0
- /package/{dist/docs/public → docs}/concepts/security-model.md +0 -0
- /package/{dist/docs/public → docs}/concepts/sessions-runs-and-streaming.md +0 -0
- /package/{dist/docs/public → docs}/connections.mdx +0 -0
- /package/{dist/docs/public → docs}/evals/assertions.mdx +0 -0
- /package/{dist/docs/public → docs}/evals/cases.mdx +0 -0
- /package/{dist/docs/public → docs}/evals/judge.mdx +0 -0
- /package/{dist/docs/public → docs}/evals/meta.json +0 -0
- /package/{dist/docs/public → docs}/evals/overview.mdx +0 -0
- /package/{dist/docs/public → docs}/evals/reporters.mdx +0 -0
- /package/{dist/docs/public → docs}/evals/running.mdx +0 -0
- /package/{dist/docs/public → docs}/evals/targets.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/auth-and-route-protection.md +0 -0
- /package/{dist/docs/public → docs}/guides/client/continuations.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/client/messages.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/client/meta.json +0 -0
- /package/{dist/docs/public → docs}/guides/client/output-schema.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/client/overview.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/client/streaming.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/dynamic-capabilities.md +0 -0
- /package/{dist/docs/public → docs}/guides/dynamic-workflows.md +0 -0
- /package/{dist/docs/public → docs}/guides/frontend/meta.json +0 -0
- /package/{dist/docs/public → docs}/guides/frontend/nextjs.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/frontend/nuxt.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/frontend/overview.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/frontend/sveltekit.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/frontend/use-eve-agent-svelte.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/frontend/use-eve-agent-vue.mdx +0 -0
- /package/{dist/docs/public → docs}/guides/hooks.md +0 -0
- /package/{dist/docs/public → docs}/guides/instrumentation.md +0 -0
- /package/{dist/docs/public → docs}/guides/meta.json +0 -0
- /package/{dist/docs/public → docs}/guides/remote-agents.md +0 -0
- /package/{dist/docs/public → docs}/guides/session-context.md +0 -0
- /package/{dist/docs/public → docs}/guides/state.md +0 -0
- /package/{dist/docs/public → docs}/instructions.mdx +0 -0
- /package/{dist/docs/public → docs}/introduction.md +0 -0
- /package/{dist/docs/public → docs}/meta.json +0 -0
- /package/{dist/docs/public → docs}/reference/meta.json +0 -0
- /package/{dist/docs/public → docs}/reference/project-layout.md +0 -0
- /package/{dist/docs/public → docs}/reference/typescript-api.md +0 -0
- /package/{dist/docs/public → docs}/schedules.mdx +0 -0
- /package/{dist/docs/public → docs}/skills.mdx +0 -0
- /package/{dist/docs/public → docs}/subagents.mdx +0 -0
- /package/{dist/docs/public → docs}/tools.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/connect-a-warehouse.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/first-agent.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/guard-the-spend.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/how-it-runs.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/meta.json +0 -0
- /package/{dist/docs/public → docs}/tutorial/query-sample-data.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/remember-definitions.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/run-analysis.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/ship-it.mdx +0 -0
- /package/{dist/docs/public → docs}/tutorial/team-playbooks.mdx +0 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one option-row painter shared by every picker — the CLI prompts
|
|
3
|
+
* (`prompt-ui.ts`) and the dev TUI flow panel (`setup-panel.ts`). Both surfaces
|
|
4
|
+
* render the same `PromptOption` shape and drive the same `select-state`
|
|
5
|
+
* reducer; this module is the single place the row itself is drawn, so glyphs,
|
|
6
|
+
* state styling, and hint alignment never drift between surfaces again.
|
|
7
|
+
*
|
|
8
|
+
* One glyph column encodes the row's state and the icon changes on hover — the
|
|
9
|
+
* cursor never occupies its own column. Callers supply their own color and
|
|
10
|
+
* glyph primitives (the TUI from its theme, the CLI from picocolors), but the
|
|
11
|
+
* layout and state logic live here.
|
|
12
|
+
*/
|
|
13
|
+
/** The color primitives the row painter needs; satisfied by both the TUI theme and the CLI palette. */
|
|
14
|
+
export interface RowColors {
|
|
15
|
+
dim(text: string): string;
|
|
16
|
+
green(text: string): string;
|
|
17
|
+
cyan(text: string): string;
|
|
18
|
+
yellow(text: string): string;
|
|
19
|
+
}
|
|
20
|
+
/** The glyphs the row painter draws; the TUI passes theme-derived values, the CLI the unicode set. */
|
|
21
|
+
export interface RowGlyphs {
|
|
22
|
+
/** Hover marker — the icon a row changes to under the cursor. */
|
|
23
|
+
pointer: string;
|
|
24
|
+
/** Completed / checked marker. */
|
|
25
|
+
success: string;
|
|
26
|
+
/** Available, un-hovered marker. */
|
|
27
|
+
placeholder: string;
|
|
28
|
+
/** Separator before an inline hint. */
|
|
29
|
+
dot: string;
|
|
30
|
+
}
|
|
31
|
+
/** Canonical unicode glyphs; the CLI prompts render with these. */
|
|
32
|
+
export declare const UNICODE_ROW_GLYPHS: RowGlyphs;
|
|
33
|
+
export type OptionRowState = {
|
|
34
|
+
kind: "available";
|
|
35
|
+
checked: boolean;
|
|
36
|
+
} | {
|
|
37
|
+
kind: "completed";
|
|
38
|
+
} | {
|
|
39
|
+
kind: "disabled";
|
|
40
|
+
reason?: string;
|
|
41
|
+
reasonTone?: "warning";
|
|
42
|
+
} | {
|
|
43
|
+
kind: "locked";
|
|
44
|
+
reason?: string;
|
|
45
|
+
};
|
|
46
|
+
interface OptionRowInput {
|
|
47
|
+
colors: RowColors;
|
|
48
|
+
glyphs: RowGlyphs;
|
|
49
|
+
label: string;
|
|
50
|
+
/** Inline annotation shown whenever the row is in view. */
|
|
51
|
+
hint?: string;
|
|
52
|
+
/** Inline annotation shown only while the cursor is on this row. */
|
|
53
|
+
focusHint?: string;
|
|
54
|
+
isCursor: boolean;
|
|
55
|
+
state: OptionRowState;
|
|
56
|
+
/** Whether an un-hovered, selectable row draws the placeholder glyph. */
|
|
57
|
+
placeholder: boolean;
|
|
58
|
+
/** Spaces inserted before the hint's dot so hints tab-align to a shared column. */
|
|
59
|
+
hintPadding?: number;
|
|
60
|
+
/**
|
|
61
|
+
* Accent for the cursor pointer and active label. Defaults to cyan; "warning"
|
|
62
|
+
* makes them yellow so the pointer matches an attention row (e.g. a required,
|
|
63
|
+
* yellow-labelled action).
|
|
64
|
+
*/
|
|
65
|
+
accent?: "warning";
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Resolves legacy option flags into one render state. The public prompt shape
|
|
69
|
+
* remains ergonomic for callers, while contradictory row semantics fail at
|
|
70
|
+
* this boundary instead of producing a glyph from one flag and a label from
|
|
71
|
+
* another.
|
|
72
|
+
*/
|
|
73
|
+
export declare function resolveOptionRowState(option: {
|
|
74
|
+
disabled?: boolean;
|
|
75
|
+
disabledReason?: string;
|
|
76
|
+
disabledReasonTone?: "warning";
|
|
77
|
+
completed?: boolean;
|
|
78
|
+
locked?: boolean;
|
|
79
|
+
lockedReason?: string;
|
|
80
|
+
}, checked: boolean): OptionRowState;
|
|
81
|
+
/**
|
|
82
|
+
* Paints one option row as `glyph label · hint`. The glyph reflects state with
|
|
83
|
+
* hover taking precedence for focusable rows: available rows use the active
|
|
84
|
+
* pointer, completed and disabled rows use an inert pointer, and locked rows
|
|
85
|
+
* retain their mandatory-selection check. The hint rides the same dot-aligned
|
|
86
|
+
* column for every row, whether it is persistent or cursor-only.
|
|
87
|
+
*/
|
|
88
|
+
export declare function renderOptionRow(input: OptionRowInput): string;
|
|
89
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const UNICODE_ROW_GLYPHS={pointer:`▷`,success:`✓`,placeholder:`◦`,dot:`·`};function resolveOptionRowState(e,t){if(Number(e.disabled===!0)+Number(e.completed===!0)+Number(e.locked===!0)>1)throw Error(`An option row cannot combine disabled, completed, or locked states.`);if(e.disabled===!0){let t={kind:`disabled`};return e.disabledReason!==void 0&&(t.reason=e.disabledReason),e.disabledReasonTone!==void 0&&(t.reasonTone=e.disabledReasonTone),t}if(e.completed===!0)return{kind:`completed`};if(e.locked===!0){let t={kind:`locked`};return e.lockedReason!==void 0&&(t.reason=e.lockedReason),t}return{kind:`available`,checked:t}}function parenthetical(e){return e===void 0?``:` (${e})`}function unfocusedGlyph(e){return e.placeholder?e.colors.dim(e.glyphs.placeholder):` `}function disabledLabel(e,t,n){let r=parenthetical(t.reason);return t.reasonTone===`warning`?`${n.dim(e)}${n.yellow(r)}`:n.dim(`${e}${r}`)}function optionRowPresentation(e){let{colors:t,glyphs:n,state:r}=e,i=e.accent===`warning`?t.yellow:t.cyan;switch(r.kind){case`available`:return e.isCursor?{glyph:i(n.pointer),label:i(e.label)}:{glyph:r.checked?t.green(n.success):unfocusedGlyph(e),label:e.label};case`completed`:return{glyph:e.isCursor?t.dim(n.pointer):t.green(n.success),label:t.dim(e.label)};case`disabled`:return{glyph:e.isCursor?t.dim(n.pointer):unfocusedGlyph(e),label:disabledLabel(e.label,r,t)};case`locked`:return{glyph:t.dim(t.green(n.success)),label:t.dim(`${e.label}${parenthetical(r.reason)}`)}}return r}function renderOptionRow(e){let{colors:t,glyphs:n}=e,{glyph:r,label:i}=optionRowPresentation(e),a=e.hint;e.isCursor&&e.focusHint!==void 0&&(a=e.focusHint);let o=``;return a!==void 0&&(o=t.dim(`${` `.repeat((e.hintPadding??0)+1)}${n.dot} ${a}`)),`${r} ${i}${o}`}export{UNICODE_ROW_GLYPHS,renderOptionRow,resolveOptionRowState};
|
|
@@ -22,14 +22,29 @@ export interface PromptOption<T extends PromptValue> {
|
|
|
22
22
|
label: string;
|
|
23
23
|
/** Short inline annotation shown in parentheses while the option is highlighted. */
|
|
24
24
|
hint?: string;
|
|
25
|
+
/** Short inline annotation shown dimmed only while the cursor is on this row. */
|
|
26
|
+
focusHint?: string;
|
|
25
27
|
/**
|
|
26
28
|
* Longer, display-only explanation shown dimmed on the line below the option
|
|
27
29
|
* while it is highlighted during navigation. It is navigation-only: once a
|
|
28
30
|
* choice is submitted only the label remains.
|
|
29
31
|
*/
|
|
30
32
|
description?: string;
|
|
33
|
+
/** Cursor-pointer/active-label accent; "warning" turns them yellow for an attention row. */
|
|
34
|
+
accent?: "warning";
|
|
31
35
|
disabled?: boolean;
|
|
32
36
|
disabledReason?: string;
|
|
37
|
+
/**
|
|
38
|
+
* "warning" renders the disabled reason in yellow with a dimmed (not struck)
|
|
39
|
+
* label — unavailable here but actionable elsewhere, unlike the default
|
|
40
|
+
* disabled styling, which marks a hard conflict.
|
|
41
|
+
*/
|
|
42
|
+
disabledReasonTone?: "warning";
|
|
43
|
+
/**
|
|
44
|
+
* Completed work: renders with a check and remains cursor-addressable for
|
|
45
|
+
* contextual feedback, but cannot be selected or toggled.
|
|
46
|
+
*/
|
|
47
|
+
completed?: boolean;
|
|
33
48
|
/**
|
|
34
49
|
* Marks a mandatory row that is always selected and cannot be toggled off: the
|
|
35
50
|
* cursor skips it and it renders a dimmed check. Mutually exclusive with
|
|
@@ -107,35 +122,6 @@ export declare function renderSelectPrompt<T extends PromptValue>(input: {
|
|
|
107
122
|
options: readonly PromptOption<T>[];
|
|
108
123
|
state: PromptState;
|
|
109
124
|
}): string;
|
|
110
|
-
/**
|
|
111
|
-
* Renders one option row. A single-select row (`checkbox: false`) is a cursor
|
|
112
|
-
* arrow column followed by the label: a subtle `›` marks the highlighted row
|
|
113
|
-
* and every other row leads with a blank. A multi-select row
|
|
114
|
-
* (`checkbox: true`) adds a checkbox column after the arrow: `◼` (green) when
|
|
115
|
-
* chosen, `◻` (dim) when not, so the marked state and the cursor read
|
|
116
|
-
* independently — `› ◻ label` is the cursor on an unchosen row.
|
|
117
|
-
*
|
|
118
|
-
* A disabled row drops its glyphs and strikes through its dimmed label so the
|
|
119
|
-
* unavailability reads at a glance, then trails `disabledReason` in parentheses.
|
|
120
|
-
* A locked row is the inverse: mandatory rather than unavailable, so it keeps a
|
|
121
|
-
* dimmed checked box (or check, in a single-select) and a dimmed, un-struck
|
|
122
|
-
* label, then trails `lockedReason`. Both reasons stay visible at all times,
|
|
123
|
-
* unlike `hint`, which only shows under the cursor, because the cursor skips
|
|
124
|
-
* disabled and locked rows alike.
|
|
125
|
-
*/
|
|
126
|
-
export declare function renderOptionRow(input: {
|
|
127
|
-
colors: PromptColors;
|
|
128
|
-
label: string;
|
|
129
|
-
hint?: string;
|
|
130
|
-
isCursor: boolean;
|
|
131
|
-
isChecked: boolean;
|
|
132
|
-
/** Multi-select style: arrow column plus checkbox column. */
|
|
133
|
-
checkbox: boolean;
|
|
134
|
-
disabled?: boolean;
|
|
135
|
-
disabledReason?: string;
|
|
136
|
-
locked?: boolean;
|
|
137
|
-
lockedReason?: string;
|
|
138
|
-
}): string;
|
|
139
125
|
/**
|
|
140
126
|
* Renders the virtual Submit row that closes every multi-select list. It has
|
|
141
127
|
* no checkbox — its bold label sits in the checkbox column, trails a green
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{W}from"../../node_modules/.pnpm/@clack_core@1.3.1/node_modules/@clack/core/dist/index.js";const RAIL=`│`,CORNER=`└`;function bulletFor(e,t){switch(e){case`initial`:case`active`:return t.green(`△`);case`submit`:return t.green(`▲`);case`cancel`:return t.gray(`▲`);case`error`:return t.red(`▲`)}}function railFor(e,t){switch(e){case`initial`:case`active`:return t.white(`│`);case`submit`:return t.green(`│`);case`cancel`:return t.gray(`│`);case`error`:return t.red(`│`)}}function cornerFor(e,t){switch(e){case`initial`:case`active`:return t.white(`└`);case`submit`:return t.green(`└`);case`cancel`:return t.gray(`└`);case`error`:return t.red(`└`)}}function formatPromptHeader(e,t,n){return`${n.leadingRail===`green`?n.colors.green(`│`):n.colors.white(`│`)}\n${bulletFor(e,n.colors)} ${t}\n`}function formatPromptSubmission(e,t,n,r){let i=r.leadingRail===`green`?r.colors.green(`│`):r.colors.white(`│`),a=n===``?``:` ${n}`;return`${i}\n${bulletFor(e,r.colors)} ${r.colors.dim(t)}${a}`}function formatPromptOpener(e,t,n){return`\n${n.bold(n.white(`▲`))} ${n.bold(e)}\n ${n.dim(t)}\n${n.white(`│`)}\n`}function formatPromptOutro(e,t){let n=e.replace(/\n/g,`
|
|
1
|
+
import{W}from"../../node_modules/.pnpm/@clack_core@1.3.1/node_modules/@clack/core/dist/index.js";import{UNICODE_ROW_GLYPHS,renderOptionRow,resolveOptionRowState}from"./option-row.js";const RAIL=`│`,CORNER=`└`;function bulletFor(e,t){switch(e){case`initial`:case`active`:return t.green(`△`);case`submit`:return t.green(`▲`);case`cancel`:return t.gray(`▲`);case`error`:return t.red(`▲`)}}function railFor(e,t){switch(e){case`initial`:case`active`:return t.white(`│`);case`submit`:return t.green(`│`);case`cancel`:return t.gray(`│`);case`error`:return t.red(`│`)}}function cornerFor(e,t){switch(e){case`initial`:case`active`:return t.white(`└`);case`submit`:return t.green(`└`);case`cancel`:return t.gray(`└`);case`error`:return t.red(`└`)}}function formatPromptHeader(e,t,n){return`${n.leadingRail===`green`?n.colors.green(`│`):n.colors.white(`│`)}\n${bulletFor(e,n.colors)} ${t}\n`}function formatPromptSubmission(e,t,n,r){let i=r.leadingRail===`green`?r.colors.green(`│`):r.colors.white(`│`),a=n===``?``:` ${n}`;return`${i}\n${bulletFor(e,r.colors)} ${r.colors.dim(t)}${a}`}function formatPromptOpener(e,t,n){return`\n${n.bold(n.white(`▲`))} ${n.bold(e)}\n ${n.dim(t)}\n${n.white(`│`)}\n`}function formatPromptOutro(e,t){let n=e.replace(/\n/g,`
|
|
2
2
|
`);return`${t.green(`│`)}\n${t.green(`●`)} ${n}\n`}function formatPromptCancellation(e,t){let n=e.replace(/\n/g,`
|
|
3
3
|
`);return`${t.red(`│`)}\n${t.red(`●`)} ${t.red(n)}\n`}function formatRailLine(t,n,r){if(t===``)return`${n.green(`│`)}\n`;let i=`${n.green(`│`)} `;return`${t.split(`
|
|
4
4
|
`).map(t=>t===``?n.green(`│`):W(r,t,i)).join(`
|
|
5
|
-
`)}\n`}function renderMultiselectPrompt(e){let t=railFor(e.state,e.colors),n=formatPromptHeader(e.state,e.message,{colors:e.colors,leadingRail:e.leadingRail}),r=new Set(e.selectedValues),i=e.options.some(e=>!e.disabled)?``:`\n${t}\n${t} ${e.colors.dim(`(no channels available to add)`)}`;switch(e.state){case`submit`:{let t=r.size===0?e.colors.dim(`(none selected)`):e.options.filter(e=>r.has(e.value)).map(e=>e.label).join(`, `);return formatPromptSubmission(e.state,e.message,t,{colors:e.colors,leadingRail:e.leadingRail})}case`cancel`:return`${n}${t} ${e.colors.strikethrough(e.colors.dim(`cancelled`))}\n${t}`;case`error`:{let r=renderMultiselectRows({...e,rail:t});return`${n.trim()}\n${t} ${r}${i}\n${cornerFor(e.state,e.colors)} ${e.colors.red(e.error??``)}\n`}case`initial`:case`active`:return`${n}${t} ${renderMultiselectRows({...e,rail:t})}${i}\n${cornerWithNote(cornerFor(e.state,e.colors),e.footerNote)}\n`}}function cornerWithNote(e,t){return t?`${e} ${t}`:e}function renderSelectPrompt(e){let t=railFor(e.state,e.colors),n=formatPromptHeader(e.state,e.message,{colors:e.colors,leadingRail:e.leadingRail}),
|
|
5
|
+
`)}\n`}function renderMultiselectPrompt(e){let t=railFor(e.state,e.colors),n=formatPromptHeader(e.state,e.message,{colors:e.colors,leadingRail:e.leadingRail}),r=new Set(e.selectedValues),i=e.options.some(e=>!e.disabled)?``:`\n${t}\n${t} ${e.colors.dim(`(no channels available to add)`)}`;switch(e.state){case`submit`:{let t=r.size===0?e.colors.dim(`(none selected)`):e.options.filter(e=>r.has(e.value)).map(e=>e.label).join(`, `);return formatPromptSubmission(e.state,e.message,t,{colors:e.colors,leadingRail:e.leadingRail})}case`cancel`:return`${n}${t} ${e.colors.strikethrough(e.colors.dim(`cancelled`))}\n${t}`;case`error`:{let r=renderMultiselectRows({...e,rail:t});return`${n.trim()}\n${t} ${r}${i}\n${cornerFor(e.state,e.colors)} ${e.colors.red(e.error??``)}\n`}case`initial`:case`active`:return`${n}${t} ${renderMultiselectRows({...e,rail:t})}${i}\n${cornerWithNote(cornerFor(e.state,e.colors),e.footerNote)}\n`}}function cornerWithNote(e,t){return t?`${e} ${t}`:e}function renderSelectPrompt(e){let t=railFor(e.state,e.colors),n=formatPromptHeader(e.state,e.message,{colors:e.colors,leadingRail:e.leadingRail}),r=e.options[e.cursor];switch(e.state){case`submit`:{let t=r?r.label:``;return formatPromptSubmission(e.state,e.message,t,{colors:e.colors,leadingRail:e.leadingRail})}case`cancel`:return`${n}${t} ${r?e.colors.strikethrough(e.colors.dim(r.label)):``}\n${t}`;case`initial`:case`active`:case`error`:{let r=labelColumnWidth(e.options);return`${n}${t} ${e.options.map((n,i)=>{let a=i===e.cursor;return`${optionRow(n,{colors:e.colors,isCursor:a,isChecked:!1,placeholder:!1,hintPadding:r-n.label.length})}${descriptionLine(n,a,t,e.colors)}`}).join(`\n${t} `)}\n${cornerWithNote(cornerFor(e.state,e.colors),e.footerNote)}\n`}}}function labelColumnWidth(e){return e.reduce((e,t)=>Math.max(e,t.label.length),0)}function optionRow(e,i){return renderOptionRow({colors:i.colors,glyphs:UNICODE_ROW_GLYPHS,label:e.label,hint:e.hint,focusHint:e.focusHint,accent:e.accent,isCursor:i.isCursor,state:resolveOptionRowState(e,i.isChecked),placeholder:i.placeholder,hintPadding:i.hintPadding})}function descriptionLine(e,t,n,r){return t&&e.description&&!e.disabled?`\n${n} ${r.dim(e.description)}`:``}function renderSubmitRow(e,n,r=`Submit`){let i=e?n.cyan(UNICODE_ROW_GLYPHS.pointer):` `,a=n.bold(r);return`${i} ${e?a:n.dim(a)} ${n.green(UNICODE_ROW_GLYPHS.success)}`}function renderMultiselectRows(e){let t=new Set(e.selectedValues),n=labelColumnWidth(e.options),r=e.options.map((r,i)=>{let a=i===e.cursor;return`${optionRow(r,{colors:e.colors,isCursor:a,isChecked:t.has(r.value),placeholder:!0,hintPadding:n-r.label.length})}${descriptionLine(r,a,e.rail,e.colors)}`}).join(`\n${e.rail} `),i=renderSubmitRow(e.cursor===e.options.length,e.colors,e.submitLabel);return`${r}\n${e.rail}\n${e.rail} ${i}`}function searchableHelpLine(e,t,n){let r=(n?[[t.cyan(`type`),`to filter`]]:[[t.cyan(`type`),`to filter`],[t.cyan(`enter`),`to select`]]).map(([e,n])=>`${e}${t.dim(` ${n}`)}`).join(t.dim(` · `));return`\n${e} ${t.dim(`(`)}${r}${t.dim(`)`)}`}function renderSearchableSelect(e){let{colors:t}=e,n=railFor(e.state,t),r=formatPromptHeader(e.state,e.message,{colors:t,leadingRail:e.leadingRail});if(e.state===`submit`)return formatPromptSubmission(e.state,e.message,e.submitDisplay,{colors:t,leadingRail:e.leadingRail});if(e.state===`cancel`)return`${r}${n} ${t.strikethrough(t.dim(e.filter))}${e.filter.trim()?`\n${n}`:``}`;let i=new Set(e.selectedValues),a=0;for(;e.options[a]?.featured;)a+=1;let o=e.viewSize??8,s=e.filter===``&&a>0?Math.min(a,o):o,c=e.multiple&&e.cursor>=e.options.length,l=!c&&e.cursor>=e.options.length?0:e.cursor,u=t.inverse(` `);e.filter.length>0?u=e.filter+t.inverse(` `):e.placeholder&&(u=t.dim(e.placeholder));let d=Math.max(0,Math.min(l-Math.floor(s/2),Math.max(0,e.options.length-s))),f=Math.min(d+s,e.options.length),p=e.options.slice(d,f),m=labelColumnWidth(p),h=p.length===0?t.dim(`(no matches)`):p.map((r,a)=>{let o=!c&&a+d===l;return`${optionRow(r,{colors:t,isCursor:o,isChecked:e.multiple&&i.has(r.value),placeholder:!1,hintPadding:m-r.label.length})}${descriptionLine(r,o,n,t)}`}).join(`\n${n} `),g=e.multiple?`\n${n}\n${n} ${renderSubmitRow(c,t,e.submitLabel)}`:``,_=e.options.length>p.length?`\n${n} ${t.dim(`↑↓ ${e.options.length} options, showing ${d+1}–${f}`)}`:``,v=searchableHelpLine(n,t,e.multiple),y=`${n} ${t.dim(` `)} ${u}\n${n} ${h}${g}${_}${v}`;return e.state===`error`?`${r.trim()}\n${y}\n${cornerFor(e.state,t)} ${t.red(e.error??``)}\n`:`${r}${y}\n${cornerWithNote(cornerFor(e.state,t),e.footerNote)}\n`}export{CORNER,RAIL,bulletFor,cornerFor,formatPromptCancellation,formatPromptHeader,formatPromptOpener,formatPromptOutro,formatPromptSubmission,formatRailLine,railFor,renderMultiselectPrompt,renderSearchableSelect,renderSelectPrompt,renderSubmitRow};
|
|
@@ -43,9 +43,10 @@ export declare class SelectComponent extends Prompt<string | string[]> {
|
|
|
43
43
|
*/
|
|
44
44
|
submitLabel(): "Submit" | "Skip";
|
|
45
45
|
/**
|
|
46
|
-
* Enter resolves
|
|
47
|
-
*
|
|
48
|
-
* so enter can never accidentally skip the
|
|
46
|
+
* Enter resolves an actionable single-select row; completed rows are
|
|
47
|
+
* focus-only. A multi-select resolves only from its Submit row — on any
|
|
48
|
+
* option row it toggles instead, so enter can never accidentally skip the
|
|
49
|
+
* checklist.
|
|
49
50
|
*/
|
|
50
51
|
protected _shouldSubmit(): boolean;
|
|
51
52
|
/** Values that should render as chosen: the marked set, or the cursor for single. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{m,q}from"../../node_modules/.pnpm/@clack_core@1.3.1/node_modules/@clack/core/dist/index.js";import{renderMultiselectPrompt,renderSearchableSelect,renderSelectPrompt}from"./prompt-ui.js";import{createSelectOptionCodec}from"./select-option-codec.js";import{filterOptions,initialSelectState,orderedSelection,reduceSelect,selectValueAtCursor,submitRowIndex}from"./select-state.js";var import_picocolors=__toESM(require_picocolors(),1);function toPromptState(e){return e}var SelectComponent=class extends m{options;multiple;search;required;filter=``;optionCursor=0;selectedSet=new Set;constructor(e){super({render:e.render,validate:()=>this.submitError()},!1),this.options=e.options,this.multiple=e.multiple,this.search=e.search,this.required=e.required,this.filter=e.initial.filter,this.optionCursor=e.initial.cursor,this.selectedSet=e.initial.selected,this.refreshValue(),this.on(`key`,(e,t)=>{if(this.multiple&&t?.name===`space`){this.apply({type:`toggle`});return}if(this.search){if(t?.name===`backspace`||e===``||e===`\b`){this.apply({type:`backspace`});return}e!==void 0&&e.length===1&&e>=` `&&e!==``&&this.apply({type:`char`,char:e})}}),this.on(`cursor`,e=>{e===`up`||e===`left`?this.apply({type:`up`}):(e===`down`||e===`right`)&&this.apply({type:`down`})})}visibleOptions(){return filterOptions(this.options,this.filter)}onSubmitRow(){return this.multiple&&this.optionCursor===submitRowIndex(this.visibleOptions())}submitLabel(){if(this.required)return`Submit`;let e=new Set(this.options.filter(e=>e.locked).map(e=>e.value));return[...this.selectedSet].some(t=>!e.has(t))?`Submit`:`Skip`}_shouldSubmit(){return
|
|
1
|
+
import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{m,q}from"../../node_modules/.pnpm/@clack_core@1.3.1/node_modules/@clack/core/dist/index.js";import{renderMultiselectPrompt,renderSearchableSelect,renderSelectPrompt}from"./prompt-ui.js";import{createSelectOptionCodec}from"./select-option-codec.js";import{filterOptions,initialSelectState,orderedSelection,reduceSelect,selectValueAtCursor,submitRowIndex}from"./select-state.js";var import_picocolors=__toESM(require_picocolors(),1);function toPromptState(e){return e}var SelectComponent=class extends m{options;multiple;search;required;filter=``;optionCursor=0;selectedSet=new Set;constructor(e){super({render:e.render,validate:()=>this.submitError()},!1),this.options=e.options,this.multiple=e.multiple,this.search=e.search,this.required=e.required,this.filter=e.initial.filter,this.optionCursor=e.initial.cursor,this.selectedSet=e.initial.selected,this.refreshValue(),this.on(`key`,(e,t)=>{if(this.multiple&&t?.name===`space`){this.apply({type:`toggle`});return}if(this.search){if(t?.name===`backspace`||e===``||e===`\b`){this.apply({type:`backspace`});return}e!==void 0&&e.length===1&&e>=` `&&e!==``&&this.apply({type:`char`,char:e})}}),this.on(`cursor`,e=>{e===`up`||e===`left`?this.apply({type:`up`}):(e===`down`||e===`right`)&&this.apply({type:`down`})})}visibleOptions(){return filterOptions(this.options,this.filter)}onSubmitRow(){return this.multiple&&this.optionCursor===submitRowIndex(this.visibleOptions())}submitLabel(){if(this.required)return`Submit`;let e=new Set(this.options.filter(e=>e.locked).map(e=>e.value));return[...this.selectedSet].some(t=>!e.has(t))?`Submit`:`Skip`}_shouldSubmit(){return this.multiple?this.onSubmitRow()?!0:(this.apply({type:`toggle`}),!1):this.visibleOptions()[this.optionCursor]?.completed!==!0}selectedValues(){if(this.multiple)return orderedSelection(this.options,this.selectedSet);let e=selectValueAtCursor(this.visibleOptions(),this.optionCursor);return e===void 0?[]:[e]}submitDisplay(){if(this.multiple){let e=this.options.filter(e=>this.selectedSet.has(e.value)).map(e=>e.label);return e.length>0?e.join(`, `):import_picocolors.default.dim(`(none selected)`)}let e=selectValueAtCursor(this.visibleOptions(),this.optionCursor);return e===void 0?``:this.labelForValue(e)}labelForValue(e){return this.options.find(t=>t.value===e)?.label??e}submitError(){return this.multiple?this.required&&this.selectedSet.size===0?`Select at least one option, then press enter.`:void 0:selectValueAtCursor(this.visibleOptions(),this.optionCursor)===void 0?`Type to match an option, then press enter.`:void 0}apply(e){let t=reduceSelect({filter:this.filter,cursor:this.optionCursor,selected:this.selectedSet},e,{options:this.options,submitRow:this.multiple});this.filter=t.filter,this.optionCursor=t.cursor,this.selectedSet=t.selected,this.refreshValue()}refreshValue(){this.value=this.multiple?orderedSelection(this.options,this.selectedSet):selectValueAtCursor(this.visibleOptions(),this.optionCursor)}};function renderSelectComponent(e,t,n,r){let s=toPromptState(e.state);return e.search?renderSearchableSelect({colors:import_picocolors.default,state:s,leadingRail:n,message:t.message,multiple:e.multiple,filter:e.filter,placeholder:t.placeholder,options:e.visibleOptions(),cursor:e.optionCursor,selectedValues:e.selectedValues(),submitDisplay:e.submitDisplay(),footerNote:r,error:e.error,submitLabel:e.submitLabel()}):e.multiple?renderMultiselectPrompt({colors:import_picocolors.default,cursor:e.optionCursor,error:e.error,footerNote:r,leadingRail:n,message:t.message,options:e.options,selectedValues:e.selectedValues(),state:s,submitLabel:e.submitLabel()}):renderSelectPrompt({colors:import_picocolors.default,cursor:e.optionCursor,footerNote:r,leadingRail:n,message:t.message,options:e.options,state:s})}async function runSelectComponent(e){let t=createSelectOptionCodec(e.options),n=initialSelectState({options:t.options,defaultValue:e.defaultValue===void 0?void 0:t.encode(e.defaultValue),initialValues:e.initialValues?.map(e=>t.encode(e)),submitRow:e.multiple}),i,a,o=new SelectComponent({options:t.options,multiple:e.multiple,search:e.search,required:e.required,initial:n,render(){return i?renderSelectComponent(i,{message:e.message,placeholder:e.placeholder},e.leadingRail,a?.note()):``}});i=o,a=e.attachGuard?.(o);let c=await o.prompt();if(q(c))return c;if(c===void 0)throw Error(`Select prompt returned no value.`);return Array.isArray(c)?c.map(e=>t.decode(e)):t.decode(c)}export{SelectComponent,runSelectComponent};
|
|
@@ -37,7 +37,7 @@ export interface SelectContext {
|
|
|
37
37
|
/** Cursor index of the virtual Submit row: one past the visible options. */
|
|
38
38
|
export declare function submitRowIndex(visible: readonly PromptOption<string>[]): number;
|
|
39
39
|
/**
|
|
40
|
-
* Case-insensitive substring match across an option's label, value, and
|
|
40
|
+
* Case-insensitive substring match across an option's label, value, and hints.
|
|
41
41
|
* An empty query returns every option, so the cursor can always scroll the
|
|
42
42
|
* full list; `featured` only shapes the searchable picker's default viewport,
|
|
43
43
|
* not which rows exist.
|
|
@@ -54,7 +54,7 @@ export declare function filterOptions(options: readonly PromptOption<string>[],
|
|
|
54
54
|
export declare function reduceSelect(state: SelectState, event: SelectEvent, context: SelectContext): SelectState;
|
|
55
55
|
/**
|
|
56
56
|
* Computes the starting state. The cursor lands on `defaultValue` when it
|
|
57
|
-
* matches a
|
|
57
|
+
* matches a focusable entry, otherwise on the first focusable entry.
|
|
58
58
|
* `initialValues` seed a multi-select's marked set, as do any `locked` options:
|
|
59
59
|
* locked rows are mandatory, so they start selected and the reducer refuses to
|
|
60
60
|
* unmark them.
|
|
@@ -66,7 +66,7 @@ export declare function initialSelectState(input: {
|
|
|
66
66
|
initialValues?: readonly string[];
|
|
67
67
|
submitRow?: boolean;
|
|
68
68
|
}): SelectState;
|
|
69
|
-
/** Value of the highlighted entry, or `undefined`
|
|
69
|
+
/** Value of the highlighted actionable entry, or `undefined` otherwise. */
|
|
70
70
|
export declare function selectValueAtCursor(visible: readonly PromptOption<string>[], cursor: number): string | undefined;
|
|
71
71
|
/** Marked values, ordered to match the option list rather than toggle order. */
|
|
72
72
|
export declare function orderedSelection(options: readonly PromptOption<string>[], selected: ReadonlySet<string>): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function submitRowIndex(e){return e.length}function filterOptions(e,t){let n=t.trim().toLowerCase();return n===``?[...e]:e.filter(e=>e.label.toLowerCase().includes(n)||e.value.toLowerCase().includes(n)||(e.hint?.toLowerCase().includes(n)??!1))}function
|
|
1
|
+
function submitRowIndex(e){return e.length}function filterOptions(e,t){let n=t.trim().toLowerCase();return n===``?[...e]:e.filter(e=>e.label.toLowerCase().includes(n)||e.value.toLowerCase().includes(n)||(e.hint?.toLowerCase().includes(n)??!1)||(e.focusHint?.toLowerCase().includes(n)??!1))}function isFocusable(e){return!e.disabled&&!e.locked}function isActionable(e){return isFocusable(e)&&!e.completed}function firstFocusableIndex(e,t){let n=e.findIndex(isFocusable);return n>=0?n:t?submitRowIndex(e):0}function stepCursor(e,t,n,r){let i=e.length+ +!!r;if(i===0)return t;let a=t;for(let t=0;t<i;t+=1){if(a=(a+n+i)%i,r&&a===submitRowIndex(e))return a;let t=e[a];if(t&&isFocusable(t))return a}return t}function reduceSelect(e,t,n){let r=n.submitRow===!0;switch(t.type){case`char`:{let i=e.filter+t.char;return{...e,filter:i,cursor:firstFocusableIndex(filterOptions(n.options,i),r)}}case`backspace`:{if(e.filter.length===0)return e;let t=e.filter.slice(0,-1);return{...e,filter:t,cursor:firstFocusableIndex(filterOptions(n.options,t),r)}}case`up`:case`down`:{let i=filterOptions(n.options,e.filter),a=t.type===`up`?-1:1,o=stepCursor(i,e.cursor,a,r);return o===e.cursor?e:{...e,cursor:o}}case`toggle`:{let t=filterOptions(n.options,e.filter)[e.cursor];if(t===void 0||!isActionable(t))return e;let r=new Set(e.selected);return r.has(t.value)?r.delete(t.value):r.add(t.value),{...e,selected:r}}}}function initialSelectState(e){let t=e.filter??``,n=filterOptions(e.options,t),r=firstFocusableIndex(n,e.submitRow===!0);if(e.defaultValue!==void 0){let t=n.findIndex(t=>isFocusable(t)&&t.value===e.defaultValue);t>=0&&(r=t)}let i=e.options.filter(e=>e.locked).map(e=>e.value);return{filter:t,cursor:r,selected:new Set([...e.initialValues??[],...i])}}function selectValueAtCursor(e,t){let n=e[t];return n&&isActionable(n)?n.value:void 0}function orderedSelection(e,t){return e.filter(e=>t.has(e.value)).map(e=>e.value)}export{filterOptions,initialSelectState,orderedSelection,reduceSelect,selectValueAtCursor,submitRowIndex};
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { type AddChannelsDeps } from "../boxes/add-channels.js";
|
|
2
|
-
import { type LinkProjectDeps } from "../boxes/link-project.js";
|
|
3
|
-
import { type ResolveProvisioningDeps } from "../boxes/resolve-provisioning.js";
|
|
4
2
|
import { inspectExistingChannelRegistrations } from "../channel-add-conflicts.js";
|
|
5
3
|
import { detectDeployment } from "../project-resolution.js";
|
|
6
4
|
import type { Prompter } from "../prompter.js";
|
|
@@ -9,35 +7,52 @@ export interface ChannelsFlowDeps {
|
|
|
9
7
|
detectDeployment: typeof detectDeployment;
|
|
10
8
|
inspectExistingChannelRegistrations: typeof inspectExistingChannelRegistrations;
|
|
11
9
|
addChannels?: AddChannelsDeps;
|
|
12
|
-
resolveProvisioning?: ResolveProvisioningDeps;
|
|
13
|
-
linkProject?: LinkProjectDeps;
|
|
14
10
|
}
|
|
15
11
|
export type ChannelsFlowResult = {
|
|
16
12
|
kind: "done";
|
|
17
13
|
addedChannels: readonly string[];
|
|
14
|
+
} | {
|
|
15
|
+
/**
|
|
16
|
+
* The user chose "Deploy and chat" on the post-Slack "See it live"
|
|
17
|
+
* prompt. The caller deploys, then points them at this workspace.
|
|
18
|
+
*/
|
|
19
|
+
kind: "deploy-and-chat";
|
|
20
|
+
addedChannels: readonly string[];
|
|
21
|
+
chat: {
|
|
22
|
+
chatUrl?: string;
|
|
23
|
+
workspaceName?: string;
|
|
24
|
+
};
|
|
18
25
|
} | {
|
|
19
26
|
kind: "cancelled";
|
|
27
|
+
} | {
|
|
28
|
+
kind: "failed";
|
|
29
|
+
addedChannels: readonly string[];
|
|
30
|
+
message: string;
|
|
20
31
|
};
|
|
32
|
+
/** The post-Slack "see it live" chooser's title. */
|
|
33
|
+
export declare const SEE_IT_LIVE_MESSAGE = "See it live";
|
|
21
34
|
/**
|
|
22
|
-
* THE CHANNELS FLOW for the dev TUI's `/channels`:
|
|
35
|
+
* THE CHANNELS FLOW for the dev TUI's `/channels`: a task list that loops.
|
|
23
36
|
* Pick an unregistered channel, run its add sub-flow (Slack provisioning
|
|
24
|
-
* included), and land back on the repainted list
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
37
|
+
* included), and land back on the repainted list with that channel checked;
|
|
38
|
+
* "Done" or Esc leaves. Filesystem effects can land before the runner applies
|
|
39
|
+
* their in-memory payload, so every cancelled or failed sub-flow re-inspects
|
|
40
|
+
* authored registrations and preserves a channel that became durable. Esc on
|
|
41
|
+
* the list after something was added reports the additions exactly like Done;
|
|
42
|
+
* only an empty exit folds to cancelled.
|
|
29
43
|
*
|
|
30
44
|
* Each pick reuses the `eve channels add` composition — the same conflict
|
|
31
45
|
* validation, Vercel services config pinned on, and the default empty agent
|
|
32
46
|
* name (the Slack connector slug falls back to the package.json name) — with
|
|
33
47
|
* two TUI-specific differences: no trailing deploy box (the TUI exposes
|
|
34
|
-
* `/deploy` as its own command), and
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
48
|
+
* `/deploy` as its own command), and no inline link pickers — channels that
|
|
49
|
+
* provision against the Vercel project render disabled with a warning
|
|
50
|
+
* pointing at /model while the directory is unlinked, so a pick can never
|
|
51
|
+
* reach provisioning without a link.
|
|
38
52
|
*/
|
|
39
53
|
export declare function runChannelsFlow(input: {
|
|
40
54
|
appRoot: string;
|
|
41
55
|
prompter: Prompter;
|
|
56
|
+
signal?: AbortSignal;
|
|
42
57
|
deps?: Partial<ChannelsFlowDeps>;
|
|
43
58
|
}): Promise<ChannelsFlowResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{interactiveAsker
|
|
1
|
+
import{interactiveAsker}from"../ask.js";import{detectDeployment,isProjectResolved,projectResolutionFromDeployment}from"../project-resolution.js";import{createDefaultSetupState,snapshotSetupState}from"../state.js";import{WizardCancelledError}from"../step.js";import{addChannels}from"../boxes/add-channels.js";import{CHANNELS_PROMPT_MESSAGE,selectChannels}from"../boxes/select-channels.js";import{assertCanAddSelectedChannels,inspectExistingChannelRegistrations}from"../channel-add-conflicts.js";import{runInteractive}from"../runner.js";import{prompterSink}from"./in-project.js";import{SCAFFOLDABLE_CHANNELS}from"#setup/scaffold/index.js";import{toErrorMessage}from"#shared/errors.js";const SEE_IT_LIVE_MESSAGE=`See it live`;async function promptSeeItLive(e){try{return await e.select({message:SEE_IT_LIVE_MESSAGE,options:[{value:`deploy`,label:`Deploy and chat`},{value:`later`,label:`Later`}]})}catch(e){if(e instanceof WizardCancelledError)return`later`;throw e}}function channelAlreadyAdded(e,t){return t===`web`?e.webAppPresent:e.slackOwners.length>0}function appendChannel(e,t){return e.includes(t)?[...e]:[...e,t]}async function pickChannel(e,t,n){let r=channelListRows(t,n),i=!r.some(e=>e.value!==`done`&&e.completed!==!0&&e.disabled!==!0),a={message:CHANNELS_PROMPT_MESSAGE,options:r,hintLayout:`inline`};i&&(a.initialValue=`done`);try{return{kind:`picked`,value:await e.select(a)}}catch(e){if(e instanceof WizardCancelledError)return{kind:`cancelled`};throw e}}function channelLandedDuringSubflow(e,t,n){return!channelAlreadyAdded(e,n)&&channelAlreadyAdded(t,n)}function deployAndChatDetails(e){let t={};return e.slackChatUrl!==void 0&&(t.chatUrl=e.slackChatUrl),e.slackWorkspaceName!==void 0&&(t.workspaceName=e.slackWorkspaceName),t}function channelListRows(e,t){let n=[{value:`repl`,label:`Terminal UI`,completed:!0,focusHint:`Already installed`}];for(let r of SCAFFOLDABLE_CHANNELS){if(channelAlreadyAdded(e,r.kind)){n.push({value:r.kind,label:r.label,completed:!0,focusHint:`Already installed`});continue}let i=e.disabledChannelReasons[r.kind];if(i!==void 0){n.push({value:r.kind,label:r.label,disabled:!0,disabledReason:i});continue}if(r.requiresVercelProject===!0&&!t){n.push({value:r.kind,label:r.label,disabled:!0,disabledReason:`Requires Vercel account, see /model`,disabledReasonTone:`warning`});continue}let a={value:r.kind,label:r.label};r.hint!==void 0&&(a.hint=r.hint),n.push(a)}return n.push({value:`done`,label:`Done`}),n}async function runChannelsFlow(o){let{appRoot:s,prompter:c,signal:l}=o,u={detectDeployment,inspectExistingChannelRegistrations,...o.deps};async function checkProject(e){let t=c.log.spinner?.(`Checking the project…`);try{return await e()}finally{t?.stop()}}let[d,f]=await checkProject(()=>Promise.all([l===void 0?u.detectDeployment(s):u.detectDeployment(s,{signal:l}),u.inspectExistingChannelRegistrations(s)]));l?.throwIfAborted();let p=f,m={...createDefaultSetupState(),project:projectResolutionFromDeployment(d),projectPath:{kind:`resolved`,inPlace:!0,path:s}},h;for(;;){let t=await pickChannel(c,p,isProjectResolved(m.project));if(t.kind===`cancelled`){if(m.channels.length===0)return{kind:`cancelled`};break}let r=t.value;if(r===`done`)break;if(r===`repl`||channelAlreadyAdded(p,r))continue;let i=[selectChannels({asker:interactiveAsker(c),variant:`channels-add`,presetChannels:[r],validateSelection:e=>assertCanAddSelectedChannels(e,p)}),addChannels({asker:interactiveAsker(c),prompter:c,configureVercelServices:!0,deps:u.addChannels})],o;try{o=await runInteractive(i,m,prompterSink(c),{snapshot:snapshotSetupState,signal:l})}catch(e){let t=await checkProject(()=>u.inspectExistingChannelRegistrations(s));if(channelLandedDuringSubflow(p,t,r)){if(m={...m,channels:appendChannel(m.channels,r)},p=t,h=toErrorMessage(e),l?.aborted===!0)break;continue}throw e}if(o.kind===`done`){if(m=o.state,p=await checkProject(()=>u.inspectExistingChannelRegistrations(s)),l?.throwIfAborted(),r===`slack`&&m.slackbotAttached&&await promptSeeItLive(c)===`deploy`)return{kind:`deploy-and-chat`,addedChannels:m.channels,chat:deployAndChatDetails(m)}}else{let e=await checkProject(()=>u.inspectExistingChannelRegistrations(s));if(channelLandedDuringSubflow(p,e,r))return{kind:`done`,addedChannels:appendChannel(m.channels,r)};p=e}}return h===void 0?{kind:`done`,addedChannels:m.channels}:{kind:`failed`,addedChannels:m.channels,message:h}}export{SEE_IT_LIVE_MESSAGE,runChannelsFlow};
|
|
@@ -34,6 +34,7 @@ export type DeployFlowResult = {
|
|
|
34
34
|
export declare function runDeployFlow(input: {
|
|
35
35
|
appRoot: string;
|
|
36
36
|
prompter: Prompter;
|
|
37
|
+
signal?: AbortSignal;
|
|
37
38
|
/** False when no TTY: an unlinked directory refuses instead of prompting. */
|
|
38
39
|
interactive: boolean;
|
|
39
40
|
deps?: Partial<DeployFlowDeps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{interactiveAsker,withAnswers}from"../ask.js";import{detectDeployment,isProjectResolved,projectResolutionFromDeployment}from"../project-resolution.js";import{snapshotSetupState}from"../state.js";import{deployProject}from"../boxes/deploy-project.js";import{linkVercelProject}from"../boxes/link-project.js";import{resolveProvisioning}from"../boxes/resolve-provisioning.js";import{runHeadless,runInteractive}from"../runner.js";import{inProjectSetupState,prompterSink}from"./in-project.js";function productionUrlOf(e){return e.kind===`deployed`?e.productionUrl:void 0}async function runDeployFlow(t){let{appRoot:n,prompter:r,interactive:i}=t,
|
|
1
|
+
import{interactiveAsker,withAnswers}from"../ask.js";import{detectDeployment,isProjectResolved,projectResolutionFromDeployment}from"../project-resolution.js";import{snapshotSetupState}from"../state.js";import{deployProject}from"../boxes/deploy-project.js";import{linkVercelProject}from"../boxes/link-project.js";import{resolveProvisioning}from"../boxes/resolve-provisioning.js";import{runHeadless,runInteractive}from"../runner.js";import{inProjectSetupState,prompterSink}from"./in-project.js";function productionUrlOf(e){return e.kind===`deployed`?e.productionUrl:void 0}async function runDeployFlow(t){let{appRoot:n,prompter:r,interactive:i,signal:a}=t,o={detectDeployment,...t.deps},s=r.log.spinner?.(`Checking the current Vercel link...`),c;try{let e=a===void 0?await o.detectDeployment(n):await o.detectDeployment(n,{signal:a});a?.throwIfAborted(),c=projectResolutionFromDeployment(e)}finally{s?.stop()}let l=isProjectResolved(c);if(!l&&!i)return{kind:`needs-link`};let u=inProjectSetupState(n,c,{deploymentPending:!0}),d=l?[deployProject({prompter:r,headless:!i,deps:o.deployProject})]:[resolveProvisioning({asker:withAnswers({deploy:`vercel`})(interactiveAsker(r)),prompter:r,targetDirectory:n,mode:{headless:!1},deps:o.resolveProvisioning}),linkVercelProject({prompter:r,deps:o.linkProject}),deployProject({prompter:r,headless:!i,deps:o.deployProject})],f=prompterSink(r);if(!i)return{kind:`deployed`,productionUrl:productionUrlOf((await runHeadless(d,u,f,{snapshot:snapshotSetupState,signal:a})).project)};let p=await runInteractive(d,u,f,{snapshot:snapshotSetupState,signal:a});return p.kind===`cancelled`?{kind:`cancelled`}:{kind:`deployed`,productionUrl:productionUrlOf(p.state.project)}}export{runDeployFlow};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{interactiveAsker,withAnswers}from"../ask.js";import{detectProjectIdentity}from"../project-resolution.js";import{snapshotSetupState}from"../state.js";import{detectAiGateway,findEnvFileWithKey}from"../boxes/detect-ai-gateway.js";import{applyAiGatewayCredential}from"../boxes/apply-ai-gateway-credential.js";import{linkVercelProject}from"../boxes/link-project.js";import{resolveProvisioning}from"../boxes/resolve-provisioning.js";import{
|
|
1
|
+
import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{interactiveAsker,withAnswers}from"../ask.js";import{detectProjectIdentity}from"../project-resolution.js";import{snapshotSetupState}from"../state.js";import{WizardCancelledError}from"../step.js";import{detectAiGateway,findEnvFileWithKey}from"../boxes/detect-ai-gateway.js";import{applyAiGatewayCredential}from"../boxes/apply-ai-gateway-credential.js";import{linkVercelProject}from"../boxes/link-project.js";import{resolveProvisioning}from"../boxes/resolve-provisioning.js";import{runInteractive}from"../runner.js";import{inProjectSetupState,prompterSink}from"./in-project.js";var import_picocolors=__toESM(require_picocolors(),1);async function runLinkFlow(e){let{appRoot:t,prompter:i,signal:a}=e,o={detectProjectIdentity,findEnvFileWithKey,...e.deps},s=i.log.spinner?.(`Checking the current Vercel link...`),c;try{c=a===void 0?await o.detectProjectIdentity(t):await o.detectProjectIdentity(t,{signal:a}),a?.throwIfAborted()}finally{s?.stop()}if(c===void 0){let[e,n]=await Promise.all([o.findEnvFileWithKey(t,`AI_GATEWAY_API_KEY`),o.findEnvFileWithKey(t,`VERCEL_OIDC_TOKEN`)]),r=e??n;r!==void 0&&i.log.message(`This directory is not linked to a Vercel project yet — the model currently runs on credentials from ${r}.`)}else{let e=c.teamName===void 0?import_picocolors.default.bold(c.projectName):`${import_picocolors.default.bold(c.projectName)} in ${import_picocolors.default.bold(c.teamName)}`;try{if(await i.select({message:`This directory is already linked to\n${e}`,options:[{value:`relink`,label:`Link to another project`},{value:`dismiss`,label:`Dismiss`}]})===`dismiss`)return{kind:`cancelled`}}catch(e){if(e instanceof WizardCancelledError)return{kind:`cancelled`};throw e}}let l=inProjectSetupState(t,{kind:`unresolved`});if((await runInteractive([resolveProvisioning({asker:withAnswers({deploy:`vercel`})(interactiveAsker(i)),prompter:i,targetDirectory:t,mode:{headless:!1},adoptExistingLink:!1,projectSelection:`existing-only`,deps:o.resolveProvisioning}),linkVercelProject({prompter:i,deps:o.linkProject}),detectAiGateway(),applyAiGatewayCredential({prompter:i,deps:o.applyAiGatewayCredential})],l,prompterSink(i),{snapshot:snapshotSetupState,signal:a})).kind===`cancelled`)return{kind:`cancelled`};let[u,d]=await Promise.all([o.findEnvFileWithKey(t,`VERCEL_OIDC_TOKEN`),o.findEnvFileWithKey(t,`AI_GATEWAY_API_KEY`)]);a?.throwIfAborted(),u===void 0&&d===void 0&&i.log.warning("Linked, but no model credential landed in an env file (VERCEL_OIDC_TOKEN or AI_GATEWAY_API_KEY). Run `vercel env pull` once the project has AI Gateway access.");let f={kind:`done`};return u===void 0?d!==void 0&&(f.credential=`AI_GATEWAY_API_KEY`):f.credential=`VERCEL_OIDC_TOKEN`,f}export{runLinkFlow};
|
|
@@ -1,10 +1,26 @@
|
|
|
1
1
|
import { type SelectModelDeps } from "../boxes/select-model.js";
|
|
2
|
+
import { type ProjectDetectionOptions } from "../project-resolution.js";
|
|
3
|
+
import type { ModelRouting } from "#shared/agent-definition.js";
|
|
2
4
|
import type { Prompter } from "../prompter.js";
|
|
3
5
|
import { runVercelFlow } from "./vercel.js";
|
|
6
|
+
/** The current model id, its routing, and whether `/model` can rewrite it. */
|
|
7
|
+
export interface CurrentAgentModel {
|
|
8
|
+
id: string | null;
|
|
9
|
+
routing: ModelRouting | null;
|
|
10
|
+
/**
|
|
11
|
+
* The authored `model` is a string the source editor can rewrite. False for a
|
|
12
|
+
* source-backed SDK model call (`gateway(...)`, `anthropic(...)`), which is
|
|
13
|
+
* not a string literal — independent of how the model routes.
|
|
14
|
+
*/
|
|
15
|
+
editable: boolean;
|
|
16
|
+
}
|
|
4
17
|
/** Injected for tests; defaults to the real reads, fetches, and source edit. */
|
|
5
18
|
export interface ModelFlowDeps {
|
|
6
|
-
/**
|
|
7
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Reads the model the runtime currently serves and how it routes; both null
|
|
21
|
+
* before the first compile.
|
|
22
|
+
*/
|
|
23
|
+
readCurrentModel: (appRoot: string) => Promise<CurrentAgentModel>;
|
|
8
24
|
/** Applies the picked slug to authored source. */
|
|
9
25
|
applyModel: (input: {
|
|
10
26
|
appRoot: string;
|
|
@@ -13,7 +29,7 @@ export interface ModelFlowDeps {
|
|
|
13
29
|
/** Catalog fetch behind the shared model picker. */
|
|
14
30
|
selectModel?: SelectModelDeps;
|
|
15
31
|
/** Reads how the model is backed right now, for the menu's provider row. */
|
|
16
|
-
detectProviderStatus:
|
|
32
|
+
detectProviderStatus: typeof detectModelProviderStatus;
|
|
17
33
|
/** The provider sub-flow behind the menu's provider row. */
|
|
18
34
|
runVercelFlow: typeof runVercelFlow;
|
|
19
35
|
}
|
|
@@ -55,14 +71,14 @@ export type ModelFlowResult = {
|
|
|
55
71
|
/** The last provider sub-flow outcome, when one ran to completion. */
|
|
56
72
|
providerOutcome?: ModelProviderOutcome;
|
|
57
73
|
};
|
|
58
|
-
export declare const MODEL_MENU_MESSAGE = "
|
|
74
|
+
export declare const MODEL_MENU_MESSAGE = "";
|
|
59
75
|
/**
|
|
60
76
|
* Reads the provider status the menu shows. Detection order matters: a linked
|
|
61
77
|
* project subsumes any pulled credential (the link is what the user manages),
|
|
62
78
|
* and `AI_GATEWAY_API_KEY` outranks `VERCEL_OIDC_TOKEN` because it is the one
|
|
63
79
|
* the provider sub-flow's own-key branch writes.
|
|
64
80
|
*/
|
|
65
|
-
export declare function detectModelProviderStatus(appRoot: string): Promise<ModelProviderStatus>;
|
|
81
|
+
export declare function detectModelProviderStatus(appRoot: string, options?: ProjectDetectionOptions): Promise<ModelProviderStatus>;
|
|
66
82
|
/**
|
|
67
83
|
* THE MODEL FLOW for the dev TUI's `/model`: a two-row action menu that
|
|
68
84
|
* loops, uniting the model pick and the provider setup behind one entry
|
|
@@ -72,7 +88,7 @@ export declare function detectModelProviderStatus(appRoot: string): Promise<Mode
|
|
|
72
88
|
* choice into `agent.ts` (activation is the dev server's HMR watcher).
|
|
73
89
|
* The provider row runs {@link runVercelFlow} — the provider gate (AI
|
|
74
90
|
* Gateway or your own), then link-or-paste-a-key.
|
|
75
|
-
* Each sub-flow lands back on the repainted menu; Esc leaves. A
|
|
91
|
+
* Each sub-flow lands back on the repainted menu; Done or Esc leaves. A
|
|
76
92
|
* cancelled sub-flow also returns to the menu. Esc after something completed
|
|
77
93
|
* reports it exactly like the channels flow (the effects already happened);
|
|
78
94
|
* only an empty exit folds to cancelled.
|
|
@@ -80,6 +96,7 @@ export declare function detectModelProviderStatus(appRoot: string): Promise<Mode
|
|
|
80
96
|
export declare function runModelFlow(input: {
|
|
81
97
|
appRoot: string;
|
|
82
98
|
prompter: Prompter;
|
|
99
|
+
signal?: AbortSignal;
|
|
83
100
|
deps?: Partial<ModelFlowDeps>;
|
|
84
101
|
}): Promise<ModelFlowResult>;
|
|
85
102
|
/** The outcome of applying a model slug to the agent's authored source. */
|
|
@@ -110,3 +127,10 @@ export declare function changeAgentModel(input: {
|
|
|
110
127
|
readonly appRoot: string;
|
|
111
128
|
readonly slug: string;
|
|
112
129
|
}): Promise<ApplyModelOutcome>;
|
|
130
|
+
/**
|
|
131
|
+
* Refusal message when `/model` can't rewrite the model — it is a source-backed
|
|
132
|
+
* SDK model call (`gateway(...)`, `anthropic(...)`), not a string literal — or
|
|
133
|
+
* null when the model is an editable string. Editability is independent of
|
|
134
|
+
* routing: a `gateway(...)` call is gateway-routed yet still uneditable here.
|
|
135
|
+
*/
|
|
136
|
+
export declare function modelChangeRefusalForUneditableModel(appRoot: string): Promise<string | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{interactiveAsker}from"../ask.js";import{detectProjectIdentity}from"../project-resolution.js";import{snapshotSetupState}from"../state.js";import{findEnvFileWithKey}from"../boxes/detect-ai-gateway.js";import{fetchGatewayCatalog,selectModel}from"../boxes/select-model.js";import{
|
|
1
|
+
import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{interactiveAsker}from"../ask.js";import{detectProjectIdentity}from"../project-resolution.js";import{snapshotSetupState}from"../state.js";import{WizardCancelledError}from"../step.js";import{findEnvFileWithKey}from"../boxes/detect-ai-gateway.js";import{fetchGatewayCatalog,selectModel}from"../boxes/select-model.js";import{runInteractive}from"../runner.js";import{inProjectSetupState,prompterSink}from"./in-project.js";import{runVercelFlow}from"./vercel.js";import{join}from"node:path";import{discoverAgent}from"#discover/discover-agent.js";import{inspectApplication}from"#services/inspect-application.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{createCompiledRuntimeModelCatalogLoader}from"#compiler/model-catalog.js";import{createStaticSourceChange}from"#source-change/static-source-change.js";var import_picocolors=__toESM(require_picocolors(),1);const MODEL_MENU_MESSAGE=``;function providerStatusHint(e,t=e=>e){return e.kind===`gateway-project`?`AI Gateway (Linked to ${e.teamName===void 0?t(e.projectName):`${t(e.projectName)} in ${t(e.teamName)}`})`:`AI Gateway (${e.envKey} in ${e.envFile})`}function modelMenuRows(e,t,n,r){let i;r?(i={value:`model`,label:`Change model`},e!==null&&(i.hint=e)):i={value:`model`,label:`Change model`,disabled:!0,description:`Set via an SDK model call in agent.ts; edit the source to change it`};let a;return a=n?.kind===`external`?{value:`provider`,label:`Change provider`,disabled:!0,description:`Disabled in external endpoint mode`}:t.kind===`unset`?{value:`provider`,label:import_picocolors.default.bold(import_picocolors.default.yellow(`Configure provider`)),hint:`Required to enable the agent`,accent:`warning`}:{value:`provider`,label:`Change provider`,hint:providerStatusHint(t,import_picocolors.default.bold)},[i,a,{value:`done`,label:`Done`}]}function applyModelNotice(e){switch(e.kind){case`changed`:return{tone:`success`,text:`Model changed to ${e.to}`};case`unchanged`:return{tone:`info`,text:`Model is already ${e.model}`};case`rejected`:return{tone:`warning`,text:e.message}}}function providerNotice(e){return e.kind===`unset`?{tone:`warning`,text:`Provider updated — no gateway credential detected yet.`}:{tone:`success`,text:`Connected to AI Gateway`}}async function detectModelProviderStatus(e,t={}){let[n,i,a]=await Promise.all([detectProjectIdentity(e,t),findEnvFileWithKey(e,`AI_GATEWAY_API_KEY`),findEnvFileWithKey(e,`VERCEL_OIDC_TOKEN`)]);if(n!==void 0){let e={kind:`gateway-project`,projectName:n.projectName};return n.teamName!==void 0&&(e.teamName=n.teamName),e}return i===void 0?a===void 0?{kind:`unset`}:{kind:`gateway-key`,envKey:`VERCEL_OIDC_TOKEN`,envFile:a}:{kind:`gateway-key`,envKey:`AI_GATEWAY_API_KEY`,envFile:i}}async function runModelFlow(e){let{appRoot:t,prompter:n,signal:r}=e,i={readCurrentModel:readCurrentAgentModel,applyModel:changeAgentModel,detectProviderStatus:detectModelProviderStatus,runVercelFlow,...e.deps};async function checkProject(e){let t=n.log.spinner?.(`Checking the project…`);try{return await e()}finally{t?.stop()}}let detectProvider=()=>r===void 0?i.detectProviderStatus(t):i.detectProviderStatus(t,{signal:r}),[{id:o,routing:s,editable:c},l]=await checkProject(()=>Promise.all([i.readCurrentModel(t),detectProvider()]));r?.throwIfAborted();let u,d,p,m,h=s?.kind===`external`?{tone:`warning`,text:"`agent.ts` specifies a model provider directly. In-TUI configuration is restricted to AI Gateway endpoints."}:void 0,g=l.kind===`unset`&&s?.kind!==`external`?`provider`:c?`model`:s?.kind===`external`?`done`:`provider`;for(;;){let e;try{e=await n.select({message:``,options:modelMenuRows(o,l,s,c),hintLayout:`stacked`,initialValue:g,notices:[h,p,m].filter(e=>e!==void 0)})}catch(e){if(!(e instanceof WizardCancelledError))throw e;break}if(e===`done`)break;if(e===`model`){let e=await pickModelFromCatalog({appRoot:t,prompter:n,current:o,signal:r,deps:i.selectModel});e===void 0?g=`model`:(r?.throwIfAborted(),u=await i.applyModel({appRoot:t,slug:e}),r?.throwIfAborted(),p=applyModelNotice(u),u.kind===`changed`&&(o=u.to),g=`done`);continue}let f=await i.runVercelFlow({appRoot:t,prompter:n,signal:r});if(r?.throwIfAborted(),f.kind===`cancelled`){g=`provider`;continue}if(`outcome`in f){g=`done`;continue}l=await checkProject(detectProvider),r?.throwIfAborted(),d={status:l},f.credential!==void 0&&(d.credential=f.credential),m=providerNotice(l),g=`done`}if(u===void 0&&d===void 0)return{kind:`cancelled`};let _={kind:`done`};return u!==void 0&&(_.modelMessage=formatApplyModelOutcome(u)),d!==void 0&&(_.providerOutcome=d),_}async function pickModelFromCatalog(e){let{appRoot:t,prompter:r,current:a,signal:o}=e,f=e.deps?.fetchModels??fetchGatewayCatalog,p={asker:interactiveAsker(r),deps:{fetchModels:async e=>{let t=r.log.spinner?.(`Loading the model catalog...`);try{return await f(e)}finally{t?.stop()}}}};a!==null&&(p.defaultModel=a);let m=await runInteractive([selectModel(p)],inProjectSetupState(t,{kind:`unresolved`}),prompterSink(r),{snapshot:snapshotSetupState,signal:o});return m.kind===`cancelled`?void 0:m.state.modelId}function formatApplyModelOutcome(e){switch(e.kind){case`changed`:return`Model changed to ${import_picocolors.default.bold(e.to)}. Live on your next prompt.`;case`unchanged`:return`Model is already \`${e.model}\`.`;case`rejected`:return e.message}}async function changeAgentModel(e){let{appRoot:t,slug:n}=e,r=await validateModelSlug(t,n);if(r!==null)return{kind:`rejected`,message:r};let{manifest:i}=await discoverAgent({agentRoot:join(t,`agent`),appRoot:t}),a=await createStaticSourceChange(i).updateModelName(n);return a.kind===`bail`?{kind:`rejected`,message:`Couldn't edit ${a.at.logicalPath}: ${a.reason}. Change \`model\` by hand.`}:a.from===a.to?{kind:`unchanged`,model:a.to}:{kind:`changed`,to:a.to}}async function validateModelSlug(e,t){if(!t.includes(`/`))return`\`${t}\` isn't a provider/model id (e.g. anthropic/claude-sonnet-4.6).`;let n=createCompiledRuntimeModelCatalogLoader(e);try{if(await n.getModelLimits(formatLanguageModelGatewayId(t))===null)return`I couldn't confirm \`${t}\` in the AI Gateway model catalog, so I didn't change agent.ts.`}catch{return null}return null}async function readCurrentAgentModel(e){try{let{compiledState:t}=await inspectApplication(e),n=t?.manifest.config.model;return{id:n?.id??null,routing:n?.routing??null,editable:n!==void 0&&n.source===void 0}}catch{return{id:null,routing:null,editable:!1}}}async function modelChangeRefusalForUneditableModel(e){let{editable:t,routing:n}=await readCurrentAgentModel(e);return t?null:`Model is set via ${n?.kind===`external`?`the external provider \`${n.provider}\``:`an SDK model call`} in agent.ts, not a string literal; /model can't rewrite it. Edit \`model\` in agent.ts.`}export{MODEL_MENU_MESSAGE,changeAgentModel,detectModelProviderStatus,formatApplyModelOutcome,modelChangeRefusalForUneditableModel,runModelFlow};
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { appendEnv } from "../append-env.js";
|
|
2
2
|
import type { Prompter } from "../prompter.js";
|
|
3
|
+
import { validateGatewayApiKey } from "../validate-gateway-key.js";
|
|
3
4
|
import { runLinkFlow, type LinkFlowResult } from "./link.js";
|
|
4
5
|
export declare const PROVIDER_QUESTION = "Which model provider do you want to use?";
|
|
5
6
|
export declare const CONNECTION_QUESTION = "How do you want to connect to AI Gateway?";
|
|
6
7
|
export declare const EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE = "Using another model provider";
|
|
7
8
|
export declare const EXTERNAL_PROVIDER_INSTRUCTIONS: readonly string[];
|
|
8
|
-
/** Injected for tests; defaults to the real link flow and
|
|
9
|
+
/** Injected for tests; defaults to the real link flow, env write, and key check. */
|
|
9
10
|
export interface VercelFlowDeps {
|
|
10
11
|
runLinkFlow: typeof runLinkFlow;
|
|
11
12
|
appendEnv: typeof appendEnv;
|
|
13
|
+
validateGatewayApiKey: typeof validateGatewayApiKey;
|
|
12
14
|
}
|
|
13
15
|
export type VercelFlowResult = LinkFlowResult | {
|
|
14
16
|
kind: "done";
|
|
@@ -27,5 +29,6 @@ export type VercelFlowResult = LinkFlowResult | {
|
|
|
27
29
|
export declare function runVercelFlow(input: {
|
|
28
30
|
appRoot: string;
|
|
29
31
|
prompter: Prompter;
|
|
32
|
+
signal?: AbortSignal;
|
|
30
33
|
deps?: Partial<VercelFlowDeps>;
|
|
31
34
|
}): Promise<VercelFlowResult>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{appendEnv}from"../append-env.js";import{WizardCancelledError}from"../step.js";import{runLinkFlow}from"./link.js";import{join}from"node:path";const AI_GATEWAY_ENV_KEY=`AI_GATEWAY_API_KEY`,ENV_FILE_NAME=`.env.local`,PROVIDER_QUESTION=`Which model provider do you want to use?`,CONNECTION_QUESTION=`How do you want to connect to AI Gateway?`,EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE=`Using another model provider`,EXTERNAL_PROVIDER_INSTRUCTIONS=[`Set your provider's API key in ${ENV_FILE_NAME} — e.g. ANTHROPIC_API_KEY or OPENAI_API_KEY.`,'In agent/agent.ts, set `model` to a provider-authored model — e.g. `anthropic("claude-opus-4.8")` from `@ai-sdk/anthropic`.',`See https://beta.eve.dev/docs/agent-config for details.`,"A running `eve dev` reloads env files automatically — no restart needed."];async function runVercelFlow(
|
|
2
|
-
`),EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE),{kind:`done`,outcome:`external-provider`};if(
|
|
1
|
+
import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{appendEnv}from"../append-env.js";import{WizardCancelledError}from"../step.js";import{runLinkFlow}from"./link.js";import{validateGatewayApiKey}from"../validate-gateway-key.js";import{join}from"node:path";var import_picocolors=__toESM(require_picocolors(),1);const AI_GATEWAY_ENV_KEY=`AI_GATEWAY_API_KEY`,ENV_FILE_NAME=`.env.local`,PROVIDER_QUESTION=`Which model provider do you want to use?`,CONNECTION_QUESTION=`How do you want to connect to AI Gateway?`,EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE=`Using another model provider`,EXTERNAL_PROVIDER_INSTRUCTIONS=[`Set your provider's API key in ${ENV_FILE_NAME} — e.g. ANTHROPIC_API_KEY or OPENAI_API_KEY.`,'In agent/agent.ts, set `model` to a provider-authored model — e.g. `anthropic("claude-opus-4.8")` from `@ai-sdk/anthropic`.',`See https://beta.eve.dev/docs/agent-config for details.`,"A running `eve dev` reloads env files automatically — no restart needed."];async function runVercelFlow(e){let{appRoot:t,prompter:a,signal:o}=e,s={runLinkFlow,appendEnv,validateGatewayApiKey,...e.deps},c,l;try{c=await a.select({message:PROVIDER_QUESTION,options:[{value:`gateway`,label:`Vercel AI Gateway`,hint:`one key, every model`},{value:`other`,label:`Something else`,hint:`use your own provider credentials`}],hintLayout:`stacked`}),c===`gateway`&&(l=await a.select({message:CONNECTION_QUESTION,options:[{value:`project`,label:`Connect via a project`,hint:`vercel link + env pull`},{value:`own-key`,label:`Use my own key`,hint:`paste an ${AI_GATEWAY_ENV_KEY}`}],hintLayout:`stacked`}))}catch(e){if(e instanceof WizardCancelledError)return{kind:`cancelled`};throw e}if(c===`other`)return a.acknowledge?await a.acknowledge({message:EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE,lines:EXTERNAL_PROVIDER_INSTRUCTIONS}):a.note(EXTERNAL_PROVIDER_INSTRUCTIONS.join(`
|
|
2
|
+
`),EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE),{kind:`done`,outcome:`external-provider`};if(l===`own-key`)for(;;){let e;try{e=await a.password({message:`Enter your ${AI_GATEWAY_ENV_KEY}`,validate:e=>e.trim().length===0?`API key cannot be empty.`:void 0})}catch(e){if(e instanceof WizardCancelledError)return{kind:`cancelled`};throw e}o?.throwIfAborted();let n=e.trim(),r=a.log.spinner?.(`Validating…`),i;try{i=await s.validateGatewayApiKey(n,o)}finally{r?.stop()}if(o?.throwIfAborted(),i.kind===`invalid`){a.log.error(`${i.message} Check the key and try again, or Esc to cancel.`);continue}return i.kind===`inconclusive`?a.log.warning(`Couldn't reach the gateway to validate (${i.message}). Saving the key anyway.`):a.log.success(`${import_picocolors.default.green(`✓`)} ${import_picocolors.default.bold(`Valid key`)}`),await s.appendEnv(join(t,ENV_FILE_NAME),{[AI_GATEWAY_ENV_KEY]:n},{force:!0}),o?.throwIfAborted(),a.log.success(`Saved ${AI_GATEWAY_ENV_KEY} to ${ENV_FILE_NAME}.`),{kind:`done`,credential:AI_GATEWAY_ENV_KEY}}else return await s.runLinkFlow({appRoot:t,prompter:a,signal:o})}export{CONNECTION_QUESTION,EXTERNAL_PROVIDER_INSTRUCTIONS,EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE,PROVIDER_QUESTION,runVercelFlow};
|
package/dist/src/setup/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{InteractionRequired}from"./ask.js";import{runVercel}from"./primitives/run-vercel.js";import{detectDeployment,detectProjectResolution,projectProductionUrlFromResolution}from"./project-resolution.js";import{provisionSlackbot,reconcileSlackUid}from"./slackbot.js";import{createDefaultSetupState,requireProjectPath,snapshotSetupState}from"./state.js";import{setupConnectionConnector}from"./connection-connector.js";import{linkProject,requireAuth,resolveProjectByNameOrId,resolveTeam}from"./vercel-project.js";import{runVercelEnvPull}from"./run-vercel-link.js";import{createPromptCommandOutput}from"./cli/command-output.js";import"./cli/index.js";import{
|
|
1
|
+
import{InteractionRequired}from"./ask.js";import{runVercel}from"./primitives/run-vercel.js";import{detectDeployment,detectProjectResolution,projectProductionUrlFromResolution}from"./project-resolution.js";import{provisionSlackbot,reconcileSlackUid}from"./slackbot.js";import{createDefaultSetupState,requireProjectPath,snapshotSetupState}from"./state.js";import{WizardCancelledError}from"./step.js";import{setupConnectionConnector}from"./connection-connector.js";import{linkProject,requireAuth,resolveProjectByNameOrId,resolveTeam}from"./vercel-project.js";import{runVercelEnvPull}from"./run-vercel-link.js";import{createPromptCommandOutput}from"./cli/command-output.js";import"./cli/index.js";import{runHeadless,runInteractive}from"./runner.js";import{HeadlessPromptError,createHeadlessPrompter,formatHeadlessEvent}from"./headless.js";import{createPrompter}from"./prompter.js";import{composeOnboardingBoxes}from"./onboarding.js";import{getPackageManagerStrategy}from"./primitives/pm/index.js";import{runPackageManagerInstall,runPnpmInstall,spawnPackageManager,spawnPnpm}from"./primitives/pm/run.js";import"./primitives/index.js";export{HeadlessPromptError,InteractionRequired,WizardCancelledError,composeOnboardingBoxes,createDefaultSetupState,createHeadlessPrompter,createPromptCommandOutput,createPrompter,detectDeployment,detectProjectResolution,formatHeadlessEvent,getPackageManagerStrategy,linkProject,projectProductionUrlFromResolution,provisionSlackbot,reconcileSlackUid,requireAuth,requireProjectPath,resolveProjectByNameOrId,resolveTeam,runHeadless,runInteractive,runPackageManagerInstall,runPnpmInstall,runVercel,runVercelEnvPull,setupConnectionConnector,snapshotSetupState,spawnPackageManager,spawnPnpm};
|