eve 0.25.3 → 0.26.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 +29 -0
- package/dist/src/chunks/{use-eve-agent-Cy73lgA6.js → use-eve-agent-BkztZA0v.js} +76 -55
- package/dist/src/chunks/{use-eve-agent-CQIeqmKc.js → use-eve-agent-CruinZmd.js} +76 -55
- package/dist/src/cli/banner.d.ts +5 -0
- package/dist/src/cli/banner.js +1 -1
- package/dist/src/cli/commands/logs-events.d.ts +36 -0
- package/dist/src/cli/commands/logs-events.js +2 -0
- package/dist/src/cli/commands/logs.d.ts +64 -0
- package/dist/src/cli/commands/logs.js +4 -0
- package/dist/src/cli/dev/diagnostic-dump.d.ts +60 -0
- package/dist/src/cli/dev/diagnostic-dump.js +1 -0
- package/dist/src/cli/dev/diagnostic-sink.d.ts +37 -0
- package/dist/src/cli/dev/diagnostic-sink.js +1 -0
- package/dist/src/cli/dev/diagnostics.d.ts +42 -0
- package/dist/src/cli/dev/diagnostics.js +1 -0
- package/dist/src/cli/dev/tui/blocks.d.ts +60 -8
- package/dist/src/cli/dev/tui/blocks.js +8 -8
- package/dist/src/cli/dev/tui/command-typeahead.js +1 -1
- package/dist/src/cli/dev/tui/diagnostic-presentation.d.ts +16 -0
- package/dist/src/cli/dev/tui/diagnostic-presentation.js +3 -0
- package/dist/src/cli/dev/tui/errors.d.ts +21 -16
- package/dist/src/cli/dev/tui/errors.js +1 -1
- package/dist/src/cli/dev/tui/file-content-cache.d.ts +35 -0
- package/dist/src/cli/dev/tui/file-content-cache.js +3 -0
- package/dist/src/cli/dev/tui/line-diff.d.ts +24 -0
- package/dist/src/cli/dev/tui/line-diff.js +1 -0
- package/dist/src/cli/dev/tui/line-editor.js +1 -1
- package/dist/src/cli/dev/tui/markdown.d.ts +2 -1
- package/dist/src/cli/dev/tui/markdown.js +7 -3
- package/dist/src/cli/dev/tui/model-editor.d.ts +103 -0
- package/dist/src/cli/dev/tui/model-editor.js +1 -0
- package/dist/src/cli/dev/tui/prompt-command-handler.d.ts +1 -1
- package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
- package/dist/src/cli/dev/tui/prompt-placeholder.d.ts +12 -0
- package/dist/src/cli/dev/tui/prompt-placeholder.js +1 -0
- package/dist/src/cli/dev/tui/question-panel.d.ts +24 -0
- package/dist/src/cli/dev/tui/question-panel.js +1 -0
- package/dist/src/cli/dev/tui/rail.d.ts +15 -0
- package/dist/src/cli/dev/tui/rail.js +1 -0
- package/dist/src/cli/dev/tui/remote-auth-command.js +1 -1
- package/dist/src/cli/dev/tui/runner.d.ts +27 -65
- package/dist/src/cli/dev/tui/runner.js +1 -1
- package/dist/src/cli/dev/tui/setup-commands.d.ts +1 -1
- package/dist/src/cli/dev/tui/setup-commands.js +2 -2
- package/dist/src/cli/dev/tui/setup-flow.d.ts +3 -0
- package/dist/src/cli/dev/tui/setup-issues.js +1 -1
- package/dist/src/cli/dev/tui/setup-panel.d.ts +33 -0
- package/dist/src/cli/dev/tui/setup-panel.js +4 -4
- package/dist/src/cli/dev/tui/status-line.d.ts +8 -6
- package/dist/src/cli/dev/tui/status-line.js +1 -1
- package/dist/src/cli/dev/tui/stream-format.d.ts +16 -3
- package/dist/src/cli/dev/tui/stream-format.js +1 -1
- package/dist/src/cli/dev/tui/subagent-pump.d.ts +127 -0
- package/dist/src/cli/dev/tui/subagent-pump.js +1 -0
- package/dist/src/cli/dev/tui/terminal-renderer.d.ts +37 -1
- package/dist/src/cli/dev/tui/terminal-renderer.js +12 -10
- package/dist/src/cli/dev/tui/test/fake-setup-flow-renderer.js +1 -1
- package/dist/src/cli/dev/tui/test/mock-terminal.d.ts +7 -0
- package/dist/src/cli/dev/tui/test/mock-terminal.js +1 -1
- package/dist/src/cli/dev/tui/theme.d.ts +30 -2
- package/dist/src/cli/dev/tui/theme.js +1 -1
- package/dist/src/cli/dev/tui/todo-panel.d.ts +44 -0
- package/dist/src/cli/dev/tui/todo-panel.js +1 -0
- package/dist/src/cli/dev/tui/tool-block-groups.d.ts +40 -0
- package/dist/src/cli/dev/tui/tool-block-groups.js +1 -0
- package/dist/src/cli/dev/tui/tool-format.js +1 -1
- package/dist/src/cli/dev/tui/tool-presentation.d.ts +67 -0
- package/dist/src/cli/dev/tui/tool-presentation.js +1 -0
- package/dist/src/cli/dev/tui/tool-rows.d.ts +15 -0
- package/dist/src/cli/dev/tui/tool-rows.js +2 -0
- package/dist/src/cli/dev/tui/tui.js +1 -1
- package/dist/src/cli/dev/tui/turn-clock.d.ts +36 -0
- package/dist/src/cli/dev/tui/turn-clock.js +1 -0
- package/dist/src/cli/dev/tui/types.d.ts +2 -2
- package/dist/src/cli/dev/ui-options.js +1 -1
- package/dist/src/cli/run.js +2 -2
- package/dist/src/cli/ui/live-row.js +1 -1
- package/dist/src/client/agent-info-schema.d.ts +9 -0
- package/dist/src/client/agent-info-schema.js +1 -1
- package/dist/src/client/client.js +1 -1
- package/dist/src/client/eve-agent-store.d.ts +1 -2
- package/dist/src/client/eve-agent-store.js +1 -1
- package/dist/src/client/index.js +1 -1
- package/dist/src/client/open-stream.d.ts +14 -10
- package/dist/src/client/open-stream.js +1 -1
- package/dist/src/client/session-utils.d.ts +2 -1
- package/dist/src/client/session-utils.js +1 -1
- package/dist/src/client/session.d.ts +3 -5
- package/dist/src/client/session.js +1 -1
- package/dist/src/client/types.d.ts +0 -6
- package/dist/src/compiled/.vendor-stamp.json +2 -1
- package/dist/src/compiled/marked/LICENSE.md +44 -0
- package/dist/src/compiled/marked/index.d.ts +24 -0
- package/dist/src/compiled/marked/index.js +59 -0
- package/dist/src/compiler/extension-compatibility.d.ts +2 -2
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/context/build-dynamic-tools.js +1 -1
- package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
- package/dist/src/evals/session.js +1 -1
- package/dist/src/execution/node-step.js +1 -1
- package/dist/src/execution/sandbox/bindings/docker-cli.d.ts +4 -0
- package/dist/src/execution/sandbox/bindings/docker-cli.js +1 -1
- package/dist/src/execution/sandbox/bindings/microsandbox-create.js +1 -1
- package/dist/src/execution/terminal-session-failure-step.js +1 -1
- package/dist/src/harness/emission.js +1 -1
- package/dist/src/harness/model-call-error.d.ts +11 -30
- package/dist/src/harness/model-call-error.js +1 -1
- package/dist/src/harness/semantic-errors/index.d.ts +9 -0
- package/dist/src/harness/semantic-errors/index.js +1 -0
- package/dist/src/harness/semantic-errors/rule.d.ts +76 -0
- package/dist/src/harness/semantic-errors/rule.js +1 -0
- package/dist/src/harness/semantic-errors/rules/gateway.d.ts +11 -0
- package/dist/src/harness/semantic-errors/rules/gateway.js +1 -0
- package/dist/src/harness/semantic-errors/rules/model-provider.d.ts +11 -0
- package/dist/src/harness/semantic-errors/rules/model-provider.js +1 -0
- package/dist/src/harness/semantic-errors/rules/sandbox.d.ts +16 -0
- package/dist/src/harness/semantic-errors/rules/sandbox.js +1 -0
- package/dist/src/harness/semantic-errors/rules/system.d.ts +2 -0
- package/dist/src/harness/semantic-errors/rules/system.js +1 -0
- package/dist/src/harness/semantic-errors/rules/workflow.d.ts +9 -0
- package/dist/src/harness/semantic-errors/rules/workflow.js +1 -0
- package/dist/src/harness/semantic-errors/signals.d.ts +28 -0
- package/dist/src/harness/semantic-errors/signals.js +1 -0
- package/dist/src/harness/tool-loop.js +2 -2
- package/dist/src/harness/workflow-sandbox.d.ts +6 -0
- package/dist/src/harness/workflow-sandbox.js +2 -2
- package/dist/src/internal/application/output-publication-lock.js +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/logging.d.ts +33 -1
- package/dist/src/internal/logging.js +1 -1
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -1
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.d.ts +3 -1
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
- package/dist/src/internal/nitro/routes/info.js +1 -1
- package/dist/src/internal/resolve-model-endpoint-status.d.ts +46 -3
- package/dist/src/internal/resolve-model-endpoint-status.js +1 -1
- package/dist/src/internal/workflow/development-world-client.js +1 -1
- package/dist/src/internal/workflow/development-world-server.js +1 -1
- package/dist/src/packages/eve-catalog/src/index.js +1 -1
- package/dist/src/public/models/openai/chatgpt/model.js +3 -1
- package/dist/src/react/use-eve-agent.d.ts +0 -1
- package/dist/src/react/use-eve-agent.js +1 -1
- package/dist/src/setup/boxes/add-channels.js +1 -1
- package/dist/src/setup/boxes/deploy-project.js +1 -1
- package/dist/src/setup/boxes/model-capabilities.d.ts +24 -0
- package/dist/src/setup/boxes/model-capabilities.js +1 -0
- package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
- package/dist/src/setup/boxes/select-model.d.ts +30 -8
- package/dist/src/setup/boxes/select-model.js +1 -1
- package/dist/src/setup/cli/option-row.js +1 -1
- package/dist/src/setup/cli/prompt-ui.d.ts +2 -0
- package/dist/src/setup/cli/prompt-ui.js +2 -2
- package/dist/src/setup/cli/rail-log.d.ts +4 -6
- package/dist/src/setup/cli/rail-log.js +3 -2
- package/dist/src/setup/connection-connector.js +2 -2
- package/dist/src/setup/flows/link.d.ts +13 -3
- package/dist/src/setup/flows/link.js +1 -1
- package/dist/src/setup/flows/login.js +1 -1
- package/dist/src/setup/flows/model-source-change.d.ts +38 -0
- package/dist/src/setup/flows/model-source-change.js +1 -0
- package/dist/src/setup/flows/model.d.ts +69 -65
- package/dist/src/setup/flows/model.js +1 -1
- package/dist/src/setup/flows/provider.d.ts +22 -0
- package/dist/src/setup/flows/provider.js +3 -3
- package/dist/src/setup/prompter.d.ts +2 -0
- 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 +6 -0
- package/dist/src/setup/vercel-project.js +0 -0
- package/dist/src/shared/dynamic-tool-definition.d.ts +1 -8
- package/dist/src/shared/errors.d.ts +5 -0
- package/dist/src/shared/errors.js +1 -1
- package/dist/src/shared/gateway-service-tier.d.ts +19 -0
- package/dist/src/shared/gateway-service-tier.js +1 -0
- package/dist/src/shared/model-summary.d.ts +12 -0
- package/dist/src/shared/model-summary.js +1 -0
- package/dist/src/shared/workflow-sandbox.d.ts +2 -0
- package/dist/src/shared/workflow-sandbox.js +1 -1
- package/dist/src/source-change/agent-config-ast.d.ts +54 -0
- package/dist/src/source-change/agent-config-ast.js +2 -0
- package/dist/src/source-change/agent-config-string-path.d.ts +18 -0
- package/dist/src/source-change/agent-config-string-path.js +2 -0
- package/dist/src/source-change/apply-agent-model-settings.d.ts +26 -0
- package/dist/src/source-change/apply-agent-model-settings.js +1 -0
- package/dist/src/source-change/apply-model-name.js +1 -2
- package/dist/src/source-change/static-source-change.d.ts +14 -0
- package/dist/src/source-change/static-source-change.js +1 -1
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.d.ts +0 -6
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.d.ts +0 -2
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/docs/concepts/execution-model-and-durability.md +1 -1
- package/docs/concepts/sessions-runs-and-streaming.md +1 -1
- package/docs/getting-started.mdx +1 -1
- package/docs/guides/auth-and-route-protection.md +1 -1
- package/docs/guides/client/overview.mdx +1 -1
- package/docs/guides/client/streaming.mdx +1 -10
- package/docs/guides/deployment/meta.json +4 -0
- package/docs/guides/deployment/overview.md +61 -0
- package/docs/guides/deployment/self-hosting.md +88 -0
- package/docs/guides/deployment/vercel.mdx +90 -0
- package/docs/guides/dev-tui.md +8 -4
- package/docs/guides/dynamic-capabilities.md +2 -0
- package/docs/guides/frontend/nextjs.mdx +1 -1
- package/docs/guides/frontend/nuxt.mdx +1 -1
- package/docs/guides/frontend/overview.mdx +2 -5
- package/docs/guides/frontend/sveltekit.mdx +1 -1
- package/docs/guides/frontend/use-eve-agent-svelte.mdx +1 -4
- package/docs/guides/frontend/use-eve-agent-vue.mdx +1 -4
- package/docs/guides/instrumentation.md +1 -1
- package/docs/reference/cli.md +24 -2
- package/docs/tutorial/ship-it.mdx +1 -1
- package/package.json +2 -1
- package/docs/guides/deployment.md +0 -210
- /package/dist/src/cli/{dev/tui → ui}/live-region.d.ts +0 -0
- /package/dist/src/cli/{dev/tui → ui}/live-region.js +0 -0
- /package/dist/src/cli/{dev/tui → ui}/terminal-text.d.ts +0 -0
- /package/dist/src/cli/{dev/tui → ui}/terminal-text.js +0 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AgentReasoningDefinition } from "#shared/agent-definition.js";
|
|
2
|
+
import type { AgentModelSetting, AgentModelSettingsPatch } from "#source-change/apply-agent-model-settings.js";
|
|
3
|
+
export type ApplyModelSettingsOutcome = {
|
|
4
|
+
kind: "changed";
|
|
5
|
+
changed: readonly AgentModelSetting[];
|
|
6
|
+
model?: string;
|
|
7
|
+
reasoning?: AgentReasoningDefinition | null;
|
|
8
|
+
fastMode?: boolean;
|
|
9
|
+
} | {
|
|
10
|
+
kind: "unchanged";
|
|
11
|
+
} | {
|
|
12
|
+
kind: "rejected";
|
|
13
|
+
message: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function formatApplyModelSettingsOutcome(outcome: ApplyModelSettingsOutcome): string;
|
|
16
|
+
/** The outcome of applying a model slug to the agent's authored source. */
|
|
17
|
+
export type ApplyModelOutcome = {
|
|
18
|
+
kind: "changed";
|
|
19
|
+
to: string;
|
|
20
|
+
} | {
|
|
21
|
+
kind: "unchanged";
|
|
22
|
+
model: string;
|
|
23
|
+
} | {
|
|
24
|
+
kind: "rejected";
|
|
25
|
+
message: string;
|
|
26
|
+
};
|
|
27
|
+
/** The one-line transcript form of an apply outcome (`/model <slug>`'s reply). */
|
|
28
|
+
export declare function formatApplyModelOutcome(outcome: ApplyModelOutcome): string;
|
|
29
|
+
/** Applies one completed `/model` draft through a single atomic source write. */
|
|
30
|
+
export declare function changeAgentModelSettings(input: {
|
|
31
|
+
readonly appRoot: string;
|
|
32
|
+
readonly patch: AgentModelSettingsPatch;
|
|
33
|
+
}): Promise<ApplyModelSettingsOutcome>;
|
|
34
|
+
/** Applies a validated `/model <slug>` change to authored source. */
|
|
35
|
+
export declare function changeAgentModel(input: {
|
|
36
|
+
readonly appRoot: string;
|
|
37
|
+
readonly slug: string;
|
|
38
|
+
}): Promise<ApplyModelOutcome>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{join}from"node:path";import{discoverAgent}from"#discover/discover-agent.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{createCompiledRuntimeModelCatalogLoader}from"#compiler/model-catalog.js";import{createStaticSourceChange}from"#source-change/static-source-change.js";var import_picocolors=__toESM(require_picocolors(),1);function formatApplyModelSettingsOutcome(e){return e.kind===`rejected`?e.message:e.kind===`unchanged`?`Model settings are already up to date.`:e.changed.length===1&&e.changed[0]===`model`&&e.model!==void 0?`Model changed to ${import_picocolors.default.bold(e.model)}. Live on your next prompt.`:`Model settings updated: ${e.changed.map(t=>t===`model`?`model ${e.model??`updated`}`:t===`reasoning`?`reasoning ${e.reasoning??`provider default`}`:`Fast mode ${e.fastMode?`on`:`off`}`).join(`, `)}. Live on your next prompt.`}function formatApplyModelOutcome(e){switch(e.kind){case`changed`:return`Model changed to ${import_picocolors.default.bold(e.to)}. Live on your next prompt.`;case`unchanged`:return`Model is already \`${e.model}\`.`;case`rejected`:return e.message}}async function changeAgentModelSettings(e){let{appRoot:t,patch:r}=e;if(r.model.kind===`set`){let e=await validateModelSlug(t,r.model.value);if(e!==null)return{kind:`rejected`,message:e}}let{manifest:i}=await discoverAgent({agentRoot:join(t,`agent`),appRoot:t}),a=await createStaticSourceChange(i).updateModelSettings(r);if(a.kind===`bail`)return{kind:`rejected`,message:`Couldn't edit ${a.at.logicalPath}: ${a.reason}. Change the model settings by hand.`};if(a.changed.length===0)return{kind:`unchanged`};let o={kind:`changed`,changed:a.changed};return r.model.kind===`set`&&(o.model=r.model.value),r.reasoning.kind!==`keep`&&(o.reasoning=r.reasoning.kind===`set`?r.reasoning.value:null),r.gatewayServiceTier.kind!==`keep`&&(o.fastMode=r.gatewayServiceTier.kind===`set`),o}async function changeAgentModel(e){let{appRoot:t,slug:r}=e,i=await validateModelSlug(t,r);if(i!==null)return{kind:`rejected`,message:i};let{manifest:a}=await discoverAgent({agentRoot:join(t,`agent`),appRoot:t}),o=await createStaticSourceChange(a).updateModelName(r);return o.kind===`bail`?{kind:`rejected`,message:`Couldn't edit ${o.at.logicalPath}: ${o.reason}. Change \`model\` by hand.`}:o.from===o.to?{kind:`unchanged`,model:o.to}:{kind:`changed`,to:o.to}}async function validateModelSlug(e,t){if(!t.includes(`/`))return`\`${t}\` isn't a provider/model id (e.g. anthropic/claude-sonnet-5).`;let n=createCompiledRuntimeModelCatalogLoader(e);try{if(await n.getModelLimits(formatLanguageModelGatewayId(t))===null)return`I couldn't confirm \`${t}\` in the AI Gateway model catalog, so I didn't change agent.ts.`}catch{return null}return null}export{changeAgentModel,changeAgentModelSettings,formatApplyModelOutcome,formatApplyModelSettingsOutcome};
|
|
@@ -1,20 +1,66 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type GatewayCredentialResolution } from "#internal/resolve-model-endpoint-status.js";
|
|
2
|
+
import type { AgentModelSettingsPatch } from "#source-change/apply-agent-model-settings.js";
|
|
2
3
|
import { type SelectModelDeps } from "../boxes/select-model.js";
|
|
4
|
+
import { type GatewayModelCapabilities, type ReasoningLevel } from "../boxes/model-capabilities.js";
|
|
3
5
|
import { type VercelProjectOperationOptions } from "../project-resolution.js";
|
|
4
|
-
import type { ModelRouting } from "#shared/agent-definition.js";
|
|
5
|
-
import type
|
|
6
|
-
import {
|
|
6
|
+
import type { AgentReasoningDefinition, ModelRouting } from "#shared/agent-definition.js";
|
|
7
|
+
import { type GatewayServiceTierState } from "#shared/gateway-service-tier.js";
|
|
8
|
+
import type { Prompter, SelectOption } from "../prompter.js";
|
|
9
|
+
import { type ApplyModelSettingsOutcome } from "./model-source-change.js";
|
|
10
|
+
import { runProviderFlow, type ModelProviderStatus } from "./provider.js";
|
|
7
11
|
/** The current model id, its routing, and whether `/model` can rewrite it. */
|
|
8
12
|
export interface CurrentAgentModel {
|
|
9
13
|
id: string | null;
|
|
10
14
|
routing: ModelRouting | null;
|
|
15
|
+
reasoning: AgentReasoningDefinition | null;
|
|
16
|
+
serviceTier: GatewayServiceTierState;
|
|
11
17
|
/**
|
|
12
18
|
* The authored `model` is a string the source editor can rewrite. False for a
|
|
13
19
|
* source-backed SDK model call (`gateway(...)`, `anthropic(...)`), which is
|
|
14
20
|
* not a string literal — independent of how the model routes.
|
|
15
21
|
*/
|
|
16
22
|
editable: boolean;
|
|
23
|
+
/** Whether the top-level agent config object can carry reasoning/tier edits. */
|
|
24
|
+
settingsEditable: boolean;
|
|
17
25
|
}
|
|
26
|
+
export type { GatewayServiceTierState };
|
|
27
|
+
/**
|
|
28
|
+
* Everything the composite Change-model screen edits, resolved before it
|
|
29
|
+
* opens. The model section is a searchable catalog pick, or a fixed line when
|
|
30
|
+
* the authored model is a source-backed SDK call `/model` cannot rewrite.
|
|
31
|
+
*/
|
|
32
|
+
export interface ModelSettingsRequest {
|
|
33
|
+
model: {
|
|
34
|
+
kind: "pick";
|
|
35
|
+
options: readonly SelectOption<string>[];
|
|
36
|
+
current: string | null;
|
|
37
|
+
} | {
|
|
38
|
+
kind: "fixed";
|
|
39
|
+
current: string | null;
|
|
40
|
+
reason: string;
|
|
41
|
+
};
|
|
42
|
+
/** Authored reasoning effort; null means the provider default. */
|
|
43
|
+
reasoning: ReasoningLevel | null;
|
|
44
|
+
/** Authored Gateway service tier. */
|
|
45
|
+
serviceTier: GatewayServiceTierState;
|
|
46
|
+
/** Whether the agent config object can carry reasoning/tier edits. */
|
|
47
|
+
settingsEditable: boolean;
|
|
48
|
+
/** True for a direct external provider, where Gateway tiers do not apply. */
|
|
49
|
+
externalRouting: boolean;
|
|
50
|
+
/** Capability lookup over the already-fetched catalog; called on every pick. */
|
|
51
|
+
capabilitiesFor(modelId: string | null): GatewayModelCapabilities | undefined;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The screen's draft on Done. Each field is present only when it differs from
|
|
55
|
+
* the authored value; `"default"` and `"standard"` mean "remove the setting".
|
|
56
|
+
*/
|
|
57
|
+
export interface ModelSettingsResult {
|
|
58
|
+
model?: string;
|
|
59
|
+
reasoning?: "default" | ReasoningLevel;
|
|
60
|
+
serviceTier?: "standard" | "priority";
|
|
61
|
+
}
|
|
62
|
+
/** Renderer-owned composite model screen; only the dev TUI implements this. */
|
|
63
|
+
export type ModelSettingsPicker = (request: ModelSettingsRequest) => Promise<ModelSettingsResult | undefined>;
|
|
18
64
|
/** Injected for tests; defaults to the real reads, fetches, and source edit. */
|
|
19
65
|
export interface ModelFlowDeps {
|
|
20
66
|
/**
|
|
@@ -22,35 +68,21 @@ export interface ModelFlowDeps {
|
|
|
22
68
|
* before the first compile.
|
|
23
69
|
*/
|
|
24
70
|
readCurrentModel: (appRoot: string) => Promise<CurrentAgentModel>;
|
|
25
|
-
/** Applies
|
|
26
|
-
|
|
71
|
+
/** Applies one completed `/model` draft to authored source. */
|
|
72
|
+
applySettings: (input: {
|
|
27
73
|
appRoot: string;
|
|
28
|
-
|
|
29
|
-
}) => Promise<
|
|
74
|
+
patch: AgentModelSettingsPatch;
|
|
75
|
+
}) => Promise<ApplyModelSettingsOutcome>;
|
|
30
76
|
/** Catalog fetch behind the shared model picker. */
|
|
31
77
|
selectModel?: SelectModelDeps;
|
|
78
|
+
/** The composite Change-model screen; the dev TUI renderer implements it. */
|
|
79
|
+
pickModelSettings?: ModelSettingsPicker;
|
|
32
80
|
/** Reads how the model is backed right now, for the menu's provider row. */
|
|
33
81
|
detectProviderStatus: typeof detectModelProviderStatus;
|
|
34
82
|
/** The provider sub-flow behind the menu's provider row. */
|
|
35
83
|
runProviderFlow: typeof runProviderFlow;
|
|
36
84
|
}
|
|
37
|
-
|
|
38
|
-
* How the agent's model is backed right now, as far as the local directory
|
|
39
|
-
* shows: a linked Vercel project, a gateway credential in an env file, or
|
|
40
|
-
* nothing detectable. An external provider (own ANTHROPIC_API_KEY etc.)
|
|
41
|
-
* leaves no marker eve owns, so it reads as `unset`.
|
|
42
|
-
*/
|
|
43
|
-
export type ModelProviderStatus = {
|
|
44
|
-
kind: "unset";
|
|
45
|
-
} | {
|
|
46
|
-
kind: "gateway-project";
|
|
47
|
-
projectName: string;
|
|
48
|
-
teamName?: string;
|
|
49
|
-
} | {
|
|
50
|
-
kind: "gateway-key";
|
|
51
|
-
envKey: typeof AI_GATEWAY_API_KEY_ENV_VAR | "VERCEL_OIDC_TOKEN";
|
|
52
|
-
envFile: string;
|
|
53
|
-
};
|
|
85
|
+
export type { ModelProviderStatus };
|
|
54
86
|
/**
|
|
55
87
|
* A provider sub-flow run that actually moved the provider: the credential
|
|
56
88
|
* the link flow verified landed in an env file (when one did), paired with
|
|
@@ -60,11 +92,14 @@ export type ModelProviderStatus = {
|
|
|
60
92
|
* disk — so it never surfaces as an outcome.
|
|
61
93
|
*/
|
|
62
94
|
export interface ModelProviderOutcome {
|
|
63
|
-
credential
|
|
95
|
+
/** The credential resolution the runtime will honor; see {@link LinkFlowResult}. */
|
|
96
|
+
resolution?: GatewayCredentialResolution;
|
|
64
97
|
status: ModelProviderStatus;
|
|
65
98
|
}
|
|
66
99
|
export type ModelFlowResult = {
|
|
67
100
|
kind: "cancelled";
|
|
101
|
+
/** True when Esc dropped drafted setting changes that Done would commit. */
|
|
102
|
+
discardedDraft?: boolean;
|
|
68
103
|
} | {
|
|
69
104
|
kind: "done";
|
|
70
105
|
/** The last apply line, when the model was changed this session. */
|
|
@@ -79,18 +114,15 @@ export declare const MODEL_MENU_MESSAGE = "";
|
|
|
79
114
|
* and `AI_GATEWAY_API_KEY` outranks `VERCEL_OIDC_TOKEN` because it is the one
|
|
80
115
|
* the provider sub-flow's own-key branch writes.
|
|
81
116
|
*/
|
|
82
|
-
export declare function detectModelProviderStatus(appRoot: string, options?: VercelProjectOperationOptions): Promise<ModelProviderStatus>;
|
|
117
|
+
export declare function detectModelProviderStatus(appRoot: string, options?: VercelProjectOperationOptions, env?: Record<string, string | undefined>): Promise<ModelProviderStatus>;
|
|
83
118
|
/**
|
|
84
|
-
* THE MODEL FLOW for the dev TUI's `/model`: a
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* project-backed gateway, an inline gateway key, or an external provider.
|
|
92
|
-
* A completed model or provider change returns to the prompt with its result.
|
|
93
|
-
* Cancelled flows and external-provider instructions return to the menu.
|
|
119
|
+
* THE MODEL FLOW for the dev TUI's `/model`: a root menu whose Change model
|
|
120
|
+
* row opens the composite model screen (catalog pick, reasoning-effort slider,
|
|
121
|
+
* service-tier toggle) and whose provider row runs {@link runProviderFlow}.
|
|
122
|
+
* Authored setting changes stay in memory until Done, then land through one
|
|
123
|
+
* source transform and atomic rename. A completed provider change commits the
|
|
124
|
+
* current draft and returns to the prompt; cancelled flows and
|
|
125
|
+
* external-provider instructions return to the menu.
|
|
94
126
|
*/
|
|
95
127
|
export declare function runModelFlow(input: {
|
|
96
128
|
appRoot: string;
|
|
@@ -100,34 +132,6 @@ export declare function runModelFlow(input: {
|
|
|
100
132
|
signal?: AbortSignal;
|
|
101
133
|
deps?: Partial<ModelFlowDeps>;
|
|
102
134
|
}): Promise<ModelFlowResult>;
|
|
103
|
-
/** The outcome of applying a model slug to the agent's authored source. */
|
|
104
|
-
export type ApplyModelOutcome = {
|
|
105
|
-
kind: "changed";
|
|
106
|
-
to: string;
|
|
107
|
-
} | {
|
|
108
|
-
kind: "unchanged";
|
|
109
|
-
model: string;
|
|
110
|
-
}
|
|
111
|
-
/** Invalid slug or an uneditable source — `message` says which and why. */
|
|
112
|
-
| {
|
|
113
|
-
kind: "rejected";
|
|
114
|
-
message: string;
|
|
115
|
-
};
|
|
116
|
-
/** The one-line transcript form of an apply outcome (`/model <slug>`'s reply). */
|
|
117
|
-
export declare function formatApplyModelOutcome(outcome: ApplyModelOutcome): string;
|
|
118
|
-
/**
|
|
119
|
-
* Applies a `/model <slug>` change to the local agent's authored source.
|
|
120
|
-
*
|
|
121
|
-
* This is the caller layer for the static source-change registry: it
|
|
122
|
-
* validates the slug against the AI Gateway model catalog, then edits
|
|
123
|
-
* `agent.ts` via {@link createStaticSourceChange}. Activation is the dev
|
|
124
|
-
* server's HMR watcher; {@link formatApplyModelOutcome} renders the outcome
|
|
125
|
-
* as the TUI's one-line reply.
|
|
126
|
-
*/
|
|
127
|
-
export declare function changeAgentModel(input: {
|
|
128
|
-
readonly appRoot: string;
|
|
129
|
-
readonly slug: string;
|
|
130
|
-
}): Promise<ApplyModelOutcome>;
|
|
131
135
|
/**
|
|
132
136
|
* Refusal message when `/model` can't rewrite the model — it is a source-backed
|
|
133
137
|
* SDK model call (`gateway(...)`, `anthropic(...)`), not a string literal — or
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{AI_GATEWAY_API_KEY_ENV_VAR}from"../ai-gateway-api-key.js";import{
|
|
1
|
+
import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{AI_GATEWAY_API_KEY_ENV_VAR}from"../ai-gateway-api-key.js";import{detectProjectIdentity}from"../project-resolution.js";import{WizardCancelledError}from"../step.js";import{withSpinner}from"../with-spinner.js";import{findEnvFileWithKey}from"../boxes/detect-ai-gateway.js";import{gatewayModelCapabilities}from"../boxes/model-capabilities.js";import{fetchGatewayCatalog,modelOptionsFromCatalog}from"../boxes/select-model.js";import{changeAgentModelSettings,formatApplyModelSettingsOutcome}from"./model-source-change.js";import{runProviderFlow}from"./provider.js";import{inspectApplication}from"#services/inspect-application.js";import{hasEnvValue,resolveGatewayCredential}from"#internal/resolve-model-endpoint-status.js";import{formatModelSummary}from"#shared/model-summary.js";import{readGatewayServiceTier}from"#shared/gateway-service-tier.js";var import_picocolors=__toESM(require_picocolors(),1);const MODEL_MENU_MESSAGE=``;function providerStatusHint(e,t=e=>e){if(e.kind===`gateway-project`)return`AI Gateway (Linked to ${e.teamName===void 0?t(e.projectName):`${t(e.projectName)} in ${t(e.teamName)}`})`;let n=e.source.kind===`shell`?`your shell`:e.source.path;return`AI Gateway (${e.envKey} in ${n})`}function modelListRows(e){return modelOptionsFromCatalog(e).map(e=>{let t={value:e.value,label:e.value};return e.featured===!0&&(t.featured=!0),t})}function formatModelDraftHint(e,t,n){let r={model:e};return t!==null&&(r.reasoning=t),n.kind===`priority`&&(r.fastGlyph=`↯`),formatModelSummary(r)}function modelMenuRows(e,t,n,r,i,a,o){let s;a||o?(s={value:`model`,label:`Change model`,description:a?`The model, its reasoning effort, and the Gateway service tier`:`Reasoning and service tier; the model itself is an SDK model call in agent.ts`},e!==null&&(s.hint=formatModelDraftHint(e,t,n))):s={value:`model`,label:`Change model`,disabled:!0,description:`Set via an SDK model call in agent.ts; edit the source to change it`};let c;return c=i?.kind===`external`?{disabled:!0,value:`provider`,label:`Change provider`,description:`Disabled in external endpoint mode`}:r.kind===`unset`?{value:`provider`,label:import_picocolors.default.bold(`Configure model access`),hint:import_picocolors.default.yellow(`Not configured`),description:`How your agent reaches the model provider`,accent:`warning`}:{value:`provider`,label:`Change provider`,hint:providerStatusHint(r,import_picocolors.default.bold),description:`How your agent reaches the model provider`},[s,c,{value:`done`,label:`Done`}]}async function detectModelProviderStatus(e,t={},i=process.env){let[a,s,c]=await Promise.all([detectProjectIdentity(e,t),findEnvFileWithKey(e,AI_GATEWAY_API_KEY_ENV_VAR),findEnvFileWithKey(e,`VERCEL_OIDC_TOKEN`)]);if(a!==void 0){let e={kind:`gateway-project`,projectName:a.projectName};return a.teamName!==void 0&&(e.teamName=a.teamName),e}let l={apiKeyInEnv:hasEnvValue(i[AI_GATEWAY_API_KEY_ENV_VAR])};s!==void 0&&(l.apiKeyFile=s),c!==void 0&&(l.oidcFile=c);let u=resolveGatewayCredential(l);return u===void 0?{kind:`unset`}:u.credential===`api-key`?{kind:`gateway-key`,envKey:AI_GATEWAY_API_KEY_ENV_VAR,source:u.source}:{kind:`gateway-key`,envKey:`VERCEL_OIDC_TOKEN`,source:{kind:`env-file`,path:u.file}}}async function runModelFlow(e){let{appRoot:t,prompter:n,signal:r}=e,o={readCurrentModel:readCurrentAgentModel,applySettings:changeAgentModelSettings,detectProviderStatus:detectModelProviderStatus,runProviderFlow,...e.deps},detectProvider=(e=!0)=>o.detectProviderStatus(t,e&&r!==void 0?{signal:r}:{}),l=o.selectModel?.fetchModels??fetchGatewayCatalog,[d,f,p]=await withSpinner(n,`Checking the project…`,()=>Promise.all([o.readCurrentModel(t),detectProvider(),l(r).catch(()=>void 0)]));r?.throwIfAborted();let{id:m,routing:h,serviceTier:g,editable:_,settingsEditable:v}=d,y=d.reasoning===`provider-default`?null:d.reasoning,b=f,x={model:{kind:`keep`},reasoning:{kind:`keep`},gatewayServiceTier:{kind:`keep`}},S,C,w=!1,T=h?.kind===`external`?{tone:`warning`,text:"`agent.ts` specifies the model provider directly. Model, provider, and service-tier changes stay source-owned; reasoning remains configurable here."}:void 0,E=b.kind===`unset`&&h?.kind!==`external`?`provider`:_||v?`model`:`provider`,D=h?.kind!==`external`&&(e.initialStep===`provider`||b.kind===`unset`);for(;;){let e;if(D)D=!1,e=`provider`;else try{e=await n.select({message:``,options:modelMenuRows(m,y,g,b,h,_,v),hintLayout:`stacked`,initialValue:E,notices:T===void 0?[]:[T]})}catch(e){if(!(e instanceof WizardCancelledError))throw e;if(hasModelSettingsChanges(x))return{kind:`cancelled`,discardedDraft:!0};break}if(e===`done`){w=!0;break}if(e===`model`){let e=o.pickModelSettings;if(e===void 0)throw Error(`runModelFlow requires a pickModelSettings dep to open the model screen.`);let t=await e({model:_?{kind:`pick`,options:modelListRows(p),current:m}:{kind:`fixed`,current:m,reason:`Set via an SDK model call in agent.ts; edit the source to change it`},reasoning:y,serviceTier:g,settingsEditable:v,externalRouting:h?.kind===`external`,capabilitiesFor:e=>gatewayModelCapabilities(p,e)});if(r?.throwIfAborted(),t===void 0){E=`model`;continue}t.model!==void 0&&(m=t.model,h={kind:`gateway`,target:t.model.split(`/`)[0]??``},x.model={kind:`set`,value:t.model}),t.reasoning!==void 0&&(y=t.reasoning==="default"?null:t.reasoning,x.reasoning=y===null?{kind:`remove`}:{kind:`set`,value:y}),t.serviceTier!==void 0&&(g=t.serviceTier===`priority`?{kind:`priority`}:{kind:`standard`},x.gatewayServiceTier=t.serviceTier===`priority`?{kind:`set`,value:`priority`}:{kind:`remove`}),E=`done`;continue}let c=await o.runProviderFlow({appRoot:t,prompter:n,signal:r,currentProvider:b});if(c.kind===`cancelled`){if(r?.aborted)return{kind:`cancelled`};E=`provider`;continue}if(c.kind===`external-provider`){if(r?.aborted)return{kind:`cancelled`};E=`done`;continue}b=await withSpinner(n,`Checking the project…`,()=>detectProvider(!1)),C={status:b},c.kind===`done`&&c.resolution!==void 0&&(C.resolution=c.resolution),w=!0;break}if(w&&hasModelSettingsChanges(x)&&(S=await o.applySettings({appRoot:t,patch:x}),r?.throwIfAborted()),S===void 0&&C===void 0)return{kind:`cancelled`};let O={kind:`done`};return S!==void 0&&(O.modelMessage=formatApplyModelSettingsOutcome(S)),C!==void 0&&(O.providerOutcome=C),O}function hasModelSettingsChanges(e){return e.model.kind!==`keep`||e.reasoning.kind!==`keep`||e.gatewayServiceTier.kind!==`keep`}async function readCurrentAgentModel(e){try{let{compiledState:t}=await inspectApplication(e),n=t?.manifest.config,r=n?.model;return{id:r?.id??null,routing:r?.routing??null,reasoning:n?.reasoning??null,serviceTier:readGatewayServiceTier(r?.providerOptions),editable:r!==void 0&&r.source===void 0,settingsEditable:n?.source!==void 0}}catch{return{id:null,routing:null,reasoning:null,serviceTier:{kind:`standard`},editable:!1,settingsEditable:!1}}}async function modelChangeRefusalForUneditableModel(e){let{editable:t,routing:n}=await readCurrentAgentModel(e);return t?null:`Model is set via ${n?.kind===`external`?`the external provider \`${n.provider}\``:`an SDK model call`} in agent.ts, not a string literal; /model can't rewrite it. Edit \`model\` in agent.ts.`}export{MODEL_MENU_MESSAGE,detectModelProviderStatus,modelChangeRefusalForUneditableModel,runModelFlow};
|
|
@@ -1,9 +1,29 @@
|
|
|
1
1
|
import { appendEnv } from "../append-env.js";
|
|
2
|
+
import { AI_GATEWAY_API_KEY_ENV_VAR } from "../ai-gateway-api-key.js";
|
|
2
3
|
import type { Prompter, SelectOption } from "../prompter.js";
|
|
3
4
|
import { validateGatewayApiKey, type GatewayKeyValidation } from "../validate-gateway-key.js";
|
|
4
5
|
import { getVercelAuthStatus } from "../vercel-project.js";
|
|
6
|
+
import type { GatewayCredentialSource } from "#internal/resolve-model-endpoint-status.js";
|
|
5
7
|
import { runLinkFlow, type LinkFlowResult } from "./link.js";
|
|
6
8
|
export type ProviderConnection = "project" | "own-key" | "external";
|
|
9
|
+
/**
|
|
10
|
+
* How the agent's model is backed right now, as far as the local directory
|
|
11
|
+
* shows: a linked Vercel project, a gateway credential in an env file, or
|
|
12
|
+
* nothing detectable. An external provider (own ANTHROPIC_API_KEY etc.)
|
|
13
|
+
* leaves no marker eve owns, so it reads as `unset`.
|
|
14
|
+
*/
|
|
15
|
+
export type ModelProviderStatus = {
|
|
16
|
+
kind: "unset";
|
|
17
|
+
} | {
|
|
18
|
+
kind: "gateway-project";
|
|
19
|
+
projectName: string;
|
|
20
|
+
teamName?: string;
|
|
21
|
+
} | {
|
|
22
|
+
kind: "gateway-key";
|
|
23
|
+
envKey: typeof AI_GATEWAY_API_KEY_ENV_VAR | "VERCEL_OIDC_TOKEN";
|
|
24
|
+
/** Where the credential lives — an env file, or the shell for a key. */
|
|
25
|
+
source: GatewayCredentialSource;
|
|
26
|
+
};
|
|
7
27
|
export declare const PROVIDER_QUESTION = "Which model provider do you want to use?";
|
|
8
28
|
export declare const EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE = "Using another model provider";
|
|
9
29
|
export declare const EXTERNAL_PROVIDER_INSTRUCTIONS: readonly string[];
|
|
@@ -52,6 +72,8 @@ export declare function runProviderFlow(input: {
|
|
|
52
72
|
prompter: Prompter;
|
|
53
73
|
signal?: AbortSignal;
|
|
54
74
|
picker?: ProviderPicker;
|
|
75
|
+
/** The detected provider, so the chooser can mark and describe the active row. */
|
|
76
|
+
currentProvider?: ModelProviderStatus;
|
|
55
77
|
deps?: Partial<ProviderFlowDeps>;
|
|
56
78
|
}): Promise<ProviderFlowResult>;
|
|
57
79
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{appendEnv}from"../append-env.js";import{AI_GATEWAY_API_KEY_ENV_FILE,AI_GATEWAY_API_KEY_ENV_VAR,writeAiGatewayApiKey}from"../ai-gateway-api-key.js";import{WizardCancelledError}from"../step.js";import{withSpinner}from"../with-spinner.js";import{getVercelAuthStatus,vercelAuthBlockerReason}from"../vercel-project.js";import{runLinkFlow}from"./link.js";import{validateGatewayApiKey}from"../validate-gateway-key.js";var import_picocolors=__toESM(require_picocolors(),1);const PROVIDER_QUESTION=`Which model provider do you want to use?`,EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE=`Using another model provider`,EXTERNAL_PROVIDER_INSTRUCTIONS=[`Set your provider's API key in ${AI_GATEWAY_API_KEY_ENV_FILE} — e.g. ANTHROPIC_API_KEY or OPENAI_API_KEY.`,'In agent/agent.ts, set `model` to a provider-authored model — e.g. `anthropic("claude-opus-4.8")` from `@ai-sdk/anthropic`.',`See https://eve.dev/docs/agent-config for details.`,"A running `eve dev` reloads env files automatically — no restart needed."];function projectConnectionOption(e){let t={value:`project`,label:`AI Gateway via Project`,hint:`Authenticates with AI Gateway automatically
|
|
2
|
-
in a new or existing project. No keys to manage.`},n=e===void 0?void 0:vercelAuthBlockerReason(e);return n===void 0?t:{...t,disabled:!0,disabledReason:n,disabledReasonTone:`warning`}}function providerOptions(e){
|
|
3
|
-
via OPENAI_API_KEY or ANTHROPIC_API_KEY.`}]}async function selectProvider(e){let t={message:PROVIDER_QUESTION,options:e.options,initialValue:e.initialValue,validateInlineKey:e.validateInlineKey};if(e.picker===void 0)throw Error(`The provider flow requires the Dev TUI provider picker.`);let n=await e.picker(t);if(n===void 0)throw new WizardCancelledError;return n}async function runProviderFlow(e){let{appRoot:t,prompter:r,signal:i}=e,o={getVercelAuthStatus,runLinkFlow,appendEnv,validateGatewayApiKey,...e.deps},s,c
|
|
4
|
-
`),EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE),{kind:`external-provider`};if(n.kind===`inline-key`){l=n;break}let a=await withSpinner(r,`Checking your Vercel login…`,()=>o.getVercelAuthStatus(t,{signal:i}));if(i?.throwIfAborted(),s=a,vercelAuthBlockerReason(s)!==void 0){c=`own-key`;continue}return await o.runLinkFlow({appRoot:t,prompter:r,signal:i,projectSelection:`create-or-link`})}}catch(e){if(e instanceof WizardCancelledError)return{kind:`cancelled`};throw e}let u=l.key.trim(),d=l.validation;i?.throwIfAborted(),d.kind===`inconclusive
|
|
2
|
+
in a new or existing project. No keys to manage.`},n=e===void 0?void 0:vercelAuthBlockerReason(e);return n===void 0?t:{...t,disabled:!0,disabledReason:n,disabledReasonTone:`warning`}}function providerOptions(e,t){let n=projectConnectionOption(e);if(t?.kind===`gateway-project`){let e=t.teamName===void 0?import_picocolors.default.bold(t.projectName):`${import_picocolors.default.bold(t.projectName)} in team ${import_picocolors.default.bold(t.teamName)}`;n={...n,checked:!0,hint:`Linked to ${e}`}}let r={value:`own-key`,label:`AI Gateway via ${AI_GATEWAY_API_KEY_ENV_VAR}`,hint:`⎿ type your key`};if(t?.kind===`gateway-key`){let e=t.source.kind===`shell`?`your shell`:t.source.path;r={...r,checked:!0,hint:`${t.envKey} set in ${e}`}}return[n,r,{value:`external`,label:`Other providers`,hint:`Connect directly to a model provider
|
|
3
|
+
via OPENAI_API_KEY or ANTHROPIC_API_KEY.`}]}async function selectProvider(e){let t={message:PROVIDER_QUESTION,options:e.options,initialValue:e.initialValue,validateInlineKey:e.validateInlineKey};if(e.picker===void 0)throw Error(`The provider flow requires the Dev TUI provider picker.`);let n=await e.picker(t);if(n===void 0)throw new WizardCancelledError;return n}async function runProviderFlow(e){let{appRoot:t,prompter:r,signal:i}=e,o={getVercelAuthStatus,runLinkFlow,appendEnv,validateGatewayApiKey,...e.deps},s,c=e.currentProvider?.kind===`gateway-key`?`own-key`:`project`,l;try{for(;;){let n=await selectProvider({picker:e.picker,options:providerOptions(s,e.currentProvider),initialValue:c,validateInlineKey:(e,t)=>o.validateGatewayApiKey(e,i===void 0?t:AbortSignal.any([i,t]))});if(n.kind===`external`)return r.acknowledge?await r.acknowledge({message:EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE,lines:EXTERNAL_PROVIDER_INSTRUCTIONS}):r.note(EXTERNAL_PROVIDER_INSTRUCTIONS.join(`
|
|
4
|
+
`),EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE),{kind:`external-provider`};if(n.kind===`inline-key`){l=n;break}let a=await withSpinner(r,`Checking your Vercel login…`,()=>o.getVercelAuthStatus(t,{signal:i}));if(i?.throwIfAborted(),s=a,vercelAuthBlockerReason(s)!==void 0){c=`own-key`;continue}return await o.runLinkFlow({appRoot:t,prompter:r,signal:i,projectSelection:`create-or-link`})}}catch(e){if(e instanceof WizardCancelledError)return{kind:`cancelled`};throw e}let u=l.key.trim(),d=l.validation;i?.throwIfAborted(),d.kind===`inconclusive`&&r.log.warning(`Couldn't reach the gateway to validate (${d.message}). Saving the key anyway.`);let f=await writeAiGatewayApiKey({projectRoot:t,apiKey:u,appendEnv:o.appendEnv});return r.log.success(`${f.envKey} set.`),{kind:`done`,resolution:{credential:`api-key`,source:{kind:`env-file`,path:f.envFile}}}}export{EXTERNAL_PROVIDER_INSTRUCTIONS,EXTERNAL_PROVIDER_INSTRUCTIONS_TITLE,PROVIDER_QUESTION,runProviderFlow};
|
|
@@ -51,6 +51,8 @@ export interface SelectOption<T extends PrompterValue> {
|
|
|
51
51
|
* to the front. Meaningless without `search`.
|
|
52
52
|
*/
|
|
53
53
|
featured?: boolean;
|
|
54
|
+
/** Marks the currently-active value: renders a green check beside the row. */
|
|
55
|
+
checked?: boolean;
|
|
54
56
|
}
|
|
55
57
|
/**
|
|
56
58
|
* An outcome line from an earlier lap of a looping menu, shown with the
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{pinnedNodeEngineMajor}from"../../node-engine.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{basename,join,resolve}from"node:path";import{mkdir,readdir,stat}from"node:fs/promises";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,ALLOWED_CREATE_IN_PLACE_ENTRIES=new Set([`.DS_Store`,`.git`,`.gitkeep`,`.hg`]),DEFAULT_AI_PACKAGE_VERSION=`^7.0.26`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.4.0`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.
|
|
1
|
+
import{pinnedNodeEngineMajor}from"../../node-engine.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{basename,join,resolve}from"node:path";import{mkdir,readdir,stat}from"node:fs/promises";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,ALLOWED_CREATE_IN_PLACE_ENTRIES=new Set([`.DS_Store`,`.git`,`.gitkeep`,`.hg`]),DEFAULT_AI_PACKAGE_VERSION=`^7.0.26`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.4.0`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.26.1`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e){return{"agent/agent.ts":BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function renderTemplate(e,t){return e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,t.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,t.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,t.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
|
|
2
2
|
|
|
3
3
|
export default defineAgent({
|
|
4
4
|
model: "__EVE_INIT_MODEL__",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{object,string}from"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/schemas.js";import"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/index.js";import{parseSlackConnectorDetails,parseSlackConnectors,pickSlackConnector}from"./slack-connect.js";import{join}from"node:path";import{SLACK_CHANNEL_DEFAULT_ROUTE}from"#setup/scaffold/index.js";import{readFile}from"node:fs/promises";import"#setup/
|
|
1
|
+
import{object,string}from"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/schemas.js";import"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/index.js";import{parseSlackConnectorDetails,parseSlackConnectors,pickSlackConnector}from"./slack-connect.js";import{join}from"node:path";import{SLACK_CHANNEL_DEFAULT_ROUTE}from"#setup/scaffold/index.js";import{readFile}from"node:fs/promises";import"#setup/primitives/run-vercel.js";import"#setup/cli/index.js";const CONNECT_LOOKUP_TIMEOUT_MS=6e4,CONNECT_MUTATION_TIMEOUT_MS=2*6e4,VercelProjectLinkSchema=object({projectId:string().min(1),orgId:string().min(1)});async function listSlackConnectors(e,t,n,i){let a=await e.captureVercel([`connect`,`list`,`-F`,`json`,`--all-projects`],{cwd:t,onOutput:n,timeoutMs:CONNECT_LOOKUP_TIMEOUT_MS,signal:i});if(!a.ok)return{state:`failed`,message:a.failure.message};try{let e=JSON.parse(a.stdout);if(typeof e!=`object`||!e)return{state:`failed`,message:`Vercel returned a malformed connector list.`};let t=e;return Array.isArray(t.connectors??t.clients)?{state:`ok`,body:e,connectors:parseSlackConnectors(e)}:{state:`failed`,message:`Vercel returned a malformed connector list.`}}catch{return{state:`failed`,message:`Vercel returned invalid JSON for the connector list.`}}}async function readProjectLink(e){try{let t=await readFile(join(e,`.vercel`,`project.json`),`utf8`),n=VercelProjectLinkSchema.safeParse(JSON.parse(t));return n.success?n.data:void 0}catch{return}}async function findSlackConnector(e,t,n,r,a,o){let s=await listSlackConnectors(e,t,a,o);if(s.state===`failed`)return s;let c=new Set(s.connectors.map(e=>e.uid)),l=pickSlackConnector(s.body,n,r);return l===void 0?{state:`not-found`,connectorUids:c}:{state:`found`,connector:l,connectorUids:c}}async function attachSlackConnector(e,t,n,r,i){return await e.runVercel([`connect`,`detach`,n.uid,`--yes`],{cwd:t,onOutput:r,nonInteractive:!0,timeoutMs:CONNECT_MUTATION_TIMEOUT_MS,signal:i})?await e.runVercel([`connect`,`attach`,n.uid,`--triggers`,`--trigger-path`,SLACK_CHANNEL_DEFAULT_ROUTE,`--yes`],{cwd:t,onOutput:r,nonInteractive:!0,timeoutMs:CONNECT_MUTATION_TIMEOUT_MS,signal:i})?{state:`attached`}:{state:`attach-failed`}:{state:`detach-failed`}}async function fetchSlackConnectorDetails(e){let t=e.orgId===void 0?``:`?teamId=${encodeURIComponent(e.orgId)}`,r=[`api`,`/v1/connect/connectors/${encodeURIComponent(e.connectorId)}${t}`];e.orgId!==void 0&&r.push(`--scope`,e.orgId);let i=await e.deps.captureVercel(r,{cwd:e.projectRoot,onOutput:e.onOutput,timeoutMs:e.timeoutMs,signal:e.signal});if(!i.ok)return{state:`failed`,message:i.failure.message};try{let t=parseSlackConnectorDetails(JSON.parse(i.stdout));return t?.ref.id===e.connectorId?{state:`found`,details:t}:{state:`failed`,message:`Vercel returned an invalid Slack connector.`}}catch{return{state:`failed`,message:`Vercel returned invalid JSON for the Slack connector.`}}}async function fetchSlackWorkspace(e){let t=await fetchSlackConnectorDetails(e);return t.state===`failed`?t:t.details.workspace===void 0?{state:`pending`}:{state:`connected`,workspace:t.details.workspace}}async function cleanupConnectorUid(e,t){let{log:n,deps:r,projectRoot:i,onOutput:a}=e;return await r.runVercel([`connect`,`remove`,t,`--disconnect-all`,`--yes`],{cwd:i,onOutput:a,timeoutMs:CONNECT_MUTATION_TIMEOUT_MS})?!0:(n.warning(`Could not remove the abandoned Slack connector. Run \`vercel connect remove ${t} --disconnect-all --yes\` to clean it up.`),!1)}async function cleanupConnectorUids(e,t){let n=[];for(let r of new Set(t))await cleanupConnectorUid(e,r)||n.push(r);return n.length===0?{state:`clean`}:{state:`failed`,connectorUids:n}}async function cleanupCreatedAttempt(e,t){if(t.createdRef)return cleanupConnectorUids(e,[t.createdRef.uid]);e.log.warning(`Vercel returned no connector UID for the abandoned Slack Connect request, so eve cannot prove that request was cancelled. No connector was removed; do not retry until the browser request is no longer usable.`);let n=await listSlackConnectors(e.deps,e.projectRoot,e.onOutput);return n.state===`failed`?{state:`failed`,connectorUids:[]}:{state:`failed`,connectorUids:n.connectors.map(e=>e.uid).filter(e=>(e===t.expectedUid||e.startsWith(`${t.expectedUid}-`))&&!t.baselineConnectorUids.has(e))}}export{CONNECT_LOOKUP_TIMEOUT_MS,CONNECT_MUTATION_TIMEOUT_MS,attachSlackConnector,cleanupCreatedAttempt,fetchSlackConnectorDetails,fetchSlackWorkspace,findSlackConnector,listSlackConnectors,readProjectLink};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{parseCreatedSlackConnector,parseSlackConnectorDetails,pickSlackConnector}from"./slack-connect.js";import{CONNECT_LOOKUP_TIMEOUT_MS,attachSlackConnector,cleanupCreatedAttempt,fetchSlackWorkspace,findSlackConnector,listSlackConnectors,readProjectLink}from"./slack-connect-lifecycle.js";import{createSlackConnector}from"./slack-connect-create.js";import{join}from"node:path";import{SLACK_CHANNEL_DEFAULT_ROUTE}from"#setup/scaffold/index.js";import{performance}from"node:perf_hooks";import{setTimeout}from"node:timers/promises";import{createPromptCommandOutput,withPhase}from"#setup/cli/index.js";import{
|
|
1
|
+
import{parseCreatedSlackConnector,parseSlackConnectorDetails,pickSlackConnector}from"./slack-connect.js";import{CONNECT_LOOKUP_TIMEOUT_MS,attachSlackConnector,cleanupCreatedAttempt,fetchSlackWorkspace,findSlackConnector,listSlackConnectors,readProjectLink}from"./slack-connect-lifecycle.js";import{createSlackConnector}from"./slack-connect-create.js";import{join}from"node:path";import{SLACK_CHANNEL_DEFAULT_ROUTE}from"#setup/scaffold/index.js";import{performance}from"node:perf_hooks";import{captureVercel,runVercel,runVercelCaptureStdout}from"#setup/primitives/run-vercel.js";import{setTimeout}from"node:timers/promises";import{createPromptCommandOutput,withPhase}from"#setup/cli/index.js";import{updateSlackChannelConnectorUid}from"#setup/scaffold/update/update-slack-channel.js";const defaultDeps={captureVercel,runVercel,runVercelCaptureStdout},realDelay=(e,t)=>setTimeout(e,void 0,{signal:t}),monotonicNow=()=>performance.now();async function pollSlackWorkspace(e,t,n,i,a,s){let c=e.delay??realDelay,l=e.now??monotonicNow,u=l()+3e5;for(;;){s?.throwIfAborted();let d=u-l();if(d<=0)return{state:`timed-out`};let f=await fetchSlackWorkspace({deps:e,projectRoot:t,connectorId:n,orgId:i,onOutput:a,timeoutMs:Math.min(CONNECT_LOOKUP_TIMEOUT_MS,d),signal:s});if(s?.throwIfAborted(),f.state!==`pending`)return f;let p=u-l();if(p<=0)return{state:`timed-out`};await c(Math.min(3e3,p),s)}}function isAbortFromSignal(e,t){return t?.aborted===!0&&(e===t.reason||e instanceof Error&&e.name===`AbortError`)}function cleanupFailureResult(e){return{state:`cleanup-failed`,connectorUids:e.connectorUids}}async function runAttempt(e){let{log:t,deps:n,projectRoot:r,orgId:a,onOutput:o,signal:s,phase:c}=e,l,d;if(e.source.state===`existing`)l=e.source.ref;else{let i=await createSlackConnector({deps:n,projectRoot:r,orgId:a,slug:e.slug,onOutput:o,signal:s,phase:c,onCreated:e.onCreated,waitForWorkspace:async(e,t)=>{let i=await pollSlackWorkspace(n,r,e.id,a,o,t);return i.state===`connected`?i.workspace:void 0}});if(i.state===`failed`)return{state:`create-failed`};if(i.state===`unresolved`)return t.warning(`Vercel did not return an exact Slack connector UID for this request, so eve cannot attach or remove it safely.`),{state:`unresolved`};l=i.ref,i.via===`workspace`&&(d=i.workspace)}if(e.source.state===`existing`&&d===void 0){let e=await c(`Waiting for the Slack workspace connection...`,()=>pollSlackWorkspace(n,r,l.id,a,o,s));if(e.state===`timed-out`)return{state:`timed-out`,ref:l};if(e.state===`failed`)return{state:`failed`,ref:l,message:e.message};d=e.workspace}let f=await c(`Configuring Slack event delivery for this agent...`,()=>attachSlackConnector(n,r,l,o,s));return s?.throwIfAborted(),f.state===`attached`?d===void 0?{state:`attached`,ref:l}:{state:`attached`,ref:l,workspace:d}:{state:f.state,ref:l}}async function raceAttemptAgainstChoice(e){let t=new AbortController,n=e.outerSignal?AbortSignal.any([e.outerSignal,t.signal]):t.signal,r=e.run(n);try{let i=await Promise.race([r.then(e=>({via:`work`,outcome:e})),e.prompt.choice.then(e=>({via:`choice`,choice:e}))]);if(i.via===`work`)return i;t.abort();let a;try{a=await r}catch(e){if(!isAbortFromSignal(e,n))throw e}return{via:`choice`,choice:i.choice,settled:a}}catch(e){t.abort();try{await r}catch{}throw e}finally{e.prompt.close()}}async function provisionSlackbot(e,t,n,r=defaultDeps,i={}){i.signal?.throwIfAborted();let o=createPromptCommandOutput(e),u={log:e,deps:r,projectRoot:t,onOutput:o},d=await(r.readProjectLink??readProjectLink)(t),p=d?.projectId,m=d?.orgId,h=`slack/${n}`,g=await withPhase(e,`Checking for an existing Slackbot...`,()=>findSlackConnector(r,t,p,h,o,i.signal));if(i.signal?.throwIfAborted(),g.state===`failed`)return e.warning(`Could not inspect existing Slack connectors, so eve did not create another one. ${g.message}`),{state:`connector-lookup-failed`};if(p===void 0&&g.connectorUids.size>0)return e.warning("Could not verify which Slack connectors belong to this Vercel project, so eve did not create another one. Restore `.vercel/project.json`, then try again."),{state:`connector-lookup-failed`};let finishOutcome=async(t,n,r)=>{let i=n.state===`new`;switch(t.state){case`create-failed`:if(i){let e=await r();if(e.state===`failed`)return cleanupFailureResult(e)}return{state:`create-failed`};case`unresolved`:if(i){let e=await r();if(e.state===`failed`)return cleanupFailureResult(e)}return{state:`create-failed`};case`detach-failed`:return e.warning(`Could not remove the connector's existing trigger destination. Run \`vercel connect detach ${t.ref.uid} --yes\`, then \`vercel connect attach ${t.ref.uid} --triggers --trigger-path ${SLACK_CHANNEL_DEFAULT_ROUTE} --yes\`.`),{state:`detach-failed`,connectorUid:t.ref.uid};case`attach-failed`:return e.warning(`Could not register this project as a trigger destination. Run \`vercel connect attach ${t.ref.uid} --triggers --trigger-path ${SLACK_CHANNEL_DEFAULT_ROUTE} --yes\` to enable event delivery.`),{state:`attach-failed`,connectorUid:t.ref.uid};case`attached`:return t.workspace===void 0?{state:`attached`,connectorUid:t.ref.uid}:{state:`attached`,connectorUid:t.ref.uid,chatUrl:t.workspace.workspaceUrl,workspaceName:t.workspace.workspaceName};case`failed`:return e.warning(`Could not verify the Slack workspace connection. ${t.message}`),{state:`installation-check-failed`,connectorUid:t.ref.uid};case`timed-out`:if(e.warning(`The Slackbot did not connect to a Slack workspace in time.`),i){let e=await r();if(e.state===`failed`)return cleanupFailureResult(e)}return{state:`not-installed`}}},cleanupNewAttempt=async(e,t)=>cleanupCreatedAttempt(u,{expectedUid:h,baselineConnectorUids:e.baselineConnectorUids,createdRef:t});function attemptInput(i,a){return{log:e,deps:r,projectRoot:t,orgId:m,slug:n,source:i,onOutput:o,onCreated:a}}async function runExistingConnector(t){let cleanupCurrentAttempt=async()=>({state:`clean`}),notInstalled=()=>(e.warning(`The existing Slack connector \`${t.ref.uid}\` is not connected to a Slack workspace. eve did not remove it because this run did not create it. If its original browser request is still open, complete it; otherwise run \`vercel connect remove ${t.ref.uid} --disconnect-all --yes\` before trying again.`),{state:`existing-not-installed`,connectorUid:t.ref.uid}),finishExistingOutcome=async e=>e.state===`timed-out`?notInstalled():finishOutcome(e,t,cleanupCurrentAttempt);if(i.awaitChoice!==void 0){let e=await raceAttemptAgainstChoice({prompt:i.awaitChoice({status:`Waiting for the existing Slack workspace connection...`,context:`Complete the original setup in the browser`,actions:[{value:`cancel`,label:`Stop waiting`}]}),outerSignal:i.signal,run:e=>runAttempt({...attemptInput(t,()=>{}),signal:e,phase:(e,t)=>t()})});return e.via===`work`?finishExistingOutcome(e.outcome):e.settled?.state===`attached`?finishExistingOutcome(e.settled):notInstalled()}return finishExistingOutcome(await runAttempt({...attemptInput(t,()=>{}),signal:i.signal,phase:(t,n)=>withPhase(e,t,n)}))}async function runUncontrolledAttempt(t){let n,cleanupCurrentAttempt=()=>cleanupNewAttempt(t,n),r=runAttempt({...attemptInput(t,e=>{n=e}),signal:i.signal,phase:(t,n)=>withPhase(e,t,n)});try{return await finishOutcome(await r,t,cleanupCurrentAttempt)}catch(e){throw i.signal?.aborted===!0&&await cleanupCurrentAttempt(),e}}async function runInteractiveAttempt(n,a){let s,cleanupCurrentAttempt=()=>cleanupNewAttempt(n,s),l=a({status:`Waiting for Slack setup to finish...`,context:`Complete setup in the browser, then wait while eve verifies the connection`,actions:[{value:`retry`,label:`Did your browser not open? Try again`},{value:`cancel`,label:`Cancel`}]}),u;try{u=await raceAttemptAgainstChoice({prompt:l,outerSignal:i.signal,run:t=>runAttempt({...attemptInput(n,e=>{s=e}),signal:t,phase:e.spinner===void 0?(e,t)=>t():(t,n)=>withPhase(e,t,n)})})}catch(e){throw await cleanupCurrentAttempt(),e}if(u.via===`work`)return{state:`finished`,result:await finishOutcome(u.outcome,n,cleanupCurrentAttempt)};if(u.settled?.state===`attached`)return{state:`finished`,result:await finishOutcome(u.settled,n,cleanupCurrentAttempt)};let d=await cleanupCurrentAttempt();if(d.state===`failed`)return{state:`finished`,result:cleanupFailureResult(d)};if(u.choice===`retry`){let n=await withPhase(e,`Checking existing Slack connectors...`,()=>listSlackConnectors(r,t,o,i.signal));return i.signal?.throwIfAborted(),n.state===`failed`?(e.warning(`Could not inspect existing Slack connectors, so eve did not create another one. ${n.message}`),{state:`finished`,result:{state:`connector-lookup-failed`}}):{state:`retry`,source:{state:`new`,baselineConnectorUids:new Set(n.connectors.map(e=>e.uid))}}}return{state:`finished`,result:{state:`cancelled`}}}if(g.state===`found`)return runExistingConnector({state:`existing`,ref:g.connector});let _={state:`new`,baselineConnectorUids:g.connectorUids};if(i.awaitChoice===void 0)return runUncontrolledAttempt(_);for(;;){let e=await runInteractiveAttempt(_,i.awaitChoice);if(e.state===`finished`)return e.result;_=e.source}}async function reconcileSlackUid(e,t,n,r){if(n.state!==`attached`||n.connectorUid===r)return!0;let{patched:i}=await updateSlackChannelConnectorUid(join(t,`agent/channels/slack.ts`),n.connectorUid);return i?!0:(e.warning(`Could not patch agent/channels/slack.ts automatically. Update \`connectSlackCredentials("...")\` to \`"${n.connectorUid}"\` and run \`vercel deploy --prod\`.`),!1)}export{parseCreatedSlackConnector,parseSlackConnectorDetails,pickSlackConnector,provisionSlackbot,reconcileSlackUid};
|
|
@@ -8,6 +8,12 @@ import { type CreatedProjectFrameworkOptions } from "./vercel-project-framework.
|
|
|
8
8
|
export interface PickProjectOptions extends VercelProjectOperationOptions {
|
|
9
9
|
/** Whether an empty project list may fall back to entering a name to create. */
|
|
10
10
|
allowCreateWhenEmpty?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Searches the team for a project with this name before the list opens and
|
|
13
|
+
* suggests the best match: floated to the top, cursor on it, marked
|
|
14
|
+
* "suggested". Best-effort — a failed lookup falls back to the plain list.
|
|
15
|
+
*/
|
|
16
|
+
suggestedName?: string;
|
|
11
17
|
}
|
|
12
18
|
export interface PickTeamOptions extends VercelProjectOperationOptions {
|
|
13
19
|
/** Builds the team selector heading from the current team's display name. */
|
|
Binary file
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
import type { ModelMessage } from "ai";
|
|
2
2
|
import type { PublicToolInputSchema, PublicToolOutputSchema, ToolModelOutput } from "#shared/tool-definition.js";
|
|
3
|
-
import type { SessionContext } from "#public/definitions/callback-context.js";
|
|
4
3
|
import type { Approval } from "#public/definitions/approval.js";
|
|
4
|
+
import type { ToolContext } from "#public/definitions/tool.js";
|
|
5
5
|
import type { SessionAuth } from "#context/keys.js";
|
|
6
6
|
import type { HandleMessageStreamEvent } from "#protocol/message.js";
|
|
7
|
-
type ToolContext = SessionContext & {
|
|
8
|
-
/** Aborts when the active turn is cancelled. */
|
|
9
|
-
readonly abortSignal: AbortSignal;
|
|
10
|
-
/** Final runtime name of the current tool. */
|
|
11
|
-
readonly toolName: string;
|
|
12
|
-
};
|
|
13
7
|
/**
|
|
14
8
|
* Stream event types allowed for dynamic tool resolvers. Dispatch
|
|
15
9
|
* supports any event; this extract restricts the public surface until
|
|
@@ -171,4 +165,3 @@ export declare const SKILL_BRAND: unique symbol;
|
|
|
171
165
|
* are properly wrapped.
|
|
172
166
|
*/
|
|
173
167
|
export declare function isBrandedSkillEntry(value: unknown): boolean;
|
|
174
|
-
export {};
|
|
@@ -15,3 +15,8 @@ export declare function toErrorMessage(error: unknown): string;
|
|
|
15
15
|
* `stack`, and `cause` fields onto a fresh Error.
|
|
16
16
|
*/
|
|
17
17
|
export declare function toError(raw: unknown): Error;
|
|
18
|
+
/**
|
|
19
|
+
* Yields the error itself and every object on its `cause` chain, once
|
|
20
|
+
* each. Cycles terminate the walk instead of looping.
|
|
21
|
+
*/
|
|
22
|
+
export declare function walkCauseChain(error: unknown): Generator<unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isObject}from"#shared/guards.js";function toErrorMessage(t){return t instanceof Error?t.message:typeof t==`string`?t:t==null?String(t):isObject(t)?typeof t.message==`string`&&t.message.length>0?t.message:safeJsonStringify(t):String(t)}function toError(t){if(t instanceof Error)return t;let n=Error(toErrorMessage(t));return isObject(t)?(typeof t.name==`string`&&t.name.length>0&&(n.name=t.name),typeof t.stack==`string`&&t.stack.length>0&&(n.stack=t.stack),`cause`in t&&t.cause!==void 0&&t.cause!==t&&(n.cause=t.cause),n):n}function safeJsonStringify(e){try{return JSON.stringify(e)??String(e)}catch{return String(e)}}export{toError,toErrorMessage};
|
|
1
|
+
import{isObject}from"#shared/guards.js";function toErrorMessage(t){return t instanceof Error?t.message:typeof t==`string`?t:t==null?String(t):isObject(t)?typeof t.message==`string`&&t.message.length>0?t.message:safeJsonStringify(t):String(t)}function toError(t){if(t instanceof Error)return t;let n=Error(toErrorMessage(t));return isObject(t)?(typeof t.name==`string`&&t.name.length>0&&(n.name=t.name),typeof t.stack==`string`&&t.stack.length>0&&(n.stack=t.stack),`cause`in t&&t.cause!==void 0&&t.cause!==t&&(n.cause=t.cause),n):n}function*walkCauseChain(t){let n=new Set,r=t;for(;isObject(r)&&!n.has(r);)n.add(r),yield r,r=r.cause}function safeJsonStringify(e){try{return JSON.stringify(e)??String(e)}catch{return String(e)}}export{toError,toErrorMessage,walkCauseChain};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The AI Gateway service tier a model's `providerOptions` requests:
|
|
3
|
+
* `standard` (no tier authored), the `priority` tier eve's Fast mode writes,
|
|
4
|
+
* or any other authored `custom` tier value.
|
|
5
|
+
*/
|
|
6
|
+
export type GatewayServiceTierState = {
|
|
7
|
+
kind: "standard";
|
|
8
|
+
} | {
|
|
9
|
+
kind: "priority";
|
|
10
|
+
} | {
|
|
11
|
+
kind: "custom";
|
|
12
|
+
value: string;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Reads `gateway.serviceTier` from an unknown-shaped `providerOptions` value
|
|
16
|
+
* (compiled manifest or `/eve/v1/info` payload). Anything absent or malformed
|
|
17
|
+
* reads as `standard`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function readGatewayServiceTier(providerOptions: unknown): GatewayServiceTierState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function readGatewayServiceTier(e){if(typeof e!=`object`||!e||Array.isArray(e))return{kind:`standard`};let t=e.gateway;if(typeof t!=`object`||!t||Array.isArray(t))return{kind:`standard`};let n=t.serviceTier;return typeof n==`string`?n===`priority`?{kind:`priority`}:{kind:`custom`,value:n}:{kind:`standard`}}export{readGatewayServiceTier};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one-line model summary grammar shared by the dev TUI's status line and
|
|
3
|
+
* the /model menu's Change model hint: `slug@level ↯`. One implementation so
|
|
4
|
+
* the two surfaces cannot drift.
|
|
5
|
+
*/
|
|
6
|
+
export declare function formatModelSummary(input: {
|
|
7
|
+
model: string;
|
|
8
|
+
/** Authored reasoning level; omitted renders the bare slug. */
|
|
9
|
+
reasoning?: string;
|
|
10
|
+
/** The Fast mode marker glyph, present only when the priority tier is on. */
|
|
11
|
+
fastGlyph?: string;
|
|
12
|
+
}): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function formatModelSummary(e){let t=e.reasoning===void 0?``:`@${e.reasoning}`,n=e.fastGlyph===void 0?``:` ${e.fastGlyph}`;return`${e.model}${t}${n}`}export{formatModelSummary};
|
|
@@ -8,6 +8,7 @@ export type WorkflowSandboxLifecycle = NonNullable<CodeModeModule.CodeModeOption
|
|
|
8
8
|
export type WorkflowSandboxContinuationSecurity = CodeModeModule.CodeModeContinuationSecurityOptions;
|
|
9
9
|
export declare function installWorkflowSandboxModule(module: WorkflowSandboxModule): void;
|
|
10
10
|
export declare function createWorkflowSandboxTool(input: {
|
|
11
|
+
readonly bridgeRequestLimit: number;
|
|
11
12
|
readonly continuationSecurity: WorkflowSandboxContinuationSecurity;
|
|
12
13
|
readonly hostTools: ToolSet;
|
|
13
14
|
readonly lifecycle?: WorkflowSandboxLifecycle;
|
|
@@ -20,6 +21,7 @@ export declare function requestWorkflowSandboxInterrupt(input: {
|
|
|
20
21
|
}): Promise<unknown>;
|
|
21
22
|
export declare function getWorkflowSandboxInterrupt(result: unknown, continuationSecurity: WorkflowSandboxContinuationSecurity): Promise<WorkflowSandboxInterrupt | undefined>;
|
|
22
23
|
export declare function continueWorkflowSandboxInterrupt(input: {
|
|
24
|
+
readonly bridgeRequestLimit: number;
|
|
23
25
|
readonly continuationSecurity: WorkflowSandboxContinuationSecurity;
|
|
24
26
|
readonly interrupt: WorkflowSandboxInterrupt;
|
|
25
27
|
readonly lifecycle?: WorkflowSandboxLifecycle;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const WORKFLOW_TOOL_NAME=`Workflow`,WORKFLOW_SANDBOX_MODULE_KEY=Symbol.for(`eve.workflowSandbox.module`),WORKFLOW_SANDBOX_MODULE_SPECIFIER=[`#compiled`,`experimental-ai-sdk-code-mode`,`index.js`].join(`/`);let workflowSandboxModulePromise;function installWorkflowSandboxModule(e){globalThis[WORKFLOW_SANDBOX_MODULE_KEY]=e}async function createWorkflowSandboxTool(e){let{createCodeModeTool:t}=await loadWorkflowSandboxModule();return t(e.hostTools,createWorkflowSandboxOptions(e.continuationSecurity,e.lifecycle))}async function requestWorkflowSandboxInterrupt(e){let{requestCodeModeInterrupt:t}=await loadWorkflowSandboxModule();return t(e)}async function getWorkflowSandboxInterrupt(e,t){let{getCodeModeInterrupt:n}=await loadWorkflowSandboxModule();return n(e,t)}async function continueWorkflowSandboxInterrupt(e){let{continueCodeModeInterrupt:t}=await loadWorkflowSandboxModule();return t({interrupt:e.interrupt,options:createWorkflowSandboxOptions(e.continuationSecurity,e.lifecycle),resolution:e.resolution,tools:e.tools})}async function unwrapWorkflowSandboxResult(e,t){let{unwrapCodeModeResult:n}=await loadWorkflowSandboxModule();return n(e,t)}function readWorkflowSandboxResolution(e){if(typeof e!=`object`||!e)return;let t=e.codeModeInterrupt;if(!(typeof t!=`object`||!t))return t.resolution}function createWorkflowSandboxOptions(e,t){let
|
|
1
|
+
const WORKFLOW_TOOL_NAME=`Workflow`,WORKFLOW_SANDBOX_MODULE_KEY=Symbol.for(`eve.workflowSandbox.module`),WORKFLOW_SANDBOX_MODULE_SPECIFIER=[`#compiled`,`experimental-ai-sdk-code-mode`,`index.js`].join(`/`);let workflowSandboxModulePromise;function installWorkflowSandboxModule(e){globalThis[WORKFLOW_SANDBOX_MODULE_KEY]=e}async function createWorkflowSandboxTool(e){let{createCodeModeTool:t}=await loadWorkflowSandboxModule();return t(e.hostTools,createWorkflowSandboxOptions(e.bridgeRequestLimit,e.continuationSecurity,e.lifecycle))}async function requestWorkflowSandboxInterrupt(e){let{requestCodeModeInterrupt:t}=await loadWorkflowSandboxModule();return t(e)}async function getWorkflowSandboxInterrupt(e,t){let{getCodeModeInterrupt:n}=await loadWorkflowSandboxModule();return n(e,t)}async function continueWorkflowSandboxInterrupt(e){let{continueCodeModeInterrupt:t}=await loadWorkflowSandboxModule();return t({interrupt:e.interrupt,options:createWorkflowSandboxOptions(e.bridgeRequestLimit,e.continuationSecurity,e.lifecycle),resolution:e.resolution,tools:e.tools})}async function unwrapWorkflowSandboxResult(e,t){let{unwrapCodeModeResult:n}=await loadWorkflowSandboxModule();return n(e,t)}function readWorkflowSandboxResolution(e){if(typeof e!=`object`||!e)return;let t=e.codeModeInterrupt;if(!(typeof t!=`object`||!t))return t.resolution}function createWorkflowSandboxOptions(e,t,n){let r={continuationSecurity:t,executionPolicy:{maxBridgeRequests:e,maxInFlightBridgeRequests:e}};return n!==void 0&&(r.lifecycle=n),r}async function loadWorkflowSandboxModule(){let e=globalThis[WORKFLOW_SANDBOX_MODULE_KEY];return e===void 0?(workflowSandboxModulePromise??=importWorkflowSandboxModule(WORKFLOW_SANDBOX_MODULE_SPECIFIER),await workflowSandboxModulePromise):e}async function importWorkflowSandboxModule(e){return await import(e)}export{WORKFLOW_TOOL_NAME,continueWorkflowSandboxInterrupt,createWorkflowSandboxTool,getWorkflowSandboxInterrupt,installWorkflowSandboxModule,readWorkflowSandboxResolution,requestWorkflowSandboxInterrupt,unwrapWorkflowSandboxResult};
|