eve 0.46.1 → 0.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/src/channel/schedule.d.ts +1 -0
  3. package/dist/src/channel/schedule.js +1 -1
  4. package/dist/src/cli/dev/run-interactive-ui.d.ts +19 -0
  5. package/dist/src/cli/dev/run-interactive-ui.js +1 -0
  6. package/dist/src/cli/dev/tui/agent-header.js +1 -1
  7. package/dist/src/cli/dev/tui/remote-auth-command.js +1 -1
  8. package/dist/src/cli/dev/tui/remote-connection.js +1 -1
  9. package/dist/src/cli/dev/tui/runner.d.ts +6 -0
  10. package/dist/src/cli/dev/tui/runner.js +1 -1
  11. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +6 -0
  12. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  13. package/dist/src/cli/dev/tui/tui.d.ts +16 -0
  14. package/dist/src/cli/dev/tui/tui.js +1 -1
  15. package/dist/src/cli/run.js +3 -3
  16. package/dist/src/compiled/.vendor-stamp.json +2 -1
  17. package/dist/src/compiled/@vercel/sandbox/index.js +9 -15
  18. package/dist/src/compiled/@vercel/sandbox-delete/LICENSE +201 -0
  19. package/dist/src/compiled/@vercel/sandbox-delete/_async-retry.d.ts +8 -0
  20. package/dist/src/compiled/@vercel/sandbox-delete/_workflow-serde.d.ts +5 -0
  21. package/dist/src/compiled/@vercel/sandbox-delete/api-client/api-client.d.ts +1730 -0
  22. package/dist/src/compiled/@vercel/sandbox-delete/api-client/api-error.d.ts +29 -0
  23. package/dist/src/compiled/@vercel/sandbox-delete/api-client/base-client.d.ts +39 -0
  24. package/dist/src/compiled/@vercel/sandbox-delete/api-client/file-writer.d.ts +66 -0
  25. package/dist/src/compiled/@vercel/sandbox-delete/api-client/index.d.ts +2 -0
  26. package/dist/src/compiled/@vercel/sandbox-delete/api-client/validators.d.ts +907 -0
  27. package/dist/src/compiled/@vercel/sandbox-delete/api-client/with-retry.d.ts +10 -0
  28. package/dist/src/compiled/@vercel/sandbox-delete/auth/error.d.ts +15 -0
  29. package/dist/src/compiled/@vercel/sandbox-delete/auth/file.d.ts +18 -0
  30. package/dist/src/compiled/@vercel/sandbox-delete/auth/index.d.ts +6 -0
  31. package/dist/src/compiled/@vercel/sandbox-delete/auth/oauth.d.ts +111 -0
  32. package/dist/src/compiled/@vercel/sandbox-delete/auth/poll-for-token.d.ts +28 -0
  33. package/dist/src/compiled/@vercel/sandbox-delete/auth/project.d.ts +40 -0
  34. package/dist/src/compiled/@vercel/sandbox-delete/command.d.ts +292 -0
  35. package/dist/src/compiled/@vercel/sandbox-delete/constants.d.ts +15 -0
  36. package/dist/src/compiled/@vercel/sandbox-delete/execution-context.d.ts +116 -0
  37. package/dist/src/compiled/@vercel/sandbox-delete/filesystem.d.ts +258 -0
  38. package/dist/src/compiled/@vercel/sandbox-delete/index.d.ts +13 -0
  39. package/dist/src/compiled/@vercel/sandbox-delete/index.js +9 -0
  40. package/dist/src/compiled/@vercel/sandbox-delete/network-policy.d.ts +169 -0
  41. package/dist/src/compiled/@vercel/sandbox-delete/proxy.d.ts +55 -0
  42. package/dist/src/compiled/@vercel/sandbox-delete/sandbox-user.d.ts +211 -0
  43. package/dist/src/compiled/@vercel/sandbox-delete/sandbox.d.ts +1258 -0
  44. package/dist/src/compiled/@vercel/sandbox-delete/session.d.ts +435 -0
  45. package/dist/src/compiled/@vercel/sandbox-delete/snapshot.d.ts +238 -0
  46. package/dist/src/compiled/@vercel/sandbox-delete/utils/get-credentials.d.ts +21 -0
  47. package/dist/src/compiled/@vercel/sandbox-delete/utils/paginator.d.ts +16 -0
  48. package/dist/src/compiled/@vercel/sandbox-delete/utils/resolveSignal.d.ts +15 -0
  49. package/dist/src/compiled/@vercel/sandbox-delete/utils/sandbox-snapshot.d.ts +11 -0
  50. package/dist/src/compiled/@vercel/sandbox-delete/utils/types.d.ts +11 -0
  51. package/dist/src/compiled/_chunks/node/auth-DpzFWvTn.js +2 -0
  52. package/dist/src/compiled/_chunks/node/auth-QgeX8nBM.js +2 -0
  53. package/dist/src/compiled/_chunks/node/decode_jwt-Col8JOnf.js +7 -0
  54. package/dist/src/compiled/_chunks/node/version-DH6yRy-M.js +1 -0
  55. package/dist/src/compiled/_chunks/node/xdg-app-paths-Bys8q02u.js +1 -0
  56. package/dist/src/compiler/extension-compatibility.d.ts +12 -12
  57. package/dist/src/compiler/extension-compatibility.js +1 -1
  58. package/dist/src/compiler/model-catalog.js +1 -1
  59. package/dist/src/context/build-callback-context.js +1 -1
  60. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  61. package/dist/src/context/keys.d.ts +2 -0
  62. package/dist/src/context/keys.js +1 -1
  63. package/dist/src/context/memory-tools.js +1 -1
  64. package/dist/src/context/providers/sandbox.js +1 -1
  65. package/dist/src/evals/context.js +1 -1
  66. package/dist/src/evals/session-content.d.ts +5 -0
  67. package/dist/src/evals/session-content.js +3 -0
  68. package/dist/src/evals/session.d.ts +1 -0
  69. package/dist/src/evals/session.js +1 -1
  70. package/dist/src/evals/types.d.ts +5 -0
  71. package/dist/src/execution/dispatch-runtime-actions-shared.js +1 -1
  72. package/dist/src/execution/eve-workflow-attributes.d.ts +3 -0
  73. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  74. package/dist/src/execution/runtime-context.js +1 -1
  75. package/dist/src/execution/sandbox/bindings/docker-base-setup.d.ts +4 -4
  76. package/dist/src/execution/sandbox/bindings/docker-base-setup.js +1 -1
  77. package/dist/src/execution/sandbox/bindings/docker-session.d.ts +1 -1
  78. package/dist/src/execution/sandbox/bindings/docker-session.js +1 -1
  79. package/dist/src/execution/sandbox/bindings/docker.js +1 -1
  80. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  81. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -1
  82. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
  83. package/dist/src/execution/sandbox/bindings/vercel-base-runtime.d.ts +4 -0
  84. package/dist/src/execution/sandbox/bindings/vercel-base-runtime.js +2 -2
  85. package/dist/src/execution/sandbox/bindings/vercel-lifecycle.d.ts +8 -0
  86. package/dist/src/execution/sandbox/bindings/vercel-lifecycle.js +1 -0
  87. package/dist/src/execution/sandbox/bindings/vercel-sdk-types.d.ts +3 -0
  88. package/dist/src/execution/sandbox/bindings/vercel.d.ts +2 -1
  89. package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
  90. package/dist/src/execution/sandbox/ensure.d.ts +2 -0
  91. package/dist/src/execution/sandbox/ensure.js +1 -1
  92. package/dist/src/execution/sandbox/require-sandbox.js +1 -1
  93. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  94. package/dist/src/execution/tools/connection-search.js +2 -2
  95. package/dist/src/execution/tools/file-state.js +1 -1
  96. package/dist/src/execution/tools/load-skill.js +1 -1
  97. package/dist/src/execution/tools/subagent/local.js +1 -1
  98. package/dist/src/execution/workflow-steps.js +1 -1
  99. package/dist/src/harness/approval-delivery-coordinator.js +1 -1
  100. package/dist/src/harness/attachment-staging.js +1 -1
  101. package/dist/src/harness/authorization.js +1 -1
  102. package/dist/src/harness/current-messages.d.ts +15 -0
  103. package/dist/src/harness/current-messages.js +1 -0
  104. package/dist/src/harness/instrumentation/runtime-context.js +1 -1
  105. package/dist/src/harness/instrumentation/state.js +1 -1
  106. package/dist/src/harness/step-hooks.js +1 -1
  107. package/dist/src/harness/tool-loop.js +2 -2
  108. package/dist/src/harness/tools.js +1 -1
  109. package/dist/src/internal/application/package.js +1 -1
  110. package/dist/src/internal/model-catalog.js +1 -1
  111. package/dist/src/internal/nitro/host/start-development-server.js +1 -1
  112. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  113. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +2 -2
  114. package/dist/src/public/definitions/sandbox-backend.d.ts +1 -1
  115. package/dist/src/public/sandbox/index.d.ts +1 -1
  116. package/dist/src/runtime/agent/resolve-model.js +1 -1
  117. package/dist/src/runtime/connections/principal.js +1 -1
  118. package/dist/src/sandbox/state.d.ts +2 -0
  119. package/dist/src/services/dev-client.js +1 -1
  120. package/dist/src/setup/scaffold/create/project.js +1 -1
  121. package/dist/src/setup/scaffold/create/web-template.d.ts +1 -1
  122. package/dist/src/setup/scaffold/create/web-template.js +4 -2
  123. package/dist/src/shared/sandbox-backend.d.ts +9 -0
  124. package/dist/src/shared/sandbox-definition.d.ts +5 -4
  125. package/dist/src/shared/sandbox-session.d.ts +4 -1
  126. package/dist/src/tasks/delivery-policy.d.ts +12 -0
  127. package/dist/src/tasks/delivery-policy.js +1 -0
  128. package/dist/src/tracing/agent-trace-context-store.js +1 -1
  129. package/docs/evals/cases.mdx +11 -2
  130. package/docs/evals/judge.mdx +15 -0
  131. package/docs/evals/overview.mdx +2 -2
  132. package/docs/guides/instrumentation.md +1 -0
  133. package/docs/guides/session-context.md +2 -2
  134. package/docs/sandbox.mdx +25 -2
  135. package/docs/schedules.mdx +2 -0
  136. package/docs/tools/overview.mdx +2 -0
  137. package/package.json +2 -1
  138. package/dist/src/compiled/_chunks/node/auth-BaNbsImr.js +0 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # eve
