eve 0.6.0-beta.9 → 0.7.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/CHANGELOG.md +281 -0
- package/README.md +9 -6
- package/dist/docs/public/README.md +17 -12
- package/dist/docs/public/agent-config.md +10 -10
- package/dist/docs/public/channels/custom.mdx +4 -4
- package/dist/docs/public/channels/discord.mdx +1 -1
- package/dist/docs/public/channels/eve.mdx +10 -10
- package/dist/docs/public/channels/github.mdx +1 -1
- package/dist/docs/public/channels/overview.mdx +21 -15
- package/dist/docs/public/channels/slack.mdx +16 -4
- package/dist/docs/public/channels/teams.mdx +1 -1
- package/dist/docs/public/channels/telegram.mdx +1 -1
- package/dist/docs/public/channels/twilio.mdx +1 -1
- package/dist/docs/public/{advanced → concepts}/context-control.md +3 -3
- package/dist/docs/public/{advanced → concepts}/default-harness.md +5 -5
- package/dist/docs/public/{advanced → concepts}/execution-model-and-durability.md +3 -1
- package/dist/docs/public/concepts/meta.json +10 -0
- package/dist/docs/public/{advanced → concepts}/security-model.md +3 -3
- package/dist/docs/public/{advanced → concepts}/sessions-runs-and-streaming.md +7 -7
- package/dist/docs/public/connections.mdx +6 -4
- package/dist/docs/public/evals/assertions.mdx +108 -0
- package/dist/docs/public/evals/cases.mdx +143 -0
- package/dist/docs/public/evals/judge.mdx +94 -0
- package/dist/docs/public/evals/meta.json +4 -0
- package/dist/docs/public/evals/overview.mdx +118 -0
- package/dist/docs/public/evals/reporters.mdx +62 -0
- package/dist/docs/public/evals/running.mdx +63 -0
- package/dist/docs/public/evals/targets.mdx +54 -0
- package/dist/docs/public/getting-started.mdx +38 -33
- package/dist/docs/public/{advanced → guides}/auth-and-route-protection.md +5 -3
- package/dist/docs/public/{client → guides/client}/continuations.mdx +2 -2
- package/dist/docs/public/{client → guides/client}/messages.mdx +1 -1
- package/dist/docs/public/{client → guides/client}/meta.json +1 -1
- package/dist/docs/public/{client → guides/client}/output-schema.mdx +2 -2
- package/dist/docs/public/{client → guides/client}/overview.mdx +5 -5
- package/dist/docs/public/{client → guides/client}/streaming.mdx +1 -1
- package/dist/docs/public/{advanced → guides}/deployment.md +9 -1
- package/dist/docs/public/guides/dev-tui.md +50 -0
- package/dist/docs/public/{advanced → guides}/dynamic-capabilities.md +1 -1
- package/dist/docs/public/{advanced → guides}/dynamic-workflows.md +1 -1
- package/dist/docs/public/{frontend → guides/frontend}/nextjs.mdx +16 -7
- package/dist/docs/public/{frontend → guides/frontend}/nuxt.mdx +7 -7
- package/dist/docs/public/{frontend → guides/frontend}/overview.mdx +6 -6
- package/dist/docs/public/{frontend → guides/frontend}/sveltekit.mdx +5 -5
- package/dist/docs/public/{frontend → guides/frontend}/use-eve-agent-svelte.mdx +2 -2
- package/dist/docs/public/{frontend → guides/frontend}/use-eve-agent-vue.mdx +2 -2
- package/dist/docs/public/{advanced → guides}/hooks.md +2 -2
- package/dist/docs/public/{advanced → guides}/instrumentation.md +3 -1
- package/dist/docs/public/{advanced → guides}/meta.json +8 -12
- package/dist/docs/public/{advanced → guides}/session-context.md +3 -3
- package/dist/docs/public/{advanced → guides}/state.md +1 -1
- package/dist/docs/public/instructions.mdx +2 -2
- package/dist/docs/public/introduction.md +5 -2
- package/dist/docs/public/meta.json +4 -3
- package/dist/docs/public/reference/cli.md +35 -19
- package/dist/docs/public/reference/meta.json +1 -1
- package/dist/docs/public/reference/project-layout.md +5 -1
- package/dist/docs/public/reference/typescript-api.md +27 -23
- package/dist/docs/public/sandbox.mdx +1 -1
- package/dist/docs/public/schedules.mdx +2 -2
- package/dist/docs/public/skills.mdx +3 -3
- package/dist/docs/public/subagents.mdx +3 -3
- package/dist/docs/public/tools.mdx +4 -8
- package/dist/docs/public/tutorial/connect-a-warehouse.mdx +3 -3
- package/dist/docs/public/tutorial/first-agent.mdx +6 -3
- package/dist/docs/public/tutorial/guard-the-spend.mdx +1 -1
- package/dist/docs/public/tutorial/how-it-runs.mdx +2 -2
- package/dist/docs/public/tutorial/meta.json +1 -1
- package/dist/docs/public/tutorial/query-sample-data.mdx +1 -1
- package/dist/docs/public/tutorial/remember-definitions.mdx +3 -3
- package/dist/docs/public/tutorial/run-analysis.mdx +1 -1
- package/dist/docs/public/tutorial/ship-it.mdx +4 -4
- package/dist/docs/public/tutorial/team-playbooks.mdx +3 -3
- package/dist/src/chunks/{use-eve-agent-DCZbkLG7.js → use-eve-agent-DErQj5hs.js} +125 -37
- package/dist/src/chunks/{use-eve-agent-DoheC4_o.js → use-eve-agent-DoR8C4i6.js} +125 -37
- package/dist/src/cli/banner.d.ts +7 -0
- package/dist/src/cli/banner.js +1 -0
- package/dist/src/cli/commands/channel-add-conflicts.d.ts +1 -1
- package/dist/src/cli/commands/channels.d.ts +9 -6
- package/dist/src/cli/commands/channels.js +1 -1
- package/dist/src/cli/commands/deploy.d.ts +21 -0
- package/dist/src/cli/commands/deploy.js +1 -0
- package/dist/src/cli/commands/init-git.d.ts +15 -0
- package/dist/src/cli/commands/init-git.js +1 -0
- package/dist/src/cli/commands/init.d.ts +29 -0
- package/dist/src/cli/commands/init.js +1 -0
- package/dist/src/cli/commands/link.d.ts +21 -0
- package/dist/src/cli/commands/link.js +1 -0
- package/dist/src/cli/commands/preconditions.d.ts +7 -0
- package/dist/src/cli/commands/preconditions.js +1 -0
- package/dist/src/cli/commands/register-project-commands.d.ts +12 -0
- package/dist/src/cli/commands/register-project-commands.js +1 -0
- package/dist/src/cli/dev/tui/agent-header.d.ts +15 -9
- package/dist/src/cli/dev/tui/agent-header.js +1 -1
- package/dist/src/cli/dev/tui/blocks.d.ts +1 -1
- package/dist/src/cli/dev/tui/blocks.js +3 -2
- package/dist/src/cli/dev/tui/command-typeahead.d.ts +47 -0
- package/dist/src/cli/dev/tui/command-typeahead.js +1 -0
- package/dist/src/cli/dev/tui/dev-rebuild-status.d.ts +21 -0
- package/dist/src/cli/dev/tui/dev-rebuild-status.js +1 -0
- package/dist/src/cli/dev/tui/errors.d.ts +18 -0
- package/dist/src/cli/dev/tui/errors.js +1 -1
- package/dist/src/cli/dev/tui/prompt-command-handler.d.ts +14 -0
- package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -0
- package/dist/src/cli/dev/tui/prompt-commands.d.ts +54 -0
- package/dist/src/cli/dev/tui/prompt-commands.js +2 -0
- package/dist/src/cli/dev/tui/runner.d.ts +64 -7
- package/dist/src/cli/dev/tui/runner.js +1 -1
- package/dist/src/cli/dev/tui/setup-commands.d.ts +48 -0
- package/dist/src/cli/dev/tui/setup-commands.js +2 -0
- package/dist/src/cli/dev/tui/setup-flow.d.ts +35 -0
- package/dist/src/cli/dev/tui/setup-issues.d.ts +40 -0
- package/dist/src/cli/dev/tui/setup-issues.js +1 -0
- package/dist/src/cli/dev/tui/setup-panel.d.ts +103 -0
- package/dist/src/cli/dev/tui/setup-panel.js +1 -0
- package/dist/src/cli/dev/tui/status-line.d.ts +25 -0
- package/dist/src/cli/dev/tui/status-line.js +1 -0
- package/dist/src/cli/dev/tui/stream-format.d.ts +16 -1
- package/dist/src/cli/dev/tui/stream-format.js +1 -1
- package/dist/src/cli/dev/tui/terminal-renderer.d.ts +32 -3
- package/dist/src/cli/dev/tui/terminal-renderer.js +5 -2
- package/dist/src/cli/dev/tui/test/index.d.ts +3 -1
- package/dist/src/cli/dev/tui/test/index.js +1 -1
- package/dist/src/cli/dev/tui/test/mock-terminal.d.ts +1 -0
- package/dist/src/cli/dev/tui/test/mock-terminal.js +1 -1
- package/dist/src/cli/dev/tui/theme.d.ts +10 -0
- package/dist/src/cli/dev/tui/theme.js +1 -1
- package/dist/src/cli/dev/tui/tui-prompter.d.ts +20 -0
- package/dist/src/cli/dev/tui/tui-prompter.js +1 -0
- package/dist/src/cli/dev/tui/tui.d.ts +6 -8
- package/dist/src/cli/dev/tui/tui.js +1 -1
- package/dist/src/cli/dev/tui/types.d.ts +4 -3
- package/dist/src/cli/dev/tui/vercel-status.d.ts +47 -0
- package/dist/src/cli/dev/tui/vercel-status.js +1 -0
- package/dist/src/cli/run.d.ts +9 -18
- package/dist/src/cli/run.js +2 -2
- package/dist/src/client/client.d.ts +8 -0
- package/dist/src/client/client.js +1 -1
- package/dist/src/client/file-parts.d.ts +18 -0
- package/dist/src/client/file-parts.js +1 -0
- package/dist/src/client/index.d.ts +3 -2
- package/dist/src/client/index.js +1 -1
- package/dist/src/client/message-response.js +1 -1
- package/dist/src/client/open-stream.d.ts +6 -0
- package/dist/src/client/open-stream.js +1 -1
- package/dist/src/client/session-utils.d.ts +5 -0
- package/dist/src/client/session-utils.js +1 -1
- package/dist/src/client/session.js +1 -1
- package/dist/src/client/types.d.ts +9 -2
- package/dist/src/compiled/.vendor-stamp.json +8 -8
- package/dist/src/compiled/@ai-sdk/anthropic/index.d.ts +56 -31
- package/dist/src/compiled/@ai-sdk/anthropic/index.js +2 -2
- package/dist/src/compiled/@ai-sdk/google/index.js +1 -1
- package/dist/src/compiled/@ai-sdk/mcp/index.js +1 -1
- package/dist/src/compiled/@ai-sdk/openai/index.d.ts +16 -9
- package/dist/src/compiled/@ai-sdk/openai/index.js +2 -2
- package/dist/src/compiled/@ai-sdk/otel/index.js +2 -2
- package/dist/src/compiled/@vercel/sandbox/index.js +1 -1
- package/dist/src/compiled/@workflow/core/capabilities.d.ts +19 -1
- package/dist/src/compiled/@workflow/core/class-serialization.d.ts +32 -0
- package/dist/src/compiled/@workflow/core/create-hook.d.ts +37 -0
- package/dist/src/compiled/@workflow/core/global.d.ts +11 -1
- package/dist/src/compiled/@workflow/core/index.js +2 -2
- package/dist/src/compiled/@workflow/core/runtime/helpers.d.ts +4 -2
- package/dist/src/compiled/@workflow/core/runtime/start.d.ts +6 -0
- package/dist/src/compiled/@workflow/core/runtime/suspension-handler.d.ts +15 -2
- package/dist/src/compiled/@workflow/core/runtime/wait-continuation.d.ts +84 -0
- package/dist/src/compiled/@workflow/core/runtime/wait-until.d.ts +18 -0
- package/dist/src/compiled/@workflow/core/runtime.d.ts +3 -1
- package/dist/src/compiled/@workflow/core/runtime.js +28 -28
- package/dist/src/compiled/@workflow/core/serialization/types.d.ts +21 -0
- package/dist/src/compiled/@workflow/core/serialization.d.ts +113 -6
- package/dist/src/compiled/@workflow/core/symbols.d.ts +2 -0
- package/dist/src/compiled/@workflow/core/util.d.ts +0 -5
- package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/workflow/attribute-dispatcher.d.ts +6 -0
- package/dist/src/compiled/@workflow/core/workflow/set-attributes.d.ts +3 -4
- package/dist/src/compiled/@workflow/core/workflow.js +1 -1
- package/dist/src/compiled/@workflow/world/events.d.ts +48 -0
- package/dist/src/compiled/@workflow/world/index.d.ts +3 -3
- package/dist/src/compiled/@workflow/world/queue.d.ts +31 -2
- package/dist/src/compiled/@workflow/world/runs.d.ts +2 -0
- package/dist/src/compiled/@workflow/world/spec-version.d.ts +2 -1
- package/dist/src/compiled/_chunks/workflow/attribute-changes-DGVGRGfw.js +59 -0
- package/dist/src/compiled/_chunks/workflow/{dist-gEXVSMPU.js → dist-CkMRLaRV.js} +1 -1
- package/dist/src/compiled/_chunks/workflow/functions-DuPjIvMH.js +1 -0
- package/dist/src/compiled/_chunks/workflow/resume-hook-DMSadN9o.js +1 -0
- package/dist/src/compiled/_chunks/workflow/run-BRdn7zy_.js +1 -0
- package/dist/src/compiled/_chunks/workflow/sleep-CpXfoXLF.js +1 -0
- package/dist/src/compiled/just-bash/index.d.ts +4 -4
- package/dist/src/compiler/artifacts.js +1 -1
- package/dist/src/compiler/manifest.d.ts +8 -8
- package/dist/src/compiler/normalize-agent-config.js +1 -1
- package/dist/src/compiler/normalize-channel.d.ts +2 -1
- package/dist/src/compiler/normalize-channel.js +1 -1
- package/dist/src/compiler/normalize-connection.d.ts +2 -1
- package/dist/src/compiler/normalize-connection.js +1 -1
- package/dist/src/compiler/normalize-helpers.d.ts +5 -0
- package/dist/src/compiler/normalize-helpers.js +1 -1
- package/dist/src/compiler/normalize-instructions.d.ts +3 -2
- package/dist/src/compiler/normalize-instructions.js +1 -1
- package/dist/src/compiler/normalize-manifest.js +2 -2
- package/dist/src/compiler/normalize-sandbox.d.ts +2 -1
- package/dist/src/compiler/normalize-sandbox.js +1 -1
- package/dist/src/compiler/normalize-schedule.d.ts +2 -1
- package/dist/src/compiler/normalize-schedule.js +1 -1
- package/dist/src/compiler/normalize-skill.d.ts +2 -1
- package/dist/src/compiler/normalize-skill.js +1 -1
- package/dist/src/compiler/normalize-subagent.d.ts +4 -1
- package/dist/src/compiler/normalize-subagent.js +1 -1
- package/dist/src/compiler/normalize-tool.d.ts +2 -1
- package/dist/src/compiler/normalize-tool.js +1 -1
- package/dist/src/compiler/workspace-resources.js +1 -1
- package/dist/src/context/node.d.ts +1 -1
- package/dist/src/evals/assertions/collector.d.ts +43 -0
- package/dist/src/evals/assertions/collector.js +1 -0
- package/dist/src/evals/assertions/run.d.ts +72 -0
- package/dist/src/evals/assertions/run.js +2 -0
- package/dist/src/evals/autoevals-client.js +2 -0
- package/dist/src/evals/cli/eval-client.d.ts +22 -0
- package/dist/src/evals/cli/eval-client.js +1 -0
- package/dist/src/evals/cli/eval.d.ts +8 -5
- package/dist/src/evals/cli/eval.js +1 -1
- package/dist/src/evals/context.d.ts +19 -0
- package/dist/src/evals/context.js +1 -0
- package/dist/src/evals/define-eval-config.d.ts +16 -0
- package/dist/src/evals/define-eval-config.js +1 -0
- package/dist/src/evals/define-eval.d.ts +20 -0
- package/dist/src/evals/define-eval.js +1 -0
- package/dist/src/evals/expect/index.d.ts +25 -0
- package/dist/src/evals/expect/index.js +1 -0
- package/dist/src/evals/index.d.ts +6 -2
- package/dist/src/evals/index.js +1 -1
- package/dist/src/evals/judge.d.ts +20 -0
- package/dist/src/evals/judge.js +1 -0
- package/dist/src/evals/{checks/match.d.ts → match.d.ts} +17 -18
- package/dist/src/evals/match.js +1 -0
- package/dist/src/evals/reporters/index.d.ts +1 -0
- package/dist/src/evals/reporters/index.js +1 -1
- package/dist/src/evals/requirements.d.ts +3 -0
- package/dist/src/evals/requirements.js +1 -0
- package/dist/src/evals/runner/artifacts.d.ts +7 -6
- package/dist/src/evals/runner/artifacts.js +3 -3
- package/dist/src/evals/runner/discover.d.ts +31 -10
- package/dist/src/evals/runner/discover.js +1 -1
- package/dist/src/evals/runner/execute-eval.d.ts +25 -0
- package/dist/src/evals/runner/execute-eval.js +1 -0
- package/dist/src/evals/runner/execute-task.d.ts +31 -0
- package/dist/src/evals/runner/execute-task.js +1 -0
- package/dist/src/evals/runner/reporters/braintrust.d.ts +7 -5
- package/dist/src/evals/runner/reporters/braintrust.js +2 -2
- package/dist/src/evals/runner/reporters/console.d.ts +4 -4
- package/dist/src/evals/runner/reporters/console.js +1 -1
- package/dist/src/evals/runner/reporters/junit.d.ts +10 -0
- package/dist/src/evals/runner/reporters/junit.js +4 -0
- package/dist/src/evals/runner/reporters/types.d.ts +14 -8
- package/dist/src/evals/runner/run-evals.d.ts +38 -0
- package/dist/src/evals/runner/run-evals.js +1 -0
- package/dist/src/evals/runner/verdict.d.ts +10 -15
- package/dist/src/evals/runner/verdict.js +1 -1
- package/dist/src/evals/session.d.ts +52 -0
- package/dist/src/evals/session.js +1 -0
- package/dist/src/evals/target.d.ts +23 -0
- package/dist/src/evals/target.js +1 -0
- package/dist/src/evals/types.d.ts +294 -219
- package/dist/src/execution/compaction.d.ts +14 -0
- package/dist/src/execution/compaction.js +1 -0
- package/dist/src/execution/delegated-parent-notification.js +1 -1
- package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
- package/dist/src/execution/node-step.js +1 -1
- package/dist/src/execution/sandbox/bash-tool.d.ts +6 -6
- package/dist/src/execution/sandbox/bash-tool.js +1 -1
- package/dist/src/execution/sandbox/bindings/local.js +1 -1
- package/dist/src/execution/sandbox/bindings/vercel.d.ts +2 -6
- package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
- package/dist/src/execution/sandbox/glob-tool.js +3 -3
- package/dist/src/execution/sandbox/grep-tool.js +3 -3
- package/dist/src/execution/sandbox/read-file-tool.js +1 -1
- package/dist/src/execution/subagent-adapter.js +1 -1
- package/dist/src/execution/tool-auth.js +1 -1
- package/dist/src/execution/turn-workflow.js +1 -1
- package/dist/src/execution/workflow-runtime.d.ts +2 -2
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/action-result-helpers.js +1 -1
- package/dist/src/harness/authorization.d.ts +26 -0
- package/dist/src/harness/authorization.js +1 -1
- package/dist/src/harness/code-mode-lifecycle.js +1 -1
- package/dist/src/harness/emission.d.ts +12 -5
- package/dist/src/harness/emission.js +1 -1
- package/dist/src/harness/model-call-error.d.ts +35 -6
- package/dist/src/harness/model-call-error.js +1 -1
- package/dist/src/harness/step-hooks.d.ts +10 -4
- package/dist/src/harness/step-hooks.js +1 -1
- package/dist/src/harness/tool-loop.js +1 -1
- package/dist/src/harness/tools.d.ts +4 -6
- package/dist/src/harness/tools.js +1 -1
- package/dist/src/harness/turn-tag-state.d.ts +4 -0
- package/dist/src/harness/turn-tag-state.js +1 -1
- package/dist/src/harness/types.d.ts +4 -15
- package/dist/src/internal/application/cache-metadata.js +1 -1
- package/dist/src/internal/application/compiled-artifacts.js +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/application/paths.js +1 -1
- package/dist/src/internal/authored-definition/schema-backed.js +1 -1
- package/dist/src/internal/authored-module-loader.d.ts +4 -1
- package/dist/src/internal/authored-module-loader.js +2 -2
- package/dist/src/internal/authored-module-map-loader.js +1 -1
- package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
- package/dist/src/internal/nitro/host/build-application.js +1 -1
- package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -1
- package/dist/src/internal/nitro/host/configure-nitro-routes.js +3 -3
- 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-watcher-log.d.ts +37 -0
- package/dist/src/internal/nitro/host/dev-watcher-log.js +1 -0
- package/dist/src/internal/nitro/host/ports.d.ts +8 -0
- package/dist/src/internal/nitro/host/ports.js +1 -0
- package/dist/src/internal/nitro/host/prepare-application-host.js +1 -1
- package/dist/src/internal/nitro/host/server-external-packages.d.ts +1 -1
- package/dist/src/internal/nitro/host/server-external-packages.js +1 -1
- package/dist/src/internal/nitro/host/start-development-server.js +1 -1
- package/dist/src/internal/nitro/host/start-production-server.js +1 -1
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.d.ts +5 -0
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -0
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.d.ts +31 -2
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
- package/dist/src/internal/nitro/routes/agent-info/load-agent-info-data.d.ts +13 -0
- package/dist/src/internal/nitro/routes/agent-info/load-agent-info-data.js +1 -1
- package/dist/src/internal/nitro/routes/info.d.ts +2 -2
- package/dist/src/internal/nitro/routes/info.js +1 -1
- package/dist/src/internal/workflow/queue-namespace.d.ts +5 -0
- package/dist/src/internal/workflow/queue-namespace.js +1 -0
- package/dist/src/internal/workflow-bundle/builder-support.js +2 -2
- package/dist/src/internal/workflow-bundle/builder.js +3 -5
- package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
- package/dist/src/internal/workflow-bundle/workflow-builders.d.ts +1 -1
- package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
- package/dist/src/node_modules/.pnpm/@clack_core@1.3.1/node_modules/@clack/core/dist/index.js +4 -4
- package/dist/src/protocol/message.d.ts +15 -0
- package/dist/src/protocol/message.js +2 -2
- package/dist/src/public/channels/slack/api.d.ts +8 -0
- package/dist/src/public/channels/slack/api.js +1 -1
- package/dist/src/public/channels/slack/connections.d.ts +26 -18
- package/dist/src/public/channels/slack/connections.js +1 -1
- package/dist/src/public/channels/slack/defaults.d.ts +5 -2
- package/dist/src/public/channels/slack/defaults.js +1 -1
- package/dist/src/public/channels/slack/index.d.ts +1 -1
- package/dist/src/public/channels/slack/slackChannel.d.ts +65 -5
- package/dist/src/public/channels/slack/slackChannel.js +1 -1
- package/dist/src/public/channels/teams/defaults.js +1 -1
- package/dist/src/public/connections/errors.d.ts +8 -0
- package/dist/src/public/definitions/tool.d.ts +0 -33
- package/dist/src/public/next/index.d.ts +7 -1
- package/dist/src/public/next/index.js +1 -1
- package/dist/src/public/next/server.d.ts +1 -0
- package/dist/src/public/next/server.js +1 -1
- package/dist/src/public/nuxt/dev-server.js +1 -1
- package/dist/src/public/sveltekit/dev-server.js +1 -1
- package/dist/src/public/sveltekit/index.d.ts +1 -1
- package/dist/src/public/tools/defaults.d.ts +2 -4
- package/dist/src/public/tools/defaults.js +1 -1
- package/dist/src/public/tools/define-bash-tool.d.ts +3 -3
- package/dist/src/public/tools/define-bash-tool.js +1 -1
- package/dist/src/public/tools/define-read-file-tool.d.ts +0 -6
- package/dist/src/public/tools/define-read-file-tool.js +1 -1
- package/dist/src/public/tools/index.d.ts +2 -2
- package/dist/src/public/tools/index.js +1 -1
- package/dist/src/public/tools/internal.js +1 -1
- package/dist/src/runtime/actions/types.d.ts +11 -11
- package/dist/src/runtime/agent/mock-model-adapter.js +1 -1
- package/dist/src/runtime/agent/mock-model-fixtures.js +3 -2
- package/dist/src/runtime/agent/mock-model-skill-selection.js +3 -4
- package/dist/src/runtime/connections/callback-route.js +1 -1
- package/dist/src/runtime/connections/mcp-client.js +1 -1
- package/dist/src/runtime/connections/scoped-authorization.d.ts +21 -5
- package/dist/src/runtime/connections/scoped-authorization.js +1 -1
- package/dist/src/runtime/connections/types.d.ts +33 -0
- package/dist/src/runtime/connections/validate-authorization.js +1 -1
- package/dist/src/runtime/framework-tools/bash.d.ts +3 -3
- package/dist/src/runtime/framework-tools/bash.js +1 -1
- package/dist/src/runtime/framework-tools/connection-search-dynamic.d.ts +1 -1
- package/dist/src/runtime/framework-tools/connection-search-dynamic.js +1 -1
- package/dist/src/runtime/framework-tools/file-state.d.ts +3 -3
- package/dist/src/runtime/framework-tools/index.js +1 -1
- package/dist/src/runtime/framework-tools/read-file.js +2 -2
- package/dist/src/runtime/framework-tools/todo.d.ts +7 -0
- package/dist/src/runtime/framework-tools/todo.js +2 -2
- package/dist/src/runtime/governance/auth/http-basic.js +1 -1
- package/dist/src/runtime/input/types.d.ts +1 -1
- package/dist/src/runtime/resolve-tool.d.ts +2 -2
- package/dist/src/runtime/resolve-tool.js +1 -1
- package/dist/src/runtime/sandbox/keys.js +1 -1
- package/dist/src/runtime/session-callback-route.js +1 -1
- package/dist/src/runtime/types.d.ts +1 -7
- package/dist/src/services/dev-client/client-options.d.ts +8 -0
- package/dist/src/services/dev-client/client-options.js +1 -0
- package/dist/src/services/dev-client/runtime-artifacts.d.ts +13 -0
- package/dist/src/services/dev-client/runtime-artifacts.js +1 -0
- package/dist/src/services/dev-client.d.ts +13 -46
- package/dist/src/services/dev-client.js +1 -1
- package/dist/src/setup/ask.d.ts +205 -0
- package/dist/src/setup/ask.js +1 -0
- package/dist/src/setup/boxes/add-channels.d.ts +100 -16
- package/dist/src/setup/boxes/add-channels.js +2 -1
- package/dist/src/setup/boxes/add-connections.d.ts +13 -23
- package/dist/src/setup/boxes/add-connections.js +1 -1
- package/dist/src/setup/boxes/apply-ai-gateway-credential.d.ts +2 -2
- package/dist/src/setup/boxes/apply-ai-gateway-credential.js +1 -1
- package/dist/src/setup/boxes/deploy-project.d.ts +46 -14
- package/dist/src/setup/boxes/deploy-project.js +1 -1
- package/dist/src/setup/boxes/detect-ai-gateway.d.ts +10 -3
- package/dist/src/setup/boxes/detect-ai-gateway.js +1 -1
- package/dist/src/setup/boxes/link-project.d.ts +3 -3
- package/dist/src/setup/boxes/link-project.js +1 -1
- package/dist/src/setup/boxes/one-shot-next-steps.d.ts +18 -0
- package/dist/src/setup/boxes/one-shot-next-steps.js +2 -0
- package/dist/src/setup/boxes/preflight.d.ts +14 -6
- package/dist/src/setup/boxes/preflight.js +1 -1
- package/dist/src/setup/boxes/resolve-provisioning.d.ts +36 -8
- package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
- package/dist/src/setup/boxes/resolve-target.d.ts +25 -8
- package/dist/src/setup/boxes/resolve-target.js +1 -1
- package/dist/src/setup/boxes/scaffold.d.ts +12 -6
- package/dist/src/setup/boxes/scaffold.js +1 -1
- package/dist/src/setup/boxes/select-channels.d.ts +38 -9
- package/dist/src/setup/boxes/select-channels.js +1 -1
- package/dist/src/setup/boxes/select-chat.d.ts +15 -11
- package/dist/src/setup/boxes/select-chat.js +1 -1
- package/dist/src/setup/boxes/select-connections.d.ts +30 -0
- package/dist/src/setup/boxes/select-connections.js +1 -0
- package/dist/src/setup/boxes/select-model.d.ts +18 -14
- package/dist/src/setup/boxes/select-model.js +1 -1
- package/dist/src/setup/boxes/select-setup-mode.d.ts +32 -0
- package/dist/src/setup/boxes/select-setup-mode.js +1 -0
- package/dist/src/setup/channel-add-conflicts.d.ts +28 -0
- package/dist/src/setup/channel-add-conflicts.js +1 -0
- package/dist/src/setup/cli/channel-setup-prompter.d.ts +23 -0
- package/dist/src/setup/cli/channel-setup-prompter.js +1 -0
- package/dist/src/setup/cli/connection-add-prompter.d.ts +8 -0
- package/dist/src/setup/cli/connection-add-prompter.js +1 -0
- package/dist/src/setup/{scaffold/cli → cli}/index.d.ts +4 -3
- package/dist/src/setup/cli/index.js +1 -0
- package/dist/src/setup/{scaffold/cli → cli}/prompt-ui.d.ts +39 -15
- package/dist/src/setup/cli/prompt-ui.js +5 -0
- package/dist/src/setup/{scaffold/cli → cli}/rail-log.d.ts +2 -0
- package/dist/src/setup/{scaffold/cli → cli}/rail-log.js +2 -2
- package/dist/src/setup/{scaffold/cli → cli}/select-component.d.ts +18 -3
- package/dist/src/setup/cli/select-component.js +1 -0
- package/dist/src/setup/cli/select-option-codec.d.ts +12 -0
- package/dist/src/setup/cli/select-option-codec.js +1 -0
- package/dist/src/setup/{scaffold/cli → cli}/select-state.d.ts +13 -1
- package/dist/src/setup/cli/select-state.js +1 -0
- package/dist/src/setup/cli/whimsy.d.ts +16 -0
- package/dist/src/setup/cli/whimsy.js +1 -0
- package/dist/src/setup/{scaffold/steps/setup-connection.d.ts → connection-connector.d.ts} +3 -2
- package/dist/src/setup/connection-connector.js +1 -0
- package/dist/src/setup/flows/channels.d.ts +43 -0
- package/dist/src/setup/flows/channels.js +1 -0
- package/dist/src/setup/flows/deploy.d.ts +40 -0
- package/dist/src/setup/flows/deploy.js +1 -0
- package/dist/src/setup/flows/in-project.d.ts +16 -0
- package/dist/src/setup/flows/in-project.js +1 -0
- package/dist/src/setup/flows/link.d.ts +43 -0
- package/dist/src/setup/flows/link.js +1 -0
- package/dist/src/setup/flows/model.d.ts +112 -0
- package/dist/src/setup/flows/model.js +1 -0
- package/dist/src/setup/flows/vercel.d.ts +31 -0
- package/dist/src/setup/flows/vercel.js +2 -0
- package/dist/src/setup/gateway-models.js +1 -1
- package/dist/src/setup/headless.d.ts +1 -1
- package/dist/src/setup/index.d.ts +10 -4
- package/dist/src/setup/index.js +1 -1
- package/dist/src/setup/onboarding.d.ts +7 -4
- package/dist/src/setup/onboarding.js +1 -1
- package/dist/src/setup/package-manager.d.ts +27 -0
- package/dist/src/setup/package-manager.js +1 -0
- package/dist/src/setup/primitives/index.d.ts +3 -0
- package/dist/src/setup/primitives/index.js +1 -0
- package/dist/src/setup/primitives/pm/bun.d.ts +10 -0
- package/dist/src/setup/primitives/pm/bun.js +1 -0
- package/dist/src/setup/primitives/pm/index.d.ts +11 -0
- package/dist/src/setup/primitives/pm/index.js +1 -0
- package/dist/src/setup/primitives/pm/npm.d.ts +10 -0
- package/dist/src/setup/primitives/pm/npm.js +1 -0
- package/dist/src/setup/primitives/pm/pnpm.d.ts +27 -0
- package/dist/src/setup/primitives/pm/pnpm.js +8 -0
- package/dist/src/setup/primitives/pm/run.d.ts +23 -0
- package/dist/src/setup/primitives/pm/run.js +1 -0
- package/dist/src/setup/primitives/pm/shared.d.ts +8 -0
- package/dist/src/setup/primitives/pm/shared.js +1 -0
- package/dist/src/setup/primitives/pm/types.d.ts +37 -0
- package/dist/src/setup/primitives/pm/types.js +1 -0
- package/dist/src/setup/primitives/pm/yarn.d.ts +10 -0
- package/dist/src/setup/primitives/pm/yarn.js +1 -0
- package/dist/src/setup/primitives/run-pnpm.d.ts +1 -0
- package/dist/src/setup/primitives/run-pnpm.js +1 -0
- package/dist/src/setup/{scaffold/primitives → primitives}/run-vercel.d.ts +7 -0
- package/dist/src/setup/primitives/run-vercel.js +1 -0
- package/dist/src/setup/project-name.d.ts +4 -0
- package/dist/src/setup/project-name.js +1 -0
- package/dist/src/setup/project-resolution.d.ts +54 -0
- package/dist/src/setup/project-resolution.js +1 -0
- package/dist/src/setup/prompter.d.ts +52 -4
- package/dist/src/setup/prompter.js +1 -1
- package/dist/src/setup/quit-guard.d.ts +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 +5 -4
- package/dist/src/setup/runner.js +1 -1
- package/dist/src/setup/scaffold/channels-catalog.d.ts +3 -3
- package/dist/src/setup/scaffold/channels-catalog.js +1 -1
- package/dist/src/setup/scaffold/create/add-to-project.d.ts +26 -0
- package/dist/src/setup/scaffold/create/add-to-project.js +1 -0
- package/dist/src/setup/scaffold/create/project.d.ts +54 -0
- package/dist/src/setup/scaffold/create/project.js +80 -0
- package/dist/src/setup/scaffold/index.d.ts +4 -4
- package/dist/src/setup/scaffold/index.js +1 -1
- package/dist/src/setup/scaffold/{channels.d.ts → update/channels.d.ts} +11 -0
- package/dist/src/setup/scaffold/update/channels.js +7 -0
- package/dist/src/setup/scaffold/{connections.d.ts → update/connections.d.ts} +1 -1
- package/dist/src/setup/scaffold/update/connections.js +21 -0
- package/dist/src/setup/scaffold/version-tokens.d.ts +11 -0
- package/dist/src/setup/scaffold/version-tokens.js +1 -0
- package/dist/src/setup/{scaffold/steps/setup-slackbot.d.ts → slackbot.d.ts} +24 -20
- package/dist/src/setup/slackbot.js +1 -0
- package/dist/src/setup/state.d.ts +62 -15
- package/dist/src/setup/state.js +1 -1
- package/dist/src/setup/step.d.ts +9 -18
- package/dist/src/setup/vercel-project.d.ts +15 -8
- package/dist/src/setup/vercel-project.js +1 -1
- package/dist/src/shared/agent-definition.d.ts +5 -3
- package/dist/src/shared/default-agent-model.d.ts +5 -0
- package/dist/src/shared/default-agent-model.js +1 -0
- package/dist/src/source-change/apply-model-name.d.ts +25 -0
- package/dist/src/source-change/apply-model-name.js +2 -0
- package/dist/src/source-change/static-source-change.d.ts +36 -0
- package/dist/src/source-change/static-source-change.js +1 -0
- 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/package.json +22 -42
- package/dist/docs/evals-v2-plan.md +0 -939
- package/dist/docs/public/advanced/dev-tui.md +0 -52
- package/dist/docs/public/advanced/evals.md +0 -158
- package/dist/docs/public/reference/faqs.md +0 -48
- package/dist/src/cli/commands/setup.d.ts +0 -55
- package/dist/src/cli/commands/setup.js +0 -1
- package/dist/src/cli/dev/repl/input-requests.d.ts +0 -38
- package/dist/src/cli/dev/repl/input-requests.js +0 -1
- package/dist/src/cli/dev/repl/input.d.ts +0 -19
- package/dist/src/cli/dev/repl/input.js +0 -1
- package/dist/src/cli/dev/repl/repl.d.ts +0 -62
- package/dist/src/cli/dev/repl/repl.js +0 -2
- package/dist/src/cli/dev/repl/terminal.d.ts +0 -21
- package/dist/src/cli/dev/repl/terminal.js +0 -5
- package/dist/src/compiled/_chunks/workflow/resume-hook-0Zk0zSvq.js +0 -12
- package/dist/src/compiled/_chunks/workflow/sleep-DXZr2BgM.js +0 -1
- package/dist/src/compiled/_chunks/workflow/symbols-BWCAoPHE.js +0 -48
- package/dist/src/evals/checks/checks.d.ts +0 -66
- package/dist/src/evals/checks/checks.js +0 -2
- package/dist/src/evals/checks/index.d.ts +0 -21
- package/dist/src/evals/checks/index.js +0 -1
- package/dist/src/evals/checks/match.js +0 -1
- package/dist/src/evals/define-eval-suite.d.ts +0 -18
- package/dist/src/evals/define-eval-suite.js +0 -1
- package/dist/src/evals/runner/execute-case.d.ts +0 -23
- package/dist/src/evals/runner/execute-case.js +0 -1
- package/dist/src/evals/runner/execute-suite.d.ts +0 -24
- package/dist/src/evals/runner/execute-suite.js +0 -1
- package/dist/src/evals/scorers/autoevals-client.js +0 -2
- package/dist/src/evals/scorers/autoevals.d.ts +0 -58
- package/dist/src/evals/scorers/autoevals.js +0 -1
- package/dist/src/evals/scorers/json.d.ts +0 -10
- package/dist/src/evals/scorers/json.js +0 -1
- package/dist/src/evals/scorers/model-marker.d.ts +0 -12
- package/dist/src/evals/scorers/model-marker.js +0 -1
- package/dist/src/evals/scorers/run.d.ts +0 -24
- package/dist/src/evals/scorers/run.js +0 -1
- package/dist/src/evals/scorers/sql.d.ts +0 -9
- package/dist/src/evals/scorers/sql.js +0 -1
- package/dist/src/evals/scorers/text.d.ts +0 -18
- package/dist/src/evals/scorers/text.js +0 -1
- package/dist/src/evals/scores/index.d.ts +0 -72
- package/dist/src/evals/scores/index.js +0 -1
- package/dist/src/execution/tool-compaction.d.ts +0 -9
- package/dist/src/execution/tool-compaction.js +0 -1
- package/dist/src/services/dev-client/stream.d.ts +0 -5
- package/dist/src/services/dev-client/stream.js +0 -1
- package/dist/src/services/dev-client/url.d.ts +0 -11
- package/dist/src/services/dev-client/url.js +0 -1
- package/dist/src/setup/channel-setup-prompter.d.ts +0 -8
- package/dist/src/setup/channel-setup-prompter.js +0 -1
- package/dist/src/setup/scaffold/channels.js +0 -7
- package/dist/src/setup/scaffold/cli/channel-add-prompter.d.ts +0 -12
- package/dist/src/setup/scaffold/cli/channel-add-prompter.js +0 -1
- package/dist/src/setup/scaffold/cli/channel-setup-prompter.d.ts +0 -56
- package/dist/src/setup/scaffold/cli/connection-add-prompter.d.ts +0 -44
- package/dist/src/setup/scaffold/cli/connection-add-prompter.js +0 -1
- package/dist/src/setup/scaffold/cli/index.js +0 -1
- package/dist/src/setup/scaffold/cli/prompt-ui.js +0 -5
- package/dist/src/setup/scaffold/cli/select-component.js +0 -1
- package/dist/src/setup/scaffold/cli/select-state.js +0 -1
- package/dist/src/setup/scaffold/connections.js +0 -21
- package/dist/src/setup/scaffold/pnpm-workspace.d.ts +0 -3
- package/dist/src/setup/scaffold/pnpm-workspace.js +0 -11
- package/dist/src/setup/scaffold/primitives/detect-deployment.d.ts +0 -13
- package/dist/src/setup/scaffold/primitives/detect-deployment.js +0 -1
- package/dist/src/setup/scaffold/primitives/index.d.ts +0 -3
- package/dist/src/setup/scaffold/primitives/index.js +0 -1
- package/dist/src/setup/scaffold/primitives/pnpm-invocation.d.ts +0 -12
- package/dist/src/setup/scaffold/primitives/pnpm-invocation.js +0 -1
- package/dist/src/setup/scaffold/primitives/run-pnpm.d.ts +0 -17
- package/dist/src/setup/scaffold/primitives/run-pnpm.js +0 -1
- package/dist/src/setup/scaffold/primitives/run-vercel.js +0 -1
- package/dist/src/setup/scaffold/project.d.ts +0 -21
- package/dist/src/setup/scaffold/project.js +0 -80
- package/dist/src/setup/scaffold/steps/deploy-to-vercel.d.ts +0 -17
- package/dist/src/setup/scaffold/steps/deploy-to-vercel.js +0 -1
- package/dist/src/setup/scaffold/steps/index.d.ts +0 -4
- package/dist/src/setup/scaffold/steps/index.js +0 -1
- package/dist/src/setup/scaffold/steps/project-resolution.d.ts +0 -19
- package/dist/src/setup/scaffold/steps/project-resolution.js +0 -1
- package/dist/src/setup/scaffold/steps/run-add-connection.d.ts +0 -40
- package/dist/src/setup/scaffold/steps/run-add-connection.js +0 -1
- package/dist/src/setup/scaffold/steps/run-add-to-agent.d.ts +0 -81
- package/dist/src/setup/scaffold/steps/run-add-to-agent.js +0 -2
- package/dist/src/setup/scaffold/steps/setup-connection.js +0 -1
- package/dist/src/setup/scaffold/steps/setup-slackbot.js +0 -1
- /package/dist/docs/public/{frontend → guides/frontend}/meta.json +0 -0
- /package/dist/docs/public/{advanced → guides}/remote-agents.md +0 -0
- /package/dist/src/{setup/scaffold/cli/channel-setup-prompter.js → cli/dev/tui/setup-flow.js} +0 -0
- /package/dist/src/evals/{scorers/autoevals-client.d.ts → autoevals-client.d.ts} +0 -0
- /package/dist/src/setup/{scaffold/cli → cli}/command-output.d.ts +0 -0
- /package/dist/src/setup/{scaffold/cli → cli}/command-output.js +0 -0
- /package/dist/src/setup/{scaffold/human-action.d.ts → human-action.d.ts} +0 -0
- /package/dist/src/setup/{scaffold/human-action.js → human-action.js} +0 -0
- /package/dist/src/setup/{scaffold/primitives → primitives}/process-output.d.ts +0 -0
- /package/dist/src/setup/{scaffold/primitives → primitives}/process-output.js +0 -0
- /package/dist/src/setup/scaffold/{web-template.d.ts → create/web-template.d.ts} +0 -0
- /package/dist/src/setup/scaffold/{web-template.js → create/web-template.js} +0 -0
- /package/dist/src/setup/scaffold/{module-files.d.ts → update/module-files.d.ts} +0 -0
- /package/dist/src/setup/scaffold/{module-files.js → update/module-files.js} +0 -0
- /package/dist/src/setup/scaffold/{package-json.d.ts → update/package-json.d.ts} +0 -0
- /package/dist/src/setup/scaffold/{package-json.js → update/package-json.js} +0 -0
- /package/dist/src/setup/scaffold/{primitives → update}/update-connection-connector.d.ts +0 -0
- /package/dist/src/setup/scaffold/{primitives → update}/update-connection-connector.js +0 -0
- /package/dist/src/setup/scaffold/{primitives → update}/update-slack-channel.d.ts +0 -0
- /package/dist/src/setup/scaffold/{primitives → update}/update-slack-channel.js +0 -0
|
@@ -0,0 +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,`
|
|
2
|
+
`);return`${t.green(`│`)}\n${t.green(`●`)} ${n}\n`}function formatPromptCancellation(e,t){let n=e.replace(/\n/g,`
|
|
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
|
+
`).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}),i=e.options[e.cursor];switch(e.state){case`submit`:{let t=i?renderSelectOption(i,`selected`,e.colors):``;return formatPromptSubmission(e.state,e.message,t,{colors:e.colors,leadingRail:e.leadingRail})}case`cancel`:return`${n}${t} ${i?e.colors.strikethrough(e.colors.dim(i.label)):``}\n${t}`;case`initial`:case`active`:case`error`:return`${n}${t} ${e.options.map((n,i)=>{let a=!n.disabled&&i===e.cursor,o=renderSelectOption(n,n.disabled?`disabled`:a?`active`:`inactive`,e.colors);if(!a||!n.description)return o;let s=e.colors.dim(n.description);return inlineOptionWidth(n)<=MAX_INLINE_OPTION_WIDTH?`${o} ${s}`:`${o}\n${t} ${s}`}).join(`\n${t} `)}\n${cornerWithNote(cornerFor(e.state,e.colors),e.footerNote)}\n`}}const MAX_INLINE_OPTION_WIDTH=80;function inlineOptionWidth(e){let t=e.hint?e.hint.length+3:0,n=e.description?e.description.length+2:0;return 5+e.label.length+t+n}function renderOptionRow(e){let{colors:t}=e,n=e.isCursor&&!e.disabled&&!e.locked,r=e.disabled?t.strikethrough(t.dim(e.label)):n?e.label:t.dim(e.label),i=n&&e.hint?t.dim(` (${e.hint})`):``,a=e.disabled?e.disabledReason:e.locked?e.lockedReason:void 0,o=a?t.dim(` (${a})`):``;return e.checkbox?`${n?t.green(`›`):` `} ${e.disabled?` `:e.locked?t.dim(t.green(`◼`)):e.isChecked?t.green(`◼`):t.dim(`◻`)} ${r}${i}${o}`:`${e.locked?t.dim(t.green(`✓`)):n?t.green(`›`):` `} ${r}${i}${o}`}function renderSubmitRow(e,t,n=`Submit`){let r=e?t.green(`›`):` `,i=t.bold(n);return`${r} ${e?i:t.dim(i)} ${t.green(`✓`)}`}function renderSelectOption(e,t,n){return t===`selected`?e.label:renderOptionRow({colors:n,label:e.label,hint:e.hint,isCursor:t===`active`,isChecked:!1,checkbox:!1,disabled:t===`disabled`,disabledReason:e.disabledReason,locked:e.locked,lockedReason:e.lockedReason})}function renderMultiselectRows(e){let t=new Set(e.selectedValues),n=e.options.map((n,r)=>renderMultiselectRow({colors:e.colors,isCursor:r===e.cursor,isSelected:t.has(n.value),option:n})).join(`\n${e.rail} `),r=renderSubmitRow(e.cursor===e.options.length,e.colors,e.submitLabel);return`${n}\n${e.rail}\n${e.rail} ${r}`}function renderMultiselectRow(e){return renderOptionRow({colors:e.colors,label:e.option.label,hint:e.option.hint,isCursor:e.isCursor,isChecked:e.isSelected,checkbox:!0,disabled:e.option.disabled,disabledReason:e.option.disabledReason,locked:e.option.locked,lockedReason:e.option.lockedReason})}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=e.filter.length>0?e.filter+t.inverse(` `):e.placeholder?t.dim(e.placeholder):t.inverse(` `),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=p.length===0?t.dim(`(no matches)`):p.map((n,r)=>renderOptionRow({colors:t,label:n.label,hint:n.hint,isCursor:!c&&r+d===l,isChecked:e.multiple&&i.has(n.value),checkbox:e.multiple,disabled:n.disabled,disabledReason:n.disabledReason,locked:n.locked,lockedReason:n.lockedReason})).join(`\n${n} `),h=e.multiple?`\n${n}\n${n} ${renderSubmitRow(c,t,e.submitLabel)}`:``,g=e.options.length>p.length?`\n${n} ${t.dim(`↑↓ ${e.options.length} options, showing ${d+1}–${f}`)}`:``,_=searchableHelpLine(n,t,e.multiple),v=`${n} ${t.dim(` `)} ${u}\n${n} ${m}${h}${g}${_}`;return e.state===`error`?`${r.trim()}\n${v}\n${cornerFor(e.state,t)} ${t.red(e.error??``)}\n`:`${r}${v}\n${cornerWithNote(cornerFor(e.state,t),e.footerNote)}\n`}export{CORNER,RAIL,bulletFor,cornerFor,formatPromptCancellation,formatPromptHeader,formatPromptOpener,formatPromptOutro,formatPromptSubmission,formatRailLine,railFor,renderMultiselectPrompt,renderOptionRow,renderSearchableSelect,renderSelectPrompt,renderSubmitRow};
|
|
@@ -24,6 +24,8 @@ export interface RailSpinner {
|
|
|
24
24
|
* checked in the colocated test.
|
|
25
25
|
*/
|
|
26
26
|
export declare const SPINNER_FRAMES: readonly ["⠨", "⠸", "⢸", "⢺", "⢾", "⢿", "⢾", "⢼", "⢸", "⠸", "⠨", "⠪", "⠮", "⠯", "⢯", "⢿", "⠿", "⠾", "⠺", "⠪"];
|
|
27
|
+
/** Delay between spinner frames. ~8 fps reads as a calm pulse. */
|
|
28
|
+
export declare const SPINNER_FRAME_MS = 120;
|
|
27
29
|
/** A rail log whose current command detail can be cleared before the next prompt is drawn. */
|
|
28
30
|
export interface RailLog extends ChannelSetupLog {
|
|
29
31
|
section?(title: string, lines: readonly string[]): void;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{formatPromptHeader,formatRailLine}from"./prompt-ui.js";const SPINNER_FRAMES=[`⠨`,`⠸`,`⢸`,`⢺`,`⢾`,`⢿`,`⢾`,`⢼`,`⢸`,`⠸`,`⠨`,`⠪`,`⠮`,`⠯`,`⢯`,`⢿`,`⠿`,`⠾`,`⠺`,`⠪`],SPINNER_CELLS=[...SPINNER_FRAMES[0]].length;function dotCount(e){let t=0;for(let n of e){let e=(n.codePointAt(0)??10240)-10240;for(;e>0;)t+=e&1,e>>=1}return t}const SPINNER_STATIC=SPINNER_FRAMES.reduce((e,t)=>dotCount(t)>dotCount(e)?t:e);function countRows(e){return e.split(`
|
|
2
|
-
`).length-1}function createRailLog(a){let o={kind:`idle`},s=a.output.isTTY===!0;function writeLine(e){a.output.write(formatRailLine(e,a.colors,a.output))}function clearPreview(){!s||o.kind===`idle`||o.previewRows===0||(a.output.write(`\u001B[${o.previewRows}A\u001B[J`),o.previewRows=0)}function settleStatus(e){if(o.kind!==`idle`){if(s&&(clearPreview(),e))for(let e of o.commandLines)writeLine(a.colors.dim(e));o={kind:`idle`}}}return{message(e){settleStatus(!1),writeLine(e),o={kind:`active`,commandLines:[],previewRows:0}},info(e){settleStatus(!1),writeLine(a.colors.dim(e))},success(e){settleStatus(!1),writeLine(a.colors.dim(e))},warning(e){settleStatus(!0),writeLine(a.colors.yellow(e))},error(e){settleStatus(!0),writeLine(a.colors.red(e))},commandOutput(e){if(o.kind===`idle`){writeLine(a.colors.dim(e));return}if(o.commandLines.push(e),!s){writeLine(a.colors.dim(e));return}clearPreview();let n=formatRailLine(a.colors.dim(e),a.colors,a.output);a.output.write(n),o.previewRows=countRows(n)},section(n,r){settleStatus(!1);let i=r.map(e=>formatRailLine(e,a.colors,a.output)).join(``);a.output.write(`${formatPromptHeader(`submit`,n,{colors:a.colors,leadingRail:`green`})}${i}`)},spinner(e){settleStatus(!1);let t=`${a.colors.green(`│`)}\n`,o=s&&a.output.columns?a.output.columns:80,c=Math.max(4,o-(SPINNER_CELLS+3)),l=e.length>c?`${e.slice(0,c-1)}…`:e,row=e=>`${a.colors.green(e)} ${l}`;if(!s)return a.output.write(`${t}${row(SPINNER_STATIC)}\n`),{stop(){}};let u=0;a.output.write(`${t}${row(SPINNER_FRAMES[0])}`);let d=setInterval(()=>{u+=1;let e=SPINNER_FRAMES[u%SPINNER_FRAMES.length]??SPINNER_FRAMES[0];a.output.write(`\r\u001B[K${row(e)}`)},120);d.unref?.();let f=!1;return{stop(){f||(f=!0,clearInterval(d),a.output.write(`\r\x1B[K\x1B[1A\r\x1B[K`))}}},settle(){settleStatus(!1)}}}export{SPINNER_FRAMES,createRailLog};
|
|
1
|
+
import{formatPromptHeader,formatRailLine}from"./prompt-ui.js";const SPINNER_FRAMES=[`⠨`,`⠸`,`⢸`,`⢺`,`⢾`,`⢿`,`⢾`,`⢼`,`⢸`,`⠸`,`⠨`,`⠪`,`⠮`,`⠯`,`⢯`,`⢿`,`⠿`,`⠾`,`⠺`,`⠪`],SPINNER_CELLS=[...SPINNER_FRAMES[0]].length;function dotCount(e){let t=0;for(let n of e){let e=(n.codePointAt(0)??10240)-10240;for(;e>0;)t+=e&1,e>>=1}return t}const SPINNER_STATIC=SPINNER_FRAMES.reduce((e,t)=>dotCount(t)>dotCount(e)?t:e),SPINNER_FRAME_MS=120;function countRows(e){return e.split(`
|
|
2
|
+
`).length-1}function createRailLog(a){let o={kind:`idle`},s=a.output.isTTY===!0;function writeLine(e){a.output.write(formatRailLine(e,a.colors,a.output))}function clearPreview(){!s||o.kind===`idle`||o.previewRows===0||(a.output.write(`\u001B[${o.previewRows}A\u001B[J`),o.previewRows=0)}function settleStatus(e){if(o.kind!==`idle`){if(s&&(clearPreview(),e))for(let e of o.commandLines)writeLine(a.colors.dim(e));o={kind:`idle`}}}return{message(e){settleStatus(!1),writeLine(e),o={kind:`active`,commandLines:[],previewRows:0}},info(e){settleStatus(!1),writeLine(a.colors.dim(e))},success(e){settleStatus(!1),writeLine(a.colors.dim(e))},warning(e){settleStatus(!0),writeLine(a.colors.yellow(e))},error(e){settleStatus(!0),writeLine(a.colors.red(e))},commandOutput(e){if(o.kind===`idle`){writeLine(a.colors.dim(e));return}if(o.commandLines.push(e),!s){writeLine(a.colors.dim(e));return}clearPreview();let n=formatRailLine(a.colors.dim(e),a.colors,a.output);a.output.write(n),o.previewRows=countRows(n)},section(n,r){settleStatus(!1);let i=r.map(e=>formatRailLine(e,a.colors,a.output)).join(``);a.output.write(`${formatPromptHeader(`submit`,n,{colors:a.colors,leadingRail:`green`})}${i}`)},spinner(e){settleStatus(!1);let t=`${a.colors.green(`│`)}\n`,o=s&&a.output.columns?a.output.columns:80,c=Math.max(4,o-(SPINNER_CELLS+3)),l=e.length>c?`${e.slice(0,c-1)}…`:e,row=e=>`${a.colors.green(e)} ${l}`;if(!s)return a.output.write(`${t}${row(SPINNER_STATIC)}\n`),{stop(){}};let u=0;a.output.write(`${t}${row(SPINNER_FRAMES[0])}`);let d=setInterval(()=>{u+=1;let e=SPINNER_FRAMES[u%SPINNER_FRAMES.length]??SPINNER_FRAMES[0];a.output.write(`\r\u001B[K${row(e)}`)},120);d.unref?.();let f=!1;return{stop(){f||(f=!0,clearInterval(d),a.output.write(`\r\x1B[K\x1B[1A\r\x1B[K`))}}},settle(){settleStatus(!1)}}}export{SPINNER_FRAMES,SPINNER_FRAME_MS,createRailLog};
|
|
@@ -33,7 +33,22 @@ export declare class SelectComponent extends Prompt<string | string[]> {
|
|
|
33
33
|
render: (this: Omit<SelectComponent, "prompt">) => string | undefined;
|
|
34
34
|
});
|
|
35
35
|
visibleOptions(): PromptOption<string>[];
|
|
36
|
-
/**
|
|
36
|
+
/** True when the multi-select cursor sits on the trailing Submit row. */
|
|
37
|
+
onSubmitRow(): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Submit-row label: "Skip" while an optional checklist has nothing picked,
|
|
40
|
+
* "Submit" as soon as one row is marked. Locked rows are mandatory rather
|
|
41
|
+
* than chosen, so they do not count as a pick; a required checklist always
|
|
42
|
+
* says "Submit" since an empty confirm cannot resolve it.
|
|
43
|
+
*/
|
|
44
|
+
submitLabel(): "Submit" | "Skip";
|
|
45
|
+
/**
|
|
46
|
+
* Enter resolves a single-select anywhere, but a multi-select only from its
|
|
47
|
+
* Submit row — on any other row it toggles the highlighted option instead,
|
|
48
|
+
* so enter can never accidentally skip the checklist.
|
|
49
|
+
*/
|
|
50
|
+
protected _shouldSubmit(): boolean;
|
|
51
|
+
/** Values that should render as chosen: the marked set, or the cursor for single. */
|
|
37
52
|
selectedValues(): string[];
|
|
38
53
|
/** The folded answer shown once the prompt resolves. */
|
|
39
54
|
submitDisplay(): string;
|
|
@@ -47,8 +62,8 @@ export declare class SelectComponent extends Prompt<string | string[]> {
|
|
|
47
62
|
* symbol when the prompt is cancelled (the caller maps that to its own error).
|
|
48
63
|
* Single-select returns the highlighted value, multi-select the marked set.
|
|
49
64
|
*
|
|
50
|
-
* Option values round-trip through
|
|
51
|
-
*
|
|
65
|
+
* Option values round-trip through opaque string keys so values of different
|
|
66
|
+
* primitive types cannot collide. `attachGuard` wires
|
|
52
67
|
* extra key handling (e.g. a two-stage quit guard) and supplies the live footer
|
|
53
68
|
* note; `leadingRail` colors the leader rail white for the first prompt in a
|
|
54
69
|
* sequence and green thereafter.
|
|
@@ -0,0 +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!this.multiple||this.onSubmitRow()?!0:(this.apply({type:`toggle`}),!1)}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};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { PromptOption, PromptValue } from "./prompt-ui.js";
|
|
2
|
+
export interface SelectOptionCodec<T extends PromptValue> {
|
|
3
|
+
readonly options: PromptOption<string>[];
|
|
4
|
+
encode(value: T): string;
|
|
5
|
+
decode(key: string): T;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Gives prompt options opaque transport keys while preserving their typed
|
|
9
|
+
* values. Primitive stringification is not injective (`1` and `"1"` collide),
|
|
10
|
+
* so renderer-facing keys must not be derived from option values.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createSelectOptionCodec<T extends PromptValue>(options: readonly PromptOption<T>[]): SelectOptionCodec<T>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function createSelectOptionCodec(e){let t=new Map,n=new Map;return{options:e.map((e,r)=>{if(n.has(e.value))throw Error(`Select option values must be unique; duplicate at index ${r}.`);let i=`option-${r}`;return n.set(e.value,i),t.set(i,e.value),{...e,value:i}}),encode(e){let t=n.get(e);if(t===void 0)throw Error(`Select initial value does not match an option.`);return t},decode(e){let n=t.get(e);if(n===void 0)throw Error(`Select returned an unknown option key: ${e}`);return n}}}export{createSelectOptionCodec};
|
|
@@ -26,10 +26,21 @@ export type SelectEvent = {
|
|
|
26
26
|
export interface SelectContext {
|
|
27
27
|
/** Selectable entries, including any disabled ones (the cursor skips them). */
|
|
28
28
|
options: readonly PromptOption<string>[];
|
|
29
|
+
/**
|
|
30
|
+
* Appends a virtual Submit row after the visible options. The cursor can
|
|
31
|
+
* land on it (index `visible.length`, see {@link submitRowIndex}) but it
|
|
32
|
+
* carries no value: `toggle` ignores it and {@link selectValueAtCursor}
|
|
33
|
+
* reads `undefined`. Multi-selects use it as the explicit confirm target.
|
|
34
|
+
*/
|
|
35
|
+
submitRow?: boolean;
|
|
29
36
|
}
|
|
37
|
+
/** Cursor index of the virtual Submit row: one past the visible options. */
|
|
38
|
+
export declare function submitRowIndex(visible: readonly PromptOption<string>[]): number;
|
|
30
39
|
/**
|
|
31
40
|
* Case-insensitive substring match across an option's label, value, and hint.
|
|
32
|
-
* An empty query returns every option
|
|
41
|
+
* An empty query returns every option, so the cursor can always scroll the
|
|
42
|
+
* full list; `featured` only shapes the searchable picker's default viewport,
|
|
43
|
+
* not which rows exist.
|
|
33
44
|
*/
|
|
34
45
|
export declare function filterOptions(options: readonly PromptOption<string>[], filter: string): PromptOption<string>[];
|
|
35
46
|
/**
|
|
@@ -53,6 +64,7 @@ export declare function initialSelectState(input: {
|
|
|
53
64
|
filter?: string;
|
|
54
65
|
defaultValue?: string;
|
|
55
66
|
initialValues?: readonly string[];
|
|
67
|
+
submitRow?: boolean;
|
|
56
68
|
}): SelectState;
|
|
57
69
|
/** Value of the highlighted entry, or `undefined` when it is missing or disabled. */
|
|
58
70
|
export declare function selectValueAtCursor(visible: readonly PromptOption<string>[], cursor: number): string | undefined;
|
|
@@ -0,0 +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 isNavigable(e){return!e.disabled&&!e.locked}function firstNavigableIndex(e,t){let n=e.findIndex(isNavigable);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&&isNavigable(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:firstNavigableIndex(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:firstNavigableIndex(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||!isNavigable(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=firstNavigableIndex(n,e.submitRow===!0);if(e.defaultValue!==void 0){let t=n.findIndex(t=>isNavigable(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&&isNavigable(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};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playful spinner copy for the slow network waits in setup. Pools are keyed by
|
|
3
|
+
* task on purpose: every message still names the step it belongs to, so when a
|
|
4
|
+
* wait hangs (or a Connect timeout fires) the preceding line tells the user
|
|
5
|
+
* which step is stuck. `{detail}` is replaced by the call site's specifics,
|
|
6
|
+
* e.g. a team slug.
|
|
7
|
+
*/
|
|
8
|
+
export type WhimsyTask = "auth" | "teams" | "projects" | "project-name" | "project-detect";
|
|
9
|
+
/**
|
|
10
|
+
* Picks one message from the task's pool, never the same one twice in a row.
|
|
11
|
+
* `pick` is injectable so tests (or deterministic contexts) can pin the
|
|
12
|
+
* choice; the default rolls per call.
|
|
13
|
+
*/
|
|
14
|
+
export declare function whimsyFor(task: WhimsyTask, detail?: string, pick?: () => number): string;
|
|
15
|
+
/** Exposed so tests can assert membership instead of pinning one phrasing. */
|
|
16
|
+
export declare const WHIMSY_POOLS: Record<WhimsyTask, readonly string[]>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const POOLS={auth:[`Knocking on Vercel's door...`,`Checking your Vercel login...`,`Making sure Vercel remembers you...`,`Flashing your Vercel badge...`,`Whispering the secret Vercel handshake...`,`Confirming you are who Vercel thinks you are...`],teams:[`Rounding up your Vercel teams...`,`Summoning your Vercel teams...`,`Asking Vercel which teams you run with...`,`Counting heads across your Vercel teams...`,`Taking attendance of your Vercel teams...`,`Mapping out your Vercel teams...`],projects:[`Leafing through the projects in {detail}...`,`Fetching the projects in {detail}...`,`Seeing what {detail} has been building...`,`Dusting off the projects in {detail}...`,`Taking inventory of {detail}'s projects...`,`Peeking into {detail}'s project shelf...`],"project-name":[`Checking that name against {detail}...`,`Making sure {detail} has room for that name...`,`Seeing if that project name is taken in {detail}...`,`Calling dibs on that name in {detail}...`,`Scanning {detail} for name collisions...`],"project-detect":[`Checking the current Vercel project...`,`Seeing which Vercel project lives here...`,`Sniffing out the Vercel project in this directory...`,`Reading this directory's Vercel papers...`,`Looking up who deploys this directory...`]},lastPick=new Map;function whimsyFor(t,n,r=Math.random){let i=POOLS[t];if(i.length<=1){let e=i[0]??``;return n===void 0?e:e.replaceAll(`{detail}`,n)}let a=lastPick.get(t),o=a===void 0?i.length:i.length-1,s=Math.min(o-1,Math.floor(r()*o));a!==void 0&&s>=a&&(s+=1),lastPick.set(t,s);let c=i[s]??i[0]??``;return n===void 0?c:c.replaceAll(`{detail}`,n)}const WHIMSY_POOLS=POOLS;export{WHIMSY_POOLS,whimsyFor};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ChannelSetupLog } from "#setup/cli/index.js";
|
|
2
2
|
/** Controls connector provisioning while adding a Connect-backed connection. */
|
|
3
3
|
export interface SetupConnectionConnectorOptions {
|
|
4
|
-
|
|
4
|
+
/** Status and command output stream through this log (rail styling preserved). */
|
|
5
|
+
log: ChannelSetupLog;
|
|
5
6
|
projectRoot: string;
|
|
6
7
|
/** Connection slug; also the connector `--name`. */
|
|
7
8
|
slug: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{join}from"node:path";import{readFile}from"node:fs/promises";import{createPromptCommandOutput}from"#setup/cli/index.js";import{captureVercel,runVercel,runVercelCaptureStdout}from"#setup/primitives/run-vercel.js";import{updateConnectionConnectorUid}from"#setup/scaffold/update/update-connection-connector.js";function parseCreatedConnector(e){let t=e.trim();if(!t)return;let n;try{n=JSON.parse(t)}catch{return}if(typeof n!=`object`||!n)return;let{uid:r,id:i}=n;if(!(typeof r!=`string`||typeof i!=`string`))return{uid:r,id:i}}function attachedToProject(e,t){return t===void 0||!Array.isArray(e.projects)?!1:e.projects.some(e=>typeof e==`object`&&!!e&&e.id===t)}function pickConnectConnector(e,t,n){if(typeof e!=`object`||!e)return;let r=e,i=r.connectors??r.clients;if(!Array.isArray(i))return;let a,o;for(let e of i){if(typeof e.service==`string`&&e.service!==t||typeof e.uid!=`string`||typeof e.id!=`string`)continue;let r={uid:e.uid,id:e.id},i=typeof e.createdAt==`number`?e.createdAt:0;(!o||i>o.createdAt)&&(o={ref:r,createdAt:i}),attachedToProject(e,n)&&(!a||i>a.createdAt)&&(a={ref:r,createdAt:i})}return(a??o)?.ref}async function readProjectId(n){try{let r=await readFile(join(n,`.vercel`,`project.json`),`utf8`),i=JSON.parse(r);return typeof i.projectId==`string`?i.projectId:void 0}catch{return}}async function ensureLinkedProject(e,t,n){return await readProjectId(t)||(e.message(`Linking a Vercel project for Connect...`),await runVercel([`link`],{cwd:t,onOutput:n}),readProjectId(t))}async function findConnector(e,t,n,i){let a=await captureVercel([`connect`,`list`,`-F`,`json`,`--all-projects`,`--service`,t],{cwd:e,onOutput:i});if(a.ok)try{return pickConnectConnector(JSON.parse(a.stdout),t,n)}catch{return}}async function setupConnectionConnector(e){let{log:t,projectRoot:r,slug:s,service:c,connectionFilePath:l}=e,u=createPromptCommandOutput(t),d=e.linkProject?await e.linkProject():await ensureLinkedProject(t,r,u);t.message(`Connecting ${s} via Vercel Connect...`);let f=await runVercelCaptureStdout([`connect`,`create`,c,`--name`,s,`-F`,`json`],{cwd:r,onOutput:u});if(!f.ok)return t.warning(`Could not create the connector. Run \`vercel connect create ${c} --name ${s}\`, then set the UID in agent/connections/${s}.ts.`),{kind:`create-failed`,created:!1};let p=parseCreatedConnector(f.stdout);if(p||=await findConnector(r,c,d,u),!p)return t.warning(`Could not locate the connector. Run \`vercel connect list --all-projects\` to find its UID, then set it in agent/connections/${s}.ts.`),{kind:`connector-unresolved`,created:!0};d?await runVercel([`connect`,`attach`,p.uid,`--yes`],{cwd:r,onOutput:u})||t.warning(`Created connector ${p.uid} but could not attach it to this project. Run \`vercel connect attach ${p.uid} --yes\`.`):t.warning(`Created connector ${p.uid} but no Vercel project is linked, so it isn't attached. Run \`vercel link\`, then \`vercel connect attach ${p.uid} --yes\`.`);let{patched:m}=await updateConnectionConnectorUid(l,p.uid);return m?(t.success(`Linked ${s} to ${p.uid}`),{kind:`patched`,created:!0,connectorUid:p.uid}):(t.warning(`Created connector ${p.uid}. Update \`connect("…")\` in agent/connections/${s}.ts to "${p.uid}".`),{kind:`patch-failed`,created:!0,connectorUid:p.uid})}export{parseCreatedConnector,pickConnectConnector,setupConnectionConnector};
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
+
import { inspectExistingChannelRegistrations } from "../channel-add-conflicts.js";
|
|
5
|
+
import { detectDeployment } from "../project-resolution.js";
|
|
6
|
+
import type { Prompter } from "../prompter.js";
|
|
7
|
+
/** Injected for tests; defaults to the real detection and box effects. */
|
|
8
|
+
export interface ChannelsFlowDeps {
|
|
9
|
+
detectDeployment: typeof detectDeployment;
|
|
10
|
+
inspectExistingChannelRegistrations: typeof inspectExistingChannelRegistrations;
|
|
11
|
+
addChannels?: AddChannelsDeps;
|
|
12
|
+
resolveProvisioning?: ResolveProvisioningDeps;
|
|
13
|
+
linkProject?: LinkProjectDeps;
|
|
14
|
+
}
|
|
15
|
+
export type ChannelsFlowResult = {
|
|
16
|
+
kind: "done";
|
|
17
|
+
addedChannels: readonly string[];
|
|
18
|
+
} | {
|
|
19
|
+
kind: "cancelled";
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* THE CHANNELS FLOW for the dev TUI's `/channels`: an action list that loops.
|
|
23
|
+
* Pick an unregistered channel, run its add sub-flow (Slack provisioning
|
|
24
|
+
* included), and land back on the repainted list; "Done" or Esc leaves. A
|
|
25
|
+
* cancelled sub-flow also returns to the list — channel files only land in
|
|
26
|
+
* the stack's final box, so the rows repaint unchanged. Esc on the list after
|
|
27
|
+
* something was added reports the additions exactly like Done (they already
|
|
28
|
+
* happened on disk); only an empty exit folds to cancelled.
|
|
29
|
+
*
|
|
30
|
+
* Each pick reuses the `eve channels add` composition — the same conflict
|
|
31
|
+
* validation, Vercel services config pinned on, and the default empty agent
|
|
32
|
+
* name (the Slack connector slug falls back to the package.json name) — with
|
|
33
|
+
* two TUI-specific differences: no trailing deploy box (the TUI exposes
|
|
34
|
+
* `/deploy` as its own command), and Slack from an unlinked directory links
|
|
35
|
+
* through the same team/project pickers as `/model`'s provider step instead of the bare
|
|
36
|
+
* interactive `vercel link` fallback, which cannot own the terminal while the
|
|
37
|
+
* TUI holds raw mode.
|
|
38
|
+
*/
|
|
39
|
+
export declare function runChannelsFlow(input: {
|
|
40
|
+
appRoot: string;
|
|
41
|
+
prompter: Prompter;
|
|
42
|
+
deps?: Partial<ChannelsFlowDeps>;
|
|
43
|
+
}): Promise<ChannelsFlowResult>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{interactiveAsker,withAnswers}from"../ask.js";import{detectDeployment,isProjectResolved,projectResolutionFromDeployment}from"../project-resolution.js";import{createDefaultSetupState,snapshotSetupState}from"../state.js";import{addChannels}from"../boxes/add-channels.js";import{linkVercelProject}from"../boxes/link-project.js";import{resolveProvisioning}from"../boxes/resolve-provisioning.js";import{CHANNELS_PROMPT_MESSAGE,selectChannels}from"../boxes/select-channels.js";import{assertCanAddSelectedChannels,inspectExistingChannelRegistrations}from"../channel-add-conflicts.js";import{WizardCancelledError}from"../step.js";import{runInteractive}from"../runner.js";import{prompterSink}from"./in-project.js";import{SCAFFOLDABLE_CHANNELS}from"#setup/scaffold/index.js";function channelListRows(e){let t=[];e.webRouteOwners.length>0&&t.push({value:`repl`,label:`Terminal UI`,locked:!0,lockedReason:`the REPL you're using now`});for(let n of SCAFFOLDABLE_CHANNELS){if(n.kind===`web`?e.webAppPresent:e.slackOwners.length>0){t.push({value:n.kind,label:n.label,locked:!0,lockedReason:`already added`});continue}let r=e.disabledChannelReasons[n.kind];if(r!==void 0){t.push({value:n.kind,label:n.label,disabled:!0,disabledReason:r});continue}let i={value:n.kind,label:n.label};n.hint!==void 0&&(i.hint=n.hint),t.push(i)}return t.push({value:`done`,label:`Done`}),t}async function runChannelsFlow(a){let{appRoot:o,prompter:s}=a,c={detectDeployment,inspectExistingChannelRegistrations,...a.deps};async function checkProject(e){let t=s.log.spinner?.(`Checking the project…`);try{return await e()}finally{t?.stop()}}let[l,u]=await checkProject(()=>Promise.all([c.detectDeployment(o),c.inspectExistingChannelRegistrations(o)])),d=u,f={...createDefaultSetupState(),project:projectResolutionFromDeployment(l),projectPath:{kind:`resolved`,inPlace:!0,path:o}},p={...resolveProvisioning({asker:withAnswers({deploy:`vercel`})(interactiveAsker(s)),prompter:s,targetDirectory:o,mode:{headless:!1},deps:c.resolveProvisioning}),shouldRun:e=>e.channelSelection.includes(`slack`)&&!isProjectResolved(e.project)};for(;;){let t;try{t=await s.select({message:CHANNELS_PROMPT_MESSAGE,options:channelListRows(d)})}catch(e){if(!(e instanceof WizardCancelledError))throw e;if(f.channels.length===0)return{kind:`cancelled`};break}if(t===`done`)break;if(t===`repl`)continue;let n=await runInteractive([selectChannels({asker:interactiveAsker(s),variant:`channels-add`,presetChannels:[t],validateSelection:e=>assertCanAddSelectedChannels(e,d)}),p,linkVercelProject({prompter:s,deps:c.linkProject}),addChannels({asker:interactiveAsker(s),prompter:s,configureVercelServices:!0,deps:c.addChannels})],f,prompterSink(s),{snapshot:snapshotSetupState});n.kind===`done`&&(f=n.state,d=await checkProject(()=>c.inspectExistingChannelRegistrations(o)))}return{kind:`done`,addedChannels:f.channels}}export{runChannelsFlow};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type DeployProjectDeps } from "../boxes/deploy-project.js";
|
|
2
|
+
import { type LinkProjectDeps } from "../boxes/link-project.js";
|
|
3
|
+
import { type ResolveProvisioningDeps } from "../boxes/resolve-provisioning.js";
|
|
4
|
+
import { detectDeployment } from "../project-resolution.js";
|
|
5
|
+
import type { Prompter } from "../prompter.js";
|
|
6
|
+
/** Injected for tests; defaults to the real detection and box effects. */
|
|
7
|
+
export interface DeployFlowDeps {
|
|
8
|
+
detectDeployment: typeof detectDeployment;
|
|
9
|
+
resolveProvisioning?: ResolveProvisioningDeps;
|
|
10
|
+
linkProject?: LinkProjectDeps;
|
|
11
|
+
deployProject?: DeployProjectDeps;
|
|
12
|
+
}
|
|
13
|
+
export type DeployFlowResult = {
|
|
14
|
+
kind: "deployed";
|
|
15
|
+
productionUrl?: string;
|
|
16
|
+
} | {
|
|
17
|
+
kind: "cancelled";
|
|
18
|
+
}
|
|
19
|
+
/** Unlinked directory in a non-interactive run: refused before any effect. */
|
|
20
|
+
| {
|
|
21
|
+
kind: "needs-link";
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* THE DEPLOY FLOW, shared by `eve deploy` and the dev TUI's `/deploy`. Link
|
|
25
|
+
* state is the safety-critical input for a deploy, so it is re-detected at
|
|
26
|
+
* decision time, never trusted from an earlier render. An already-linked
|
|
27
|
+
* project goes straight to the deploy box; an unlinked one walks the same
|
|
28
|
+
* team/project pickers as onboarding (resolve-provisioning with the deploy
|
|
29
|
+
* gate pre-answered — invoking deploy IS the deploy decision), then links
|
|
30
|
+
* non-interactively so the deploy box never hits its bare-`vercel link`
|
|
31
|
+
* fallback. A non-interactive run with no link refuses with `needs-link`
|
|
32
|
+
* before any side effect.
|
|
33
|
+
*/
|
|
34
|
+
export declare function runDeployFlow(input: {
|
|
35
|
+
appRoot: string;
|
|
36
|
+
prompter: Prompter;
|
|
37
|
+
/** False when no TTY: an unlinked directory refuses instead of prompting. */
|
|
38
|
+
interactive: boolean;
|
|
39
|
+
deps?: Partial<DeployFlowDeps>;
|
|
40
|
+
}): Promise<DeployFlowResult>;
|
|
@@ -0,0 +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,a={detectDeployment,...t.deps},o=r.log.spinner?.(`Checking the current Vercel link...`),s;try{s=projectResolutionFromDeployment(await a.detectDeployment(n))}finally{o?.stop()}let c=isProjectResolved(s);if(!c&&!i)return{kind:`needs-link`};let l=inProjectSetupState(n,s,{deploymentPending:!0}),u=c?[deployProject({prompter:r,headless:!i,deps:a.deployProject})]:[resolveProvisioning({asker:withAnswers({deploy:`vercel`})(interactiveAsker(r)),prompter:r,targetDirectory:n,mode:{headless:!1},deps:a.resolveProvisioning}),linkVercelProject({prompter:r,deps:a.linkProject}),deployProject({prompter:r,headless:!i,deps:a.deployProject})],d=prompterSink(r);if(!i)return{kind:`deployed`,productionUrl:productionUrlOf((await runHeadless(u,l,d,{snapshot:snapshotSetupState})).project)};let f=await runInteractive(u,l,d,{snapshot:snapshotSetupState});return f.kind===`cancelled`?{kind:`cancelled`}:{kind:`deployed`,productionUrl:productionUrlOf(f.state.project)}}export{runDeployFlow};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ProjectResolution } from "../project-resolution.js";
|
|
2
|
+
import type { Prompter } from "../prompter.js";
|
|
3
|
+
import { type SetupState } from "../state.js";
|
|
4
|
+
import type { OutputSink } from "../step.js";
|
|
5
|
+
/**
|
|
6
|
+
* Seeds the in-project {@link SetupState} the link and deploy flows start
|
|
7
|
+
* from: the detected (or deliberately unresolved) link, the directory basename
|
|
8
|
+
* as the agent name (it labels resolve-provisioning's "create a new project
|
|
9
|
+
* named X" row), and the resolved in-place project path. The channels flow
|
|
10
|
+
* seeds its own state instead — it must keep the default empty agent name so
|
|
11
|
+
* the Slack connector slug falls back to the package.json name, exactly like
|
|
12
|
+
* `eve channels add`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function inProjectSetupState(appRoot: string, project: ProjectResolution, seed?: Partial<SetupState>): SetupState;
|
|
15
|
+
/** Routes runner sink output through the prompter's log. */
|
|
16
|
+
export declare function prompterSink(prompter: Prompter): OutputSink;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createDefaultSetupState}from"../state.js";import{basename}from"node:path";function inProjectSetupState(n,r,i){return{...createDefaultSetupState(),project:r,agentName:basename(n),projectPath:{kind:`resolved`,inPlace:!0,path:n},...i}}function prompterSink(e){return{write:t=>e.log.message(t)}}export{inProjectSetupState,prompterSink};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type ApplyAiGatewayCredentialDeps } from "../boxes/apply-ai-gateway-credential.js";
|
|
2
|
+
import { findEnvFileWithKey } from "../boxes/detect-ai-gateway.js";
|
|
3
|
+
import { type LinkProjectDeps } from "../boxes/link-project.js";
|
|
4
|
+
import { type ResolveProvisioningDeps } from "../boxes/resolve-provisioning.js";
|
|
5
|
+
import { detectProjectIdentity } from "../project-resolution.js";
|
|
6
|
+
import type { Prompter } from "../prompter.js";
|
|
7
|
+
/** Injected for tests; defaults to the real detection and box effects. */
|
|
8
|
+
export interface LinkFlowDeps {
|
|
9
|
+
detectProjectIdentity: typeof detectProjectIdentity;
|
|
10
|
+
findEnvFileWithKey: typeof findEnvFileWithKey;
|
|
11
|
+
resolveProvisioning?: ResolveProvisioningDeps;
|
|
12
|
+
linkProject?: LinkProjectDeps;
|
|
13
|
+
applyAiGatewayCredential?: ApplyAiGatewayCredentialDeps;
|
|
14
|
+
}
|
|
15
|
+
export type LinkFlowResult = {
|
|
16
|
+
kind: "done";
|
|
17
|
+
/** The model credential verified in an env file, when one landed. */
|
|
18
|
+
credential?: "VERCEL_OIDC_TOKEN" | "AI_GATEWAY_API_KEY";
|
|
19
|
+
} | {
|
|
20
|
+
kind: "cancelled";
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* THE LINK FLOW, shared by `eve link` and the dev TUI `/model` menu's provider row (its
|
|
24
|
+
* "Connect via a project" branch): the same
|
|
25
|
+
* team/project pickers onboarding uses, then the actual `vercel link`, then a
|
|
26
|
+
* `vercel env pull` so the AI Gateway credential lands in `.env.local`.
|
|
27
|
+
*
|
|
28
|
+
* Re-link semantics: an already-linked directory shows its current link as a
|
|
29
|
+
* gate — one "Link to another project" option; Esc keeps the link and folds
|
|
30
|
+
* to cancelled — and only then runs the pickers. The new choice is
|
|
31
|
+
* authoritative (the state seeds an unresolved project so no stale link leaks
|
|
32
|
+
* into the boxes). Reaching this flow IS the "use Vercel" decision, so
|
|
33
|
+
* resolve-provisioning's deploy gate is pre-answered.
|
|
34
|
+
*
|
|
35
|
+
* Ends by verifying a model credential actually landed (`VERCEL_OIDC_TOKEN`
|
|
36
|
+
* or `AI_GATEWAY_API_KEY` in an env file) — an env pull can succeed without
|
|
37
|
+
* granting gateway access, and the difference is what the user acts on next.
|
|
38
|
+
*/
|
|
39
|
+
export declare function runLinkFlow(input: {
|
|
40
|
+
appRoot: string;
|
|
41
|
+
prompter: Prompter;
|
|
42
|
+
deps?: Partial<LinkFlowDeps>;
|
|
43
|
+
}): Promise<LinkFlowResult>;
|
|
@@ -0,0 +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{WizardCancelledError}from"../step.js";import{runInteractive}from"../runner.js";import{inProjectSetupState,prompterSink}from"./in-project.js";async function runLinkFlow(r){let{appRoot:i,prompter:a}=r,o={detectProjectIdentity,findEnvFileWithKey,...r.deps},s=a.log.spinner?.(`Checking the current Vercel link...`),c;try{c=await o.detectProjectIdentity(i)}finally{s?.stop()}if(c===void 0){let[e,t]=await Promise.all([o.findEnvFileWithKey(i,`AI_GATEWAY_API_KEY`),o.findEnvFileWithKey(i,`VERCEL_OIDC_TOKEN`)]),n=e??t;a.log.message(n===void 0?`This directory is not linked to a Vercel project yet.`:`This directory is not linked to a Vercel project yet — the model currently runs on credentials from ${n}.`)}else{let e=c.teamName===void 0?c.projectName:`${c.projectName} in ${c.teamName}`;try{await a.select({message:`Already linked to ${e}`,options:[{value:`relink`,label:`Link to another project`,hint:`picks a new team and project`}]})}catch(e){if(e instanceof WizardCancelledError)return{kind:`cancelled`};throw e}}let l=inProjectSetupState(i,{kind:`unresolved`});if((await runInteractive([resolveProvisioning({asker:withAnswers({deploy:`vercel`})(interactiveAsker(a)),prompter:a,targetDirectory:i,mode:{headless:!1},adoptExistingLink:!1,deps:o.resolveProvisioning}),linkVercelProject({prompter:a,deps:o.linkProject}),detectAiGateway(),applyAiGatewayCredential({prompter:a,deps:o.applyAiGatewayCredential})],l,prompterSink(a),{snapshot:snapshotSetupState})).kind===`cancelled`)return{kind:`cancelled`};let[u,d]=await Promise.all([o.findEnvFileWithKey(i,`VERCEL_OIDC_TOKEN`),o.findEnvFileWithKey(i,`AI_GATEWAY_API_KEY`)]);if(u===void 0&&d===void 0)a.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.");else{let e=[...u===void 0?[]:[`VERCEL_OIDC_TOKEN (${u})`],...d===void 0?[]:[`AI_GATEWAY_API_KEY (${d})`]].join(`, `);a.log.success(`Model credentials ready: ${e}.`)}a.log.message("A running `eve dev` reloads env files automatically — no restart needed.");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};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { type SelectModelDeps } from "../boxes/select-model.js";
|
|
2
|
+
import type { Prompter } from "../prompter.js";
|
|
3
|
+
import { runVercelFlow } from "./vercel.js";
|
|
4
|
+
/** Injected for tests; defaults to the real reads, fetches, and source edit. */
|
|
5
|
+
export interface ModelFlowDeps {
|
|
6
|
+
/** Reads the model the runtime currently serves; null before first compile. */
|
|
7
|
+
readCurrentModel: (appRoot: string) => Promise<string | null>;
|
|
8
|
+
/** Applies the picked slug to authored source. */
|
|
9
|
+
applyModel: (input: {
|
|
10
|
+
appRoot: string;
|
|
11
|
+
slug: string;
|
|
12
|
+
}) => Promise<ApplyModelOutcome>;
|
|
13
|
+
/** Catalog fetch behind the shared model picker. */
|
|
14
|
+
selectModel?: SelectModelDeps;
|
|
15
|
+
/** Reads how the model is backed right now, for the menu's provider row. */
|
|
16
|
+
detectProviderStatus: (appRoot: string) => Promise<ModelProviderStatus>;
|
|
17
|
+
/** The provider sub-flow behind the menu's provider row. */
|
|
18
|
+
runVercelFlow: typeof runVercelFlow;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* How the agent's model is backed right now, as far as the local directory
|
|
22
|
+
* shows: a linked Vercel project, a gateway credential in an env file, or
|
|
23
|
+
* nothing detectable. An external provider (own ANTHROPIC_API_KEY etc.)
|
|
24
|
+
* leaves no marker Eve owns, so it reads as `unset`.
|
|
25
|
+
*/
|
|
26
|
+
export type ModelProviderStatus = {
|
|
27
|
+
kind: "unset";
|
|
28
|
+
} | {
|
|
29
|
+
kind: "gateway-project";
|
|
30
|
+
projectName: string;
|
|
31
|
+
teamName?: string;
|
|
32
|
+
} | {
|
|
33
|
+
kind: "gateway-key";
|
|
34
|
+
envKey: "AI_GATEWAY_API_KEY" | "VERCEL_OIDC_TOKEN";
|
|
35
|
+
envFile: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* A provider sub-flow run that actually moved the provider: the credential
|
|
39
|
+
* the link flow verified landed in an env file (when one did), paired with
|
|
40
|
+
* the re-detected {@link ModelProviderStatus} — the same read the menu's
|
|
41
|
+
* provider row shows, so every surface reports one truth. The sub-flow's
|
|
42
|
+
* external-provider branch only shows instructions — nothing changes on
|
|
43
|
+
* disk — so it never surfaces as an outcome.
|
|
44
|
+
*/
|
|
45
|
+
export interface ModelProviderOutcome {
|
|
46
|
+
credential?: "VERCEL_OIDC_TOKEN" | "AI_GATEWAY_API_KEY";
|
|
47
|
+
status: ModelProviderStatus;
|
|
48
|
+
}
|
|
49
|
+
export type ModelFlowResult = {
|
|
50
|
+
kind: "cancelled";
|
|
51
|
+
} | {
|
|
52
|
+
kind: "done";
|
|
53
|
+
/** The last apply line, when the model was changed this session. */
|
|
54
|
+
modelMessage?: string;
|
|
55
|
+
/** The last provider sub-flow outcome, when one ran to completion. */
|
|
56
|
+
providerOutcome?: ModelProviderOutcome;
|
|
57
|
+
};
|
|
58
|
+
export declare const MODEL_MENU_MESSAGE = "Configure the agent's model";
|
|
59
|
+
/**
|
|
60
|
+
* Reads the provider status the menu shows. Detection order matters: a linked
|
|
61
|
+
* project subsumes any pulled credential (the link is what the user manages),
|
|
62
|
+
* and `AI_GATEWAY_API_KEY` outranks `VERCEL_OIDC_TOKEN` because it is the one
|
|
63
|
+
* the provider sub-flow's own-key branch writes.
|
|
64
|
+
*/
|
|
65
|
+
export declare function detectModelProviderStatus(appRoot: string): Promise<ModelProviderStatus>;
|
|
66
|
+
/**
|
|
67
|
+
* THE MODEL FLOW for the dev TUI's `/model`: a two-row action menu that
|
|
68
|
+
* loops, uniting the model pick and the provider setup behind one entry
|
|
69
|
+
* point. "Change model" runs the same searchable AI Gateway catalog picker
|
|
70
|
+
* onboarding uses ({@link selectModel}), pre-selected on the model the
|
|
71
|
+
* runtime currently serves, then the static source edit that bakes the
|
|
72
|
+
* choice into `agent.ts` (activation is the dev server's HMR watcher).
|
|
73
|
+
* The provider row runs {@link runVercelFlow} — the provider gate (AI
|
|
74
|
+
* Gateway or your own), then link-or-paste-a-key.
|
|
75
|
+
* Each sub-flow lands back on the repainted menu; Esc leaves. A
|
|
76
|
+
* cancelled sub-flow also returns to the menu. Esc after something completed
|
|
77
|
+
* reports it exactly like the channels flow (the effects already happened);
|
|
78
|
+
* only an empty exit folds to cancelled.
|
|
79
|
+
*/
|
|
80
|
+
export declare function runModelFlow(input: {
|
|
81
|
+
appRoot: string;
|
|
82
|
+
prompter: Prompter;
|
|
83
|
+
deps?: Partial<ModelFlowDeps>;
|
|
84
|
+
}): Promise<ModelFlowResult>;
|
|
85
|
+
/** The outcome of applying a model slug to the agent's authored source. */
|
|
86
|
+
export type ApplyModelOutcome = {
|
|
87
|
+
kind: "changed";
|
|
88
|
+
to: string;
|
|
89
|
+
} | {
|
|
90
|
+
kind: "unchanged";
|
|
91
|
+
model: string;
|
|
92
|
+
}
|
|
93
|
+
/** Invalid slug or an uneditable source — `message` says which and why. */
|
|
94
|
+
| {
|
|
95
|
+
kind: "rejected";
|
|
96
|
+
message: string;
|
|
97
|
+
};
|
|
98
|
+
/** The one-line transcript form of an apply outcome (`/model <slug>`'s reply). */
|
|
99
|
+
export declare function formatApplyModelOutcome(outcome: ApplyModelOutcome): string;
|
|
100
|
+
/**
|
|
101
|
+
* Applies a `/model <slug>` change to the local agent's authored source.
|
|
102
|
+
*
|
|
103
|
+
* This is the caller layer for the static source-change registry: it
|
|
104
|
+
* validates the slug against the AI Gateway model catalog, then edits
|
|
105
|
+
* `agent.ts` via {@link createStaticSourceChange}. Activation is the dev
|
|
106
|
+
* server's HMR watcher; {@link formatApplyModelOutcome} renders the outcome
|
|
107
|
+
* as the TUI's one-line reply.
|
|
108
|
+
*/
|
|
109
|
+
export declare function changeAgentModel(input: {
|
|
110
|
+
readonly appRoot: string;
|
|
111
|
+
readonly slug: string;
|
|
112
|
+
}): Promise<ApplyModelOutcome>;
|
|
@@ -0,0 +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{WizardCancelledError}from"../step.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=`Configure the agent's model`;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){let n={value:`model`,label:`Change model`};return e!==null&&(n.hint=e),[n,t.kind===`unset`?{value:`provider`,label:import_picocolors.default.bold(import_picocolors.default.yellow(`Configure provider`)),hint:`Required to enable the agent`}:{value:`provider`,label:`Change provider`,hint:providerStatusHint(t,import_picocolors.default.bold)}]}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:`Provider changed to ${providerStatusHint(e)}`}}async function detectModelProviderStatus(e){let[t,n,i]=await Promise.all([detectProjectIdentity(e),findEnvFileWithKey(e,`AI_GATEWAY_API_KEY`),findEnvFileWithKey(e,`VERCEL_OIDC_TOKEN`)]);if(t!==void 0){let e={kind:`gateway-project`,projectName:t.projectName};return t.teamName!==void 0&&(e.teamName=t.teamName),e}return n===void 0?i===void 0?{kind:`unset`}:{kind:`gateway-key`,envKey:`VERCEL_OIDC_TOKEN`,envFile:i}:{kind:`gateway-key`,envKey:`AI_GATEWAY_API_KEY`,envFile:n}}async function runModelFlow(e){let{appRoot:t,prompter:n}=e,r={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[i,a]=await checkProject(()=>Promise.all([r.readCurrentModel(t),r.detectProviderStatus(t)])),o,s,l,u;for(;;){let e;try{e=await n.select({message:MODEL_MENU_MESSAGE,options:modelMenuRows(i,a),layout:`stacked`,notices:[l,u].filter(e=>e!==void 0)})}catch(e){if(!(e instanceof WizardCancelledError))throw e;break}if(e===`model`){let e=await pickModelFromCatalog({appRoot:t,prompter:n,current:i,deps:r.selectModel});e!==void 0&&(o=await r.applyModel({appRoot:t,slug:e}),l=applyModelNotice(o),o.kind===`changed`&&(i=o.to));continue}let d=await r.runVercelFlow({appRoot:t,prompter:n});d.kind===`cancelled`||`outcome`in d||(a=await checkProject(()=>r.detectProviderStatus(t)),s={status:a},d.credential!==void 0&&(s.credential=d.credential),u=providerNotice(a))}if(o===void 0&&s===void 0)return{kind:`cancelled`};let d={kind:`done`};return o!==void 0&&(d.modelMessage=formatApplyModelOutcome(o)),s!==void 0&&(d.providerOutcome=s),d}async function pickModelFromCatalog(e){let{appRoot:t,prompter:r,current:a}=e,c=e.deps?.fetchModels??fetchGatewayCatalog,f={asker:interactiveAsker(r),deps:{fetchModels:async()=>{let e=r.log.spinner?.(`Loading the model catalog...`);try{return await c()}finally{e?.stop()}}}};a!==null&&(f.defaultModel=a);let p=await runInteractive([selectModel(f)],inProjectSetupState(t,{kind:`unresolved`}),prompterSink(r),{snapshot:snapshotSetupState});return p.kind===`cancelled`?void 0:p.state.modelId}function formatApplyModelOutcome(e){switch(e.kind){case`changed`:return`Model → \`${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);return t?.manifest.config.model.id??null}catch{return null}}export{MODEL_MENU_MESSAGE,changeAgentModel,detectModelProviderStatus,formatApplyModelOutcome,runModelFlow};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { appendEnv } from "../append-env.js";
|
|
2
|
+
import type { Prompter } from "../prompter.js";
|
|
3
|
+
import { runLinkFlow, type LinkFlowResult } from "./link.js";
|
|
4
|
+
export declare const PROVIDER_QUESTION = "Which model provider do you want to use?";
|
|
5
|
+
export declare const CONNECTION_QUESTION = "How do you want to connect to AI Gateway?";
|
|
6
|
+
export declare const EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE = "Using another model provider";
|
|
7
|
+
export declare const EXTERNAL_PROVIDER_INSTRUCTIONS: readonly string[];
|
|
8
|
+
/** Injected for tests; defaults to the real link flow and env write. */
|
|
9
|
+
export interface VercelFlowDeps {
|
|
10
|
+
runLinkFlow: typeof runLinkFlow;
|
|
11
|
+
appendEnv: typeof appendEnv;
|
|
12
|
+
}
|
|
13
|
+
export type VercelFlowResult = LinkFlowResult | {
|
|
14
|
+
kind: "done";
|
|
15
|
+
/** The user runs a non-gateway provider; nothing was linked or written. */
|
|
16
|
+
outcome: "external-provider";
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* THE PROVIDER FLOW behind the dev TUI `/model` menu's provider row
|
|
20
|
+
* (`eve link` keeps {@link runLinkFlow}'s shape). Two entry questions make
|
|
21
|
+
* the provider choice explicit before any link machinery runs: a provider
|
|
22
|
+
* gate (AI Gateway, or instructions for everything else) and a connection
|
|
23
|
+
* gate (link a project, or paste an `AI_GATEWAY_API_KEY` that lands in
|
|
24
|
+
* `.env.local`). The "Connect via a project" branch is exactly the link
|
|
25
|
+
* flow, link detection and all.
|
|
26
|
+
*/
|
|
27
|
+
export declare function runVercelFlow(input: {
|
|
28
|
+
appRoot: string;
|
|
29
|
+
prompter: Prompter;
|
|
30
|
+
deps?: Partial<VercelFlowDeps>;
|
|
31
|
+
}): Promise<VercelFlowResult>;
|
|
@@ -0,0 +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(t){let{appRoot:n,prompter:r}=t,i={runLinkFlow,appendEnv,...t.deps},a,o;try{a=await r.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`}]}),a===`gateway`&&(o=await r.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}`}]}))}catch(e){if(e instanceof WizardCancelledError)return{kind:`cancelled`};throw e}if(a===`other`)return r.acknowledge?await r.acknowledge({message:EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE,lines:EXTERNAL_PROVIDER_INSTRUCTIONS}):r.note(EXTERNAL_PROVIDER_INSTRUCTIONS.join(`
|
|
2
|
+
`),EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE),{kind:`done`,outcome:`external-provider`};if(o===`own-key`){let e;try{e=await r.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}return await i.appendEnv(join(n,ENV_FILE_NAME),{[AI_GATEWAY_ENV_KEY]:e.trim()},{force:!0}),r.log.success(`Saved ${AI_GATEWAY_ENV_KEY} to ${ENV_FILE_NAME}.`),r.log.message("A running `eve dev` reloads env files automatically — no restart needed."),{kind:`done`,credential:AI_GATEWAY_ENV_KEY}}return await i.runLinkFlow({appRoot:n,prompter:r})}export{CONNECTION_QUESTION,EXTERNAL_PROVIDER_INSTRUCTIONS,EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE,PROVIDER_QUESTION,runVercelFlow};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{captureVercel}from"#setup/
|
|
1
|
+
import{captureVercel}from"#setup/primitives/index.js";async function fetchGatewayModelIds(t){let n=await captureVercel([`curl`,`https://ai-gateway.vercel.sh/v1/models`,`--`,`--silent`],{cwd:t});if(!n.ok)return null;try{let e=JSON.parse(n.stdout);if(!Array.isArray(e.data))return null;let t=e.data.map(e=>e.id).filter(e=>typeof e==`string`);return new Set(t)}catch{return null}}export{fetchGatewayModelIds};
|
|
@@ -13,7 +13,7 @@ export type HeadlessLogSink = (text: string) => void;
|
|
|
13
13
|
/**
|
|
14
14
|
* A {@link Prompter} that never blocks on input. Every interactive method
|
|
15
15
|
* rejects with {@link HeadlessPromptError}; log output is forwarded to `sink`.
|
|
16
|
-
* Used by
|
|
16
|
+
* Used by non-interactive setup callers so an AI agent can
|
|
17
17
|
* drive the create flow non-interactively: when a flag is missing the run
|
|
18
18
|
* fails fast with a precise message instead of hanging on a TTY prompt.
|
|
19
19
|
*/
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
export { type
|
|
2
|
-
export {
|
|
1
|
+
export { type OutputSink, type SetupBox, WizardCancelledError } from "./step.js";
|
|
2
|
+
export { InteractionRequired } from "./ask.js";
|
|
3
|
+
export { type AiGatewayEnvFile, type ArgsHeadlessAiGateway, type ArgsHeadlessProject, type ChannelKind, type ChatPreference, createDefaultSetupState, requireProjectPath, type ResolvedAiGateway, type ResolvedAiGatewayCredentials, type ResolvedProjectPath, type ResolvedVercelProject, type ResolvedVercelProjectSpec, type SetupMode, type SetupState, snapshotSetupState, type WiringMode, } from "./state.js";
|
|
3
4
|
export { type AnySetupBox, runHeadless, runInteractive, type RunnerOptions, type RunResult, } from "./runner.js";
|
|
4
|
-
export { createPrompter, type MultiSelectOptions, type Prompter, type PrompterValue, type SelectCommonOptions, type SelectOption, type SingleSelectOptions, } from "./prompter.js";
|
|
5
|
+
export { createPrompter, type MultiSelectOptions, type NoteTone, type Prompter, type PrompterValue, type SelectCommonOptions, type SelectOption, type SingleSelectOptions, } from "./prompter.js";
|
|
5
6
|
export { createHeadlessPrompter, formatHeadlessEvent, type HeadlessEvent, type HeadlessLogSink, type HeadlessNextStep, HeadlessPromptError, } from "./headless.js";
|
|
6
7
|
export { composeOnboardingBoxes, type OnboardingBoxesOptions } from "./onboarding.js";
|
|
8
|
+
export { createPromptCommandOutput, type PromptCommandLog } from "./cli/index.js";
|
|
9
|
+
export { getPackageManagerStrategy, runPackageManagerInstall, runPnpmInstall, runVercel, spawnPackageManager, spawnPnpm, type PackageManagerStrategy, type RunPackageManagerOptions, type RunPnpmOptions, type RunVercelOptions, } from "./primitives/index.js";
|
|
10
|
+
export { detectDeployment, detectProjectResolution, projectProductionUrlFromResolution, type DeploymentInfo, type DeploymentState, type ProjectResolution, } from "./project-resolution.js";
|
|
7
11
|
export { runVercelEnvPull } from "./run-vercel-link.js";
|
|
8
|
-
export {
|
|
12
|
+
export { provisionSlackbot, reconcileSlackUid, type ProvisionSlackbotResult } from "./slackbot.js";
|
|
13
|
+
export { setupConnectionConnector, type SetupConnectionConnectorOptions, type SetupConnectionConnectorResult, } from "./connection-connector.js";
|
|
14
|
+
export { linkProject, requireAuth, resolveProjectByNameOrId, resolveTeam, } from "./vercel-project.js";
|
package/dist/src/setup/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createDefaultSetupState,requireProjectPath,snapshotSetupState}from"./state.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{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{WizardCancelledError}from"./step.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};
|