eve 0.54.5 → 0.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +41 -0
- package/dist/src/channel/adapter.d.ts +3 -2
- package/dist/src/channel/audience.d.ts +16 -0
- package/dist/src/channel/audience.js +1 -0
- package/dist/src/channel/conversation-context.d.ts +5 -0
- package/dist/src/channel/conversation-context.js +1 -0
- package/dist/src/channel/instrumentation.js +1 -1
- package/dist/src/channel/types.d.ts +9 -0
- package/dist/src/chunks/{use-eve-agent-CxPlg0KL.js → use-eve-agent-CMdMlS7Y.js} +0 -10
- package/dist/src/chunks/{use-eve-agent-D-KQzzyW.js → use-eve-agent-RUGSwq8b.js} +0 -10
- package/dist/src/cli/commands/agent-prompt/scaffold.md +5 -4
- package/dist/src/cli/commands/init-target.js +2 -2
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/commands/registry-metadata.d.ts +0 -18
- package/dist/src/cli/commands/registry-metadata.js +1 -1
- package/dist/src/cli/commands/registry-pnpm-build-policy-flow.js +1 -1
- package/dist/src/cli/commands/registry.js +1 -1
- package/dist/src/cli/dev/environment.js +1 -1
- package/dist/src/cli/dev/tui/blocks.d.ts +2 -0
- package/dist/src/cli/dev/tui/blocks.js +3 -3
- package/dist/src/cli/dev/tui/markdown.d.ts +8 -1
- package/dist/src/cli/dev/tui/markdown.js +7 -7
- package/dist/src/cli/dev/tui/runner.d.ts +4 -1
- package/dist/src/cli/dev/tui/runner.js +1 -1
- package/dist/src/cli/dev/tui/terminal-renderer.d.ts +5 -1
- package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
- package/dist/src/cli/dev/tui/tui.d.ts +4 -1
- package/dist/src/cli/ui/terminal-text.js +1 -1
- package/dist/src/client/agent-info-schema.d.ts +0 -57
- package/dist/src/client/agent-info-schema.js +1 -1
- package/dist/src/compiled/.vendor-stamp.json +1 -1
- package/dist/src/compiler/extension-compatibility.d.ts +26 -16
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/compiler/manifest.d.ts +12 -11
- package/dist/src/compiler/manifest.js +1 -1
- package/dist/src/compiler/normalize-manifest.js +1 -1
- package/dist/src/compiler/normalize-tool.d.ts +0 -3
- package/dist/src/compiler/normalize-tool.js +1 -1
- package/dist/src/compiler/validate-artifact.js +1 -1
- package/dist/src/context/dynamic-resolve-context.js +1 -1
- package/dist/src/context/keys.d.ts +2 -0
- package/dist/src/context/keys.js +1 -1
- package/dist/src/discover/filesystem.d.ts +3 -1
- package/dist/src/discover/filesystem.js +1 -1
- package/dist/src/discover/skills.js +1 -1
- package/dist/src/dynamic/definition.d.ts +6 -0
- package/dist/src/eve-channel/audience.d.ts +3 -0
- package/dist/src/eve-channel/audience.js +1 -0
- package/dist/src/eve-channel/index.js +1 -1
- package/dist/src/eve-channel/types.d.ts +14 -1
- package/dist/src/execution/activity-work.d.ts +2 -0
- package/dist/src/execution/activity-work.js +1 -1
- package/dist/src/execution/channel-context.js +1 -1
- package/dist/src/execution/coordination-dispatch-shared.d.ts +1 -0
- package/dist/src/execution/coordination-dispatch-shared.js +1 -1
- package/dist/src/execution/coordination-dispatch-step.d.ts +2 -2
- package/dist/src/execution/coordination-dispatch-step.js +1 -1
- package/dist/src/execution/create-session-step.js +1 -1
- package/dist/src/execution/durable-session-store.d.ts +0 -1
- package/dist/src/execution/dynamic-workflow/program-step.d.ts +21 -0
- package/dist/src/execution/dynamic-workflow/program-step.js +1 -0
- package/dist/src/execution/dynamic-workflow/schema.d.ts +36 -0
- package/dist/src/execution/dynamic-workflow/schema.js +1 -0
- package/dist/src/execution/dynamic-workflow/security-step.d.ts +3 -0
- package/dist/src/execution/dynamic-workflow/security-step.js +1 -0
- package/dist/src/execution/dynamic-workflow/tool.d.ts +8 -0
- package/dist/src/execution/dynamic-workflow/tool.js +1 -0
- package/dist/src/execution/dynamic-workflow/workflow.d.ts +10 -0
- package/dist/src/execution/dynamic-workflow/workflow.js +1 -0
- package/dist/src/execution/eve-workflow-attributes.d.ts +2 -1
- package/dist/src/execution/eve-workflow-attributes.js +1 -1
- package/dist/src/execution/inline-turn.js +1 -1
- package/dist/src/execution/model-call-batching.js +1 -1
- package/dist/src/execution/next-driver-action.d.ts +0 -8
- package/dist/src/execution/node-step.d.ts +0 -5
- package/dist/src/execution/node-step.js +1 -1
- package/dist/src/execution/runtime-context.js +1 -1
- package/dist/src/execution/scheduled-launch-delivery.d.ts +7 -0
- package/dist/src/execution/scheduled-launch-delivery.js +1 -0
- package/dist/src/execution/session-activity.js +1 -1
- package/dist/src/execution/session.d.ts +0 -1
- package/dist/src/execution/session.js +2 -2
- package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
- package/dist/src/execution/tasks/child/steps.js +1 -1
- package/dist/src/execution/tasks/parent/delegate.d.ts +9 -0
- package/dist/src/execution/tasks/parent/delegate.js +1 -1
- package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
- package/dist/src/execution/tools/sleep-workflow.js +1 -1
- package/dist/src/execution/tools/subagent/invoke-step.d.ts +4 -0
- package/dist/src/execution/tools/subagent/invoke-step.js +1 -1
- package/dist/src/execution/tools/subagent/start.d.ts +5 -0
- package/dist/src/execution/tools/subagent/start.js +1 -1
- package/dist/src/execution/turn-workflow.js +1 -1
- package/dist/src/execution/wire/session-inbox-contract.d.ts +2 -2
- package/dist/src/execution/wire/session-inbox-contract.js +1 -1
- package/dist/src/execution/wire/session-inbox-encoder.d.ts +6 -2
- package/dist/src/execution/wire/session-inbox-encoder.js +1 -1
- package/dist/src/execution/wire/session-inbox-resume.js +1 -1
- package/dist/src/execution/wire/session-inbox-wire.js +1 -1
- package/dist/src/execution/wire/session-inbox-wire.v7.d.ts +342 -0
- package/dist/src/execution/wire/session-inbox-wire.v7.js +1 -0
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/action-presentation.d.ts +5 -0
- package/dist/src/harness/action-presentation.js +1 -1
- package/dist/src/harness/advertised-tools.d.ts +0 -3
- package/dist/src/harness/advertised-tools.js +1 -1
- package/dist/src/harness/background-tools.d.ts +3 -1
- package/dist/src/harness/emission.js +1 -1
- package/dist/src/harness/step-hooks.js +1 -1
- package/dist/src/harness/tool-loop.js +2 -2
- package/dist/src/harness/tools.js +1 -1
- package/dist/src/harness/types.d.ts +0 -21
- package/dist/src/instrumentation/channel-delivery.js +1 -1
- package/dist/src/instrumentation/content-policy.d.ts +2 -2
- package/dist/src/instrumentation/content.js +1 -1
- package/dist/src/instrumentation/lifecycle.d.ts +5 -7
- package/dist/src/instrumentation/native-events.d.ts +2 -0
- package/dist/src/instrumentation/native-events.js +1 -1
- package/dist/src/instrumentation/principal-summary.d.ts +3 -3
- package/dist/src/instrumentation/runtime-global.d.ts +4 -0
- package/dist/src/instrumentation/runtime-global.js +1 -0
- package/dist/src/instrumentation/runtime.d.ts +5 -9
- package/dist/src/instrumentation/runtime.js +1 -1
- package/dist/src/instrumentation/session-context.d.ts +3 -0
- package/dist/src/instrumentation/session-context.js +1 -1
- package/dist/src/instrumentation/session-init.d.ts +5 -0
- package/dist/src/instrumentation/session-init.js +1 -0
- package/dist/src/instrumentation/setup-context.js +1 -1
- package/dist/src/internal/application/dev-environment.d.ts +3 -0
- package/dist/src/internal/application/dev-environment.js +1 -1
- package/dist/src/internal/application/output-publication-journal.js +1 -1
- package/dist/src/internal/application/output-publication-lock.js +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/authored-definition/connection.js +1 -1
- package/dist/src/internal/authored-definition/schema-backed.d.ts +3 -4
- package/dist/src/internal/authored-definition/schema-backed.js +1 -1
- package/dist/src/internal/instrumentation.d.ts +1 -12
- package/dist/src/internal/instrumentation.js +1 -1
- package/dist/src/internal/logging.js +1 -1
- package/dist/src/internal/nitro/host/build-application.js +1 -1
- package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
- package/dist/src/internal/nitro/host/dev-host-fingerprint.js +1 -1
- package/dist/src/internal/nitro/host/workflow-sandbox-runtime-plugin.js +1 -1
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
- package/dist/src/protocol/activity.d.ts +1 -0
- package/dist/src/protocol/activity.js +1 -1
- package/dist/src/public/channels/chat-sdk/audience.d.ts +8 -0
- package/dist/src/public/channels/chat-sdk/audience.js +1 -1
- package/dist/src/public/channels/chat-sdk/chatSdkChannel.d.ts +0 -2
- package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +1 -1
- package/dist/src/public/channels/discord/audience.js +1 -1
- package/dist/src/public/channels/discord/discordChannel.js +1 -1
- package/dist/src/public/channels/discord/index.d.ts +0 -1
- package/dist/src/public/channels/index.d.ts +2 -3
- package/dist/src/public/channels/slack/activity-plan.js +1 -1
- package/dist/src/public/channels/slack/defaults.d.ts +2 -2
- package/dist/src/public/channels/slack/index.d.ts +1 -1
- package/dist/src/public/channels/slack/slackChannel.d.ts +11 -3
- package/dist/src/public/channels/slack/slackChannel.js +1 -1
- package/dist/src/public/channels/teams/hitl.js +1 -1
- package/dist/src/public/channels/teams/index.d.ts +0 -1
- package/dist/src/public/channels/teams/teamsChannel.js +1 -1
- package/dist/src/public/channels/teams/verify.js +1 -1
- package/dist/src/public/channels/telegram/audience.d.ts +7 -0
- package/dist/src/public/channels/telegram/audience.js +1 -1
- package/dist/src/public/channels/telegram/index.d.ts +0 -1
- package/dist/src/public/channels/telegram/telegramChannel.js +1 -1
- package/dist/src/public/channels/twilio/twilioChannel.d.ts +0 -2
- package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
- package/dist/src/public/connections/index.d.ts +1 -1
- package/dist/src/public/definitions/channel.d.ts +2 -1
- package/dist/src/public/definitions/channel.js +1 -1
- package/dist/src/public/definitions/connections/mcp.d.ts +7 -1
- package/dist/src/public/definitions/connections/openapi.d.ts +1 -1
- package/dist/src/public/definitions/workspace-agent.js +1 -1
- package/dist/src/public/models/openai/chatgpt/auth.js +1 -1
- package/dist/src/public/models/openai/chatgpt/codex-app-server.js +1 -1
- package/dist/src/public/models/openai/chatgpt/credential-store.js +1 -1
- package/dist/src/public/next/index.d.ts +6 -4
- package/dist/src/public/next/index.js +1 -1
- package/dist/src/public/next/server.js +1 -1
- package/dist/src/public/next/vercel-output-config.d.ts +1 -0
- package/dist/src/public/tools/workflow.d.ts +1 -4
- package/dist/src/public/tools/workflow.js +1 -1
- package/dist/src/runtime/agent/mock-model-adapter.js +1 -1
- package/dist/src/runtime/connections/authorization-tokens.d.ts +2 -4
- package/dist/src/runtime/connections/mcp-client.js +1 -1
- package/dist/src/runtime/connections/principal.d.ts +6 -6
- package/dist/src/runtime/connections/principal.js +1 -1
- package/dist/src/runtime/resolve-agent-graph.js +1 -1
- package/dist/src/runtime/resolve-agent.js +1 -1
- package/dist/src/runtime/resolve-connection.js +1 -1
- package/dist/src/runtime/resolve-tool.js +1 -1
- package/dist/src/runtime/sessions/runtime-context-keys.js +1 -1
- package/dist/src/runtime/types.d.ts +4 -9
- package/dist/src/self-modification/agent.d.ts +7 -1
- package/dist/src/self-modification/agent.js +1 -1
- package/dist/src/self-modification/extension/classify-registry-item.d.ts +3 -3
- package/dist/src/self-modification/extension/classify-registry-item.js +1 -1
- package/dist/src/self-modification/extension/tools/search_registry.d.ts +1 -7
- package/dist/src/self-modification/extension/tools/search_registry.js +1 -1
- package/dist/src/setup/flows/chatgpt-auth.js +1 -1
- package/dist/src/setup/flows/registry.js +1 -1
- package/dist/src/setup/integrations/self-modification/setup.js +1 -1
- package/dist/src/setup/provider-settings.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +6 -2
- package/dist/src/shared/channel-audience.d.ts +0 -3
- package/dist/src/shared/channel-definition.d.ts +13 -4
- package/dist/src/shared/connection-types.d.ts +20 -7
- package/dist/src/shared/conversation-context.d.ts +62 -0
- package/dist/src/shared/conversation-context.js +1 -0
- package/dist/src/shared/forwarded-trace-policy.d.ts +2 -1
- package/dist/src/shared/forwarded-trace-policy.js +1 -1
- package/dist/src/shared/instrumentation-channel-kind.d.ts +3 -0
- package/dist/src/shared/instrumentation-channel-kind.js +1 -0
- package/dist/src/shared/instrumentation-content.d.ts +9 -4
- package/dist/src/shared/instrumentation-content.js +1 -1
- package/dist/src/shared/trace-policy.d.ts +7 -6
- package/dist/src/shared/trace-policy.js +1 -1
- package/dist/src/shared/validate-authorization.js +1 -1
- package/dist/src/shared/workflow-sandbox.d.ts +18 -12
- package/dist/src/shared/workflow-sandbox.js +1 -1
- package/dist/src/subagents/handle-dispatch.d.ts +2 -1
- package/dist/src/subagents/handle-dispatch.js +1 -1
- package/dist/src/subagents/remote-dispatch.js +1 -1
- package/dist/src/subagents/start-local.d.ts +1 -0
- package/dist/src/subagents/start-local.js +1 -1
- package/dist/src/subagents/start-remote.d.ts +2 -0
- package/dist/src/subagents/start-remote.js +1 -1
- package/dist/src/subagents/tool.d.ts +3 -0
- package/dist/src/subagents/tool.js +1 -1
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/tasks/session-index.d.ts +13 -0
- package/dist/src/tasks/session-index.js +1 -1
- package/dist/src/tools/auth.d.ts +5 -6
- package/dist/src/tools/provided/workflow.d.ts +12 -0
- package/dist/src/tools/provided/workflow.js +1 -0
- package/dist/src/tools/workflow-program-input.d.ts +6 -0
- package/dist/src/tools/workflow-program-input.js +1 -0
- package/dist/src/tracing/agent-invocation-coordinator.d.ts +3 -2
- package/dist/src/tracing/agent-invocation-coordinator.js +1 -1
- package/dist/src/tracing/agent-memory-instrumentation.d.ts +3 -1
- package/dist/src/tracing/agent-memory-instrumentation.js +1 -1
- package/dist/src/tracing/agent-otel-provider.d.ts +2 -0
- package/dist/src/tracing/agent-otel-provider.js +2 -2
- package/dist/src/tracing/agent-otel-runtime-context.d.ts +2 -1
- package/dist/src/tracing/agent-otel-runtime-context.js +1 -1
- package/dist/src/tracing/agent-otel-session-context.d.ts +2 -0
- package/dist/src/tracing/agent-otel-session-context.js +1 -1
- package/dist/src/tracing/agent-trace-context-codec.js +1 -1
- package/dist/src/tracing/agent-trace-context-store.js +1 -1
- package/dist/src/tracing/agent-trace-state.d.ts +2 -0
- package/dist/src/tracing/content-attributes.js +1 -1
- package/dist/src/tracing/install-instrumentation-runtime.js +1 -1
- package/dist/src/tracing/local-instrumentation-runtime.d.ts +1 -1
- package/dist/src/tracing/local-instrumentation-runtime.js +1 -1
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/docs/agent-config.md +1 -1
- package/docs/channels/chat-sdk.mdx +7 -0
- package/docs/channels/custom.mdx +32 -2
- package/docs/channels/eve.mdx +39 -0
- package/docs/channels/linear.mdx +7 -3
- package/docs/channels/overview.mdx +13 -0
- package/docs/channels/slack.mdx +41 -1
- package/docs/connections/mcp.mdx +18 -1
- package/docs/connections/openapi.mdx +8 -2
- package/docs/connections/overview.mdx +16 -13
- package/docs/getting-started.mdx +1 -1
- package/docs/guides/deployment/self-hosting.md +1 -1
- package/docs/guides/deployment/vercel.mdx +2 -2
- package/docs/guides/dev-tui.md +4 -4
- package/docs/guides/dynamic-capabilities.md +4 -4
- package/docs/guides/frontend/nextjs.mdx +12 -10
- package/docs/guides/hooks.md +1 -1
- package/docs/guides/instrumentation/meta.json +4 -0
- package/docs/guides/instrumentation/otel.mdx +149 -0
- package/docs/guides/instrumentation/overview.md +199 -0
- package/docs/guides/instrumentation/providers.mdx +169 -0
- package/docs/guides/meta.json +0 -1
- package/docs/guides/remote-agents.md +19 -21
- package/docs/install-integrations.mdx +3 -5
- package/docs/patterns/multi-tenant-auth.md +3 -3
- package/docs/reference/cli.md +22 -21
- package/docs/reference/typescript-api.md +9 -9
- package/docs/subagents/index.mdx +5 -3
- package/docs/tools/workflows.mdx +56 -1
- package/package.json +1 -1
- package/dist/src/cli/commands/registry-package.d.ts +0 -52
- package/dist/src/cli/commands/registry-package.js +0 -1
- package/dist/src/harness/workflow-continuation-security.d.ts +0 -5
- package/dist/src/harness/workflow-continuation-security.js +0 -1
- package/dist/src/harness/workflow-interrupt-state.d.ts +0 -20
- package/dist/src/harness/workflow-interrupt-state.js +0 -1
- package/dist/src/harness/workflow-lifecycle.d.ts +0 -32
- package/dist/src/harness/workflow-lifecycle.js +0 -1
- package/dist/src/harness/workflow-sandbox.d.ts +0 -28
- package/dist/src/harness/workflow-sandbox.js +0 -2
- package/dist/src/harness/workflow-subagent-limit.d.ts +0 -28
- package/dist/src/harness/workflow-subagent-limit.js +0 -1
- package/dist/src/harness/workflow-task-state.d.ts +0 -9
- package/dist/src/harness/workflow-task-state.js +0 -1
- package/dist/src/harness/workflow-tool-description.d.ts +0 -22
- package/dist/src/harness/workflow-tool-description.js +0 -37
- package/dist/src/tools/workflow.d.ts +0 -37
- package/dist/src/tools/workflow.js +0 -1
- package/docs/guides/instrumentation-providers.md +0 -247
- package/docs/guides/instrumentation.md +0 -453
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,46 @@
|
|
|
1
1
|
# eve
|
|
2
2
|
|
|
3
|
+
## 0.56.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 8bc931f: Add the `workflow` factory from `eve/tools/workflow` for running model-supplied JavaScript through durable `ctx.agent` calls. Remove the experimental uppercase `Workflow` tool and `experimental_workflow`; migrate its tool file to the new lowercase factory.
|
|
8
|
+
- 6ce61cd: Remove aggregate registry packages and their component-selection flow. Install Linear integrations separately with `eve add channel/linear` and `eve add connection/linear`.
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- 57d6be5: Add queryable metadata to activation spans, including run type, title when input capture permits, provenance, audience, schedule, and directional trace-content policy.
|
|
13
|
+
- a63fb18: Keep background subagents bound to the authentication context of the turn that created their task, even when another caller starts a later turn first.
|
|
14
|
+
- 51998ab: Automatically ignore the self-modification integration's known optional compression packages instead of prompting for its recommended pnpm build policy.
|
|
15
|
+
- 56cde32: Include conversations classified as private in local `eve dev` traces, including sessions authenticated with the developer's Vercel OIDC token.
|
|
16
|
+
- 7ea3b7a: Classify anonymous eve channel sessions as `unknown` by default, so their content is not recorded in preview or production traces unless you mark the audience public explicitly. Also add `credentialOwner` for raw getToken-only auth and `caller` for audience callbacks while preserving existing `principalType` APIs, and fix token cache keys so user identifiers containing separators or percent sequences cannot collide.
|
|
17
|
+
- 23e2e7c: Allow submitting the initial TUI message while eve is still building the agent. The message is queued and sent automatically as soon as the agent is ready.
|
|
18
|
+
- bca1b4a: Self-modification registry setup now asks whether to enable deployed draft pull requests or keep source editing local before collecting deployment configuration.
|
|
19
|
+
- a7f2387: Improve development TUI Markdown with clearer headings, block spacing, clickable links, responsive bordered tables, and code panels. Set `EVE_TUI_RENDER_MARKDOWN=0` to show assistant and subagent responses without Markdown parsing or styling.
|
|
20
|
+
|
|
21
|
+
## 0.55.0
|
|
22
|
+
|
|
23
|
+
### Minor Changes
|
|
24
|
+
|
|
25
|
+
- 0e0f3cc: - Adds `audience(input)` to `defineChannel` and a durable conversation context for trace policies.
|
|
26
|
+
- `eveChannel` now defaults anonymous callers to public and authenticated callers to private. Trace content is public-or-development by default.
|
|
27
|
+
- `metadata().audience` is deprecated. Channel epoch 19 extensions keep working through a warned fallback; move classification to `audience(input)`.
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- c500167: Pass `defaultDeliver()` to custom Slack input handlers so they can delegate selected requests to eve's standard thread or private DM delivery.
|
|
32
|
+
- 520f498: Keep local subagent workflow visibility metadata aligned with the inherited trace decision so Agent Runs does not hide content that was exported for the child.
|
|
33
|
+
- d63d6b7: Attribute local and remote background agent tool activity to its task, including when continuing or steering an existing agent. Each task keeps one progress item, and new work no longer reports against the previous task.
|
|
34
|
+
- bf1175d: Ignore generated module and declaration source maps when discovering skills, so they are not reported as unrecognized skill files.
|
|
35
|
+
- 15c7a2e: Allow `eve init` to add an agent to an existing package without requiring a literal `.` target. You can now initialize the current package or pass the path to an existing package directly.
|
|
36
|
+
- 7a63a68: Keep completed foreground turns in native terminal scrollback while a background subagent continues streaming, rather than hiding them behind the live viewport.
|
|
37
|
+
- bef74fe: Add `protocolVersionDiscovery` to MCP client connections. Set it to `false` to use the initialization handshake for servers that reject modern discovery, while keeping discovery enabled by default.
|
|
38
|
+
- dafa558: Scheduled runs that start background work now stay open and silent until the result is available, then deliver the final response once.
|
|
39
|
+
- 7ad2740: Allow the self-modification agent arguments to set the reasoning effort used by its subagent.
|
|
40
|
+
- 0f79075: Make `withEve()` discover project-level `agents/` workspace members, mounting each named agent through a Next.js app without repeating the agent map in `next.config.ts`. Workspace peers declared with `defineWorkspaceAgent()` route through the named Next.js mount automatically.
|
|
41
|
+
- 09425a0: Move the self-modification registry item to `eve/self-modification`, remove its experimental label and separate production address, and run its production setup flow when added directly.
|
|
42
|
+
- 638aed5: Background task activity now uses a tool's per-call label when one is provided, while retaining the tool or subagent name for execution identity.
|
|
43
|
+
|
|
3
44
|
## 0.54.5
|
|
4
45
|
|
|
5
46
|
### Patch Changes
|
|
@@ -4,7 +4,7 @@ import type { UnstampedMessageStreamEvent } from "#protocol/message.js";
|
|
|
4
4
|
import type { SessionHandle } from "#channel/session.js";
|
|
5
5
|
import type { DeliverPayload } from "#channel/types.js";
|
|
6
6
|
import type { FetchFileContext, FetchFileResult, FetchFileFunction } from "#shared/channel-definition.js";
|
|
7
|
-
import type {
|
|
7
|
+
import type { ChannelAudienceProjector } from "#channel/audience.js";
|
|
8
8
|
/**
|
|
9
9
|
* Context available to every adapter handler (`deliver` and event handlers).
|
|
10
10
|
*
|
|
@@ -73,7 +73,7 @@ export type ChannelEventHandlers<TCtx extends ChannelAdapterContext<any> = Chann
|
|
|
73
73
|
* channel populated at ingestion time.
|
|
74
74
|
*/
|
|
75
75
|
export type { FetchFileContext, FetchFileResult };
|
|
76
|
-
export type ChannelInstrumentationMetadata = Readonly<Record<string, unknown
|
|
76
|
+
export type ChannelInstrumentationMetadata = Readonly<Record<string, unknown>>;
|
|
77
77
|
export type ChannelInstrumentationMetadataProjector = (state: Record<string, unknown> | undefined) => ChannelInstrumentationMetadata;
|
|
78
78
|
/**
|
|
79
79
|
* Plain-object channel adapter with durable state, an optional inbound
|
|
@@ -132,6 +132,7 @@ export type ChannelAdapter<TCtx extends ChannelAdapterContext<any> = ChannelAdap
|
|
|
132
132
|
*/
|
|
133
133
|
readonly instrumentation?: {
|
|
134
134
|
readonly metadata?: ChannelInstrumentationMetadataProjector;
|
|
135
|
+
readonly audience?: ChannelAudienceProjector;
|
|
135
136
|
};
|
|
136
137
|
} & ChannelEventHandlers<TCtx>;
|
|
137
138
|
/**
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ChannelAudience } from "#shared/channel-audience.js";
|
|
2
|
+
import type { AudienceContext } from "#shared/conversation-context.js";
|
|
3
|
+
type ChannelAudienceSource = {
|
|
4
|
+
readonly kind: string;
|
|
5
|
+
readonly state?: Record<string, unknown> | undefined;
|
|
6
|
+
readonly instrumentation?: {
|
|
7
|
+
readonly audience?: ChannelAudienceProjector;
|
|
8
|
+
readonly metadata?: (state: Record<string, unknown> | undefined) => unknown;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export type ChannelAudienceProjector = (input: AudienceContext<Record<string, unknown> | undefined>) => ChannelAudience;
|
|
12
|
+
export declare function resolveAudience(adapter: ChannelAudienceSource, input: AudienceContext<Record<string, unknown> | undefined>): ChannelAudience;
|
|
13
|
+
export declare function createMetadataAudienceProjector(source: {
|
|
14
|
+
readonly kind: string;
|
|
15
|
+
}, metadata: (state: Record<string, unknown> | undefined) => unknown): ChannelAudienceProjector;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{normalizeChannelAudience}from"#shared/channel-audience.js";import{isThenable}from"#shared/guards.js";const deprecatedAudienceChannels=new Set;function warnDeprecatedMetadataAudience(e){deprecatedAudienceChannels.has(e)||(deprecatedAudienceChannels.add(e),console.warn(`channel ${e} uses deprecated metadata audience; move it to the audience() hook`))}function resolveAudience(e,t){return normalize(e,t)}function createMetadataAudienceProjector(e,t){return n=>resolveAudience({kind:e.kind,state:n.state,instrumentation:{metadata:t}},n)}function normalize(e,t){let n=e.instrumentation,r=n?.audience;if(r===void 0){let t=n?.metadata;if(t===void 0)return`unknown`;let r;try{r=t(e.state)}catch{return console.warn(`ignoring deprecated channel audience metadata for channel ${e.kind}`),`unknown`}if(isThenable(r))return console.warn(`ignoring deprecated channel audience metadata for channel ${e.kind}`),Promise.resolve(r).catch(()=>void 0),`unknown`;if(typeof r!=`object`||!r)return`unknown`;let i=r.audience;return i===void 0?`unknown`:(warnDeprecatedMetadataAudience(e.kind),normalizeChannelAudience(i))}try{let e=r(t);return isThenable(e)?(console.warn(`ignoring channel audience classifier because it returned a Promise`),Promise.resolve(e).catch(()=>void 0),`unknown`):normalizeChannelAudience(e)}catch{return console.warn(`ignoring channel audience classifier after failure`),`unknown`}}export{createMetadataAudienceProjector,resolveAudience};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { RunInput, SessionAuthContext } from "#channel/types.js";
|
|
2
|
+
import { type AudienceCaller, type ConversationContext, type ConversationEnvironment } from "#shared/conversation-context.js";
|
|
3
|
+
export declare function buildConversationContext(run: RunInput, environment: ConversationEnvironment): ConversationContext;
|
|
4
|
+
/** Projects route auth into the minimal identity audience classifiers need. */
|
|
5
|
+
export declare function toAudienceCaller(auth: SessionAuthContext | null | undefined): AudienceCaller;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{resolveAudience}from"#channel/audience.js";import{buildChannelInstrumentationProjection}from"#channel/instrumentation.js";import{normalizeInstrumentationChannelKind}from"#shared/instrumentation-channel-kind.js";import{resolveConversationContext}from"#shared/conversation-context.js";import{readForwardedTraceAssertion}from"#shared/forwarded-trace-policy.js";function buildConversationContext(e,t){let n=Object.hasOwn(e,`audienceAuth`)?e.audienceAuth??null:e.auth,r=buildChannelInstrumentationProjection({adapter:e.adapter,channelName:e.channelName}),i={kind:normalizeInstrumentationChannelKind(r.kind),name:e.channelName},a=e.inheritedConversation,o=readForwardedTraceAssertion(e.parentTraceContext?.forwardedTracePolicy),s=o?.originAudience??a?.audience??resolveAudience(e.adapter,{state:e.adapter.state,auth:n,caller:toAudienceCaller(n),channel:i,mode:e.mode,environment:t});return{...resolveConversationContext(void 0,{channelKind:r.kind,environment:t,forwardedTracePolicy:o,mode:e.mode,principalType:n?.principalType}),audience:s,channel:i}}function toAudienceCaller(e){return e==null||e.principalType===`anonymous`?{type:`anonymous`}:{type:`principal`,principal:{attributes:e.attributes,authenticator:e.authenticator,kind:e.principalType}}}export{buildConversationContext,toAudienceCaller};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createLogger}from"#internal/logging.js";import{getAdapterKind}from"#channel/adapter.js";import{isInstrumentationChannelKind,resolveInstrumentationProjection}from"#internal/instrumentation.js";
|
|
1
|
+
import{createLogger}from"#internal/logging.js";import{getAdapterKind}from"#channel/adapter.js";import{isInstrumentationChannelKind,resolveInstrumentationProjection}from"#internal/instrumentation.js";const log=createLogger(`channel.instrumentation`);function buildChannelInstrumentationProjection(e){let{adapter:t,channelName:n,existingKind:r}=e;return{channelType:getAdapterKind(t),kind:resolveKind({adapter:t,channelName:n,existingKind:r}),metadata:resolveMetadata(t)}}function resolveKind(e){let{adapter:t,channelName:n,existingKind:r}=e;if(r!==void 0)return r;if(n!==void 0&&n.length>0)return`channel:${n}`;let i=getAdapterKind(t);return isInstrumentationChannelKind(i)?i:`channel:${i}`}function resolveMetadata(e){let t=e.instrumentation?.metadata;if(t===void 0)return{};let{audience:n,...r}=resolveInstrumentationProjection({invoke:()=>t(e.state),log,source:getAdapterKind(e)})??{};return r}export{buildChannelInstrumentationProjection};
|
|
@@ -10,6 +10,7 @@ import type { AgentLimitsDefinition } from "#shared/agent-definition.js";
|
|
|
10
10
|
import type { JsonObject } from "#shared/json.js";
|
|
11
11
|
import type { InstrumentationDecision } from "#shared/instrumentation-decision.js";
|
|
12
12
|
import type { ForwardedTraceAssertion } from "#shared/forwarded-trace-policy.js";
|
|
13
|
+
import type { ConversationContext } from "#shared/conversation-context.js";
|
|
13
14
|
import type { TaskAgentRequestDelivery, TaskAuthorizationEventDelivery, TaskInputRequestDelivery, TaskView } from "#tasks/types.js";
|
|
14
15
|
export type { ContextAccessor } from "#context/key.js";
|
|
15
16
|
export type { ChannelInstrumentationProjection } from "#channel/instrumentation.js";
|
|
@@ -388,6 +389,8 @@ export interface RunInput {
|
|
|
388
389
|
*/
|
|
389
390
|
readonly channelName?: string;
|
|
390
391
|
readonly channelMetadata?: ChannelInstrumentationProjection;
|
|
392
|
+
/** Parent conversation classification inherited by a local subagent. */
|
|
393
|
+
readonly inheritedConversation?: ConversationContext;
|
|
391
394
|
/** Inbound channel operation that created this session. */
|
|
392
395
|
readonly delivery?: ChannelDeliveryMetadata;
|
|
393
396
|
/**
|
|
@@ -395,6 +398,12 @@ export interface RunInput {
|
|
|
395
398
|
* request was accepted with no credentials.
|
|
396
399
|
*/
|
|
397
400
|
readonly auth: SessionAuthContext | null;
|
|
401
|
+
/**
|
|
402
|
+
* Route-authenticated principal used to classify the conversation. This
|
|
403
|
+
* stays separate from `auth` because a channel may project a different
|
|
404
|
+
* principal into session auth after route authentication.
|
|
405
|
+
*/
|
|
406
|
+
readonly audienceAuth?: SessionAuthContext | null;
|
|
398
407
|
/**
|
|
399
408
|
* Session-level capabilities. When omitted, every flag is
|
|
400
409
|
* interpreted as `false`. Channel routes that can reach a human
|
|
@@ -337,14 +337,6 @@ const compositionDiagnostic = z.object({
|
|
|
337
337
|
sourceId: z.string(),
|
|
338
338
|
winnerSourceId: z.string().optional()
|
|
339
339
|
}).strict();
|
|
340
|
-
const workflow = z.discriminatedUnion("enabled", [z.object({
|
|
341
|
-
enabled: z.literal(false),
|
|
342
|
-
toolName: z.string()
|
|
343
|
-
}).strict(), z.object({
|
|
344
|
-
enabled: z.literal(true),
|
|
345
|
-
source,
|
|
346
|
-
toolName: z.string()
|
|
347
|
-
}).strict()]);
|
|
348
340
|
const AgentInfoResultSchema = z.object({
|
|
349
341
|
agent: z.object({
|
|
350
342
|
agentRoot: z.string(),
|
|
@@ -399,7 +391,6 @@ const AgentInfoResultSchema = z.object({
|
|
|
399
391
|
static: z.array(tool)
|
|
400
392
|
}).strict(),
|
|
401
393
|
version: z.literal(4),
|
|
402
|
-
workflow,
|
|
403
394
|
workspace: z.object({
|
|
404
395
|
resourceRoot: z.unknown(),
|
|
405
396
|
rootEntries: z.array(z.string())
|
|
@@ -503,7 +494,6 @@ const AgentInfoResultSchema = z.object({
|
|
|
503
494
|
"static",
|
|
504
495
|
index
|
|
505
496
|
]]),
|
|
506
|
-
...value.workflow.enabled ? [[value.workflow.source, ["workflow", "source"]]] : [],
|
|
507
497
|
[value.sandbox, ["sandbox"]]
|
|
508
498
|
];
|
|
509
499
|
for (const [entry, path] of boundSources) {
|
|
@@ -337,14 +337,6 @@ const compositionDiagnostic = z.object({
|
|
|
337
337
|
sourceId: z.string(),
|
|
338
338
|
winnerSourceId: z.string().optional()
|
|
339
339
|
}).strict();
|
|
340
|
-
const workflow = z.discriminatedUnion("enabled", [z.object({
|
|
341
|
-
enabled: z.literal(false),
|
|
342
|
-
toolName: z.string()
|
|
343
|
-
}).strict(), z.object({
|
|
344
|
-
enabled: z.literal(true),
|
|
345
|
-
source,
|
|
346
|
-
toolName: z.string()
|
|
347
|
-
}).strict()]);
|
|
348
340
|
const AgentInfoResultSchema = z.object({
|
|
349
341
|
agent: z.object({
|
|
350
342
|
agentRoot: z.string(),
|
|
@@ -399,7 +391,6 @@ const AgentInfoResultSchema = z.object({
|
|
|
399
391
|
static: z.array(tool)
|
|
400
392
|
}).strict(),
|
|
401
393
|
version: z.literal(4),
|
|
402
|
-
workflow,
|
|
403
394
|
workspace: z.object({
|
|
404
395
|
resourceRoot: z.unknown(),
|
|
405
396
|
rootEntries: z.array(z.string())
|
|
@@ -503,7 +494,6 @@ const AgentInfoResultSchema = z.object({
|
|
|
503
494
|
"static",
|
|
504
495
|
index
|
|
505
496
|
]]),
|
|
506
|
-
...value.workflow.enabled ? [[value.workflow.source, ["workflow", "source"]]] : [],
|
|
507
497
|
[value.sandbox, ["sandbox"]]
|
|
508
498
|
];
|
|
509
499
|
for (const [entry, path] of boundSources) {
|
|
@@ -16,9 +16,10 @@ the interactive terminal UI.
|
|
|
16
16
|
If the user wants a reusable extension package instead of an agent, run
|
|
17
17
|
`npx eve@latest extension init <name>` and follow that command's next steps.
|
|
18
18
|
|
|
19
|
-
For an existing app, run `npx eve@latest init
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
For an existing app, run `npx eve@latest init` from its directory, or pass its
|
|
20
|
+
path with `npx eve@latest init path/to/app`. This adds the agent and missing
|
|
21
|
+
dependencies while leaving the existing Git repository and app scripts alone.
|
|
22
|
+
Append `--model provider/model-id` or `--reasoning effort` to either init command
|
|
23
|
+
when the user chose those settings. If init cannot be used,
|
|
23
24
|
install by hand with
|
|
24
25
|
`npm install eve@latest ai zod`; manual installation does not add package scripts.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{InitTargetError}from"./init-telemetry.js";import{readdir,stat}from"node:fs/promises";import{basename,isAbsolute,relative,resolve,sep}from"node:path";import{PROJECT_NAME_ERROR,parseProjectName}from"#setup/project-name.js";import{classifyAgentRootEntry,getDirectoryEntryType}from"#discover/filesystem.js";const ENVIRONMENT_ONLY_ENTRIES=new Set([`.DS_Store`,`.editorconfig`,`.gitattributes`,`.gitignore`,`.git`,`.idea`,`.vscode`]);async function pathKind(e){let t=await stat(e).catch(e=>{if(e.code!==`ENOENT`)throw e});return t===void 0?`missing`:t.isDirectory()?`directory`:`other`}function isEnvironmentOnly(e){return e.every(e=>ENVIRONMENT_ONLY_ENTRIES.has(e))}async function isAgentRoot(e){return(await readdir(e,{withFileTypes:!0}).catch(()=>[])).some(e=>{let t=classifyAgentRootEntry(e.name,getDirectoryEntryType(e));return t!==`unknown`&&t!==`ignored-directory`&&t!==`lib-directory`})}async function isExistingEveProject(e,t){
|
|
2
|
-
`)}function assertTargetStaysWithinParent(e,t,n){if(t===void 0||isAbsolute(t))return;let r=relative(e,n);if(r===`..`||r.startsWith(`..${sep}`))throw new InitTargetError(`target_invalid`,PROJECT_NAME_ERROR)}async function resolveInitTarget(e){let t=resolve(e.parentDirectory),n=
|
|
1
|
+
import{InitTargetError}from"./init-telemetry.js";import{readdir,stat}from"node:fs/promises";import{basename,isAbsolute,relative,resolve,sep}from"node:path";import{PROJECT_NAME_ERROR,parseProjectName}from"#setup/project-name.js";import{classifyAgentRootEntry,getDirectoryEntryType}from"#discover/filesystem.js";const ENVIRONMENT_ONLY_ENTRIES=new Set([`.DS_Store`,`.editorconfig`,`.gitattributes`,`.gitignore`,`.git`,`.idea`,`.vscode`]);async function pathKind(e){let t=await stat(e).catch(e=>{if(e.code!==`ENOENT`)throw e});return t===void 0?`missing`:t.isDirectory()?`directory`:`other`}function isEnvironmentOnly(e){return e.every(e=>ENVIRONMENT_ONLY_ENTRIES.has(e))}async function isAgentRoot(e){return(await readdir(e,{withFileTypes:!0}).catch(()=>[])).some(e=>{let t=classifyAgentRootEntry(e.name,getDirectoryEntryType(e));return t!==`unknown`&&t!==`ignored-directory`&&t!==`lib-directory`})}async function isExistingEveProject(e,t){if(await isAgentRoot(e)||(t.includes(`package.json`)||t.includes(`vercel.json`))&&t.includes(`agent`)&&await isAgentRoot(resolve(e,`agent`)))return!0;if(!t.includes(`agents`))return!1;let n=await readdir(resolve(e,`agents`),{withFileTypes:!0}).catch(()=>[]);if(!t.includes(`package.json`))return!1;for(let t of n){if(!t.isDirectory()||t.name.startsWith(`.`))continue;let n=resolve(e,`agents`,t.name);if(await pathKind(resolve(n,`agent`))===`directory`||await isAgentRoot(n))return!0}return!1}function listEntries(e){return e.map(e=>` - ${e}`).join(`
|
|
2
|
+
`)}function assertTargetStaysWithinParent(e,t,n){if(t===void 0||isAbsolute(t))return;let r=relative(e,n);if(r===`..`||r.startsWith(`..${sep}`))throw new InitTargetError(`target_invalid`,PROJECT_NAME_ERROR)}async function resolveInitTarget(e){let t=resolve(e.parentDirectory),n=resolve(t,e.target??`.`);assertTargetStaysWithinParent(t,e.target,n);let r=n===t,i;try{i=await pathKind(n)}catch(e){throw new InitTargetError(`target_filesystem`,`Could not access the initialization target: ${e instanceof Error?e.message:String(e)}`)}if(i===`other`)throw new InitTargetError(`target_invalid`,`Cannot initialize an agent because "${n}" is not a directory.`);if(i===`missing`){let e;try{e=parseProjectName(basename(n))}catch(e){throw new InitTargetError(`target_invalid`,e instanceof Error?e.message:String(e))}return{createInPlace:!1,failurePolicy:`remove`,kind:`fresh`,overwriteExisting:!1,preservedEntries:[],projectName:e,projectPath:n}}let a;try{a=(await readdir(n)).sort()}catch(e){throw new InitTargetError(`target_filesystem`,`Could not read the initialization target: ${e instanceof Error?e.message:String(e)}`)}if(a.length===0||isEnvironmentOnly(a)){let e;try{e=r?`.`:parseProjectName(basename(n))}catch(e){throw new InitTargetError(`target_invalid`,e instanceof Error?e.message:String(e))}return{createInPlace:r||a.length>0,failurePolicy:`clear`,kind:`fresh`,overwriteExisting:!1,preservedEntries:a,projectName:e,projectPath:n}}if(await isExistingEveProject(n,a))throw new InitTargetError(`target_conflict`,`An eve project already exists at "${n}". Run \`eve dev\` from that directory, or use an existing-project command.`);if(a.includes(`package.json`))return{kind:`existing`,projectPath:n};throw new InitTargetError(`target_conflict`,`Cannot initialize an agent in the non-empty directory "${n}". Move or remove these entries, or choose an empty target:\n${listEntries(a)}`)}export{resolveInitTarget};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{initAgentDevHandoff,initAgentReadySummary,initAgentReplPrompt}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{InitTargetError}from"./init-telemetry.js";import{addAgentsToWorkspace,convertScaffoldToAgentWorkspace,formatWorkspaceRootMutationWarning}from"./init-agent-workspace.js";import{NPM_NOISE_LINE,installProgressDetail,packageManagerInstallFailureCode}from"./init-install.js";import{reportExistingProjectChanges}from"./init-project.js";import{cleanupFreshInitTarget,workspaceFailureNote}from"./init-recovery.js";import{selectInitHandoff,spawnCodingAgentRepl}from"./init-repl.js";import{selectInitSelfModification}from"./init-self-modification.js";import{resolveInitTarget}from"./init-target.js";import{mkdtemp,readdir,rename,rm}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,resolve}from"node:path";import pc from"#compiled/picocolors/index.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/index.js";import{eveDevArguments,packageManagerInstallFailureMessage,packageManagerInstallSucceeded,resultSucceeded,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";import{validateModelSlug}from"#setup/flows/model-source-change.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";import{WizardCancelledError}from"#setup/step.js";import{isPackageManagerWorkspaceMember}from"#setup/scaffold/workspace-root.js";const defaultDependencies={addAgentToProject,detectInvokingPackageManager,detectPackageManager,ensureChannel,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldBaseProject,selectInitHandoff,selectInitSelfModification,installSelfModification:async e=>{let{installRegistryItem:t}=await import(`./registry.js`);await t(e,`experimental/self-modification`,{silent:!0})},spawnCodingAgentRepl,spawnPackageManager,tryInitializeGit,validateModelSlug},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`init`);async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}async function addToExistingProject(e,t,n,r){if(t.channelWebNextjs===!0)throw Error("`--channel-web-nextjs` is not supported when adding an agent to an existing project. Run `eve add channel/web` from the project afterwards instead.");if(t.model!==void 0){let r=await n.validateModelSlug(e,t.model);if(r!==null)throw Error(r)}let i=await n.detectPackageManager(e),a=await n.addAgentToProject({projectRoot:e,model:t.model??DEFAULT_AGENT_MODEL_ID,reasoning:t.reasoning,packageManager:i.kind,evePackage:r});return{configurationFilesChanged:a.configurationFilesChanged,dependenciesAdded:a.dependenciesAdded,filesWritten:a.filesWritten,packageManager:i.kind,nodeEngineOverride:a.nodeEngineOverride}}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldProject(e,t,n,r,i,a,o,s){let c=resolve(e,`..`),l=!n&&await pathExists(e)&&(await readdir(e)).length===0;if(!n&&await pathExists(e)&&!l)throw Error(`Cannot create project because "${e}" already exists.`);let u=n&&s?void 0:await mkdtemp(join(c,`.eve-init-`)),d=[];try{let c=u??e;if(i.model!==void 0){let e=await a.validateModelSlug(c,i.model);if(e!==null)throw Error(e)}let f={projectName:u===void 0?`.`:n?basename(e):t,model:i.model??DEFAULT_AGENT_MODEL_ID,reasoning:i.reasoning,evePackage:o,targetDirectory:c,overwriteExisting:s,workspaceProbeDirectory:e,packageManager:r,onWorkspaceRootMutation:e=>{d.push(e)}},p=await a.scaffoldBaseProject(f);return i.agents!==void 0&&await convertScaffoldToAgentWorkspace(p,i.agents,i),i.channelWebNextjs===!0&&await a.ensureChannel({projectRoot:p,kind:`web`,packageManager:r,force:s,workspaceProbeDirectory:e,configureVercelServices:!1,onWorkspaceRootMutation:e=>{d.push(e)}}),u!==void 0&&(n||l?await moveDirectoryContents(p,e):await rename(p,e)),{projectPath:e,workspaceRootMutations:uniqueWorkspaceRootMutations(d)}}finally{u!==void 0&&await rm(u,{recursive:!0,force:!0})}}async function runInitSteps(e){let{agentLaunched:t,dependencies:n,logger:r,options:i,parentDirectory:a,target:o,trackStep:s,trackTerminal:c}=e,l=isLogLevelEnabled(`debug`),u=await resolveInitTarget({parentDirectory:a,target:o}),d=resolveInitEvePackageOverride(),f=!t&&i.agents===void 0&&await n.selectInitSelfModification(),p=startCliLiveRow(r),m=`scaffold`,h;p.update(`Preparing project`);try{let e=u.kind===`fresh`?`creating agent`:`adding agent`;s?.(m),p.update(u.kind===`fresh`?`Creating agent`:`Adding agent`),initLog.debug(e);let a=n.now(),o;if(u.kind===`fresh`){let e=await resolveScaffoldPackageManager(u.projectPath,n),t=isPackageManagerWorkspaceMember(e,u.projectPath),r;try{r=await scaffoldProject(u.projectPath,u.projectName,u.createInPlace,e,i,n,d,u.overwriteExisting)}catch(e){if(u.failurePolicy===`clear`){let n=await cleanupFreshInitTarget(u.projectPath,u.failurePolicy,u.preservedEntries),r=e instanceof Error?e.message:String(e),i=n?`eve restored "${u.projectPath}" to its original state.`:`eve could not completely clean "${u.projectPath}".`;throw Error(`${r}\n\n${i}${workspaceFailureNote(t)}`)}if(u.failurePolicy===`remove`&&t){let t=e instanceof Error?e.message:String(e);throw Error(`${t}${workspaceFailureNote(!0)}`)}throw e}o={failurePolicy:u.failurePolicy,kind:`created`,packageManager:e,preservedTargetEntries:u.preservedEntries,projectPath:r.projectPath,retryCommand:`eve init ${u.projectPath}`,workspaceMember:t,workspaceRootMutations:r.workspaceRootMutations}}else{let e=await addToExistingProject(u.projectPath,i,n,d);o=e.nodeEngineOverride===void 0?{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,packageManager:e.packageManager,projectPath:u.projectPath}:{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,nodeEngineOverride:e.nodeEngineOverride,packageManager:e.packageManager,projectPath:u.projectPath}}let c=n.now()-a;initLog.debug(`${e} done`,{ms:c}),o.kind===`added`&&(p.stop(),reportExistingProjectChanges(r,o),p=startCliLiveRow(r)),m=`install_dependencies`,s?.(m),p.update(`Installing dependencies`,`${o.packageManager} install`),initLog.debug(`installing dependencies with ${o.packageManager}`);let g=n.now(),_=[],v=[],y=await n.runPackageManagerInstall(o.packageManager,o.projectPath,{progressDetails:process.stdout.isTTY===!0&&!l,onOutput:e=>{e.text.trim()!==``&&(v.push(e.text),v.length>20&&v.shift(),NPM_NOISE_LINE.test(e.text)||_.push(e.text)),l&&initLog.debug(e.text);let t=installProgressDetail(o.packageManager,e);t!==void 0&&p.update(`Installing dependencies`,t)}}),b=n.now()-g;if(!packageManagerInstallSucceeded(y)){h=packageManagerInstallFailureCode(y),initLog.debug(`dependency installation failed`,{ms:b}),p.stop();let e=_.length>0?_:v;for(let t of e)r.error(t);if(e.length===0){let e=packageManagerInstallFailureMessage(y);e!==void 0&&r.error(e)}if(o.failurePolicy!==`preserve`){if(await cleanupFreshInitTarget(o.projectPath,o.failurePolicy,o.preservedTargetEntries)){let e=o.failurePolicy===`remove`?`eve removed the incomplete project at "${o.projectPath}".`:`eve restored "${o.projectPath}" to its original state.`,t=o.workspaceMember||o.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies.\n\n${e}\n\nResolve the package-manager error above, then retry:\n ${o.retryCommand}${workspaceFailureNote(t)}`)}let e=o.workspaceMember||o.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies, and eve could not completely clean "${o.projectPath}".\n\nResolve the package-manager error above, then install dependencies with ${o.packageManager} in that directory. Or clean the target manually before rerunning eve init.${workspaceFailureNote(e)}`)}throw Error(`The eve agent was added, but dependency installation failed.\n\nResolve the package-manager error above, then install dependencies with ${o.packageManager} in "${o.projectPath}".\n\nDo not rerun eve init; the agent is already configured.`)}return initLog.debug(`dependencies installed`,{ms:b}),f&&(m=`registry_install`,s?.(m),p.update(`Enabling self-modification`),await n.installSelfModification(o.projectPath)),o.kind===`created`?(m=`initialize_git`,s?.(m),p.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),{...o,agentElapsedMs:c,agentLaunched:t,gitResult:await n.tryInitializeGit(o.projectPath),installElapsedMs:b,selfModificationEnabled:f}):{...o,agentElapsedMs:c,agentLaunched:t,installElapsedMs:b,selfModificationEnabled:f}}catch(e){throw c?.(m,`error`,m===`install_dependencies`?h:void 0),e}finally{p.stop()}}async function runInitCommand(e,t,n,r,i=defaultDependencies,a,o){a?.(`resolve_target`);let s;try{if(await addAgentsToWorkspace(e,t,n,r,i.validateModelSlug)){a?.(`handoff`),o?.(`handoff`,`completed`);return}s=await runInitSteps({agentLaunched:await i.isCodingAgentLaunch(),dependencies:i,logger:e,options:r,parentDirectory:t,target:n,trackStep:a,trackTerminal:o})}catch(e){if(e instanceof WizardCancelledError){o?.(`resolve_target`,`cancelled`);return}throw e instanceof InitTargetError&&o?.(`resolve_target`,`error`,e.failureCode),e}if(a?.(`handoff`),s.kind===`created`){e.log(`${pc.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${pc.bold(s.projectPath)} ${pc.dim(`in ${formatElapsed(s.agentElapsedMs)}`)}`);for(let t of s.workspaceRootMutations)e.log(pc.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`))}else e.log(`${pc.green(`✓`)} Added an ${EVE_WORDMARK} agent to ${pc.bold(s.projectPath)} ${pc.dim(`in ${formatElapsed(s.agentElapsedMs)}`)}`);e.log(`${pc.green(`✓`)} Installed dependencies ${pc.dim(`in ${formatElapsed(s.installElapsedMs)}`)}`),s.selfModificationEnabled&&e.log(`${pc.green(`✓`)} Enabled self-modification`),s.kind===`created`&&s.gitResult.kind===`failed`&&(e.error(pc.yellow(`Git initialization failed during ${s.gitResult.stage}: ${s.gitResult.reason}`)),s.gitResult.stage===`commit`&&e.error(pc.yellow(`The eve agent was created successfully. Git repository metadata and staged files were preserved at "${s.projectPath}"; the initial commit is optional.\n\nTo create it later, configure Git identity and run:\n git -C ${JSON.stringify(s.projectPath)} commit -m "Initial commit from eve"`)));let c=eveDevArguments(s.packageManager),l=[s.packageManager,...c].join(` `),u=initAgentDevHandoff({projectPath:s.projectPath,devCommand:l});if(s.agentLaunched){e.log(initAgentReadySummary(r.model,s.projectPath,{workspace:r.agents!==void 0})),e.log(u);return}let d;if(s.selfModificationEnabled)d=`eve-dev`;else try{d=await i.selectInitHandoff({agentName:basename(s.projectPath)})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(d===`exit`)return;if(d!==`eve-dev`){if(e.log(pc.dim(`$ ${d}`)),!await i.spawnCodingAgentRepl({command:d,cwd:s.projectPath,prompt:initAgentReplPrompt({devCommand:l}),onPromptUnseeded:t=>{e.log(pc.yellow(`Could not seed ${d} automatically. Paste this prompt into it:`)),e.log(t)}}))throw Error(`Coding-agent REPL exited unsuccessfully in "${s.projectPath}".`);return}let f=s.kind===`created`?[...c,`--onboard`]:c;if(e.log(pc.dim(`$ eve dev`)),!resultSucceeded(await i.spawnPackageManager(s.packageManager,s.projectPath,f)))throw Error(`Development server exited unsuccessfully in "${s.projectPath}".`)}function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(e!==void 0&&e.length!==0)return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}export{EVE_INIT_PACKAGE_SPEC_ENV,runInitCommand};
|
|
1
|
+
import{initAgentDevHandoff,initAgentReadySummary,initAgentReplPrompt}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{InitTargetError}from"./init-telemetry.js";import{addAgentsToWorkspace,convertScaffoldToAgentWorkspace,formatWorkspaceRootMutationWarning}from"./init-agent-workspace.js";import{NPM_NOISE_LINE,installProgressDetail,packageManagerInstallFailureCode}from"./init-install.js";import{reportExistingProjectChanges}from"./init-project.js";import{cleanupFreshInitTarget,workspaceFailureNote}from"./init-recovery.js";import{selectInitHandoff,spawnCodingAgentRepl}from"./init-repl.js";import{selectInitSelfModification}from"./init-self-modification.js";import{resolveInitTarget}from"./init-target.js";import{mkdtemp,readdir,rename,rm}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,resolve}from"node:path";import pc from"#compiled/picocolors/index.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/index.js";import{eveDevArguments,packageManagerInstallFailureMessage,packageManagerInstallSucceeded,resultSucceeded,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";import{validateModelSlug}from"#setup/flows/model-source-change.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";import{WizardCancelledError}from"#setup/step.js";import{isPackageManagerWorkspaceMember}from"#setup/scaffold/workspace-root.js";const defaultDependencies={addAgentToProject,detectInvokingPackageManager,detectPackageManager,ensureChannel,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldBaseProject,selectInitHandoff,selectInitSelfModification,installSelfModification:async e=>{let{installRegistryItem:t}=await import(`./registry.js`);await t(e,`eve/self-modification`,{silent:!0,skipSetup:!0})},spawnCodingAgentRepl,spawnPackageManager,tryInitializeGit,validateModelSlug},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`init`);async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}async function addToExistingProject(e,t,n,r){if(t.channelWebNextjs===!0)throw Error("`--channel-web-nextjs` is not supported when adding an agent to an existing project. Run `eve add channel/web` from the project afterwards instead.");if(t.model!==void 0){let r=await n.validateModelSlug(e,t.model);if(r!==null)throw Error(r)}let i=await n.detectPackageManager(e),a=await n.addAgentToProject({projectRoot:e,model:t.model??DEFAULT_AGENT_MODEL_ID,reasoning:t.reasoning,packageManager:i.kind,evePackage:r});return{configurationFilesChanged:a.configurationFilesChanged,dependenciesAdded:a.dependenciesAdded,filesWritten:a.filesWritten,packageManager:i.kind,nodeEngineOverride:a.nodeEngineOverride}}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldProject(e,t,n,r,i,a,o,s){let c=resolve(e,`..`),l=!n&&await pathExists(e)&&(await readdir(e)).length===0;if(!n&&await pathExists(e)&&!l)throw Error(`Cannot create project because "${e}" already exists.`);let u=n&&s?void 0:await mkdtemp(join(c,`.eve-init-`)),d=[];try{let c=u??e;if(i.model!==void 0){let e=await a.validateModelSlug(c,i.model);if(e!==null)throw Error(e)}let f={projectName:u===void 0?`.`:n?basename(e):t,model:i.model??DEFAULT_AGENT_MODEL_ID,reasoning:i.reasoning,evePackage:o,targetDirectory:c,overwriteExisting:s,workspaceProbeDirectory:e,packageManager:r,onWorkspaceRootMutation:e=>{d.push(e)}},p=await a.scaffoldBaseProject(f);return i.agents!==void 0&&await convertScaffoldToAgentWorkspace(p,i.agents,i),i.channelWebNextjs===!0&&await a.ensureChannel({projectRoot:p,kind:`web`,packageManager:r,force:s,workspaceProbeDirectory:e,configureVercelServices:!1,onWorkspaceRootMutation:e=>{d.push(e)}}),u!==void 0&&(n||l?await moveDirectoryContents(p,e):await rename(p,e)),{projectPath:e,workspaceRootMutations:uniqueWorkspaceRootMutations(d)}}finally{u!==void 0&&await rm(u,{recursive:!0,force:!0})}}async function runInitSteps(e){let{agentLaunched:t,dependencies:n,logger:r,options:i,parentDirectory:a,target:o,trackStep:s,trackTerminal:c}=e,l=isLogLevelEnabled(`debug`),u=await resolveInitTarget({parentDirectory:a,target:o}),d=resolveInitEvePackageOverride(),f=!t&&i.agents===void 0&&await n.selectInitSelfModification(),p=startCliLiveRow(r),m=`scaffold`,h;p.update(`Preparing project`);try{let e=u.kind===`fresh`?`creating agent`:`adding agent`;s?.(m),p.update(u.kind===`fresh`?`Creating agent`:`Adding agent`),initLog.debug(e);let a=n.now(),o;if(u.kind===`fresh`){let e=await resolveScaffoldPackageManager(u.projectPath,n),t=isPackageManagerWorkspaceMember(e,u.projectPath),r;try{r=await scaffoldProject(u.projectPath,u.projectName,u.createInPlace,e,i,n,d,u.overwriteExisting)}catch(e){if(u.failurePolicy===`clear`){let n=await cleanupFreshInitTarget(u.projectPath,u.failurePolicy,u.preservedEntries),r=e instanceof Error?e.message:String(e),i=n?`eve restored "${u.projectPath}" to its original state.`:`eve could not completely clean "${u.projectPath}".`;throw Error(`${r}\n\n${i}${workspaceFailureNote(t)}`)}if(u.failurePolicy===`remove`&&t){let t=e instanceof Error?e.message:String(e);throw Error(`${t}${workspaceFailureNote(!0)}`)}throw e}o={failurePolicy:u.failurePolicy,kind:`created`,packageManager:e,preservedTargetEntries:u.preservedEntries,projectPath:r.projectPath,retryCommand:`eve init ${u.projectPath}`,workspaceMember:t,workspaceRootMutations:r.workspaceRootMutations}}else{let e=await addToExistingProject(u.projectPath,i,n,d);o=e.nodeEngineOverride===void 0?{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,packageManager:e.packageManager,projectPath:u.projectPath}:{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,nodeEngineOverride:e.nodeEngineOverride,packageManager:e.packageManager,projectPath:u.projectPath}}let c=n.now()-a;initLog.debug(`${e} done`,{ms:c}),o.kind===`added`&&(p.stop(),reportExistingProjectChanges(r,o),p=startCliLiveRow(r)),m=`install_dependencies`,s?.(m),p.update(`Installing dependencies`,`${o.packageManager} install`),initLog.debug(`installing dependencies with ${o.packageManager}`);let g=n.now(),_=[],v=[],y=await n.runPackageManagerInstall(o.packageManager,o.projectPath,{progressDetails:process.stdout.isTTY===!0&&!l,onOutput:e=>{e.text.trim()!==``&&(v.push(e.text),v.length>20&&v.shift(),NPM_NOISE_LINE.test(e.text)||_.push(e.text)),l&&initLog.debug(e.text);let t=installProgressDetail(o.packageManager,e);t!==void 0&&p.update(`Installing dependencies`,t)}}),b=n.now()-g;if(!packageManagerInstallSucceeded(y)){h=packageManagerInstallFailureCode(y),initLog.debug(`dependency installation failed`,{ms:b}),p.stop();let e=_.length>0?_:v;for(let t of e)r.error(t);if(e.length===0){let e=packageManagerInstallFailureMessage(y);e!==void 0&&r.error(e)}if(o.failurePolicy!==`preserve`){if(await cleanupFreshInitTarget(o.projectPath,o.failurePolicy,o.preservedTargetEntries)){let e=o.failurePolicy===`remove`?`eve removed the incomplete project at "${o.projectPath}".`:`eve restored "${o.projectPath}" to its original state.`,t=o.workspaceMember||o.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies.\n\n${e}\n\nResolve the package-manager error above, then retry:\n ${o.retryCommand}${workspaceFailureNote(t)}`)}let e=o.workspaceMember||o.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies, and eve could not completely clean "${o.projectPath}".\n\nResolve the package-manager error above, then install dependencies with ${o.packageManager} in that directory. Or clean the target manually before rerunning eve init.${workspaceFailureNote(e)}`)}throw Error(`The eve agent was added, but dependency installation failed.\n\nResolve the package-manager error above, then install dependencies with ${o.packageManager} in "${o.projectPath}".\n\nDo not rerun eve init; the agent is already configured.`)}return initLog.debug(`dependencies installed`,{ms:b}),f&&(m=`registry_install`,s?.(m),p.update(`Enabling self-modification`),await n.installSelfModification(o.projectPath)),o.kind===`created`?(m=`initialize_git`,s?.(m),p.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),{...o,agentElapsedMs:c,agentLaunched:t,gitResult:await n.tryInitializeGit(o.projectPath),installElapsedMs:b,selfModificationEnabled:f}):{...o,agentElapsedMs:c,agentLaunched:t,installElapsedMs:b,selfModificationEnabled:f}}catch(e){throw c?.(m,`error`,m===`install_dependencies`?h:void 0),e}finally{p.stop()}}async function runInitCommand(e,t,n,r,i=defaultDependencies,a,o){a?.(`resolve_target`);let s;try{if(await addAgentsToWorkspace(e,t,n,r,i.validateModelSlug)){a?.(`handoff`),o?.(`handoff`,`completed`);return}s=await runInitSteps({agentLaunched:await i.isCodingAgentLaunch(),dependencies:i,logger:e,options:r,parentDirectory:t,target:n,trackStep:a,trackTerminal:o})}catch(e){if(e instanceof WizardCancelledError){o?.(`resolve_target`,`cancelled`);return}throw e instanceof InitTargetError&&o?.(`resolve_target`,`error`,e.failureCode),e}if(a?.(`handoff`),s.kind===`created`){e.log(`${pc.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${pc.bold(s.projectPath)} ${pc.dim(`in ${formatElapsed(s.agentElapsedMs)}`)}`);for(let t of s.workspaceRootMutations)e.log(pc.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`))}else e.log(`${pc.green(`✓`)} Added an ${EVE_WORDMARK} agent to ${pc.bold(s.projectPath)} ${pc.dim(`in ${formatElapsed(s.agentElapsedMs)}`)}`);e.log(`${pc.green(`✓`)} Installed dependencies ${pc.dim(`in ${formatElapsed(s.installElapsedMs)}`)}`),s.selfModificationEnabled&&e.log(`${pc.green(`✓`)} Enabled self-modification`),s.kind===`created`&&s.gitResult.kind===`failed`&&(e.error(pc.yellow(`Git initialization failed during ${s.gitResult.stage}: ${s.gitResult.reason}`)),s.gitResult.stage===`commit`&&e.error(pc.yellow(`The eve agent was created successfully. Git repository metadata and staged files were preserved at "${s.projectPath}"; the initial commit is optional.\n\nTo create it later, configure Git identity and run:\n git -C ${JSON.stringify(s.projectPath)} commit -m "Initial commit from eve"`)));let c=eveDevArguments(s.packageManager),l=[s.packageManager,...c].join(` `),u=initAgentDevHandoff({projectPath:s.projectPath,devCommand:l});if(s.agentLaunched){e.log(initAgentReadySummary(r.model,s.projectPath,{workspace:r.agents!==void 0})),e.log(u);return}let d;if(s.selfModificationEnabled)d=`eve-dev`;else try{d=await i.selectInitHandoff({agentName:basename(s.projectPath)})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(d===`exit`)return;if(d!==`eve-dev`){if(e.log(pc.dim(`$ ${d}`)),!await i.spawnCodingAgentRepl({command:d,cwd:s.projectPath,prompt:initAgentReplPrompt({devCommand:l}),onPromptUnseeded:t=>{e.log(pc.yellow(`Could not seed ${d} automatically. Paste this prompt into it:`)),e.log(t)}}))throw Error(`Coding-agent REPL exited unsuccessfully in "${s.projectPath}".`);return}let f=s.kind===`created`?[...c,`--onboard`]:c;if(e.log(pc.dim(`$ eve dev`)),!resultSucceeded(await i.spawnPackageManager(s.packageManager,s.projectPath,f)))throw Error(`Development server exited unsuccessfully in "${s.projectPath}".`)}function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(e!==void 0&&e.length!==0)return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}export{EVE_INIT_PACKAGE_SPEC_ENV,runInitCommand};
|
|
@@ -38,12 +38,6 @@ declare const EveRegistryMetadataSchema: z.ZodObject<{
|
|
|
38
38
|
bin: string;
|
|
39
39
|
args: string[];
|
|
40
40
|
}>>>;
|
|
41
|
-
components: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
42
|
-
item: z.ZodString;
|
|
43
|
-
label: z.ZodString;
|
|
44
|
-
description: z.ZodOptional<z.ZodString>;
|
|
45
|
-
default: z.ZodDefault<z.ZodBoolean>;
|
|
46
|
-
}, z.core.$strip>>>;
|
|
47
41
|
}, z.core.$strip>;
|
|
48
42
|
export type RegistrySearchMetadata = Pick<z.infer<typeof EveRegistryMetadataSchema>, "docs" | "hidden" | "implementation">;
|
|
49
43
|
/** Parses eve-owned metadata from a registry item manifest. */
|
|
@@ -67,12 +61,6 @@ export declare function eveMetadataFromRegistryItem(item: unknown): {
|
|
|
67
61
|
bin: string;
|
|
68
62
|
args: string[];
|
|
69
63
|
}[] | undefined;
|
|
70
|
-
components?: {
|
|
71
|
-
item: string;
|
|
72
|
-
label: string;
|
|
73
|
-
description?: string | undefined;
|
|
74
|
-
default: boolean;
|
|
75
|
-
}[] | undefined;
|
|
76
64
|
} | undefined;
|
|
77
65
|
/** Extracts search metadata from the eve-owned official registry catalog. */
|
|
78
66
|
export declare function parseOfficialRegistrySearchMetadata(input: unknown): ReadonlyMap<string, RegistrySearchMetadata>;
|
|
@@ -99,12 +87,6 @@ export declare function parseRegistryPresentationManifest(input: unknown): {
|
|
|
99
87
|
bin: string;
|
|
100
88
|
args: string[];
|
|
101
89
|
}[] | undefined;
|
|
102
|
-
components?: {
|
|
103
|
-
item: string;
|
|
104
|
-
label: string;
|
|
105
|
-
description?: string | undefined;
|
|
106
|
-
default: boolean;
|
|
107
|
-
}[] | undefined;
|
|
108
90
|
} | undefined;
|
|
109
91
|
} | undefined;
|
|
110
92
|
title?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{z}from"#compiled/zod/index.js";const RegistrySetupSchema=z.object({package:z.string().min(1),bin:z.string().min(1),args:z.array(z.string()).default([])}),ExactPackageNameSchema=z.string().regex(/^(?:@[a-z0-9][a-z0-9._~-]*\/)?[a-z0-9][a-z0-9._~-]*$/u),PnpmBuildScriptPolicySchema=z.object({packages:z.array(ExactPackageNameSchema).min(1),optional:z.literal(!0),recommendedAction:z.literal(`ignore-optional`),reason:z.string().min(1)}),EveRegistryMetadataSchema=z.object({requires:z.string().optional(),docs:z.string().min(1).optional(),implementation:z.enum([`native`,`chat-sdk`]).optional(),hidden:z.literal(!0).optional(),install:z.object({pnpm:z.object({buildScripts:z.array(PnpmBuildScriptPolicySchema).min(1)}).optional()}).optional(),setup:z.union([RegistrySetupSchema,z.array(RegistrySetupSchema).min(1)]).transform(e=>Array.isArray(e)?e:[e]).optional()}),EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:EveRegistryMetadataSchema.optional()}).optional()}),OfficialRegistryCatalogSchema=z.object({items:z.array(z.object({name:z.string().min(1),meta:z.object({eve:EveRegistryMetadataSchema.optional()}).optional()}))}),RegistryPresentationManifestSchema=EveRegistryItemMetadataSchema.extend({title:z.string().optional(),description:z.string().optional(),dependencies:z.array(z.string()).optional(),files:z.array(z.object({target:z.string()})).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}function parseOfficialRegistrySearchMetadata(e){let{items:t}=OfficialRegistryCatalogSchema.parse(e),n=new Map;for(let e of t){let{docs:t,hidden:r,implementation:i}=e.meta?.eve??{};(t!==void 0||r!==void 0||i!==void 0)&&n.set(e.name,{docs:t,hidden:r,implementation:i})}return n}function parseRegistryPresentationManifest(e){return RegistryPresentationManifestSchema.safeParse(e).data}export{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata,parseRegistryPresentationManifest};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{applyPnpmBuildPolicy,inspectPnpmBuildPolicy}from"./registry-pnpm-build-policy.js";import{createPrompter}from"#setup/prompter.js";import{detectPackageManager}from"#setup/package-manager.js";import{WizardCancelledError}from"#setup/step.js";const PNPM_BUILD_POLICY_ANSWER_KEY=`install.pnpm.buildScripts
|
|
1
|
+
import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{applyPnpmBuildPolicy,inspectPnpmBuildPolicy}from"./registry-pnpm-build-policy.js";import{createPrompter}from"#setup/prompter.js";import{detectPackageManager}from"#setup/package-manager.js";import{WizardCancelledError}from"#setup/step.js";const PNPM_BUILD_POLICY_ANSWER_KEY=`install.pnpm.buildScripts`,AUTO_ACCEPT_RECOMMENDED_ITEMS=new Set([`eve/self-modification`]);function pnpmBuildPolicyChoice(e){return e===`ignore-optional`||e===`allow-builds`||e===`abort`?e:void 0}async function prepareDeclaredPnpmBuildPolicy(e,t={}){if(e.policies===void 0||e.policies.length===0)return!0;let n={detectPackageManager:t.detectPackageManager??detectPackageManager,inspectPnpmBuildPolicy:t.inspectPnpmBuildPolicy??inspectPnpmBuildPolicy,applyPnpmBuildPolicy:t.applyPnpmBuildPolicy??applyPnpmBuildPolicy,createPrompter:t.createPrompter??createPrompter};if((await n.detectPackageManager(e.appRoot)).kind!==`pnpm`)return!0;for(let t of e.policies){let r=await n.inspectPnpmBuildPolicy(e.appRoot,t.packages);if(r.satisfied)continue;let i=e.options.answers?.[PNPM_BUILD_POLICY_ANSWER_KEY],a=pnpmBuildPolicyChoice(i);if(i!==void 0&&a===void 0)throw Error(`${PNPM_BUILD_POLICY_ANSWER_KEY} must be "ignore-optional", "allow-builds", or "abort".`);if(a===void 0&&AUTO_ACCEPT_RECOMMENDED_ITEMS.has(e.item)&&(a=t.recommendedAction),e.options.nonInteractive&&a===void 0&&e.options.yes!==!0){let n={key:PNPM_BUILD_POLICY_ANSWER_KEY,kind:`select`,message:`How should pnpm handle these optional packages?`,required:!0,recommended:t.recommendedAction,options:[{id:`ignore-optional`,label:`Ignore optional packages`},{id:`allow-builds`,label:`Allow build scripts`},{id:`abort`,label:`Abort add`}]};return e.logger.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,item:e.item,installed:!1,completedItems:[],status:`input_required`,question:n,next:headlessSetupContinuation({item:e.item,installed:!1,question:n})})),process.exitCode=2,!1}if(a===void 0&&e.options.yes===!0&&(a=t.recommendedAction),a===void 0){let i=e.options.prompter??n.createPrompter();try{a=await i.select({message:`How should pnpm handle these optional packages?`,description:t.reason,metadata:[{label:`Packages`,value:t.packages.join(`, `)},{label:`Policy file`,value:r.filePath}],hintLayout:`inline`,initialValue:t.recommendedAction,options:[{value:`ignore-optional`,label:`Ignore optional packages (recommended)`,hint:`Add the item without installing these packages or running their build scripts.`},{value:`allow-builds`,label:`Allow build scripts`,hint:`Install these packages and allow their third-party build scripts to run.`},{value:`abort`,label:`Abort add`,hint:`Do not add this registry item.`}]})}catch(e){if(!(e instanceof WizardCancelledError))throw e;return!1}}if(a===`abort`)return e.options.nonInteractive&&e.logger.log(serializeHeadlessSetupEvent({version:1,type:`cancelled`,item:e.item,completedItems:[]})),!1;if(a===void 0)throw Error(`pnpm build policy selection is required.`);await n.applyPnpmBuildPolicy(r,a)}return!0}export{prepareDeclaredPnpmBuildPolicy};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hasInteractiveTerminal}from"./preconditions.js";import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{assertCanInstallWebChat,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{prepareDeclaredPnpmBuildPolicy}from"./registry-pnpm-build-policy-flow.js";import{runRegistryPackage}from"./registry-package.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.js";import{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);a===itemAddress(`channel/web`)&&await assertCanInstallWebChat(t);let o=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 s=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([a],{config:o}))[0],()=>printAddSuggestions(e,t,n));if(!s.found)return;let c=s.item,l=isOfficialItemAddress(a)?eveMetadataFromRegistryItem(c):void 0;if(assertCompatibleEveVersion(l?.requires),l?.components!==void 0){if(!isOfficialItemAddress(a))throw Error(`Registry packages require the official eve registry.`);let s=await runRegistryPackage({logger:e,appRoot:t,item:n,components:l.components,config:o,options:r,dependencies:i,operations:{itemAddress,metadata:eveMetadataFromRegistryItem,assertCompatibleVersion:assertCompatibleEveVersion,runSetups:({item:n,setups:a,prompter:o})=>runDeclaredSetups({logger:e,appRoot:t,item:n,setups:a,options:{yes:r.yes,force:r.overwrite,nonInteractive:r.nonInteractive,answers:r.answers,prompter:o,signal:r.signal},dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)}),setupReminder:e=>setupReminder(e,`skipped`)}});return reportRegistryCompletion(e,n,s,r)}if(r.skipInstall===!0){if(l?.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:l.setup,options:r,dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)});return reportRegistryCompletion(e,n,a,r)}if(!await prepareDeclaredPnpmBuildPolicy({logger:e,appRoot:t,item:n,policies:l?.install?.pnpm?.buildScripts,options:r}))return!1;if(a===itemAddress(`channel/web`)&&await(i.prepareWebRegistryProject??prepareWebRegistryProject)(t),await installRegistryItemTransaction({appRoot:t,item:n,registryItem:c,nonInteractive:r.nonInteractive,logger:e,install:async()=>{await addRegistryItems([a],{config:o,cwd:t,overwrite:r.overwrite,silent:r.silent})}}),l?.setup===void 0)return reportRegistryCompletion(e,n,{facts:[]},r);let u=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&&!u&&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 d=await runDeclaredSetups({logger:e,appRoot:t,item:n,setups:l.setup,options:{...r,force:r.overwrite},dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)});return reportRegistryCompletion(e,n,d,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{assertCanInstallWebChat,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);a===itemAddress(`channel/web`)&&await assertCanInstallWebChat(t);let o=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 s=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([a],{config:o}))[0],()=>printAddSuggestions(e,t,n));if(!s.found)return;let c=s.item,l=isOfficialItemAddress(a)?eveMetadataFromRegistryItem(c):void 0;if(assertCompatibleEveVersion(l?.requires),r.skipInstall===!0){if(l?.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:l.setup,options:r,dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)});return reportRegistryCompletion(e,n,a,r)}if(!await prepareDeclaredPnpmBuildPolicy({logger:e,appRoot:t,item:n,policies:l?.install?.pnpm?.buildScripts,options:r}))return!1;if(a===itemAddress(`channel/web`)&&await(i.prepareWebRegistryProject??prepareWebRegistryProject)(t),await installRegistryItemTransaction({appRoot:t,item:n,registryItem:c,nonInteractive:r.nonInteractive,logger:e,install:async()=>{await addRegistryItems([a],{config:o,cwd:t,overwrite:r.overwrite,silent:r.silent})}}),l?.setup===void 0)return reportRegistryCompletion(e,n,{facts:[]},r);let u=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&&!u&&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 d=await runDeclaredSetups({logger:e,appRoot:t,item:n,setups:l.setup,options:{...r,force:r.overwrite},dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)});return reportRegistryCompletion(e,n,d,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 +1 @@
|
|
|
1
|
-
import{join,resolve}from"node:path";import{readFileSync}from"node:fs";import{parseEnv}from"node:util";import{findEveProjectRoot}from"#internal/eve-project-root.js";import{
|
|
1
|
+
import{isObject}from"#shared/guards.js";import{join,resolve}from"node:path";import{readFileSync}from"node:fs";import{parseEnv}from"node:util";import{findEveProjectRoot}from"#internal/eve-project-root.js";import{readProviderSelectionSync}from"#setup/provider-settings.js";const DEVELOPMENT_ENV_FILE_NAMES=[`.env.development.local`,`.env.local`,`.env.development`,`.env`];function isMissingEnvironmentFileError(e){return isObject(e)&&e.code===`ENOENT`}const developmentEnvironmentLoaders=new Map;function getDevelopmentEnvironmentFilePaths(e){return DEVELOPMENT_ENV_FILE_NAMES.map(t=>join(getDevelopmentEnvironmentLoader(e).environmentRoot,t))}async function loadDevelopmentEnvironmentFiles(e){let t=resolve(e);getDevelopmentEnvironmentLoader(t,await findEveProjectRoot(t)).reload()}function stageDevelopmentEnvironmentFiles(e){return getDevelopmentEnvironmentLoader(e).stageReload()}function readDevelopmentEnvironmentHostValues(e){let t={},n=readDevelopmentEnvironmentValues(getDevelopmentEnvironmentLoader(e).environmentRoot),r=new Set(n.keys());r.add(`AI_GATEWAY_API_KEY`);for(let e of[...r].sort((e,t)=>e.localeCompare(t)))t[e]=process.env[e]??null;return t}function getDevelopmentEnvironmentLoader(e,t){let n=resolve(e),r=developmentEnvironmentLoaders.get(n);if(r!==void 0&&t===void 0)return r;let i=resolve(t??n);if(r?.environmentRoot===i)return r;let a=createDevelopmentEnvironmentLoader(n,i);return developmentEnvironmentLoaders.set(n,a),a}function createDevelopmentEnvironmentLoader(e,t){let n=new Map(Object.entries(process.env)),r=new Set(n.keys()),i=new Map,stageReload=()=>{let a=new Map(i),o=readDevelopmentEnvironmentValues(t),s=applyProviderSelection(e,o),c=new Set([...i.keys(),...o.keys()]);s?(c.add(`AI_GATEWAY_API_KEY`),r.delete(`AI_GATEWAY_API_KEY`)):n.has(`AI_GATEWAY_API_KEY`)&&(r.add(`AI_GATEWAY_API_KEY`),process.env.AI_GATEWAY_API_KEY=n.get(`AI_GATEWAY_API_KEY`));let l=new Map([...c].map(e=>[e,process.env[e]])),u=!1;return s&&delete process.env.AI_GATEWAY_API_KEY,applyDevelopmentEnvironmentValues({managedValues:i,nextValues:o,protectedKeys:r}),{commit(){u=!0},rollback(){if(!u){u=!0,i.clear();for(let[e,t]of a)i.set(e,t);for(let[e,t]of l)t===void 0?delete process.env[e]:process.env[e]=t}}}};return{environmentRoot:t,reload(){stageReload().commit()},stageReload}}function applyProviderSelection(e,t){return readProviderSelectionSync(e)===`ai-gateway-project`&&(t.delete(`AI_GATEWAY_API_KEY`),!0)}function applyDevelopmentEnvironmentValues(e){for(let[t,n]of e.managedValues)e.nextValues.has(t)||e.protectedKeys.has(t)||(process.env[t]===n&&delete process.env[t],e.managedValues.delete(t));for(let[t,n]of e.nextValues)e.protectedKeys.has(t)||(process.env[t]=n,e.managedValues.set(t,n))}function readDevelopmentEnvironmentValues(e){let t=new Map;for(let n of[...DEVELOPMENT_ENV_FILE_NAMES].reverse())try{let r=parseEnv(readFileSync(join(e,n),`utf8`));for(let[e,n]of Object.entries(r))n!==void 0&&t.set(e,n)}catch(e){if(!isMissingEnvironmentFileError(e))throw e}return t}export{DEVELOPMENT_ENV_FILE_NAMES,getDevelopmentEnvironmentFilePaths,loadDevelopmentEnvironmentFiles,readDevelopmentEnvironmentHostValues,stageDevelopmentEnvironmentFiles};
|
|
@@ -113,6 +113,8 @@ export interface ToolGroupItem {
|
|
|
113
113
|
export interface RenderBlockContext {
|
|
114
114
|
/** Current shared square-pulse frame for live activity blocks. */
|
|
115
115
|
activityPulse: string;
|
|
116
|
+
/** Whether prose responses are parsed and styled as Markdown. */
|
|
117
|
+
renderMarkdown?: boolean;
|
|
116
118
|
/**
|
|
117
119
|
* Kind and title of the block rendered immediately above this one. Lets a
|
|
118
120
|
* sandbox block detect that it continues a run (label suppressed, lines
|
|
@@ -1,6 +1,6 @@
|
|
|
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);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);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`todo-list`:case`agent-header`:return(e.body??``).split(`
|
|
2
|
-
`)}}function renderUser(e,t,n){let r=n.colors.cyan(n.glyph.user),i=wrap(e.body??``,t-2).map(e=>`${r} ${e}`),a=n.colors.cyan(n.glyph.arrowUp);return e.promptOrigin===`steer`?[a,...i]:e.promptOrigin===`queue`?[...i,a]:i}function renderProse(e,t,n){let
|
|
3
|
-
`).flatMap(e=>wrapVisibleLine(e,t-
|
|
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);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`todo-list`:case`agent-header`:return(e.body??``).split(`
|
|
2
|
+
`)}}function renderUser(e,t,n){let r=n.colors.cyan(n.glyph.user),i=wrap(e.body??``,t-2).map(e=>`${r} ${e}`),a=n.colors.cyan(n.glyph.arrowUp);return e.promptOrigin===`steer`?[a,...i]:e.promptOrigin===`queue`?[...i,a]:i}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
|
+
`).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
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 n=t.colors,r=e.status===`error`?`${n.red(t.glyph.error)} `:``;return[`${n.cyan(t.glyph.user)} ${r}${n.blue(e.body??``)}`]}function paintOutcomeMarker(e,t,n=e){let r=n.trimStart().slice(0,1);return r===`✓`?e.replace(r,t.colors.green(t.glyph.success)):r===`⨯`?e.replace(r,t.colors.red(t.glyph.error)):r===`–`?e.replace(r,t.colors.yellow(t.glyph.dash)):e}function renderFlow(e,t,n){let r=n.colors,i=e.title??`info`,a=i===`success`?r.green(n.glyph.success):i===`warning`?r.yellow(n.glyph.warning):i===`error`?r.red(n.glyph.error):r.dim(n.glyph.dot),o=wrap(e.body??``,t-2),paint=e=>i===`info`?r.dim(e):paintOutcomeMarker(e,n);return o.map((e,t)=>`${t===0?a:` `} ${paint(e)}`)}function renderResult(e,t,n){let r=wrap(e.body??``,t-7);if(e.status===`done`){let e=n.colors.dim(n.glyph.elbow),t=n.colors.green(n.glyph.success),i=n.colors.dim(n.glyph.rule),a=n.colors.dim(n.glyph.corner);return r.length===0?[` ${e} ${t}`]:r.map((n,o)=>o===0?` ${e} ${t} ${n}`:` ${o===r.length-1?a:i} ${n}`)}let i=n.colors.dim(n.glyph.elbow);if(r.length===0)return[` ${i}`];let dim=e=>paintOutcomeMarker(n.colors.dim(e.replaceAll(`\x1B[22m`,`\x1B[22m\x1B[2m`)),n,e);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(`
|
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Whether prose responses should be parsed and styled as Markdown.
|
|
3
|
+
* `EVE_TUI_RENDER_MARKDOWN=0` bypasses Markdown parsing and styling.
|
|
4
|
+
*/
|
|
5
|
+
export declare function detectMarkdownRendering(env?: {
|
|
6
|
+
readonly EVE_TUI_RENDER_MARKDOWN?: string;
|
|
7
|
+
}): boolean;
|
|
8
|
+
/** Renders parsed GFM blocks for terminal presentation. */
|
|
2
9
|
export declare function renderMarkdown(input: string, width?: number): string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{sliceVisible,visibleLength}from"#cli/ui/terminal-text.js";import{lexer}from"#compiled/marked/index.js";const ansi={bold:`\x1B[1m`,boldOff:`\x1B[22m`,
|
|
2
|
-
`)}function renderBlocks(e,t){let
|
|
3
|
-
`));break;case`code`:
|
|
4
|
-
`));break;case`def`:break;default:
|
|
5
|
-
`);
|
|
6
|
-
`;case`checkbox`:return e.checked
|
|
7
|
-
`,` `)}function normalizeTableRow(e,t){return Array.from({length:t},(t,n)=>e[n]??{text:``,tokens:[]})}function normalizeAlignment(e){return e??`left`}function
|
|
1
|
+
import{sliceVisible,stripAnsi,visibleLength}from"#cli/ui/terminal-text.js";import{lexer}from"#compiled/marked/index.js";import{graphemes}from"#shared/text-boundaries.js";const ansi={bold:`\x1B[1m`,boldOff:`\x1B[22m`,inlineCode:`\x1B[38;5;245m`,inlineCodeOff:`\x1B[39m`,dim:`\x1B[2m`,dimOff:`\x1B[22m`,italic:`\x1B[3m`,italicOff:`\x1B[23m`,strike:`\x1B[9m`,strikeOff:`\x1B[29m`,underline:`\x1B[4m`,underlineOff:`\x1B[24m`};function detectMarkdownRendering(e){let t=e?.EVE_TUI_RENDER_MARKDOWN??process.env.EVE_TUI_RENDER_MARKDOWN;return t!==`0`&&t!==`false`}function renderMarkdown(e,t=1/0){return trimTrailingBlankRows(renderBlocks(lexer(e),t,!0)).join(`
|
|
2
|
+
`)}function renderBlocks(e,t,n=!1){let r=[];for(let i of e){switch(i.type){case`space`:pushBlankRow(r);break;case`heading`:r.push(renderHeading(i.depth??1,i.tokens));break;case`paragraph`:case`text`:r.push(...renderInline(i.tokens,i.text).split(`
|
|
3
|
+
`));break;case`code`:r.push(...renderCodeBlock(i,t));break;case`blockquote`:r.push(...renderBlocks(i.tokens??[],Math.max(1,t-2)).map(e=>`${ansi.dim}│${ansi.dimOff} ${e}`));break;case`list`:r.push(...renderList(i,t));break;case`table`:r.push(...renderTable(i,t));break;case`hr`:r.push(ansi.dim+`─`.repeat(horizontalRuleWidth(t))+ansi.dimOff);break;case`html`:r.push(...(i.text??i.raw??``).split(`
|
|
4
|
+
`));break;case`def`:break;default:i.tokens===void 0?i.text!==void 0&&r.push(i.text):r.push(...renderBlocks(i.tokens,t))}n&&isVisibleBlock(i)&&pushBlankRow(r)}return r}function isVisibleBlock(e){return e.type!==`space`&&e.type!==`def`}function renderHeading(e,t){let n=e===1||e===3||e===5,r=e===1||e===2||e===4,i=renderInline(t,``,{restoreAfterStrong:(e===4||e===5||e>=6)&&!r?ansi.dim:``,restoreUnderlineAfterLink:n,suppressBold:r});switch(e){case 1:return`${ansi.bold}${ansi.underline}${i}${ansi.underlineOff}${ansi.boldOff}`;case 2:return`${ansi.bold}${i}${ansi.boldOff}`;case 3:return`${ansi.underline}${i}${ansi.underlineOff}`;case 4:return`${ansi.bold}${ansi.dim}${i}${ansi.boldOff}`;case 5:return`${ansi.dim}${ansi.underline}${i}${ansi.underlineOff}${ansi.dimOff}`;default:return`${ansi.dim}${i}${ansi.dimOff}`}}function renderCodeBlock(e,t){let n=e.lang?.trim()??``,r=(e.text??``).replace(/\n$/u,``).split(`
|
|
5
|
+
`),i=Math.max(1,...r.map(visibleLength));if(!Number.isFinite(t)||t>5){let e=Math.min(Number.isFinite(t)?Math.floor(t):i,Math.max(6,i,visibleLength(n)+4));return[n.length>0?codePanelHeader(n,e):codePanelRule(e),...r.flatMap(t=>wrapCodeRow(t,e)),codePanelRule(e)]}return r.flatMap(e=>wrapCodeRow(e,Math.max(1,Math.floor(t))))}function codePanelHeader(e,t){let n=sliceVisible(e,Math.max(1,t-4))||`?`;return`${ansi.dim}─ ${n} ${`─`.repeat(Math.max(0,t-3-visibleLength(n)))}${ansi.dimOff}`}function codePanelRule(e){return`${ansi.dim}${`─`.repeat(e)}${ansi.dimOff}`}function wrapCodeRow(e,t){if(e.length===0)return[``];let n=e.match(/^[\t ]*/u)?.[0]??``,r=[],i=e,a=!1;for(;i.length>0;){let e=a&&visibleLength(n)<t?n:``,o=Math.max(1,t-visibleLength(e)),s=sliceVisible(i,o),c=s.length===0?firstGraphemeFallback(i):void 0,l=c?.rendered??s;r.push(`${e}${l}`),i=i.slice(c?.consumed??s.length),a=!0}return r}function renderList(e,t){let n=[],r=typeof e.start==`number`?e.start:1;for(let i of e.items??[]){let a=e.ordered?`${ansi.dim}${r}.${ansi.dimOff}`:`${ansi.dim}•${ansi.dimOff}`,o=e.ordered?`${r}.`.length:1,s=i.checked===!0?`✓ `:i.checked===!1?`☐ `:``,c=renderBlocks(i.tokens??[],Math.max(1,t-o-1));(c.length===0?[``]:c).forEach((e,t)=>{n.push(t===0?`${a} ${s}${e}`:`${` `.repeat(o+1)}${e}`)}),r+=1}return n}function renderInline(e,t=``,n={}){if(e===void 0)return t;let r=``;for(let t of e)t.type===`image`&&r.endsWith(` `)&&(r=`${r.slice(0,-1)}\u00a0`),r+=renderInlineToken(t,n);return r}function renderInlineToken(e,t){switch(e.type){case`text`:return renderInline(e.tokens,e.text??``,t);case`strong`:{let n=renderInline(e.tokens,e.text,t);return t.suppressBold?n:`${ansi.bold}${n}${ansi.boldOff}${t.restoreAfterStrong??``}`}case`em`:return`${ansi.italic}${renderInline(e.tokens,e.text,t)}${ansi.italicOff}`;case`del`:return`${ansi.strike}${renderInline(e.tokens,e.text,t)}${ansi.strikeOff}`;case`codespan`:return`${ansi.inlineCode}${e.text??``}${ansi.inlineCodeOff}`;case`link`:return renderLink(renderInline(e.tokens,e.text,t),e.href??``,t.restoreUnderlineAfterLink);case`image`:return renderLink(`▧\u00a0${(e.text?.trim()||`image`).replaceAll(` `,`\xA0`)}`,e.href??``,t.restoreUnderlineAfterLink);case`br`:return`
|
|
6
|
+
`;case`checkbox`:return e.checked?`✓ `:`☐ `;case`escape`:return e.text??``;case`html`:return e.text??e.raw??``;default:return renderInline(e.tokens,e.text??e.raw??``,t)}}function renderLink(e,t,n=!1){if(!isSafeLinkUrl(t))return e;let r=n?ansi.underline:``;return`\x1b]8;;${t}\x1b\\${ansi.underline}${e}${ansi.underlineOff}\x1b]8;;\x1b\\${r}`}function isSafeLinkUrl(e){return e.length>0&&Buffer.byteLength(e,`utf8`)<=2083&&[...e].every(e=>{let t=e.codePointAt(0)??0;return t>=32&&t!==127&&(t<128||t>159)})}function renderTable(e,t){let n=e.header??[];if(n.length===0)return[];let r=n.map((t,n)=>normalizeAlignment(e.align?.[n])),i=n.map(renderTableCell),a=(e.rows??[]).map(e=>normalizeTableRow(e,n.length).map(renderTableCell)),o=[i,...a],s=r.map((e,t)=>Math.max(1,...o.map(e=>visibleLength(e[t]??``)))),c=s.reduce((e,t)=>e+t,0)+s.length*3+1;if(s.length>0&&(!Number.isFinite(t)||c<=t)){let e=i.map(e=>`${ansi.bold}${e}${ansi.boldOff}`);return[formatTableBorder(s,`┌`,`┬`,`┐`),formatBoxedTableRow(e,s,r),formatTableBorder(s,`├`,`┼`,`┤`),...a.flatMap((e,t)=>[formatBoxedTableRow(e,s,r),...t+1<a.length?[formatTableBorder(s,`├`,`┼`,`┤`)]:[]]),formatTableBorder(s,`└`,`┴`,`┘`)]}return renderVerticalTable(i,a,t)}function renderTableCell(e){return renderInline(e.tokens,e.text).replaceAll(`
|
|
7
|
+
`,` `)}function normalizeTableRow(e,t){return Array.from({length:t},(t,n)=>e[n]??{text:``,tokens:[]})}function normalizeAlignment(e){return e??`left`}function renderVerticalTable(e,t,n){let r=Number.isFinite(n)?Math.max(1,Math.floor(n)):80;if(r<=2)return renderNarrowTable(e,t,r);let i=r-2,a=`${ansi.dim}┌${`─`.repeat(i)}┐${ansi.dimOff}`,o=`${ansi.dim}├${`─`.repeat(i)}┤${ansi.dimOff}`,s=`${ansi.dim}└${`─`.repeat(i)}┘${ansi.dimOff}`,c=[a];return t.forEach((n,r)=>{e.forEach((e,t)=>{c.push(...boxedTableLines(`${e}: ${n[t]??``}`,i))}),r+1<t.length&&c.push(o)}),c.push(s),c}function renderNarrowTable(e,t,n){return t.flatMap(t=>e.map((e,r)=>{let i=stripAnsi(`${e}: ${t[r]??``}`),a=sliceVisible(i,n);return a.length>0?a:firstGraphemeFallback(i).rendered}))}function boxedTableLines(e,t){let n=[],r=e;do{let e=sliceVisible(r,t),i=e.length===0?firstGraphemeFallback(r):void 0,a=i?.rendered??e,o=` `.repeat(Math.max(0,t-visibleLength(a)));n.push(`${ansi.dim}│${ansi.dimOff}${a}${o}${ansi.dim}│${ansi.dimOff}`),r=r.slice(i?.consumed??e.length)}while(r.length>0);return n}function firstGraphemeFallback(e){return{consumed:graphemes(e)[0]?.text.length??1,rendered:`?`}}function formatTableBorder(e,t,n,r){return`${t}${e.map(e=>`─`.repeat(e+2)).join(n)}${r}`}function formatBoxedTableRow(e,t,n){return`│ ${e.map((e,r)=>alignTableCell(e,t[r]??1,n[r]??`left`)).join(` │ `)} │`}function alignTableCell(e,t,n){let r=Math.max(0,t-visibleLength(e));if(n===`right`)return`${` `.repeat(r)}${e}`;if(n===`center`){let t=Math.floor(r/2);return`${` `.repeat(t)}${e}${` `.repeat(r-t)}`}return`${e}${` `.repeat(r)}`}function horizontalRuleWidth(e){return Number.isFinite(e)?Math.max(1,Math.floor(e)):60}function pushBlankRow(e){e.length>0&&e.at(-1)!==``&&e.push(``)}function trimTrailingBlankRows(e){for(;e.at(-1)===``;)e.pop();return e}export{detectMarkdownRendering,renderMarkdown};
|
|
@@ -329,7 +329,10 @@ export interface PromptCommandHandler {
|
|
|
329
329
|
}
|
|
330
330
|
type TuiStartup = {
|
|
331
331
|
readonly headerTip: string;
|
|
332
|
-
finish():
|
|
332
|
+
finish(): {
|
|
333
|
+
draft: string;
|
|
334
|
+
queuedPrompt: string | undefined;
|
|
335
|
+
};
|
|
333
336
|
};
|
|
334
337
|
export type EveTUIRunnerOptions = TuiDisplayOptions & {
|
|
335
338
|
session?: ClientSession;
|