2
2
 
3
+ ## 0.47.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 624d07d: Show the agent card and an editing-only prompt while `eve dev` builds the local agent, and simplify the card to branding, agent name, and a Tip. Text typed during startup is preserved for the initialized terminal UI, while submission remains disabled until startup completes.
8
+
9
+ ## 0.47.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 52e89ef: Add `delete()` to the runtime sandbox handle for permanently deleting the current session sandbox and reprovisioning it on the next access. Docker handles stay bound to one physical container, and sandbox `onSession` callbacks now receive session metadata through `ctx` while using `use()` for sandbox access.
14
+
15
+ ### Patch Changes
16
+
17
+ - a3b23c0: Eval contexts and sessions now expose a formatted `transcript` of observed user and assistant messages, which can be passed directly to an LLM judge for multi-turn conversation grading.
18
+ - 56514d9: Models with slug ending in `-thinking` are now resolved to the
19
+ correct model instead of failing with `does not have known AI Gateway context window metadata` error or silently using the base model's context window.
20
+ - 41c8286: Restore Bash process substitution in Vercel sandboxes by providing the standard `/dev/fd` path whenever eve creates or resumes a sandbox session.
21
+ - bdb3973: Preserve schedule provenance when a handler starts a session with user credentials. Scheduled background-task launches now stay silent instead of sending a launch acknowledgement, and schedule-created workflow runs expose `$eve.schedule` for attribution.
22
+ - fccbf2b: Fix a TypeScript error in the generated Web Chat `tool.tsx` where `trimEnd` was called on `string | number` values returned by the tool output helper.
23
+
3
24
  ## 0.46.1
4
25
 
5
26
  ### Patch Changes
@@ -52,6 +52,7 @@ export declare class ScheduleDispatcher {
52
52
  readonly channels: readonly ResolvedChannelDefinition[];
53
53
  });
54
54
  trigger(input: ScheduleDispatchInput): Promise<ScheduleDispatchResult>;
55
+ private triggerInScope;
55
56
  private runMarkdown;
56
57
  }
