eve 0.51.0 → 0.51.1
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 +23 -0
- package/dist/src/channel/session.d.ts +2 -1
- package/dist/src/channel/session.js +1 -1
- package/dist/src/channel/types.d.ts +4 -1
- package/dist/src/chunks/{use-eve-agent-C3vUG5g2.js → use-eve-agent-3DZuvuWE.js} +17 -6
- package/dist/src/chunks/{use-eve-agent-B4xN7-fK.js → use-eve-agent-D7apPojZ.js} +17 -6
- package/dist/src/cli/agent-command.js +1 -1
- package/dist/src/cli/commands/agent-instructions.d.ts +3 -1
- package/dist/src/cli/commands/agent-instructions.js +1 -1
- package/dist/src/cli/commands/build.js +1 -1
- package/dist/src/cli/commands/deploy.js +1 -1
- package/dist/src/cli/commands/init-agent-workspace.js +1 -1
- package/dist/src/cli/commands/init-repl.js +1 -1
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/commands/integration-connect.js +1 -1
- package/dist/src/cli/commands/link.js +1 -1
- package/dist/src/cli/commands/preconditions.js +1 -1
- package/dist/src/cli/commands/register-project-commands.d.ts +1 -1
- package/dist/src/cli/commands/register-project-commands.js +1 -1
- package/dist/src/cli/commands/registry.js +1 -1
- package/dist/src/cli/dev/environment.js +1 -1
- package/dist/src/cli/dev/run-interactive-ui.js +1 -1
- package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
- package/dist/src/cli/dev/tui/setup-commands.d.ts +3 -1
- package/dist/src/cli/dev/tui/setup-commands.js +1 -1
- package/dist/src/cli/run.js +3 -3
- package/dist/src/client/open-stream.js +1 -1
- package/dist/src/client/session-controls.d.ts +3 -0
- package/dist/src/client/session-controls.js +1 -1
- package/dist/src/client/session.d.ts +4 -1
- package/dist/src/compiled/.vendor-stamp.json +11 -11
- package/dist/src/compiled/@clack/core/LICENSE +9 -0
- package/dist/src/compiled/@clack/core/index.d.ts +363 -0
- package/dist/src/compiled/@clack/core/index.js +20 -0
- package/dist/src/compiled/@eve/catalog/index.js +1 -1
- package/dist/src/compiled/@vercel/sandbox/api-client/api-client.d.ts +34 -92
- package/dist/src/compiled/@vercel/sandbox/api-client/base-client.d.ts +1 -1
- package/dist/src/compiled/@vercel/sandbox/api-client/index.d.ts +1 -1
- package/dist/src/compiled/@vercel/sandbox/api-client/validators.d.ts +13 -29
- package/dist/src/compiled/@vercel/sandbox/constants.d.ts +11 -1
- package/dist/src/compiled/@vercel/sandbox/index.d.ts +3 -3
- package/dist/src/compiled/@vercel/sandbox/index.js +9 -9
- package/dist/src/compiled/@vercel/sandbox/sandbox-user.d.ts +5 -6
- package/dist/src/compiled/@vercel/sandbox/sandbox.d.ts +79 -67
- package/dist/src/compiled/@vercel/sandbox/session.d.ts +5 -3
- package/dist/src/compiled/@vercel/sandbox/snapshot.d.ts +9 -0
- package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/api-client/api-client.d.ts +86 -1
- package/dist/src/compiled/@vercel/sandbox-drives/api-client/index.d.ts +2 -0
- package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/api-client/validators.d.ts +26 -1
- package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/constants.d.ts +2 -2
- package/dist/src/compiled/@vercel/{sandbox → sandbox-drives}/drive.d.ts +10 -0
- package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/index.d.ts +3 -2
- package/dist/src/compiled/@vercel/sandbox-drives/index.js +9 -0
- package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/sandbox.d.ts +35 -6
- package/dist/src/compiled/@workflow/core/index.js +1 -1
- package/dist/src/compiled/@workflow/core/private.d.ts +2 -4
- package/dist/src/compiled/@workflow/core/private.js +1 -1
- package/dist/src/compiled/@workflow/core/runtime/constants.d.ts +9 -7
- package/dist/src/compiled/@workflow/core/runtime/helpers.d.ts +13 -0
- package/dist/src/compiled/@workflow/core/runtime/suspension-handler.d.ts +54 -1
- package/dist/src/compiled/@workflow/core/runtime.js +3 -3
- package/dist/src/compiled/@workflow/core/serialization/types.d.ts +7 -0
- package/dist/src/compiled/@workflow/core/serialization.d.ts +24 -2
- package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
- package/dist/src/compiled/@workflow/core/workflow.js +1 -1
- package/dist/src/compiled/@workflow/errors/error-codes.d.ts +2 -0
- package/dist/src/compiled/@workflow/errors/index.d.ts +19 -0
- package/dist/src/compiled/@workflow/errors/index.js +1 -1
- package/dist/src/compiled/@workflow/world/analytics.d.ts +46 -2
- package/dist/src/compiled/@workflow/world/events.d.ts +26 -1
- package/dist/src/compiled/@workflow/world/index.d.ts +1 -1
- package/dist/src/compiled/@workflow/world/runs.d.ts +2 -2
- package/dist/src/compiled/@workflow/world-local/index.js +3 -3
- package/dist/src/compiled/@workflow/world-vercel/index.js +12 -12
- package/dist/src/compiled/_chunks/node/{auth-BSKyPAEP.js → auth-Bx1Aoyfo.js} +1 -1
- package/dist/src/compiled/_chunks/node/{auth-YpKlwhP1.js → auth-CA8ZMfB8.js} +1 -1
- package/dist/src/compiled/_chunks/node/esm-CE0tAvRh.js +7 -0
- package/dist/src/compiled/_chunks/node/version-BC6t2Txc.js +1 -0
- package/dist/src/compiled/_chunks/node/version-DSQqVZ5T.js +1 -0
- package/dist/src/compiled/_chunks/workflow/{attribute-changes-BwAadFfB.js → attribute-changes-03lzo29R.js} +1 -1
- package/dist/src/compiled/_chunks/workflow/dist-BIdMK5N8.js +40 -0
- package/dist/src/compiled/_chunks/workflow/dist-DMQ3CtWt.js +3 -0
- package/dist/src/compiled/_chunks/workflow/frames-Boesh7kU.js +3 -0
- package/dist/src/compiled/_chunks/workflow/{private-CZFMABEf.js → private-CKx3PkSS.js} +1 -1
- package/dist/src/compiled/_chunks/workflow/{resume-hook-BToMtPbH.js → resume-hook-C6eL-S_T.js} +1 -1
- package/dist/src/compiled/_chunks/workflow/run-BV0S6Zc2.js +1 -0
- package/dist/src/compiled/_chunks/workflow/sleep-Bh3jP9ii.js +1 -0
- package/dist/src/compiled/_chunks/workflow/wait-until-l-cwfJvm.js +15 -0
- package/dist/src/compiled/_chunks/workflow/{ws-transport-PnVVxT0R.js → ws-transport-BagXNxCE.js} +1 -1
- package/dist/src/compiler/compile-from-memory.d.ts +1 -0
- package/dist/src/compiler/extension-compatibility.d.ts +20 -20
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/compiler/manifest.d.ts +2 -2
- package/dist/src/compiler/manifest.js +1 -1
- package/dist/src/compiler/normalize-agent-config.js +1 -1
- package/dist/src/compiler/normalize-tool.js +1 -1
- package/dist/src/discover/extensions.d.ts +2 -0
- package/dist/src/discover/extensions.js +1 -1
- package/dist/src/discover/filesystem.d.ts +1 -0
- package/dist/src/discover/filesystem.js +1 -1
- package/dist/src/discover/project.js +1 -1
- package/dist/src/evals/runner/execute-task.js +1 -1
- package/dist/src/evals/session-cleanup.d.ts +7 -0
- package/dist/src/evals/session-cleanup.js +1 -0
- package/dist/src/evals/session.d.ts +4 -0
- package/dist/src/evals/session.js +1 -1
- package/dist/src/eve-channel/index.js +1 -1
- package/dist/src/eve-channel/request.d.ts +1 -0
- package/dist/src/eve-channel/request.js +1 -1
- package/dist/src/execution/activity-collector.js +1 -1
- package/dist/src/execution/activity-work.d.ts +8 -0
- package/dist/src/execution/activity-work.js +1 -1
- package/dist/src/execution/cancel-indexed-session-tasks-step.d.ts +6 -0
- package/dist/src/execution/cancel-indexed-session-tasks-step.js +1 -0
- package/dist/src/execution/coordination-dispatch-shared.js +1 -1
- package/dist/src/execution/coordination-dispatch-step.js +1 -1
- package/dist/src/execution/create-session-step.js +1 -1
- package/dist/src/execution/inline-turn.d.ts +2 -0
- package/dist/src/execution/inline-turn.js +1 -1
- package/dist/src/execution/next-driver-action.d.ts +0 -3
- package/dist/src/execution/parked-delivery-wait.js +1 -1
- package/dist/src/execution/proxied-deliver-step.js +1 -1
- package/dist/src/execution/run-session-limits.d.ts +5 -5
- package/dist/src/execution/sandbox/bindings/vercel-create-sdk.js +1 -1
- package/dist/src/execution/sandbox/bindings/vercel-sdk-types.d.ts +4 -4
- package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
- package/dist/src/execution/session-activity-projection.js +1 -1
- package/dist/src/execution/session-activity.js +1 -1
- package/dist/src/execution/session-timeout-workflow.js +1 -1
- package/dist/src/execution/session.d.ts +1 -0
- package/dist/src/execution/session.js +1 -1
- package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
- package/dist/src/execution/tasks/child/steps.d.ts +8 -0
- package/dist/src/execution/tasks/child/steps.js +1 -1
- package/dist/src/execution/tasks/child/workflow.d.ts +2 -0
- package/dist/src/execution/tasks/child/workflow.js +1 -1
- package/dist/src/execution/tasks/parent/control-shared.js +1 -1
- package/dist/src/execution/tasks/parent/delegate.d.ts +2 -0
- package/dist/src/execution/tasks/parent/delegate.js +1 -1
- package/dist/src/execution/tasks/parent/hitl-proxy-steps.js +1 -1
- package/dist/src/execution/tasks/parent/subagent-task-projection.d.ts +26 -0
- package/dist/src/execution/tasks/parent/subagent-task-projection.js +1 -0
- package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
- package/dist/src/execution/terminate-child-sessions-step.js +1 -1
- package/dist/src/execution/tools/sleep-workflow.d.ts +3 -0
- package/dist/src/execution/tools/sleep-workflow.js +1 -0
- package/dist/src/execution/tools/sleep.d.ts +1 -5
- package/dist/src/execution/tools/sleep.js +1 -1
- package/dist/src/execution/tools/subagent/accept-event-step.js +1 -1
- package/dist/src/execution/tools/subagent/invoke-step.js +1 -1
- package/dist/src/execution/tools/workflow/workflow.js +1 -1
- package/dist/src/execution/turn-cancellation-control.d.ts +1 -0
- package/dist/src/execution/turn-cancellation-control.js +1 -1
- package/dist/src/execution/turn-cancellation-token.d.ts +1 -0
- package/dist/src/execution/turn-control-receiver.d.ts +3 -0
- package/dist/src/execution/turn-control-receiver.js +1 -1
- package/dist/src/execution/turn-dispatch.d.ts +2 -0
- package/dist/src/execution/turn-dispatch.js +1 -1
- package/dist/src/execution/turn-workflow.js +1 -1
- package/dist/src/execution/wire/session-inbox-contract.d.ts +2 -2
- package/dist/src/execution/wire/session-inbox-contract.js +1 -1
- package/dist/src/execution/wire/session-inbox-encoder.d.ts +10 -2
- package/dist/src/execution/wire/session-inbox-encoder.js +1 -1
- package/dist/src/execution/wire/session-inbox-resume.js +1 -1
- package/dist/src/execution/wire/session-inbox-wire.js +1 -1
- package/dist/src/execution/wire/session-inbox-wire.v5.d.ts +341 -0
- package/dist/src/execution/wire/session-inbox-wire.v5.js +1 -0
- package/dist/src/execution/wire/session-inbox-wire.v5.migration.d.ts +3 -0
- package/dist/src/execution/wire/session-inbox-wire.v5.migration.js +1 -0
- package/dist/src/execution/wire/session-inbox-wire.v6.d.ts +341 -0
- package/dist/src/execution/wire/session-inbox-wire.v6.js +1 -0
- package/dist/src/execution/workflow-entry.js +1 -1
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/session-limit-continuation.d.ts +5 -5
- package/dist/src/harness/session-limit-continuation.js +1 -1
- package/dist/src/harness/session-limit-enforcement.d.ts +4 -4
- package/dist/src/harness/session-limit-enforcement.js +1 -1
- package/dist/src/harness/session-usage-limits.d.ts +48 -0
- package/dist/src/harness/session-usage-limits.js +1 -0
- package/dist/src/harness/tool-loop.js +2 -2
- package/dist/src/harness/turn-tag-state.d.ts +17 -20
- package/dist/src/harness/turn-tag-state.js +1 -1
- package/dist/src/harness/types.d.ts +5 -0
- package/dist/src/internal/application/build-output-environment.d.ts +1 -0
- package/dist/src/internal/application/build-output-environment.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/core.js +1 -1
- package/dist/src/internal/eve-project-root.d.ts +8 -0
- package/dist/src/internal/eve-project-root.js +1 -0
- package/dist/src/internal/invocation/workflow-execution.js +1 -1
- package/dist/src/internal/nitro/host/build-application.js +1 -1
- package/dist/src/internal/nitro/host/create-application-nitro.d.ts +1 -0
- package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
- package/dist/src/internal/nitro/host/types.d.ts +2 -0
- package/dist/src/internal/nitro/host/vercel-build-output-config.d.ts +1 -0
- package/dist/src/internal/nitro/host/vercel-build-output-config.js +1 -1
- package/dist/src/internal/project-context.d.ts +13 -8
- package/dist/src/internal/project-context.js +1 -1
- package/dist/src/internal/vercel/build-agent-workspace.d.ts +1 -1
- package/dist/src/internal/vercel/build-agent-workspace.js +1 -1
- package/dist/src/internal/vercel/eve-service-contribution.d.ts +1 -0
- package/dist/src/internal/vercel/eve-service-contribution.js +1 -1
- package/dist/src/internal/workflow/reference.d.ts +2 -0
- package/dist/src/internal/workflow/reference.js +1 -0
- package/dist/src/internal/workflow-bundle/authored-workflow-modules.d.ts +0 -9
- package/dist/src/internal/workflow-bundle/authored-workflow-modules.js +1 -1
- package/dist/src/internal/workflow-bundle/builder.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/internal/workflow-bundle/workflow-transformer.d.ts +1 -1
- package/dist/src/internal/workflow-bundle/workflow-transformer.js +1 -1
- package/dist/src/public/channels/slack/activity-plan.d.ts +4 -0
- package/dist/src/public/channels/slack/activity-plan.js +1 -0
- package/dist/src/public/channels/slack/activity.d.ts +45 -2
- package/dist/src/public/channels/slack/activity.js +2 -1
- package/dist/src/public/channels/slack/index.d.ts +1 -1
- package/dist/src/public/channels/slack/index.js +1 -1
- package/dist/src/public/channels/slack/slackChannel.js +1 -1
- package/dist/src/public/memory/index.js +1 -1
- package/dist/src/public/nuxt/index.js +1 -1
- package/dist/src/public/nuxt/module.d.ts +3 -2
- package/dist/src/public/nuxt/module.js +1 -1
- package/dist/src/public/sandbox/vercel-sandbox.d.ts +9 -5
- package/dist/src/public/sandbox/vercel.d.ts +1 -1
- package/dist/src/public/sandbox/vercel.js +1 -1
- package/dist/src/runtime/resolve-agent.js +1 -1
- package/dist/src/runtime/subagents/workflow.js +1 -1
- package/dist/src/self-modification/agent.d.ts +22 -0
- package/dist/src/self-modification/agent.js +1 -0
- package/dist/src/self-modification/extension/classify-registry-item.d.ts +19 -0
- package/dist/src/self-modification/extension/classify-registry-item.js +1 -0
- package/dist/src/self-modification/extension/eve-add.d.ts +56 -0
- package/dist/src/self-modification/extension/eve-add.js +2 -0
- package/dist/src/self-modification/extension/extension.d.ts +2 -0
- package/dist/src/self-modification/extension/extension.js +1 -0
- package/dist/src/self-modification/extension/instructions.d.ts +4 -0
- package/dist/src/self-modification/extension/instructions.js +23 -0
- package/dist/src/self-modification/extension/source-lock.d.ts +2 -0
- package/dist/src/self-modification/extension/source-lock.js +1 -0
- package/dist/src/self-modification/extension/tools/edit_file.d.ts +16 -0
- package/dist/src/self-modification/extension/tools/edit_file.js +1 -0
- package/dist/src/self-modification/extension/tools/registry_add.d.ts +52 -0
- package/dist/src/self-modification/extension/tools/registry_add.js +1 -0
- package/dist/src/self-modification/extension/tools/search_models.d.ts +22 -0
- package/dist/src/self-modification/extension/tools/search_models.js +1 -0
- package/dist/src/self-modification/extension/tools/search_registry.d.ts +103 -0
- package/dist/src/self-modification/extension/tools/search_registry.js +1 -0
- package/dist/src/self-modification/filesystem.d.ts +6 -0
- package/dist/src/self-modification/filesystem.js +1 -0
- package/dist/src/self-modification/sandbox.d.ts +2 -0
- package/dist/src/self-modification/sandbox.js +1 -0
- package/dist/src/services/dev-client/target.d.ts +3 -1
- package/dist/src/setup/boxes/select-model.d.ts +3 -21
- package/dist/src/setup/boxes/select-model.js +1 -1
- package/dist/src/setup/cli/prompt-ui.js +4 -4
- package/dist/src/setup/cli/select-component.d.ts +1 -1
- package/dist/src/setup/cli/select-component.js +1 -1
- package/dist/src/setup/flows/model.d.ts +3 -0
- package/dist/src/setup/flows/model.js +1 -1
- package/dist/src/setup/prompter.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/setup/scaffold/update/web-options.js +1 -1
- package/dist/src/shared/action-types.d.ts +35 -22
- package/dist/src/shared/action-types.js +1 -1
- package/dist/src/shared/agent-definition.d.ts +13 -0
- package/dist/src/shared/agent-turn-outcome.d.ts +2 -0
- package/dist/src/shared/agent-turn-outcome.js +1 -1
- package/dist/src/shared/extension-package-contract.d.ts +2 -0
- package/dist/src/shared/extension-package-contract.js +1 -1
- package/dist/src/shared/gateway-model-catalog.d.ts +21 -0
- package/dist/src/shared/gateway-model-catalog.js +1 -0
- package/dist/src/shared/sandbox-network-policy.d.ts +1 -1
- package/dist/src/shared/token-usage.d.ts +11 -15
- package/dist/src/shared/token-usage.js +1 -1
- package/dist/src/subagents/callback-route.js +1 -1
- package/dist/src/subagents/event-proxy-step.js +1 -1
- package/dist/src/subagents/start-remote.js +1 -1
- package/dist/src/subagents/token-budget.js +1 -1
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/tasks/types.d.ts +1 -0
- package/dist/src/tasks/types.js +1 -1
- package/dist/src/tools/provided/sleep.d.ts +2 -2
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/docs/agent-config.md +24 -19
- package/docs/channels/eve.mdx +1 -1
- package/docs/concepts/built-in-tools.md +1 -1
- package/docs/concepts/sessions-runs-and-streaming.md +9 -1
- package/docs/guides/client/streaming.mdx +1 -1
- package/docs/guides/deployment/vercel.mdx +1 -1
- package/docs/memory/overview.mdx +1 -1
- package/docs/sandbox.mdx +1 -1
- package/package.json +38 -13
- package/dist/src/compiled/@vercel/sandbox-delete/api-client/index.d.ts +0 -2
- package/dist/src/compiled/@vercel/sandbox-delete/index.js +0 -9
- package/dist/src/compiled/@vercel/sandbox-stable/LICENSE +0 -201
- package/dist/src/compiled/@vercel/sandbox-stable/_async-retry.d.ts +0 -8
- package/dist/src/compiled/@vercel/sandbox-stable/_workflow-serde.d.ts +0 -5
- package/dist/src/compiled/@vercel/sandbox-stable/api-client/api-client.d.ts +0 -1456
- package/dist/src/compiled/@vercel/sandbox-stable/api-client/api-error.d.ts +0 -29
- package/dist/src/compiled/@vercel/sandbox-stable/api-client/base-client.d.ts +0 -39
- package/dist/src/compiled/@vercel/sandbox-stable/api-client/file-writer.d.ts +0 -66
- package/dist/src/compiled/@vercel/sandbox-stable/api-client/index.d.ts +0 -2
- package/dist/src/compiled/@vercel/sandbox-stable/api-client/validators.d.ts +0 -899
- package/dist/src/compiled/@vercel/sandbox-stable/api-client/with-retry.d.ts +0 -10
- package/dist/src/compiled/@vercel/sandbox-stable/auth/error.d.ts +0 -15
- package/dist/src/compiled/@vercel/sandbox-stable/auth/file.d.ts +0 -18
- package/dist/src/compiled/@vercel/sandbox-stable/auth/index.d.ts +0 -6
- package/dist/src/compiled/@vercel/sandbox-stable/auth/oauth.d.ts +0 -111
- package/dist/src/compiled/@vercel/sandbox-stable/auth/poll-for-token.d.ts +0 -28
- package/dist/src/compiled/@vercel/sandbox-stable/auth/project.d.ts +0 -40
- package/dist/src/compiled/@vercel/sandbox-stable/command.d.ts +0 -292
- package/dist/src/compiled/@vercel/sandbox-stable/constants.d.ts +0 -5
- package/dist/src/compiled/@vercel/sandbox-stable/execution-context.d.ts +0 -116
- package/dist/src/compiled/@vercel/sandbox-stable/filesystem.d.ts +0 -258
- package/dist/src/compiled/@vercel/sandbox-stable/index.d.ts +0 -12
- package/dist/src/compiled/@vercel/sandbox-stable/index.js +0 -1
- package/dist/src/compiled/@vercel/sandbox-stable/network-policy.d.ts +0 -169
- package/dist/src/compiled/@vercel/sandbox-stable/proxy.d.ts +0 -55
- package/dist/src/compiled/@vercel/sandbox-stable/sandbox-user.d.ts +0 -212
- package/dist/src/compiled/@vercel/sandbox-stable/sandbox.d.ts +0 -1216
- package/dist/src/compiled/@vercel/sandbox-stable/session.d.ts +0 -433
- package/dist/src/compiled/@vercel/sandbox-stable/snapshot.d.ts +0 -229
- package/dist/src/compiled/@vercel/sandbox-stable/utils/get-credentials.d.ts +0 -21
- package/dist/src/compiled/@vercel/sandbox-stable/utils/paginator.d.ts +0 -16
- package/dist/src/compiled/@vercel/sandbox-stable/utils/resolveSignal.d.ts +0 -15
- package/dist/src/compiled/@vercel/sandbox-stable/utils/sandbox-snapshot.d.ts +0 -11
- package/dist/src/compiled/@vercel/sandbox-stable/utils/types.d.ts +0 -11
- package/dist/src/compiled/_chunks/node/decode_jwt-Col8JOnf.js +0 -7
- package/dist/src/compiled/_chunks/node/version-BYHw-SDY.js +0 -1
- package/dist/src/compiled/_chunks/node/version-DH6yRy-M.js +0 -1
- package/dist/src/compiled/_chunks/workflow/dist-CgbVZs5l.js +0 -40
- package/dist/src/compiled/_chunks/workflow/dist-DjojkP5e.js +0 -3
- package/dist/src/compiled/_chunks/workflow/frames-CZ9eHShe.js +0 -3
- package/dist/src/compiled/_chunks/workflow/run-DzyAoGh4.js +0 -1
- package/dist/src/compiled/_chunks/workflow/sleep-3_A5uOp-.js +0 -1
- package/dist/src/compiled/_chunks/workflow/wait-until-BtySPYD0.js +0 -15
- package/dist/src/harness/session-token-limits.d.ts +0 -41
- package/dist/src/harness/session-token-limits.js +0 -1
- package/dist/src/harness/turn-sleep.d.ts +0 -12
- package/dist/src/harness/turn-sleep.js +0 -1
- package/dist/src/internal/agent-workspace.d.ts +0 -15
- package/dist/src/internal/agent-workspace.js +0 -1
- package/dist/src/node_modules/.pnpm/@clack_core@1.3.1/node_modules/@clack/core/dist/index.js +0 -16
- package/dist/src/node_modules/.pnpm/fast-string-truncated-width@3.0.3/node_modules/fast-string-truncated-width/dist/index.js +0 -1
- package/dist/src/node_modules/.pnpm/fast-string-truncated-width@3.0.3/node_modules/fast-string-truncated-width/dist/utils.js +0 -1
- package/dist/src/node_modules/.pnpm/fast-string-width@3.0.2/node_modules/fast-string-width/dist/index.js +0 -1
- package/dist/src/node_modules/.pnpm/fast-wrap-ansi@0.2.2/node_modules/fast-wrap-ansi/lib/main.js +0 -5
- package/dist/src/node_modules/.pnpm/sisteransi@1.0.5/node_modules/sisteransi/src/index.js +0 -1
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/LICENSE +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/_async-retry.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/_workflow-serde.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/api-client/api-error.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/api-client/base-client.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/api-client/file-writer.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/api-client/with-retry.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/auth/error.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/auth/file.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/auth/index.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/auth/oauth.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/auth/poll-for-token.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/auth/project.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/command.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/execution-context.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/filesystem.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/network-policy.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/proxy.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/sandbox-user.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/session.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/snapshot.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/utils/get-credentials.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/utils/paginator.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/utils/resolveSignal.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/utils/sandbox-snapshot.d.ts +0 -0
- /package/dist/src/compiled/@vercel/{sandbox-delete → sandbox-drives}/utils/types.d.ts +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# eve
|
|
2
2
|
|
|
3
|
+
## 0.51.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 38fd8d9: Honor the `image` option passed to `vercel()` when creating fresh Vercel Sandbox instances.
|
|
8
|
+
- 9d0df26: Extension packages can expose built-in extension distributions from package export subpaths.
|
|
9
|
+
- 98f45ea: Avoid loading interactive prompt dependencies when running non-interactive CLI commands such as `eve build` in an agent workspace.
|
|
10
|
+
- 3b73073: Run each opt-in `sleep` tool call as its own durable workflow. Parallel calls still resume the turn after the longest wait, while sleep now follows the same execution and cancellation lifecycle as other workflow-backed tools.
|
|
11
|
+
- 4ee6715: Release local Workflow stream listeners when client stream followers reconnect or stop.
|
|
12
|
+
- 9091777: Allow clients to cancel every background task owned by a session with `session.cancel({ tasks: true })`. Timed-out eval cases now reset their owned sessions before the next case starts so background work cannot leak across cases.
|
|
13
|
+
- 73aec25: Add an optional per-session model token-cost limit in US dollars. Sessions pause for approval before another model call after reported cost reaches the limit, following the existing token-limit continuation flow.
|
|
14
|
+
- 98f45ea: Only classify agent-shaped, package-less `agents/` children as eve workspace members. Independently packaged agents remain standalone, while unrelated `agents/` directories no longer override flat standalone projects.
|
|
15
|
+
- 30a6325: Allow Slack channels to register experimental custom activity renderers that consume activity snapshots and retain renderer-owned state between updates.
|
|
16
|
+
- 1909295: Fix multi-agent setup flows so `eve init --agents` asks which agent to run, while shared AI Gateway, integration, and deployment setup uses the project root.
|
|
17
|
+
- 0ca3ef7: Expose workflow run and Vercel deployment references for failed MCP invocations instead of opaque workflow error payloads.
|
|
18
|
+
- d594b94: Separate default memory namespaces for agents mounted under different route prefixes in the same Vercel project.
|
|
19
|
+
- a6e72c4: `eve/self-modification` now uses the same AI Gateway model catalog validation as `/model`.
|
|
20
|
+
- 0e2e10d: Resolve eve project ownership from the nearest `package.json` that declares `dependencies.eve`, then classify its `agent/` or `agents/` shape. This avoids incorrect environment and CLI behavior in repositories that only use eve as development tooling.
|
|
21
|
+
- 30a6325: Add experimental Unicode tree and native streaming plan Slack activity renderers. The plan keeps stable top-level tasks, appends descendant lifecycle updates, and compacts completed streams to top-level work.
|
|
22
|
+
- 9de667a: Refresh workspace tooling and vendored dependencies, including stable Next.js releases and the latest Drives-capable Vercel Sandbox v3 beta.
|
|
23
|
+
- e83e50e: Update eve's bundled Workflow SDK packages to the latest 5.0.0 beta releases (`@workflow/core` 5.0.0-beta.48). Sessions now claim their inbox hook in-process instead of taking an extra queue hop at start, so a new session reaches its first turn one delivery sooner.
|
|
24
|
+
- 00cc672: The experimental self-modification extension is bundled with eve, so registry installs no longer add a separate package.
|
|
25
|
+
|
|
3
26
|
## 0.51.0
|
|
4
27
|
|
|
5
28
|
### Minor Changes
|
|
@@ -13,9 +13,10 @@ export interface Session {
|
|
|
13
13
|
send(message: string | UserContent, options: SessionSendOptions): Promise<SessionSendCommandResult>;
|
|
14
14
|
/** Answers pending input requests on this exact session ID. */
|
|
15
15
|
respond<const TResponses extends readonly InputResponse[]>(inputResponses: StrictInputResponses<TResponses>, options: SessionRespondOptions): Promise<SessionSendCommandResult>;
|
|
16
|
-
/** Requests cancellation of this exact session's active turn
|
|
16
|
+
/** Requests cancellation of this exact session's active turn and optionally its owned tasks. */
|
|
17
17
|
cancel(options?: {
|
|
18
18
|
taskId?: string;
|
|
19
|
+
tasks?: boolean;
|
|
19
20
|
turnId?: string;
|
|
20
21
|
}): Promise<CancelTurnResult>;
|
|
21
22
|
/** Queues compaction on this exact session ID. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{attachClientContext,readClientContext}from"#internal/client-context.js";import{createChannelDeliveryMetadata}from"#channel/delivery-metadata.js";import{serializeUrlFilePartsInMessage}from"#channel/send-input.js";import{DEFAULT_TURN_POLICY}from"#channel/types.js";import{parseInputResponses}from"#shared/input.js";import{AuthKey,ContinuationTokenKey,InitiatorAuthKey,SessionIdKey}from"#context/keys.js";import{toChannelLocalContinuationToken}from"#shared/continuation-token.js";function createSession(n,o,s={}){return{id:n,async send(a,c){let l=createDelivery(s),u=sessionCallbackToTurnCaller(c.callback,c.activityObserver),d=attachClientContext({message:serializeUrlFilePartsInMessage(a)},readClientContext(c));c.context!==void 0&&(d.context=c.context),c.outputSchema!==void 0&&(d.outputSchema=c.outputSchema);let f={auth:c.auth,delivery:l,kind:`send`,payload:d,requestId:s.requestId,turnPolicy:c.turnPolicy??s.turnPolicy??DEFAULT_TURN_POLICY};return await o.dispatchSession({command:u===void 0?f:{...f,caller:u},sessionId:n})},async respond(r,i){if(r.length===0)throw Error(`respond() requires at least one input response.`);let c=parseInputResponses(r),l=sessionCallbackToTurnCaller(i.callback,i.activityObserver),u=createDelivery(s),d=attachClientContext({inputResponses:c},readClientContext(i));i.context!==void 0&&(d.context=i.context),i.outputSchema!==void 0&&(d.outputSchema=i.outputSchema);let f={auth:i.auth,delivery:u,kind:`send`,payload:d,requestId:s.requestId};return await o.dispatchSession({command:l===void 0?f:{...f,caller:l},sessionId:n})},async cancel(e){
|
|
1
|
+
import{attachClientContext,readClientContext}from"#internal/client-context.js";import{createChannelDeliveryMetadata}from"#channel/delivery-metadata.js";import{serializeUrlFilePartsInMessage}from"#channel/send-input.js";import{DEFAULT_TURN_POLICY}from"#channel/types.js";import{parseInputResponses}from"#shared/input.js";import{AuthKey,ContinuationTokenKey,InitiatorAuthKey,SessionIdKey}from"#context/keys.js";import{toChannelLocalContinuationToken}from"#shared/continuation-token.js";function createSession(n,o,s={}){return{id:n,async send(a,c){let l=createDelivery(s),u=sessionCallbackToTurnCaller(c.callback,c.activityObserver),d=attachClientContext({message:serializeUrlFilePartsInMessage(a)},readClientContext(c));c.context!==void 0&&(d.context=c.context),c.outputSchema!==void 0&&(d.outputSchema=c.outputSchema);let f={auth:c.auth,delivery:l,kind:`send`,payload:d,requestId:s.requestId,turnPolicy:c.turnPolicy??s.turnPolicy??DEFAULT_TURN_POLICY};return await o.dispatchSession({command:u===void 0?f:{...f,caller:u},sessionId:n})},async respond(r,i){if(r.length===0)throw Error(`respond() requires at least one input response.`);let c=parseInputResponses(r),l=sessionCallbackToTurnCaller(i.callback,i.activityObserver),u=createDelivery(s),d=attachClientContext({inputResponses:c},readClientContext(i));i.context!==void 0&&(d.context=i.context),i.outputSchema!==void 0&&(d.outputSchema=i.outputSchema);let f={auth:i.auth,delivery:u,kind:`send`,payload:d,requestId:s.requestId};return await o.dispatchSession({command:l===void 0?f:{...f,caller:l},sessionId:n})},async cancel(e){let t={kind:`cancel`};return e?.taskId!==void 0&&(t.taskId=e.taskId),e?.tasks!==void 0&&(t.tasks=e.tasks),e?.turnId!==void 0&&(t.turnId=e.turnId),await o.dispatchSession({command:t,sessionId:n})},async compact(){return await o.dispatchSession({command:{kind:`compact`},sessionId:n})},async clear(){return await o.dispatchSession({command:{kind:`clear`},sessionId:n})},async reset(e){return await o.dispatchSession({command:{kind:`reset`,reason:e?.reason},sessionId:n})},async getEventStream(e){return o.getEventStream(n,e)},async getStreamTailIndex(){return o.getStreamTailIndex(n)}}}function createAttachSessionFn(e,t={}){return n=>createSession(n,e,t)}function createDelivery(e){return e.channelKind!==void 0&&e.channelName!==void 0?createChannelDeliveryMetadata(e):void 0}function buildSessionHandle(e){return{get id(){return e.get(SessionIdKey)??``},get auth(){return{current:e.get(AuthKey)??null,initiator:e.get(InitiatorAuthKey)??null}},get continuation(){let t=e.get(ContinuationTokenKey);if(!(t===void 0||t.length===0))return{token:toChannelLocalContinuationToken(t),rekey(n){let r=namespaceContinuationToken(t,n);t!==r&&e.set(ContinuationTokenKey,r)}}}}}function namespaceContinuationToken(e,t){let n=e.indexOf(`:`);if(n<=0)throw Error(`Cannot set session continuation token without an existing namespaced continuation token. Start the session with a placeholder continuationToken.`);return`${e.slice(0,n+1)}${t}`}function sessionCallbackToTurnCaller(e,t){return e===void 0?void 0:{activityObserver:t,callId:e.callId,replyTo:{kind:`callback`,token:e.token,url:e.url},subagentName:e.subagentName,taskId:e.taskId}}export{buildSessionHandle,createAttachSessionFn,createSession,sessionCallbackToTurnCaller};
|
|
@@ -13,12 +13,14 @@ import type { TaskAgentRequestDelivery, TaskAuthorizationEventDelivery, TaskInpu
|
|
|
13
13
|
export type { ContextAccessor } from "#context/key.js";
|
|
14
14
|
export type { ChannelInstrumentationProjection } from "#channel/instrumentation.js";
|
|
15
15
|
import type { ChannelInstrumentationProjection } from "#channel/instrumentation.js";
|
|
16
|
-
export type RunSessionLimits = Pick<AgentLimitsDefinition, "maxInputTokensPerSession" | "maxOutputTokensPerSession">;
|
|
16
|
+
export type RunSessionLimits = Pick<AgentLimitsDefinition, "maxInputTokensPerSession" | "maxOutputTokensPerSession" | "maxTokenCostUsdPerSession">;
|
|
17
17
|
/** Identifies the session turn to cancel. */
|
|
18
18
|
export interface CancelTurnInput {
|
|
19
19
|
readonly sessionId: string;
|
|
20
20
|
/** Framework task whose queued child deliveries should be discarded. */
|
|
21
21
|
readonly taskId?: string;
|
|
22
|
+
/** Cancels every nonterminal task owned by the session. */
|
|
23
|
+
readonly tasks?: boolean;
|
|
22
24
|
/** Limits the request to the turn the caller observed. */
|
|
23
25
|
readonly turnId?: string;
|
|
24
26
|
}
|
|
@@ -182,6 +184,7 @@ export type SessionCommand = {
|
|
|
182
184
|
} | {
|
|
183
185
|
readonly kind: "cancel";
|
|
184
186
|
readonly taskId?: string;
|
|
187
|
+
readonly tasks?: boolean;
|
|
185
188
|
readonly turnId?: string;
|
|
186
189
|
} | {
|
|
187
190
|
readonly kind: "compact";
|
|
@@ -1131,9 +1131,15 @@ async function openStreamBody(input) {
|
|
|
1131
1131
|
}
|
|
1132
1132
|
if (response.ok) {
|
|
1133
1133
|
if (!response.body) throw new ClientError(response.status, "Response body is null.", response.headers);
|
|
1134
|
+
let closed = false;
|
|
1134
1135
|
return {
|
|
1135
1136
|
body: response.body,
|
|
1136
|
-
close: () =>
|
|
1137
|
+
close: () => {
|
|
1138
|
+
if (closed) return;
|
|
1139
|
+
closed = true;
|
|
1140
|
+
response.body?.cancel().catch(() => {});
|
|
1141
|
+
connectionController.abort();
|
|
1142
|
+
},
|
|
1137
1143
|
streamVersion: readMessageStreamVersion(response.headers),
|
|
1138
1144
|
tailIndex: parseTailIndexHeader(response.headers)
|
|
1139
1145
|
};
|
|
@@ -1217,11 +1223,13 @@ const ResetResponseSchema = z.discriminatedUnion("status", [z.object({
|
|
|
1217
1223
|
//#endregion
|
|
1218
1224
|
//#region src/client/session-controls.ts
|
|
1219
1225
|
async function cancelClientSession(input) {
|
|
1226
|
+
const { signal, ...body } = input.options ?? {};
|
|
1220
1227
|
const { payload, response } = await postJson({
|
|
1221
|
-
body
|
|
1228
|
+
body,
|
|
1222
1229
|
context: input.context,
|
|
1223
1230
|
operation: "Cancel",
|
|
1224
|
-
path: createEveSessionCancelRoutePath(input.sessionId)
|
|
1231
|
+
path: createEveSessionCancelRoutePath(input.sessionId),
|
|
1232
|
+
signal
|
|
1225
1233
|
});
|
|
1226
1234
|
const result = CancelTurnResponseSchema.safeParse(payload);
|
|
1227
1235
|
if (!result.success || result.data.status === "accepted" && result.data.sessionId !== input.sessionId) throw new Error(`Cancel route returned an invalid response (${response.status}).`);
|
|
@@ -1257,11 +1265,13 @@ async function compactClientSession(input) {
|
|
|
1257
1265
|
} : { status: "no_active_session" };
|
|
1258
1266
|
}
|
|
1259
1267
|
async function resetClientSession(input) {
|
|
1268
|
+
const { signal, ...body } = input.options ?? {};
|
|
1260
1269
|
const { payload } = await postJson({
|
|
1261
|
-
body
|
|
1270
|
+
body,
|
|
1262
1271
|
context: input.context,
|
|
1263
1272
|
operation: "Reset",
|
|
1264
|
-
path: createEveSessionResetRoutePath(input.sessionId)
|
|
1273
|
+
path: createEveSessionResetRoutePath(input.sessionId),
|
|
1274
|
+
signal
|
|
1265
1275
|
});
|
|
1266
1276
|
const result = ResetResponseSchema.safeParse(payload);
|
|
1267
1277
|
if (!result.success || result.data.status === "reset" && result.data.previousSessionId !== input.sessionId) throw new Error("Reset route returned an invalid response.");
|
|
@@ -1276,7 +1286,8 @@ async function postJson(input) {
|
|
|
1276
1286
|
const response = await fetch(createClientUrl(input.context.host, input.path), withRedirectPolicy$1({
|
|
1277
1287
|
body: input.body === void 0 ? void 0 : JSON.stringify(input.body),
|
|
1278
1288
|
headers,
|
|
1279
|
-
method: "POST"
|
|
1289
|
+
method: "POST",
|
|
1290
|
+
signal: input.signal
|
|
1280
1291
|
}, input.context.redirect));
|
|
1281
1292
|
const text = await response.text();
|
|
1282
1293
|
if (!response.ok) throw new ClientError(response.status, text, response.headers);
|
|
@@ -1131,9 +1131,15 @@ async function openStreamBody(input) {
|
|
|
1131
1131
|
}
|
|
1132
1132
|
if (response.ok) {
|
|
1133
1133
|
if (!response.body) throw new ClientError(response.status, "Response body is null.", response.headers);
|
|
1134
|
+
let closed = false;
|
|
1134
1135
|
return {
|
|
1135
1136
|
body: response.body,
|
|
1136
|
-
close: () =>
|
|
1137
|
+
close: () => {
|
|
1138
|
+
if (closed) return;
|
|
1139
|
+
closed = true;
|
|
1140
|
+
response.body?.cancel().catch(() => {});
|
|
1141
|
+
connectionController.abort();
|
|
1142
|
+
},
|
|
1137
1143
|
streamVersion: readMessageStreamVersion(response.headers),
|
|
1138
1144
|
tailIndex: parseTailIndexHeader(response.headers)
|
|
1139
1145
|
};
|
|
@@ -1217,11 +1223,13 @@ const ResetResponseSchema = z.discriminatedUnion("status", [z.object({
|
|
|
1217
1223
|
//#endregion
|
|
1218
1224
|
//#region src/client/session-controls.ts
|
|
1219
1225
|
async function cancelClientSession(input) {
|
|
1226
|
+
const { signal, ...body } = input.options ?? {};
|
|
1220
1227
|
const { payload, response } = await postJson({
|
|
1221
|
-
body
|
|
1228
|
+
body,
|
|
1222
1229
|
context: input.context,
|
|
1223
1230
|
operation: "Cancel",
|
|
1224
|
-
path: createEveSessionCancelRoutePath(input.sessionId)
|
|
1231
|
+
path: createEveSessionCancelRoutePath(input.sessionId),
|
|
1232
|
+
signal
|
|
1225
1233
|
});
|
|
1226
1234
|
const result = CancelTurnResponseSchema.safeParse(payload);
|
|
1227
1235
|
if (!result.success || result.data.status === "accepted" && result.data.sessionId !== input.sessionId) throw new Error(`Cancel route returned an invalid response (${response.status}).`);
|
|
@@ -1257,11 +1265,13 @@ async function compactClientSession(input) {
|
|
|
1257
1265
|
} : { status: "no_active_session" };
|
|
1258
1266
|
}
|
|
1259
1267
|
async function resetClientSession(input) {
|
|
1268
|
+
const { signal, ...body } = input.options ?? {};
|
|
1260
1269
|
const { payload } = await postJson({
|
|
1261
|
-
body
|
|
1270
|
+
body,
|
|
1262
1271
|
context: input.context,
|
|
1263
1272
|
operation: "Reset",
|
|
1264
|
-
path: createEveSessionResetRoutePath(input.sessionId)
|
|
1273
|
+
path: createEveSessionResetRoutePath(input.sessionId),
|
|
1274
|
+
signal
|
|
1265
1275
|
});
|
|
1266
1276
|
const result = ResetResponseSchema.safeParse(payload);
|
|
1267
1277
|
if (!result.success || result.data.status === "reset" && result.data.previousSessionId !== input.sessionId) throw new Error("Reset route returned an invalid response.");
|
|
@@ -1276,7 +1286,8 @@ async function postJson(input) {
|
|
|
1276
1286
|
const response = await fetch(createClientUrl(input.context.host, input.path), withRedirectPolicy$1({
|
|
1277
1287
|
body: input.body === void 0 ? void 0 : JSON.stringify(input.body),
|
|
1278
1288
|
headers,
|
|
1279
|
-
method: "POST"
|
|
1289
|
+
method: "POST",
|
|
1290
|
+
signal: input.signal
|
|
1280
1291
|
}, input.context.redirect));
|
|
1281
1292
|
const text = await response.text();
|
|
1282
1293
|
if (!response.ok) throw new ClientError(response.status, text, response.headers);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
async function selectWorkspaceAgent(e,t){let n=e.members.map(e=>e.name);if(t!==void 0){let r=e.members.find(e=>e.name===t);if(r===void 0)throw Error(`Unknown agent ${JSON.stringify(t)}. Available agents: ${n.join(`, `)}.`);return r.appRoot}if(e.members.length===1)return e.members[0].appRoot;if(!(process.stdin.isTTY&&process.stdout.isTTY))throw Error(`This command requires a specific agent. Pass --agent <name>. Available agents: ${n.join(`, `)}.`);let{createPrompter:r}=await import(`#setup/prompter.js`),i=await r().select({message:`Select an agent`,options:e.members.map(e=>({label:e.name,value:e.name})),search:e.members.length>8});return e.members.find(e=>e.name===i).appRoot}function agentCommand(e,t,n=()=>!0){return e.option(`--agent <name>`,`Select an agent from an agents/ workspace`),e.hook(`preAction`,async(e,r)=>{let i=r.opts().agent;if(!n(r)){if(i!==void 0)throw Error(`--agent cannot be combined with a remote URL target.`);return}let a=await t.resolveAgent();if(a.kind===`workspace`){t.root=await selectWorkspaceAgent(a.workspace,i),await t.resolve();return}await t.resolve();let o=await t.resolveAgent();if(i!==void 0&&(o.kind!==`workspace-member`||o.member.name!==i))throw Error(`--agent can only select a member of the enclosing agents/ workspace.`)})}export{agentCommand};
|
|
@@ -9,7 +9,9 @@ export declare const HANDOFF_SECTIONS: readonly ["intro-handoff.md", "collect-in
|
|
|
9
9
|
*/
|
|
10
10
|
export declare function initAgentInstructions(): string;
|
|
11
11
|
/** Concise scaffold facts printed only when a coding agent launched `eve init`. */
|
|
12
|
-
export declare function initAgentReadySummary(model: string | undefined, projectPath: string
|
|
12
|
+
export declare function initAgentReadySummary(model: string | undefined, projectPath: string, options?: {
|
|
13
|
+
workspace?: boolean;
|
|
14
|
+
}): string;
|
|
13
15
|
/** The post-scaffold handoff printed after a coding agent runs `eve init`. */
|
|
14
16
|
export declare function initAgentDevHandoff(options: {
|
|
15
17
|
projectPath: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import{join}from"node:path";import pc from"#compiled/picocolors/index.js";import{readFileSync}from"node:fs";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";const SETUP_SECTIONS=[`intro-setup.md`,`collect-intent.md`,`vercel-connect.md`,`scaffold.md`,`build-and-verify.md`],HANDOFF_SECTIONS=[`intro-handoff.md`,`collect-intent.md`,`vercel-connect.md`,`build-and-verify.md`];function compose(e,t){let r=e.map(e=>readFileSync(new URL(`./agent-prompt/${e}`,import.meta.url),`utf8`).trim()).join(`
|
|
2
2
|
|
|
3
|
-
`).replaceAll(`{{devCommand}}`,()=>t.devCommand),{workingDirectory:i}=t;return i===void 0?r:r.replaceAll(`{{workingDirectory}}`,()=>i)}function initAgentInstructions(){return compose(SETUP_SECTIONS,{devCommand:`npx eve dev`})}function initAgentReadySummary(n,i){let
|
|
3
|
+
`).replaceAll(`{{devCommand}}`,()=>t.devCommand),{workingDirectory:i}=t;return i===void 0?r:r.replaceAll(`{{workingDirectory}}`,()=>i)}function initAgentInstructions(){return compose(SETUP_SECTIONS,{devCommand:`npx eve dev`})}function initAgentReadySummary(n,i,a={}){let o=n??DEFAULT_AGENT_MODEL_ID,s=n===void 0?pc.dim(` (eve default)`):``,c=a.workspace?`${pc.green(`✓`)} Agents ${pc.bold(join(i,`agents`))}`:`${pc.green(`✓`)} Instructions ${pc.bold(join(i,`agent/instructions.md`))}`;return[`${pc.green(`✓`)} Model ${pc.bold(o)}${s}`,c].join(`
|
|
4
4
|
`)}function initAgentDevHandoff(e){return compose(HANDOFF_SECTIONS,{devCommand:e.devCommand,workingDirectory:e.projectPath})}function initAgentReplPrompt(e){return compose(HANDOFF_SECTIONS,{devCommand:e.devCommand,workingDirectory:`.`})}function initExtensionInstructions(){return[`You are scaffolding an eve extension package (a reusable package of tools,`,`connections, skills, and hooks that a consuming agent mounts under`,`agent/extensions/).`,``,`Ask the user for a package directory name, then run:`,``,` npx eve@latest extension init <name>`,``,`That creates the package, installs dependencies, and initializes Git. It`,`prints what was set up and how to author, build, and mount the extension —`,`it does not start eve dev (extensions are not standalone agents).`,``,"Build with `eve extension build` (or the package `build` script)."].join(`
|
|
5
5
|
`)}function initExtensionHandoff(e){return[``,`What we set up:`,` - package.json with eve.extension source/dist roots, peer+dev eve, and zod`,` - extension/extension.ts (config schema via defineExtension)`,` - build/prepare scripts → eve extension build`,``,`Next:`,` - Add tools, skills, hooks, or connections under extension/`,` (see AGENTS.md and node_modules/eve/docs/extensions.md)`,` - ${`${e.packageManager} run build`} # builds dist/extension and package exports`,` - Mount from a consumer agent:`,` // agent/extensions/${e.packageName}.ts`,` import ext from "${e.packageName}";`,` export default ext({ apiKey: process.env.API_KEY });`,``,`Working directory: ${e.projectPath}`].join(`
|
|
6
6
|
`)}export{HANDOFF_SECTIONS,SETUP_SECTIONS,initAgentDevHandoff,initAgentInstructions,initAgentReadySummary,initAgentReplPrompt,initExtensionHandoff,initExtensionInstructions};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolve}from"node:path";import{resolveInternalVercelServiceOutput}from"#cli/vercel-service-output.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{
|
|
1
|
+
import{resolve}from"node:path";import{resolveInternalVercelServiceOutput}from"#cli/vercel-service-output.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{EVE_INTERNAL_AGENT_WORKSPACE_MEMBER_ENV}from"#internal/application/build-output-environment.js";import{EVE_PUBLIC_ROUTE_PREFIX_ENV,normalizePublicRoutePrefix}from"#shared/public-route-prefix.js";function registerBuildCommand(r){let i=createCliTheme();r.program.command(`build`).hook(`preAction`,async()=>{(await r.applicationContext.resolveAgent()).kind!==`workspace`&&await r.applicationContext.resolve()}).description(`Build the current eve application.`).option(`--profile <path>`,`Write best-effort timing and output-size profile JSON to a file`).option(`--skip-sandbox-prewarm`,`Skip sandbox template prewarm for a Vercel build; output may not be deployable`).action(async n=>{let{loadDevelopmentEnvironmentFiles:a}=await import(`#cli/dev/environment.js`);await a(r.applicationContext.root);let o=await r.applicationContext.resolveAgent();if(o.kind===`workspace`){if(n.profile!==void 0||n.skipSandboxPrewarm===!0)throw Error(`Workspace builds do not support --profile or --skip-sandbox-prewarm. Run those options from an individual agent directory.`);let{buildAgentWorkspace:e}=await import(`#internal/vercel/build-agent-workspace.js`),t=await e(o.workspace);r.logger.log(renderCliTaggedLine(i,{message:`built output at ${t}`,tag:`build`,tone:`success`}));return}let s=r.buildHost??(await import(`#internal/nitro/host.js`)).buildApplication,c=n.profile===void 0?void 0:resolve(r.applicationContext.root,n.profile),l={publicRoutePrefix:normalizePublicRoutePrefix(process.env[EVE_PUBLIC_ROUTE_PREFIX_ENV]),skipVercelSandboxPrewarm:n.skipSandboxPrewarm===!0,vercelServiceOutput:resolveInternalVercelServiceOutput(r.applicationContext.root),workspaceMember:o.kind===`workspace-member`||process.env[EVE_INTERNAL_AGENT_WORKSPACE_MEMBER_ENV]===`1`};c!==void 0&&(l.profileOutputPath=c);let u=await s(r.applicationContext.root,l);r.logger.log(renderCliTaggedLine(i,{message:`built output at ${u}`,tag:`build`,tone:`success`}))})}export{registerBuildCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hasInteractiveTerminal,validateWorkspaceProjectCommand}from"./preconditions.js";import{isNonInteractiveProjectCommand,runNonInteractiveLink}from"./vercel-non-interactive.js";import{
|
|
1
|
+
import{hasInteractiveTerminal,validateWorkspaceProjectCommand}from"./preconditions.js";import{isNonInteractiveProjectCommand,runNonInteractiveLink}from"./vercel-non-interactive.js";import{isEveProject}from"#setup/scaffold/index.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{createPrompter}from"#setup/prompter.js";const defaultDependencies={hasInteractiveTerminal,isEveProject};async function runDeployCommand(e,n,r=defaultDependencies,i={}){if(!await validateWorkspaceProjectCommand({appRoot:n,isEveProject:r.isEveProject,logger:e,workspaceMemberMessage:e=>`This agent belongs to the workspace at ${e.root}. Run \`eve deploy\` from the workspace root to deploy every peer agent together.`}))return;if(isNonInteractiveProjectCommand(i)){if(i.yes!==!0){e.error("`eve deploy --non-interactive` requires `--yes` to confirm production deployment."),process.exitCode=1;return}if(i.project!==void 0&&!await runNonInteractiveLink({logger:e,appRoot:n,options:i}))return}let a=r.createPrompter?.()??createPrompter();a.intro(`Deploy your eve agent to Vercel`);try{let t=await runDeployFlow({appRoot:n,prompter:a,interactive:!isNonInteractiveProjectCommand(i)&&r.hasInteractiveTerminal(),deps:r.flowDeps});if(t.kind===`needs-link`){e.error("This directory is not linked to a Vercel project. Run `eve link` first, or name the project on the deploy itself: `eve deploy --project <name-or-id> --non-interactive --yes`."),process.exitCode=1;return}if(t.kind===`local-model`){e.error("ChatGPT subscription models use local Codex credentials and cannot be deployed. Switch to an AI Gateway or server-authenticated model before running `eve deploy`."),process.exitCode=1;return}a.outro(t.kind===`cancelled`?`Cancelled.`:t.productionUrl===void 0?`Deployed.`:`Deployed: ${t.productionUrl}`)}catch(t){e.error(t instanceof Error?t.message:String(t)),process.exitCode=1}}export{runDeployCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{mkdir,readFile,rename}from"node:fs/promises";import{
|
|
1
|
+
import{mkdir,readFile,rename}from"node:fs/promises";import{join}from"node:path";import pc from"#compiled/picocolors/index.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{createPrompter}from"#setup/prompter.js";import{findEveProjectContext}from"#internal/project-context.js";import{pathExists}from"#setup/path-exists.js";import{agentTemplateFiles}from"#setup/scaffold/create/project.js";import{assertValidPublicAgentName}from"#internal/agent-name.js";import{validateModelSlug}from"#setup/flows/model-source-change.js";import{writeTextFile}from"#setup/scaffold/files.js";function validateAgentNames(e){if(e.length===0)throw Error(`--agents requires at least one agent name.`);let t=new Set;for(let n of e){if(assertValidPublicAgentName(n,`Agent`),t.has(n))throw Error(`Agent name ${JSON.stringify(n)} is repeated.`);t.add(n)}}async function writeWorkspaceAgent(e,t,n){let i=join(e,`agents`,t);if(await pathExists(i))throw Error(`Cannot create agent ${JSON.stringify(t)} because ${i} already exists.`);let o=agentTemplateFiles(n.model??DEFAULT_AGENT_MODEL_ID,n.reasoning);await Promise.all(Object.entries(o).map(([e,t])=>writeTextFile(join(i,e),t)))}async function convertScaffoldToAgentWorkspace(i,a,o){if(validateAgentNames(a),o.channelWebNextjs===!0)throw Error(`--channel-web-nextjs cannot be combined with --agents.`);let[s,...c]=a;await mkdir(join(i,`agents`,s),{recursive:!0}),await rename(join(i,`agent`),join(i,`agents`,s,`agent`));let l=join(i,`tsconfig.json`);await writeTextFile(l,(await readFile(l,`utf8`)).replace(`"agent/**/*.ts"`,`"agents/**/*.ts"`),{force:!0});for(let e of c)await writeWorkspaceAgent(i,e,o)}async function addAgentsToWorkspace(e,t,n,r,a=validateModelSlug){if((await findEveProjectContext(t))?.kind!==`workspace`)return!1;if(r.channelWebNextjs===!0)throw Error(`--channel-web-nextjs is not supported when adding a workspace agent.`);let c=r.agents;if(n!==void 0&&c!==void 0)throw Error(`Pass either an agent name or --agents, not both.`);if(c===void 0&&n!==void 0&&(c=[n]),c===void 0){if(!(process.stdin.isTTY&&process.stdout.isTTY))throw Error(`This directory is an eve agent workspace. Pass an agent name, for example: eve init billing.`);c=[await createPrompter().text({message:`Name the new agent`})]}if(validateAgentNames(c),r.model!==void 0){let e=await a(t,r.model);if(e!==null)throw Error(e)}for(let e of c)await writeWorkspaceAgent(t,e,r);return e.log(`${pc.green(`✓`)} Added ${c.length===1?`agent`:`agents`} ${c.map(e=>pc.bold(e)).join(`, `)}`),e.log(pc.dim(`$ eve dev --agent <name>`)),!0}export{addAgentsToWorkspace,convertScaffoldToAgentWorkspace};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hasInteractiveTerminal}from"./preconditions.js";import{access,stat}from"node:fs/promises";import{
|
|
1
|
+
import{hasInteractiveTerminal}from"./preconditions.js";import{access,stat}from"node:fs/promises";import{delimiter,extname,join}from"node:path";import{constants}from"node:fs";import{createPrompter}from"#setup/prompter.js";import{spawn}from"node:child_process";const positional=e=>[e],CODING_AGENT_REPLS=[{command:`claude`,label:`Claude Code`,promptArgs:positional},{command:`codex`,label:`Codex`,promptArgs:positional},{command:`cursor-agent`,label:`Cursor`,promptArgs:positional},{command:`droid`,label:`Droid`,promptArgs:positional},{command:`gemini`,label:`Gemini CLI`,promptArgs:e=>[`-i`,e]},{command:`opencode`,label:`opencode`,promptArgs:e=>[`--prompt`,e]},{command:`pi`,label:`Pi`,promptArgs:positional}],WINDOWS_EXECUTABLE_EXTENSIONS=[`.COM`,`.EXE`,`.BAT`,`.CMD`],defaultDependencies={createPrompter,hasInteractiveTerminal,isCodingAgentReplAvailable};function executableNames(e){if(process.platform!==`win32`)return[e];let t=process.env.PATHEXT?.split(`;`).filter(Boolean);return(t&&t.length>0?t:WINDOWS_EXECUTABLE_EXTENSIONS).map(t=>`${e}${t}`)}async function isExecutable(e){try{return(await stat(e)).isFile()?(await access(e,constants.X_OK),!0):!1}catch{return!1}}async function resolveCodingAgentRepl(e){let t=process.env.PATH;if(t===void 0||t.length===0)return null;for(let n of t.split(delimiter))if(n.length!==0)for(let t of executableNames(e)){let e=join(n,t);if(await isExecutable(e))return e}return null}async function isCodingAgentReplAvailable(e){return await resolveCodingAgentRepl(e)!==null}function handoffOptions(e,t){return[{value:`eve-dev`,label:`Start eve dev`,focusHint:`talk to '${t}' in your terminal`},...e.map(e=>({value:e.command,label:`Open ${e.label}`,focusHint:`build '${t}' using ${e.label}`})),{value:`exit`,label:`Exit`,focusHint:`return to your terminal`}]}async function selectInitHandoff(e){let t={...defaultDependencies,...e.deps};if(!t.hasInteractiveTerminal())return`eve-dev`;let n=await Promise.all(CODING_AGENT_REPLS.map(({command:e})=>t.isCodingAgentReplAvailable(e))),r=CODING_AGENT_REPLS.filter((e,t)=>n[t]);return r.length===0?`eve-dev`:t.createPrompter().select({message:`How would you like to continue?`,options:handoffOptions(r,e.agentName),initialValue:`eve-dev`})}function codingAgentRepl(e){let t=CODING_AGENT_REPLS.find(t=>t.command===e);if(t===void 0)throw Error(`Unsupported coding-agent REPL "${e}".`);return t}function isDirectlySpawnable(e,t){if(t!==`win32`)return!0;let n=extname(e).toLowerCase();return n===`.exe`||n===`.com`}function replSpawnPlan(e,t,n,r=process.platform){return t!==null&&isDirectlySpawnable(t,r)?{file:t,args:codingAgentRepl(e).promptArgs(n),shell:!1,seeded:!0}:{file:e,args:[],shell:r===`win32`,seeded:!1}}async function spawnCodingAgentRepl(e){let t=e.resolvePath??resolveCodingAgentRepl,n=replSpawnPlan(e.command,await t(e.command),e.prompt);return n.seeded||e.onPromptUnseeded?.(e.prompt),new Promise(t=>{let r=spawn(n.file,n.args,{cwd:e.cwd,shell:n.shell,stdio:`inherit`}),i=!1,settle=e=>{i||(i=!0,t(e))};r.once(`error`,()=>settle(!1)),r.once(`close`,e=>settle(e===0))})}export{isCodingAgentReplAvailable,replSpawnPlan,resolveCodingAgentRepl,selectInitHandoff,spawnCodingAgentRepl};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{initAgentDevHandoff,initAgentReadySummary,initAgentReplPrompt}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{addAgentsToWorkspace,convertScaffoldToAgentWorkspace}from"./init-agent-workspace.js";import{confirmInitInNonEmptyDirectory}from"./init-confirm.js";import{cleanupFreshInitTarget,workspaceFailureNote}from"./init-recovery.js";import{selectInitHandoff,spawnCodingAgentRepl}from"./init-repl.js";import{resolveInitTarget}from"./init-target.js";import{mkdtemp,readdir,rename,rm}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,relative,resolve}from"node:path";import pc from"#compiled/picocolors/index.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/index.js";import{eveDevArguments,packageManagerInstallFailureMessage,packageManagerInstallSucceeded,resultSucceeded,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";import{validateModelSlug}from"#setup/flows/model-source-change.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";import{WizardCancelledError}from"#setup/step.js";import{isPackageManagerWorkspaceMember}from"#setup/scaffold/workspace-root.js";const defaultDependencies={addAgentToProject,confirmInitInNonEmptyDirectory,detectInvokingPackageManager,detectPackageManager,ensureChannel,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldBaseProject,selectInitHandoff,spawnCodingAgentRepl,spawnPackageManager,tryInitializeGit,validateModelSlug},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`init`);async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}function formatWorkspaceRootMutationWarning(e){let t=e.kind===`package-json`?`package.json`:`configuration`,n=e.nodeEngineOverride===void 0?``:` (${formatNodeEngineOverrideWarning(e.nodeEngineOverride)})`;return`Updated workspace root ${t} at ${e.path}${n}`}async function addToExistingProject(e,t,n,r){if(t.channelWebNextjs===!0)throw Error("`--channel-web-nextjs` is not supported when adding an agent to an existing project. Run `eve add channel/web` from the project afterwards instead.");if(t.model!==void 0){let r=await n.validateModelSlug(e,t.model);if(r!==null)throw Error(r)}let i=await n.detectPackageManager(e),a=await n.addAgentToProject({projectRoot:e,model:t.model??DEFAULT_AGENT_MODEL_ID,reasoning:t.reasoning,packageManager:i.kind,evePackage:r});return{configurationFilesChanged:a.configurationFilesChanged,dependenciesAdded:a.dependenciesAdded,filesWritten:a.filesWritten,packageManager:i.kind,nodeEngineOverride:a.nodeEngineOverride}}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldProject(e,t,n,r,i,o,s,c){let l=resolve(e,`..`),u=!n&&await pathExists(e)&&(await readdir(e)).length===0;if(!n&&await pathExists(e)&&!u)throw Error(`Cannot create project because "${e}" already exists.`);let d=n&&c?void 0:await mkdtemp(join(l,`.eve-init-`)),g=[];try{let l=d??e;if(i.model!==void 0){let e=await o.validateModelSlug(l,i.model);if(e!==null)throw Error(e)}let f={projectName:d===void 0?`.`:n?basename(e):t,model:i.model??DEFAULT_AGENT_MODEL_ID,reasoning:i.reasoning,evePackage:s,targetDirectory:l,overwriteExisting:c,workspaceProbeDirectory:e,packageManager:r,onWorkspaceRootMutation:e=>{g.push(e)}},p=await o.scaffoldBaseProject(f);return i.agents!==void 0&&await convertScaffoldToAgentWorkspace(p,i.agents,i),i.channelWebNextjs===!0&&await o.ensureChannel({projectRoot:p,kind:`web`,packageManager:r,force:c,workspaceProbeDirectory:e,configureVercelServices:!1,onWorkspaceRootMutation:e=>{g.push(e)}}),d!==void 0&&(n||u?await moveDirectoryContents(p,e):await rename(p,e)),{projectPath:e,workspaceRootMutations:uniqueWorkspaceRootMutations(g)}}finally{d!==void 0&&await rm(d,{recursive:!0,force:!0})}}function installProgressDetail(e,t){let n=t.text.trim();if(n===``||e!==`npm`)return n||void 0;let r=/^npm silly fetch manifest (.+)$/u.exec(n);if(r!==null)return`Resolving ${r[1]}`;let i=/^npm http fetch \S+ \S+ attempt (\d+) failed with (\S+)$/u.exec(n);if(i!==null)return`npm registry · attempt ${i[1]} failed: ${i[2]}`;if(t.stream===`stdout`||/^npm (?:error|warn)\b/u.test(n))return n}const NPM_NOISE_LINE=/^\s*npm (?:silly|verbose|http|timing)\b/u;function reportExistingProjectChanges(e,t){e.log(`Updated existing project:`);for(let n of t.filesWritten)e.log(` Created ${relative(t.projectPath,n).replaceAll(`\\`,`/`)}`);t.dependenciesAdded.length>0&&e.log(` Added dependencies: ${t.dependenciesAdded.join(`, `)}`);for(let n of t.configurationFilesChanged)e.log(` Updated ${n}`);t.nodeEngineOverride!==void 0&&e.log(pc.yellow(` ⚠ ${formatNodeEngineOverrideWarning(t.nodeEngineOverride)}`))}async function runInitSteps(e){let{dependencies:t,logger:n,options:r,parentDirectory:i,target:a}=e,o=isLogLevelEnabled(`debug`),l=await t.isCodingAgentLaunch(),u=await resolveInitTarget({parentDirectory:i,target:a}),f=resolveInitEvePackageOverride(),p=startCliLiveRow(n);p.update(`Preparing project`);try{let e=u.kind===`fresh`?`creating agent`:`adding agent`;p.update(u.kind===`fresh`?`Creating agent`:`Adding agent`),initLog.debug(e);let i=t.now(),a;if(u.kind===`fresh`){let e=await resolveScaffoldPackageManager(u.projectPath,t),n=isPackageManagerWorkspaceMember(e,u.projectPath),i;try{i=await scaffoldProject(u.projectPath,u.projectName,u.createInPlace,e,r,t,f,u.overwriteExisting)}catch(e){if(u.failurePolicy===`clear`){let t=await cleanupFreshInitTarget(u.projectPath,u.failurePolicy,u.preservedEntries),r=e instanceof Error?e.message:String(e),i=t?`eve restored "${u.projectPath}" to its original state.`:`eve could not completely clean "${u.projectPath}".`;throw Error(`${r}\n\n${i}${workspaceFailureNote(n)}`)}if(u.failurePolicy===`remove`&&n){let t=e instanceof Error?e.message:String(e);throw Error(`${t}${workspaceFailureNote(!0)}`)}throw e}a={failurePolicy:u.failurePolicy,kind:`created`,packageManager:e,preservedTargetEntries:u.preservedEntries,projectPath:i.projectPath,retryCommand:`eve init ${u.projectPath}`,workspaceMember:n,workspaceRootMutations:i.workspaceRootMutations}}else{let e=await addToExistingProject(u.projectPath,r,t,f);a=e.nodeEngineOverride===void 0?{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,packageManager:e.packageManager,projectPath:u.projectPath}:{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,nodeEngineOverride:e.nodeEngineOverride,packageManager:e.packageManager,projectPath:u.projectPath}}let d=t.now()-i;initLog.debug(`${e} done`,{ms:d}),a.kind===`added`&&(p.stop(),reportExistingProjectChanges(n,a),p=startCliLiveRow(n)),p.update(`Installing dependencies`,`${a.packageManager} install`),initLog.debug(`installing dependencies with ${a.packageManager}`);let m=t.now(),h=[],g=[],_=await t.runPackageManagerInstall(a.packageManager,a.projectPath,{progressDetails:process.stdout.isTTY===!0&&!o,onOutput:e=>{e.text.trim()!==``&&(g.push(e.text),g.length>20&&g.shift(),NPM_NOISE_LINE.test(e.text)||h.push(e.text)),o&&initLog.debug(e.text);let t=installProgressDetail(a.packageManager,e);t!==void 0&&p.update(`Installing dependencies`,t)}}),v=t.now()-m;if(!packageManagerInstallSucceeded(_)){initLog.debug(`dependency installation failed`,{ms:v}),p.stop();let e=h.length>0?h:g;for(let t of e)n.error(t);if(e.length===0){let e=packageManagerInstallFailureMessage(_);e!==void 0&&n.error(e)}if(a.failurePolicy!==`preserve`){if(await cleanupFreshInitTarget(a.projectPath,a.failurePolicy,a.preservedTargetEntries)){let e=a.failurePolicy===`remove`?`eve removed the incomplete project at "${a.projectPath}".`:`eve restored "${a.projectPath}" to its original state.`,t=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies.\n\n${e}\n\nResolve the package-manager error above, then retry:\n ${a.retryCommand}${workspaceFailureNote(t)}`)}let e=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies, and eve could not completely clean "${a.projectPath}".\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in that directory. Or clean the target manually before rerunning eve init.${workspaceFailureNote(e)}`)}throw Error(`The eve agent was added, but dependency installation failed.\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in "${a.projectPath}".\n\nDo not rerun eve init; the agent is already configured.`)}return initLog.debug(`dependencies installed`,{ms:v}),a.kind===`created`?(p.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),{...a,agentElapsedMs:d,agentLaunched:l,gitResult:await t.tryInitializeGit(a.projectPath),installElapsedMs:v}):{...a,agentElapsedMs:d,agentLaunched:l,installElapsedMs:v}}finally{p.stop()}}async function runInitCommand(r,a,o,s,c=defaultDependencies){if(await addAgentsToWorkspace(r,a,o,s,c.validateModelSlug))return;let l;try{l=await runInitSteps({dependencies:c,logger:r,options:s,parentDirectory:a,target:o})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(l.kind===`created`){r.log(`${pc.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${pc.bold(l.projectPath)} ${pc.dim(`in ${formatElapsed(l.agentElapsedMs)}`)}`);for(let e of l.workspaceRootMutations)r.log(pc.yellow(`⚠ ${formatWorkspaceRootMutationWarning(e)}`))}else r.log(`${pc.green(`✓`)} Added an ${EVE_WORDMARK} agent to ${pc.bold(l.projectPath)} ${pc.dim(`in ${formatElapsed(l.agentElapsedMs)}`)}`);r.log(`${pc.green(`✓`)} Installed dependencies ${pc.dim(`in ${formatElapsed(l.installElapsedMs)}`)}`),l.kind===`created`&&l.gitResult.kind===`failed`&&(r.error(pc.yellow(`Git initialization failed during ${l.gitResult.stage}: ${l.gitResult.reason}`)),l.gitResult.stage===`commit`&&r.error(pc.yellow(`The eve agent was created successfully. Git repository metadata and staged files were preserved at "${l.projectPath}"; the initial commit is optional.\n\nTo create it later, configure Git identity and run:\n git -C ${JSON.stringify(l.projectPath)} commit -m "Initial commit from eve"`)));let u=s.agents?.[0]?[`--agent`,s.agents[0]]:[],d=[...eveDevArguments(l.packageManager),...u],f=[l.packageManager,...d].join(` `),p=initAgentDevHandoff({projectPath:l.projectPath,devCommand:f});if(l.agentLaunched){r.log(initAgentReadySummary(s.model,l.projectPath)),r.log(p);return}let m;try{m=await c.selectInitHandoff({agentName:basename(l.projectPath)})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(m===`exit`)return;if(m!==`eve-dev`){if(r.log(pc.dim(`$ ${m}`)),!await c.spawnCodingAgentRepl({command:m,cwd:l.projectPath,prompt:initAgentReplPrompt({devCommand:f}),onPromptUnseeded:e=>{r.log(pc.yellow(`Could not seed ${m} automatically. Paste this prompt into it:`)),r.log(e)}}))throw Error(`Coding-agent REPL exited unsuccessfully in "${l.projectPath}".`);return}let h=l.kind===`created`?[...d,`--onboard`]:d;if(r.log(pc.dim(`$ eve dev${u.length>0?` --agent ${u[1]}`:``}`)),!resultSucceeded(await c.spawnPackageManager(l.packageManager,l.projectPath,h)))throw Error(`Development server exited unsuccessfully in "${l.projectPath}".`)}function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(!(e===void 0||e.length===0))return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}export{EVE_INIT_PACKAGE_SPEC_ENV,runInitCommand};
|
|
1
|
+
import{initAgentDevHandoff,initAgentReadySummary,initAgentReplPrompt}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{addAgentsToWorkspace,convertScaffoldToAgentWorkspace}from"./init-agent-workspace.js";import{confirmInitInNonEmptyDirectory}from"./init-confirm.js";import{cleanupFreshInitTarget,workspaceFailureNote}from"./init-recovery.js";import{selectInitHandoff,spawnCodingAgentRepl}from"./init-repl.js";import{resolveInitTarget}from"./init-target.js";import{mkdtemp,readdir,rename,rm}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,relative,resolve}from"node:path";import pc from"#compiled/picocolors/index.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/index.js";import{eveDevArguments,packageManagerInstallFailureMessage,packageManagerInstallSucceeded,resultSucceeded,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";import{validateModelSlug}from"#setup/flows/model-source-change.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";import{WizardCancelledError}from"#setup/step.js";import{isPackageManagerWorkspaceMember}from"#setup/scaffold/workspace-root.js";const defaultDependencies={addAgentToProject,confirmInitInNonEmptyDirectory,detectInvokingPackageManager,detectPackageManager,ensureChannel,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldBaseProject,selectInitHandoff,spawnCodingAgentRepl,spawnPackageManager,tryInitializeGit,validateModelSlug},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`init`);async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}function formatWorkspaceRootMutationWarning(e){let t=e.kind===`package-json`?`package.json`:`configuration`,n=e.nodeEngineOverride===void 0?``:` (${formatNodeEngineOverrideWarning(e.nodeEngineOverride)})`;return`Updated workspace root ${t} at ${e.path}${n}`}async function addToExistingProject(e,t,n,r){if(t.channelWebNextjs===!0)throw Error("`--channel-web-nextjs` is not supported when adding an agent to an existing project. Run `eve add channel/web` from the project afterwards instead.");if(t.model!==void 0){let r=await n.validateModelSlug(e,t.model);if(r!==null)throw Error(r)}let i=await n.detectPackageManager(e),a=await n.addAgentToProject({projectRoot:e,model:t.model??DEFAULT_AGENT_MODEL_ID,reasoning:t.reasoning,packageManager:i.kind,evePackage:r});return{configurationFilesChanged:a.configurationFilesChanged,dependenciesAdded:a.dependenciesAdded,filesWritten:a.filesWritten,packageManager:i.kind,nodeEngineOverride:a.nodeEngineOverride}}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldProject(e,t,n,r,i,o,s,c){let l=resolve(e,`..`),u=!n&&await pathExists(e)&&(await readdir(e)).length===0;if(!n&&await pathExists(e)&&!u)throw Error(`Cannot create project because "${e}" already exists.`);let d=n&&c?void 0:await mkdtemp(join(l,`.eve-init-`)),g=[];try{let l=d??e;if(i.model!==void 0){let e=await o.validateModelSlug(l,i.model);if(e!==null)throw Error(e)}let f={projectName:d===void 0?`.`:n?basename(e):t,model:i.model??DEFAULT_AGENT_MODEL_ID,reasoning:i.reasoning,evePackage:s,targetDirectory:l,overwriteExisting:c,workspaceProbeDirectory:e,packageManager:r,onWorkspaceRootMutation:e=>{g.push(e)}},p=await o.scaffoldBaseProject(f);return i.agents!==void 0&&await convertScaffoldToAgentWorkspace(p,i.agents,i),i.channelWebNextjs===!0&&await o.ensureChannel({projectRoot:p,kind:`web`,packageManager:r,force:c,workspaceProbeDirectory:e,configureVercelServices:!1,onWorkspaceRootMutation:e=>{g.push(e)}}),d!==void 0&&(n||u?await moveDirectoryContents(p,e):await rename(p,e)),{projectPath:e,workspaceRootMutations:uniqueWorkspaceRootMutations(g)}}finally{d!==void 0&&await rm(d,{recursive:!0,force:!0})}}function installProgressDetail(e,t){let n=t.text.trim();if(n===``||e!==`npm`)return n||void 0;let r=/^npm silly fetch manifest (.+)$/u.exec(n);if(r!==null)return`Resolving ${r[1]}`;let i=/^npm http fetch \S+ \S+ attempt (\d+) failed with (\S+)$/u.exec(n);if(i!==null)return`npm registry · attempt ${i[1]} failed: ${i[2]}`;if(t.stream===`stdout`||/^npm (?:error|warn)\b/u.test(n))return n}const NPM_NOISE_LINE=/^\s*npm (?:silly|verbose|http|timing)\b/u;function reportExistingProjectChanges(e,t){e.log(`Updated existing project:`);for(let n of t.filesWritten)e.log(` Created ${relative(t.projectPath,n).replaceAll(`\\`,`/`)}`);t.dependenciesAdded.length>0&&e.log(` Added dependencies: ${t.dependenciesAdded.join(`, `)}`);for(let n of t.configurationFilesChanged)e.log(` Updated ${n}`);t.nodeEngineOverride!==void 0&&e.log(pc.yellow(` ⚠ ${formatNodeEngineOverrideWarning(t.nodeEngineOverride)}`))}async function runInitSteps(e){let{dependencies:t,logger:n,options:r,parentDirectory:i,target:a}=e,o=isLogLevelEnabled(`debug`),l=await t.isCodingAgentLaunch(),u=await resolveInitTarget({parentDirectory:i,target:a}),f=resolveInitEvePackageOverride(),p=startCliLiveRow(n);p.update(`Preparing project`);try{let e=u.kind===`fresh`?`creating agent`:`adding agent`;p.update(u.kind===`fresh`?`Creating agent`:`Adding agent`),initLog.debug(e);let i=t.now(),a;if(u.kind===`fresh`){let e=await resolveScaffoldPackageManager(u.projectPath,t),n=isPackageManagerWorkspaceMember(e,u.projectPath),i;try{i=await scaffoldProject(u.projectPath,u.projectName,u.createInPlace,e,r,t,f,u.overwriteExisting)}catch(e){if(u.failurePolicy===`clear`){let t=await cleanupFreshInitTarget(u.projectPath,u.failurePolicy,u.preservedEntries),r=e instanceof Error?e.message:String(e),i=t?`eve restored "${u.projectPath}" to its original state.`:`eve could not completely clean "${u.projectPath}".`;throw Error(`${r}\n\n${i}${workspaceFailureNote(n)}`)}if(u.failurePolicy===`remove`&&n){let t=e instanceof Error?e.message:String(e);throw Error(`${t}${workspaceFailureNote(!0)}`)}throw e}a={failurePolicy:u.failurePolicy,kind:`created`,packageManager:e,preservedTargetEntries:u.preservedEntries,projectPath:i.projectPath,retryCommand:`eve init ${u.projectPath}`,workspaceMember:n,workspaceRootMutations:i.workspaceRootMutations}}else{let e=await addToExistingProject(u.projectPath,r,t,f);a=e.nodeEngineOverride===void 0?{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,packageManager:e.packageManager,projectPath:u.projectPath}:{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,nodeEngineOverride:e.nodeEngineOverride,packageManager:e.packageManager,projectPath:u.projectPath}}let d=t.now()-i;initLog.debug(`${e} done`,{ms:d}),a.kind===`added`&&(p.stop(),reportExistingProjectChanges(n,a),p=startCliLiveRow(n)),p.update(`Installing dependencies`,`${a.packageManager} install`),initLog.debug(`installing dependencies with ${a.packageManager}`);let m=t.now(),h=[],g=[],_=await t.runPackageManagerInstall(a.packageManager,a.projectPath,{progressDetails:process.stdout.isTTY===!0&&!o,onOutput:e=>{e.text.trim()!==``&&(g.push(e.text),g.length>20&&g.shift(),NPM_NOISE_LINE.test(e.text)||h.push(e.text)),o&&initLog.debug(e.text);let t=installProgressDetail(a.packageManager,e);t!==void 0&&p.update(`Installing dependencies`,t)}}),v=t.now()-m;if(!packageManagerInstallSucceeded(_)){initLog.debug(`dependency installation failed`,{ms:v}),p.stop();let e=h.length>0?h:g;for(let t of e)n.error(t);if(e.length===0){let e=packageManagerInstallFailureMessage(_);e!==void 0&&n.error(e)}if(a.failurePolicy!==`preserve`){if(await cleanupFreshInitTarget(a.projectPath,a.failurePolicy,a.preservedTargetEntries)){let e=a.failurePolicy===`remove`?`eve removed the incomplete project at "${a.projectPath}".`:`eve restored "${a.projectPath}" to its original state.`,t=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies.\n\n${e}\n\nResolve the package-manager error above, then retry:\n ${a.retryCommand}${workspaceFailureNote(t)}`)}let e=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies, and eve could not completely clean "${a.projectPath}".\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in that directory. Or clean the target manually before rerunning eve init.${workspaceFailureNote(e)}`)}throw Error(`The eve agent was added, but dependency installation failed.\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in "${a.projectPath}".\n\nDo not rerun eve init; the agent is already configured.`)}return initLog.debug(`dependencies installed`,{ms:v}),a.kind===`created`?(p.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),{...a,agentElapsedMs:d,agentLaunched:l,gitResult:await t.tryInitializeGit(a.projectPath),installElapsedMs:v}):{...a,agentElapsedMs:d,agentLaunched:l,installElapsedMs:v}}finally{p.stop()}}async function runInitCommand(r,a,o,s,c=defaultDependencies){if(await addAgentsToWorkspace(r,a,o,s,c.validateModelSlug))return;let l;try{l=await runInitSteps({dependencies:c,logger:r,options:s,parentDirectory:a,target:o})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(l.kind===`created`){r.log(`${pc.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${pc.bold(l.projectPath)} ${pc.dim(`in ${formatElapsed(l.agentElapsedMs)}`)}`);for(let e of l.workspaceRootMutations)r.log(pc.yellow(`⚠ ${formatWorkspaceRootMutationWarning(e)}`))}else r.log(`${pc.green(`✓`)} Added an ${EVE_WORDMARK} agent to ${pc.bold(l.projectPath)} ${pc.dim(`in ${formatElapsed(l.agentElapsedMs)}`)}`);r.log(`${pc.green(`✓`)} Installed dependencies ${pc.dim(`in ${formatElapsed(l.installElapsedMs)}`)}`),l.kind===`created`&&l.gitResult.kind===`failed`&&(r.error(pc.yellow(`Git initialization failed during ${l.gitResult.stage}: ${l.gitResult.reason}`)),l.gitResult.stage===`commit`&&r.error(pc.yellow(`The eve agent was created successfully. Git repository metadata and staged files were preserved at "${l.projectPath}"; the initial commit is optional.\n\nTo create it later, configure Git identity and run:\n git -C ${JSON.stringify(l.projectPath)} commit -m "Initial commit from eve"`)));let u=eveDevArguments(l.packageManager),d=[l.packageManager,...u].join(` `),f=initAgentDevHandoff({projectPath:l.projectPath,devCommand:d});if(l.agentLaunched){r.log(initAgentReadySummary(s.model,l.projectPath,{workspace:s.agents!==void 0})),r.log(f);return}let p;try{p=await c.selectInitHandoff({agentName:basename(l.projectPath)})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(p===`exit`)return;if(p!==`eve-dev`){if(r.log(pc.dim(`$ ${p}`)),!await c.spawnCodingAgentRepl({command:p,cwd:l.projectPath,prompt:initAgentReplPrompt({devCommand:d}),onPromptUnseeded:e=>{r.log(pc.yellow(`Could not seed ${p} automatically. Paste this prompt into it:`)),r.log(e)}}))throw Error(`Coding-agent REPL exited unsuccessfully in "${l.projectPath}".`);return}let m=l.kind===`created`?[...u,`--onboard`]:u;if(r.log(pc.dim(`$ eve dev`)),!resultSucceeded(await c.spawnPackageManager(l.packageManager,l.projectPath,m)))throw Error(`Development server exited unsuccessfully in "${l.projectPath}".`)}function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(!(e===void 0||e.length===0))return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}export{EVE_INIT_PACKAGE_SPEC_ENV,runInitCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{createPrompter}from"#setup/prompter.js";import{
|
|
1
|
+
import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{join}from"node:path";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{cleanupCreatedConnectionConnector,setupConnectionConnector}from"#setup/connection-connector.js";import{ensureVercelProject}from"#setup/flows/ensure-vercel-project.js";import{createHeadlessPrompter}from"#setup/headless.js";import{SetupPrerequisiteRequired}from"#setup/integrations/shared/prerequisite.js";import{resolveIntegrationVercelProject}from"#setup/integrations/shared/vercel-project.js";import{readProjectLink}from"#setup/project-resolution.js";import{createRegistrySetupClient}from"#setup/registry-setup-client.js";import{updateConnectionConnectorUid}from"#setup/scaffold/update/update-connection-connector.js";const defaultDependencies={ensureVercelProject,readProjectLink,setupConnectionConnector,cleanupCreatedConnectionConnector,updateConnectionConnectorUid};async function runIntegrationConnect(e){let i={...defaultDependencies,...e.dependencies},a=e.options?.nonInteractive===!0,o=i.createPrompter?.()??(a?createHeadlessPrompter(()=>{}):createPrompter()),s=e.options?.signal;o.intro(`Set up ${e.slug}`);let l=await i.readProjectLink(e.appRoot);if(l===void 0)if(a)l=await resolveIntegrationVercelProject({appRoot:e.appRoot,integration:e.slug,signal:s,deps:{readProjectLink:i.readProjectLink}});else try{l=await i.ensureVercelProject({appRoot:e.appRoot,prompter:o,signal:s,teamSelectMessage:()=>`You need to link to a project to use ${e.slug} through Vercel Connect.\n\nSelect your team`,deps:i.ensureVercelProjectDeps})}catch(e){if(e instanceof WizardCancelledError)return;throw e}let u={log:o.log,prompter:o,projectRoot:e.appRoot,slug:e.slug,service:e.service,creationType:e.options?.creationType,connectionMethod:e.options?.connectionMethod,principalType:e.options?.principalType,canonicalConnectorName:e.canonicalConnectorName??e.slug,project:l,signal:s},d=await i.setupConnectionConnector(u),f=join(e.appRoot,`agent`,`connections`,`${e.slug}.ts`);if(!(await i.updateConnectionConnectorUid(f,d.connectorUid)).patched)throw d.kind===`created`&&await i.cleanupCreatedConnectionConnector({log:o.log,projectRoot:e.appRoot,connectorId:d.connectorId,orgId:l.orgId}),Error(`Could not update the connector in agent/connections/${e.slug}.ts.`);o.outro(`Connection ${e.slug} set up.`)}async function runIntegrationConnectCommand(t,r,i,a,o,c={},l=defaultDependencies){let d=createRegistrySetupClient({signal:c.signal});try{await runIntegrationConnect({appRoot:r,slug:i,service:a,canonicalConnectorName:o,options:c,dependencies:{...l,createPrompter:()=>d?.prompter??(c.nonInteractive?createHeadlessPrompter(()=>{}):l.createPrompter?.()??createPrompter())}}),d?.complete()}catch(n){if(d?.fail(n),d!==void 0)return;if(c.nonInteractive&&n instanceof SetupPrerequisiteRequired){t.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`prerequisite_required`,prerequisite:n.prerequisite})),process.exitCode=2;return}t.error(n instanceof Error?n.message:String(n)),process.exitCode=1}}export{runIntegrationConnect,runIntegrationConnectCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hasInteractiveTerminal,validateWorkspaceProjectCommand}from"./preconditions.js";import{isNonInteractiveProjectCommand,runNonInteractiveLink}from"./vercel-non-interactive.js";import{
|
|
1
|
+
import{hasInteractiveTerminal,validateWorkspaceProjectCommand}from"./preconditions.js";import{isNonInteractiveProjectCommand,runNonInteractiveLink}from"./vercel-non-interactive.js";import{isEveProject}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";import{runLinkFlow}from"#setup/flows/link.js";const defaultDependencies={hasInteractiveTerminal,isEveProject};async function runLinkCommand(e,n,r=defaultDependencies,i={}){if(!await validateWorkspaceProjectCommand({appRoot:n,isEveProject:r.isEveProject,logger:e,workspaceMemberMessage:e=>`This agent belongs to the workspace at ${e.root}. Run \`eve link\` from the workspace root.`}))return;if(isNonInteractiveProjectCommand(i)){await runNonInteractiveLink({logger:e,appRoot:n,options:i});return}if(!r.hasInteractiveTerminal()){e.error("`eve link` needs an interactive terminal to pick the team and project. Name the project instead: `eve link --project <name-or-id> --non-interactive`."),process.exitCode=1;return}let a=r.createPrompter?.()??createPrompter();a.intro(`Link your eve agent to Vercel`);try{let e=await runLinkFlow({appRoot:n,prompter:a,projectSelection:`create-or-link`,deps:r.flowDeps});a.outro(e.kind===`cancelled`?`Cancelled.`:`Project linked.`)}catch(t){e.error(t instanceof Error?t.message:String(t)),process.exitCode=1}}export{runLinkCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{isEveProject}from"#setup/scaffold/index.js";import{findEveProjectContext}from"#internal/project-context.js";const NOT_AN_AGENT_MESSAGE="No eve agent in this directory. Run `eve init <name>`, then run this command from inside the new project.";async function validateWorkspaceProjectCommand(e){let t=await findEveProjectContext(e.appRoot);return t?.kind===`workspace-member`?(e.logger.error(e.workspaceMemberMessage(t.workspace)),process.exitCode=1,!1):t===void 0||t.kind===`standalone`&&!await(e.isEveProject??isEveProject)(e.appRoot)?(e.logger.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1,!1):!0}function hasInteractiveTerminal(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}export{NOT_AN_AGENT_MESSAGE,hasInteractiveTerminal,validateWorkspaceProjectCommand};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Command } from "#compiled/commander/index.js";
|
|
2
|
-
import {
|
|
2
|
+
import type { CliApplicationContext } from "#cli/application-command.js";
|
|
3
3
|
interface ProjectCommandLogger {
|
|
4
4
|
error(message: string): void;
|
|
5
5
|
log(message: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{findEveProjectContext}from"#internal/project-context.js";function projectCommand(t,n){return t.hook(`preAction`,async()=>{let t=await findEveProjectContext(n.root);t?.kind===`standalone`&&(n.root=t.appRoot)})}function registerProjectCommands(e){projectCommand(e.program.command(`link`),e.applicationContext).description(`Link this directory to a Vercel project and pull AI Gateway credentials.`).option(`--non-interactive`,`Run without interactive prompts`).option(`--project <name-or-id>`,`Vercel project name or ID`).option(`--team <team-id-or-slug>`,`Vercel team ID or slug`).action(async t=>{let{runLinkCommand:n}=await import(`./link.js`);await n(e.logger,e.applicationContext.root,void 0,t)}),projectCommand(e.program.command(`deploy`),e.applicationContext).description(`Deploy the agent to Vercel production (links first if needed).`).option(`--non-interactive`,`Run without interactive prompts`).option(`--project <name-or-id>`,`Vercel project name or ID`).option(`--team <team-id-or-slug>`,`Vercel team ID or slug`).option(`-y, --yes`,`Confirm a non-interactive production deployment`).action(async t=>{let{runDeployCommand:n}=await import(`./deploy.js`);await n(e.logger,e.applicationContext.root,void 0,t)})}export{registerProjectCommands};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hasInteractiveTerminal}from"./preconditions.js";import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{runDeclaredSetups}from"./registry-declared-setups.js";import{installRegistryItemTransaction}from"./registry-install-transaction.js";import{prepareDeclaredPnpmBuildPolicy}from"./registry-pnpm-build-policy-flow.js";import{runRegistryPackage}from"./registry-package.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.js";import{addRegistryMappings,prepareWebRegistryProject,readRegistryConfig}from"./registry-project.js";import{errorMessage,reportRegistryCompletion,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand}from"./registry-recovery.js";import{createPrompter}from"#setup/prompter.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,hasInteractiveTerminal,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand,prepareWebRegistryProject};function resolveOfficialRegistryUrl(e=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL){if(e===void 0)return`https://eve.dev/r`;let t;try{t=new URL(e)}catch{throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`);if(t.username!==``||t.password!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include credentials.`);if(t.search!==``||t.hash!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include a query or fragment.`);return t.pathname=t.pathname.replace(/\/+$/,``),t.toString().replace(/\/$/,``)}const OFFICIAL_REGISTRY=resolveOfficialRegistryUrl(),OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,SKILLS_REGISTRY=`@skills`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,n={}){let r=await readEveRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:r,cwd:e,overwrite:n.overwrite})}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function withBuiltInRegistries(e){return{...e,registries:{[SKILLS_REGISTRY]:`https://www.skills.sh/r/{name}?agent=eve`,...e.registries}}}async function readEveRegistryConfig(e){return withBuiltInRegistries(await readRegistryConfig(e))}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}async function loadOfficialSearchMetadata(){let e=await fetch(OFFICIAL_CATALOG);if(!e.ok)throw Error(`Could not read the eve registry (${e.status}).`);return parseOfficialRegistrySearchMetadata(await e.json())}function searchItemAddress(e){return e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument}function enrichSearchItem(e,t){let n=searchItemAddress(e);return{item:e,address:n,...t.get(n)}}function registrySourceLabel(e){return e===OFFICIAL_CATALOG?`eve`:e===SKILLS_REGISTRY?`skills.sh`:e}function searchPresentationSections(e,t,n){return e.flatMap(e=>{let r=t.get(e);return r===void 0?[]:[{label:registrySourceLabel(e),items:r.items.map(e=>enrichSearchItem(e,n)),total:r.pagination.total}]})}async function printAddSuggestions(e,t,n){try{let r=n.split(`/`).at(-1)||n,{resultsBySource:i,sources:a,metadataByAddress:o}=await searchRegistryCatalog(t,{limit:5,query:r}),s=searchPresentationSections(a,i,o);if(s.every(e=>e.items.length===0))return;e.log(`Did you mean?`),printRegistrySearchResults(e,{query:r,sections:s})}catch{}}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let n=await readEveRegistryConfig(e),r=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(n).filter(e=>t.query!==void 0||e!==SKILLS_REGISTRY)],i=await Promise.all(r.map(async e=>{try{return{result:await searchRegistries([e],{config:n,limit:t.limit??100,query:t.query}),source:e}}catch(t){return{error:t,source:e}}})),a=[],o=new Map;for(let e of i)if(`error`in e)a.push({message:errorMessage(e.error),registry:e.source});else{let t=e.result.errors??[];if(a.push(...t),t.length===0){let t=e.result.items.filter(t=>t.registry===e.source);o.set(e.source,{...e.result,items:t,pagination:{...e.result.pagination,total:e.result.items.length===t.length?e.result.pagination.total:0}})}}let s=new Map(a.map(e=>[`${e.registry}\0${e.message}`,e])),c=o.has(OFFICIAL_CATALOG)?await loadOfficialSearchMetadata():new Map,l=o.get(OFFICIAL_CATALOG);l!==void 0&&l.items.sort((e,t)=>{let rank=e=>c.get(searchItemAddress(e))?.implementation===`native`?0:1;return rank(e)-rank(t)});let u=[...o.values()];return{config:n,result:{items:u.flatMap(e=>e.items),pagination:{hasMore:u.some(e=>e.pagination.hasMore),limit:t.limit??100,offset:0,total:u.reduce((e,t)=>e+t.pagination.total,0)},...s.size>0?{errors:[...s.values()]}:{}},resultsBySource:o,sources:r,metadataByAddress:c}}async function browseRegistryCatalog(e,t={}){let{result:n}=await searchRegistryCatalog(e,t);return{items:n.items.map(e=>{let t={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry};return e.title!==void 0&&(t.title=e.title),e.type!==void 0&&(t.type=e.type),e.description!==void 0&&(t.description=e.description),t}),total:n.pagination.total,errors:n.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,resultsBySource:o,sources:s,metadataByAddress:l}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),u=a.errors??[];if(i.json||o.size>0){let t=a.items.map(e=>({...e,...l.get(searchItemAddress(e))})),r={query:n,sections:searchPresentationSections(s,o,l)};i.json&&(r.json={...a,items:t}),printRegistrySearchResults(e,r)}for(let t of u)e.error(`${t.registry}: ${t.message}`);u.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let n=await readEveRegistryConfig(e),r=await getRegistryItems([itemAddress(t)],{config:n});return r.length===1?r[0]:r}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode,c=await runAddCommand(o,e,t,{...n,yes:n.prompter===void 0||n.yes,setupAuthorized:n.prompter!==void 0},r);if(process.exitCode=s,i!==void 0)throw Error(i);if(c===!1)throw new WizardCancelledError;let l={output:a};return c!==void 0&&(l.setup=c),l}async function runAddCommand(e,s,c,l,u=defaultAddCommandDependencies){return runRegistryAction(e,s,async()=>{let d=await readEveRegistryConfig(s),f=itemAddress(c);if(l.skipInstall===!0){if(l.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(l.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(f))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let p=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([f],{config:d}))[0],()=>printAddSuggestions(e,s,c));if(!p.found)return;let m=p.item,h=isOfficialItemAddress(f)?eveMetadataFromRegistryItem(m):void 0;if(assertCompatibleEveVersion(h?.requires),h?.components!==void 0){if(!isOfficialItemAddress(f))throw Error(`Registry packages require the official eve registry.`);return reportRegistryCompletion(e,c,await runRegistryPackage({logger:e,appRoot:s,item:c,components:h.components,config:d,options:l,dependencies:u,operations:{itemAddress,metadata:eveMetadataFromRegistryItem,assertCompatibleVersion:assertCompatibleEveVersion,runSetups:({item:t,setups:r,prompter:i})=>runDeclaredSetups({logger:e,appRoot:s,item:t,setups:r,options:{yes:l.yes,force:l.overwrite,nonInteractive:l.nonInteractive,answers:l.answers,prompter:i,signal:l.signal},dependencies:u,cancelledReminder:setupReminder(t,`cancelled`),resumeCommand:setupResumeCommand(t)}),setupReminder:e=>setupReminder(e,`skipped`)}}),l)}if(l.skipInstall===!0){if(h?.setup===void 0)throw Error(`Registry item "${c}" does not declare a setup flow.`);return reportRegistryCompletion(e,c,await runDeclaredSetups({logger:e,appRoot:s,item:c,setups:h.setup,options:l,dependencies:u,cancelledReminder:setupReminder(c,`cancelled`),resumeCommand:setupResumeCommand(c)}),l)}if(!await prepareDeclaredPnpmBuildPolicy({logger:e,appRoot:s,item:c,policies:h?.install?.pnpm?.buildScripts,options:l}))return!1;if(f===itemAddress(`channel/web`)&&await(u.prepareWebRegistryProject??prepareWebRegistryProject)(s),await installRegistryItemTransaction({appRoot:s,item:c,registryItem:m,nonInteractive:l.nonInteractive,logger:e,install:async()=>{await addRegistryItems([f],{config:d,cwd:s,overwrite:l.overwrite,silent:l.silent})}}),h?.setup===void 0)return reportRegistryCompletion(e,c,{facts:[]},l);let g=u.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(l.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`progress`,message:l.skipInstall?`Setup ${c}`:`Installed ${c}`})),l.skipSetup===!0){if(l.nonInteractive)return reportRegistryCompletion(e,c,{facts:[]},l);e.log(setupReminder(c,`skipped`));return}if(!l.nonInteractive&&!l.yes&&!g&&l.setupAuthorized!==!0){e.log(setupReminder(c,`skipped`));return}if(!l.nonInteractive&&!l.yes&&l.setupAuthorized!==!0)try{if(await(l.prompter??u.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${c} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(c,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(c,`cancelled`));return}return reportRegistryCompletion(e,c,await runDeclaredSetups({logger:e,appRoot:s,item:c,setups:h.setup,options:{...l,force:l.overwrite},dependencies:u,cancelledReminder:setupReminder(c,`cancelled`),resumeCommand:setupResumeCommand(c)}),l)})}async function runRegistryAddCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await addRegistryMappings(t,n);for(let t of r.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of r.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);r.added.length>0&&e.log(`Added ${r.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n,r={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n,r))}async function runRegistrySearchCommand(e,t,n,r,i={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r,{...i,limit:i.limit??10}))}async function runRegistryViewCommand(e,t,n,r={}){await runRegistryAction(e,t,async()=>{let i=await readEveRegistryConfig(t),a=await getRegistryItems([itemAddress(n)],{config:i}),o=a.length===1?a[0]:a;e.log(r.json?JSON.stringify(o,null,2):registryViewText(n,o))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
|
|
1
|
+
import{hasInteractiveTerminal}from"./preconditions.js";import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{runDeclaredSetups}from"./registry-declared-setups.js";import{installRegistryItemTransaction}from"./registry-install-transaction.js";import{prepareDeclaredPnpmBuildPolicy}from"./registry-pnpm-build-policy-flow.js";import{runRegistryPackage}from"./registry-package.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.js";import{addRegistryMappings,prepareWebRegistryProject,readRegistryConfig}from"./registry-project.js";import{errorMessage,reportRegistryCompletion,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand}from"./registry-recovery.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,hasInteractiveTerminal,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand,prepareWebRegistryProject};function resolveOfficialRegistryUrl(e=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL){if(e===void 0)return`https://eve.dev/r`;let t;try{t=new URL(e)}catch{throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`);if(t.username!==``||t.password!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include credentials.`);if(t.search!==``||t.hash!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include a query or fragment.`);return t.pathname=t.pathname.replace(/\/+$/,``),t.toString().replace(/\/$/,``)}const OFFICIAL_REGISTRY=resolveOfficialRegistryUrl(),OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,SKILLS_REGISTRY=`@skills`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,n={}){let r=await readEveRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:r,cwd:e,overwrite:n.overwrite})}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function withBuiltInRegistries(e){return{...e,registries:{[SKILLS_REGISTRY]:`https://www.skills.sh/r/{name}?agent=eve`,...e.registries}}}async function readEveRegistryConfig(e){return withBuiltInRegistries(await readRegistryConfig(e))}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}async function loadOfficialSearchMetadata(){let e=await fetch(OFFICIAL_CATALOG);if(!e.ok)throw Error(`Could not read the eve registry (${e.status}).`);return parseOfficialRegistrySearchMetadata(await e.json())}function searchItemAddress(e){return e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument}function enrichSearchItem(e,t){let n=searchItemAddress(e);return{item:e,address:n,...t.get(n)}}function registrySourceLabel(e){return e===OFFICIAL_CATALOG?`eve`:e===SKILLS_REGISTRY?`skills.sh`:e}function searchPresentationSections(e,t,n){return e.flatMap(e=>{let r=t.get(e);return r===void 0?[]:[{label:registrySourceLabel(e),items:r.items.map(e=>enrichSearchItem(e,n)),total:r.pagination.total}]})}async function printAddSuggestions(e,t,n){try{let r=n.split(`/`).at(-1)||n,{resultsBySource:i,sources:a,metadataByAddress:o}=await searchRegistryCatalog(t,{limit:5,query:r}),s=searchPresentationSections(a,i,o);if(s.every(e=>e.items.length===0))return;e.log(`Did you mean?`),printRegistrySearchResults(e,{query:r,sections:s})}catch{}}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let n=await readEveRegistryConfig(e),r=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(n).filter(e=>t.query!==void 0||e!==SKILLS_REGISTRY)],i=await Promise.all(r.map(async e=>{try{return{result:await searchRegistries([e],{config:n,limit:t.limit??100,query:t.query}),source:e}}catch(t){return{error:t,source:e}}})),a=[],o=new Map;for(let e of i)if(`error`in e)a.push({message:errorMessage(e.error),registry:e.source});else{let t=e.result.errors??[];if(a.push(...t),t.length===0){let t=e.result.items.filter(t=>t.registry===e.source);o.set(e.source,{...e.result,items:t,pagination:{...e.result.pagination,total:e.result.items.length===t.length?e.result.pagination.total:0}})}}let s=new Map(a.map(e=>[`${e.registry}\0${e.message}`,e])),c=o.has(OFFICIAL_CATALOG)?await loadOfficialSearchMetadata():new Map,l=o.get(OFFICIAL_CATALOG);l!==void 0&&l.items.sort((e,t)=>{let rank=e=>c.get(searchItemAddress(e))?.implementation===`native`?0:1;return rank(e)-rank(t)});let u=[...o.values()];return{config:n,result:{items:u.flatMap(e=>e.items),pagination:{hasMore:u.some(e=>e.pagination.hasMore),limit:t.limit??100,offset:0,total:u.reduce((e,t)=>e+t.pagination.total,0)},...s.size>0?{errors:[...s.values()]}:{}},resultsBySource:o,sources:r,metadataByAddress:c}}async function browseRegistryCatalog(e,t={}){let{result:n}=await searchRegistryCatalog(e,t);return{items:n.items.map(e=>{let t={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry};return e.title!==void 0&&(t.title=e.title),e.type!==void 0&&(t.type=e.type),e.description!==void 0&&(t.description=e.description),t}),total:n.pagination.total,errors:n.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,resultsBySource:o,sources:s,metadataByAddress:l}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),u=a.errors??[];if(i.json||o.size>0){let t=a.items.map(e=>({...e,...l.get(searchItemAddress(e))})),r={query:n,sections:searchPresentationSections(s,o,l)};i.json&&(r.json={...a,items:t}),printRegistrySearchResults(e,r)}for(let t of u)e.error(`${t.registry}: ${t.message}`);u.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let n=await readEveRegistryConfig(e),r=await getRegistryItems([itemAddress(t)],{config:n});return r.length===1?r[0]:r}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode,c=await runAddCommand(o,e,t,{...n,yes:n.prompter===void 0||n.yes,setupAuthorized:n.prompter!==void 0},r);if(process.exitCode=s,i!==void 0)throw Error(i);if(c===!1)throw new WizardCancelledError;let l={output:a};return c!==void 0&&(l.setup=c),l}async function runAddCommand(e,s,c,l,u=defaultAddCommandDependencies){return runRegistryAction(e,s,async()=>{let d=await readEveRegistryConfig(s),f=itemAddress(c);if(l.skipInstall===!0){if(l.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(l.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(f))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let p=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([f],{config:d}))[0],()=>printAddSuggestions(e,s,c));if(!p.found)return;let m=p.item,h=isOfficialItemAddress(f)?eveMetadataFromRegistryItem(m):void 0;if(assertCompatibleEveVersion(h?.requires),h?.components!==void 0){if(!isOfficialItemAddress(f))throw Error(`Registry packages require the official eve registry.`);return reportRegistryCompletion(e,c,await runRegistryPackage({logger:e,appRoot:s,item:c,components:h.components,config:d,options:l,dependencies:u,operations:{itemAddress,metadata:eveMetadataFromRegistryItem,assertCompatibleVersion:assertCompatibleEveVersion,runSetups:({item:t,setups:r,prompter:i})=>runDeclaredSetups({logger:e,appRoot:s,item:t,setups:r,options:{yes:l.yes,force:l.overwrite,nonInteractive:l.nonInteractive,answers:l.answers,prompter:i,signal:l.signal},dependencies:u,cancelledReminder:setupReminder(t,`cancelled`),resumeCommand:setupResumeCommand(t)}),setupReminder:e=>setupReminder(e,`skipped`)}}),l)}if(l.skipInstall===!0){if(h?.setup===void 0)throw Error(`Registry item "${c}" does not declare a setup flow.`);return reportRegistryCompletion(e,c,await runDeclaredSetups({logger:e,appRoot:s,item:c,setups:h.setup,options:l,dependencies:u,cancelledReminder:setupReminder(c,`cancelled`),resumeCommand:setupResumeCommand(c)}),l)}if(!await prepareDeclaredPnpmBuildPolicy({logger:e,appRoot:s,item:c,policies:h?.install?.pnpm?.buildScripts,options:l}))return!1;if(f===itemAddress(`channel/web`)&&await(u.prepareWebRegistryProject??prepareWebRegistryProject)(s),await installRegistryItemTransaction({appRoot:s,item:c,registryItem:m,nonInteractive:l.nonInteractive,logger:e,install:async()=>{await addRegistryItems([f],{config:d,cwd:s,overwrite:l.overwrite,silent:l.silent})}}),h?.setup===void 0)return reportRegistryCompletion(e,c,{facts:[]},l);let g=u.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(l.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`progress`,message:l.skipInstall?`Setup ${c}`:`Installed ${c}`})),l.skipSetup===!0){if(l.nonInteractive)return reportRegistryCompletion(e,c,{facts:[]},l);e.log(setupReminder(c,`skipped`));return}if(!l.nonInteractive&&!l.yes&&!g&&l.setupAuthorized!==!0){e.log(setupReminder(c,`skipped`));return}if(!l.nonInteractive&&!l.yes&&l.setupAuthorized!==!0)try{if(await(l.prompter??u.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${c} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(c,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(c,`cancelled`));return}return reportRegistryCompletion(e,c,await runDeclaredSetups({logger:e,appRoot:s,item:c,setups:h.setup,options:{...l,force:l.overwrite},dependencies:u,cancelledReminder:setupReminder(c,`cancelled`),resumeCommand:setupResumeCommand(c)}),l)})}async function runRegistryAddCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await addRegistryMappings(t,n);for(let t of r.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of r.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);r.added.length>0&&e.log(`Added ${r.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n,r={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n,r))}async function runRegistrySearchCommand(e,t,n,r,i={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r,{...i,limit:i.limit??10}))}async function runRegistryViewCommand(e,t,n,r={}){await runRegistryAction(e,t,async()=>{let i=await readEveRegistryConfig(t),a=await getRegistryItems([itemAddress(n)],{config:i}),o=a.length===1?a[0]:a;e.log(r.json?JSON.stringify(o,null,2):registryViewText(n,o))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{join,resolve}from"node:path";import{readFileSync}from"node:fs";import{
|
|
1
|
+
import{join,resolve}from"node:path";import{readFileSync}from"node:fs";import{parseEnv}from"node:util";import{findEveProjectRoot}from"#internal/eve-project-root.js";import{isObject}from"#shared/guards.js";import{readProviderSelectionSync}from"#setup/provider-settings.js";const DEVELOPMENT_ENV_FILE_NAMES=[`.env.development.local`,`.env.local`,`.env.development`,`.env`];function isMissingEnvironmentFileError(e){return isObject(e)&&e.code===`ENOENT`}const developmentEnvironmentLoaders=new Map;function getDevelopmentEnvironmentFilePaths(t){return DEVELOPMENT_ENV_FILE_NAMES.map(n=>join(getDevelopmentEnvironmentLoader(t).environmentRoot,n))}async function loadDevelopmentEnvironmentFiles(e){let n=resolve(e);getDevelopmentEnvironmentLoader(n,await findEveProjectRoot(n)).reload()}function stageDevelopmentEnvironmentFiles(e){return getDevelopmentEnvironmentLoader(e).stageReload()}function readDevelopmentEnvironmentHostValues(e){let t={},n=readDevelopmentEnvironmentValues(getDevelopmentEnvironmentLoader(e).environmentRoot),r=new Set(n.keys());r.add(`AI_GATEWAY_API_KEY`);for(let e of[...r].sort((e,t)=>e.localeCompare(t)))t[e]=process.env[e]??null;return t}function getDevelopmentEnvironmentLoader(e,n){let r=resolve(e),i=developmentEnvironmentLoaders.get(r);if(i!==void 0&&n===void 0)return i;let a=resolve(n??r);if(i?.environmentRoot===a)return i;let o=createDevelopmentEnvironmentLoader(r,a);return developmentEnvironmentLoaders.set(r,o),o}function createDevelopmentEnvironmentLoader(e,t){let n=new Map(Object.entries(process.env)),r=new Set(n.keys()),i=new Map,stageReload=()=>{let a=new Map(i),o=readDevelopmentEnvironmentValues(t),s=applyProviderSelection(e,o),c=new Set([...i.keys(),...o.keys()]);s?(c.add(`AI_GATEWAY_API_KEY`),r.delete(`AI_GATEWAY_API_KEY`)):n.has(`AI_GATEWAY_API_KEY`)&&(r.add(`AI_GATEWAY_API_KEY`),process.env.AI_GATEWAY_API_KEY=n.get(`AI_GATEWAY_API_KEY`));let l=new Map([...c].map(e=>[e,process.env[e]])),u=!1;return s&&delete process.env.AI_GATEWAY_API_KEY,applyDevelopmentEnvironmentValues({managedValues:i,nextValues:o,protectedKeys:r}),{commit(){u=!0},rollback(){if(!u){u=!0,i.clear();for(let[e,t]of a)i.set(e,t);for(let[e,t]of l)t===void 0?delete process.env[e]:process.env[e]=t}}}};return{environmentRoot:t,reload(){stageReload().commit()},stageReload}}function applyProviderSelection(e,t){return readProviderSelectionSync(e)===`ai-gateway-project`?(t.delete(`AI_GATEWAY_API_KEY`),!0):!1}function applyDevelopmentEnvironmentValues(e){for(let[t,n]of e.managedValues)e.nextValues.has(t)||e.protectedKeys.has(t)||(process.env[t]===n&&delete process.env[t],e.managedValues.delete(t));for(let[t,n]of e.nextValues)e.protectedKeys.has(t)||(process.env[t]=n,e.managedValues.set(t,n))}function readDevelopmentEnvironmentValues(t){let i=new Map;for(let a of[...DEVELOPMENT_ENV_FILE_NAMES].reverse())try{let o=parseEnv(readFileSync(join(t,a),`utf8`));for(let[e,t]of Object.entries(o))t!==void 0&&i.set(e,t)}catch(e){if(!isMissingEnvironmentFileError(e))throw e}return i}export{DEVELOPMENT_ENV_FILE_NAMES,getDevelopmentEnvironmentFilePaths,loadDevelopmentEnvironmentFiles,readDevelopmentEnvironmentHostValues,stageDevelopmentEnvironmentFiles};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveTuiDisplayOptions}from"./ui-options.js";import{resolveTuiTitle}from"./tui/target.js";import{randomUUID}from"node:crypto";import{devBootPhase}from"#internal/dev-boot-progress.js";import{resumeDevelopmentRuntimeArtifacts,suspendDevelopmentRuntimeArtifacts}from"#services/dev-client/runtime-artifacts.js";async function runInteractiveDevelopmentUi(
|
|
1
|
+
import{resolveTuiDisplayOptions}from"./ui-options.js";import{resolveTuiTitle}from"./tui/target.js";import{randomUUID}from"node:crypto";import{findEveProjectContext}from"#internal/project-context.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{resumeDevelopmentRuntimeArtifacts,suspendDevelopmentRuntimeArtifacts}from"#services/dev-client/runtime-artifacts.js";async function runInteractiveDevelopmentUi(i){let a=await devBootPhase(`loading interactive UI`,async()=>i.runDevelopmentTui??(await import(`#cli/dev/tui/tui.js`)).runDevelopmentTui,i.report),o=i.server.appRoot??i.applicationRoot,s=await findEveProjectContext(o),c=s?.environmentRoot??o,l=s?.kind===`workspace-member`?s.member.appRoot:void 0,u=i.remoteTarget===void 0||i.existingLocalServer?{kind:`local`,serverUrl:i.server.serverUrl,workspaceRoot:c,agentRoot:l}:{kind:`remote`,serverUrl:i.server.serverUrl,workspaceRoot:c,agentRoot:l},d=resolveTuiDisplayOptions(i.options),f=resolveTuiTitle({name:i.options.name,target:u});f!==void 0&&(d.name=f);let p={target:u,initialInput:i.options.input,onboard:i.options.onboard,onBootProgress:i.report,lifecycle:i.lifecycle,...d};i.startup!==void 0&&(p.startup=i.startup),u.kind===`local`&&(p.withExclusiveTerminal=async e=>{let t=randomUUID();if(!await suspendDevelopmentRuntimeArtifacts({leaseId:t,serverUrl:i.server.serverUrl}))throw Error(`Could not pause the development server for integration setup.`);let n;try{n={ok:!0,value:await e()}}catch(e){n={error:e,ok:!1}}let r={leaseId:t,serverUrl:i.server.serverUrl,silent:!0};if(await resumeDevelopmentRuntimeArtifacts(r)===void 0&&await resumeDevelopmentRuntimeArtifacts(r)===void 0)throw Error(`Could not resume the eve development server after integration setup. Restart eve dev before making further source changes.`,n.ok?void 0:{cause:n.error});if(!n.ok)throw n.error;return n.value}),i.remoteTarget?.headers===void 0?await a(p):await a({...p,headers:i.remoteTarget.headers})}export{runInteractiveDevelopmentUi};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isPromptCommandAvailableFor}from"./prompt-commands.js";import{toErrorMessage}from"#shared/errors.js";function createPromptCommandHandler(n){return{async handle(r,i){let{target:a}=n;if(a.kind===`remote`&&!isPromptCommandAvailableFor(r.name,`remote`))return{message:`/${r.name} needs eve dev running the local server (it is not available with --url).`};if(r.name===`model`&&r.argument.length>0){if(a.kind!==`local`)return{message:`/model needs eve dev running the local server (it is not available with --url).`};let e=a.workspaceRoot;try{let{modelChangeRefusalForUneditableModel:t}=await import(`#setup/flows/model.js`),{changeAgentModel:i,formatApplyModelOutcome:a}=await import(`#setup/flows/model-source-change.js`),o=await(n.modelChangeRefusal??t)(e);return o===null?{message:a(await(n.applyModel??i)({appRoot:e,slug:r.argument}))}:{message:o}}catch(e){return{message:`Couldn't change the model: ${toErrorMessage(e)}`}}}let o=i.renderer.setupFlow;if(o===void 0)return{message:`/${r.name} is not supported by this renderer.`};if(r.name===`vc:login`&&a.kind===`remote`){if(i.remoteConnection===void 0)return{message:`/vc:login is not available in this session.`};let e;try{({runRemoteAuthCommand:e}=await import(`./remote-auth-command.js`))}catch(e){return{message:`/vc:login failed: ${toErrorMessage(e)}`}}return{message:await e({connection:i.remoteConnection,flow:n.remoteAuthFlow,renderer:o})}}let s;try{s=await import(`./setup-commands.js`)}catch(e){return{message:`/${r.name} failed: ${toErrorMessage(e)}`}}let{runTuiSetupCommand:c,SETUP_FLOW_CONFIG:l}=s,u=l[r.name];o.begin(i.setupFlowTitle??u.title,u.indicator),o.setNavigation?.(i.setupFlowNavigation);let d=!0;try{let e={command:r.name,appRoot:a.workspaceRoot,renderer:o,withExclusiveTerminal:i.withExclusiveTerminal,chatGptAccountLabel:i.chatGptAccountLabel};i.initialModelStep!==void 0&&(e.initialModelStep=i.initialModelStep),i.registryPlannerContext!==void 0&&(e.registryPlannerContext=i.registryPlannerContext),r.name===`add`&&r.argument.length>0&&(e.initialRegistryAddress=r.argument),n.flows!==void 0&&(e.flows=n.flows);let t=await c(e);d=t.preserveFlowDiagnostics;let{preserveFlowDiagnostics:s,partial:l,...u}=t;return u}finally{i.keepSetupFlowOpen!==!0&&o.end({preserveDiagnostics:d})}}}}export{createPromptCommandHandler};
|
|
1
|
+
import{isPromptCommandAvailableFor}from"./prompt-commands.js";import{toErrorMessage}from"#shared/errors.js";function createPromptCommandHandler(n){return{async handle(r,i){let{target:a}=n;if(a.kind===`remote`&&!isPromptCommandAvailableFor(r.name,`remote`))return{message:`/${r.name} needs eve dev running the local server (it is not available with --url).`};if(r.name===`model`&&r.argument.length>0){if(a.kind!==`local`)return{message:`/model needs eve dev running the local server (it is not available with --url).`};let e=a.agentRoot??a.workspaceRoot;try{let{modelChangeRefusalForUneditableModel:t}=await import(`#setup/flows/model.js`),{changeAgentModel:i,formatApplyModelOutcome:a}=await import(`#setup/flows/model-source-change.js`),o=await(n.modelChangeRefusal??t)(e);return o===null?{message:a(await(n.applyModel??i)({appRoot:e,slug:r.argument}))}:{message:o}}catch(e){return{message:`Couldn't change the model: ${toErrorMessage(e)}`}}}let o=i.renderer.setupFlow;if(o===void 0)return{message:`/${r.name} is not supported by this renderer.`};if(r.name===`vc:login`&&a.kind===`remote`){if(i.remoteConnection===void 0)return{message:`/vc:login is not available in this session.`};let e;try{({runRemoteAuthCommand:e}=await import(`./remote-auth-command.js`))}catch(e){return{message:`/vc:login failed: ${toErrorMessage(e)}`}}return{message:await e({connection:i.remoteConnection,flow:n.remoteAuthFlow,renderer:o})}}let s;try{s=await import(`./setup-commands.js`)}catch(e){return{message:`/${r.name} failed: ${toErrorMessage(e)}`}}let{runTuiSetupCommand:c,SETUP_FLOW_CONFIG:l}=s,u=l[r.name];o.begin(i.setupFlowTitle??u.title,u.indicator),o.setNavigation?.(i.setupFlowNavigation);let d=!0;try{let e={command:r.name,appRoot:a.workspaceRoot,renderer:o,withExclusiveTerminal:i.withExclusiveTerminal,chatGptAccountLabel:i.chatGptAccountLabel};a.agentRoot!==void 0&&(e.agentRoot=a.agentRoot),i.initialModelStep!==void 0&&(e.initialModelStep=i.initialModelStep),i.registryPlannerContext!==void 0&&(e.registryPlannerContext=i.registryPlannerContext),r.name===`add`&&r.argument.length>0&&(e.initialRegistryAddress=r.argument),n.flows!==void 0&&(e.flows=n.flows);let t=await c(e);d=t.preserveFlowDiagnostics;let{preserveFlowDiagnostics:s,partial:l,...u}=t;return u}finally{i.keepSetupFlowOpen!==!0&&o.end({preserveDiagnostics:d})}}}}export{createPromptCommandHandler};
|
|
@@ -40,8 +40,10 @@ export declare const SETUP_FLOW_CONFIG: {
|
|
|
40
40
|
export type TuiSetupCommandRenderer = TuiPrompterRenderer & Pick<SetupFlowRenderer, "readProviderPicker" | "readModelEditor" | "setNavigation" | "waitForInterrupt">;
|
|
41
41
|
export interface TuiSetupCommandInput {
|
|
42
42
|
command: TuiSetupCommand;
|
|
43
|
-
/**
|
|
43
|
+
/** Project root for setup that changes shared dependencies, links, or environment files. */
|
|
44
44
|
appRoot: string;
|
|
45
|
+
/** Selected agent root whose authored settings are changed by `/model`. */
|
|
46
|
+
agentRoot?: string;
|
|
45
47
|
/** The renderer surface the TUI-native prompter drives. */
|
|
46
48
|
renderer: TuiSetupCommandRenderer;
|
|
47
49
|
/** Initial model-flow step authorized by the runner's boot evidence. */
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{formatRegistrySessionResult,registryItemProgress,registryResultTone}from"./registry-result-message.js";import{createTuiPrompter}from"./tui-prompter.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{WizardCancelledError}from"#setup/step.js";import{runLoginFlow}from"#setup/flows/login.js";import{HumanActionRequiredError}from"#setup/human-action.js";import{runInstallVercelCliFlow}from"#setup/flows/install-vercel-cli.js";import{runModelFlow}from"#setup/flows/model.js";import{runProviderFlow}from"#setup/flows/provider.js";import{RegistryFlowFailedError,runRegistryFlow}from"#setup/flows/registry.js";const SETUP_FLOW_CONFIG={"vc:install":{title:`Install the Vercel CLI`,indicator:`pulse`},"vc:login":{title:`Log in to Vercel`,indicator:`pulse`},model:{title:`Configure the agent model`,indicator:`pulse`},add:{title:`Add to your agent`,indicator:`pulse`},deploy:{title:`Deploy to Vercel`,indicator:`spinner`}};function muteableRenderer(e,t,n){return{readSelect:n=>t()?Promise.resolve(void 0):e.readSelect(n),readEditableSelect:n=>t()?Promise.resolve(void 0):e.readEditableSelect(n),readProviderPicker:n=>t()?Promise.resolve(void 0):e.readProviderPicker(n),readModelEditor:n=>t()?Promise.resolve(void 0):e.readModelEditor(n),readText:n=>t()?Promise.resolve(void 0):e.readText(n),readAcknowledge:n=>t()?Promise.resolve():e.readAcknowledge(n),readChoice:n=>t()?{choice:Promise.resolve(void 0),close:()=>{}}:e.readChoice(n),setNavigation:n=>{t()||e.setNavigation?.(n)},setStatus:n=>{t()||e.setStatus(n)},renderLine:(n,r)=>{(!t()||r===`warning`||r===`error`)&&e.renderLine(n,r)},replaceContent:n=>{t()||e.replaceContent?.(n)},renderOutput:n=>{t()||e.renderOutput(n)},withInheritedStdio:t=>e.withInheritedStdio(t),withExclusiveTerminal:e=>n?.(e)??e()}}async function runTuiSetupCommand(e){let{command:t}=e,n=!1,i=new AbortController,o=muteableRenderer(e.renderer,()=>n,e.withExclusiveTerminal),s=(e.createPrompter??createTuiPrompter)(o),cancelActiveRegistryItem,runRegistryItem=async e=>{let t=new AbortController;cancelActiveRegistryItem=()=>t.abort(new WizardCancelledError);try{return await e(AbortSignal.any([i.signal,t.signal]))}finally{cancelActiveRegistryItem=void 0}},c=e.renderer.waitForInterrupt(),l=executeSetupCommand(e,s,o,i.signal,runRegistryItem),u=l.then(e=>({kind:`outcome`,value:e}));try{for(;;){let r=!1;try{let e=await Promise.race([u,c.promise.then(e=>({kind:`interrupt`,interrupt:e}))]);if(e.kind===`outcome`)return e.value;if(t===`add`&&e.interrupt===`escape`&&cancelActiveRegistryItem!==void 0)cancelActiveRegistryItem(),r=!0;else{n=!0,i.abort(new WizardCancelledError);let e=await l;return e.partial===!0?e:{...e,message:`/${t} interrupted.`,tone:`error`,preserveFlowDiagnostics:!0}}}finally{c.dispose()}r&&(c=e.renderer.waitForInterrupt())}}finally{e.renderer.setStatus(void 0)}}async function executeSetupCommand(r,s,d,f,p){let{command:m,appRoot:h}=r,g={runInstallVercelCliFlow,runLoginFlow,runModelFlow,runRegistryFlow,runDeployFlow,...r.flows};try{switch(m){case`vc:install`:return installVercelCliResultMessage(await g.runInstallVercelCliFlow({appRoot:h,prompter:s,signal:f}));case`vc:login`:return loginResultMessage(await g.runLoginFlow({appRoot:h,prompter:s,signal:f}));case`model`:{let pickProvider=e=>d.readProviderPicker(e),e={appRoot:h,prompter:s,signal:f,chatGptAccountLabel:r.chatGptAccountLabel,deps:{pickModelSettings:e=>d.readModelEditor(e),runProviderFlow:e=>runProviderFlow({...e,picker:pickProvider,recoverHumanAction:e=>recoverVercelHumanAction(e,g,{appRoot:h,prompter:s,signal:f})})}};r.initialModelStep!==void 0&&(e.initialStep=r.initialModelStep),e.withExclusiveTerminal=e=>d.withInheritedStdio(()=>r.withExclusiveTerminal?.(e)??e());let t=await g.runModelFlow(e);if(t.kind===`cancelled`)return{message:t.discardedDraft===!0?`/model dismissed. Drafted changes were discarded; Done commits them.`:`/model dismissed.`,cancelled:!0,preserveFlowDiagnostics:!1};let n=[];t.modelMessage!==void 0&&n.push(t.modelMessage),t.providerSelection!==void 0&&n.push(providerSelectionMessage(t.providerSelection));let i={message:n.join(`
|
|
1
|
+
import{formatRegistrySessionResult,registryItemProgress,registryResultTone}from"./registry-result-message.js";import{createTuiPrompter}from"./tui-prompter.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{WizardCancelledError}from"#setup/step.js";import{runLoginFlow}from"#setup/flows/login.js";import{HumanActionRequiredError}from"#setup/human-action.js";import{runInstallVercelCliFlow}from"#setup/flows/install-vercel-cli.js";import{runModelFlow}from"#setup/flows/model.js";import{runProviderFlow}from"#setup/flows/provider.js";import{RegistryFlowFailedError,runRegistryFlow}from"#setup/flows/registry.js";const SETUP_FLOW_CONFIG={"vc:install":{title:`Install the Vercel CLI`,indicator:`pulse`},"vc:login":{title:`Log in to Vercel`,indicator:`pulse`},model:{title:`Configure the agent model`,indicator:`pulse`},add:{title:`Add to your agent`,indicator:`pulse`},deploy:{title:`Deploy to Vercel`,indicator:`spinner`}};function muteableRenderer(e,t,n){return{readSelect:n=>t()?Promise.resolve(void 0):e.readSelect(n),readEditableSelect:n=>t()?Promise.resolve(void 0):e.readEditableSelect(n),readProviderPicker:n=>t()?Promise.resolve(void 0):e.readProviderPicker(n),readModelEditor:n=>t()?Promise.resolve(void 0):e.readModelEditor(n),readText:n=>t()?Promise.resolve(void 0):e.readText(n),readAcknowledge:n=>t()?Promise.resolve():e.readAcknowledge(n),readChoice:n=>t()?{choice:Promise.resolve(void 0),close:()=>{}}:e.readChoice(n),setNavigation:n=>{t()||e.setNavigation?.(n)},setStatus:n=>{t()||e.setStatus(n)},renderLine:(n,r)=>{(!t()||r===`warning`||r===`error`)&&e.renderLine(n,r)},replaceContent:n=>{t()||e.replaceContent?.(n)},renderOutput:n=>{t()||e.renderOutput(n)},withInheritedStdio:t=>e.withInheritedStdio(t),withExclusiveTerminal:e=>n?.(e)??e()}}async function runTuiSetupCommand(e){let{command:t}=e,n=!1,i=new AbortController,o=muteableRenderer(e.renderer,()=>n,e.withExclusiveTerminal),s=(e.createPrompter??createTuiPrompter)(o),cancelActiveRegistryItem,runRegistryItem=async e=>{let t=new AbortController;cancelActiveRegistryItem=()=>t.abort(new WizardCancelledError);try{return await e(AbortSignal.any([i.signal,t.signal]))}finally{cancelActiveRegistryItem=void 0}},c=e.renderer.waitForInterrupt(),l=executeSetupCommand(e,s,o,i.signal,runRegistryItem),u=l.then(e=>({kind:`outcome`,value:e}));try{for(;;){let r=!1;try{let e=await Promise.race([u,c.promise.then(e=>({kind:`interrupt`,interrupt:e}))]);if(e.kind===`outcome`)return e.value;if(t===`add`&&e.interrupt===`escape`&&cancelActiveRegistryItem!==void 0)cancelActiveRegistryItem(),r=!0;else{n=!0,i.abort(new WizardCancelledError);let e=await l;return e.partial===!0?e:{...e,message:`/${t} interrupted.`,tone:`error`,preserveFlowDiagnostics:!0}}}finally{c.dispose()}r&&(c=e.renderer.waitForInterrupt())}}finally{e.renderer.setStatus(void 0)}}async function executeSetupCommand(r,s,d,f,p){let{command:m,appRoot:h}=r,g={runInstallVercelCliFlow,runLoginFlow,runModelFlow,runRegistryFlow,runDeployFlow,...r.flows};try{switch(m){case`vc:install`:return installVercelCliResultMessage(await g.runInstallVercelCliFlow({appRoot:h,prompter:s,signal:f}));case`vc:login`:return loginResultMessage(await g.runLoginFlow({appRoot:h,prompter:s,signal:f}));case`model`:{let pickProvider=e=>d.readProviderPicker(e),e={appRoot:r.agentRoot??h,environmentRoot:h,prompter:s,signal:f,chatGptAccountLabel:r.chatGptAccountLabel,deps:{pickModelSettings:e=>d.readModelEditor(e),runProviderFlow:e=>runProviderFlow({...e,picker:pickProvider,recoverHumanAction:e=>recoverVercelHumanAction(e,g,{appRoot:h,prompter:s,signal:f})})}};r.initialModelStep!==void 0&&(e.initialStep=r.initialModelStep),e.withExclusiveTerminal=e=>d.withInheritedStdio(()=>r.withExclusiveTerminal?.(e)??e());let t=await g.runModelFlow(e);if(t.kind===`cancelled`)return{message:t.discardedDraft===!0?`/model dismissed. Drafted changes were discarded; Done commits them.`:`/model dismissed.`,cancelled:!0,preserveFlowDiagnostics:!1};let n=[];t.modelMessage!==void 0&&n.push(t.modelMessage),t.providerSelection!==void 0&&n.push(providerSelectionMessage(t.providerSelection));let i={message:n.join(`
|
|
2
2
|
`),preserveFlowDiagnostics:!1};return t.accessChanged&&(i.effect={kind:`model-access-changed`}),i}case`add`:{let i=await g.runRegistryFlow({appRoot:h,prompter:s,signal:f,initialAddress:r.initialRegistryAddress,plannerContext:r.registryPlannerContext,onItemStart:registryItemProgress(d),runItem:p});if(i.kind===`cancelled`)return{message:`/add dismissed.`,cancelled:!0,preserveFlowDiagnostics:!0};let a=i.result,o=registryResultTone(a),c=a.items.length>0||a.failures.length>0||a.outcomes!==void 0?formatRegistrySessionResult(a):`No integrations selected.`,l={message:o===`error`?`/add failed — ${c}`:c,preserveFlowDiagnostics:!0};return a.cancelled===!0?(l.partial=!0,l.tone=`error`):o!==void 0&&(l.tone=o),a.deployed===`production`&&(l.effect={kind:`deployed`}),l}case`deploy`:{let e=await g.runDeployFlow({appRoot:h,prompter:s,interactive:!0,signal:f});return e.kind===`cancelled`?{message:`/deploy dismissed.`,preserveFlowDiagnostics:!0}:e.kind===`needs-link`?{message:`Not linked to a Vercel project — run /model to connect one first.`,preserveFlowDiagnostics:!0}:e.kind===`local-model`?{message:`ChatGPT subscription models are local-only. Switch to an AI Gateway or server-authenticated model before deploying.`,preserveFlowDiagnostics:!0}:{message:e.productionUrl===void 0?`Deployed.`:`Deployed: ${e.productionUrl}`,preserveFlowDiagnostics:!0,effect:{kind:`deployed`}}}}}catch(t){if(t instanceof WizardCancelledError)return{message:`/${m} dismissed.`,cancelled:!0,preserveFlowDiagnostics:m!==`model`};let n=t instanceof RegistryFlowFailedError?t.cause:t,r=await vercelCliUpgradeOutcome(n,m,g,{appRoot:h,prompter:s,signal:f});if(r!==void 0)return withRegistryResults(r,t);let i=vercelActionOutcome(n,m);return i===void 0?t instanceof RegistryFlowFailedError?{message:`${formatRegistrySessionResult(t.completed)}\n\n${t.message}`,partial:!0,tone:`error`,preserveFlowDiagnostics:!0}:{message:`/${m} failed: ${t instanceof Error?t.message:String(t)}`,tone:`error`,preserveFlowDiagnostics:!0}:withRegistryResults(i,t)}}async function recoverVercelHumanAction(e,t,n){let r=e.action.kind;if(r!==`vercel-cli-missing`&&r!==`vercel-cli-upgrade`&&r!==`vercel-login`&&r!==`vercel-forbidden`)throw e;let i=r===`vercel-cli-missing`?{label:`Install Vercel CLI`,message:`The Vercel CLI is required. Install it now?`}:r===`vercel-cli-upgrade`?{label:`Upgrade Vercel CLI`,message:`Your Vercel CLI needs an update. Upgrade it now?`}:{label:r===`vercel-forbidden`?`Re-authenticate with Vercel`:`Log in to Vercel`,message:r===`vercel-forbidden`?`Vercel denied access to that team. Re-authenticate and continue?`:`You need to log in to Vercel to continue.`},a;try{a=await n.prompter.select({message:i.message,options:[{value:`repair`,label:`${i.label} and continue`},{value:`cancel`,label:`Choose another option`}],initialValue:`repair`})}catch{return`cancel`}if(a===`cancel`)return`cancel`;if(r===`vercel-cli-missing`||r===`vercel-cli-upgrade`){let e=await t.runInstallVercelCliFlow({appRoot:n.appRoot,prompter:n.prompter,signal:n.signal,upgrade:r===`vercel-cli-upgrade`});return e.kind===`installed`||e.kind===`already`?`retry`:(n.prompter.log.warning(e.kind===`failed`&&e.reason!==void 0?`Couldn't ${r===`vercel-cli-upgrade`?`upgrade`:`install`} the Vercel CLI: ${e.reason}`:`Couldn't ${r===`vercel-cli-upgrade`?`upgrade`:`install`} the Vercel CLI.`),`cancel`)}let o=await t.runLoginFlow({appRoot:n.appRoot,prompter:n.prompter,signal:n.signal,force:r===`vercel-forbidden`});return n.prompter.replaceContent?.(),o.kind===`logged-in`||o.kind===`already`?`retry`:`cancel`}function withRegistryResults(t,n){return n instanceof RegistryFlowFailedError?{...t,message:`${formatRegistrySessionResult(n.completed)}\n\n${t.message}`,partial:!0,tone:`error`,preserveFlowDiagnostics:!0}:t}async function vercelCliUpgradeOutcome(e,t,n,r){if(!(e instanceof HumanActionRequiredError)||e.action.kind!==`vercel-cli-upgrade`)return;let i;try{i=await r.prompter.select({message:`Your Vercel CLI needs an update to list your teams. Upgrade now?`,options:[{value:`upgrade`,label:`Upgrade Vercel CLI`,description:`Run the Vercel CLI's native upgrader`},{value:`later`,label:`Not now`}],initialValue:`upgrade`})}catch{i=`later`}if(i===`later`)return{message:`The Vercel CLI needs an update — run \`vercel upgrade\`, then retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!0};let a;try{a=await n.runInstallVercelCliFlow({appRoot:r.appRoot,prompter:r.prompter,signal:r.signal,upgrade:!0})}catch(e){return{message:vercelCliUpgradeFailureMessage(t,errorMessage(e)),tone:`error`,preserveFlowDiagnostics:!0}}switch(a.kind){case`installed`:return{message:`Upgraded the Vercel CLI. Retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!1};case`failed`:return{message:vercelCliUpgradeFailureMessage(t,a.reason),tone:`error`,preserveFlowDiagnostics:!0};case`cancelled`:return{message:`Vercel CLI upgrade cancelled — run \`vercel upgrade\`, then retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!0};case`already`:return{message:`The Vercel CLI is already up to date. Retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!1}}}function errorMessage(e){let t=(e instanceof Error?e.message:String(e)).replace(/\s+/gu,` `).trim();return t.length<=240?t:`${t.slice(0,239)}…`}function vercelCliUpgradeFailureMessage(e,t){return`Couldn't upgrade the Vercel CLI${t===void 0||t===``?``:` (${t})`} — run \`vercel upgrade\`, then retry /${e}.`}function vercelActionOutcome(e,t){if(!(e instanceof HumanActionRequiredError))return;let n=vercelActionMessage(e.action.kind,t);return n===void 0?void 0:{message:n,tone:`error`,preserveFlowDiagnostics:!0}}function vercelActionMessage(e,t){switch(e){case`vercel-login`:return`You're not logged in to Vercel — run /vc:login, then retry /${t}.`;case`vercel-forbidden`:return`Vercel denied access to that team — run /vc:login to re-authenticate (for example to complete SSO), or pick a team you can access, then retry /${t}.`;case`vercel-cli-missing`:return`The Vercel CLI isn't installed — run /vc:install to install it, then retry /${t}.`;case`vercel-cli-upgrade`:return`The Vercel CLI needs an update — run \`vercel upgrade\`, then retry /${t}.`;default:return}}function installVercelCliResultMessage(e){switch(e.kind){case`cancelled`:return{message:`/vc:install dismissed.`,preserveFlowDiagnostics:!1};case`already`:return{message:`The Vercel CLI is already installed.`,preserveFlowDiagnostics:!1};case`failed`:return{message:"Couldn't install the Vercel CLI — install it manually with `npm i -g vercel@latest`.",preserveFlowDiagnostics:!0};case`installed`:return{message:`Installed the Vercel CLI. Run /vc:login next.`,preserveFlowDiagnostics:!1,effect:{kind:`refresh-identity`}}}}function loginResultMessage(e){switch(e.kind){case`cancelled`:return{message:`/vc:login dismissed.`,preserveFlowDiagnostics:!1};case`already`:return{message:`You're already logged in to Vercel.`,preserveFlowDiagnostics:!1};case`cli-missing`:return{message:`The Vercel CLI isn't installed — run /vc:install to install it, then retry /vc:login.`,preserveFlowDiagnostics:!0};case`failed`:return{message:`Vercel login didn't complete — run /vc:login to try again.`,preserveFlowDiagnostics:!0};case`logged-in`:return{message:`Logged in to Vercel.`,preserveFlowDiagnostics:!1,effect:{kind:`refresh-identity`}};case`unavailable`:return{message:`Couldn't reach Vercel — check your connection, then retry /vc:login.`,preserveFlowDiagnostics:!0}}}function providerSelectionMessage(e){return e===`chatgpt`?`ChatGPT subscription selected.`:e===`ai-gateway-project`?`AI Gateway via Project selected.`:`AI Gateway via API key selected.`}export{SETUP_FLOW_CONFIG,runTuiSetupCommand};
|