eve 0.47.6 → 0.47.7
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 +34 -0
- package/dist/src/channel/adapter.js +1 -1
- package/dist/src/channel/session.js +1 -1
- package/dist/src/chunks/{use-eve-agent-DjYwFJF7.js → use-eve-agent-B5zw1dwj.js} +0 -1
- package/dist/src/chunks/{use-eve-agent-DkUB0Ok4.js → use-eve-agent-Dg5S44kG.js} +0 -1
- package/dist/src/cli/commands/registry-declared-setups.js +1 -1
- package/dist/src/cli/commands/registry-install-transaction.d.ts +23 -0
- package/dist/src/cli/commands/registry-install-transaction.js +1 -0
- package/dist/src/cli/commands/registry-package.js +1 -1
- package/dist/src/cli/commands/registry.js +1 -1
- package/dist/src/cli/commands/setup-headless.d.ts +6 -0
- package/dist/src/cli/commands/setup-headless.js +1 -1
- package/dist/src/cli/dev/run-interactive-ui.js +1 -1
- package/dist/src/cli/dev/tui/line-editor.d.ts +4 -0
- package/dist/src/cli/dev/tui/line-editor.js +3 -3
- package/dist/src/cli/dev/tui/runner.d.ts +2 -0
- package/dist/src/cli/dev/tui/runner.js +1 -1
- package/dist/src/cli/dev/tui/stream-format.d.ts +8 -0
- package/dist/src/cli/dev/tui/stream-format.js +2 -2
- package/dist/src/cli/dev/tui/subagent-pump.d.ts +3 -0
- package/dist/src/cli/dev/tui/subagent-pump.js +1 -1
- package/dist/src/cli/dev/tui/tui.js +1 -1
- package/dist/src/client/agent-info-schema.d.ts +0 -1
- 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 +2 -2
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/compiler/manifest.d.ts +7 -17
- 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 -1
- package/dist/src/compiler/normalize-tool.js +1 -1
- package/dist/src/context/build-dynamic-tools.d.ts +2 -2
- package/dist/src/context/build-dynamic-tools.js +1 -1
- package/dist/src/context/container.d.ts +7 -0
- package/dist/src/context/container.js +1 -1
- package/dist/src/context/dynamic-tool-lifecycle.d.ts +16 -9
- package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
- package/dist/src/context/dynamic-tool-metadata.d.ts +44 -0
- package/dist/src/context/dynamic-tool-metadata.js +1 -0
- package/dist/src/context/keys.d.ts +11 -14
- package/dist/src/context/keys.js +1 -1
- package/dist/src/eve-channel/index.js +1 -1
- package/dist/src/eve-channel/request.d.ts +0 -1
- package/dist/src/eve-channel/request.js +2 -2
- package/dist/src/execution/create-session-step.js +1 -1
- package/dist/src/execution/delegation-tool.d.ts +1 -2
- package/dist/src/execution/delegation-tool.js +1 -1
- package/dist/src/execution/dispatch-runtime-actions-shared.d.ts +8 -3
- package/dist/src/execution/dispatch-runtime-actions-shared.js +1 -1
- package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
- package/dist/src/execution/dispatch-workflow-runtime-actions-step.js +1 -1
- package/dist/src/execution/node-step.js +1 -1
- package/dist/src/execution/pending-turn-state.js +1 -1
- package/dist/src/execution/prepared-agent-action.d.ts +7 -0
- package/dist/src/execution/prepared-agent-action.js +1 -0
- package/dist/src/execution/subagent-start-local.d.ts +3 -0
- package/dist/src/execution/subagent-start-local.js +1 -1
- package/dist/src/execution/subagent-tool.d.ts +1 -0
- package/dist/src/execution/subagent-tool.js +1 -1
- package/dist/src/execution/tasks/child/update.d.ts +3 -2
- package/dist/src/execution/tasks/parent/control-shared.d.ts +5 -4
- package/dist/src/execution/tasks/parent/dispatch-task-step.js +1 -1
- package/dist/src/execution/tasks/parent/dispatch.d.ts +4 -3
- package/dist/src/execution/tasks/parent/dispatch.js +1 -1
- package/dist/src/execution/tools/subagent/local.d.ts +3 -4
- package/dist/src/execution/tools/subagent/local.js +1 -1
- package/dist/src/execution/tools/subagent/remote.d.ts +4 -1
- package/dist/src/execution/tools/subagent/remote.js +1 -1
- package/dist/src/execution/workflow-entry-finalization.d.ts +22 -0
- package/dist/src/execution/workflow-entry-finalization.js +1 -0
- package/dist/src/execution/workflow-entry.d.ts +1 -1
- package/dist/src/execution/workflow-entry.js +1 -1
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/framework/sources/registry.js +1 -1
- package/dist/src/harness/advertised-tools.d.ts +3 -0
- package/dist/src/harness/advertised-tools.js +1 -1
- package/dist/src/harness/approval-delivery-coordinator.d.ts +6 -0
- package/dist/src/harness/approval-delivery-coordinator.js +1 -1
- package/dist/src/harness/background-tools.d.ts +2 -0
- package/dist/src/harness/execute-tool.d.ts +2 -28
- package/dist/src/harness/hitl/pending-input-resolution.js +1 -1
- package/dist/src/harness/input-extraction.d.ts +3 -0
- package/dist/src/harness/input-extraction.js +1 -1
- package/dist/src/harness/input-requests.js +1 -1
- package/dist/src/harness/messages.js +1 -1
- package/dist/src/harness/runtime-actions.d.ts +9 -3
- package/dist/src/harness/runtime-actions.js +1 -1
- package/dist/src/harness/stale-input-responses.d.ts +2 -1
- package/dist/src/harness/stale-input-responses.js +1 -1
- package/dist/src/harness/subagent-depth.d.ts +3 -4
- package/dist/src/harness/subagent-depth.js +1 -1
- package/dist/src/harness/tool-loop.js +2 -2
- package/dist/src/harness/tools.d.ts +0 -2
- package/dist/src/harness/tools.js +1 -1
- package/dist/src/harness/types.d.ts +6 -7
- package/dist/src/harness/workflow-runtime-action-state.d.ts +3 -3
- package/dist/src/harness/workflow-runtime-action-state.js +1 -1
- package/dist/src/harness/workflow-sandbox.js +1 -1
- package/dist/src/harness/workflow-subagent-limit.d.ts +4 -4
- package/dist/src/instrumentation/ai-sdk-telemetry.d.ts +1 -0
- package/dist/src/instrumentation/ai-sdk-telemetry.js +1 -1
- package/dist/src/instrumentation/runtime.d.ts +3 -0
- package/dist/src/instrumentation/runtime.js +1 -1
- package/dist/src/internal/application/build-output-environment.d.ts +2 -0
- package/dist/src/internal/application/build-output-environment.js +1 -0
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/application/paths.d.ts +1 -2
- package/dist/src/internal/application/paths.js +1 -1
- package/dist/src/internal/authored-definition/schema-backed.d.ts +6 -2
- package/dist/src/internal/authored-definition/schema-backed.js +1 -1
- package/dist/src/internal/client-context.d.ts +2 -0
- package/dist/src/internal/client-context.js +1 -0
- package/dist/src/internal/nitro/dev-client-address.d.ts +2 -0
- package/dist/src/internal/nitro/dev-client-address.js +1 -1
- package/dist/src/internal/nitro/host/dev-authored-source-watcher.d.ts +2 -2
- package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
- package/dist/src/internal/nitro/host/start-development-server.js +2 -2
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
- package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
- package/dist/src/packages/eve-catalog/src/index.js +1 -1
- package/dist/src/protocol/routes.d.ts +2 -2
- package/dist/src/public/local-dev.d.ts +9 -0
- package/dist/src/public/local-dev.js +1 -0
- package/dist/src/public/next/vercel-output-config.js +1 -1
- package/dist/src/runtime/actions/keys.d.ts +3 -0
- package/dist/src/runtime/actions/keys.js +1 -1
- package/dist/src/runtime/agent/bootstrap.js +1 -1
- package/dist/src/runtime/loaders/bundled-artifacts.js +1 -1
- package/dist/src/runtime/local-dev-capability.d.ts +55 -0
- package/dist/src/runtime/local-dev-capability.js +1 -0
- package/dist/src/runtime/resolve-agent-graph.js +1 -1
- package/dist/src/runtime/resolve-agent.js +1 -1
- package/dist/src/runtime/resolve-tool.js +1 -1
- package/dist/src/runtime/sessions/runtime-session.d.ts +1 -0
- package/dist/src/runtime/sessions/runtime-session.js +1 -1
- package/dist/src/runtime/sessions/turn.d.ts +3 -0
- package/dist/src/runtime/subagents/registry.js +1 -1
- package/dist/src/runtime/tools/registry.d.ts +1 -0
- package/dist/src/runtime/tools/registry.js +1 -1
- package/dist/src/runtime/types.d.ts +2 -2
- package/dist/src/services/dev-client/client-options.d.ts +1 -0
- package/dist/src/services/dev-client/client-options.js +1 -1
- package/dist/src/services/dev-client/runtime-artifacts.d.ts +2 -0
- package/dist/src/services/dev-client/runtime-artifacts.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/shared/dispatch-action.d.ts +24 -0
- package/dist/src/shared/dispatch-action.js +1 -0
- package/dist/src/shared/workflow-sandbox.d.ts +1 -1
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/tasks/json.js +1 -1
- package/dist/src/tools/behavior.d.ts +55 -0
- package/dist/src/tools/behavior.js +1 -0
- package/dist/src/tools/durable-callbacks.d.ts +1 -0
- package/dist/src/tools/framework/agent.d.ts +2 -11
- package/dist/src/tools/framework/agent.js +1 -1
- package/dist/src/tools/framework/ask-question.d.ts +2 -14
- package/dist/src/tools/framework/ask-question.js +1 -1
- package/dist/src/tools/framework/task-cancel.d.ts +2 -7
- package/dist/src/tools/framework/task-cancel.js +1 -1
- package/dist/src/tools/framework/task-contract.d.ts +0 -2
- package/dist/src/tools/framework/task-contract.js +1 -1
- package/dist/src/tools/framework/task-update.d.ts +2 -7
- package/dist/src/tools/framework/task-update.js +1 -1
- package/dist/src/tools/native-definition.d.ts +6 -0
- package/dist/src/tools/native-definition.js +1 -0
- package/dist/src/tools/provided/load-skill.js +1 -1
- package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
- package/dist/src/tracing/agent-channel-delivery-instrumentation.js +1 -1
- package/dist/src/tracing/agent-otel-provider.js +1 -1
- package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
- package/dist/src/tracing/install-instrumentation-runtime.js +1 -1
- package/dist/src/tracing/otel-registration.d.ts +2 -0
- package/dist/src/tracing/otel-registration.js +1 -1
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/docs/reference/typescript-api.md +24 -0
- package/package.json +6 -1
- package/dist/src/execution/tools/tasks.d.ts +0 -18
- package/dist/src/execution/tools/tasks.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
# eve
|
|
2
2
|
|
|
3
|
+
## 0.47.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- b0799b3: Preserve built-in tool behavior through compiled and runtime descriptors, so authored replacements, delegation, task controls, request input, and provider tools use the selected source instead of name-based runtime inference. Replacing bundled artifacts now invalidates resolved-agent caches so redeploys expose newly compiled skills consistently.
|
|
8
|
+
- b9eb1b2: Keep `eve/next` from claiming a host application's Workflow world, so `withEve` can coexist with `withWorkflow` in one Next.js app.
|
|
9
|
+
- 0a1ad48: Resume sessions with dynamic tools persisted by older eve versions without crashing during callback restoration.
|
|
10
|
+
- aafcb34: Keep `clientContext` scoped to its model call so earlier client context no longer accumulates in later session turns.
|
|
11
|
+
- f2c96a1: Spans held for a parent that never ends are no longer lost or buffered without bound: eve's span-filtering processor now drains them to destinations on `forceFlush` and `shutdown`, and caps how many a stuck parent can hold.
|
|
12
|
+
- 7a7da6d: Reconstructed durable spans — `invoke_agent`, `agent.channel.delivery`, and `agent.approval` — now carry their channel audience on the parent context, so destination export policies see the real audience instead of `unknown` and apply the correct export and redaction decisions.
|
|
13
|
+
- 6a8340f: Skip durable caller bookkeeping steps for root session turns that have no delegated caller.
|
|
14
|
+
- ee5e4c7: Headless registry setup continuation commands now preserve answers supplied in earlier steps, so multi-question setup flows can resume without looping.
|
|
15
|
+
- c72dc2e: Adds `eve/local-dev`, whose `getLocalDevCapability()` gives authored code the
|
|
16
|
+
authored application root and a lease-based way to pause the authored-source
|
|
17
|
+
watcher while mutating that tree. The capability is scoped to executions
|
|
18
|
+
initiated by same-machine requests to `eve dev` and remains available across
|
|
19
|
+
durable workflow steps and local subagents; deployed runtimes and
|
|
20
|
+
remote-attached clients receive `undefined`.
|
|
21
|
+
- 6a8340f: Workflow run attributes now persist in parallel with turn-result delivery while remaining joined to the durable step, removing the observability write from the user-visible settlement path.
|
|
22
|
+
- 1982202: Pre-allocated session trace seeds now consult the configured OTel sampler, so `$eve.trace_id` workflow attributes are only stamped for traces the sampler will actually record. Previously an `always_off`, ratio, or custom sampler could leave links to traces that were never exported.
|
|
23
|
+
- b7ac284: The self-modification subagent can now install items from the configured eve
|
|
24
|
+
registry. A new `selfmod__registry_add` tool runs `eve add <address>
|
|
25
|
+
--non-interactive --skip-setup` in the application root under `eve dev`,
|
|
26
|
+
pausing the authored-source watcher for the whole install and reporting the
|
|
27
|
+
item's declared environment variables that are still unset. Failed dependency
|
|
28
|
+
installs restore tracked project files and return a sanitized, structured reason
|
|
29
|
+
instead of implying the project was untouched. Items that declare a setup flow
|
|
30
|
+
or multiple components are never partially installed: the local dev TUI now
|
|
31
|
+
opens their existing setup panel automatically, while headless development
|
|
32
|
+
reports the command that finishes them, so no setup question is answered by the
|
|
33
|
+
model.
|
|
34
|
+
- 7a415bf: Emit one framework-owned agent trace tree from managed OpenTelemetry runtimes. Legacy instrumentation keeps its existing span hierarchy, and authored AI SDK telemetry integrations continue to compose with eve's structural spans.
|
|
35
|
+
- bc2a1f6: Add readline-style Ctrl+B/F and Alt+B/F cursor movement to editable fields in the eve TUI, including common modified-arrow terminal sequences.
|
|
36
|
+
|
|
3
37
|
## 0.47.6
|
|
4
38
|
|
|
5
39
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createLogger}from"#internal/logging.js";const log=createLogger(`channel.adapter`);function defaultDeliverResult(
|
|
1
|
+
import{attachClientContext,readClientContext}from"#internal/client-context.js";import{createLogger}from"#internal/logging.js";const log=createLogger(`channel.adapter`);function defaultDeliverResult(n){if(n.message!==void 0)return attachClientContext({inputResponses:n.inputResponses,message:n.message,context:n.context,outputSchema:n.outputSchema},readClientContext(n));if(n.inputResponses!==void 0&&n.inputResponses.length>0)return attachClientContext({inputResponses:n.inputResponses,context:n.context,outputSchema:n.outputSchema},readClientContext(n));if(n.context!==void 0&&n.context.length>0||(readClientContext(n)?.length??0)>0)return attachClientContext({context:n.context,outputSchema:n.outputSchema},readClientContext(n));if(n.outputSchema!==void 0)return{outputSchema:n.outputSchema}}function getAdapterKind(e){return e.kind}async function callAdapterEventHandler(e,t,n){let r=withWaitingContinuationToken(t,n),i=e[t.type];if(i!==void 0)try{await i(`data`in r?r.data:void 0,n)}catch(n){log.error(`adapter event handler threw — event swallowed`,{adapterKind:getAdapterKind(e),eventType:t.type,error:n})}return withWaitingContinuationToken(r,n)}function withWaitingContinuationToken(e,t){return e.type===`session.waiting`?{...e,data:{...e.data,continuationToken:t.session.continuation?.token??t.session.id}}:e}export{callAdapterEventHandler,defaultDeliverResult,getAdapterKind};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createChannelDeliveryMetadata}from"#channel/delivery-metadata.js";import{serializeUrlFilePartsInMessage}from"#channel/send-input.js";import{DEFAULT_TURN_POLICY}from"#channel/types.js";import{parseInputResponses}from"#shared/input.js";import{AuthKey,ContinuationTokenKey,InitiatorAuthKey,SessionIdKey}from"#context/keys.js";import{toChannelLocalContinuationToken}from"#shared/continuation-token.js";function createSession(
|
|
1
|
+
import{attachClientContext,readClientContext}from"#internal/client-context.js";import{createChannelDeliveryMetadata}from"#channel/delivery-metadata.js";import{serializeUrlFilePartsInMessage}from"#channel/send-input.js";import{DEFAULT_TURN_POLICY}from"#channel/types.js";import{parseInputResponses}from"#shared/input.js";import{AuthKey,ContinuationTokenKey,InitiatorAuthKey,SessionIdKey}from"#context/keys.js";import{toChannelLocalContinuationToken}from"#shared/continuation-token.js";function createSession(n,o,s={}){return{id:n,async send(a,c){let l=createDelivery(s),u=sessionCallbackToTurnCaller(c.callback,c.activityObserver),d=attachClientContext({message:serializeUrlFilePartsInMessage(a)},readClientContext(c));c.context!==void 0&&(d.context=c.context),c.outputSchema!==void 0&&(d.outputSchema=c.outputSchema);let f={auth:c.auth,delivery:l,kind:`send`,payload:d,requestId:s.requestId,turnPolicy:c.turnPolicy??s.turnPolicy??DEFAULT_TURN_POLICY};return await o.dispatchSession({command:u===void 0?f:{...f,caller:u},sessionId:n})},async respond(r,i){if(r.length===0)throw Error(`respond() requires at least one input response.`);let c=parseInputResponses(r),l=sessionCallbackToTurnCaller(i.callback,i.activityObserver),u=createDelivery(s),d=attachClientContext({inputResponses:c},readClientContext(i));i.context!==void 0&&(d.context=i.context),i.outputSchema!==void 0&&(d.outputSchema=i.outputSchema);let f={auth:i.auth,delivery:u,kind:`send`,payload:d,requestId:s.requestId};return await o.dispatchSession({command:l===void 0?f:{...f,caller:l},sessionId:n})},async cancel(e){return await o.dispatchSession({command:{kind:`cancel`,taskId:e?.taskId,turnId:e?.turnId},sessionId:n})},async compact(){return await o.dispatchSession({command:{kind:`compact`},sessionId:n})},async clear(){return await o.dispatchSession({command:{kind:`clear`},sessionId:n})},async reset(e){return await o.dispatchSession({command:{kind:`reset`,reason:e?.reason},sessionId:n})},async getEventStream(e){return o.getEventStream(n,e)},async getStreamTailIndex(){return o.getStreamTailIndex(n)}}}function createAttachSessionFn(e,t={}){return n=>createSession(n,e,t)}function createDelivery(e){return e.channelKind!==void 0&&e.channelName!==void 0?createChannelDeliveryMetadata(e):void 0}function buildSessionHandle(e){return{get id(){return e.get(SessionIdKey)??``},get auth(){return{current:e.get(AuthKey)??null,initiator:e.get(InitiatorAuthKey)??null}},get continuation(){let t=e.get(ContinuationTokenKey);if(!(t===void 0||t.length===0))return{token:toChannelLocalContinuationToken(t),rekey(n){let r=namespaceContinuationToken(t,n);t!==r&&e.set(ContinuationTokenKey,r)}}}}}function namespaceContinuationToken(e,t){let n=e.indexOf(`:`);if(n<=0)throw Error(`Cannot set session continuation token without an existing namespaced continuation token. Start the session with a placeholder continuationToken.`);return`${e.slice(0,n+1)}${t}`}function sessionCallbackToTurnCaller(e,t){return e===void 0?void 0:{activityObserver:t,callId:e.callId,replyTo:{kind:`callback`,token:e.token,url:e.url},subagentName:e.subagentName,taskId:e.taskId}}export{buildSessionHandle,createAttachSessionFn,createSession,sessionCallbackToTurnCaller};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{createPrompter}from"#setup/prompter.js";import{createHeadlessPrompter}from"#setup/headless.js";import{mergeRegistrySetupCompletions}from"#setup/registry-setup-completion.js";async function runDeclaredSetups(i){let a={facts:[]};if(i.setups===void 0)return a;let o=await i.dependencies.loadSetupCommandRunner(),s=i.options.prompter??(i.options.nonInteractive?createHeadlessPrompter(i.logger.log):createPrompter());try{for(let n of i.setups){let r=await o(i.appRoot,{...n,args:[...n.args,...i.options.yes?[`--yes`]:[],...i.options.nonInteractive?[`--non-interactive`]:[],...Object.entries(i.options.answers??{}).flatMap(([e,t])=>[`--answer`,`${e}=${JSON.stringify(t)}`])]},i.item,{prompter:s,signal:i.options.signal});if(r.kind===`cancelled`)return i.logger.log(i.cancelledReminder),!1;if(r.kind===`blocked`){if(!i.options.nonInteractive)throw Error(`Setup requires more input.`);return i.logger.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,item:i.item,installed:!0,completedItems:[],...r.blocker,next:headlessSetupContinuation({item:i.item,installed:!0,question:r.blocker.status===`input_required`?r.blocker.question:void 0})})),process.exitCode=2,!1}if(i.options.silent!==!0)for(let e of r.facts)i.logger.log(`${e.label}: ${e.value}`);a=mergeRegistrySetupCompletions(a,r)}return a}catch(n){let r=n instanceof Error?n.message:String(n);if(i.options.nonInteractive)return i.logger.error(serializeHeadlessSetupEvent({version:1,type:`failed`,item:i.item,completedItems:[],message:r,next:headlessSetupContinuation({item:i.item,installed:!0})})),process.exitCode=1,!1;throw Error(`${r} Try again with \`${i.resumeCommand}\`.`)}}export{runDeclaredSetups};
|
|
1
|
+
import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{createPrompter}from"#setup/prompter.js";import{createHeadlessPrompter}from"#setup/headless.js";import{mergeRegistrySetupCompletions}from"#setup/registry-setup-completion.js";async function runDeclaredSetups(i){let a={facts:[]};if(i.setups===void 0)return a;let o=await i.dependencies.loadSetupCommandRunner(),s=i.options.prompter??(i.options.nonInteractive?createHeadlessPrompter(i.logger.log):createPrompter());try{for(let n of i.setups){let r=await o(i.appRoot,{...n,args:[...n.args,...i.options.yes?[`--yes`]:[],...i.options.nonInteractive?[`--non-interactive`]:[],...Object.entries(i.options.answers??{}).flatMap(([e,t])=>[`--answer`,`${e}=${JSON.stringify(t)}`])]},i.item,{prompter:s,signal:i.options.signal});if(r.kind===`cancelled`)return i.logger.log(i.cancelledReminder),!1;if(r.kind===`blocked`){if(!i.options.nonInteractive)throw Error(`Setup requires more input.`);return i.logger.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,item:i.item,installed:!0,completedItems:[],...r.blocker,next:headlessSetupContinuation({item:i.item,installed:!0,answers:i.options.answers,question:r.blocker.status===`input_required`?r.blocker.question:void 0})})),process.exitCode=2,!1}if(i.options.silent!==!0)for(let e of r.facts)i.logger.log(`${e.label}: ${e.value}`);a=mergeRegistrySetupCompletions(a,r)}return a}catch(n){let r=n instanceof Error?n.message:String(n);if(i.options.nonInteractive)return i.logger.error(serializeHeadlessSetupEvent({version:1,type:`failed`,item:i.item,completedItems:[],message:r,next:headlessSetupContinuation({item:i.item,installed:!0,answers:i.options.answers})})),process.exitCode=1,!1;throw Error(`${r} Try again with \`${i.resumeCommand}\`.`)}}export{runDeclaredSetups};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
interface Snapshot {
|
|
2
|
+
readonly path: string;
|
|
3
|
+
readonly contents?: Buffer;
|
|
4
|
+
}
|
|
5
|
+
export declare function snapshotRegistryInstall(appRoot: string, item: unknown): Promise<readonly Snapshot[]>;
|
|
6
|
+
export declare function rollbackRegistryInstall(appRoot: string, snapshots: readonly Snapshot[]): Promise<{
|
|
7
|
+
readonly restored: boolean;
|
|
8
|
+
readonly changed: readonly string[];
|
|
9
|
+
}>;
|
|
10
|
+
export type RegistryInstallFailureCode = "pnpm_build_policy" | "dependency_install";
|
|
11
|
+
export declare function registryInstallFailureCode(error: unknown): RegistryInstallFailureCode;
|
|
12
|
+
export declare function registryInstallFailureMessage(code: RegistryInstallFailureCode): string;
|
|
13
|
+
export declare function installRegistryItemTransaction(input: {
|
|
14
|
+
readonly appRoot: string;
|
|
15
|
+
readonly item: string;
|
|
16
|
+
readonly registryItem: unknown;
|
|
17
|
+
readonly nonInteractive: boolean | undefined;
|
|
18
|
+
readonly logger: {
|
|
19
|
+
log(message: string): void;
|
|
20
|
+
};
|
|
21
|
+
readonly install: () => Promise<void>;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{readFile,unlink,writeFile}from"node:fs/promises";import{isAbsolute,relative,resolve}from"node:path";const PROJECT_INSTALL_FILES=[`package.json`,`pnpm-lock.yaml`,`pnpm-workspace.yaml`,`package-lock.json`,`npm-shrinkwrap.json`,`yarn.lock`,`bun.lock`,`bun.lockb`,`.env.example`,`.env.local`];function registryTargets(e,t){if(typeof t!=`object`||!t||!(`files`in t))return[];let n=t.files;return Array.isArray(n)?n.flatMap(t=>{if(typeof t!=`object`||!t||!(`target`in t))return[];let n=t.target;if(typeof n!=`string`||n.length===0)return[];let r=relative(e,resolve(e,n));return isAbsolute(r)||r.startsWith(`..`)?[]:[r]}):[]}async function snapshotFile(e){try{return{path:e,contents:await readFile(e)}}catch(t){if(t.code===`ENOENT`)return{path:e};throw t}}async function snapshotRegistryInstall(e,t){let n=[...new Set([...PROJECT_INSTALL_FILES,...registryTargets(e,t)])];return await Promise.all(n.map(t=>snapshotFile(resolve(e,t))))}async function rollbackRegistryInstall(e,t){let i=[];for(let o of t)try{o.contents===void 0?await unlink(o.path).catch(e=>{if(e.code!==`ENOENT`)throw e}):await writeFile(o.path,o.contents)}catch{i.push(relative(e,o.path))}return{restored:i.length===0,changed:i}}function registryInstallFailureCode(e){let t=e instanceof Error?e.message:String(e);return t.includes(`ERR_PNPM_IGNORED_BUILDS`)||t.includes(`Ignored build scripts`)?`pnpm_build_policy`:`dependency_install`}function registryInstallFailureMessage(e){return e===`pnpm_build_policy`?"Dependency installation stopped because pnpm requires build-script decisions. Run `pnpm approve-builds`, then retry the eve add command.":`Dependency installation failed. Retry the eve add command in a terminal for details.`}async function installRegistryItemTransaction(t){let n=await snapshotRegistryInstall(t.appRoot,t.registryItem);try{await t.install()}catch(r){let i=await rollbackRegistryInstall(t.appRoot,n),a=registryInstallFailureCode(r),o=registryInstallFailureMessage(a);if(t.nonInteractive){let n={version:1,type:`failed`,item:t.item,completedItems:[],message:o,failureCode:a,rolledBack:i.restored};i.changed.length>0&&(n.changed=i.changed),t.logger.log(serializeHeadlessSetupEvent(n))}throw Error(o,{cause:r})}}export{installRegistryItemTransaction,registryInstallFailureCode,registryInstallFailureMessage,rollbackRegistryInstall,snapshotRegistryInstall};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hasInteractiveTerminal}from"./preconditions.js";import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{z}from"#compiled/zod/index.js";import{createPrompter}from"#setup/prompter.js";import{headlessAsker,interactiveAsker,withAnswers,withPolicy}from"#setup/ask.js";import{mergeRegistrySetupCompletions}from"#setup/registry-setup-completion.js";import{addRegistryItems,getRegistryItems}from"#compiled/shadcn-registry/index.js";const RegistryPackageComponentSchema=z.object({item:z.string().min(1),label:z.string().min(1),description:z.string().optional(),default:z.boolean().default(!1)});async function selectComponents(e,r,i,l,u,d){if(l.prompter===void 0&&!l.nonInteractive&&(l.yes===!0||!u))return i.filter(e=>e.default);let f={key:`components`,message:`Add ${r}`,required:!0,recommended:i.filter(e=>e.default),options:i.map(e=>({id:e.item,value:e,label:e.label,hint:e.description}))},p=l.nonInteractive?withAnswers(l.answers??{})(l.yes?withPolicy(`assume`)(headlessAsker()):headlessAsker()):interactiveAsker(d());try{return await p.askMany(f)}catch(i){if(!l.nonInteractive||!(i instanceof Error)||i.name!==`InteractionRequired`)throw i;let a=i.question,{setupQuestionToWire:o}=await import(`#setup/setup-question-wire.js`),s=o(a);e.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`input_required`,item:r,installed:!1,completedItems:[],question:s,next:headlessSetupContinuation({item:r,installed:!1,question:s})})),process.exitCode=2;return}}async function runRegistryPackage(t){let{logger:n,appRoot:r,item:a,components:o,config:s,options:c,dependencies:f,operations:p}=t,m=f.hasInteractiveTerminal?.()??hasInteractiveTerminal(),h=c.prompter,getPrompter=()=>h??=f.createPrompter?.()??createPrompter(),g=await selectComponents(n,a,o,c,m,getPrompter);if(g===void 0)return!1;let _=g.map(e=>p.itemAddress(e.item)),v=await getRegistryItems(_,{config:s});if(v.length!==g.length)throw Error(`Registry package "${a}" could not resolve all selected components.`);let y=v.map(e=>{let t=p.metadata(e);return p.assertCompatibleVersion(t?.requires),t});c.skipInstall!==!0&&await addRegistryItems(_,{config:s,cwd:r,overwrite:c.overwrite,silent:c.silent});let b={facts:[]};if(c.skipSetup===!0)return b;if(!c.nonInteractive&&c.yes!==!0&&c.prompter===void 0&&!m)return n.log(p.setupReminder(a)),b;for(let e of y){if(e?.setup===void 0)continue;let t=await p.runSetups({item:a,setups:e.setup,prompter:getPrompter()});if(t===!1)return!1;b=mergeRegistrySetupCompletions(b,t)}return b}export{RegistryPackageComponentSchema,runRegistryPackage};
|
|
1
|
+
import{hasInteractiveTerminal}from"./preconditions.js";import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{z}from"#compiled/zod/index.js";import{createPrompter}from"#setup/prompter.js";import{headlessAsker,interactiveAsker,withAnswers,withPolicy}from"#setup/ask.js";import{mergeRegistrySetupCompletions}from"#setup/registry-setup-completion.js";import{addRegistryItems,getRegistryItems}from"#compiled/shadcn-registry/index.js";const RegistryPackageComponentSchema=z.object({item:z.string().min(1),label:z.string().min(1),description:z.string().optional(),default:z.boolean().default(!1)});async function selectComponents(e,r,i,l,u,d){if(l.prompter===void 0&&!l.nonInteractive&&(l.yes===!0||!u))return i.filter(e=>e.default);let f={key:`components`,message:`Add ${r}`,required:!0,recommended:i.filter(e=>e.default),options:i.map(e=>({id:e.item,value:e,label:e.label,hint:e.description}))},p=l.nonInteractive?withAnswers(l.answers??{})(l.yes?withPolicy(`assume`)(headlessAsker()):headlessAsker()):interactiveAsker(d());try{return await p.askMany(f)}catch(i){if(!l.nonInteractive||!(i instanceof Error)||i.name!==`InteractionRequired`)throw i;let a=i.question,{setupQuestionToWire:o}=await import(`#setup/setup-question-wire.js`),s=o(a);e.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`input_required`,item:r,installed:!1,completedItems:[],question:s,next:headlessSetupContinuation({item:r,installed:!1,answers:l.answers,question:s})})),process.exitCode=2;return}}async function runRegistryPackage(t){let{logger:n,appRoot:r,item:a,components:o,config:s,options:c,dependencies:f,operations:p}=t,m=f.hasInteractiveTerminal?.()??hasInteractiveTerminal(),h=c.prompter,getPrompter=()=>h??=f.createPrompter?.()??createPrompter(),g=await selectComponents(n,a,o,c,m,getPrompter);if(g===void 0)return!1;let _=g.map(e=>p.itemAddress(e.item)),v=await getRegistryItems(_,{config:s});if(v.length!==g.length)throw Error(`Registry package "${a}" could not resolve all selected components.`);let y=v.map(e=>{let t=p.metadata(e);return p.assertCompatibleVersion(t?.requires),t});c.skipInstall!==!0&&await addRegistryItems(_,{config:s,cwd:r,overwrite:c.overwrite,silent:c.silent});let b={facts:[]};if(c.skipSetup===!0)return b;if(!c.nonInteractive&&c.yes!==!0&&c.prompter===void 0&&!m)return n.log(p.setupReminder(a)),b;for(let e of y){if(e?.setup===void 0)continue;let t=await p.runSetups({item:a,setups:e.setup,prompter:getPrompter()});if(t===!1)return!1;b=mergeRegistrySetupCompletions(b,t)}return b}export{RegistryPackageComponentSchema,runRegistryPackage};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hasInteractiveTerminal}from"./preconditions.js";import{reportHeadlessSetupCompletion,serializeHeadlessSetupEvent}from"./setup-headless.js";import{runDeclaredSetups}from"./registry-declared-setups.js";import{runRegistryPackage}from"./registry-package.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.js";import{addRegistryMappings,prepareWebRegistryProject,readRegistryConfig}from"./registry-project.js";import{errorMessage,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand}from"./registry-recovery.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,hasInteractiveTerminal,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand,prepareWebRegistryProject};function resolveOfficialRegistryUrl(e=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL){if(e===void 0)return`https://eve.dev/r`;let t;try{t=new URL(e)}catch{throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`);if(t.username!==``||t.password!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include credentials.`);if(t.search!==``||t.hash!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include a query or fragment.`);return t.pathname=t.pathname.replace(/\/+$/,``),t.toString().replace(/\/$/,``)}const OFFICIAL_REGISTRY=resolveOfficialRegistryUrl(),OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,SKILLS_REGISTRY=`@skills`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,n={}){let r=await readEveRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:r,cwd:e,overwrite:n.overwrite})}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function withBuiltInRegistries(e){return{...e,registries:{[SKILLS_REGISTRY]:`https://www.skills.sh/r/{name}?agent=eve`,...e.registries}}}async function readEveRegistryConfig(e){return withBuiltInRegistries(await readRegistryConfig(e))}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}async function loadOfficialSearchMetadata(){let e=await fetch(OFFICIAL_CATALOG);if(!e.ok)throw Error(`Could not read the eve registry (${e.status}).`);return parseOfficialRegistrySearchMetadata(await e.json())}function searchItemAddress(e){return e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument}function enrichSearchItem(e,t){let n=searchItemAddress(e);return{item:e,address:n,...t.get(n)}}function registrySourceLabel(e){return e===OFFICIAL_CATALOG?`eve`:e===SKILLS_REGISTRY?`skills.sh`:e}function searchPresentationSections(e,t,n){return e.flatMap(e=>{let r=t.get(e);return r===void 0?[]:[{label:registrySourceLabel(e),items:r.items.map(e=>enrichSearchItem(e,n)),total:r.pagination.total}]})}async function printAddSuggestions(e,t,n){try{let r=n.split(`/`).at(-1)||n,{resultsBySource:i,sources:a,metadataByAddress:o}=await searchRegistryCatalog(t,{limit:5,query:r}),c=searchPresentationSections(a,i,o);if(c.every(e=>e.items.length===0))return;e.log(`Did you mean?`),printRegistrySearchResults(e,{query:r,sections:c})}catch{}}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let n=await readEveRegistryConfig(e),r=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(n).filter(e=>t.query!==void 0||e!==SKILLS_REGISTRY)],i=await Promise.all(r.map(async e=>{try{return{result:await searchRegistries([e],{config:n,limit:t.limit??100,query:t.query}),source:e}}catch(t){return{error:t,source:e}}})),a=[],o=new Map;for(let e of i)if(`error`in e)a.push({message:errorMessage(e.error),registry:e.source});else{let t=e.result.errors??[];if(a.push(...t),t.length===0){let t=e.result.items.filter(t=>t.registry===e.source);o.set(e.source,{...e.result,items:t,pagination:{...e.result.pagination,total:e.result.items.length===t.length?e.result.pagination.total:0}})}}let s=new Map(a.map(e=>[`${e.registry}\0${e.message}`,e])),c=o.has(OFFICIAL_CATALOG)?await loadOfficialSearchMetadata():new Map,l=o.get(OFFICIAL_CATALOG);l!==void 0&&l.items.sort((e,t)=>{let rank=e=>c.get(searchItemAddress(e))?.implementation===`native`?0:1;return rank(e)-rank(t)});let u=[...o.values()];return{config:n,result:{items:u.flatMap(e=>e.items),pagination:{hasMore:u.some(e=>e.pagination.hasMore),limit:t.limit??100,offset:0,total:u.reduce((e,t)=>e+t.pagination.total,0)},...s.size>0?{errors:[...s.values()]}:{}},resultsBySource:o,sources:r,metadataByAddress:c}}async function browseRegistryCatalog(e,t={}){let{result:n}=await searchRegistryCatalog(e,t);return{items:n.items.map(e=>{let t={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry};return e.title!==void 0&&(t.title=e.title),e.type!==void 0&&(t.type=e.type),e.description!==void 0&&(t.description=e.description),t}),total:n.pagination.total,errors:n.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,resultsBySource:o,sources:c,metadataByAddress:l}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),u=a.errors??[];if(i.json||o.size>0){let t=a.items.map(e=>({...e,...l.get(searchItemAddress(e))})),r={query:n,sections:searchPresentationSections(c,o,l)};i.json&&(r.json={...a,items:t}),printRegistrySearchResults(e,r)}for(let t of u)e.error(`${t.registry}: ${t.message}`);u.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let n=await readEveRegistryConfig(e),r=await getRegistryItems([itemAddress(t)],{config:n});return r.length===1?r[0]:r}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode,c=await runAddCommand(o,e,t,{...n,yes:n.prompter===void 0||n.yes,setupAuthorized:n.prompter!==void 0},r);if(process.exitCode=s,i!==void 0)throw Error(i);let l={output:a};return c!==void 0&&(l.setup=c),l}async function runAddCommand(e,t,o,s,c=defaultAddCommandDependencies){return runRegistryAction(e,t,async()=>{let l=await readEveRegistryConfig(t),d=itemAddress(o);if(s.skipInstall===!0){if(s.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(s.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(d))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let f=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([d],{config:l}))[0],()=>printAddSuggestions(e,t,o));if(!f.found)return;let p=f.item,m=isOfficialItemAddress(d)?eveMetadataFromRegistryItem(p):void 0;if(assertCompatibleEveVersion(m?.requires),m?.components!==void 0){if(!isOfficialItemAddress(d))throw Error(`Registry packages require the official eve registry.`);return reportCompletion(e,o,await runRegistryPackage({logger:e,appRoot:t,item:o,components:m.components,config:l,options:s,dependencies:c,operations:{itemAddress,metadata:eveMetadataFromRegistryItem,assertCompatibleVersion:assertCompatibleEveVersion,runSetups:({item:n,setups:i,prompter:a})=>runDeclaredSetups({logger:e,appRoot:t,item:n,setups:i,options:{yes:s.yes,nonInteractive:s.nonInteractive,answers:s.answers,prompter:a,signal:s.signal},dependencies:c,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)}),setupReminder:e=>setupReminder(e,`skipped`)}}),s)}if(s.skipInstall===!0){if(m?.setup===void 0)throw Error(`Registry item "${o}" does not declare a setup flow.`);return reportCompletion(e,o,await runDeclaredSetups({logger:e,appRoot:t,item:o,setups:m.setup,options:s,dependencies:c,cancelledReminder:setupReminder(o,`cancelled`),resumeCommand:setupResumeCommand(o)}),s)}if(d===itemAddress(`channel/web`)&&await(c.prepareWebRegistryProject??prepareWebRegistryProject)(t),await addRegistryItems([d],{config:l,cwd:t,overwrite:s.overwrite,silent:s.silent}),m?.setup===void 0)return reportCompletion(e,o,{facts:[]},s);let h=c.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(s.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`progress`,message:s.skipInstall?`Setup ${o}`:`Installed ${o}`})),s.skipSetup===!0){if(s.nonInteractive)return reportCompletion(e,o,{facts:[]},s);e.log(setupReminder(o,`skipped`));return}if(!s.nonInteractive&&!s.yes&&!h&&s.setupAuthorized!==!0){e.log(setupReminder(o,`skipped`));return}if(!s.nonInteractive&&!s.yes&&s.setupAuthorized!==!0)try{if(await(s.prompter??c.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${o} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(o,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(o,`cancelled`));return}return reportCompletion(e,o,await runDeclaredSetups({logger:e,appRoot:t,item:o,setups:m.setup,options:s,dependencies:c,cancelledReminder:setupReminder(o,`cancelled`),resumeCommand:setupResumeCommand(o)}),s)})}function reportCompletion(e,n,r,i){return reportHeadlessSetupCompletion({logger:e,item:n,completion:r,nonInteractive:i.nonInteractive})}async function runRegistryAddCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await addRegistryMappings(t,n);for(let t of r.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of r.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);r.added.length>0&&e.log(`Added ${r.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n,r={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n,r))}async function runRegistrySearchCommand(e,t,n,r,i={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r,{...i,limit:i.limit??10}))}async function runRegistryViewCommand(e,t,n,r={}){await runRegistryAction(e,t,async()=>{let i=await readEveRegistryConfig(t),a=await getRegistryItems([itemAddress(n)],{config:i}),o=a.length===1?a[0]:a;e.log(r.json?JSON.stringify(o,null,2):registryViewText(n,o))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
|
|
1
|
+
import{hasInteractiveTerminal}from"./preconditions.js";import{reportHeadlessSetupCompletion,serializeHeadlessSetupEvent}from"./setup-headless.js";import{runDeclaredSetups}from"./registry-declared-setups.js";import{installRegistryItemTransaction}from"./registry-install-transaction.js";import{runRegistryPackage}from"./registry-package.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.js";import{addRegistryMappings,prepareWebRegistryProject,readRegistryConfig}from"./registry-project.js";import{errorMessage,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand}from"./registry-recovery.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,hasInteractiveTerminal,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand,prepareWebRegistryProject};function resolveOfficialRegistryUrl(e=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL){if(e===void 0)return`https://eve.dev/r`;let t;try{t=new URL(e)}catch{throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`);if(t.username!==``||t.password!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include credentials.`);if(t.search!==``||t.hash!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include a query or fragment.`);return t.pathname=t.pathname.replace(/\/+$/,``),t.toString().replace(/\/$/,``)}const OFFICIAL_REGISTRY=resolveOfficialRegistryUrl(),OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,SKILLS_REGISTRY=`@skills`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,n={}){let r=await readEveRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:r,cwd:e,overwrite:n.overwrite})}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function withBuiltInRegistries(e){return{...e,registries:{[SKILLS_REGISTRY]:`https://www.skills.sh/r/{name}?agent=eve`,...e.registries}}}async function readEveRegistryConfig(e){return withBuiltInRegistries(await readRegistryConfig(e))}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}async function loadOfficialSearchMetadata(){let e=await fetch(OFFICIAL_CATALOG);if(!e.ok)throw Error(`Could not read the eve registry (${e.status}).`);return parseOfficialRegistrySearchMetadata(await e.json())}function searchItemAddress(e){return e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument}function enrichSearchItem(e,t){let n=searchItemAddress(e);return{item:e,address:n,...t.get(n)}}function registrySourceLabel(e){return e===OFFICIAL_CATALOG?`eve`:e===SKILLS_REGISTRY?`skills.sh`:e}function searchPresentationSections(e,t,n){return e.flatMap(e=>{let r=t.get(e);return r===void 0?[]:[{label:registrySourceLabel(e),items:r.items.map(e=>enrichSearchItem(e,n)),total:r.pagination.total}]})}async function printAddSuggestions(e,t,n){try{let r=n.split(`/`).at(-1)||n,{resultsBySource:i,sources:a,metadataByAddress:o}=await searchRegistryCatalog(t,{limit:5,query:r}),s=searchPresentationSections(a,i,o);if(s.every(e=>e.items.length===0))return;e.log(`Did you mean?`),printRegistrySearchResults(e,{query:r,sections:s})}catch{}}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let n=await readEveRegistryConfig(e),r=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(n).filter(e=>t.query!==void 0||e!==SKILLS_REGISTRY)],i=await Promise.all(r.map(async e=>{try{return{result:await searchRegistries([e],{config:n,limit:t.limit??100,query:t.query}),source:e}}catch(t){return{error:t,source:e}}})),a=[],o=new Map;for(let e of i)if(`error`in e)a.push({message:errorMessage(e.error),registry:e.source});else{let t=e.result.errors??[];if(a.push(...t),t.length===0){let t=e.result.items.filter(t=>t.registry===e.source);o.set(e.source,{...e.result,items:t,pagination:{...e.result.pagination,total:e.result.items.length===t.length?e.result.pagination.total:0}})}}let s=new Map(a.map(e=>[`${e.registry}\0${e.message}`,e])),c=o.has(OFFICIAL_CATALOG)?await loadOfficialSearchMetadata():new Map,l=o.get(OFFICIAL_CATALOG);l!==void 0&&l.items.sort((e,t)=>{let rank=e=>c.get(searchItemAddress(e))?.implementation===`native`?0:1;return rank(e)-rank(t)});let u=[...o.values()];return{config:n,result:{items:u.flatMap(e=>e.items),pagination:{hasMore:u.some(e=>e.pagination.hasMore),limit:t.limit??100,offset:0,total:u.reduce((e,t)=>e+t.pagination.total,0)},...s.size>0?{errors:[...s.values()]}:{}},resultsBySource:o,sources:r,metadataByAddress:c}}async function browseRegistryCatalog(e,t={}){let{result:n}=await searchRegistryCatalog(e,t);return{items:n.items.map(e=>{let t={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry};return e.title!==void 0&&(t.title=e.title),e.type!==void 0&&(t.type=e.type),e.description!==void 0&&(t.description=e.description),t}),total:n.pagination.total,errors:n.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,resultsBySource:o,sources:s,metadataByAddress:l}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),u=a.errors??[];if(i.json||o.size>0){let t=a.items.map(e=>({...e,...l.get(searchItemAddress(e))})),r={query:n,sections:searchPresentationSections(s,o,l)};i.json&&(r.json={...a,items:t}),printRegistrySearchResults(e,r)}for(let t of u)e.error(`${t.registry}: ${t.message}`);u.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let n=await readEveRegistryConfig(e),r=await getRegistryItems([itemAddress(t)],{config:n});return r.length===1?r[0]:r}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode,c=await runAddCommand(o,e,t,{...n,yes:n.prompter===void 0||n.yes,setupAuthorized:n.prompter!==void 0},r);if(process.exitCode=s,i!==void 0)throw Error(i);let l={output:a};return c!==void 0&&(l.setup=c),l}async function runAddCommand(e,t,s,c,l=defaultAddCommandDependencies){return runRegistryAction(e,t,async()=>{let u=await readEveRegistryConfig(t),d=itemAddress(s);if(c.skipInstall===!0){if(c.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(c.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(d))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let f=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([d],{config:u}))[0],()=>printAddSuggestions(e,t,s));if(!f.found)return;let p=f.item,m=isOfficialItemAddress(d)?eveMetadataFromRegistryItem(p):void 0;if(assertCompatibleEveVersion(m?.requires),m?.components!==void 0){if(!isOfficialItemAddress(d))throw Error(`Registry packages require the official eve registry.`);return reportCompletion(e,s,await runRegistryPackage({logger:e,appRoot:t,item:s,components:m.components,config:u,options:c,dependencies:l,operations:{itemAddress,metadata:eveMetadataFromRegistryItem,assertCompatibleVersion:assertCompatibleEveVersion,runSetups:({item:n,setups:i,prompter:a})=>runDeclaredSetups({logger:e,appRoot:t,item:n,setups:i,options:{yes:c.yes,nonInteractive:c.nonInteractive,answers:c.answers,prompter:a,signal:c.signal},dependencies:l,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)}),setupReminder:e=>setupReminder(e,`skipped`)}}),c)}if(c.skipInstall===!0){if(m?.setup===void 0)throw Error(`Registry item "${s}" does not declare a setup flow.`);return reportCompletion(e,s,await runDeclaredSetups({logger:e,appRoot:t,item:s,setups:m.setup,options:c,dependencies:l,cancelledReminder:setupReminder(s,`cancelled`),resumeCommand:setupResumeCommand(s)}),c)}if(d===itemAddress(`channel/web`)&&await(l.prepareWebRegistryProject??prepareWebRegistryProject)(t),await installRegistryItemTransaction({appRoot:t,item:s,registryItem:p,nonInteractive:c.nonInteractive,logger:e,install:async()=>{await addRegistryItems([d],{config:u,cwd:t,overwrite:c.overwrite,silent:c.silent})}}),m?.setup===void 0)return reportCompletion(e,s,{facts:[]},c);let h=l.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(c.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`progress`,message:c.skipInstall?`Setup ${s}`:`Installed ${s}`})),c.skipSetup===!0){if(c.nonInteractive)return reportCompletion(e,s,{facts:[]},c);e.log(setupReminder(s,`skipped`));return}if(!c.nonInteractive&&!c.yes&&!h&&c.setupAuthorized!==!0){e.log(setupReminder(s,`skipped`));return}if(!c.nonInteractive&&!c.yes&&c.setupAuthorized!==!0)try{if(await(c.prompter??l.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${s} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(s,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(s,`cancelled`));return}return reportCompletion(e,s,await runDeclaredSetups({logger:e,appRoot:t,item:s,setups:m.setup,options:c,dependencies:l,cancelledReminder:setupReminder(s,`cancelled`),resumeCommand:setupResumeCommand(s)}),c)})}function reportCompletion(e,n,r,i){return reportHeadlessSetupCompletion({logger:e,item:n,completion:r,nonInteractive:i.nonInteractive})}async function runRegistryAddCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await addRegistryMappings(t,n);for(let t of r.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of r.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);r.added.length>0&&e.log(`Added ${r.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n,r={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n,r))}async function runRegistrySearchCommand(e,t,n,r,i={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r,{...i,limit:i.limit??10}))}async function runRegistryViewCommand(e,t,n,r={}){await runRegistryAction(e,t,async()=>{let i=await readEveRegistryConfig(t),a=await getRegistryItems([itemAddress(n)],{config:i}),o=a.length===1?a[0]:a;e.log(r.json?JSON.stringify(o,null,2):registryViewText(n,o))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
|
|
@@ -40,6 +40,11 @@ export type HeadlessSetupEvent = {
|
|
|
40
40
|
item: string;
|
|
41
41
|
completedItems: readonly string[];
|
|
42
42
|
message: string;
|
|
43
|
+
failureCode?: "pnpm_build_policy" | "dependency_install";
|
|
44
|
+
/** True when every project file tracked by the installer was restored. */
|
|
45
|
+
rolledBack?: boolean;
|
|
46
|
+
/** Project-relative paths that could not be restored. Never contains file contents. */
|
|
47
|
+
changed?: readonly string[];
|
|
43
48
|
next?: HeadlessSetupCommand;
|
|
44
49
|
} | {
|
|
45
50
|
version: 1;
|
|
@@ -51,6 +56,7 @@ export type HeadlessSetupEvent = {
|
|
|
51
56
|
export declare function headlessSetupContinuation(input: {
|
|
52
57
|
item: string;
|
|
53
58
|
installed: boolean;
|
|
59
|
+
answers?: Readonly<Record<string, unknown>>;
|
|
54
60
|
question?: Extract<RegistrySetupBlocker, {
|
|
55
61
|
status: "input_required";
|
|
56
62
|
}>["question"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function headlessSetupContinuation(e){let t=e.question?.kind===`environment`||e.question===void 0?[]:[`--answer`,`${e.question.key}=<JSON value>`];return{command:`eve`,args:[`add`,e.item,`--non-interactive`,...e.installed?[`--skip-install`]:[],...t]}}function reportHeadlessSetupCompletion(e){if(e.completion!==!1)return e.nonInteractive===!0&&e.logger.log(serializeHeadlessSetupEvent({version:1,type:`completed`,item:e.item,completedItems:[e.item],...e.completion.deploymentRequired===!0?{deploymentRequired:!0,next:{command:`eve`,args:[`deploy`]}}:{}})),e.completion}function serializeHeadlessSetupEvent(e){return JSON.stringify(e)}export{headlessSetupContinuation,reportHeadlessSetupCompletion,serializeHeadlessSetupEvent};
|
|
1
|
+
function headlessSetupContinuation(e){let t=Object.entries(e.answers??{}).flatMap(([e,t])=>[`--answer`,`${e}=${JSON.stringify(t)}`]),n=e.question?.kind===`environment`||e.question===void 0?[]:[`--answer`,`${e.question.key}=<JSON value>`];return{command:`eve`,args:[`add`,e.item,`--non-interactive`,...e.installed?[`--skip-install`]:[],...t,...n]}}function reportHeadlessSetupCompletion(e){if(e.completion!==!1)return e.nonInteractive===!0&&e.logger.log(serializeHeadlessSetupEvent({version:1,type:`completed`,item:e.item,completedItems:[e.item],...e.completion.deploymentRequired===!0?{deploymentRequired:!0,next:{command:`eve`,args:[`deploy`]}}:{}})),e.completion}function serializeHeadlessSetupEvent(e){return JSON.stringify(e)}export{headlessSetupContinuation,reportHeadlessSetupCompletion,serializeHeadlessSetupEvent};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveTuiDisplayOptions}from"./ui-options.js";import{resolveTuiTitle}from"./tui/target.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{resumeDevelopmentRuntimeArtifacts,suspendDevelopmentRuntimeArtifacts}from"#services/dev-client/runtime-artifacts.js";async function runInteractiveDevelopmentUi(
|
|
1
|
+
import{resolveTuiDisplayOptions}from"./ui-options.js";import{resolveTuiTitle}from"./tui/target.js";import{randomUUID}from"node:crypto";import{devBootPhase}from"#internal/dev-boot-progress.js";import{resumeDevelopmentRuntimeArtifacts,suspendDevelopmentRuntimeArtifacts}from"#services/dev-client/runtime-artifacts.js";async function runInteractiveDevelopmentUi(r){let i=await devBootPhase(`loading interactive UI`,async()=>r.runDevelopmentTui??(await import(`#cli/dev/tui/tui.js`)).runDevelopmentTui,r.report),a=r.remoteTarget===void 0||r.existingLocalServer?{kind:`local`,serverUrl:r.server.serverUrl,workspaceRoot:r.server.appRoot??r.applicationRoot}:{kind:`remote`,serverUrl:r.server.serverUrl,workspaceRoot:r.applicationRoot},o=resolveTuiDisplayOptions(r.options),s=resolveTuiTitle({name:r.options.name,target:a});s!==void 0&&(o.name=s);let c={target:a,initialInput:r.options.input,onBootProgress:r.report,lifecycle:r.lifecycle,...o};r.startup!==void 0&&(c.startup=r.startup),a.kind===`local`&&(c.withExclusiveTerminal=async e=>{let t=randomUUID();if(!await suspendDevelopmentRuntimeArtifacts({leaseId:t,serverUrl:r.server.serverUrl}))throw Error(`Could not pause the development server for integration setup.`);let n;try{n={ok:!0,value:await e()}}catch(e){n={error:e,ok:!1}}let i={leaseId:t,serverUrl:r.server.serverUrl,silent:!0};if(await resumeDevelopmentRuntimeArtifacts(i)===void 0&&await resumeDevelopmentRuntimeArtifacts(i)===void 0)throw Error(`Could not resume the eve development server after integration setup. Restart eve dev before making further source changes.`,n.ok?void 0:{cause:n.error});if(!n.ok)throw n.error;return n.value}),r.remoteTarget?.headers===void 0?await i(c):await i({...c,headers:r.remoteTarget.headers})}export{runInteractiveDevelopmentUi};
|
|
@@ -34,6 +34,10 @@ export declare function deleteForward(state: LineState): LineState;
|
|
|
34
34
|
export declare function moveLeft(state: LineState): LineState;
|
|
35
35
|
/** Moves the caret one grapheme right. */
|
|
36
36
|
export declare function moveRight(state: LineState): LineState;
|
|
37
|
+
/** Moves to the beginning of the current or previous word (Alt+B). */
|
|
38
|
+
export declare function moveWordBackward(state: LineState): LineState;
|
|
39
|
+
/** Moves to the end of the current or next word (Alt+F). */
|
|
40
|
+
export declare function moveWordForward(state: LineState): LineState;
|
|
37
41
|
/** Moves the caret to the start of the line (Home / Ctrl+A). */
|
|
38
42
|
export declare function moveHome(state: LineState): LineState;
|
|
39
43
|
/** Moves the caret to the end of the line (End / Ctrl+E). */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{inputTextWidth,offsetAtVisibleColumn}from"#cli/ui/terminal-text.js";import{graphemeBoundaryAtOrAfter,graphemes,nextGraphemeBoundary,previousGraphemeBoundary}from"#shared/text-boundaries.js";const EMPTY_LINE={text:``,cursor:0};function lineOf(e){return{text:e,cursor:e.length}}function maskLine(e){return{text:`•`.repeat(graphemes(e.text).length),cursor:graphemes(e.text.slice(0,e.cursor)).length}}function insert(e,t){if(t.length===0)return e;let r=e.text.slice(0,e.cursor)+t+e.text.slice(e.cursor);return{text:r,cursor:graphemeBoundaryAtOrAfter(r,e.cursor+t.length)}}function backspace(e){if(e.cursor===0)return e;let t=previousGraphemeBoundary(e.text,e.cursor),r=e.text.slice(0,t)+e.text.slice(e.cursor);return{text:r,cursor:graphemeBoundaryAtOrAfter(r,t)}}function deleteForward(e){if(e.cursor>=e.text.length)return e;let t=nextGraphemeBoundary(e.text,e.cursor),r=e.text.slice(0,e.cursor)+e.text.slice(t);return{text:r,cursor:graphemeBoundaryAtOrAfter(r,e.cursor)}}function moveLeft(e){return e.cursor===0?e:{text:e.text,cursor:previousGraphemeBoundary(e.text,e.cursor)}}function moveRight(e){return e.cursor>=e.text.length?e:{text:e.text,cursor:nextGraphemeBoundary(e.text,e.cursor)}}function moveHome(e){let t=logicalLineStart(e.text,e.cursor);return e.cursor===t?e:{text:e.text,cursor:t}}function moveEnd(e){let t=logicalLineEnd(e.text,e.cursor);return e.cursor===t?e:{text:e.text,cursor:t}}function killToEnd(e){let t=logicalLineEnd(e.text,e.cursor);return e.cursor>=t?e:{text:e.text.slice(0,e.cursor)+e.text.slice(t),cursor:e.cursor}}function killToStart(e){let t=logicalLineStart(e.text,e.cursor);return e.cursor<=t?e:{text:e.text.slice(0,t)+e.text.slice(e.cursor),cursor:t}}function deleteWord(e){if(e.cursor===0)return e;let t=logicalLineStart(e.text,e.cursor),r=e.cursor;for(;r>t;){let t=previousGraphemeBoundary(e.text,r);if(!isWhitespace(e.text.slice(t,r)))break;r=t}for(;r>t;){let t=previousGraphemeBoundary(e.text,r);if(isWhitespace(e.text.slice(t,r)))break;r=t}let i=e.text.slice(0,r)+e.text.slice(e.cursor);return{text:i,cursor:graphemeBoundaryAtOrAfter(i,r)}}function logicalLineStart(e,t){return t===0?0:e.lastIndexOf(`
|
|
1
|
+
import{inputTextWidth,offsetAtVisibleColumn}from"#cli/ui/terminal-text.js";import{graphemeBoundaryAtOrAfter,graphemes,nextGraphemeBoundary,previousGraphemeBoundary}from"#shared/text-boundaries.js";const EMPTY_LINE={text:``,cursor:0};function lineOf(e){return{text:e,cursor:e.length}}function maskLine(e){return{text:`•`.repeat(graphemes(e.text).length),cursor:graphemes(e.text.slice(0,e.cursor)).length}}function insert(e,t){if(t.length===0)return e;let r=e.text.slice(0,e.cursor)+t+e.text.slice(e.cursor);return{text:r,cursor:graphemeBoundaryAtOrAfter(r,e.cursor+t.length)}}function backspace(e){if(e.cursor===0)return e;let t=previousGraphemeBoundary(e.text,e.cursor),r=e.text.slice(0,t)+e.text.slice(e.cursor);return{text:r,cursor:graphemeBoundaryAtOrAfter(r,t)}}function deleteForward(e){if(e.cursor>=e.text.length)return e;let t=nextGraphemeBoundary(e.text,e.cursor),r=e.text.slice(0,e.cursor)+e.text.slice(t);return{text:r,cursor:graphemeBoundaryAtOrAfter(r,e.cursor)}}function moveLeft(e){return e.cursor===0?e:{text:e.text,cursor:previousGraphemeBoundary(e.text,e.cursor)}}function moveRight(e){return e.cursor>=e.text.length?e:{text:e.text,cursor:nextGraphemeBoundary(e.text,e.cursor)}}function moveWordBackward(e){let t=e.cursor;for(;t>0;){let n=previousGraphemeBoundary(e.text,t);if(isWordCharacter(e.text.slice(n,t)))break;t=n}for(;t>0;){let n=previousGraphemeBoundary(e.text,t);if(!isWordCharacter(e.text.slice(n,t)))break;t=n}return t===e.cursor?e:{text:e.text,cursor:t}}function moveWordForward(e){let t=e.cursor;for(;t<e.text.length;){let n=nextGraphemeBoundary(e.text,t);if(isWordCharacter(e.text.slice(t,n)))break;t=n}for(;t<e.text.length;){let n=nextGraphemeBoundary(e.text,t);if(!isWordCharacter(e.text.slice(t,n)))break;t=n}return t===e.cursor?e:{text:e.text,cursor:t}}function moveHome(e){let t=logicalLineStart(e.text,e.cursor);return e.cursor===t?e:{text:e.text,cursor:t}}function moveEnd(e){let t=logicalLineEnd(e.text,e.cursor);return e.cursor===t?e:{text:e.text,cursor:t}}function killToEnd(e){let t=logicalLineEnd(e.text,e.cursor);return e.cursor>=t?e:{text:e.text.slice(0,e.cursor)+e.text.slice(t),cursor:e.cursor}}function killToStart(e){let t=logicalLineStart(e.text,e.cursor);return e.cursor<=t?e:{text:e.text.slice(0,t)+e.text.slice(e.cursor),cursor:t}}function deleteWord(e){if(e.cursor===0)return e;let t=logicalLineStart(e.text,e.cursor),r=e.cursor;for(;r>t;){let t=previousGraphemeBoundary(e.text,r);if(!isWhitespace(e.text.slice(t,r)))break;r=t}for(;r>t;){let t=previousGraphemeBoundary(e.text,r);if(isWhitespace(e.text.slice(t,r)))break;r=t}let i=e.text.slice(0,r)+e.text.slice(e.cursor);return{text:i,cursor:graphemeBoundaryAtOrAfter(i,r)}}function logicalLineStart(e,t){return t===0?0:e.lastIndexOf(`
|
|
2
2
|
`,t-1)+1}function logicalLineEnd(e,t){let n=e.indexOf(`
|
|
3
3
|
`,t);return n===-1?e.length:n}function applyLineEditorKey(e,t,n){let r=n?.multiline??!1;switch(t.type){case`text`:return insert(e,r?t.value:t.value.replaceAll(`
|
|
4
4
|
`,` `));case`newline`:return r?insert(e,`
|
|
5
|
-
`):void 0;case`backspace`:return backspace(e);case`delete`:return deleteForward(e);case`left`:return moveLeft(e);case`right`:return moveRight(e);case`home`:case`ctrl-a`:return moveHome(e);case`end`:case`ctrl-e`:return moveEnd(e);case`ctrl-k`:return killToEnd(e);case`ctrl-u`:return killToStart(e);case`ctrl-w`:return deleteWord(e);default:return}}function isWhitespace(e){return/^\s+$/u.test(e)}function visibleLine(t,n,i=`…`){let a=Math.max(1,n),{text:o,cursor:s}=t,c=graphemes(o),l=c.findIndex(e=>e.start===s),u=l===-1?c.length:l,d=c[u]?.text??``;if(inputTextWidth(o)<=a)return{before:o.slice(0,s),under:d,after:o.slice(s+d.length)};let f=u,p=u+ +(d.length>0),windowWidth=(t,n)=>{let r=c[t]?.start??o.length,a=c[n]?.start??o.length;return inputTextWidth(o.slice(r,a))+(t>0?inputTextWidth(i):0)+(n<c.length?inputTextWidth(i):0)},m=!0;for(;;){let e=f>0&&windowWidth(f-1,p)<=a,t=p<c.length&&windowWidth(f,p+1)<=a;if(!e&&!t)break;m&&e||!t?--f:p+=1,m=!m}let h=c[f]?.start??o.length,g=c[p]?.start??o.length;return{before:`${f>0?i:``}${o.slice(h,s)}`,under:d,after:`${o.slice(s+d.length,g)}${p<c.length?i:``}`}}function layoutPromptInput(e){let t=[],n=0,r=0,i=0;for(let a of e.text.split(`
|
|
6
|
-
`))e.cursor>=i&&e.cursor<=i+a.length&&(n=t.length,r=e.cursor-i),t.push({text:a,start:i}),i+=a.length+1;return{rows:t,caretRow:n,caretOffset:r}}function movePromptLine(n,r){let i=layoutPromptInput(n),a=r===`up`?i.caretRow-1:i.caretRow+1;if(a<0||a>=i.rows.length)return;let o=i.rows[i.caretRow],s=i.rows[a],c=inputTextWidth(o.text.slice(0,i.caretOffset));return{text:n.text,cursor:s.start+offsetAtVisibleColumn(s.text,c)}}var PromptHistory=class{#e=[];#t=0;#n=``;add(e){if(e.trim().length!==0){if(this.#e.at(-1)===e){this.#r();return}this.#e.push(e),this.#r()}}begin(e){this.#t=this.#e.length,this.#n=e}previous(e){if(this.#e.length!==0&&(this.#t===this.#e.length&&(this.#n=e),this.#t!==0))return--this.#t,this.#e[this.#t]}next(){if(!(this.#t>=this.#e.length))return this.#t+=1,this.#t===this.#e.length?this.#n:this.#e[this.#t]}#r(){this.#t=this.#e.length,this.#n=``}};export{EMPTY_LINE,PromptHistory,applyLineEditorKey,backspace,deleteForward,deleteWord,insert,killToEnd,killToStart,layoutPromptInput,lineOf,maskLine,moveEnd,moveHome,moveLeft,movePromptLine,moveRight,visibleLine};
|
|
5
|
+
`):void 0;case`backspace`:return backspace(e);case`delete`:return deleteForward(e);case`left`:case`ctrl-b`:return moveLeft(e);case`right`:case`ctrl-f`:return moveRight(e);case`alt-b`:return moveWordBackward(e);case`alt-f`:return moveWordForward(e);case`home`:case`ctrl-a`:return moveHome(e);case`end`:case`ctrl-e`:return moveEnd(e);case`ctrl-k`:return killToEnd(e);case`ctrl-u`:return killToStart(e);case`ctrl-w`:return deleteWord(e);default:return}}function isWhitespace(e){return/^\s+$/u.test(e)}function isWordCharacter(e){return/^[\p{L}\p{M}\p{N}_]/u.test(e)}function visibleLine(t,n,i=`…`){let a=Math.max(1,n),{text:o,cursor:s}=t,c=graphemes(o),l=c.findIndex(e=>e.start===s),u=l===-1?c.length:l,d=c[u]?.text??``;if(inputTextWidth(o)<=a)return{before:o.slice(0,s),under:d,after:o.slice(s+d.length)};let f=u,p=u+ +(d.length>0),windowWidth=(t,n)=>{let r=c[t]?.start??o.length,a=c[n]?.start??o.length;return inputTextWidth(o.slice(r,a))+(t>0?inputTextWidth(i):0)+(n<c.length?inputTextWidth(i):0)},m=!0;for(;;){let e=f>0&&windowWidth(f-1,p)<=a,t=p<c.length&&windowWidth(f,p+1)<=a;if(!e&&!t)break;m&&e||!t?--f:p+=1,m=!m}let h=c[f]?.start??o.length,g=c[p]?.start??o.length;return{before:`${f>0?i:``}${o.slice(h,s)}`,under:d,after:`${o.slice(s+d.length,g)}${p<c.length?i:``}`}}function layoutPromptInput(e){let t=[],n=0,r=0,i=0;for(let a of e.text.split(`
|
|
6
|
+
`))e.cursor>=i&&e.cursor<=i+a.length&&(n=t.length,r=e.cursor-i),t.push({text:a,start:i}),i+=a.length+1;return{rows:t,caretRow:n,caretOffset:r}}function movePromptLine(n,r){let i=layoutPromptInput(n),a=r===`up`?i.caretRow-1:i.caretRow+1;if(a<0||a>=i.rows.length)return;let o=i.rows[i.caretRow],s=i.rows[a],c=inputTextWidth(o.text.slice(0,i.caretOffset));return{text:n.text,cursor:s.start+offsetAtVisibleColumn(s.text,c)}}var PromptHistory=class{#e=[];#t=0;#n=``;add(e){if(e.trim().length!==0){if(this.#e.at(-1)===e){this.#r();return}this.#e.push(e),this.#r()}}begin(e){this.#t=this.#e.length,this.#n=e}previous(e){if(this.#e.length!==0&&(this.#t===this.#e.length&&(this.#n=e),this.#t!==0))return--this.#t,this.#e[this.#t]}next(){if(!(this.#t>=this.#e.length))return this.#t+=1,this.#t===this.#e.length?this.#n:this.#e[this.#t]}#r(){this.#t=this.#e.length,this.#n=``}};export{EMPTY_LINE,PromptHistory,applyLineEditorKey,backspace,deleteForward,deleteWord,insert,killToEnd,killToStart,layoutPromptInput,lineOf,maskLine,moveEnd,moveHome,moveLeft,movePromptLine,moveRight,moveWordBackward,moveWordForward,visibleLine};
|
|
@@ -391,6 +391,8 @@ export declare class EveTUIRunner {
|
|
|
391
391
|
constructor(options: EveTUIRunnerOptions);
|
|
392
392
|
run(): Promise<void>;
|
|
393
393
|
}
|
|
394
|
+
/** Returns the registry address carried by a self-modification terminal handoff. */
|
|
395
|
+
export declare function registryHandoffAddress(toolName: string | undefined, output: unknown): string | undefined;
|
|
394
396
|
export type ConnectionAuthChallenge = {
|
|
395
397
|
url?: string;
|
|
396
398
|
userCode?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{PROMPT_COMMANDS,formatPromptCommandHelp,parsePromptCommand}from"./prompt-commands.js";import{pickAgentHeaderTip}from"./agent-header.js";import{failureKey,formatFailureDetail,formatFailureHint,formatFailureMessage,isInterruptedError,localFailureHint}from"./errors.js";import{parseLogDisplayMode}from"./log-display-mode.js";import{createMcpConnectionStatusTracker}from"./mcp-connection-status.js";import{createRemoteConnectionController}from"./remote-connection.js";import{SubagentPump}from"./subagent-pump.js";import{BOOT_DETECTIONS,CLI_MISSING_SETUP_ISSUE,LOGIN_SETUP_ISSUE,detectSetupIssues,formatSetupIssuesLine,normalizeLocalModelEndpoint,orderedSetupIssues}from"./setup-issues.js";import{TerminalRenderer}from"./terminal-renderer.js";import{createVercelStatusTracker}from"./vercel-status.js";import"#client/index.js";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{inspectApplication}from"#services/inspect-application.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{toErrorMessage}from"#shared/errors.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";import{probeAgentInfo}from"#services/dev-client/agent-info-probe.js";import{renderApplicationInfo}from"#cli/commands/info.js";import{subscribeDevelopmentSandboxPrewarmLogs}from"#execution/sandbox/development-prewarm.js";import{createEventDeduper}from"#protocol/event-dedupe.js";import{isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{createDevelopmentRuntimeArtifactRefresher}from"#services/dev-client.js";async function delayMs(e){await new Promise(t=>{setTimeout(t,e).unref?.()})}function authIssueForStatus(e){if(e===`logged-out`)return LOGIN_SETUP_ISSUE;if(e===`cli-missing`)return CLI_MISSING_SETUP_ISSUE}var EveTUIRunner=class{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m;#h;#g;#_;#v;#y;#b;#x;#S;#C;#w=!1;#T=new AbortController;#E=!1;#D=[];#O;#k;#A;#j;#M;#N=new Map;#P;#F;#I=new Map;#L=new Set;#R;#z;#B;constructor(t){this.#e=t.session,t.client!==void 0&&(this.#t=t.client),t.lifecycle!==void 0&&(this.#B=t.lifecycle),this.#n=createRenderer(t);let n={formatActionResultError};if(this.#t!==void 0&&(n.client=this.#t),this.#n.subagents!==void 0&&(n.view=this.#n.subagents),this.#F=new SubagentPump(n),this.#r=t.name??`eve`,this.#j=t.startup?.headerTip??pickAgentHeaderTip(),this.#v=t.withExclusiveTerminal,this.#i=t.tools??`full`,this.#a=t.reasoning??`full`,this.#o=t.subagents??`full`,this.#s=t.connectionAuth??`full`,this.#c=t.assistantResponseStats??`tokensPerSecond`,this.#l=t.contextSize,this.#u=t.formatTransportError??toErrorMessage,t.initialInput!==void 0&&(this.#m=t.initialInput),t.startup!==void 0&&(this.#h=t.startup),t.appRoot!==void 0){this.#p=t.appRoot;let e={appRoot:t.appRoot,onChange:e=>this.#n.setVercelStatus?.(e)};t.detectProjectIdentity!==void 0&&(e.detectIdentity=t.detectProjectIdentity),this.#k=createVercelStatusTracker(e),t.probeMcpConnection!==void 0&&(this.#A=createMcpConnectionStatusTracker({onChange:()=>{},probe:t.probeMcpConnection}))}if(t.promptCommandHandler!==void 0&&(this.#g=t.promptCommandHandler),this.#_=t.availablePromptCommands??PROMPT_COMMANDS,t.remote!==void 0){if(this.#t===void 0)throw Error(`A remote TUI requires a configured development client.`);this.#y=createRemoteConnectionController({client:this.#t,credentials:t.remote.credentials,target:t.remote.target,onChange:e=>this.#n.setRemoteConnectionStatus?.(e),resolveOidcToken:t.remote.resolveOidcToken,resolveDeployment:t.remote.resolveDeployment})}this.#b=t.bootDetections??BOOT_DETECTIONS,this.#x=t.getVercelAuthStatus??getVercelAuthStatus,this.#S=t.inspectApplication??inspectApplication,t.onBootProgress!==void 0&&(this.#C=t.onBootProgress),t.serverUrl!==void 0&&(this.#f=t.serverUrl),t.serverUrl!==void 0&&t.remote===void 0&&(this.#d=createDevelopmentRuntimeArtifactRefresher({serverUrl:t.serverUrl}))}async#V(){if(this.#f===void 0)return this.#U(),await this.#te(void 0),this.#h?.finish()??this.#m;let e;if(this.#y!==void 0){let t=await this.#y.check();t.state===`ready`&&(e=t.info)}else{let t=this.#t;if(t!==void 0)try{let n=await devBootPhase(`connecting to agent`,()=>probeAgentInfo({client:t}),this.#C);n.kind===`ready`&&(e=n.info)}catch{e=void 0}}let t=this.#h?.finish()??this.#m;this.#U();let n=this.#H(e);return await this.#te(n),t}#H(e){let t=this.#p===void 0?e:normalizeLocalModelEndpoint(e,process.env);this.#M=t;let n=this.#f;if(n===void 0)return t;let r={name:this.#r,serverUrl:n};return t!==void 0&&(r.info=t),this.#p!==void 0&&(r.tip=this.#j),this.#n.renderAgentHeader?.(r),t}#U(){let e=this.#C;this.#C=void 0,e?.({type:`before-first-paint`})}async run(){let onStop=()=>this.#n.requestInterrupt?.();this.#B?.signal.aborted===!0?onStop():this.#B?.signal.addEventListener(`abort`,onStop,{once:!0});try{await this.#W()}finally{this.#B?.signal.removeEventListener(`abort`,onStop),this.#w=!0,this.#T.abort(),this.#F.abortAll(),this.#z?.(),this.#z=void 0,this.#n.shutdown?.(),this.#k?.dispose(),this.#A?.dispose(),this.#y?.dispose()}}async#W(){let e=this.#r,r,i,a=!1,o=!1,s=!1,l=await this.#V();this.#y?.current().connection.state===`auth-required`&&await this.#ue({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`}),this.#ae(),this.#k?.refreshIdentity(),this.#A?.refresh();let u=this.#m===void 0?void 0:parsePromptCommand(this.#m);for(u?.type===`extension`&&u.name===`model`&&u.argument===``&&this.#p!==void 0&&this.#g!==void 0&&this.#n.setupFlow!==void 0&&(l=void 0,await this.#de(e));;){if(this.#B?.signal.aborted===!0||this.#n.exitRequested?.()===!0)return;if(!s){if(r==null){if(!this.#n.readPrompt){if(a)return;throw Error(`No prompt was provided and the renderer does not support prompt input.`)}let t={title:e};l!==void 0&&(t.initialDraft=l,l=void 0);try{r=await this.#Y(t)}catch(e){if(isInterruptedError(e)){if(this.#P===void 0)return;s=!0,r=``}else throw e}if(r==null&&this.#P===void 0)return}let u=this.#P===void 0?parsePromptCommand(r):null;if(u?.type===`exit`){this.#B?.requestStop();return}if(u?.type===`cancel`){if(this.#e===void 0){this.#oe(`No active turn to cancel.`),i=void 0,o=!1,s=!1,r=void 0;continue}try{let e=await this.#e.cancel();if(this.#oe(e.status===`accepted`?`Turn cancellation requested.`:`No active turn to cancel.`),e.status===`no_active_turn`){i=void 0,o=!1,s=!1,r=void 0;continue}}catch(e){this.#oe(`Couldn't cancel the turn: ${toErrorMessage(e)}`),i=void 0,o=!1,s=!1,r=void 0;continue}i=void 0,o=!0,s=!1,r=void 0}if(u?.type===`reset`){if(!await this.#q()){i=void 0,s=!1,r=void 0;continue}i=void 0,s=!1,r=void 0;continue}if(u?.type===`compact`){if(this.#e===void 0){this.#oe(`No active session to compact.`),i=void 0,o=!1,s=!1,r=void 0;continue}try{let e=await this.#e.compact();if(this.#oe(e.status===`accepted`?`Compaction requested.`:`No active session to compact.`),e.status===`no_active_session`){i=void 0,o=!1,s=!1,r=void 0;continue}}catch(e){this.#oe(`Couldn't compact the session: ${toErrorMessage(e)}`),i=void 0,o=!1,s=!1,r=void 0;continue}i=void 0,o=!0,s=!1,r=void 0}if(u?.type===`clear`){if(this.#e===void 0){this.#oe(`No active session to clear.`),i=void 0,o=!1,s=!1,r=void 0;continue}try{let e=await this.#e.clear();if(this.#oe(e.status===`accepted`?`Context clear requested.`:`No active session to clear.`),e.status===`no_active_session`){i=void 0,o=!1,s=!1,r=void 0;continue}}catch(e){this.#oe(`Couldn't clear the session: ${toErrorMessage(e)}`),i=void 0,o=!1,s=!1,r=void 0;continue}i=void 0,o=!0,s=!1,r=void 0}if(u?.type===`help`){this.#oe(formatPromptCommandHelp(this.#_)),i=void 0,s=!1,r=void 0;continue}if(u?.type===`info`){await this.#me(),i=void 0,s=!1,r=void 0;continue}if(u?.type===`loglevel`){this.#oe(this.#he(u.argument)),i=void 0,s=!1,r=void 0;continue}if(u?.type===`traces`){await this.#pe(u.argument),i=void 0,s=!1,r=void 0;continue}if(u?.type===`extension`){try{await this.#ue(u,e,{trigger:`command`})}catch(e){if(isInterruptedError(e))return;throw e}i=void 0,r=void 0,s=!1;continue}a=!0}let u=this.#P;this.#P=void 0;let d=u??(o?this.#$():await(async()=>(this.#K(),await this.#Z({prompt:s?void 0:r,inputResponses:i})))()),f=this.#e?.state.sessionId;f!==void 0&&this.#n.setSessionId?.(f);let p=r,m=!1;try{for(;;){await this.#n.renderStream(d,{title:e,submittedPrompt:p,continueSession:!!this.#n.readPrompt,tools:this.#i,reasoning:this.#a,subagents:this.#o,connectionAuth:this.#s,assistantResponseStats:this.#c,contextSize:this.#l});let t=d.turnState?.pendingApprovals??[],n=d.turnState?.pendingQuestions??[];if(t.length>0||n.length>0){let a=[];if(t.length>0){if(!this.#n.readToolApproval)throw Error(`Tool approval was requested, but the renderer does not support tool approval input.`);for(let n of t){let t=await this.#n.readToolApproval(n,{title:e});a.push({requestId:n.approvalId,optionId:t.approved?`approve`:`cancel`}),this.#N.delete(n.approvalId)}}if(n.length>0){if(!this.#n.readInputQuestion)throw Error(`An interactive question was requested, but the renderer does not support input questions.`);for(let t of n){let n=toAgentTUIInputQuestion(t),r=await this.#n.readInputQuestion(n,{title:e});if(r===void 0)continue;let i={requestId:t.requestId};r.optionId!==void 0&&(i.optionId=r.optionId),r.text!==void 0&&(i.text=r.text),a.push(i),this.#N.delete(t.requestId)}}if(a.length===0)break;s=!0,i=a,r=void 0,m=!0;break}if(this.#be(d)){d=this.#$(),p=void 0;continue}if(d.turnState&&d.turnState.boundaryEvent===void 0&&!d.turnState.aborted){let e=this.#e?.state.sessionId;this.#n.renderNotice?.(e?`Lost the event stream — the turn may still be running on the server (session ${e}). Your next message resumes this session; use /cancel to stop the turn.`:`Lost the connection to the running turn.`)}break}}catch(e){if(isInterruptedError(e))return;throw e}if(m)continue;o=!1,s=!1,i=void 0,r=void 0;let h=d.turnState?.boundaryEvent;this.#R!==this.#e&&(h===`session.waiting`||h===`session.completed`)&&(r=this.#n.takeQueuedPrompt?.()),this.#K(d.turnState?.aborted===!0)}}#G(){this.#F.abortAll(),this.#N.clear(),this.#I.clear(),this.#L.clear(),this.#n.setConnectionAuthPendingCount?.(0),this.#e=void 0,this.#d?.clear()}#K(e=!1){let t=this.#R;t!==void 0&&(this.#R=void 0,this.#e===t&&(this.#G(),e?this.#n.renderNotice?.(`Stopped following the turn and started a new session. Earlier context was cleared; the interrupted turn may still be running on the server.`):this.#n.renderSessionBoundary===void 0?this.#n.renderNotice?.(`Session ended — started a new session. Earlier context was cleared.`):this.#n.renderSessionBoundary()))}async#q(){if(this.#e===void 0)return this.#G(),this.#n.reset?.(),!0;try{await this.#e.reset()}catch(e){return this.#n.renderNotice?.(`Couldn't reset the session: ${toErrorMessage(e)}`),!1}return this.#G(),this.#n.reset?.(),!0}async#J(e){if(!this.#n.readPrompt)return;let t=this.#n.readPrompt(e),n=this.#d;if(n===void 0)return await t;let r=!1,i=!1,a,o=0,refresh=async()=>{if(!(r||i)){i=!0;try{await n.refreshIdle({onRuntimeArtifactsChanged:()=>this.#ve()});let e=this.#M?.agent.model.endpoint,t=e?.kind===`chatgpt`&&(e.state===`signed-out`||e.state===`reauth-required`),r=Date.now();if(t&&r-o>=5e3){o=r;let e=await this.#_e();e!==void 0&&this.#H(e)}}finally{i=!1}}},startRefresh=()=>{if(r||i)return;let e=refresh().finally(()=>{a===e&&(a=void 0)});a=e};startRefresh();let s=setInterval(()=>{startRefresh()},500);s.unref?.();try{return await t}finally{r=!0,clearInterval(s),await a}}async#Y(e){let t=this.#J(e);if(this.#n.renderIdleStream===void 0||this.#e?.state.sessionId===void 0)return await t;let n=new AbortController,r=this.#X(n.signal,e).catch(e=>{n.signal.aborted||this.#n.renderNotice?.(`Stopped following session updates: ${toErrorMessage(e)}`)});try{return await t}finally{n.abort(),await r}}async#X(e,t){let n=this.#e;if(n===void 0)return;let r=n.stream({signal:e})[Symbol.asyncIterator]();try{for(;!e.aborted;){let i=!1,a={async*[Symbol.asyncIterator](){for(;!e.aborted;){let e=await r.next();if(e.done===!0||(i=!0,yield e.value,isCurrentTurnBoundaryEvent(e.value)))return}}},o=this.#ee(a,()=>{},n);if(await this.#n.renderIdleStream(o,{...t,continueSession:!0}),this.#be(o),(o.turnState?.pendingApprovals.length??0)>0||(o.turnState?.pendingQuestions.length??0)>0){this.#P={events:(async function*(){})(),turnState:o.turnState},this.#n.suspendPromptForInput?.();return}if(!i)return}}finally{await r.return?.()}}async#Z(e){let t=new AbortController,n={signal:t.signal};e.prompt!==void 0&&(n.message=e.prompt),e.inputResponses!==void 0&&e.inputResponses.length>0&&(n.inputResponses=e.inputResponses);let r,i=this.#e;try{if(this.#d!==void 0&&await this.#d.refresh({inputResponses:n.inputResponses,message:n.message,onRuntimeArtifactsChanged:()=>this.#ve()}),n.message!==void 0&&(n.inputResponses?.length??0)===0&&this.#n.flushDelayedDevBuildErrors?.(),this.#e===void 0){if(this.#t===void 0)throw Error(`Cannot create a session without an eve client.`);if(n.message===void 0)throw Error(`Cannot answer an input request before the session starts.`);let e=await this.#t.sessions.create({...n,message:n.message});this.#e=e.session,r=e.response}else r=n.inputResponses===void 0?await this.#e.send(n.message,{signal:n.signal,turnPolicy:`queue`}):await this.#e.respond(n.inputResponses,{signal:n.signal})}catch(e){if(isInterruptedError(e))throw e;return this.#y?.reportFailure(e),this.#R=i,{events:errorOnlyTUIStream({errorText:this.#u(e)}),turnState:createTurnState()}}return this.#ee(r,()=>t.abort(),this.#e)}async#Q(e,t){if(e.cancelInFlight!==!0){e.cancelInFlight=!0;try{for(let n=0;n<8;n+=1){if(e.boundaryEvent!==void 0||e.aborted===!0)return;let n=e.turnId;try{if((await t?.cancel(n===void 0?void 0:{turnId:n}))?.status===`accepted`)return}catch{}await delayMs(250)}}finally{e.cancelInFlight=!1}}}#$(){if(this.#e===void 0)throw Error(`Cannot stream a session before its first turn is accepted.`);let e=new AbortController,t=this.#e;return this.#ee(t.stream({signal:e.signal}),()=>e.abort(),t)}#ee(e,t,n){let r=createTurnState();return{abort:()=>{r.aborted=!0,this.#R=n,t()},cancel:()=>{this.#Q(r,n)},events:eveEventsToTUIStream({events:e,pendingInputRequests:this.#N,turnState:r,onSubagentCalled:e=>this.#F.begin(e),onSubagentBackgrounded:e=>this.#F.background(e),onSubagentCompleted:e=>this.#F.settle(e),onTurnCancelled:e=>this.#F.settleCancelledTurn(e),onConnectionAuthRequired:e=>this.#ye(e),onConnectionAuthCompleted:e=>this.#xe(e),onTerminalFailure:()=>{this.#R=n},failureHintOverride:this.#p===void 0?void 0:localFailureHint}),turnState:r}}async#te(e){if(this.#p===void 0)return;let t={appRoot:this.#p,env:process.env};e!==void 0&&(t.info=e),this.#D=await detectSetupIssues(t,this.#b),this.#n.renderSetupWarning!==void 0&&(this.#ne(),this.#re())}#ne(){let e=orderedSetupIssues(this.#D,this.#O);e.length>0?this.#n.renderSetupWarning?.(formatSetupIssuesLine(e)):this.#n.clearSetupWarning?.()}async#re(){let e=this.#p;if(e===void 0)return;let t;try{t=await this.#x(e,{signal:this.#T.signal})}catch{return}this.#w||this.#E||(this.#O=authIssueForStatus(t),this.#ne())}async#ie(e){let t=this.#p;if(t===void 0||this.#n.renderSetupWarning===void 0)return;let n={appRoot:t,env:process.env};e!==void 0&&(n.info=e);try{this.#D=await detectSetupIssues(n,this.#b);let e=await this.#x(t,{signal:this.#T.signal});this.#O=authIssueForStatus(e)}catch{return}this.#w||this.#ne()}#ae(){this.#p===void 0||this.#n.renderSandboxLog===void 0||this.#z===void 0&&(this.#z=subscribeDevelopmentSandboxPrewarmLogs({appRoot:this.#p,log:e=>this.#n.renderSandboxLog?.(e)}))}#oe(e,t){if(e!==void 0){if(this.#n.renderCommandResult!==void 0){this.#n.renderCommandResult(e,t);return}this.#n.renderNotice?.(e)}}async#se(e,t){let n=this.#g;if(n===void 0)return{message:`/${e.name} is not available in this session.`};let r=this.#M?.agent.model.endpoint,i={renderer:this.#n,title:t.title,initialModelStep:t.initialModelStep,chatGptAccountLabel:r?.kind===`chatgpt`&&r.state===`ready`?r.accountLabel:void 0,remoteConnection:this.#y,withExclusiveTerminal:this.#v},a=this.#A?.current(),o=a!==void 0&&Object.keys(a).length>0?{...i,disabledConnectionReasons:a}:i;return t.keepSetupFlowOpen===!0?await n.handle(e,{...o,keepSetupFlowOpen:!0}):await n.handle(e,o)}#ce(e,t){if(t!==`startup`)return;let n=this.#y?.current().connection.state,r=n===`auth-failed`||n===`unavailable`?`failed`:void 0,i=e.argument.length===0?``:` ${e.argument}`;this.#n.renderCommandInvocation?.(`/${e.name}${i}`,r)}async#le(e){if(e?.kind===`model-access-changed`){this.#k?.applyEffect({kind:`refresh-identity`}),this.#E=!0,await this.#ge();return}e!==void 0&&(this.#k?.applyEffect(e),this.#E=!0,this.#ie(this.#M))}async#ue(e,t,n){let r=await this.#se(e,{initialModelStep:n.initialModelStep,keepSetupFlowOpen:n.keepSetupFlowOpen,title:t});this.#ce(e,n.trigger),this.#oe(r?.message,r?.tone),await this.#le(r?.effect),this.#fe()}async#de(e){let t=this.#p;if(t===void 0)return;let authStatus=async()=>{try{return await this.#x(t,{signal:this.#T.signal})}catch{return}},n=await authStatus();if(n===`cli-missing`&&(await this.#ue({type:`extension`,name:`vc:install`,argument:``},e,{trigger:`startup`,keepSetupFlowOpen:!0}),n=await authStatus(),n===`cli-missing`)){this.#n.setupFlow?.end();return}if(n===`logged-out`&&(await this.#ue({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`,keepSetupFlowOpen:!0}),n=await authStatus(),n===`cli-missing`||n===`logged-out`)){this.#n.setupFlow?.end();return}await this.#ue({type:`extension`,name:`model`,argument:``},e,{trigger:`startup`,initialModelStep:`provider`}),await this.#ue({type:`extension`,name:`add`,argument:``},e,{trigger:`startup`})}#fe(){let e=this.#y?.current().connection;e?.state!==`ready`||e.info===this.#M||(this.#M=e.info,this.#f!==void 0&&this.#n.renderAgentHeader?.({info:e.info,name:this.#r,serverUrl:this.#f}))}async#pe(e){if(this.#p===void 0||this.#n.traceViewer===void 0){this.#oe(`/traces is only available in local dev sessions.`);return}try{await this.#n.traceViewer.open({appRoot:this.#p,sessionId:this.#e?.state.sessionId,reference:e===``?void 0:e})}catch(e){if(isInterruptedError(e))return;throw e}}async#me(){let e=this.#p;if(e===void 0){this.#oe(`/info is only available in local dev sessions.`);return}try{this.#oe(renderApplicationInfo(await this.#S(e)))}catch(e){this.#oe(`Couldn't inspect the application: ${toErrorMessage(e)}`,`error`)}}#he(e){let t=this.#n;if(t.logDisplayMode===void 0||t.setLogDisplayMode===void 0)return`/loglevel is not available in this session.`;if(e===``)return`Logs: ${t.logDisplayMode()}. Use /loglevel all|stderr|sandbox|none — logs stay buffered, so switching also hides or restores past lines.`;let n=parseLogDisplayMode(e);if(n===void 0)return`Unknown log level "${e}". Use all, stderr, sandbox, or none.`;if(n===t.logDisplayMode())return`Logs already set to ${n}.`;switch(t.setLogDisplayMode(n),n){case`none`:return`Logs hidden. Output stays buffered — /loglevel all restores it.`;case`stderr`:return`Showing stderr logs only.`;case`sandbox`:return`Showing sandbox logs only.`;case`all`:return`Showing all logs.`}}async#ge(){let e=this.#p;if(e===void 0)return;loadDevelopmentEnvironmentFiles(e),await this.#d?.refreshAfterSourceChange({});let t=this.#H(await this.#_e());this.#ie(t)}async#_e(){let e=this.#t;if(e===void 0)return;let t=await probeAgentInfo({client:e});return t.kind===`ready`?t.info:void 0}async#ve(){let e=this.#M,t=await this.#_e();t!==void 0&&this.#H(t),(!this.#n.renderAgentHeader||t===void 0)&&this.#n.renderNotice?.(formatAgentUpdateNotice(e,t))}#ye(e){let t={name:e.data.name,description:e.data.description,state:`required`};e.data.authorization!==void 0&&(t.challenge=e.data.authorization),e.data.webhookUrl!==void 0&&(t.webhookUrl=e.data.webhookUrl),this.#I.set(e.data.name,t),this.#Se(t)}#be(e){if(e.turnState?.boundaryEvent!==`session.waiting`)return!1;let t=!1;for(let e of this.#I.values())e.state!==`required`||e.webhookUrl===void 0||(e.state=`pending`,this.#L.add(e.name),this.#Se(e),t=!0);return t&&this.#n.setConnectionAuthPendingCount?.(this.#L.size),this.#L.size>0}#xe(e){let t=this.#I.get(e.data.name)??{name:e.data.name,description:``,state:e.data.outcome};t.state=e.data.outcome,e.data.reason!==void 0&&(t.reason=e.data.reason),this.#I.set(e.data.name,t),this.#L.delete(e.data.name),this.#Se(t),this.#n.setConnectionAuthPendingCount?.(this.#L.size)}#Se(e){let t={name:e.name,description:e.description,state:e.state};e.challenge!==void 0&&(t.challenge=e.challenge),e.reason!==void 0&&(t.reason=e.reason),this.#n.upsertConnectionAuth?.(t)}};function createRenderer(e){return e.renderer?e.renderer:new TerminalRenderer({tools:e.tools,reasoning:e.reasoning,subagents:e.subagents,connectionAuth:e.connectionAuth,assistantResponseStats:e.assistantResponseStats,contextSize:e.contextSize,logs:e.logs,availablePromptCommands:e.availablePromptCommands,input:e.userInput,output:e.screen,diagnostics:e.diagnostics,onExitRequest:e.lifecycle?.requestStop})}function formatAgentUpdateNotice(e,t){let n=e?.agent.model.id,r=t?.agent.model.id;return n!==void 0&&r!==void 0&&n!==r?`Agent updated: Model ${n} -> ${r}`:`Agent updated.`}async function*eveEventsToTUIStream(e){let{events:t,pendingInputRequests:n,turnState:r,onSubagentCalled:i,onSubagentBackgrounded:a,onSubagentCompleted:o,onTurnCancelled:s,onConnectionAuthRequired:c,onConnectionAuthCompleted:l,onTerminalFailure:u,failureHintOverride:d}=e,f=new Map,p=new Map,m=createEventDeduper(),h=0,g=new Set,_=new Set,v=new Set,y=!1,b=!1,x;for await(let e of t)if(m.admit(e)&&!(b&&isPostTurnVisibleEvent(e)))switch(e.type){case`session.started`:case`message.received`:break;case`turn.started`:r.turnId=e.data.turnId;break;case`step.started`:h+=1,yield{type:`step-start`};break;case`step.completed`:{let t=e;x=t.data.usage,yield*closeOpenParts(f,`assistant-complete`,h),yield*closeOpenParts(p,`reasoning-complete`,h),yield{type:`step-finish`,usage:t.data.usage};break}case`message.appended`:{let t=e,n=textPartId(t.data.turnId,t.data.stepIndex),r=partStateFor(f,n),i=t.data.messageSoFar;if(r.completed){if(h<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}if(!i.startsWith(r.text)||i.length<=r.text.length)break;let a=i.slice(r.text.length);r.text=i,yield{type:`assistant-delta`,id:partGenerationId(n,r.generation),delta:a};break}case`message.completed`:{let t=textPartId(e.data.turnId,e.data.stepIndex),n=partStateFor(f,t),r=e.data.message;if(n.completed){if(r===null||h<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=h,yield{type:`assistant-complete`,id:partGenerationId(t,n.generation),text:r};break}let i=partGenerationId(t,n.generation);if(r!==null){if(n.text.length===0)n.text=r,n.completed=!0,n.completedEpoch=h,yield{type:`assistant-complete`,id:i,text:r};else if(r.startsWith(n.text)){let e=r.slice(n.text.length);e.length>0&&(yield{type:`assistant-delta`,id:i,delta:e}),n.text=r,n.completed=!0,n.completedEpoch=h,yield{type:`assistant-complete`,id:i}}}else n.text.length>0&&(n.completed=!0,n.completedEpoch=h,yield{type:`assistant-complete`,id:i});break}case`reasoning.appended`:{let t=e,n=reasoningPartId(t.data.turnId,t.data.stepIndex),r=partStateFor(p,n),i=t.data.reasoningSoFar;if(r.completed){if(h<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}if(!i.startsWith(r.text)||i.length<=r.text.length)break;let a=i.slice(r.text.length);r.text=i,yield{type:`reasoning-delta`,id:partGenerationId(n,r.generation),delta:a};break}case`reasoning.completed`:{let t=reasoningPartId(e.data.turnId,e.data.stepIndex),n=partStateFor(p,t),r=e.data.reasoning;if(n.completed){if(r.length===0||h<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=h;let e=partGenerationId(t,n.generation);yield{type:`reasoning-delta`,id:e,delta:r},yield{type:`reasoning-complete`,id:e};break}let i=partGenerationId(t,n.generation);if(n.text.length===0&&r.length>0)n.text=r,yield{type:`reasoning-delta`,id:i,delta:r};else if(r.length>0&&!r.startsWith(n.text))break;n.completed=!0,n.completedEpoch=h,yield{type:`reasoning-complete`,id:i};break}case`actions.requested`:{let t=e.data.actions.filter(e=>e.kind===`tool-call`);if(t.length===0)break;for(let e of t)g.has(e.callId)||(g.add(e.callId),yield{type:`tool-call`,toolCallId:e.callId,toolName:e.toolName,input:e.input});break}case`input.requested`:{let t=e.data.requests.filter(e=>e.action.kind===`tool-call`);if(t.length===0)break;for(let e of t){let t=e.action.callId;if(e.kind!==`session-limit`&&!g.has(t)&&(g.add(t),yield{type:`tool-call`,toolCallId:t,toolName:e.action.toolName,input:e.action.input}),!_.has(e.requestId)){if(_.add(e.requestId),n.set(e.requestId,e),e.kind!==`tool-approval`){upsertPendingQuestion(r,e);continue}upsertPendingApproval(r,e),yield{type:`tool-approval-request`,approvalId:e.requestId,toolCallId:t}}}break}case`action.result`:{let t=e;if(t.data.result.kind!==`tool-result`)break;let n=t.data.result.callId;if(!g.has(n))break;switch(t.data.status){case`completed`:yield{type:`tool-result`,toolCallId:n,output:t.data.result.output};break;case`failed`:yield{type:`tool-error`,toolCallId:n,errorText:formatActionResultError(t)};break;case`rejected`:yield{type:`tool-rejected`,toolCallId:n,reason:formatActionResultError(t)};break}break}case`step.failed`:case`turn.failed`:{let t=toFailureEvent(e,v,d);t&&(yield t);break}case`session.failed`:{r.sawSessionFailure=!0,u?.(e);let t=toFailureEvent(e,v,d);t&&(yield t),r.boundaryEvent=e.type,yield*closeOpenParts(f,`assistant-complete`,h),yield*closeOpenParts(p,`reasoning-complete`,h),yield{type:`finish`,usage:x},y=!0;return}case`session.waiting`:case`session.completed`:r.boundaryEvent=e.type,yield*closeOpenParts(f,`assistant-complete`,h),yield*closeOpenParts(p,`reasoning-complete`,h),yield{type:`finish`,usage:x},y=!0;return;case`turn.completed`:b=!0,yield*closeOpenParts(f,`assistant-complete`,h),yield*closeOpenParts(p,`reasoning-complete`,h);break;case`turn.cancelled`:s?.(e.data.turnId),yield*closeOpenParts(f,`assistant-complete`,h),yield*closeOpenParts(p,`reasoning-complete`,h),yield{type:`turn-cancelled`};break;case`subagent.called`:i?.(e);break;case`subagent.started`:case`subagent.event`:break;case`subagent.completed`:{let t=e;t.data.backgroundTask===void 0?o?.(t.data.callId):a?.(t.data.callId);break}case`authorization.required`:c?.(e);break;case`authorization.completed`:l?.(e);break;default:break}y||(yield*closeOpenParts(f,`assistant-complete`,h),yield*closeOpenParts(p,`reasoning-complete`,h),yield{type:`finish`,usage:x})}async function*errorOnlyTUIStream(e){yield{type:`error`,errorText:e.errorText},yield{type:`finish`}}function createTurnState(){return{aborted:!1,pendingApprovals:[],pendingQuestions:[],sawSessionFailure:!1}}function upsertPendingApproval(e,t){let n=toAgentTUIToolApprovalRequest(t),r=e.pendingApprovals.findIndex(e=>e.approvalId===n.approvalId);r===-1?e.pendingApprovals.push(n):e.pendingApprovals[r]=n}function toAgentTUIToolApprovalRequest(e){return{approvalId:e.requestId,toolCallId:e.action.callId,toolName:e.action.toolName,input:e.action.input}}function upsertPendingQuestion(e,t){let n=e.pendingQuestions.findIndex(e=>e.requestId===t.requestId);n===-1?e.pendingQuestions.push(t):e.pendingQuestions[n]=t}function textPartId(e,t){return`text:${e}:${t}`}function reasoningPartId(e,t){return`reasoning:${e}:${t}`}function partStateFor(e,t){let n=e.get(t);return n===void 0&&(n={generation:0,text:``,completed:!1,completedEpoch:0},e.set(t,n)),n}function partGenerationId(e,t){return t===0?e:`${e}#${t}`}function*closeOpenParts(e,t,n){for(let[r,i]of e)i.completed||i.text.length===0||(i.completed=!0,i.completedEpoch=n,yield{type:t,id:partGenerationId(r,i.generation)})}function isPostTurnVisibleEvent(e){switch(e.type){case`actions.requested`:case`authorization.completed`:case`authorization.required`:case`input.requested`:case`message.appended`:case`message.completed`:case`reasoning.appended`:case`reasoning.completed`:case`result.completed`:case`step.completed`:case`step.failed`:case`step.started`:case`subagent.called`:case`subagent.completed`:case`subagent.event`:case`subagent.started`:case`turn.completed`:case`turn.failed`:return!0;default:return!1}}function formatActionResultError(e){if(e.data.error?.message)return e.data.error.message;let t=e.data.result.output;if(typeof t==`string`)return t;try{return JSON.stringify(t)}catch{return`Tool execution failed.`}}function toFailureEvent(e,t,n){let r=failureKey(e);if(t.has(r))return;t.add(r);let c={type:`error`,errorText:formatFailureMessage(e)},l=n?.(e)??formatFailureHint(e);l!==void 0&&(c.hint=l);let u=formatFailureDetail(e);return u!==void 0&&(c.detail=u),c}function toAgentTUIInputQuestion(e){let t=e.display===`text`?`text`:e.display===`select`||e.options!==void 0&&e.options.length>0?`select`:`text`,n={requestId:e.requestId,prompt:e.prompt,display:t};return e.options!==void 0&&(n.options=e.options.map(e=>{let t={id:e.id,label:e.label};return e.description!==void 0&&(t.description=e.description),e.style!==void 0&&(t.style=e.style),t})),e.allowFreeform!==void 0&&(n.allowFreeform=e.allowFreeform),n}export{EveTUIRunner,parsePromptCommand};
|
|
1
|
+
import{PROMPT_COMMANDS,formatPromptCommandHelp,parsePromptCommand}from"./prompt-commands.js";import{pickAgentHeaderTip}from"./agent-header.js";import{failureKey,formatFailureDetail,formatFailureHint,formatFailureMessage,isInterruptedError,localFailureHint}from"./errors.js";import{parseLogDisplayMode}from"./log-display-mode.js";import{createMcpConnectionStatusTracker}from"./mcp-connection-status.js";import{createRemoteConnectionController}from"./remote-connection.js";import{SubagentPump}from"./subagent-pump.js";import{BOOT_DETECTIONS,CLI_MISSING_SETUP_ISSUE,LOGIN_SETUP_ISSUE,detectSetupIssues,formatSetupIssuesLine,normalizeLocalModelEndpoint,orderedSetupIssues}from"./setup-issues.js";import{TerminalRenderer}from"./terminal-renderer.js";import{createVercelStatusTracker}from"./vercel-status.js";import"#client/index.js";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{inspectApplication}from"#services/inspect-application.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{toErrorMessage}from"#shared/errors.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";import{probeAgentInfo}from"#services/dev-client/agent-info-probe.js";import{renderApplicationInfo}from"#cli/commands/info.js";import{subscribeDevelopmentSandboxPrewarmLogs}from"#execution/sandbox/development-prewarm.js";import{createEventDeduper}from"#protocol/event-dedupe.js";import{isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{createDevelopmentRuntimeArtifactRefresher}from"#services/dev-client.js";async function delayMs(e){await new Promise(t=>{setTimeout(t,e).unref?.()})}function authIssueForStatus(e){if(e===`logged-out`)return LOGIN_SETUP_ISSUE;if(e===`cli-missing`)return CLI_MISSING_SETUP_ISSUE}var EveTUIRunner=class{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m;#h;#g;#_;#v;#y;#b;#x;#S;#C;#w=!1;#T=new AbortController;#E=!1;#D=[];#O;#k;#A;#j;#M;#N=new Map;#P;#F=[];#I;#L=!1;#R;#z=new Map;#B=new Set;#V;#H;#U;constructor(t){this.#e=t.session,t.client!==void 0&&(this.#t=t.client),t.lifecycle!==void 0&&(this.#U=t.lifecycle),this.#n=createRenderer(t);let n={formatActionResultError};if(this.#t!==void 0&&(n.client=this.#t),this.#n.subagents!==void 0&&(n.view=this.#n.subagents),t.appRoot!==void 0&&(n.onToolCompleted=async(e,t)=>{let n=registryHandoffAddress(e,t);n!==void 0&&this.#ie(n)}),this.#R=new SubagentPump(n),this.#r=t.name??`eve`,this.#j=t.startup?.headerTip??pickAgentHeaderTip(),this.#v=t.withExclusiveTerminal,this.#i=t.tools??`full`,this.#a=t.reasoning??`full`,this.#o=t.subagents??`full`,this.#s=t.connectionAuth??`full`,this.#c=t.assistantResponseStats??`tokensPerSecond`,this.#l=t.contextSize,this.#u=t.formatTransportError??toErrorMessage,t.initialInput!==void 0&&(this.#m=t.initialInput),t.startup!==void 0&&(this.#h=t.startup),t.appRoot!==void 0){this.#p=t.appRoot;let e={appRoot:t.appRoot,onChange:e=>this.#n.setVercelStatus?.(e)};t.detectProjectIdentity!==void 0&&(e.detectIdentity=t.detectProjectIdentity),this.#k=createVercelStatusTracker(e),t.probeMcpConnection!==void 0&&(this.#A=createMcpConnectionStatusTracker({onChange:()=>{},probe:t.probeMcpConnection}))}if(t.promptCommandHandler!==void 0&&(this.#g=t.promptCommandHandler),this.#_=t.availablePromptCommands??PROMPT_COMMANDS,t.remote!==void 0){if(this.#t===void 0)throw Error(`A remote TUI requires a configured development client.`);this.#y=createRemoteConnectionController({client:this.#t,credentials:t.remote.credentials,target:t.remote.target,onChange:e=>this.#n.setRemoteConnectionStatus?.(e),resolveOidcToken:t.remote.resolveOidcToken,resolveDeployment:t.remote.resolveDeployment})}this.#b=t.bootDetections??BOOT_DETECTIONS,this.#x=t.getVercelAuthStatus??getVercelAuthStatus,this.#S=t.inspectApplication??inspectApplication,t.onBootProgress!==void 0&&(this.#C=t.onBootProgress),t.serverUrl!==void 0&&(this.#f=t.serverUrl),t.serverUrl!==void 0&&t.remote===void 0&&(this.#d=createDevelopmentRuntimeArtifactRefresher({serverUrl:t.serverUrl}))}async#W(){if(this.#f===void 0)return this.#K(),await this.#oe(void 0),this.#h?.finish()??this.#m;let e;if(this.#y!==void 0){let t=await this.#y.check();t.state===`ready`&&(e=t.info)}else{let t=this.#t;if(t!==void 0)try{let n=await devBootPhase(`connecting to agent`,()=>probeAgentInfo({client:t}),this.#C);n.kind===`ready`&&(e=n.info)}catch{e=void 0}}let t=this.#h?.finish()??this.#m;this.#K();let n=this.#G(e);return await this.#oe(n),t}#G(e){let t=this.#p===void 0?e:normalizeLocalModelEndpoint(e,process.env);this.#M=t;let n=this.#f;if(n===void 0)return t;let r={name:this.#r,serverUrl:n};return t!==void 0&&(r.info=t),this.#p!==void 0&&(r.tip=this.#j),this.#n.renderAgentHeader?.(r),t}#K(){let e=this.#C;this.#C=void 0,e?.({type:`before-first-paint`})}async run(){let onStop=()=>this.#n.requestInterrupt?.();this.#U?.signal.aborted===!0?onStop():this.#U?.signal.addEventListener(`abort`,onStop,{once:!0});try{await this.#q()}finally{this.#U?.signal.removeEventListener(`abort`,onStop),this.#w=!0,this.#T.abort(),this.#R.abortAll(),this.#H?.(),this.#H=void 0,this.#n.shutdown?.(),this.#k?.dispose(),this.#A?.dispose(),this.#y?.dispose()}}async#q(){let e=this.#r,r,i,a=!1,o=!1,s=!1,l=await this.#W();this.#y?.current().connection.state===`auth-required`&&await this.#he({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`}),this.#ue(),this.#k?.refreshIdentity(),this.#A?.refresh();let u=this.#m===void 0?void 0:parsePromptCommand(this.#m);for(u?.type===`extension`&&u.name===`model`&&u.argument===``&&this.#p!==void 0&&this.#g!==void 0&&this.#n.setupFlow!==void 0&&(l=void 0,await this.#ge(e));;){if(this.#U?.signal.aborted===!0||this.#n.exitRequested?.()===!0)return;let u=this.#F[0];if(u!==void 0&&i===void 0&&this.#P===void 0){this.#F.shift(),this.#I=u;try{await this.#ae(u)}finally{this.#I=void 0}o=!1,s=!1,r=void 0;continue}if(!s){if(r==null){if(!this.#n.readPrompt){if(a)return;throw Error(`No prompt was provided and the renderer does not support prompt input.`)}let t={title:e};l!==void 0&&(t.initialDraft=l,l=void 0);try{this.#L=!0,r=await this.#Q(t)}catch(e){if(isInterruptedError(e)){if(this.#P===void 0&&this.#F.length===0)return;s=!0,r=``}else throw e}finally{this.#L=!1}if(this.#F.length>0&&this.#P===void 0){r=void 0;continue}if(r==null&&this.#P===void 0)return}let u=this.#P===void 0?parsePromptCommand(r):null;if(u?.type===`exit`){this.#U?.requestStop();return}if(u?.type===`cancel`){if(this.#e===void 0){this.#de(`No active turn to cancel.`),i=void 0,o=!1,s=!1,r=void 0;continue}try{let e=await this.#e.cancel();if(this.#de(e.status===`accepted`?`Turn cancellation requested.`:`No active turn to cancel.`),e.status===`no_active_turn`){i=void 0,o=!1,s=!1,r=void 0;continue}}catch(e){this.#de(`Couldn't cancel the turn: ${toErrorMessage(e)}`),i=void 0,o=!1,s=!1,r=void 0;continue}i=void 0,o=!0,s=!1,r=void 0}if(u?.type===`reset`){if(!await this.#X()){i=void 0,s=!1,r=void 0;continue}i=void 0,s=!1,r=void 0;continue}if(u?.type===`compact`){if(this.#e===void 0){this.#de(`No active session to compact.`),i=void 0,o=!1,s=!1,r=void 0;continue}try{let e=await this.#e.compact();if(this.#de(e.status===`accepted`?`Compaction requested.`:`No active session to compact.`),e.status===`no_active_session`){i=void 0,o=!1,s=!1,r=void 0;continue}}catch(e){this.#de(`Couldn't compact the session: ${toErrorMessage(e)}`),i=void 0,o=!1,s=!1,r=void 0;continue}i=void 0,o=!0,s=!1,r=void 0}if(u?.type===`clear`){if(this.#e===void 0){this.#de(`No active session to clear.`),i=void 0,o=!1,s=!1,r=void 0;continue}try{let e=await this.#e.clear();if(this.#de(e.status===`accepted`?`Context clear requested.`:`No active session to clear.`),e.status===`no_active_session`){i=void 0,o=!1,s=!1,r=void 0;continue}}catch(e){this.#de(`Couldn't clear the session: ${toErrorMessage(e)}`),i=void 0,o=!1,s=!1,r=void 0;continue}i=void 0,o=!0,s=!1,r=void 0}if(u?.type===`help`){this.#de(formatPromptCommandHelp(this.#_)),i=void 0,s=!1,r=void 0;continue}if(u?.type===`info`){await this.#ye(),i=void 0,s=!1,r=void 0;continue}if(u?.type===`loglevel`){this.#de(this.#be(u.argument)),i=void 0,s=!1,r=void 0;continue}if(u?.type===`traces`){await this.#ve(u.argument),i=void 0,s=!1,r=void 0;continue}if(u?.type===`extension`){try{await this.#he(u,e,{trigger:`command`})}catch(e){if(isInterruptedError(e))return;throw e}i=void 0,r=void 0,s=!1;continue}a=!0}let d=this.#P;this.#P=void 0;let f=d??(o?this.#ne():await(async()=>(this.#Y(),await this.#ee({prompt:s?void 0:r,inputResponses:i})))()),p=this.#e?.state.sessionId;p!==void 0&&this.#n.setSessionId?.(p);let m=r,h=!1;try{for(;;){await this.#n.renderStream(f,{title:e,submittedPrompt:m,continueSession:!!this.#n.readPrompt,tools:this.#i,reasoning:this.#a,subagents:this.#o,connectionAuth:this.#s,assistantResponseStats:this.#c,contextSize:this.#l});let t=f.turnState?.pendingApprovals??[],n=f.turnState?.pendingQuestions??[];if(t.length>0||n.length>0){let a=[];if(t.length>0){if(!this.#n.readToolApproval)throw Error(`Tool approval was requested, but the renderer does not support tool approval input.`);for(let n of t){let t=await this.#n.readToolApproval(n,{title:e});a.push({requestId:n.approvalId,optionId:t.approved?`approve`:`cancel`}),this.#N.delete(n.approvalId)}}if(n.length>0){if(!this.#n.readInputQuestion)throw Error(`An interactive question was requested, but the renderer does not support input questions.`);for(let t of n){let n=toAgentTUIInputQuestion(t),r=await this.#n.readInputQuestion(n,{title:e});if(r===void 0)continue;let i={requestId:t.requestId};r.optionId!==void 0&&(i.optionId=r.optionId),r.text!==void 0&&(i.text=r.text),a.push(i),this.#N.delete(t.requestId)}}if(a.length===0)break;s=!0,i=a,r=void 0,h=!0;break}if(this.#Te(f)){f=this.#ne(),m=void 0;continue}if(f.turnState&&f.turnState.boundaryEvent===void 0&&!f.turnState.aborted){let e=this.#e?.state.sessionId;this.#n.renderNotice?.(e?`Lost the event stream — the turn may still be running on the server (session ${e}). Your next message resumes this session; use /cancel to stop the turn.`:`Lost the connection to the running turn.`)}break}}catch(e){if(isInterruptedError(e))return;throw e}if(h)continue;o=!1,s=!1,i=void 0,r=void 0;let g=f.turnState?.boundaryEvent;this.#V!==this.#e&&(g===`session.waiting`||g===`session.completed`)&&(r=this.#n.takeQueuedPrompt?.()),this.#Y(f.turnState?.aborted===!0)}}#J(){this.#R.abortAll(),this.#N.clear(),this.#z.clear(),this.#B.clear(),this.#n.setConnectionAuthPendingCount?.(0),this.#e=void 0,this.#d?.clear()}#Y(e=!1){let t=this.#V;t!==void 0&&(this.#V=void 0,this.#e===t&&(this.#J(),e?this.#n.renderNotice?.(`Stopped following the turn and started a new session. Earlier context was cleared; the interrupted turn may still be running on the server.`):this.#n.renderSessionBoundary===void 0?this.#n.renderNotice?.(`Session ended — started a new session. Earlier context was cleared.`):this.#n.renderSessionBoundary()))}async#X(){if(this.#e===void 0)return this.#J(),this.#n.reset?.(),!0;try{await this.#e.reset()}catch(e){return this.#n.renderNotice?.(`Couldn't reset the session: ${toErrorMessage(e)}`),!1}return this.#J(),this.#n.reset?.(),!0}async#Z(e){if(!this.#n.readPrompt)return;let t=this.#n.readPrompt(e),n=this.#d;if(n===void 0)return await t;let r=!1,i=!1,a,o=0,refresh=async()=>{if(!(r||i)){i=!0;try{await n.refreshIdle({onRuntimeArtifactsChanged:()=>this.#Ce()});let e=this.#M?.agent.model.endpoint,t=e?.kind===`chatgpt`&&(e.state===`signed-out`||e.state===`reauth-required`),r=Date.now();if(t&&r-o>=5e3){o=r;let e=await this.#Se();e!==void 0&&this.#G(e)}}finally{i=!1}}},startRefresh=()=>{if(r||i)return;let e=refresh().finally(()=>{a===e&&(a=void 0)});a=e};startRefresh();let s=setInterval(()=>{startRefresh()},500);s.unref?.();try{return await t}finally{r=!0,clearInterval(s),await a}}async#Q(e){let t=this.#Z(e);if(this.#n.renderIdleStream===void 0||this.#e?.state.sessionId===void 0)return await t;let n=new AbortController,r=this.#$(n.signal,e).catch(e=>{n.signal.aborted||this.#n.renderNotice?.(`Stopped following session updates: ${toErrorMessage(e)}`)});try{return await t}finally{n.abort(),await r}}async#$(e,t){let n=this.#e;if(n===void 0)return;let r=n.stream({signal:e})[Symbol.asyncIterator]();try{for(;!e.aborted;){let i=!1,a={async*[Symbol.asyncIterator](){for(;!e.aborted;){let e=await r.next();if(e.done===!0||(i=!0,yield e.value,isCurrentTurnBoundaryEvent(e.value)))return}}},o=this.#re(a,()=>{},n);if(await this.#n.renderIdleStream(o,{...t,continueSession:!0}),this.#Te(o),(o.turnState?.pendingApprovals.length??0)>0||(o.turnState?.pendingQuestions.length??0)>0){this.#P={events:(async function*(){})(),turnState:o.turnState},this.#n.suspendPromptForInput?.();return}if(!i)return}}finally{await r.return?.()}}async#ee(e){let t=new AbortController,n={signal:t.signal};e.prompt!==void 0&&(n.message=e.prompt),e.inputResponses!==void 0&&e.inputResponses.length>0&&(n.inputResponses=e.inputResponses);let r,i=this.#e;try{if(this.#d!==void 0&&await this.#d.refresh({inputResponses:n.inputResponses,message:n.message,onRuntimeArtifactsChanged:()=>this.#Ce()}),n.message!==void 0&&(n.inputResponses?.length??0)===0&&this.#n.flushDelayedDevBuildErrors?.(),this.#e===void 0){if(this.#t===void 0)throw Error(`Cannot create a session without an eve client.`);if(n.message===void 0)throw Error(`Cannot answer an input request before the session starts.`);let e=await this.#t.sessions.create({...n,message:n.message});this.#e=e.session,r=e.response}else r=n.inputResponses===void 0?await this.#e.send(n.message,{signal:n.signal,turnPolicy:`queue`}):await this.#e.respond(n.inputResponses,{signal:n.signal})}catch(e){if(isInterruptedError(e))throw e;return this.#y?.reportFailure(e),this.#V=i,{events:errorOnlyTUIStream({errorText:this.#u(e)}),turnState:createTurnState()}}return this.#re(r,()=>t.abort(),this.#e)}async#te(e,t){if(e.cancelInFlight!==!0){e.cancelInFlight=!0;try{for(let n=0;n<8;n+=1){if(e.boundaryEvent!==void 0||e.aborted===!0)return;let n=e.turnId;try{if((await t?.cancel(n===void 0?void 0:{turnId:n}))?.status===`accepted`)return}catch{}await delayMs(250)}}finally{e.cancelInFlight=!1}}}#ne(){if(this.#e===void 0)throw Error(`Cannot stream a session before its first turn is accepted.`);let e=new AbortController,t=this.#e;return this.#re(t.stream({signal:e.signal}),()=>e.abort(),t)}#re(e,t,n){let r=createTurnState();return{abort:()=>{r.aborted=!0,this.#V=n,t()},cancel:()=>{this.#te(r,n)},events:eveEventsToTUIStream({events:e,pendingInputRequests:this.#N,turnState:r,onSubagentCalled:e=>this.#R.begin(e),onSubagentBackgrounded:e=>this.#R.background(e),onSubagentCompleted:e=>this.#R.settle(e),onTurnCancelled:e=>this.#R.settleCancelledTurn(e),onConnectionAuthRequired:e=>this.#we(e),onConnectionAuthCompleted:e=>this.#Ee(e),onRegistryHandoff:this.#p===void 0?void 0:async e=>this.#ie(e),onTerminalFailure:()=>{this.#V=n},failureHintOverride:this.#p===void 0?void 0:localFailureHint}),turnState:r}}#ie(e){this.#I===e||this.#F.includes(e)||(this.#F.push(e),this.#L&&this.#n.suspendPromptForInput?.())}async#ae(e){await this.#he({type:`extension`,name:`add`,argument:e},`Add to your agent`,{trigger:`command`})}async#oe(e){if(this.#p===void 0)return;let t={appRoot:this.#p,env:process.env};e!==void 0&&(t.info=e),this.#D=await detectSetupIssues(t,this.#b),this.#n.renderSetupWarning!==void 0&&(this.#se(),this.#ce())}#se(){let e=orderedSetupIssues(this.#D,this.#O);e.length>0?this.#n.renderSetupWarning?.(formatSetupIssuesLine(e)):this.#n.clearSetupWarning?.()}async#ce(){let e=this.#p;if(e===void 0)return;let t;try{t=await this.#x(e,{signal:this.#T.signal})}catch{return}this.#w||this.#E||(this.#O=authIssueForStatus(t),this.#se())}async#le(e){let t=this.#p;if(t===void 0||this.#n.renderSetupWarning===void 0)return;let n={appRoot:t,env:process.env};e!==void 0&&(n.info=e);try{this.#D=await detectSetupIssues(n,this.#b);let e=await this.#x(t,{signal:this.#T.signal});this.#O=authIssueForStatus(e)}catch{return}this.#w||this.#se()}#ue(){this.#p===void 0||this.#n.renderSandboxLog===void 0||this.#H===void 0&&(this.#H=subscribeDevelopmentSandboxPrewarmLogs({appRoot:this.#p,log:e=>this.#n.renderSandboxLog?.(e)}))}#de(e,t){if(e!==void 0){if(this.#n.renderCommandResult!==void 0){this.#n.renderCommandResult(e,t);return}this.#n.renderNotice?.(e)}}async#fe(e,t){let n=this.#g;if(n===void 0)return{message:`/${e.name} is not available in this session.`};let r=this.#M?.agent.model.endpoint,i={renderer:this.#n,title:t.title,initialModelStep:t.initialModelStep,chatGptAccountLabel:r?.kind===`chatgpt`&&r.state===`ready`?r.accountLabel:void 0,remoteConnection:this.#y,withExclusiveTerminal:this.#v},a=this.#A?.current(),o=a!==void 0&&Object.keys(a).length>0?{...i,disabledConnectionReasons:a}:i;return t.keepSetupFlowOpen===!0?await n.handle(e,{...o,keepSetupFlowOpen:!0}):await n.handle(e,o)}#pe(e,t){if(t!==`startup`)return;let n=this.#y?.current().connection.state,r=n===`auth-failed`||n===`unavailable`?`failed`:void 0,i=e.argument.length===0?``:` ${e.argument}`;this.#n.renderCommandInvocation?.(`/${e.name}${i}`,r)}async#me(e){if(e?.kind===`model-access-changed`){this.#k?.applyEffect({kind:`refresh-identity`}),this.#E=!0,await this.#xe();return}e!==void 0&&(this.#k?.applyEffect(e),this.#E=!0,this.#le(this.#M))}async#he(e,t,n){let r=await this.#fe(e,{initialModelStep:n.initialModelStep,keepSetupFlowOpen:n.keepSetupFlowOpen,title:t});this.#pe(e,n.trigger),this.#de(r?.message,r?.tone),await this.#me(r?.effect),this.#_e()}async#ge(e){let t=this.#p;if(t===void 0)return;let authStatus=async()=>{try{return await this.#x(t,{signal:this.#T.signal})}catch{return}},n=await authStatus();if(n===`cli-missing`&&(await this.#he({type:`extension`,name:`vc:install`,argument:``},e,{trigger:`startup`,keepSetupFlowOpen:!0}),n=await authStatus(),n===`cli-missing`)){this.#n.setupFlow?.end();return}if(n===`logged-out`&&(await this.#he({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`,keepSetupFlowOpen:!0}),n=await authStatus(),n===`cli-missing`||n===`logged-out`)){this.#n.setupFlow?.end();return}await this.#he({type:`extension`,name:`model`,argument:``},e,{trigger:`startup`,initialModelStep:`provider`}),await this.#he({type:`extension`,name:`add`,argument:``},e,{trigger:`startup`})}#_e(){let e=this.#y?.current().connection;e?.state!==`ready`||e.info===this.#M||(this.#M=e.info,this.#f!==void 0&&this.#n.renderAgentHeader?.({info:e.info,name:this.#r,serverUrl:this.#f}))}async#ve(e){if(this.#p===void 0||this.#n.traceViewer===void 0){this.#de(`/traces is only available in local dev sessions.`);return}try{await this.#n.traceViewer.open({appRoot:this.#p,sessionId:this.#e?.state.sessionId,reference:e===``?void 0:e})}catch(e){if(isInterruptedError(e))return;throw e}}async#ye(){let e=this.#p;if(e===void 0){this.#de(`/info is only available in local dev sessions.`);return}try{this.#de(renderApplicationInfo(await this.#S(e)))}catch(e){this.#de(`Couldn't inspect the application: ${toErrorMessage(e)}`,`error`)}}#be(e){let t=this.#n;if(t.logDisplayMode===void 0||t.setLogDisplayMode===void 0)return`/loglevel is not available in this session.`;if(e===``)return`Logs: ${t.logDisplayMode()}. Use /loglevel all|stderr|sandbox|none — logs stay buffered, so switching also hides or restores past lines.`;let n=parseLogDisplayMode(e);if(n===void 0)return`Unknown log level "${e}". Use all, stderr, sandbox, or none.`;if(n===t.logDisplayMode())return`Logs already set to ${n}.`;switch(t.setLogDisplayMode(n),n){case`none`:return`Logs hidden. Output stays buffered — /loglevel all restores it.`;case`stderr`:return`Showing stderr logs only.`;case`sandbox`:return`Showing sandbox logs only.`;case`all`:return`Showing all logs.`}}async#xe(){let e=this.#p;if(e===void 0)return;loadDevelopmentEnvironmentFiles(e),await this.#d?.refreshAfterSourceChange({});let t=this.#G(await this.#Se());this.#le(t)}async#Se(){let e=this.#t;if(e===void 0)return;let t=await probeAgentInfo({client:e});return t.kind===`ready`?t.info:void 0}async#Ce(){let e=this.#M,t=await this.#Se();t!==void 0&&this.#G(t),(!this.#n.renderAgentHeader||t===void 0)&&this.#n.renderNotice?.(formatAgentUpdateNotice(e,t))}#we(e){let t={name:e.data.name,description:e.data.description,state:`required`};e.data.authorization!==void 0&&(t.challenge=e.data.authorization),e.data.webhookUrl!==void 0&&(t.webhookUrl=e.data.webhookUrl),this.#z.set(e.data.name,t),this.#De(t)}#Te(e){if(e.turnState?.boundaryEvent!==`session.waiting`)return!1;let t=!1;for(let e of this.#z.values())e.state!==`required`||e.webhookUrl===void 0||(e.state=`pending`,this.#B.add(e.name),this.#De(e),t=!0);return t&&this.#n.setConnectionAuthPendingCount?.(this.#B.size),this.#B.size>0}#Ee(e){let t=this.#z.get(e.data.name)??{name:e.data.name,description:``,state:e.data.outcome};t.state=e.data.outcome,e.data.reason!==void 0&&(t.reason=e.data.reason),this.#z.set(e.data.name,t),this.#B.delete(e.data.name),this.#De(t),this.#n.setConnectionAuthPendingCount?.(this.#B.size)}#De(e){let t={name:e.name,description:e.description,state:e.state};e.challenge!==void 0&&(t.challenge=e.challenge),e.reason!==void 0&&(t.reason=e.reason),this.#n.upsertConnectionAuth?.(t)}};function createRenderer(e){return e.renderer?e.renderer:new TerminalRenderer({tools:e.tools,reasoning:e.reasoning,subagents:e.subagents,connectionAuth:e.connectionAuth,assistantResponseStats:e.assistantResponseStats,contextSize:e.contextSize,logs:e.logs,availablePromptCommands:e.availablePromptCommands,input:e.userInput,output:e.screen,diagnostics:e.diagnostics,onExitRequest:e.lifecycle?.requestStop})}function formatAgentUpdateNotice(e,t){let n=e?.agent.model.id,r=t?.agent.model.id;return n!==void 0&&r!==void 0&&n!==r?`Agent updated: Model ${n} -> ${r}`:`Agent updated.`}function registryHandoffAddress(e,t){if(e!==`selfmod__registry_add`||typeof t!=`object`||!t)return;let n=t;return n.status===`needs-terminal`&&typeof n.address==`string`?n.address:void 0}async function*eveEventsToTUIStream(e){let{events:t,pendingInputRequests:n,turnState:r,onSubagentCalled:i,onSubagentBackgrounded:a,onSubagentCompleted:o,onTurnCancelled:s,onConnectionAuthRequired:c,onConnectionAuthCompleted:l,onRegistryHandoff:u,onTerminalFailure:d,failureHintOverride:f}=e,p=new Map,m=new Map,h=new Map,g=createEventDeduper(),_=0,v=new Set,y=new Set,b=new Set,x=!1,S=!1,C;for await(let e of t)if(g.admit(e)&&!(S&&isPostTurnVisibleEvent(e)))switch(e.type){case`session.started`:case`message.received`:break;case`turn.started`:r.turnId=e.data.turnId;break;case`step.started`:_+=1,yield{type:`step-start`};break;case`step.completed`:{let t=e;C=t.data.usage,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`step-finish`,usage:t.data.usage};break}case`message.appended`:{let t=e,n=textPartId(t.data.turnId,t.data.stepIndex),r=partStateFor(p,n),i=t.data.messageSoFar;if(r.completed){if(_<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}if(!i.startsWith(r.text)||i.length<=r.text.length)break;let a=i.slice(r.text.length);r.text=i,yield{type:`assistant-delta`,id:partGenerationId(n,r.generation),delta:a};break}case`message.completed`:{let t=textPartId(e.data.turnId,e.data.stepIndex),n=partStateFor(p,t),r=e.data.message;if(n.completed){if(r===null||_<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=_,yield{type:`assistant-complete`,id:partGenerationId(t,n.generation),text:r};break}let i=partGenerationId(t,n.generation);if(r!==null){if(n.text.length===0)n.text=r,n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i,text:r};else if(r.startsWith(n.text)){let e=r.slice(n.text.length);e.length>0&&(yield{type:`assistant-delta`,id:i,delta:e}),n.text=r,n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i}}}else n.text.length>0&&(n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i});break}case`reasoning.appended`:{let t=e,n=reasoningPartId(t.data.turnId,t.data.stepIndex),r=partStateFor(m,n),i=t.data.reasoningSoFar;if(r.completed){if(_<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}if(!i.startsWith(r.text)||i.length<=r.text.length)break;let a=i.slice(r.text.length);r.text=i,yield{type:`reasoning-delta`,id:partGenerationId(n,r.generation),delta:a};break}case`reasoning.completed`:{let t=reasoningPartId(e.data.turnId,e.data.stepIndex),n=partStateFor(m,t),r=e.data.reasoning;if(n.completed){if(r.length===0||_<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=_;let e=partGenerationId(t,n.generation);yield{type:`reasoning-delta`,id:e,delta:r},yield{type:`reasoning-complete`,id:e};break}let i=partGenerationId(t,n.generation);if(n.text.length===0&&r.length>0)n.text=r,yield{type:`reasoning-delta`,id:i,delta:r};else if(r.length>0&&!r.startsWith(n.text))break;n.completed=!0,n.completedEpoch=_,yield{type:`reasoning-complete`,id:i};break}case`actions.requested`:{let t=e.data.actions.filter(e=>e.kind===`tool-call`);if(t.length===0)break;for(let e of t)h.set(e.callId,e.toolName),!v.has(e.callId)&&(v.add(e.callId),yield{type:`tool-call`,toolCallId:e.callId,toolName:e.toolName,input:e.input});break}case`input.requested`:{let t=e.data.requests.filter(e=>e.action.kind===`tool-call`);if(t.length===0)break;for(let e of t){let t=e.action.callId;if(h.set(t,e.action.toolName),e.kind!==`session-limit`&&!v.has(t)&&(v.add(t),yield{type:`tool-call`,toolCallId:t,toolName:e.action.toolName,input:e.action.input}),!y.has(e.requestId)){if(y.add(e.requestId),n.set(e.requestId,e),e.kind!==`tool-approval`){upsertPendingQuestion(r,e);continue}upsertPendingApproval(r,e),yield{type:`tool-approval-request`,approvalId:e.requestId,toolCallId:t}}}break}case`action.result`:{let t=e;if(t.data.result.kind!==`tool-result`)break;let n=t.data.result.callId;if(!v.has(n))break;switch(t.data.status){case`completed`:{let e=t.data.result.output;yield{type:`tool-result`,toolCallId:n,output:e};let r=registryHandoffAddress(h.get(n),e);r!==void 0&&await u?.(r);break}case`failed`:yield{type:`tool-error`,toolCallId:n,errorText:formatActionResultError(t)};break;case`rejected`:yield{type:`tool-rejected`,toolCallId:n,reason:formatActionResultError(t)};break}break}case`step.failed`:case`turn.failed`:{let t=toFailureEvent(e,b,f);t&&(yield t);break}case`session.failed`:{r.sawSessionFailure=!0,d?.(e);let t=toFailureEvent(e,b,f);t&&(yield t),r.boundaryEvent=e.type,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C},x=!0;return}case`session.waiting`:case`session.completed`:r.boundaryEvent=e.type,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C},x=!0;return;case`turn.completed`:S=!0,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_);break;case`turn.cancelled`:s?.(e.data.turnId),yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`turn-cancelled`};break;case`subagent.called`:i?.(e);break;case`subagent.started`:case`subagent.event`:break;case`subagent.completed`:{let t=e;t.data.backgroundTask===void 0?o?.(t.data.callId):a?.(t.data.callId);break}case`authorization.required`:c?.(e);break;case`authorization.completed`:l?.(e);break;default:break}x||(yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C})}async function*errorOnlyTUIStream(e){yield{type:`error`,errorText:e.errorText},yield{type:`finish`}}function createTurnState(){return{aborted:!1,pendingApprovals:[],pendingQuestions:[],sawSessionFailure:!1}}function upsertPendingApproval(e,t){let n=toAgentTUIToolApprovalRequest(t),r=e.pendingApprovals.findIndex(e=>e.approvalId===n.approvalId);r===-1?e.pendingApprovals.push(n):e.pendingApprovals[r]=n}function toAgentTUIToolApprovalRequest(e){return{approvalId:e.requestId,toolCallId:e.action.callId,toolName:e.action.toolName,input:e.action.input}}function upsertPendingQuestion(e,t){let n=e.pendingQuestions.findIndex(e=>e.requestId===t.requestId);n===-1?e.pendingQuestions.push(t):e.pendingQuestions[n]=t}function textPartId(e,t){return`text:${e}:${t}`}function reasoningPartId(e,t){return`reasoning:${e}:${t}`}function partStateFor(e,t){let n=e.get(t);return n===void 0&&(n={generation:0,text:``,completed:!1,completedEpoch:0},e.set(t,n)),n}function partGenerationId(e,t){return t===0?e:`${e}#${t}`}function*closeOpenParts(e,t,n){for(let[r,i]of e)i.completed||i.text.length===0||(i.completed=!0,i.completedEpoch=n,yield{type:t,id:partGenerationId(r,i.generation)})}function isPostTurnVisibleEvent(e){switch(e.type){case`actions.requested`:case`authorization.completed`:case`authorization.required`:case`input.requested`:case`message.appended`:case`message.completed`:case`reasoning.appended`:case`reasoning.completed`:case`result.completed`:case`step.completed`:case`step.failed`:case`step.started`:case`subagent.called`:case`subagent.completed`:case`subagent.event`:case`subagent.started`:case`turn.completed`:case`turn.failed`:return!0;default:return!1}}function formatActionResultError(e){if(e.data.error?.message)return e.data.error.message;let t=e.data.result.output;if(typeof t==`string`)return t;try{return JSON.stringify(t)}catch{return`Tool execution failed.`}}function toFailureEvent(e,t,n){let r=failureKey(e);if(t.has(r))return;t.add(r);let c={type:`error`,errorText:formatFailureMessage(e)},l=n?.(e)??formatFailureHint(e);l!==void 0&&(c.hint=l);let u=formatFailureDetail(e);return u!==void 0&&(c.detail=u),c}function toAgentTUIInputQuestion(e){let t=e.display===`text`?`text`:e.display===`select`||e.options!==void 0&&e.options.length>0?`select`:`text`,n={requestId:e.requestId,prompt:e.prompt,display:t};return e.options!==void 0&&(n.options=e.options.map(e=>{let t={id:e.id,label:e.label};return e.description!==void 0&&(t.description=e.description),e.style!==void 0&&(t.style=e.style),t})),e.allowFreeform!==void 0&&(n.allowFreeform=e.allowFreeform),n}export{EveTUIRunner,parsePromptCommand,registryHandoffAddress};
|
|
@@ -43,10 +43,18 @@ export type TerminalKey = {
|
|
|
43
43
|
y: number;
|
|
44
44
|
} | {
|
|
45
45
|
type: "ctrl-a";
|
|
46
|
+
} | {
|
|
47
|
+
type: "ctrl-b";
|
|
46
48
|
} | {
|
|
47
49
|
type: "ctrl-e";
|
|
50
|
+
} | {
|
|
51
|
+
type: "ctrl-f";
|
|
48
52
|
} | {
|
|
49
53
|
type: "ctrl-d";
|
|
54
|
+
} | {
|
|
55
|
+
type: "alt-b";
|
|
56
|
+
} | {
|
|
57
|
+
type: "alt-f";
|
|
50
58
|
} | {
|
|
51
59
|
type: "ctrl-k";
|
|
52
60
|
} | {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
const CSI_FINAL=/[\u0040-\u007e]/u,PASTE_START=`\x1B[200~`,PASTE_END=`\x1B[201~`;function sanitizePastedText(e){let t=``;for(let n of e.replace(/\r\n?/gu,`
|
|
2
2
|
`)){if(n===`
|
|
3
|
-
`||n===` `){t+=n;continue}let e=n.codePointAt(0);e!==void 0&&(e<32||e===127||e>=128&&e<=159||(t+=n))}return t}function isIncompletePaste(e){return e.startsWith(PASTE_START)&&!e.includes(PASTE_END,6)}function stripPasteStart(e){return e.startsWith(PASTE_START)?e.slice(6):e}function isIncompleteOsc(e){return e.startsWith(`\x1B]`)&&!e.includes(`\x07`,2)&&!e.includes(`\x1B\\`,2)}function stripPromptControlCharacters(e){let t=``;for(let n of e)n>=` `&&n!==``&&(t+=n);return t}function nextKey(r){let i=r[0];if(i===void 0)return{consumed:0,incomplete:!0};if(i===`\x1B`){if(r.length===1)return{consumed:0,incomplete:!0};let i=r[1];if(i===`O`)return r.length<3?{consumed:0,incomplete:!0}:{key:parseKey(Buffer.from(r.slice(0,3))),consumed:3};if(i===`[`){if(r.startsWith(PASTE_START)){let e=r.indexOf(PASTE_END,6);return e===-1?{consumed:0,incomplete:!0}:{key:{type:`text`,value:sanitizePastedText(r.slice(6,e)),framing:`bracketed-paste`},consumed:e+6}}for(let t=2;t<r.length;t+=1)if(CSI_FINAL.test(r[t]))return{key:parseKey(Buffer.from(r.slice(0,t+1))),consumed:t+1};return{consumed:0,incomplete:!0}}if(i===`]`){let e=r.indexOf(`\x07`,2),t=r.indexOf(`\x1B\\`,2);if(e===-1&&t===-1)return{consumed:0,incomplete:!0};let n=e===-1?t:t===-1?e:Math.min(e,t);return{key:{type:`osc`,value:r.slice(2,n)},consumed:n+(n===e?1:2)}}return{key:{type:`escape`},consumed:1}}if(i<` `||i===``)return{key:parseKey(Buffer.from(i)),consumed:1};let a=1;for(;a<r.length;){let e=r[a];if(e===`\x1B`||e<` `||e===``)break;a+=1}return{key:parseKey(Buffer.from(r.slice(0,a))),consumed:a}}const SGR_MOUSE=RegExp(`^\x1B\\[<(\\d+);(\\d+);(\\d+)([Mm])$`,`u`);function parseKey(e){let t=e.toString(`utf8`),n=SGR_MOUSE.exec(t);if(n!==null)return{type:`mouse`,action:n[4]===`M`?`press`:`release`,button:Number(n[1]),x:Number(n[2]),y:Number(n[3])};switch(t){case``:return{type:`ctrl-a`};case``:return{type:`ctrl-e`};case``:return{type:`ctrl-d`};case`\v`:return{type:`ctrl-k`};case``:return{type:`ctrl-n`};case``:return{type:`ctrl-p`};case`\f`:return{type:`ctrl-l`};case``:return{type:`ctrl-r`};case``:return{type:`ctrl-u`};case``:return{type:`ctrl-w`};case``:return{type:`ctrl-c`};case`\r`:case`
|
|
4
|
-
`:return{type:`enter`};case`\x1B[27;2;13~`:case`\x1B[13;2u`:return{type:`newline`};case``:case`\b`:return{type:`backspace`};case`\x1B[A`:case`\x1BOA`:return{type:`up`};case`\x1B[B`:case`\x1BOB`:return{type:`down`};case`\x1B[C`:case`\x1BOC`:return{type:`right`};case`\x1B[D`:case`\x1BOD`:return{type:`left`};case`\x1B[H`:case`\x1BOH`:case`\x1B[1~`:return{type:`home`};case`\x1B[F`:case`\x1BOF`:case`\x1B[4~`:return{type:`end`};case`\x1B[3~`:return{type:`delete`};case` `:return{type:`tab`};case`\x1B`:return{type:`escape`};default:{let e=stripPromptControlCharacters(t);return e.length>0?{type:`text`,value:e,framing:`unframed`}:{type:`ignore`}}}}async function*takeUntil(e,t){let n=e[Symbol.asyncIterator](),r=t.then(()=>({done:!0,value:void 0}));try{for(;;){let e=n.next();e.catch(()=>{});let t=await Promise.race([e,r]);if(t.done)break;yield t.value}}finally{n.return?.()?.catch(()=>{})}}function formatCompactTokenCount(e){if(e<1e3)return`${e}`;let t=e<1e6?e/1e3:e/1e6,n=e<1e6?`K`:`M`;return`${t.toFixed(1).replace(/\.0$/,``)}${n}`}function typewriterText(e,t,n){let r=Math.floor(Math.max(0,t)/n)+1;return r>=e.length?e:e.slice(0,r)}function formatTurnDuration(e){let t=Math.max(1,Math.round(e/1e3)),n=t%60,r=Math.floor(t/60);if(r===0)return`${n}s`;let i=r%60,a=Math.floor(r/60);return a===0?n===0?`${i}min`:`${i}min ${n}s`:i===0?`${a}h`:`${a}h ${i}min`}function formatTokenFlow(e,t){let n=formatCompactTokenCount(e.inputTokens),r=formatCompactTokenCount(e.outputTokens),i=`${t.arrowUp} ${n} ${t.arrowDown} ${r}`,a=formatContextPercentage(e.inputTokens,e.contextSize);return a==null?i:`${i} ${a}`}function formatContextPercentage(e,t){if(!(t==null||t<=0||!Number.isFinite(t)))return`${Math.round(e/t*100).toLocaleString()}%`}function formatAssistantResponseStats(e,t){if(t===`tokensPerSecond`)return formatTokensPerSecond(e.tokensPerSecond);if(e.outputTokens!=null)return`${e.outputTokens.toLocaleString()} output tokens`}function formatTokensPerSecond(e){if(e!=null)return`${formatNumber(e)} tok/s`}function formatNumber(e){return Number.isInteger(e)?e.toLocaleString():e.toLocaleString(void 0,{maximumFractionDigits:1})}export{formatAssistantResponseStats,formatCompactTokenCount,formatTokenFlow,formatTurnDuration,isIncompleteOsc,isIncompletePaste,nextKey,parseKey,sanitizePastedText,stripPasteStart,stripPromptControlCharacters,takeUntil,typewriterText};
|
|
3
|
+
`||n===` `){t+=n;continue}let e=n.codePointAt(0);e!==void 0&&(e<32||e===127||e>=128&&e<=159||(t+=n))}return t}function isIncompletePaste(e){return e.startsWith(PASTE_START)&&!e.includes(PASTE_END,6)}function stripPasteStart(e){return e.startsWith(PASTE_START)?e.slice(6):e}function isIncompleteOsc(e){return e.startsWith(`\x1B]`)&&!e.includes(`\x07`,2)&&!e.includes(`\x1B\\`,2)}function stripPromptControlCharacters(e){let t=``;for(let n of e)n>=` `&&n!==``&&(t+=n);return t}function nextKey(r){let i=r[0];if(i===void 0)return{consumed:0,incomplete:!0};if(i===`\x1B`){if(r.length===1)return{consumed:0,incomplete:!0};let i=r[1];if(i===`O`)return r.length<3?{consumed:0,incomplete:!0}:{key:parseKey(Buffer.from(r.slice(0,3))),consumed:3};if(i===`[`){if(r.startsWith(PASTE_START)){let e=r.indexOf(PASTE_END,6);return e===-1?{consumed:0,incomplete:!0}:{key:{type:`text`,value:sanitizePastedText(r.slice(6,e)),framing:`bracketed-paste`},consumed:e+6}}for(let t=2;t<r.length;t+=1)if(CSI_FINAL.test(r[t]))return{key:parseKey(Buffer.from(r.slice(0,t+1))),consumed:t+1};return{consumed:0,incomplete:!0}}if(i===`]`){let e=r.indexOf(`\x07`,2),t=r.indexOf(`\x1B\\`,2);if(e===-1&&t===-1)return{consumed:0,incomplete:!0};let n=e===-1?t:t===-1?e:Math.min(e,t);return{key:{type:`osc`,value:r.slice(2,n)},consumed:n+(n===e?1:2)}}return i===`b`||i===`B`?{key:{type:`alt-b`},consumed:2}:i===`f`||i===`F`?{key:{type:`alt-f`},consumed:2}:{key:{type:`escape`},consumed:1}}if(i<` `||i===``)return{key:parseKey(Buffer.from(i)),consumed:1};let a=1;for(;a<r.length;){let e=r[a];if(e===`\x1B`||e<` `||e===``)break;a+=1}return{key:parseKey(Buffer.from(r.slice(0,a))),consumed:a}}const SGR_MOUSE=RegExp(`^\x1B\\[<(\\d+);(\\d+);(\\d+)([Mm])$`,`u`);function parseKey(e){let t=e.toString(`utf8`),n=SGR_MOUSE.exec(t);if(n!==null)return{type:`mouse`,action:n[4]===`M`?`press`:`release`,button:Number(n[1]),x:Number(n[2]),y:Number(n[3])};switch(t){case``:return{type:`ctrl-a`};case``:return{type:`ctrl-b`};case``:return{type:`ctrl-e`};case``:return{type:`ctrl-f`};case``:return{type:`ctrl-d`};case`\v`:return{type:`ctrl-k`};case``:return{type:`ctrl-n`};case``:return{type:`ctrl-p`};case`\f`:return{type:`ctrl-l`};case``:return{type:`ctrl-r`};case``:return{type:`ctrl-u`};case``:return{type:`ctrl-w`};case``:return{type:`ctrl-c`};case`\r`:case`
|
|
4
|
+
`:return{type:`enter`};case`\x1B[27;2;13~`:case`\x1B[13;2u`:return{type:`newline`};case``:case`\b`:return{type:`backspace`};case`\x1B[A`:case`\x1BOA`:return{type:`up`};case`\x1B[B`:case`\x1BOB`:return{type:`down`};case`\x1B[C`:case`\x1BOC`:return{type:`right`};case`\x1B[D`:case`\x1BOD`:return{type:`left`};case`\x1B[1;3C`:case`\x1B[1;5C`:case`\x1B[5C`:return{type:`alt-f`};case`\x1B[1;3D`:case`\x1B[1;5D`:case`\x1B[5D`:return{type:`alt-b`};case`\x1B[H`:case`\x1BOH`:case`\x1B[1~`:return{type:`home`};case`\x1B[F`:case`\x1BOF`:case`\x1B[4~`:return{type:`end`};case`\x1B[3~`:return{type:`delete`};case` `:return{type:`tab`};case`\x1B`:return{type:`escape`};default:{let e=stripPromptControlCharacters(t);return e.length>0?{type:`text`,value:e,framing:`unframed`}:{type:`ignore`}}}}async function*takeUntil(e,t){let n=e[Symbol.asyncIterator](),r=t.then(()=>({done:!0,value:void 0}));try{for(;;){let e=n.next();e.catch(()=>{});let t=await Promise.race([e,r]);if(t.done)break;yield t.value}}finally{n.return?.()?.catch(()=>{})}}function formatCompactTokenCount(e){if(e<1e3)return`${e}`;let t=e<1e6?e/1e3:e/1e6,n=e<1e6?`K`:`M`;return`${t.toFixed(1).replace(/\.0$/,``)}${n}`}function typewriterText(e,t,n){let r=Math.floor(Math.max(0,t)/n)+1;return r>=e.length?e:e.slice(0,r)}function formatTurnDuration(e){let t=Math.max(1,Math.round(e/1e3)),n=t%60,r=Math.floor(t/60);if(r===0)return`${n}s`;let i=r%60,a=Math.floor(r/60);return a===0?n===0?`${i}min`:`${i}min ${n}s`:i===0?`${a}h`:`${a}h ${i}min`}function formatTokenFlow(e,t){let n=formatCompactTokenCount(e.inputTokens),r=formatCompactTokenCount(e.outputTokens),i=`${t.arrowUp} ${n} ${t.arrowDown} ${r}`,a=formatContextPercentage(e.inputTokens,e.contextSize);return a==null?i:`${i} ${a}`}function formatContextPercentage(e,t){if(!(t==null||t<=0||!Number.isFinite(t)))return`${Math.round(e/t*100).toLocaleString()}%`}function formatAssistantResponseStats(e,t){if(t===`tokensPerSecond`)return formatTokensPerSecond(e.tokensPerSecond);if(e.outputTokens!=null)return`${e.outputTokens.toLocaleString()} output tokens`}function formatTokensPerSecond(e){if(e!=null)return`${formatNumber(e)} tok/s`}function formatNumber(e){return Number.isInteger(e)?e.toLocaleString():e.toLocaleString(void 0,{maximumFractionDigits:1})}export{formatAssistantResponseStats,formatCompactTokenCount,formatTokenFlow,formatTurnDuration,isIncompleteOsc,isIncompletePaste,nextKey,parseKey,sanitizePastedText,stripPasteStart,stripPromptControlCharacters,takeUntil,typewriterText};
|
|
@@ -56,6 +56,7 @@ type SubagentToolState = {
|
|
|
56
56
|
};
|
|
57
57
|
export type SubagentRun = {
|
|
58
58
|
name: string;
|
|
59
|
+
childSessionId: string;
|
|
59
60
|
/** Parent turn that originated this dispatch; cancellation is scoped to it. */
|
|
60
61
|
parentTurnId: string;
|
|
61
62
|
/** A receipt-returned task survives cancellation of its originating turn. */
|
|
@@ -111,6 +112,8 @@ export interface SubagentPumpOptions {
|
|
|
111
112
|
client?: Client;
|
|
112
113
|
view?: SubagentView;
|
|
113
114
|
formatActionResultError: (event: ActionResultStreamEvent) => string;
|
|
115
|
+
/** Runs TUI-owned handling after a child tool result becomes visible. */
|
|
116
|
+
onToolCompleted?: (toolName: string, output: unknown) => Promise<void>;
|
|
114
117
|
}
|
|
115
118
|
export declare class SubagentPump {
|
|
116
119
|
#private;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createEventDeduper}from"#protocol/event-dedupe.js";import{isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{readNdjsonStream}from"#client/ndjson.js";var SubagentPump=class{#e;#t;#n;#r=new Map;#
|
|
1
|
+
import{createEventDeduper}from"#protocol/event-dedupe.js";import{isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{readNdjsonStream}from"#client/ndjson.js";var SubagentPump=class{#e;#t;#n;#r;#i=new Map;#a=new Map;#o=new Map;#s=new Map;#c=new Map;constructor(e){this.#e=e.client,this.#t=e.view,this.#n=e.formatActionResultError,this.#r=e.onToolCompleted}begin(t){let n=t.data.callId,r=this.#i.get(n);r===void 0?this.#i.set(n,{name:t.data.name,childSessionId:t.data.childSessionId,parentTurnId:t.data.turnId,background:!1,status:`open`,childStreamPath:t.data.childStreamPath,childStreamIndex:this.#o.get(t.data.childSessionId)??0,steps:new Map,currentSectionKey:null,nextSectionKey:0,tools:new Map,seenChildEvents:createEventDeduper()}):r.name=t.data.name,this.#t?.markChildToolCallId(n),!(r!==void 0&&r.status!==`open`)&&(this.#t?.begin({callId:n,name:t.data.name}),r===void 0&&this.#l(n))}settle(e){this.#f(e,!1)}background(e){let t=this.#i.get(e);t!==void 0&&(t.background=!0,t.status!==`authoritative`&&this.#t?.background({callId:e}))}abortAll(){for(let e of this.#a.values())e.abort();this.#a.clear(),this.#i.clear(),this.#o.clear(),this.#s.clear(),this.#c.clear()}settleCancelledTurn(e){for(let[t,n]of this.#i)n.parentTurnId!==e||n.background||(this.#f(t,!0),this.#a.get(t)?.abort(),this.#a.delete(t))}#l(e){let t=this.#i.get(e);if(t===void 0||t.status===`authoritative`)return;let n=this.#s.get(t.childSessionId);if(n===void 0){t.childStreamIndex=this.#o.get(t.childSessionId)??0,this.#s.set(t.childSessionId,e),this.#u(e);return}if(n===e)return;let r=this.#c.get(t.childSessionId)??[];r.includes(e)||r.push(e),this.#c.set(t.childSessionId,r)}#u(e){if(this.#a.has(e))return;let r=this.#e;if(!r)return;let i=this.#i.get(e);if(i===void 0||i.status===`authoritative`)return;let a=new AbortController;this.#a.set(e,a),(async()=>{let o=100;try{for(;!a.signal.aborted&&i.status!==`authoritative`;){let s=!1;try{let o=await r.fetch(streamPathAt(i.childStreamPath,i.childStreamIndex),{cache:`no-store`,signal:a.signal});if(!o.ok||o.body===null)throw await o.body?.cancel().catch(()=>{}),Error(`Child stream returned ${o.status}.`);for await(let r of readNdjsonStream(o.body)){if(a.signal.aborted)return;s=!0,i.childStreamIndex+=1,this.#o.set(i.childSessionId,i.childStreamIndex);let n=this.#h(e,r);if(n!==void 0&&await n,isCurrentTurnBoundaryEvent(r)){if(r.type===`session.waiting`&&hasPendingChildApproval(i))continue;this.#f(e,!0);return}}}catch{if(a.signal.aborted)return}o=s?100:Math.min(o*2,2e3),await abortableDelay(o,a.signal)}}finally{this.#a.get(e)===a&&this.#a.delete(e)}})()}#d(e,t,n){let r=t.tools.get(n.childCallId),i=r??{toolName:n.toolName,input:n.input,status:n.status};if(r){let e=r.status===`done`||r.status===`failed`||r.status===`rejected`;if(n.status===`approval-requested`&&!e)r.status=n.status;else{let e={preparing:0,"approval-requested":1,executing:2,done:3,failed:3,rejected:3};e[n.status]>e[r.status]&&(r.status=n.status)}n.input!==void 0&&(r.input=n.input)}else t.tools.set(n.childCallId,i);this.#t?.markChildToolCallId(n.childCallId),this.#t?.upsertTool({callId:e,subagentName:t.name,childCallId:n.childCallId,toolName:i.toolName,input:i.input,status:i.status})}#f(e,t){let n=this.#i.get(e);if(!(!n||n.status===`authoritative`)&&!(!t&&n.status===`provisional`)){n.status=t?`authoritative`:`provisional`;for(let[t,r]of n.steps)r.finalized||(r.finalized=!0,this.#t?.upsertStep({callId:e,subagentName:n.name,sectionKey:t,reasoning:r.reasoning,message:r.message,finalized:!0}));n.currentSectionKey=null,this.#m(e,n),this.#t?.complete({authoritative:t,callId:e}),t&&this.#p(e,n.childSessionId)}}#p(e,t){let n=(this.#c.get(t)??[]).filter(t=>t!==e);if(this.#s.get(t)!==e){n.length===0?this.#c.delete(t):this.#c.set(t,n);return}for(this.#s.delete(t);n.length>0;){let e=n.shift(),r=this.#i.get(e);if(!(r===void 0||r.status===`authoritative`)){n.length===0?this.#c.delete(t):this.#c.set(t,n),r.childStreamIndex=this.#o.get(t)??0,this.#s.set(t,e),this.#u(e);return}}this.#c.delete(t)}#m(e,t){for(let[n,r]of t.tools)r.status===`preparing`&&(t.tools.delete(n),this.#t?.removeTool({callId:e,childCallId:n}))}#h(e,t){let n=this.#i.get(e);if(!n||!n.seenChildEvents.admit(t))return;n.status===`provisional`&&(n.status=`open`,this.#t?.begin({callId:e,name:n.name}));let r=this.#t,emit=(t,i)=>{r?.upsertStep({callId:e,subagentName:n.name,sectionKey:t,reasoning:i.reasoning,message:i.message,finalized:i.finalized})},finalizeCurrent=()=>{if(n.currentSectionKey===null)return;let e=n.steps.get(n.currentSectionKey);e&&(e.finalized=!0,emit(n.currentSectionKey,e)),n.currentSectionKey=null};switch(t.type){case`reasoning.appended`:{let{key:e,step:r}=openCurrentSubagentSection(n);r.reasoning+=t.data.reasoningDelta,emit(e,r);break}case`reasoning.completed`:break;case`message.appended`:{let{key:e,step:r}=openCurrentSubagentSection(n);r.message+=t.data.messageDelta,emit(e,r);break}case`message.completed`:{let{key:e,step:r}=openCurrentSubagentSection(n);t.data.message!==null&&r.message.length===0&&(r.message=t.data.message),r.finalized=!0,emit(e,r),n.currentSectionKey=null;break}case`step.completed`:finalizeCurrent(),this.#m(e,n);break;case`actions.requested`:finalizeCurrent();for(let r of t.data.actions)r.kind===`tool-call`&&this.#d(e,n,{childCallId:r.callId,toolName:r.toolName,input:r.input,status:`executing`});break;case`input.requested`:finalizeCurrent();for(let r of t.data.requests)r.action.kind===`tool-call`&&this.#d(e,n,{childCallId:r.action.callId,toolName:r.action.toolName,input:r.action.input,status:`approval-requested`});break;case`action.result`:{let i=t.data.result;if(i.kind!==`tool-result`)break;let a=n.tools.get(i.callId);if(!a)break;switch(t.data.status){case`completed`:a.status=`done`,a.output=i.output;break;case`failed`:a.status=`failed`,a.errorText=this.#n(t);break;case`rejected`:a.status=`rejected`,a.errorText=this.#n(t);break}let o={callId:e,subagentName:n.name,childCallId:i.callId,toolName:a.toolName,input:a.input,status:a.status};if(a.output!==void 0&&(o.output=a.output),a.errorText!==void 0&&(o.errorText=a.errorText),r?.upsertTool(o),t.data.status===`completed`)return this.#r?.(a.toolName,i.output);break}default:break}}};function hasPendingChildApproval(e){return[...e.tools.values()].some(e=>e.status===`approval-requested`)}function streamPathAt(e,t){return t===0?e:`${e}${e.includes(`?`)?`&`:`?`}startIndex=${t}`}async function abortableDelay(e,t){t.aborted||await new Promise(n=>{let onAbort=()=>{clearTimeout(r),n()},r=setTimeout(()=>{t.removeEventListener(`abort`,onAbort),n()},e);r.unref?.(),t.addEventListener(`abort`,onAbort,{once:!0})})}function openCurrentSubagentSection(e){e.currentSectionKey===null&&(e.currentSectionKey=e.nextSectionKey++,e.steps.set(e.currentSectionKey,{reasoning:``,message:``,finalized:!1}));let t=e.steps.get(e.currentSectionKey);if(!t)throw Error(`invariant: subagent section state missing for current key`);return{key:e.currentSectionKey,step:t}}export{SubagentPump};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createDevDiagnostics}from"../diagnostics.js";import{remoteHost}from"./target.js";import{promptCommandsFor}from"./prompt-commands.js";import{pickAgentHeaderTip}from"./agent-header.js";import{probeMcpConnection}from"./mcp-connection-status.js";import{createPromptCommandHandler}from"./prompt-command-handler.js";import{formatRemoteAuthChallengeMessage}from"./remote-auth-result.js";import{TerminalRenderer}from"./terminal-renderer.js";import{EveTUIRunner}from"./runner.js";import{Client}from"#client/index.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{toErrorMessage}from"#shared/errors.js";import{resolveDevelopmentOidcToken,resolveLinkedDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{isVercelAuthChallenge}from"#services/dev-client/vercel-auth-error.js";import{resolveVercelDeployment}from"#setup/vercel-deployment.js";import{appendUserAgentProduct}from"#internal/user-agent.js";import{resolveLocalDevelopmentClientOptions,resolveRemoteDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{createDevelopmentCredentialGate}from"#services/dev-client/credential-gate.js";async function startDevelopmentTuiStartup(t){let n=await createDevDiagnostics(t.appRoot).catch(()=>void 0),i=pickAgentHeaderTip(),a=new TerminalRenderer({...t,diagnostics:n,onExitRequest:t.onExitRequest});return a.beginStartupDraft({initialDraft:t.initialInput,tip:i,title:t.name??`eve`}),{diagnostics:n,headerTip:i,renderer:a,finish:()=>a.finishStartupDraft(),async shutdown(){a.shutdown(),await n?.close()}}}function prepareRemoteTarget(e){return{target:e,credentials:createDevelopmentCredentialGate(e.serverUrl),resolveOidcToken:resolveDevelopmentOidcToken,resolveDeployment:n=>resolveVercelDeployment({workspaceRoot:e.workspaceRoot,host:remoteHost(e),signal:n})}}function prepareDevelopmentTarget(e){return e.kind===`local`?{kind:`local`,target:e}:{kind:`remote`,target:e,remote:prepareRemoteTarget(e)}}function withTuiUserAgent(e){let t=new Headers(e);return appendUserAgentProduct(t,`eve-tui/${resolveInstalledPackageInfo().version}`),Object.fromEntries(t.entries())}async function runDevelopmentTui(t){let{target:r,headers:o,initialInput:s,onBootProgress:c,lifecycle:l,startup:u,withExclusiveTerminal:d,...f}=t,p=prepareDevelopmentTarget(r),{serverUrl:m}=r,h={headers:withTuiUserAgent(o)},g=new Client(p.kind===`local`?resolveLocalDevelopmentClientOptions({...h,serverUrl:m,token:()=>resolveLinkedDevelopmentOidcToken(p.target.workspaceRoot)}):resolveRemoteDevelopmentClientOptions({...h,serverUrl:m,credentials:p.remote.credentials})),_={...f,client:g,serverUrl:m,promptCommandHandler:createPromptCommandHandler({target:r}),availablePromptCommands:promptCommandsFor(r.kind),formatTransportError:e=>isVercelAuthChallenge(e)?formatRemoteAuthChallengeMessage(m):toErrorMessage(e)};p.kind===`local`?(_.appRoot=p.target.workspaceRoot,_.probeMcpConnection=probeMcpConnection):_.remote=p.remote,s!==void 0&&(_.initialInput=s),u!==void 0&&(_.renderer=u.renderer,_.startup=u),c!==void 0&&(_.onBootProgress=c),l!==void 0&&(_.lifecycle=l),d!==void 0&&(_.withExclusiveTerminal=d);let v=u?.diagnostics??(p.kind===`local`?await createDevDiagnostics(p.target.workspaceRoot).catch(()=>void 0):void 0);v!==void 0&&(_.diagnostics=v);try{await new EveTUIRunner(_).run()}finally{await v?.close()}}export{runDevelopmentTui,startDevelopmentTuiStartup};
|
|
1
|
+
import{createDevDiagnostics}from"../diagnostics.js";import{remoteHost}from"./target.js";import{promptCommandsFor}from"./prompt-commands.js";import{pickAgentHeaderTip}from"./agent-header.js";import{probeMcpConnection}from"./mcp-connection-status.js";import{createPromptCommandHandler}from"./prompt-command-handler.js";import{formatRemoteAuthChallengeMessage}from"./remote-auth-result.js";import{TerminalRenderer}from"./terminal-renderer.js";import{EveTUIRunner}from"./runner.js";import{Client}from"#client/index.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{toErrorMessage}from"#shared/errors.js";import{resolveDevelopmentOidcToken,resolveLinkedDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{isVercelAuthChallenge}from"#services/dev-client/vercel-auth-error.js";import{resolveVercelDeployment}from"#setup/vercel-deployment.js";import{appendUserAgentProduct}from"#internal/user-agent.js";import{resolveLocalDevelopmentClientOptions,resolveRemoteDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{createDevelopmentCredentialGate}from"#services/dev-client/credential-gate.js";async function startDevelopmentTuiStartup(t){let n=await createDevDiagnostics(t.appRoot).catch(()=>void 0),i=pickAgentHeaderTip(),a=new TerminalRenderer({...t,diagnostics:n,onExitRequest:t.onExitRequest});return a.beginStartupDraft({initialDraft:t.initialInput,tip:i,title:t.name??`eve`}),{diagnostics:n,headerTip:i,renderer:a,finish:()=>a.finishStartupDraft(),async shutdown(){a.shutdown(),await n?.close()}}}function prepareRemoteTarget(e){return{target:e,credentials:createDevelopmentCredentialGate(e.serverUrl),resolveOidcToken:resolveDevelopmentOidcToken,resolveDeployment:n=>resolveVercelDeployment({workspaceRoot:e.workspaceRoot,host:remoteHost(e),signal:n})}}function prepareDevelopmentTarget(e){return e.kind===`local`?{kind:`local`,target:e}:{kind:`remote`,target:e,remote:prepareRemoteTarget(e)}}function withTuiUserAgent(e){let t=new Headers(e);return appendUserAgentProduct(t,`eve-tui/${resolveInstalledPackageInfo().version}`),Object.fromEntries(t.entries())}async function runDevelopmentTui(t){let{target:r,headers:o,initialInput:s,onBootProgress:c,lifecycle:l,startup:u,withExclusiveTerminal:d,...f}=t,p=prepareDevelopmentTarget(r),{serverUrl:m}=r,h={headers:withTuiUserAgent(o)},g=new Client(p.kind===`local`?resolveLocalDevelopmentClientOptions({...h,interactiveClient:!0,serverUrl:m,token:()=>resolveLinkedDevelopmentOidcToken(p.target.workspaceRoot)}):resolveRemoteDevelopmentClientOptions({...h,serverUrl:m,credentials:p.remote.credentials})),_={...f,client:g,serverUrl:m,promptCommandHandler:createPromptCommandHandler({target:r}),availablePromptCommands:promptCommandsFor(r.kind),formatTransportError:e=>isVercelAuthChallenge(e)?formatRemoteAuthChallengeMessage(m):toErrorMessage(e)};p.kind===`local`?(_.appRoot=p.target.workspaceRoot,_.probeMcpConnection=probeMcpConnection):_.remote=p.remote,s!==void 0&&(_.initialInput=s),u!==void 0&&(_.renderer=u.renderer,_.startup=u),c!==void 0&&(_.onBootProgress=c),l!==void 0&&(_.lifecycle=l),d!==void 0&&(_.withExclusiveTerminal=d);let v=u?.diagnostics??(p.kind===`local`?await createDevDiagnostics(p.target.workspaceRoot).catch(()=>void 0):void 0);v!==void 0&&(_.diagnostics=v);try{await new EveTUIRunner(_).run()}finally{await v?.close()}}export{runDevelopmentTui,startDevelopmentTuiStartup};
|
|
@@ -1558,7 +1558,6 @@ export declare const AgentInfoResultSchema: z.ZodObject<{
|
|
|
1558
1558
|
audience: z.ZodArray<z.ZodEnum<{
|
|
1559
1559
|
"below-subagent-depth": "below-subagent-depth";
|
|
1560
1560
|
"delegated-task-child": "delegated-task-child";
|
|
1561
|
-
"requires-loadable-skill": "requires-loadable-skill";
|
|
1562
1561
|
"requires-request-input": "requires-request-input";
|
|
1563
1562
|
"root-session": "root-session";
|
|
1564
1563
|
}>>;
|