57
58
  /**
@@ -1 +1 @@
1
- import{createSession}from"#channel/session.js";import{SCHEDULE_APP_AUTH,SCHEDULE_APP_AUTH as SCHEDULE_APP_AUTH$1}from"#channel/schedule-auth.js";import{createCrossChannelToFn,toCrossChannelTargets}from"#channel/cross-channel-receive.js";import{expectFunction}from"#internal/authored-module.js";const SCHEDULE_ADAPTER_KIND=`schedule`,SCHEDULE_ADAPTER={kind:SCHEDULE_ADAPTER_KIND};var ScheduleDispatcher=class{runtime;channels;constructor(e){this.runtime=e.runtime,this.channels=e.channels}async trigger(e){let t=[],a=[],o=createCrossChannelToFn(this.runtime,toCrossChannelTargets(this.channels)),s={appAuth:SCHEDULE_APP_AUTH$1,to(e,n){let r=o(e,n);return{async send(e,n){let i=await r.send(e,n);return t.push(i),i}}},waitUntil(e){a.push(e)}};if(e.run)await e.run(s);else if(e.markdown!==void 0){let n=await this.runMarkdown(e.markdown);t.push(n)}else throw Error(`Schedule "${e.scheduleId}" has neither "run" nor "markdown" — at least one must be set.`);return{sessions:t,waitUntilTasks:a}}async runMarkdown(t){return createSession((await this.runtime.createSession({adapter:SCHEDULE_ADAPTER,auth:SCHEDULE_APP_AUTH$1,input:{message:t},mode:`task`})).sessionId,this.runtime)}};function expectScheduleRun(e,t,n){let r=e;if(typeof r!=`object`||!r)throw Error(`Schedule export "${n??`default`}" from "${t}" must be an object.`);return expectFunction(r.run,`Expected the schedule export "${n??`default`}" from "${t}" to export a \`run\` handler function.`)}export{SCHEDULE_ADAPTER,SCHEDULE_ADAPTER_KIND,SCHEDULE_APP_AUTH,ScheduleDispatcher,expectScheduleRun};
1
+ import{createSession}from"#channel/session.js";import{SCHEDULE_APP_AUTH,SCHEDULE_APP_AUTH as SCHEDULE_APP_AUTH$1}from"#channel/schedule-auth.js";import{createCrossChannelToFn,toCrossChannelTargets}from"#channel/cross-channel-receive.js";import{ContextContainer,contextStorage}from"#context/container.js";import{ScheduleIdKey}from"#context/keys.js";import{expectFunction}from"#internal/authored-module.js";const SCHEDULE_ADAPTER_KIND=`schedule`,SCHEDULE_ADAPTER={kind:SCHEDULE_ADAPTER_KIND};var ScheduleDispatcher=class{runtime;channels;constructor(e){this.runtime=e.runtime,this.channels=e.channels}async trigger(e){let t=new ContextContainer;return t.set(ScheduleIdKey,e.scheduleId),await contextStorage.run(t,()=>this.triggerInScope(e))}async triggerInScope(e){let t=[],a=[],o=createCrossChannelToFn(this.runtime,toCrossChannelTargets(this.channels)),s={appAuth:SCHEDULE_APP_AUTH$1,to(e,n){let r=o(e,n);return{async send(e,n){let i=await r.send(e,n);return t.push(i),i}}},waitUntil(e){a.push(e)}};if(e.run)await e.run(s);else if(e.markdown!==void 0){let n=await this.runMarkdown(e.markdown);t.push(n)}else throw Error(`Schedule "${e.scheduleId}" has neither "run" nor "markdown" — at least one must be set.`);return{sessions:t,waitUntilTasks:a}}async runMarkdown(t){return createSession((await this.runtime.createSession({adapter:SCHEDULE_ADAPTER,auth:SCHEDULE_APP_AUTH$1,input:{message:t},mode:`task`})).sessionId,this.runtime)}};function expectScheduleRun(e,t,n){let r=e;if(typeof r!=`object`||!r)throw Error(`Schedule export "${n??`default`}" from "${t}" must be an object.`);return expectFunction(r.run,`Expected the schedule export "${n??`default`}" from "${t}" to export a \`run\` handler function.`)}export{SCHEDULE_ADAPTER,SCHEDULE_ADAPTER_KIND,SCHEDULE_APP_AUTH,ScheduleDispatcher,expectScheduleRun};
@@ -0,0 +1,19 @@
1
+ import { type DevBootProgressReporter } from "#internal/dev-boot-progress.js";
2
+ import type { DevelopmentCliOptions } from "./command-options.js";
3
+ import type { DevelopmentTuiStartup, RunDevelopmentTuiInput } from "./tui/tui.js";
4
+ import type { DevelopmentUrlTarget } from "./url-target.js";
5
+ import type { CommandLifecycle } from "../shutdown.js";
6
+ export declare function runInteractiveDevelopmentUi(input: {
7
+ readonly applicationRoot: string;
8
+ readonly existingLocalServer: boolean;
9
+ readonly lifecycle?: CommandLifecycle;
10
+ readonly options: DevelopmentCliOptions;
11
+ readonly remoteTarget?: DevelopmentUrlTarget;
12
+ readonly report?: DevBootProgressReporter;
13
+ readonly runDevelopmentTui?: (input: RunDevelopmentTuiInput) => Promise<void>;
14
+ readonly server: {
15
+ readonly appRoot?: string;
16
+ readonly serverUrl: string;
17
+ };
18
+ readonly startup?: DevelopmentTuiStartup;
19
+ }): Promise<void>;
@@ -0,0 +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(t){let n=await devBootPhase(`loading interactive UI`,async()=>t.runDevelopmentTui??(await import(`#cli/dev/tui/tui.js`)).runDevelopmentTui,t.report),r=t.remoteTarget===void 0||t.existingLocalServer?{kind:`local`,serverUrl:t.server.serverUrl,workspaceRoot:t.server.appRoot??t.applicationRoot}:{kind:`remote`,serverUrl:t.server.serverUrl,workspaceRoot:t.applicationRoot},i=resolveTuiDisplayOptions(t.options),a=resolveTuiTitle({name:t.options.name,target:r});a!==void 0&&(i.name=a);let o={target:r,initialInput:t.options.input,onBootProgress:t.report,lifecycle:t.lifecycle,...i};t.startup!==void 0&&(o.startup=t.startup),r.kind===`local`&&(o.withExclusiveTerminal=async e=>{if(!await suspendDevelopmentRuntimeArtifacts({serverUrl:t.server.serverUrl}))throw Error(`Could not pause the development server for integration setup.`);try{return await e()}finally{await resumeDevelopmentRuntimeArtifacts({serverUrl:t.server.serverUrl,silent:!0})}}),t.remoteTarget?.headers===void 0?await n(o):await n({...o,headers:t.remoteTarget.headers})}export{runInteractiveDevelopmentUi};
@@ -1 +1 @@
1
- import{isPromptControlCommand}from"./prompt-commands.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{clipVisible,visibleLength}from"#cli/ui/terminal-text.js";const AGENT_HEADER_TIPS=[`Use the /add command to install an integration.`,`Use the /deploy command to deploy your agent.`,`Use the /help command to see every command.`],EVE_LOGO=[`⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⠏⣿⣿⣿⣿⣿⣿⣿⣿⣿`,` ⠇⣿⠏`,`⣿⣿⣿⣿⣿⣿⠇ ⠇⣿⠏ ⠇⣿⣿⣿⣿⣿`,` ⠃⣿⠏`,`⣿⣿⣿⣿⣿⣿⠏ ⠃⣿⠏ ⠇⣿⣿⣿⣿⣿⣿⣿`];function pickAgentHeaderTip(e=Math.random){let t=Math.min(AGENT_HEADER_TIPS.length-1,Math.floor(e()*AGENT_HEADER_TIPS.length));return AGENT_HEADER_TIPS[t]}function buildAgentHeader(e){let{theme:i,info:o,width:s}=e,c=i.colors,l=resolveInstalledPackageInfo().version,u=Math.min(68,Math.max(0,s-1)),d=`${c.dim(`☰`)}${c.bold(`eve`)} ${c.dim(`(v${l})`)}`;if(u<4)return[clipVisible(d,s)];let f=i.unicode?`─`:`-`,p=i.unicode?`│`:`|`,m=i.unicode?`╭`:`+`,h=i.unicode?`╮`:`+`,g=i.unicode?`╰`:`+`,_=i.unicode?`╯`:`+`,v=u-2,y=f.repeat(v),row=(e=``,t=0)=>{let i=Math.max(0,v-2),a=clipVisible(e,i),o=Math.max(0,i-visibleLength(a)-t);return`${c.dim(p)} ${a}${` `.repeat(o)} ${c.dim(p)}`},b=o?.agent.name??e.name,x=b===void 0?d:spreadRow(d,c.bold(b),v-2,1),S=[c.dim(`${m}${y}${h}`)];S.push(row(x,1),row());let C=Math.max(...EVE_LOGO.map(e=>visibleLength(e)));i.unicode&&v-2>=C&&S.push(...EVE_LOGO.map(e=>row(centerLogoLine(e,C,v-2,i))),row());let detail=(e,t)=>row(`${c.dim(e.padEnd(14))}${t}`),w=formatHeaderModel(o?.agent.model,i);if(w!==void 0&&S.push(detail(`model`,w)),o!==void 0){S.push(detail(`instructions`,formatInstructions(o,v-18))),S.push(row());let e=groupTools(o);if(e.length===0)S.push(detail(`tools`,`none`));else{S.push(detail(`tools`,``));for(let t of e.slice(0,4))S.push(detail(` ${t.label}`,fitNames(t.names,v-18)));let t=e.length-4;t>0&&S.push(detail(` +${t} ${pluralize(t,`group`)}`,``))}S.push(detail(`skills`,fitNames(skillNames(o),v-18))),S.push(detail(`subagents`,fitNames(subagentNames(o),v-18))),S.push(detail(`schedules`,fitNames(o.schedules.map(e=>e.name),v-18)))}if(S.push(c.dim(`${g}${y}${_}`)),o&&(o.diagnostics.discoveryErrors>0||o.diagnostics.discoveryWarnings>0)){let e=[];o.diagnostics.discoveryErrors>0&&e.push(c.red(`${o.diagnostics.discoveryErrors} error${plural(o.diagnostics.discoveryErrors)}`)),o.diagnostics.discoveryWarnings>0&&e.push(c.yellow(`${o.diagnostics.discoveryWarnings} warning${plural(o.diagnostics.discoveryWarnings)}`)),S.push(``,` ${c.dim(i.glyph.warning)} ${e.join(c.dim(` · `))}`)}return e.tip!==void 0&&S.push(``,` ${c.bold(`Tip:`)} ${renderTip(e.tip,Math.max(8,s-7),i)}`),S}function centerLogoLine(e,t,n,r){let i=Math.max(0,Math.floor((n-t)/2));return`${` `.repeat(i)}${r.colors.cyan(e)}`}function spreadRow(e,t,i,a){let o=Math.max(1,i-a),s=clipVisible(e,Math.max(1,o-visibleLength(t)-1)),c=clipVisible(t,Math.max(1,o-visibleLength(s)-1)),l=Math.max(1,o-visibleLength(s)-visibleLength(c));return`${s}${` `.repeat(l)}${c}`}function groupTools(e){let t=new Map;for(let n of e.tools.static){let e=n.owner.kind===`application`?`agent`:n.owner.kind===`framework`?`eve`:n.owner.namespace,r=t.get(e)??[];r.push(n.name),t.set(e,r)}e.tools.dynamic.length>0&&t.set(`dynamic`,e.tools.dynamic.map(e=>e.slug));let priority=e=>e===`agent`?0:e===`dynamic`?2:e===`eve`?3:1;return[...t].map(([e,t])=>({label:e,names:t.sort()})).sort((e,t)=>priority(e.label)-priority(t.label)||e.label.localeCompare(t.label))}function skillNames(e){return[...e.skills.static.map(e=>e.name),...e.skills.dynamic.map(e=>`${e.slug} (dynamic)`)].sort()}function subagentNames(e){return[...e.subagents.local,...e.remoteAgents.entries].map(e=>e.name).sort()}function formatInstructions(e,t){return fitNames([...e.instructions.static.map(e=>`${e.logicalPath} (${e.role})`),...e.instructions.dynamic.map(e=>`${e.slug} (dynamic)`)],t)}function fitNames(e,t){if(e.length===0)return`none`;for(let n=e.length;n>0;--n){let i=e.length-n,a=`${e.slice(0,n).join(`, `)}${i>0?`, +${i} more`:``}`;if(visibleLength(a)<=t)return a}return clipVisible(e[0],t)}function formatHeaderModel(e,t){if(e?.id===void 0)return;let n=e.endpoint;if(n===void 0)return e.id;let r=t.colors.dim(`via `);switch(n.kind){case`external`:return`${e.id} ${r}${n.provider}`;case`chatgpt`:return`${e.id} ${r}chatgpt-sub`;case`gateway`:return n.connected?`${e.id} ${r}ai-gateway(${n.credential})`:`${e.id} ${r}ai-gateway(not connected)`}}function renderTip(t,r,i){return clipVisible(t.split(/(\/[a-z:-]+)/u).map(t=>isPromptControlCommand(t)?i.colors.blue(t):i.colors.dim(t)).join(``),r)}function plural(e){return e===1?``:`s`}function pluralize(e,t){return`${t}${plural(e)}`}export{AGENT_HEADER_TIPS,buildAgentHeader,pickAgentHeaderTip};
1
+ import{isPromptControlCommand}from"./prompt-commands.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{clipVisible,visibleLength}from"#cli/ui/terminal-text.js";const AGENT_HEADER_TIPS=[`Use the /add command to install an integration.`,`Use the /deploy command to deploy your agent.`,`Use the /help command to see every command.`];function pickAgentHeaderTip(e=Math.random){let t=Math.min(AGENT_HEADER_TIPS.length-1,Math.floor(e()*AGENT_HEADER_TIPS.length));return AGENT_HEADER_TIPS[t]}function buildAgentHeader(e){let{theme:r,info:i,width:a}=e,o=r.colors,s=resolveInstalledPackageInfo().version,c=Math.min(68,Math.max(0,a-1)),l=`${o.dim(`☰`)}${o.bold(`eve`)} ${o.dim(`(v${s})`)}`;if(c<4)return[clipVisible(l,a)];let u=r.unicode?`─`:`-`,d=r.unicode?`│`:`|`,f=r.unicode?`╭`:`+`,p=r.unicode?`╮`:`+`,m=r.unicode?`╰`:`+`,h=r.unicode?`╯`:`+`,g=c-2,_=u.repeat(g),row=(e=``,t=0)=>{let r=Math.max(0,g-2),i=clipVisible(e,r),a=Math.max(0,r-visibleLength(i)-t);return`${o.dim(d)} ${i}${` `.repeat(a)} ${o.dim(d)}`},v=i?.agent.name??e.name,y=v===void 0?l:spreadRow(l,o.bold(v),g-2,1),b=[o.dim(`${f}${_}${p}`)];if(b.push(row(y,1)),b.push(row()),e.tip!==void 0&&b.push(row(`${o.bold(`Tip:`)} ${renderTip(e.tip,g-7,r)}`)),b.push(o.dim(`${m}${_}${h}`)),i&&(i.diagnostics.discoveryErrors>0||i.diagnostics.discoveryWarnings>0)){let e=[];i.diagnostics.discoveryErrors>0&&e.push(o.red(`${i.diagnostics.discoveryErrors} error${plural(i.diagnostics.discoveryErrors)}`)),i.diagnostics.discoveryWarnings>0&&e.push(o.yellow(`${i.diagnostics.discoveryWarnings} warning${plural(i.diagnostics.discoveryWarnings)}`)),b.push(``,` ${o.dim(r.glyph.warning)} ${e.join(o.dim(` · `))}`)}return b}function spreadRow(e,t,r,i){let a=Math.max(1,r-i),o=clipVisible(e,Math.max(1,a-visibleLength(t)-1)),s=clipVisible(t,Math.max(1,a-visibleLength(o)-1)),c=Math.max(1,a-visibleLength(o)-visibleLength(s));return`${o}${` `.repeat(c)}${s}`}function renderTip(t,n,r){return clipVisible(t.split(/(\/[a-z:-]+)/u).map(t=>isPromptControlCommand(t)?r.colors.blue(t):r.colors.dim(t)).join(``),n)}function plural(e){return e===1?``:`s`}export{AGENT_HEADER_TIPS,buildAgentHeader,pickAgentHeaderTip};
@@ -1,3 +1,3 @@
1
- import{createTuiPrompter}from"./tui-prompter.js";import{describeRemoteAuthCompletedMutations}from"./remote-auth-result.js";import{runRemoteAuthFlow}from"./remote-auth.js";import{remoteHost}from"./target.js";import{WizardCancelledError}from"#setup/step.js";function shouldConfigureTrustedSources(e){switch(e.state){case`auth-required`:case`auth-failed`:return e.challenge.kind===`vercel-deployment-protection`;case`unavailable`:return e.failure.code===`TRUSTED_SOURCES_ENVIRONMENT_MISMATCH`;case`checking`:case`authenticating`:case`ready`:return!1}}function unavailableAfterAuthentication(e,t){let[n=t,...r]=t.split(/\n\s*\n/u);return[`Authentication was refreshed, but ${e} is unavailable: ${/[.!?]$/u.test(n.trim())?n.trim():`${n.trim()}.`}`,...r.map(e=>e.trim()).filter(e=>e.length>0)].join(`
1
+ import{remoteHost}from"./target.js";import{createTuiPrompter}from"./tui-prompter.js";import{describeRemoteAuthCompletedMutations}from"./remote-auth-result.js";import{runRemoteAuthFlow}from"./remote-auth.js";import{WizardCancelledError}from"#setup/step.js";function shouldConfigureTrustedSources(e){switch(e.state){case`auth-required`:case`auth-failed`:return e.challenge.kind===`vercel-deployment-protection`;case`unavailable`:return e.failure.code===`TRUSTED_SOURCES_ENVIRONMENT_MISMATCH`;case`checking`:case`authenticating`:case`ready`:return!1}}function unavailableAfterAuthentication(e,t){let[n=t,...r]=t.split(/\n\s*\n/u);return[`Authentication was refreshed, but ${e} is unavailable: ${/[.!?]$/u.test(n.trim())?n.trim():`${n.trim()}.`}`,...r.map(e=>e.trim()).filter(e=>e.length>0)].join(`
2
2
 
3
3
  `)}function mutedRenderer(e,t){return{readSelect:n=>t()?Promise.resolve(void 0):e.readSelect(n),readEditableSelect:n=>t()?Promise.resolve(void 0):e.readEditableSelect(n),readText:n=>t()?Promise.resolve(void 0):e.readText(n),readAcknowledge:n=>t()?Promise.resolve():e.readAcknowledge(n),readChoice:n=>t()?{choice:Promise.resolve(void 0),close:()=>{}}:e.readChoice(n),setStatus:n=>{t()||e.setStatus(n)},renderLine:(n,r)=>{(!t()||r===`warning`||r===`error`)&&e.renderLine(n,r)},renderOutput:n=>{t()||e.renderOutput(n)},withInheritedStdio:t=>e.withInheritedStdio(t),withExclusiveTerminal:t=>e.withExclusiveTerminal?.(t)??e.withInheritedStdio(t)}}async function runRemoteAuthCommand(i){i.renderer.begin(`Authenticate via Vercel OIDC`,`pulse`);let a=!0,o=!1,s=new AbortController,c=i.renderer.waitForInterrupt(),l=i.connection.current().target;try{let u=i.flow??runRemoteAuthFlow,d=shouldConfigureTrustedSources(i.connection.current().connection),f=createTuiPrompter(mutedRenderer(i.renderer,()=>o)),p=i.connection.authenticate(async e=>{let t=await u({workspaceRoot:l.workspaceRoot,serverUrl:l.serverUrl,configureTrustedSources:d,prompter:f,signal:e});return a=t.kind===`failed`,t},s.signal),m=await Promise.race([p.then(e=>({kind:`completed`,outcome:e})),c.promise.then(()=>({kind:`interrupted`}))]);m.kind===`interrupted`&&(o=!0,a=!0,s.abort(new WizardCancelledError));let h=m.kind===`completed`?m.outcome:await p;switch(h.kind){case`authenticated`:return`Authenticated ${remoteHost(l)} via Vercel OIDC.`;case`cancelled`:if(o){let e=describeRemoteAuthCompletedMutations(h.completedMutations);return e.length===0?`/vc:login interrupted.`:`/vc:login interrupted. Completed before interruption: ${e.join(`, `)}.`}return h.completedMutations.some(e=>e.kind===`vercel-login`)?`/vc:login dismissed after logging in to Vercel.`:`/vc:login dismissed.`;case`failed`:return h.message;case`unavailable`:return unavailableAfterAuthentication(remoteHost(l),h.failure.message)}}finally{c.dispose(),i.renderer.setStatus(void 0),i.renderer.end({preserveDiagnostics:a})}}export{runRemoteAuthCommand};
@@ -1 +1 @@
1
- import{appendRemoteAuthMutationSummary}from"./remote-auth-result.js";import{remoteHost}from"./target.js";import{classifyRemoteError,probeRemoteInfo}from"./remote-connection-probe.js";import{toErrorMessage}from"#shared/errors.js";function challengeFor(e){switch(e.state){case`auth-required`:case`authenticating`:case`auth-failed`:return e.challenge;case`checking`:case`ready`:return{kind:`eve-oidc`};case`unavailable`:return e.failure.code===`TRUSTED_SOURCES_ENVIRONMENT_MISMATCH`?{kind:`vercel-deployment-protection`}:{kind:`eve-oidc`}}}function createRemoteConnectionController(i){let a={state:`checking`},o,s,restoreActiveCredentials,c=0,l=!1,snapshot=()=>o===void 0?{target:i.target,connection:a}:{target:i.target,connection:a,deployment:o},update=e=>(a=e,l||i.onChange(snapshot()),e),beginOperation=e=>{s?.abort();let t=new AbortController;s=t;let n=e===void 0?t.signal:AbortSignal.any([t.signal,e]);return{generation:++c,signal:n}},isCurrent=e=>!l&&e===c,publishTarget=e=>{o=e.deployment,l||i.onChange(snapshot())},authorizeResolvedTarget=async(e,t)=>{let n=i.resolveDeployment;if(n!==void 0)try{let r=await n(e);return!isCurrent(t)||e.aborted||r.kind!==`resolved`?void 0:(publishTarget(r.target),i.credentials.authorize({target:r.target,resolveToken:async()=>await i.resolveOidcToken?.(r.target.deployment)??``}))}catch{}};return i.onChange(snapshot()),{current:snapshot,async check(){let e=beginOperation();restoreActiveCredentials?.(),restoreActiveCredentials=void 0,o=void 0,update({state:`checking`});let t=await authorizeResolvedTarget(e.signal,e.generation);if(!isCurrent(e.generation))return t?.(),a;restoreActiveCredentials=t;let n=await probeRemoteInfo({client:i.client,phase:`connection-check`});return isCurrent(e.generation)?update(n):a},async authenticate(n,o){let s=beginOperation(o),c=a,l=challengeFor(a);update({state:`authenticating`,challenge:l});let u;try{u=await n(s.signal)}catch(e){u={kind:`failed`,message:toErrorMessage(e),completedMutations:[]}}if(!isCurrent(s.generation))return{kind:`cancelled`,completedMutations:u.completedMutations};if(u.kind===`cancelled`)return update(c),{kind:`cancelled`,completedMutations:u.completedMutations};if(u.kind===`failed`)return update(c.state===`ready`?c:{state:`auth-failed`,challenge:l}),{kind:`failed`,message:u.message};if(s.signal.aborted)return update(c),{kind:`cancelled`,completedMutations:u.completedMutations};let d=restoreActiveCredentials,f;try{f=i.credentials.authorize({target:u.target,resolveToken:u.resolveToken})}catch(t){let n=appendRemoteAuthMutationSummary(toErrorMessage(t),u.completedMutations);return update({state:`auth-failed`,challenge:l}),{kind:`failed`,message:n}}let p=await probeRemoteInfo({client:i.client,phase:`authentication-verification`});if(!isCurrent(s.generation))return f(),{kind:`cancelled`,completedMutations:u.completedMutations};if(s.signal.aborted)return f(),update(c),{kind:`cancelled`,completedMutations:u.completedMutations};if(p.state===`ready`)return publishTarget(u.target),restoreActiveCredentials=()=>{f(),d?.()},update(p),{kind:`authenticated`};if(f(),p.state===`auth-required`){let n=appendRemoteAuthMutationSummary(`The selected Vercel project did not authorize ${remoteHost(i.target)}.`,u.completedMutations);return update({state:`auth-failed`,challenge:p.challenge}),{kind:`failed`,message:n}}let m={...p.failure,message:appendRemoteAuthMutationSummary(p.failure.message,u.completedMutations)};return update({state:`unavailable`,failure:m}),{kind:`unavailable`,failure:m}},reportFailure(e){return s?.abort(),c+=1,update(classifyRemoteError(e,`connection-check`))},dispose(){l=!0,c+=1,s?.abort(),s=void 0,restoreActiveCredentials?.(),restoreActiveCredentials=void 0}}}export{createRemoteConnectionController};
1
+ import{remoteHost}from"./target.js";import{appendRemoteAuthMutationSummary}from"./remote-auth-result.js";import{classifyRemoteError,probeRemoteInfo}from"./remote-connection-probe.js";import{toErrorMessage}from"#shared/errors.js";function challengeFor(e){switch(e.state){case`auth-required`:case`authenticating`:case`auth-failed`:return e.challenge;case`checking`:case`ready`:return{kind:`eve-oidc`};case`unavailable`:return e.failure.code===`TRUSTED_SOURCES_ENVIRONMENT_MISMATCH`?{kind:`vercel-deployment-protection`}:{kind:`eve-oidc`}}}function createRemoteConnectionController(i){let a={state:`checking`},o,s,restoreActiveCredentials,c=0,l=!1,snapshot=()=>o===void 0?{target:i.target,connection:a}:{target:i.target,connection:a,deployment:o},update=e=>(a=e,l||i.onChange(snapshot()),e),beginOperation=e=>{s?.abort();let t=new AbortController;s=t;let n=e===void 0?t.signal:AbortSignal.any([t.signal,e]);return{generation:++c,signal:n}},isCurrent=e=>!l&&e===c,publishTarget=e=>{o=e.deployment,l||i.onChange(snapshot())},authorizeResolvedTarget=async(e,t)=>{let n=i.resolveDeployment;if(n!==void 0)try{let r=await n(e);return!isCurrent(t)||e.aborted||r.kind!==`resolved`?void 0:(publishTarget(r.target),i.credentials.authorize({target:r.target,resolveToken:async()=>await i.resolveOidcToken?.(r.target.deployment)??``}))}catch{}};return i.onChange(snapshot()),{current:snapshot,async check(){let e=beginOperation();restoreActiveCredentials?.(),restoreActiveCredentials=void 0,o=void 0,update({state:`checking`});let t=await authorizeResolvedTarget(e.signal,e.generation);if(!isCurrent(e.generation))return t?.(),a;restoreActiveCredentials=t;let n=await probeRemoteInfo({client:i.client,phase:`connection-check`});return isCurrent(e.generation)?update(n):a},async authenticate(n,o){let s=beginOperation(o),c=a,l=challengeFor(a);update({state:`authenticating`,challenge:l});let u;try{u=await n(s.signal)}catch(e){u={kind:`failed`,message:toErrorMessage(e),completedMutations:[]}}if(!isCurrent(s.generation))return{kind:`cancelled`,completedMutations:u.completedMutations};if(u.kind===`cancelled`)return update(c),{kind:`cancelled`,completedMutations:u.completedMutations};if(u.kind===`failed`)return update(c.state===`ready`?c:{state:`auth-failed`,challenge:l}),{kind:`failed`,message:u.message};if(s.signal.aborted)return update(c),{kind:`cancelled`,completedMutations:u.completedMutations};let d=restoreActiveCredentials,f;try{f=i.credentials.authorize({target:u.target,resolveToken:u.resolveToken})}catch(e){let n=appendRemoteAuthMutationSummary(toErrorMessage(e),u.completedMutations);return update({state:`auth-failed`,challenge:l}),{kind:`failed`,message:n}}let p=await probeRemoteInfo({client:i.client,phase:`authentication-verification`});if(!isCurrent(s.generation))return f(),{kind:`cancelled`,completedMutations:u.completedMutations};if(s.signal.aborted)return f(),update(c),{kind:`cancelled`,completedMutations:u.completedMutations};if(p.state===`ready`)return publishTarget(u.target),restoreActiveCredentials=()=>{f(),d?.()},update(p),{kind:`authenticated`};if(f(),p.state===`auth-required`){let n=appendRemoteAuthMutationSummary(`The selected Vercel project did not authorize ${remoteHost(i.target)}.`,u.completedMutations);return update({state:`auth-failed`,challenge:p.challenge}),{kind:`failed`,message:n}}let m={...p.failure,message:appendRemoteAuthMutationSummary(p.failure.message,u.completedMutations)};return update({state:`unavailable`,failure:m}),{kind:`unavailable`,failure:m}},reportFailure(e){return s?.abort(),c+=1,update(classifyRemoteError(e,`connection-check`))},dispose(){l=!0,c+=1,s?.abort(),s=void 0,restoreActiveCredentials?.(),restoreActiveCredentials=void 0}}}export{createRemoteConnectionController};
@@ -316,6 +316,10 @@ export interface PromptCommandHandler {
316
316
  type: "extension";
317
317
  }>, context: PromptCommandHandlerContext): Promise<PromptCommandOutcome | undefined>;
318
318
  }
319
+ type TuiStartup = {
320
+ readonly headerTip: string;
321
+ finish(): string;
322
+ };
319
323
  export type EveTUIRunnerOptions = TuiDisplayOptions & {
320
324
  session?: ClientSession;
321
325
  /** Production TUI probe injected by the launcher; omitted in hermetic runners. */
