eve 0.66.1 → 0.66.3
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 +18 -0
- package/dist/src/cli/commands/deploy.d.ts +3 -1
- package/dist/src/cli/commands/deploy.js +1 -1
- package/dist/src/cli/commands/integration-connect.js +1 -1
- package/dist/src/cli/commands/register-project-commands.js +1 -1
- package/dist/src/cli/commands/registry-declared-setups.d.ts +0 -1
- package/dist/src/cli/commands/registry-declared-setups.js +1 -1
- package/dist/src/cli/commands/registry.d.ts +5 -1
- package/dist/src/cli/commands/registry.js +1 -1
- package/dist/src/cli/commands/vercel-non-interactive.d.ts +7 -0
- package/dist/src/cli/commands/vercel-non-interactive.js +1 -1
- package/dist/src/cli/dev/tui/argument-typeahead.d.ts +1 -2
- package/dist/src/cli/dev/tui/argument-typeahead.js +2 -2
- package/dist/src/cli/dev/tui/blocks.d.ts +5 -1
- package/dist/src/cli/dev/tui/blocks.js +3 -3
- package/dist/src/cli/dev/tui/flow-drawer.d.ts +11 -0
- package/dist/src/cli/dev/tui/flow-drawer.js +1 -0
- package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
- package/dist/src/cli/dev/tui/prompt-commands.d.ts +199 -0
- package/dist/src/cli/dev/tui/prompt-commands.js +2 -2
- package/dist/src/cli/dev/tui/registry-result-message.d.ts +15 -4
- package/dist/src/cli/dev/tui/registry-result-message.js +4 -4
- package/dist/src/cli/dev/tui/remote-auth.js +1 -1
- package/dist/src/cli/dev/tui/runner.d.ts +18 -6
- package/dist/src/cli/dev/tui/runner.js +3 -2
- package/dist/src/cli/dev/tui/setup-commands.d.ts +5 -22
- package/dist/src/cli/dev/tui/setup-commands.js +2 -1
- package/dist/src/cli/dev/tui/setup-flow.d.ts +2 -10
- package/dist/src/cli/dev/tui/setup-panel.d.ts +4 -23
- package/dist/src/cli/dev/tui/setup-panel.js +3 -3
- package/dist/src/cli/dev/tui/terminal-renderer.d.ts +11 -7
- package/dist/src/cli/dev/tui/terminal-renderer.js +11 -10
- package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
- package/dist/src/cli/dev/tui/tui.js +1 -1
- package/dist/src/compiled/.vendor-stamp.json +6 -6
- package/dist/src/compiled/@workflow/core/create-hook.d.ts +38 -1
- package/dist/src/compiled/@workflow/core/global.d.ts +2 -0
- package/dist/src/compiled/@workflow/core/index.js +2 -2
- package/dist/src/compiled/@workflow/core/private.js +1 -1
- package/dist/src/compiled/@workflow/core/runtime/constants.d.ts +9 -0
- package/dist/src/compiled/@workflow/core/runtime/helpers.js +1 -1
- package/dist/src/compiled/@workflow/core/runtime/hook-wake.d.ts +89 -0
- package/dist/src/compiled/@workflow/core/runtime/open-hook-wait-state.d.ts +55 -0
- package/dist/src/compiled/@workflow/core/runtime/quickjs-runtime.d.ts +2 -0
- package/dist/src/compiled/@workflow/core/runtime/suspension-handler.d.ts +8 -1
- package/dist/src/compiled/@workflow/core/runtime.js +4 -4
- package/dist/src/compiled/@workflow/core/serialization/types.d.ts +8 -0
- package/dist/src/compiled/@workflow/core/serialization.d.ts +8 -0
- package/dist/src/compiled/@workflow/core/serialization.js +1 -1
- 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/index.d.ts +23 -0
- package/dist/src/compiled/@workflow/errors/index.js +1 -1
- package/dist/src/compiled/@workflow/world/events.d.ts +34 -0
- package/dist/src/compiled/@workflow/world/hooks.d.ts +27 -0
- package/dist/src/compiled/@workflow/world/index.d.ts +2 -2
- package/dist/src/compiled/@workflow/world/interfaces.d.ts +24 -0
- package/dist/src/compiled/@workflow/world/spec-version.d.ts +32 -11
- package/dist/src/compiled/@workflow/world-local/index.js +3 -3
- package/dist/src/compiled/@workflow/world-vercel/index.js +17 -17
- package/dist/src/compiled/_chunks/workflow/{attribute-changes-89Nwz7XW.js → attribute-changes-DzJovO_f.js} +1 -1
- package/dist/src/compiled/_chunks/workflow/dist-BQSf8Hax.js +1 -0
- package/dist/src/compiled/_chunks/workflow/dist-BfMqXLK3.js +3 -0
- package/dist/src/compiled/_chunks/workflow/frames-qKc30rjg.js +3 -0
- package/dist/src/compiled/_chunks/workflow/{global-DIlFoH2w.js → global-BQnKzRXo.js} +1 -1
- package/dist/src/compiled/_chunks/workflow/{helpers-k3zcudWr.js → helpers-CNMO7zB1.js} +1 -1
- package/dist/src/compiled/_chunks/workflow/{logger-Bzc8jWWj.js → logger-BCEj9caG.js} +1 -1
- package/dist/src/compiled/_chunks/workflow/resume-hook-QS_cMwHn.js +1 -0
- package/dist/src/compiled/_chunks/workflow/run-CA5wWV2S.js +1 -0
- package/dist/src/compiled/_chunks/workflow/serialization-CJ265vSe.js +3 -0
- package/dist/src/compiled/_chunks/workflow/sleep-CBn94Ayv.js +1 -0
- package/dist/src/compiled/_chunks/workflow/{wait-until-DXLZx3tU.js → wait-until-Bo2U6ON9.js} +1 -1
- package/dist/src/compiled/_chunks/workflow/{ws-transport-BSM_Cl7a.js → ws-transport-BrsMYqJg.js} +1 -1
- package/dist/src/discover/filesystem.d.ts +2 -0
- package/dist/src/discover/filesystem.js +1 -1
- package/dist/src/discover/grammar.d.ts +4 -2
- package/dist/src/discover/grammar.js +1 -1
- package/dist/src/discover/sandbox.js +1 -1
- package/dist/src/execution/dynamic-workflow/tool.js +1 -1
- package/dist/src/execution/session/entry-input.d.ts +4 -0
- package/dist/src/execution/session/entry-input.js +1 -1
- package/dist/src/execution/tools/agent-router-workflow.js +1 -1
- package/dist/src/execution/tools/ask-question-workflow.js +1 -1
- package/dist/src/execution/tools/sleep-workflow.js +1 -1
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/extensions/code/extension/lib/connect-authentication.js +1 -1
- package/dist/src/extensions/code/extension/lib/github-shell.js +1 -1
- package/dist/src/extensions/code/extension/lib/prwatch-github.js +1 -1
- package/dist/src/harness/tool-loop.js +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/instrumentation-layout.js +1 -1
- package/dist/src/internal/model-auth/vercel-cli.d.ts +2 -0
- package/dist/src/internal/model-auth/vercel-cli.js +1 -1
- package/dist/src/internal/nitro/host/build-extension.js +1 -1
- package/dist/src/internal/nitro/host/extension-capability-requirements.d.ts +1 -0
- package/dist/src/internal/nitro/host/extension-capability-requirements.js +1 -1
- package/dist/src/internal/nitro/host/extension-declarations.js +1 -1
- package/dist/src/internal/nitro/host/extension-distribution.js +1 -1
- package/dist/src/internal/nitro/host/extension-state-usage.d.ts +2 -2
- package/dist/src/internal/nitro/host/extension-state-usage.js +1 -1
- package/dist/src/internal/workflow/development-world-client.js +1 -1
- package/dist/src/public/channels/slack/activity-plan.d.ts +2 -1
- package/dist/src/public/channels/slack/activity-plan.js +1 -1
- package/dist/src/public/channels/slack/activity.d.ts +2 -0
- package/dist/src/public/channels/slack/activity.js +1 -1
- package/dist/src/public/channels/slack/api.d.ts +7 -0
- package/dist/src/public/channels/slack/api.js +1 -1
- package/dist/src/public/channels/slack/attachments.d.ts +5 -2
- package/dist/src/public/channels/slack/attachments.js +1 -1
- package/dist/src/public/channels/slack/index.d.ts +1 -0
- package/dist/src/public/channels/slack/input-response.d.ts +2 -0
- package/dist/src/public/channels/slack/input-response.js +1 -1
- package/dist/src/public/channels/slack/interaction-cards.js +1 -1
- package/dist/src/public/channels/slack/interactions.d.ts +2 -0
- package/dist/src/public/channels/slack/interactions.js +1 -1
- package/dist/src/public/channels/slack/slackChannel.d.ts +3 -0
- package/dist/src/public/channels/slack/slackChannel.js +1 -1
- package/dist/src/public/channels/slack/slash-command.d.ts +5 -1
- package/dist/src/public/channels/slack/slash-command.js +1 -1
- package/dist/src/public/channels/slack/transport.d.ts +76 -0
- package/dist/src/public/channels/slack/transport.js +1 -0
- package/dist/src/setup/boxes/link-project.d.ts +2 -0
- package/dist/src/setup/boxes/link-project.js +1 -1
- package/dist/src/setup/cli/channel-setup-prompter.d.ts +2 -9
- package/dist/src/setup/cli/channel-setup-prompter.js +1 -1
- package/dist/src/setup/cli/index.d.ts +1 -1
- package/dist/src/setup/connection-connector.js +1 -1
- package/dist/src/setup/flows/deploy.d.ts +1 -0
- package/dist/src/setup/flows/deploy.js +1 -1
- package/dist/src/setup/flows/install-vercel-cli.js +1 -1
- package/dist/src/setup/flows/login.js +1 -1
- package/dist/src/setup/flows/model-login-connection.d.ts +0 -16
- package/dist/src/setup/flows/model-login-connection.js +1 -1
- package/dist/src/setup/flows/model-login-options.d.ts +59 -0
- package/dist/src/setup/flows/model-login-options.js +1 -0
- package/dist/src/setup/flows/model-login.js +1 -1
- package/dist/src/setup/flows/model-source-change.d.ts +0 -2
- package/dist/src/setup/flows/model-source-change.js +1 -1
- package/dist/src/setup/flows/registry-session.d.ts +15 -13
- package/dist/src/setup/flows/registry-session.js +1 -1
- package/dist/src/setup/flows/registry.js +1 -1
- package/dist/src/setup/flows/vercel-model-login.js +1 -1
- package/dist/src/setup/integrations/photon/setup-flow.js +1 -1
- package/dist/src/setup/integrations/runner.js +1 -1
- package/dist/src/setup/prompter.d.ts +2 -2
- package/dist/src/setup/registry-setup-client.js +1 -1
- package/dist/src/setup/registry-setup-protocol.d.ts +0 -4
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/setup/slack-connect-lifecycle.js +1 -1
- package/dist/src/setup/slackbot.js +1 -1
- package/dist/src/setup/vercel-project.d.ts +2 -0
- package/dist/src/setup/vercel-project.js +0 -0
- package/dist/src/setup/vercel-trace-sampling.d.ts +3 -0
- package/dist/src/setup/vercel-trace-sampling.js +1 -0
- package/docs/channels/slack.mdx +31 -2
- package/docs/guides/deployment/vercel.mdx +2 -0
- package/docs/guides/dev-tui.md +1 -1
- package/docs/guides/instrumentation/agent-runs.mdx +4 -4
- package/docs/reference/agent-files.md +16 -0
- package/package.json +6 -6
- package/dist/src/compiled/_chunks/workflow/dist-CNT2vjZ4.js +0 -1
- package/dist/src/compiled/_chunks/workflow/dist-DtXwQbZr.js +0 -3
- package/dist/src/compiled/_chunks/workflow/frames-DnrfSd1P.js +0 -3
- package/dist/src/compiled/_chunks/workflow/resume-hook-BmJ263ZR.js +0 -1
- package/dist/src/compiled/_chunks/workflow/run-NLvREued.js +0 -1
- package/dist/src/compiled/_chunks/workflow/serialization-HCDeQWcR.js +0 -3
- package/dist/src/compiled/_chunks/workflow/sleep-Bi508qmg.js +0 -1
- package/dist/src/public/channels/slack/api-errors.d.ts +0 -33
- package/dist/src/public/channels/slack/api-errors.js +0 -1
- /package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_37d5e4f23f0f03cba2e0819e67e81b38 → @vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff}/node_modules/@vercel/connect/dist/authorization.js +0 -0
- /package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_37d5e4f23f0f03cba2e0819e67e81b38 → @vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff}/node_modules/@vercel/connect/dist/connector.js +0 -0
- /package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_37d5e4f23f0f03cba2e0819e67e81b38 → @vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff}/node_modules/@vercel/connect/dist/index.js +0 -0
- /package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_37d5e4f23f0f03cba2e0819e67e81b38 → @vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff}/node_modules/@vercel/connect/dist/installation.js +0 -0
- /package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_37d5e4f23f0f03cba2e0819e67e81b38 → @vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff}/node_modules/@vercel/connect/dist/internal/base-url.js +0 -0
- /package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_37d5e4f23f0f03cba2e0819e67e81b38 → @vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff}/node_modules/@vercel/connect/dist/internal/default-scopes.js +0 -0
- /package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_37d5e4f23f0f03cba2e0819e67e81b38 → @vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff}/node_modules/@vercel/connect/dist/internal/env.js +0 -0
- /package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_37d5e4f23f0f03cba2e0819e67e81b38 → @vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff}/node_modules/@vercel/connect/dist/internal/url-validation.js +0 -0
- /package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_37d5e4f23f0f03cba2e0819e67e81b38 → @vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff}/node_modules/@vercel/connect/dist/token.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# eve
|
|
2
2
|
|
|
3
|
+
## 0.66.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 15ad358: Allow empty-response recovery to request fresh reads when earlier tool results are stale, while continuing to warn against repeating completed writes and other side effects.
|
|
8
|
+
- faab713: `eve dev` now uses a single `*` marker for completed slash commands and excludes picker and drawer commands, including `/loglevel`, from input history. Setup failures keep their invocation visible, and failed registry installs no longer expose installer output in TUI diagnostics.
|
|
9
|
+
- 0aad786: `slackChannel` and `callSlackApi` accept an `api` option, `{ apiBaseUrl?, fileBaseUrl?, fetch? }`, that sends Slack Web API calls and attachment downloads to another host. `fileBaseUrl` defaults to `apiBaseUrl`, `fetch` is called only for URLs on those hosts, each base must be an absolute http or https URL with no query string or fragment, and omitting `api` keeps `https://slack.com/api/` and the global `fetch`.
|
|
10
|
+
- faab713: Keep setup drawer status content inside its temporary surface, and use the same model-login connection catalog for TUI completion and command handling.
|
|
11
|
+
- e148d8f: Upgrade the Workflow SDK beta packages and mark new session handoffs as protocol version 2. Handoffs without a version remain compatible as version 1, so future forced hook claims can be limited to sessions whose previous owner supports them.
|
|
12
|
+
|
|
13
|
+
## 0.66.2
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- 306f2ce: Configure 100% Vercel trace sampling across all environments when `eve deploy` creates a new project, with `--no-trace-sampling` to opt out.
|
|
18
|
+
- fdf1364: Ignore JavaScript and TypeScript `*.test.*`/`*.spec.*` modules and `__tests__/` directories during agent discovery.
|
|
19
|
+
- 8565550: Fix `auto()` model selection when a turn resumes after a question or tool approval.
|
|
20
|
+
|
|
3
21
|
## 0.66.1
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { isEveProject } from "#setup/scaffold/index.js";
|
|
2
2
|
import { type DeployFlowDeps } from "#setup/flows/deploy.js";
|
|
3
3
|
import { type Prompter } from "#setup/prompter.js";
|
|
4
|
-
import { type VercelProjectCliOptions } from "./vercel-non-interactive.js";
|
|
4
|
+
import { type NonInteractiveLinkDependencies, type VercelProjectCliOptions } from "./vercel-non-interactive.js";
|
|
5
5
|
export interface DeployCliLogger {
|
|
6
6
|
error(message: string): void;
|
|
7
7
|
log(message: string): void;
|
|
@@ -12,6 +12,7 @@ export interface DeployCommandDependencies {
|
|
|
12
12
|
isEveProject?: typeof isEveProject;
|
|
13
13
|
/** Test seam into the flow's detection and box effects. */
|
|
14
14
|
flowDeps?: Partial<DeployFlowDeps>;
|
|
15
|
+
nonInteractiveLinkDeps?: NonInteractiveLinkDependencies;
|
|
15
16
|
}
|
|
16
17
|
/**
|
|
17
18
|
* `eve deploy`: deploy the agent to Vercel production. An already-linked
|
|
@@ -22,4 +23,5 @@ export interface DeployCommandDependencies {
|
|
|
22
23
|
*/
|
|
23
24
|
export declare function runDeployCommand(logger: DeployCliLogger, appRoot: string, dependencies?: DeployCommandDependencies, options?: VercelProjectCliOptions & {
|
|
24
25
|
yes?: boolean;
|
|
26
|
+
traceSampling?: boolean;
|
|
25
27
|
}): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
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,t,n=defaultDependencies,r={}){if(!await validateWorkspaceProjectCommand({appRoot:t,isEveProject:n.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;
|
|
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";import{configureTraceSampling}from"#setup/vercel-trace-sampling.js";const defaultDependencies={hasInteractiveTerminal,isEveProject};async function runDeployCommand(e,t,n=defaultDependencies,r={}){if(!await validateWorkspaceProjectCommand({appRoot:t,isEveProject:n.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;let i=isNonInteractiveProjectCommand(r);if(i&&r.yes!==!0){e.error("`eve deploy --non-interactive` requires `--yes` to confirm production deployment."),process.exitCode=1;return}let a=n.createPrompter?.()??createPrompter();try{if(i&&r.project!==void 0&&!await runNonInteractiveLink({logger:e,appRoot:t,options:r,dependencies:n.nonInteractiveLinkDeps,onCreatedProject:r.traceSampling===!1?void 0:e=>configureTraceSampling(e,a),onProjectCreationUnknown:r.traceSampling===!1?void 0:()=>a.log.warning(`Could not verify the Vercel project for trace sampling, so it was not configured. Check the project settings if you need traces in Agent Runs.`)}))return;a.intro(`Deploy your eve agent to Vercel`);let o=await runDeployFlow({appRoot:t,prompter:a,traceSampling:r.traceSampling!==!1,interactive:!i&&n.hasInteractiveTerminal(),deps:n.flowDeps});if(o.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(o.kind===`local-model`){e.error("ChatGPT subscription models use local ChatGPT credentials and cannot be deployed. Switch to an AI Gateway or server-authenticated model before running `eve deploy`."),process.exitCode=1;return}a.outro(o.kind===`cancelled`?`Cancelled.`:o.productionUrl===void 0?`Deployed.`:`Deployed: ${o.productionUrl}`)}catch(t){e.error(t instanceof Error?t.message:String(t)),process.exitCode=1}}export{runDeployCommand};
|
|
@@ -1 +1 @@
|
|
|
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{
|
|
1
|
+
import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{join}from"node:path";import{createPrompter}from"#setup/prompter.js";import{readProjectLink}from"#setup/project-resolution.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{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 t={...defaultDependencies,...e.dependencies},n=e.options?.nonInteractive===!0,r=t.createPrompter?.()??(n?createHeadlessPrompter(()=>{}):createPrompter()),i=e.options?.signal;r.intro(`Set up ${e.slug}`);let a=await t.readProjectLink(e.appRoot);if(a===void 0){if(n)a=await resolveIntegrationVercelProject({appRoot:e.appRoot,integration:e.slug,signal:i,deps:{readProjectLink:t.readProjectLink}});else try{a=await t.ensureVercelProject({appRoot:e.appRoot,prompter:r,signal:i,teamSelectMessage:()=>`You need to link to a project to use ${e.slug} through Vercel Connect.\n\nSelect your team`,deps:t.ensureVercelProjectDeps})}catch(e){if(e instanceof WizardCancelledError)return;throw e}}let o={log:r.log,prompter:r,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:a,signal:i},s=await t.setupConnectionConnector(o),c=join(e.appRoot,`agent`,`connections`,`${e.slug}.ts`);if(!(await t.updateConnectionConnectorUid(c,s.connectorUid)).patched)throw s.kind===`created`&&await t.cleanupCreatedConnectionConnector({log:r.log,projectRoot:e.appRoot,connectorId:s.connectorId,orgId:a.orgId}),Error(`Could not update the connector in agent/connections/${e.slug}.ts.`);r.outro(`Connection ${e.slug} set up.`)}async function runIntegrationConnectCommand(e,t,n,r,i,a={},o=defaultDependencies){let s=createRegistrySetupClient({signal:a.signal});try{await runIntegrationConnect({appRoot:t,slug:n,service:r,canonicalConnectorName:i,options:a,dependencies:{...o,createPrompter:()=>s?.prompter??(a.nonInteractive?createHeadlessPrompter(()=>{}):o.createPrompter?.()??createPrompter())}}),s?.complete()}catch(t){if(s?.fail(t),s!==void 0)return;if(a.nonInteractive&&t instanceof SetupPrerequisiteRequired){e.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`prerequisite_required`,prerequisite:t.prerequisite})),process.exitCode=2;return}e.error(t instanceof Error?t.message:String(t)),process.exitCode=1}}export{runIntegrationConnect,runIntegrationConnectCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{findEveProjectContext}from"#internal/project-context.js";function projectCommand(e,t){return e.hook(`preAction`,async()=>{let e=await findEveProjectContext(t.root);e?.kind===`standalone`&&(t.root=e.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
|
+
import{findEveProjectContext}from"#internal/project-context.js";function projectCommand(e,t){return e.hook(`preAction`,async()=>{let e=await findEveProjectContext(t.root);e?.kind===`standalone`&&(t.root=e.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`).option(`--no-trace-sampling`,`Skip 100% Vercel trace sampling for a new project`).action(async t=>{let{runDeployCommand:n}=await import(`./deploy.js`);await n(e.logger,e.applicationContext.root,void 0,t)})}export{registerProjectCommands};
|
|
@@ -19,6 +19,5 @@ export declare function runDeclaredSetups(input: {
|
|
|
19
19
|
setups: readonly RegistrySetupCommand[] | undefined;
|
|
20
20
|
options: DeclaredSetupOptions;
|
|
21
21
|
dependencies: RegistrySetupDependencies;
|
|
22
|
-
cancelledReminder: string;
|
|
23
22
|
resumeCommand: string;
|
|
24
23
|
}): Promise<RegistrySetupCompletion | false>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{createPrompter}from"#setup/prompter.js";import{createHeadlessPrompter}from"#setup/headless.js";import{mergeRegistrySetupCompletions}from"#setup/registry-setup-completion.js";async function runDeclaredSetups(e){let t={facts:[]};if(e.setups===void 0)return t;let n=await e.dependencies.loadSetupCommandRunner(),r=e.options.prompter??(e.options.nonInteractive?createHeadlessPrompter(e.logger.log):createPrompter());try{for(let i of e.setups){let a=await n(e.appRoot,{...i,args:[...i.args,...e.options.yes?[`--yes`]:[],...e.options.force&&i.package===`eve`&&i.bin===`eve`&&i.args[0]===`integration`&&i.args[1]===`setup`?[`--force`]:[],...e.options.nonInteractive?[`--non-interactive`]:[],...Object.entries(e.options.answers??{}).flatMap(([e,t])=>[`--answer`,`${e}=${JSON.stringify(t)}`])]},e.item,{prompter:r,signal:e.options.signal});if(a.kind===`cancelled`)return
|
|
1
|
+
import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{createHeadlessPrompter}from"#setup/headless.js";import{mergeRegistrySetupCompletions}from"#setup/registry-setup-completion.js";async function runDeclaredSetups(e){let t={facts:[]};if(e.setups===void 0)return t;let n=await e.dependencies.loadSetupCommandRunner(),r=e.options.prompter??(e.options.nonInteractive?createHeadlessPrompter(e.logger.log):createPrompter());try{for(let i of e.setups){let a=await n(e.appRoot,{...i,args:[...i.args,...e.options.yes?[`--yes`]:[],...e.options.force&&i.package===`eve`&&i.bin===`eve`&&i.args[0]===`integration`&&i.args[1]===`setup`?[`--force`]:[],...e.options.nonInteractive?[`--non-interactive`]:[],...Object.entries(e.options.answers??{}).flatMap(([e,t])=>[`--answer`,`${e}=${JSON.stringify(t)}`])]},e.item,{prompter:r,signal:e.options.signal});if(a.kind===`cancelled`)return!1;if(a.kind===`blocked`){if(!e.options.nonInteractive)throw Error(`Setup requires more input.`);return e.logger.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,item:e.item,installed:!0,completedItems:[],...a.blocker,next:headlessSetupContinuation({item:e.item,installed:!0,answers:e.options.answers,question:a.blocker.status===`input_required`?a.blocker.question:void 0})})),process.exitCode=2,!1}if(e.options.silent!==!0)for(let t of a.facts)e.logger.log(`${t.label}: ${t.value}`);t=mergeRegistrySetupCompletions(t,a)}return t}catch(t){if(t instanceof WizardCancelledError)return!1;let n=t instanceof Error?t.message:String(t);if(e.options.nonInteractive)return e.logger.error(serializeHeadlessSetupEvent({version:1,type:`failed`,item:e.item,completedItems:[],message:n,next:headlessSetupContinuation({item:e.item,installed:!0,answers:e.options.answers})})),process.exitCode=1,!1;throw Error(`${n} Try again with \`${e.resumeCommand}\`.`)}}export{runDeclaredSetups};
|
|
@@ -79,9 +79,13 @@ export declare function installRegistryItem(appRoot: string, item: string, optio
|
|
|
79
79
|
}, dependencies?: AddCommandDependencies): Promise<{
|
|
80
80
|
output: readonly string[];
|
|
81
81
|
setup?: RegistrySetupCompletion;
|
|
82
|
+
/** Files were added, but setup was cancelled or skipped. */
|
|
83
|
+
setupIncomplete?: {
|
|
84
|
+
resumeCommand: string;
|
|
85
|
+
};
|
|
82
86
|
}>;
|
|
83
87
|
/** Installs an official, configured, or URL-addressed registry item. */
|
|
84
|
-
export declare function runAddCommand(logger: RegistryCommandLogger, appRoot: string, item: string, options: RunAddCommandOptions, dependencies?: AddCommandDependencies): Promise<RegistrySetupCompletion | false | undefined>;
|
|
88
|
+
export declare function runAddCommand(logger: RegistryCommandLogger, appRoot: string, item: string, options: RunAddCommandOptions, dependencies?: AddCommandDependencies): Promise<RegistrySetupCompletion | false | "setup-incomplete" | undefined>;
|
|
85
89
|
/** Lists registry items from every configured source or one selected source. */
|
|
86
90
|
export declare function runRegistryListCommand(logger: RegistryCommandLogger, appRoot: string, source?: string, options?: RegistryCommandOptions): Promise<void>;
|
|
87
91
|
/** Searches registry items across every configured source or one selected source. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hasInteractiveTerminal}from"./preconditions.js";import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{prepareWebChatProjectRoot,prepareWebRegistryProject,readRegistryConfig}from"./registry-project.js";import{errorMessage,reportRegistryCompletion,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand}from"./registry-recovery.js";import{runRegistryAddCommand}from"./registry-add-command.js";import{runDeclaredSetups}from"./registry-declared-setups.js";import{installRegistryItemTransaction}from"./registry-install-transaction.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{prepareDeclaredPnpmBuildPolicy}from"./registry-pnpm-build-policy-flow.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.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 itemAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(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&&!e.startsWith(`@`)&&!/^https?:\/\//.test(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);if(l!==void 0){let e=l.items.filter(e=>c.get(searchItemAddress(e))?.hidden!==!0);l.items=e,l.pagination={...l.pagination,total:e.length},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:c}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),l=a.errors??[];if(i.json||o.size>0){let t=a.items.map(e=>({...e,...c.get(searchItemAddress(e))})),r={query:n,sections:searchPresentationSections(s,o,c)};i.json&&(r.json={...a,items:t}),printRegistrySearchResults(e,r)}for(let t of l)e.error(`${t.registry}: ${t.message}`);l.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,t,n,r,i=defaultAddCommandDependencies){return runRegistryAction(e,t,async()=>{let a=itemAddress(n),o=a===itemAddress(`channel/web`)?await prepareWebChatProjectRoot(t):t,s=await readEveRegistryConfig(t);if(r.skipInstall===!0){if(r.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(r.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(a))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let c=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([a],{config:s}))[0],()=>printAddSuggestions(e,t,n));if(!c.found)return;let l=c.item,u=isOfficialItemAddress(a)?eveMetadataFromRegistryItem(l):void 0;if(assertCompatibleEveVersion(u?.requires),r.skipInstall===!0){if(u?.setup===void 0)throw Error(`Registry item "${n}" does not declare a setup flow.`);let a=await runDeclaredSetups({logger:e,appRoot:t,item:n,setups:u.setup,options:r,dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)});return reportRegistryCompletion(e,n,a,r)}if(!await prepareDeclaredPnpmBuildPolicy({logger:e,appRoot:o,item:n,policies:u?.install?.pnpm?.buildScripts,options:r}))return!1;if(a===itemAddress(`channel/web`)&&await(i.prepareWebRegistryProject??prepareWebRegistryProject)(o),await installRegistryItemTransaction({appRoot:o,item:n,registryItem:l,nonInteractive:r.nonInteractive,logger:e,install:async()=>{await addRegistryItems([a],{config:s,cwd:o,overwrite:r.overwrite,silent:r.silent})}}),u?.setup===void 0)return reportRegistryCompletion(e,n,{facts:[]},r);let d=i.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(r.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`progress`,message:r.skipInstall?`Setup ${n}`:`Installed ${n}`})),r.skipSetup===!0){if(r.nonInteractive)return reportRegistryCompletion(e,n,{facts:[]},r);e.log(setupReminder(n,`skipped`));return}if(!r.nonInteractive&&!r.yes&&!d&&r.setupAuthorized!==!0){e.log(setupReminder(n,`skipped`));return}if(!r.nonInteractive&&!r.yes&&r.setupAuthorized!==!0)try{if(await(r.prompter??i.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${n} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(n,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(n,`cancelled`));return}let f=await runDeclaredSetups({logger:e,appRoot:t,item:n,setups:u.setup,options:{...r,force:r.overwrite},dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)});return reportRegistryCompletion(e,n,f,r)})}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{prepareWebChatProjectRoot,prepareWebRegistryProject,readRegistryConfig}from"./registry-project.js";import{errorMessage,reportRegistryCompletion,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand}from"./registry-recovery.js";import{runRegistryAddCommand}from"./registry-add-command.js";import{runDeclaredSetups}from"./registry-declared-setups.js";import{installRegistryItemTransaction}from"./registry-install-transaction.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{prepareDeclaredPnpmBuildPolicy}from"./registry-pnpm-build-policy-flow.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.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 itemAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(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&&!e.startsWith(`@`)&&!/^https?:\/\//.test(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);if(l!==void 0){let e=l.items.filter(e=>c.get(searchItemAddress(e))?.hidden!==!0);l.items=e,l.pagination={...l.pagination,total:e.length},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:c}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),l=a.errors??[];if(i.json||o.size>0){let t=a.items.map(e=>({...e,...c.get(searchItemAddress(e))})),r={query:n,sections:searchPresentationSections(s,o,c)};i.json&&(r.json={...a,items:t}),printRegistrySearchResults(e,r)}for(let t of l)e.error(`${t.registry}: ${t.message}`);l.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;if(c===`setup-incomplete`)return{output:a,setupIncomplete:{resumeCommand:setupResumeCommand(t)}};let l={output:a};return c!==void 0&&(l.setup=c),l}async function runAddCommand(e,t,n,r,i=defaultAddCommandDependencies){let setupIncomplete=t=>(r.silent!==!0&&e.log(setupReminder(n,t)),`setup-incomplete`);return runRegistryAction(e,t,async()=>{let a=itemAddress(n),o=a===itemAddress(`channel/web`)?await prepareWebChatProjectRoot(t):t,s=await readEveRegistryConfig(t);if(r.skipInstall===!0){if(r.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(r.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(a))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let c=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([a],{config:s}))[0],()=>printAddSuggestions(e,t,n));if(!c.found)return;let l=c.item,u=isOfficialItemAddress(a)?eveMetadataFromRegistryItem(l):void 0;if(assertCompatibleEveVersion(u?.requires),r.skipInstall===!0){if(u?.setup===void 0)throw Error(`Registry item "${n}" does not declare a setup flow.`);let a=await runDeclaredSetups({logger:e,appRoot:t,item:n,setups:u.setup,options:r,dependencies:i,resumeCommand:setupResumeCommand(n)});return a===!1&&!r.nonInteractive?setupIncomplete(`cancelled`):reportRegistryCompletion(e,n,a,r)}if(!await prepareDeclaredPnpmBuildPolicy({logger:e,appRoot:o,item:n,policies:u?.install?.pnpm?.buildScripts,options:r}))return!1;if(a===itemAddress(`channel/web`)&&await(i.prepareWebRegistryProject??prepareWebRegistryProject)(o),await installRegistryItemTransaction({appRoot:o,item:n,registryItem:l,nonInteractive:r.nonInteractive,logger:e,install:async()=>{await addRegistryItems([a],{config:s,cwd:o,overwrite:r.overwrite,silent:r.silent})}}),u?.setup===void 0)return reportRegistryCompletion(e,n,{facts:[]},r);let d=i.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(r.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`progress`,message:r.skipInstall?`Setup ${n}`:`Installed ${n}`})),r.skipSetup===!0)return r.nonInteractive?reportRegistryCompletion(e,n,{facts:[]},r):setupIncomplete(`skipped`);if(!r.nonInteractive&&!r.yes&&!d&&r.setupAuthorized!==!0)return setupIncomplete(`skipped`);if(!r.nonInteractive&&!r.yes&&r.setupAuthorized!==!0)try{if(await(r.prompter??i.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${n} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`)return setupIncomplete(`skipped`)}catch(e){if(!(e instanceof WizardCancelledError))throw e;return setupIncomplete(`cancelled`)}let f=await runDeclaredSetups({logger:e,appRoot:t,item:n,setups:u.setup,options:{...r,force:r.overwrite},dependencies:i,resumeCommand:setupResumeCommand(n)});return f===!1&&!r.nonInteractive?setupIncomplete(`cancelled`):reportRegistryCompletion(e,n,f,r)})}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,6 +1,8 @@
|
|
|
1
1
|
import { runVercelEnvPull } from "#setup/run-vercel-link.js";
|
|
2
2
|
import { isEveProject } from "#setup/scaffold/index.js";
|
|
3
3
|
import { runVercel } from "#setup/primitives/index.js";
|
|
4
|
+
import { readProjectLink, type VercelProjectReference } from "#setup/project-resolution.js";
|
|
5
|
+
import { resolveProjectByNameOrId, resolveTeam } from "#setup/vercel-project.js";
|
|
4
6
|
export interface VercelNonInteractiveLogger {
|
|
5
7
|
error(message: string): void;
|
|
6
8
|
log(message: string): void;
|
|
@@ -14,6 +16,9 @@ export interface NonInteractiveLinkDependencies {
|
|
|
14
16
|
isEveProject: typeof isEveProject;
|
|
15
17
|
runVercel: typeof runVercel;
|
|
16
18
|
runVercelEnvPull: typeof runVercelEnvPull;
|
|
19
|
+
readProjectLink: typeof readProjectLink;
|
|
20
|
+
resolveTeam: typeof resolveTeam;
|
|
21
|
+
resolveProjectByNameOrId: typeof resolveProjectByNameOrId;
|
|
17
22
|
}
|
|
18
23
|
export declare function isNonInteractiveProjectCommand(options: VercelProjectCliOptions): boolean;
|
|
19
24
|
/** Links a named Vercel project and refreshes its local environment without a prompt. */
|
|
@@ -22,4 +27,6 @@ export declare function runNonInteractiveLink(input: {
|
|
|
22
27
|
appRoot: string;
|
|
23
28
|
options: VercelProjectCliOptions;
|
|
24
29
|
dependencies?: NonInteractiveLinkDependencies;
|
|
30
|
+
onCreatedProject?: (link: VercelProjectReference) => Promise<void>;
|
|
31
|
+
onProjectCreationUnknown?: () => void;
|
|
25
32
|
}): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{isEveProject}from"#setup/scaffold/index.js";import{runVercelEnvPull}from"#setup/run-vercel-link.js";import{runVercel}from"#setup/primitives/index.js";const defaultDependencies={isEveProject,runVercel,runVercelEnvPull};function isNonInteractiveProjectCommand(e){return e.nonInteractive===!0}async function runNonInteractiveLink(e){let{appRoot:t,logger:n,options:r}=e,i=e.dependencies??defaultDependencies;if(!await i.isEveProject(t))return n.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1,!1;if(r.project===void 0)return n.error("`eve link --non-interactive` requires `--project <name-or-id>`."),process.exitCode=1,!1;let a=[`link`,`--project`,r.project,...r.team===void 0?[]:[`--team`,r.team],`--yes`];
|
|
1
|
+
import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{isEveProject}from"#setup/scaffold/index.js";import{runVercelEnvPull}from"#setup/run-vercel-link.js";import{runVercel}from"#setup/primitives/index.js";import{readProjectLink}from"#setup/project-resolution.js";import{resolveProjectByNameOrId,resolveTeam}from"#setup/vercel-project.js";const defaultDependencies={isEveProject,runVercel,runVercelEnvPull,readProjectLink,resolveTeam,resolveProjectByNameOrId};function isNonInteractiveProjectCommand(e){return e.nonInteractive===!0}async function runNonInteractiveLink(e){let{appRoot:t,logger:n,options:r}=e,i=e.dependencies??defaultDependencies;if(!await i.isEveProject(t))return n.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1,!1;if(r.project===void 0)return n.error("`eve link --non-interactive` requires `--project <name-or-id>`."),process.exitCode=1,!1;let a;if(e.onCreatedProject!==void 0)try{a=await i.resolveProjectByNameOrId(t,await i.resolveTeam(t,r.team),r.project)!==null}catch{}let o=[`link`,`--project`,r.project,...r.team===void 0?[]:[`--team`,r.team],`--yes`];if(!await i.runVercel(o,{cwd:t,nonInteractive:!0}))return process.exitCode=1,!1;if(a===!1&&e.onCreatedProject!==void 0){let n=await i.readProjectLink(t).catch(()=>void 0);n===void 0?e.onProjectCreationUnknown?.():await e.onCreatedProject(n)}return a===void 0&&e.onCreatedProject!==void 0&&e.onProjectCreationUnknown?.(),await i.runVercelEnvPull(t,void 0,void 0,!0)?(n.log(`Project linked.`),!0):(n.error(`Vercel project linked, but pulling environment variables did not complete.`),process.exitCode=1,!1)}export{isNonInteractiveProjectCommand,runNonInteractiveLink};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ArgumentTypeaheadCommand } from "./prompt-commands.js";
|
|
1
2
|
import type { Theme } from "./theme.js";
|
|
2
3
|
export interface PromptArgumentSuggestion {
|
|
3
4
|
readonly value: string;
|
|
@@ -6,7 +7,6 @@ export interface PromptArgumentSuggestion {
|
|
|
6
7
|
/** Follow-up values available after selecting this exact value. */
|
|
7
8
|
readonly next?: readonly PromptArgumentSuggestion[];
|
|
8
9
|
}
|
|
9
|
-
export type ArgumentTypeaheadCommand = "model" | "add" | "login";
|
|
10
10
|
export interface ArgumentTypeaheadQuery {
|
|
11
11
|
readonly command: ArgumentTypeaheadCommand;
|
|
12
12
|
readonly argument: string;
|
|
@@ -19,7 +19,6 @@ export interface ArgumentTypeaheadState extends ArgumentTypeaheadQuery {
|
|
|
19
19
|
readonly suggestions: readonly PromptArgumentSuggestion[];
|
|
20
20
|
readonly selectedIndex: number;
|
|
21
21
|
}
|
|
22
|
-
export declare function isArgumentTypeaheadCommand(command: string): command is ArgumentTypeaheadCommand;
|
|
23
22
|
export declare function argumentTypeaheadLoadingLabel(command: ArgumentTypeaheadCommand): string;
|
|
24
23
|
/**
|
|
25
24
|
* Parses the active token in an inline command drawer. The command grammar
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{sanitizeForTerminal}from"#cli/ui/output.js";import{sliceVisible,visibleLength}from"#cli/ui/terminal-text.js";
|
|
2
|
-
`)||a>
|
|
1
|
+
import{PROMPT_COMMANDS}from"./prompt-commands.js";import{sanitizeForTerminal}from"#cli/ui/output.js";import{sliceVisible,visibleLength}from"#cli/ui/terminal-text.js";function typeaheadCommand(e){let t=PROMPT_COMMANDS.find(t=>t.name===e);if(t?.typeahead!==void 0)return{name:t.name,...t.typeahead}}function argumentTypeaheadLoadingLabel(e){return typeaheadCommand(e)?.loadingLabel??`suggestions`}function argumentTypeaheadQuery(e){if(!e.startsWith(`/`))return;let t=e.indexOf(` `);if(t<0)return;let n=typeaheadCommand(e.slice(1,t));if(n===void 0)return;let r=[],i=t;for(;i<e.length;){for(;e[i]===` `;)i+=1;if(i===e.length)break;let t=i;for(;i<e.length&&e[i]!==` `;)i+=1;r.push({value:e.slice(t,i),start:t})}let a=r.length+ +!!e.endsWith(` `);if(e.slice(t).includes(`
|
|
2
|
+
`)||a>n.maxArguments)return;let o=r.at(-1),s=r.map(e=>e.value);return!e.endsWith(` `)&&o!==void 0&&s.pop(),{command:n.name,argument:e.endsWith(` `)?``:o?.value??``,completed:s,argumentStart:e.endsWith(` `)?e.length:o?.start??e.length}}function sanitizeSuggestion(e){let t={value:sanitizeForTerminal(e.value),label:sanitizeForTerminal(e.label)};return e.hint!==void 0&&(t.hint=sanitizeForTerminal(e.hint)),e.next!==void 0&&(t.next=e.next.map(sanitizeSuggestion)),t}function argumentTypeaheadFor(e,t,n){let r=t.map(sanitizeSuggestion),i=e.completed.length===0?r:r.find(t=>t.value===e.completed[0])?.next??[],a=e.argument.toLowerCase(),o=i.filter(e=>e.value.toLowerCase().includes(a)||e.label.toLowerCase().includes(a)||(e.hint?.toLowerCase().includes(a)??!1)),s=n?.suggestions[n.selectedIndex],c=s===void 0?-1:o.findIndex(e=>e.value===s.value);return{...e,suggestions:o,selectedIndex:c>=0?c:0}}function moveArgumentTypeaheadSelection(e,t){return e.suggestions.length===0?e:{...e,selectedIndex:(e.selectedIndex+t+e.suggestions.length)%e.suggestions.length}}function selectedArgumentSuggestion(e){return e.suggestions[e.selectedIndex]}function argumentTypeaheadCompletion(e,t){return`/${e.command} ${[...e.completed,t.value].join(` `)}`}function renderArgumentSuggestions(e,t,n){let r=t.colors,i=Math.min(8,e.suggestions.length),a=Math.max(0,Math.min(e.selectedIndex-Math.floor(i/2),e.suggestions.length-i));return e.suggestions.slice(a,a+i).map((t,i)=>{let o=a+i===e.selectedIndex?r.bold(t.value):r.dim(t.value),s=`${` `.repeat(e.argumentStart+2)}${o}`;return visibleLength(s)>n?sliceVisible(s,n):s})}export{argumentTypeaheadCompletion,argumentTypeaheadFor,argumentTypeaheadLoadingLabel,argumentTypeaheadQuery,moveArgumentTypeaheadSelection,renderArgumentSuggestions,selectedArgumentSuggestion};
|
|
@@ -47,7 +47,7 @@ export interface Block {
|
|
|
47
47
|
detail?: string;
|
|
48
48
|
/** Structured remediation shown between an error's body and its detail. */
|
|
49
49
|
hint?: string;
|
|
50
|
-
/** Tool, connection, or
|
|
50
|
+
/** Tool, connection, or completed command lifecycle status. */
|
|
51
51
|
status?: ToolStatus;
|
|
52
52
|
/** When true, treat `body` as pre-styled and only wrap + indent it. */
|
|
53
53
|
preformatted?: boolean;
|
|
@@ -108,6 +108,10 @@ export interface ToolGroupItem {
|
|
|
108
108
|
export interface RenderBlockContext {
|
|
109
109
|
/** Current shared square-pulse frame for live activity blocks. */
|
|
110
110
|
activityPulse: string;
|
|
111
|
+
/** An open setup panel owns the pulse, so a running command's gutter holds still. */
|
|
112
|
+
setupFlowOpen?: boolean;
|
|
113
|
+
/** A transient panel keeps its command echo live without a progress glyph. */
|
|
114
|
+
transientPanelOpen?: boolean;
|
|
111
115
|
/** Whether prose responses are parsed and styled as Markdown. */
|
|
112
116
|
renderMarkdown?: boolean;
|
|
113
117
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`)}}function renderUser(e,t,n){let r=e.promptOrigin===`steer`?n.colors.yellow(n.glyph.user):n.
|
|
1
|
+
import{isPromptControlCommand}from"./prompt-commands.js";import{renderMarkdown}from"./markdown.js";import{elisionText}from"./rail.js";import{renderTool}from"./tool-rows.js";import{clipVisible,sliceVisible,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";function renderBlockLines(e,t,n,r){let i=e.depth??0,a=nestingPrefix(i,n),o=renderBody(e,Math.max(8,t-visibleLength(a)),n,r);if(e.closesRail===!0&&i>0){let e=closingPrefix(i,n);return o.map((t,n)=>`${n===o.length-1?e:a}${t}`)}return o.map(e=>`${a}${e}`)}function nestingPrefix(e,t){return e<=0?``:` ${`${t.colors.dim(t.glyph.rule)} `.repeat(e)}`}function closingPrefix(e,t){return` ${`${t.colors.dim(t.glyph.rule)} `.repeat(e-1)}${t.colors.dim(t.glyph.corner)} `}function renderBody(e,t,n,r){if(e.elided!==void 0&&e.kind===`subagent-step`)return[` ${elisionText(e.elided,n)}`];switch(e.kind){case`user`:return renderUser(e,t,n);case`assistant`:case`subagent-step`:return renderProse(e,t,n,r);case`reasoning`:return renderReasoning(e,t,n);case`tool`:case`subagent-tool`:return renderTool(e,t,n,r);case`error`:return renderError(e,t,n);case`notice`:return renderNotice(e,t,n);case`warning`:return renderWarning(e,t,n);case`result`:return renderResult(e,t,n);case`flow`:return renderFlow(e,t,n);case`command`:return renderCommand(e,n,r);case`question`:case`connection-auth`:return renderPreformatted(e,t,n);case`sandbox`:return renderSandbox(e,t,n,r);case`log`:return renderLog(e,t,n);case`subagent`:return renderSubagentHeader(e,t,n,r);case`subagent-close`:{let r=` ${n.colors.dim(n.glyph.corner)}`;return e.body!==void 0&&e.body.length>0?[clipVisible(`${r} ${n.colors.dim(e.body)}`,Math.max(1,t))]:[r]}case`turn-stats`:return renderTurnStats(e,t,n);case`session-boundary`:case`agent-header`:return(e.body??``).split(`
|
|
2
|
+
`)}}function renderUser(e,t,n){let r=e.promptOrigin===`steer`?n.colors.yellow(n.glyph.user):n.glyph.user;return wrap(e.body??``,t-2).map(e=>`${r} ${n.colors.bold(e)}`)}function renderProse(e,t,n,r){let i=[],a=e.kind===`subagent-step`;if(a&&e.collapsed===!0){let r=firstNonEmptyLine(e.body)??(e.reasoning===void 0?void 0:firstNonEmptyLine(e.reasoning));return r===void 0?[]:[n.colors.dim(sliceVisible(r,Math.max(1,t)))]}let o=r.renderMarkdown??!0,s=a?``:`${n.colors.bold(n.glyph.brand)} `,c=a?``:` `;e.reasoning&&e.reasoning.trim().length>0&&i.push(...renderReasoningLines(e.reasoning,t,n));let l=(e.body??``).trim();return l.length===0&&i.length===0?[`${s}${n.colors.dim(`thinking${n.glyph.ellipsis}`)}`]:(l.length>0&&(o?renderMarkdown(l,t-c.length):l).split(`
|
|
3
3
|
`).flatMap(e=>wrapVisibleLine(e,t-c.length)).forEach((e,t)=>{t===0&&!a&&i.length===0?i.push(`${s}${e}`):i.push(`${c}${e}`)}),i.length>0?i:[`${s}`])}function renderReasoning(e,t,n){return e.collapsed?[`${n.colors.gray(n.glyph.reasoning)} ${n.colors.dim(e.title??`thinking`)}`]:renderReasoningLines(e.body??``,t,n,n.glyph.reasoning)}function renderReasoningLines(e,t,n,r){let i=r?2:0,a=wrap(e.trim(),t-i);return a.length===0?[]:a.map((e,t)=>`${r?t===0?`${n.colors.gray(r)} `:` `:``}${n.colors.dim(n.colors.italic(e))}`)}function renderError(e,t,n){let r=n.colors.red(n.colors.bold(n.glyph.error)),i=e.title??`Error`,a=[`${r} ${n.colors.red(n.colors.bold(i))}`];for(let r of wrap(e.body??``,t-2))a.push(` ${colorizeError(r,n)}`);if(e.hint!==void 0&&e.hint.trim().length>0)for(let[r,i]of wrap(e.hint,t-4).entries()){let e=r===0?`${n.glyph.arrow} `:` `;a.push(` ${n.colors.cyan(`${e}${i}`)}`)}return a.push(...renderErrorDetail(e.detail,t,n)),a}function renderErrorDetail(e,t,n){if(e===void 0||e.trim().length===0)return[];let r=e.split(`
|
|
4
|
-
`),i=r.slice(0,12),a=i.map(e=>` ${n.colors.dim(truncatePlain(e,Math.max(1,t-2)))}`),o=r.length-i.length;return o>0&&a.push(` ${n.colors.dim(`${n.glyph.ellipsis} +${o} more line${o===1?``:`s`}`)}`),a}const URL_PATTERN=/(https?:\/\/\S+)/u;function colorizeError(e,t){return URL_PATTERN.test(e)?e.split(URL_PATTERN).map((e,n)=>n%2==1?t.colors.cyan(e):t.colors.red(e)).join(``):t.colors.red(e)}function renderNotice(e,t,n){let r=n.colors.dim(n.glyph.dot),i=wrap(e.body??``,t-2);return i.length===0?[r]:i.map(e=>`${r} ${n.colors.dim(e)}`)}function renderAttentionRows(e,t,n){let r=n.colors.yellow(n.glyph.warning);return wrap(e,t-2).map((e,t)=>`${t===0?r:` `} ${paintCommands(e,n)}`)}function renderWarning(e,t,n){return renderAttentionRows(e.body??``,t,n)}function paintCommands(e,t){return e.replace(/\/[a-z:-]+/g,e=>isPromptControlCommand(e)?t.colors.blue(e):e)}function renderCommand(e,t){let
|
|
4
|
+
`),i=r.slice(0,12),a=i.map(e=>` ${n.colors.dim(truncatePlain(e,Math.max(1,t-2)))}`),o=r.length-i.length;return o>0&&a.push(` ${n.colors.dim(`${n.glyph.ellipsis} +${o} more line${o===1?``:`s`}`)}`),a}const URL_PATTERN=/(https?:\/\/\S+)/u;function colorizeError(e,t){return URL_PATTERN.test(e)?e.split(URL_PATTERN).map((e,n)=>n%2==1?t.colors.cyan(e):t.colors.red(e)).join(``):t.colors.red(e)}function renderNotice(e,t,n){let r=n.colors.dim(n.glyph.dot),i=wrap(e.body??``,t-2);return i.length===0?[r]:i.map(e=>`${r} ${n.colors.dim(e)}`)}function renderAttentionRows(e,t,n){let r=n.colors.yellow(n.glyph.warning);return wrap(e,t-2).map((e,t)=>`${t===0?r:` `} ${paintCommands(e,n)}`)}function renderWarning(e,t,n){return renderAttentionRows(e.body??``,t,n)}function paintCommands(e,t){return e.replace(/\/[a-z:-]+/g,e=>isPromptControlCommand(e)?t.colors.blue(e):e)}function renderCommand(e,t,n){let r=t.colors;return[`${e.live===!0?n.transientPanelOpen===!0?t.glyph.user:n.setupFlowOpen===!0?r.gray(t.glyph.square):r.gray(n.activityPulse):e.status===`done`?r.gray(`*`):t.glyph.user} ${e.result===void 0?e.body??``:r.dim(e.result)}`]}function renderFlow(e,t,n){let r=wrap(e.body??``,t-2),i=n.colors.dim(`*`);return r.map((e,t)=>`${t===0?i:` `} ${e}`)}function renderResult(e,t,n){let r=wrap(e.body??``,t-7),i=n.colors.dim(n.glyph.elbow);if(r.length===0)return[` ${i}`];let dim=e=>n.colors.dim(e.replaceAll(`\x1B[22m`,`\x1B[22m\x1B[2m`));return r.map((e,t)=>t===0?` ${i} ${dim(e)}`:` ${dim(e)}`)}function renderPreformatted(e,t,n){let r=e.kind===`connection-auth`?n.colors.yellow(n.glyph.connection):n.colors.yellow(n.colors.bold(n.glyph.question)),i=e.kind===`question`?` `:` `,a=wrap(e.title??``,t-2),o=a.length===0?[`${r} `]:a.map((e,t)=>t===0?`${r} ${n.colors.bold(e)}`:` ${n.colors.bold(e)}`);for(let n of(e.body??``).split(`
|
|
5
5
|
`))for(let e of wrapVisibleLine(n,Math.max(1,t-i.length)))o.push(`${i}${e}`);return o}function renderSandbox(e,t,n,r){let i=n.colors.cyan(n.glyph.rule),a=n.colors.dim(`sandbox ${n.glyph.dot} `),o=visibleLength(a),s=` `.repeat(o),c=r.previous?.kind===`sandbox`,l=(e.body??``).split(`
|
|
6
6
|
`),u=[];for(let e of l){let r=wrapVisibleLine(e,Math.max(1,t-2-o));for(let e of r){let t=u.length===0&&!c?a:s;u.push(`${i} ${t}${n.colors.gray(e)}`)}}return u.length>0?u:[`${i}`]}function renderLog(e,t,n){let r=e.title===`stderr`,i=r?n.colors.red:n.colors.gray,a=n.colors.dim(n.glyph.rule),o=r?`stderr`:`stdout`,s=[`${n.colors.dim(n.glyph.reasoning)} ${n.colors.dim(o)}`];e.elided!==void 0&&e.elided>0&&s.push(`${a} ${elisionText(e.elided,n)}`);for(let r of(e.body??``).split(`
|
|
7
7
|
`))for(let e of wrapVisibleLine(r,Math.max(1,t-2)))s.push(`${a} ${n.colors.dim(i(e))}`);return s}function renderTurnStats(e,t,n){let r=`${n.glyph.corner} ${e.body??``}`;return[n.colors.dim(truncatePlain(r,Math.max(1,t)))]}function renderSubagentHeader(e,t,n,r){let i=truncatePlain(e.title===void 0||e.title===`agent`?`self`:e.title,Math.max(8,t-16)),a=e.subtitle!==void 0&&e.subtitle.startsWith(`#`),o=a?`:${e.subtitle.slice(1)}`:``,s=` ${e.status===`done`?n.colors.green(n.glyph.subagent):r.activityPulse.trim().length>0?n.colors.orange(n.glyph.subagent):n.colors.dim(n.glyph.subagent)} subagent(${i}${o})`;return!a&&e.subtitle!==void 0&&e.subtitle.length>0&&(s+=` ${n.colors.dim(e.subtitle)}`),[s]}function firstNonEmptyLine(e){return e===void 0?void 0:e.split(/\r?\n/u).find(e=>e.trim().length>0)?.trim()}function wrap(e,t){return e.trim().length===0?[]:e.split(`
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Theme } from "./theme.js";
|
|
2
|
+
import { type FlowPanelState } from "./setup-panel.js";
|
|
3
|
+
/** Temporary setup content enclosed by a drawer and its navigation controls. */
|
|
4
|
+
export interface FlowDrawer {
|
|
5
|
+
readonly rows: string[];
|
|
6
|
+
readonly controls: string[];
|
|
7
|
+
}
|
|
8
|
+
/** Frames an active setup flow above the terminal footer. */
|
|
9
|
+
export declare function renderFlowDrawer(state: FlowPanelState, theme: Theme, width: number): FlowDrawer;
|
|
10
|
+
/** Frames a transient command panel with the same rules as a setup flow. */
|
|
11
|
+
export declare function renderTransientDrawer(body: readonly string[], controls: readonly string[], theme: Theme, width: number): FlowDrawer;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{renderFlowPanel}from"./setup-panel.js";function renderFlowDrawer(e,t,n){let r=renderFlowPanel({...e,title:``},t,n),i=e.content.kind===`question`?r.lastIndexOf(``):-1,a=i===-1?[]:r.slice(i+1).map(e=>e.trimStart());return{rows:frameDrawer(i===-1?r:r.slice(0,i),t,n),controls:a}}function renderTransientDrawer(e,t,n,r){return{rows:frameDrawer(e,n,r),controls:t.map(e=>` ${n.colors.dim(e)}`)}}function frameDrawer(e,t,n){let r=t.colors.dim(t.glyph.dash.repeat(Math.max(1,n)));return[r,``,...e,``,r]}export{renderFlowDrawer,renderTransientDrawer};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isPromptCommandAvailableFor}from"./prompt-commands.js";import{
|
|
1
|
+
import{isPromptCommandAvailableFor}from"./prompt-commands.js";import{LOGIN_CONNECTION_COMMAND_HINT,loginConnectionForCommand}from"#setup/flows/model-login-options.js";import{toErrorMessage}from"#shared/errors.js";function createPromptCommandHandler(e){return{async handle(t,n){let{target:r}=e;if(r.kind===`remote`&&!isPromptCommandAvailableFor(t.name,`remote`))return{message:`/${t.name} needs eve dev running the local server (it is not available with --url).`};if(t.name===`model`){if(t.argument.length===0)return{message:`Choose a model from the inline /model suggestions.`};if(r.kind!==`local`)return{message:`/model needs eve dev running the local server (it is not available with --url).`};let n=r.agentRoot??r.workspaceRoot,i=modelFailure("Use `/model provider/model [default|none|minimal|low|medium|high|xhigh]`.");try{let{modelChangeRefusalForUneditableModel:r}=await import(`#setup/flows/model.js`),{changeAgentModel:a,changeAgentModelSettings:o}=await import(`#setup/flows/model-source-change.js`),[s,c,...l]=t.argument.split(/\s+/u);if(s===void 0||l.length>0||c!==void 0&&![`default`,`none`,`minimal`,`low`,`medium`,`high`,`xhigh`].includes(c))return i;let u=await(e.modelChangeRefusal??r)(n);if(u!==null)return modelFailure(u);let d=c===void 0?s:`${s} ${c}`;if(c!==void 0){let e=await o({appRoot:n,patch:{model:{kind:`set`,value:s},reasoning:c==="default"?{kind:`remove`}:{kind:`set`,value:c},gatewayServiceTier:{kind:`keep`}}});return e.kind===`rejected`?modelFailure(e.message):e.kind===`unchanged`?{message:``,summary:`Model already set to ${d}`}:{message:``,summary:`Model set to ${d}`}}let f=await(e.applyModel??a)({appRoot:n,slug:s});return f.kind===`rejected`?modelFailure(f.message):f.kind===`unchanged`?{message:``,summary:`Model already set to ${f.model}`}:{message:``,summary:`Model set to ${f.to}`}}catch(e){return modelFailure(toErrorMessage(e))}}if(t.name===`add`&&t.argument.length===0)return{message:`Choose an integration from the inline /add suggestions.`};let i=t.name===`login`&&t.argument.length>0?loginConnectionForCommand(t.argument):void 0;if(t.name===`login`&&t.argument.length>0&&i===void 0)return{message:`Use \`/login ${LOGIN_CONNECTION_COMMAND_HINT}\`.`};let a=n.renderer.setupFlow;if(a===void 0)return{message:`/${t.name} is not supported by this renderer.`};let o;try{o=await import(`./setup-commands.js`)}catch(e){return{message:`/${t.name} failed: ${toErrorMessage(e)}`}}let{runTuiSetupCommand:s}=o;a.begin(``);let c=!0;try{let o={command:t.name,appRoot:r.workspaceRoot,renderer:a,withExclusiveTerminal:n.withExclusiveTerminal,chatGptAccountLabel:n.chatGptAccountLabel};r.agentRoot!==void 0&&(o.agentRoot=r.agentRoot),n.initialModelStep!==void 0&&(o.initialModelStep=n.initialModelStep),n.onOnboardingScreen!==void 0&&(o.onOnboardingScreen=n.onOnboardingScreen),t.name===`add`&&(o.initialRegistryAddress=t.argument),i!==void 0&&(o.initialLoginConnection=i),e.flows!==void 0&&(o.flows=e.flows);let l=await s(o);c=l.preserveFlowDiagnostics;let{preserveFlowDiagnostics:u,partial:d,...f}=l;return n.settleOutcome===void 0?f:await n.settleOutcome(f)}finally{a.end({preserveDiagnostics:c})}}}}function modelFailure(e){return{message:e,summary:`Couldn't change the model`,failed:!0}}export{createPromptCommandHandler};
|
|
@@ -41,9 +41,203 @@ export interface PromptCommandSpec {
|
|
|
41
41
|
readonly argumentHint?: string;
|
|
42
42
|
/** Accepts a trailing argument (enables `/name <arg>` parsing). */
|
|
43
43
|
readonly takesArgument: boolean;
|
|
44
|
+
/** Whether recalling this command would reopen a modal or take over prompt navigation. */
|
|
45
|
+
readonly history: "keep" | "omit";
|
|
46
|
+
/** Inline argument suggestions, when this command has a catalog-backed grammar. */
|
|
47
|
+
readonly typeahead?: {
|
|
48
|
+
readonly maxArguments: number;
|
|
49
|
+
readonly loadingLabel: string;
|
|
50
|
+
};
|
|
44
51
|
/** Maps a recognized invocation to its parsed command. */
|
|
45
52
|
readonly build: (argument: string) => PromptCommand;
|
|
46
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Every slash command the prompt accepts, in typeahead display order. One
|
|
56
|
+
* module owns the command list so the runner's dispatch, the renderer's
|
|
57
|
+
* transcript-echo suppression, and command discovery cannot drift apart.
|
|
58
|
+
*/
|
|
59
|
+
declare const PROMPT_COMMAND_DEFINITIONS: ({
|
|
60
|
+
name: string;
|
|
61
|
+
history: "omit";
|
|
62
|
+
aliases: never[];
|
|
63
|
+
description: string;
|
|
64
|
+
argumentHint: string;
|
|
65
|
+
takesArgument: true;
|
|
66
|
+
typeahead: {
|
|
67
|
+
maxArguments: number;
|
|
68
|
+
loadingLabel: string;
|
|
69
|
+
};
|
|
70
|
+
build: (argument: string) => {
|
|
71
|
+
type: "extension";
|
|
72
|
+
name: "model";
|
|
73
|
+
argument: string;
|
|
74
|
+
};
|
|
75
|
+
targets: "local"[];
|
|
76
|
+
} | {
|
|
77
|
+
name: string;
|
|
78
|
+
history: "keep";
|
|
79
|
+
aliases: never[];
|
|
80
|
+
description: string;
|
|
81
|
+
takesArgument: false;
|
|
82
|
+
build: () => {
|
|
83
|
+
type: "reset";
|
|
84
|
+
};
|
|
85
|
+
targets: ("local" | "remote")[];
|
|
86
|
+
argumentHint?: undefined;
|
|
87
|
+
typeahead?: undefined;
|
|
88
|
+
} | {
|
|
89
|
+
name: string;
|
|
90
|
+
history: "keep";
|
|
91
|
+
aliases: string[];
|
|
92
|
+
description: string;
|
|
93
|
+
takesArgument: false;
|
|
94
|
+
build: () => {
|
|
95
|
+
type: "clear";
|
|
96
|
+
};
|
|
97
|
+
targets: ("local" | "remote")[];
|
|
98
|
+
argumentHint?: undefined;
|
|
99
|
+
typeahead?: undefined;
|
|
100
|
+
} | {
|
|
101
|
+
name: string;
|
|
102
|
+
history: "keep";
|
|
103
|
+
aliases: never[];
|
|
104
|
+
description: string;
|
|
105
|
+
takesArgument: false;
|
|
106
|
+
build: () => {
|
|
107
|
+
type: "compact";
|
|
108
|
+
};
|
|
109
|
+
targets: ("local" | "remote")[];
|
|
110
|
+
argumentHint?: undefined;
|
|
111
|
+
typeahead?: undefined;
|
|
112
|
+
} | {
|
|
113
|
+
name: string;
|
|
114
|
+
history: "keep";
|
|
115
|
+
aliases: never[];
|
|
116
|
+
description: string;
|
|
117
|
+
takesArgument: false;
|
|
118
|
+
build: () => {
|
|
119
|
+
type: "cancel";
|
|
120
|
+
};
|
|
121
|
+
targets: ("local" | "remote")[];
|
|
122
|
+
argumentHint?: undefined;
|
|
123
|
+
typeahead?: undefined;
|
|
124
|
+
} | {
|
|
125
|
+
name: string;
|
|
126
|
+
history: "omit";
|
|
127
|
+
aliases: never[];
|
|
128
|
+
description: string;
|
|
129
|
+
argumentHint: string;
|
|
130
|
+
takesArgument: true;
|
|
131
|
+
typeahead: {
|
|
132
|
+
maxArguments: number;
|
|
133
|
+
loadingLabel: string;
|
|
134
|
+
};
|
|
135
|
+
build: (argument: string) => {
|
|
136
|
+
type: "extension";
|
|
137
|
+
name: "login";
|
|
138
|
+
argument: string;
|
|
139
|
+
};
|
|
140
|
+
targets: "local"[];
|
|
141
|
+
} | {
|
|
142
|
+
name: string;
|
|
143
|
+
history: "omit";
|
|
144
|
+
aliases: never[];
|
|
145
|
+
description: string;
|
|
146
|
+
takesArgument: true;
|
|
147
|
+
typeahead: {
|
|
148
|
+
maxArguments: number;
|
|
149
|
+
loadingLabel: string;
|
|
150
|
+
};
|
|
151
|
+
build: (argument: string) => {
|
|
152
|
+
type: "extension";
|
|
153
|
+
name: "add";
|
|
154
|
+
argument: string;
|
|
155
|
+
};
|
|
156
|
+
targets: "local"[];
|
|
157
|
+
argumentHint?: undefined;
|
|
158
|
+
} | {
|
|
159
|
+
name: string;
|
|
160
|
+
history: "keep";
|
|
161
|
+
aliases: never[];
|
|
162
|
+
description: string;
|
|
163
|
+
takesArgument: false;
|
|
164
|
+
build: () => {
|
|
165
|
+
type: "extension";
|
|
166
|
+
name: "deploy";
|
|
167
|
+
argument: string;
|
|
168
|
+
};
|
|
169
|
+
targets: "local"[];
|
|
170
|
+
argumentHint?: undefined;
|
|
171
|
+
typeahead?: undefined;
|
|
172
|
+
} | {
|
|
173
|
+
name: string;
|
|
174
|
+
history: "omit";
|
|
175
|
+
aliases: never[];
|
|
176
|
+
description: string;
|
|
177
|
+
argumentHint: string;
|
|
178
|
+
takesArgument: true;
|
|
179
|
+
build: (argument: string) => {
|
|
180
|
+
type: "traces";
|
|
181
|
+
argument: string;
|
|
182
|
+
};
|
|
183
|
+
targets: "local"[];
|
|
184
|
+
typeahead?: undefined;
|
|
185
|
+
} | {
|
|
186
|
+
name: string;
|
|
187
|
+
history: "omit";
|
|
188
|
+
aliases: never[];
|
|
189
|
+
description: string;
|
|
190
|
+
argumentHint: string;
|
|
191
|
+
takesArgument: true;
|
|
192
|
+
typeahead: {
|
|
193
|
+
maxArguments: number;
|
|
194
|
+
loadingLabel: string;
|
|
195
|
+
};
|
|
196
|
+
build: (argument: string) => {
|
|
197
|
+
type: "loglevel";
|
|
198
|
+
argument: string;
|
|
199
|
+
};
|
|
200
|
+
targets: ("local" | "remote")[];
|
|
201
|
+
} | {
|
|
202
|
+
argumentHint?: undefined;
|
|
203
|
+
typeahead?: undefined;
|
|
204
|
+
name: string;
|
|
205
|
+
history: "omit";
|
|
206
|
+
aliases: never[];
|
|
207
|
+
description: string;
|
|
208
|
+
takesArgument: false;
|
|
209
|
+
build: () => {
|
|
210
|
+
type: "info";
|
|
211
|
+
};
|
|
212
|
+
targets: "local"[];
|
|
213
|
+
} | {
|
|
214
|
+
argumentHint?: undefined;
|
|
215
|
+
typeahead?: undefined;
|
|
216
|
+
name: string;
|
|
217
|
+
history: "omit";
|
|
218
|
+
aliases: never[];
|
|
219
|
+
description: string;
|
|
220
|
+
takesArgument: false;
|
|
221
|
+
build: () => {
|
|
222
|
+
type: "help";
|
|
223
|
+
};
|
|
224
|
+
targets: ("local" | "remote")[];
|
|
225
|
+
} | {
|
|
226
|
+
argumentHint?: undefined;
|
|
227
|
+
typeahead?: undefined;
|
|
228
|
+
name: string;
|
|
229
|
+
history: "keep";
|
|
230
|
+
aliases: string[];
|
|
231
|
+
description: string;
|
|
232
|
+
takesArgument: false;
|
|
233
|
+
build: () => {
|
|
234
|
+
type: "exit";
|
|
235
|
+
};
|
|
236
|
+
targets: ("local" | "remote")[];
|
|
237
|
+
})[];
|
|
238
|
+
export type ArgumentTypeaheadCommand = Extract<(typeof PROMPT_COMMAND_DEFINITIONS)[number], {
|
|
239
|
+
typeahead: object;
|
|
240
|
+
}>["name"];
|
|
47
241
|
export declare const PROMPT_COMMANDS: readonly PromptCommandSpec[];
|
|
48
242
|
export declare function promptCommandsFor(target: PromptCommandTarget): readonly PromptCommandSpec[];
|
|
49
243
|
/** Whether a command runs against this target — the one authority dispatch shares with discovery. */
|
|
@@ -57,6 +251,11 @@ export declare function isPromptCommandAvailableFor(name: PromptCommandExtension
|
|
|
57
251
|
* message.
|
|
58
252
|
*/
|
|
59
253
|
export declare function parsePromptCommand(prompt: string): PromptCommand | null;
|
|
254
|
+
/** Resolve an invocation and its history policy from the same command definition. */
|
|
255
|
+
export declare function promptCommandSpec(prompt: string): {
|
|
256
|
+
spec: PromptCommandSpec;
|
|
257
|
+
argument: string;
|
|
258
|
+
} | undefined;
|
|
60
259
|
/** True for prompts that are commands, which never echo as user messages. */
|
|
61
260
|
export declare function isPromptControlCommand(prompt: string): boolean;
|
|
62
261
|
/**
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const PROMPT_COMMAND_DEFINITIONS=[{name:`model`,aliases:[],description:`Choose a model, speed, and reasoning`,argumentHint:`[provider/model]`,takesArgument:!0,build:e=>({type:`extension`,name:`model`,argument:e}),targets:[`local`]},{name:`reset`,aliases:[],description:`Start a fresh session`,takesArgument:!1,build:()=>({type:`reset`}),targets:[`local`,`remote`]},{name:`clear`,aliases:[`new`],description:`Clear the current session context`,takesArgument:!1,build:()=>({type:`clear`}),targets:[`local`,`remote`]},{name:`compact`,aliases:[],description:`Compact the current session context`,takesArgument:!1,build:()=>({type:`compact`}),targets:[`local`,`remote`]},{name:`cancel`,aliases:[],description:`Cancel the running turn`,takesArgument:!1,build:()=>({type:`cancel`}),targets:[`local`,`remote`]},{name:`login`,aliases:[],description:`Connect a model provider`,argumentHint:`[connection]`,takesArgument:!0,build:e=>({type:`extension`,name:`login`,argument:e}),targets:[`local`]},{name:`add`,aliases:[],description:`Add an integration from the registry`,takesArgument:!0,build:e=>({type:`extension`,name:`add`,argument:e}),targets:[`local`]},{name:`deploy`,aliases:[],description:`Deploy the agent to Vercel`,takesArgument:!1,build:()=>({type:`extension`,name:`deploy`,argument:``}),targets:[`local`]},{name:`traces`,aliases:[],description:`Open the local trace viewer`,argumentHint:`[trace]`,takesArgument:!0,build:e=>({type:`traces`,argument:e}),targets:[`local`]},{name:`loglevel`,aliases:[],description:`Show or hide captured stdout/stderr/sandbox logs`,argumentHint:`[all|stderr|sandbox|none]`,takesArgument:!0,build:e=>({type:`loglevel`,argument:e}),targets:[`local`,`remote`]},{name:`info`,aliases:[],description:`Show application and messaging information`,takesArgument:!1,build:()=>({type:`info`}),targets:[`local`]},{name:`help`,aliases:[],description:`Show available commands`,takesArgument:!1,build:()=>({type:`help`}),targets:[`local`,`remote`]},{name:`exit`,aliases:[`quit`],description:`Quit the TUI`,takesArgument:!1,build:()=>({type:`exit`}),targets:[`local`,`remote`]}],PROMPT_COMMANDS=PROMPT_COMMAND_DEFINITIONS;function promptCommandsFor(e){let t=PROMPT_COMMAND_DEFINITIONS.filter(t=>t.targets.some(t=>t===e));return e===`remote`?[...t.filter(e=>e.name===`help`),...t.filter(e=>e.name!==`help`)]:t}function isPromptCommandAvailableFor(e,t){return(PROMPT_COMMAND_DEFINITIONS.find(t=>t.name===e)?.targets)?.includes(t)??!1}function parsePromptCommand(e){let t=e.trim();if(
|
|
2
|
-
`)}export{PROMPT_COMMANDS,formatPromptCommandHelp,isPromptCommandAvailableFor,isPromptControlCommand,parsePromptCommand,promptCommandsFor};
|
|
1
|
+
const PROMPT_COMMAND_DEFINITIONS=[{name:`model`,history:`omit`,aliases:[],description:`Choose a model, speed, and reasoning`,argumentHint:`[provider/model]`,takesArgument:!0,typeahead:{maxArguments:2,loadingLabel:`models`},build:e=>({type:`extension`,name:`model`,argument:e}),targets:[`local`]},{name:`reset`,history:`keep`,aliases:[],description:`Start a fresh session`,takesArgument:!1,build:()=>({type:`reset`}),targets:[`local`,`remote`]},{name:`clear`,history:`keep`,aliases:[`new`],description:`Clear the current session context`,takesArgument:!1,build:()=>({type:`clear`}),targets:[`local`,`remote`]},{name:`compact`,history:`keep`,aliases:[],description:`Compact the current session context`,takesArgument:!1,build:()=>({type:`compact`}),targets:[`local`,`remote`]},{name:`cancel`,history:`keep`,aliases:[],description:`Cancel the running turn`,takesArgument:!1,build:()=>({type:`cancel`}),targets:[`local`,`remote`]},{name:`login`,history:`omit`,aliases:[],description:`Connect a model provider`,argumentHint:`[connection]`,takesArgument:!0,typeahead:{maxArguments:1,loadingLabel:`connections`},build:e=>({type:`extension`,name:`login`,argument:e}),targets:[`local`]},{name:`add`,history:`omit`,aliases:[],description:`Add an integration from the registry`,takesArgument:!0,typeahead:{maxArguments:1,loadingLabel:`registry`},build:e=>({type:`extension`,name:`add`,argument:e}),targets:[`local`]},{name:`deploy`,history:`keep`,aliases:[],description:`Deploy the agent to Vercel`,takesArgument:!1,build:()=>({type:`extension`,name:`deploy`,argument:``}),targets:[`local`]},{name:`traces`,history:`omit`,aliases:[],description:`Open the local trace viewer`,argumentHint:`[trace]`,takesArgument:!0,build:e=>({type:`traces`,argument:e}),targets:[`local`]},{name:`loglevel`,history:`omit`,aliases:[],description:`Show or hide captured stdout/stderr/sandbox logs`,argumentHint:`[all|stderr|sandbox|none]`,takesArgument:!0,typeahead:{maxArguments:1,loadingLabel:`log levels`},build:e=>({type:`loglevel`,argument:e}),targets:[`local`,`remote`]},{name:`info`,history:`omit`,aliases:[],description:`Show application and messaging information`,takesArgument:!1,build:()=>({type:`info`}),targets:[`local`]},{name:`help`,history:`omit`,aliases:[],description:`Show available commands`,takesArgument:!1,build:()=>({type:`help`}),targets:[`local`,`remote`]},{name:`exit`,history:`keep`,aliases:[`quit`],description:`Quit the TUI`,takesArgument:!1,build:()=>({type:`exit`}),targets:[`local`,`remote`]}],PROMPT_COMMANDS=PROMPT_COMMAND_DEFINITIONS;function promptCommandsFor(e){let t=PROMPT_COMMAND_DEFINITIONS.filter(t=>t.targets.some(t=>t===e));return e===`remote`?[...t.filter(e=>e.name===`help`),...t.filter(e=>e.name!==`help`)]:t}function isPromptCommandAvailableFor(e,t){return(PROMPT_COMMAND_DEFINITIONS.find(t=>t.name===e)?.targets)?.includes(t)??!1}function parsePromptCommand(e){let t=promptCommandSpec(e);return t===void 0?null:t.spec.build(t.argument)}function promptCommandSpec(e){let t=e.trim();if(t.startsWith(`/`))for(let e of PROMPT_COMMANDS)for(let n of[e.name,...e.aliases]){let r=`/${n}`;if(t===r)return{spec:e,argument:``};if(e.takesArgument&&t.startsWith(`${r} `))return{spec:e,argument:t.slice(r.length).trim()}}}function isPromptControlCommand(e){return parsePromptCommand(e)!==null}function formatPromptCommandHelp(e=PROMPT_COMMANDS){let t=e.map(e=>{let t=e.argumentHint===void 0?``:` ${e.argumentHint}`,n=e.aliases.map(e=>` (/${e})`).join(``);return{invocation:`/${e.name}${t}${n}`,description:e.description}}),n=Math.max(...t.map(e=>e.invocation.length))+2;return t.map(e=>e.invocation.padEnd(n)+e.description).join(`
|
|
2
|
+
`)}export{PROMPT_COMMANDS,formatPromptCommandHelp,isPromptCommandAvailableFor,isPromptControlCommand,parsePromptCommand,promptCommandSpec,promptCommandsFor};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { RegistryCatalogItem } from "#cli/commands/registry.js";
|
|
2
|
-
import type { RegistrySessionResult } from "#setup/flows/registry-session.js";
|
|
2
|
+
import type { RegistrySessionOutcome, RegistrySessionResult } from "#setup/flows/registry-session.js";
|
|
3
3
|
/** Builds the shared transient progress update for `/add` and initial onboarding. */
|
|
4
4
|
export declare function registryItemProgress(renderer: {
|
|
5
5
|
replaceContent?(content?: {
|
|
@@ -12,6 +12,17 @@ export declare function registryItemProgress(renderer: {
|
|
|
12
12
|
setNavigation?(navigation: undefined): void;
|
|
13
13
|
setStatus(status: string | undefined): void;
|
|
14
14
|
}): (item: RegistryCatalogItem, index: number, total: number) => void;
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
export interface RegistryCommandOutcome {
|
|
16
|
+
failed: boolean;
|
|
17
|
+
/** Replaces the echoed `/add` once it settles. */
|
|
18
|
+
summary: string;
|
|
19
|
+
/** Detail hung under the summary; empty when the summary says it all. */
|
|
20
|
+
message: string;
|
|
21
|
+
}
|
|
22
|
+
/** The one-line record of an `/add` item left in place of its invocation. */
|
|
23
|
+
export declare function registryOutcomeSummary(outcome: RegistrySessionOutcome): string;
|
|
24
|
+
/**
|
|
25
|
+
* Summarizes an `/add` session in place of its echoed command. One item folds
|
|
26
|
+
* into the summary itself; several items list one marked row each.
|
|
27
|
+
*/
|
|
28
|
+
export declare function registryCommandOutcome(result: RegistrySessionResult, notes?: readonly string[]): RegistryCommandOutcome;
|