@@ -379,6 +383,8 @@ export type EveTUIRunnerOptions = TuiDisplayOptions & {
379
383
  /** Parent-owned diagnostics recorder; omitted for remote and test renderers. */
380
384
  diagnostics?: DevDiagnostics;
381
385
  lifecycle?: CommandLifecycle;
386
+ /** Editing-only startup state retained until the final agent header is ready to paint. */
387
+ startup?: TuiStartup;
382
388
  };
383
389
  export declare class EveTUIRunner {
384
390
  #private;
@@ -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{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";import{devBootPhase}from"#internal/dev-boot-progress.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=!1;#w=new AbortController;#T=!1;#E=[];#D;#O;#k;#A=pickAgentHeaderTip();#j;#M=new Map;#N;#P;#F=new Map;#I=new Set;#L;#R;#z;constructor(t){this.#e=t.session,t.client!==void 0&&(this.#t=t.client),t.lifecycle!==void 0&&(this.#z=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.#P=new SubagentPump(n),this.#r=t.name??`eve`,this.#_=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.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.#O=createVercelStatusTracker(e),t.probeMcpConnection!==void 0&&(this.#k=createMcpConnectionStatusTracker({onChange:()=>{},probe:t.probeMcpConnection}))}if(t.promptCommandHandler!==void 0&&(this.#h=t.promptCommandHandler),this.#g=t.availablePromptCommands??PROMPT_COMMANDS,t.remote!==void 0){if(this.#t===void 0)throw Error(`A remote TUI requires a configured development client.`);this.#v=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.#y=t.bootDetections??BOOT_DETECTIONS,this.#b=t.getVercelAuthStatus??getVercelAuthStatus,this.#x=t.inspectApplication??inspectApplication,t.onBootProgress!==void 0&&(this.#S=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#B(){if(this.#f===void 0){this.#H(),await this.#ee(void 0);return}let e;if(this.#v!==void 0){let t=await this.#v.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.#S);n.kind===`ready`&&(e=n.info)}catch{e=void 0}}this.#H();let t=this.#V(e);await this.#ee(t)}#V(e){let t=this.#p===void 0?e:normalizeLocalModelEndpoint(e,process.env);this.#j=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.#A),this.#n.renderAgentHeader?.(r),t}#H(){let e=this.#S;this.#S=void 0,e?.({type:`before-first-paint`})}async run(){let onStop=()=>this.#n.requestInterrupt?.();this.#z?.signal.aborted===!0?onStop():this.#z?.signal.addEventListener(`abort`,onStop,{once:!0});try{await this.#U()}finally{this.#z?.signal.removeEventListener(`abort`,onStop),this.#C=!0,this.#w.abort(),this.#P.abortAll(),this.#R?.(),this.#R=void 0,this.#n.shutdown?.(),this.#O?.dispose(),this.#k?.dispose(),this.#v?.dispose()}}async#U(){let e=this.#r,r,i,a=!1,o=!1,s=!1,l=this.#m;await this.#B(),this.#v?.current().connection.state===`auth-required`&&await this.#le({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`}),this.#ie(),this.#O?.refreshIdentity(),this.#k?.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.#h!==void 0&&this.#n.setupFlow!==void 0&&(l=void 0,await this.#ue(e));;){if(this.#z?.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.#J(t)}catch(e){if(isInterruptedError(e)){if(this.#N===void 0)return;s=!0,r=``}else throw e}if(r==null&&this.#N===void 0)return}let u=this.#N===void 0?parsePromptCommand(r):null;if(u?.type===`exit`){this.#z?.requestStop();return}if(u?.type===`cancel`){if(this.#e===void 0){this.#ae(`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.#ae(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.#ae(`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.#K()){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.#ae(`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.#ae(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.#ae(`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.#ae(`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.#ae(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.#ae(`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.#ae(formatPromptCommandHelp(this.#g)),i=void 0,s=!1,r=void 0;continue}if(u?.type===`info`){await this.#pe(),i=void 0,s=!1,r=void 0;continue}if(u?.type===`loglevel`){this.#ae(this.#me(u.argument)),i=void 0,s=!1,r=void 0;continue}if(u?.type===`traces`){await this.#fe(u.argument),i=void 0,s=!1,r=void 0;continue}if(u?.type===`extension`){try{await this.#le(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.#N;this.#N=void 0;let d=u??(o?this.#Q():await(async()=>(this.#G(),await this.#X({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.#M.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.#M.delete(t.requestId)}}if(a.length===0)break;s=!0,i=a,r=void 0,m=!0;break}if(this.#ye(d)){d=this.#Q(),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.#L!==this.#e&&(h===`session.waiting`||h===`session.completed`)&&(r=this.#n.takeQueuedPrompt?.()),this.#G(d.turnState?.aborted===!0)}}#W(){this.#P.abortAll(),this.#M.clear(),this.#F.clear(),this.#I.clear(),this.#n.setConnectionAuthPendingCount?.(0),this.#e=void 0,this.#d?.clear()}#G(e=!1){let t=this.#L;t!==void 0&&(this.#L=void 0,this.#e===t&&(this.#W(),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#K(){if(this.#e===void 0)return this.#W(),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.#W(),this.#n.reset?.(),!0}async#q(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.#_e()});let e=this.#j?.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.#ge();e!==void 0&&this.#V(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#J(e){let t=this.#q(e);if(this.#n.renderIdleStream===void 0||this.#e?.state.sessionId===void 0)return await t;let n=new AbortController,r=this.#Y(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#Y(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.#$(a,()=>{},n);if(await this.#n.renderIdleStream(o,{...t,continueSession:!0}),this.#ye(o),(o.turnState?.pendingApprovals.length??0)>0||(o.turnState?.pendingQuestions.length??0)>0){this.#N={events:(async function*(){})(),turnState:o.turnState},this.#n.suspendPromptForInput?.();return}if(!i)return}}finally{await r.return?.()}}async#X(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.#_e()}),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.#v?.reportFailure(e),this.#L=i,{events:errorOnlyTUIStream({errorText:this.#u(e)}),turnState:createTurnState()}}return this.#$(r,()=>t.abort(),this.#e)}async#Z(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}}}#Q(){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.#$(t.stream({signal:e.signal}),()=>e.abort(),t)}#$(e,t,n){let r=createTurnState();return{abort:()=>{r.aborted=!0,this.#L=n,t()},cancel:()=>{this.#Z(r,n)},events:eveEventsToTUIStream({events:e,pendingInputRequests:this.#M,turnState:r,onSubagentCalled:e=>this.#P.begin(e),onSubagentBackgrounded:e=>this.#P.background(e),onSubagentCompleted:e=>this.#P.settle(e),onTurnCancelled:e=>this.#P.settleCancelledTurn(e),onConnectionAuthRequired:e=>this.#ve(e),onConnectionAuthCompleted:e=>this.#be(e),onTerminalFailure:()=>{this.#L=n},failureHintOverride:this.#p===void 0?void 0:localFailureHint}),turnState:r}}async#ee(e){if(this.#p===void 0)return;let t={appRoot:this.#p,env:process.env};e!==void 0&&(t.info=e),this.#E=await detectSetupIssues(t,this.#y),this.#n.renderSetupWarning!==void 0&&(this.#te(),this.#ne())}#te(){let e=orderedSetupIssues(this.#E,this.#D);e.length>0?this.#n.renderSetupWarning?.(formatSetupIssuesLine(e)):this.#n.clearSetupWarning?.()}async#ne(){let e=this.#p;if(e===void 0)return;let t;try{t=await this.#b(e,{signal:this.#w.signal})}catch{return}this.#C||this.#T||(this.#D=authIssueForStatus(t),this.#te())}async#re(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.#E=await detectSetupIssues(n,this.#y);let e=await this.#b(t,{signal:this.#w.signal});this.#D=authIssueForStatus(e)}catch{return}this.#C||this.#te()}#ie(){this.#p===void 0||this.#n.renderSandboxLog===void 0||this.#R===void 0&&(this.#R=subscribeDevelopmentSandboxPrewarmLogs({appRoot:this.#p,log:e=>this.#n.renderSandboxLog?.(e)}))}#ae(e,t){if(e!==void 0){if(this.#n.renderCommandResult!==void 0){this.#n.renderCommandResult(e,t);return}this.#n.renderNotice?.(e)}}async#oe(e,t){let n=this.#h;if(n===void 0)return{message:`/${e.name} is not available in this session.`};let r=this.#j?.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.#v,withExclusiveTerminal:this.#_},a=this.#k?.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)}#se(e,t){if(t!==`startup`)return;let n=this.#v?.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#ce(e){if(e?.kind===`model-access-changed`){this.#O?.applyEffect({kind:`refresh-identity`}),this.#T=!0,await this.#he();return}e!==void 0&&(this.#O?.applyEffect(e),this.#T=!0,this.#re(this.#j))}async#le(e,t,n){let r=await this.#oe(e,{initialModelStep:n.initialModelStep,keepSetupFlowOpen:n.keepSetupFlowOpen,title:t});this.#se(e,n.trigger),this.#ae(r?.message,r?.tone),await this.#ce(r?.effect),this.#de()}async#ue(e){let t=this.#p;if(t===void 0)return;let authStatus=async()=>{try{return await this.#b(t,{signal:this.#w.signal})}catch{return}},n=await authStatus();if(n===`cli-missing`&&(await this.#le({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.#le({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.#le({type:`extension`,name:`model`,argument:``},e,{trigger:`startup`,initialModelStep:`provider`}),await this.#le({type:`extension`,name:`add`,argument:``},e,{trigger:`startup`})}#de(){let e=this.#v?.current().connection;e?.state!==`ready`||e.info===this.#j||(this.#j=e.info,this.#f!==void 0&&this.#n.renderAgentHeader?.({info:e.info,name:this.#r,serverUrl:this.#f}))}async#fe(e){if(this.#p===void 0||this.#n.traceViewer===void 0){this.#ae(`/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#pe(){let e=this.#p;if(e===void 0){this.#ae(`/info is only available in local dev sessions.`);return}try{this.#ae(renderApplicationInfo(await this.#x(e)))}catch(e){this.#ae(`Couldn't inspect the application: ${toErrorMessage(e)}`,`error`)}}#me(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#he(){let e=this.#p;if(e===void 0)return;loadDevelopmentEnvironmentFiles(e),await this.#d?.refreshAfterSourceChange({});let t=this.#V(await this.#ge());this.#re(t)}async#ge(){let e=this.#t;if(e===void 0)return;let t=await probeAgentInfo({client:e});return t.kind===`ready`?t.info:void 0}async#_e(){let e=this.#j,t=await this.#ge();t!==void 0&&this.#V(t),(!this.#n.renderAgentHeader||t===void 0)&&this.#n.renderNotice?.(formatAgentUpdateNotice(e,t))}#ve(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.#F.set(e.data.name,t),this.#xe(t)}#ye(e){if(e.turnState?.boundaryEvent!==`session.waiting`)return!1;let t=!1;for(let e of this.#F.values())e.state!==`required`||e.webhookUrl===void 0||(e.state=`pending`,this.#I.add(e.name),this.#xe(e),t=!0);return t&&this.#n.setConnectionAuthPendingCount?.(this.#I.size),this.#I.size>0}#be(e){let t=this.#F.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.#F.set(e.data.name,t),this.#I.delete(e.data.name),this.#xe(t),this.#n.setConnectionAuthPendingCount?.(this.#I.size)}#xe(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=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};
@@ -64,6 +64,12 @@ export declare class TerminalRenderer implements AgentTUIRenderer {
64
64
  * Committed scrollback is never cleared or replayed.
65
65
  */
66
66
  renderAgentHeader(options: AgentHeaderOptions): void;
67
+ beginStartupDraft(options: {
68
+ initialDraft?: string;
69
+ tip: string;
70
+ title: string;
71
+ }): void;
72
+ finishStartupDraft(): string;
67
73
  readPrompt(options?: AgentTUISessionOptions): Promise<string>;
68
74
  /**
69
75
  * Consumes the next prompt produced by mid-turn input — the staged Esc