eve 0.29.2 → 0.29.4

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 (356) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/src/acp/adapter.d.ts +43 -0
  3. package/dist/src/acp/adapter.js +1 -0
  4. package/dist/src/acp/line-limit.d.ts +3 -0
  5. package/dist/src/acp/line-limit.js +1 -0
  6. package/dist/src/acp/server.d.ts +24 -0
  7. package/dist/src/acp/server.js +1 -0
  8. package/dist/src/channel/types.d.ts +15 -0
  9. package/dist/src/chunks/{use-eve-agent-DaH3cf8K.js → use-eve-agent-8mofdZcO.js} +45 -10
  10. package/dist/src/chunks/{use-eve-agent-CyDt3Lny.js → use-eve-agent-bKJbH0k4.js} +45 -10
  11. package/dist/src/cli/acp/command.d.ts +22 -0
  12. package/dist/src/cli/acp/command.js +4 -0
  13. package/dist/src/cli/commands/agent-prompt/build-and-verify.md +4 -0
  14. package/dist/src/cli/commands/extension-init.js +1 -1
  15. package/dist/src/cli/commands/init-git.js +1 -1
  16. package/dist/src/cli/commands/init-repl.js +1 -1
  17. package/dist/src/cli/commands/init.js +1 -1
  18. package/dist/src/cli/commands/integration-setup.d.ts +3 -7
  19. package/dist/src/cli/commands/integration-setup.js +1 -1
  20. package/dist/src/cli/commands/logs.js +2 -2
  21. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  22. package/dist/src/cli/commands/register-registry-commands.js +1 -1
  23. package/dist/src/cli/commands/registry-project.js +1 -1
  24. package/dist/src/cli/commands/registry-setup-command.js +1 -1
  25. package/dist/src/cli/commands/registry.d.ts +15 -2
  26. package/dist/src/cli/commands/registry.js +1 -1
  27. package/dist/src/cli/commands/trace.d.ts +6 -23
  28. package/dist/src/cli/commands/trace.js +7 -5
  29. package/dist/src/cli/dev/command-options.d.ts +22 -0
  30. package/dist/src/cli/dev/diagnostic-dump.js +1 -1
  31. package/dist/src/cli/dev/diagnostic-sink.js +1 -1
  32. package/dist/src/cli/dev/local-server-cleanup.js +1 -1
  33. package/dist/src/cli/dev/local-server-process.js +1 -1
  34. package/dist/src/cli/dev/tui/blocks.js +1 -1
  35. package/dist/src/cli/dev/tui/clipboard.d.ts +17 -0
  36. package/dist/src/cli/dev/tui/clipboard.js +1 -0
  37. package/dist/src/cli/dev/tui/command-typeahead.js +1 -1
  38. package/dist/src/cli/dev/tui/prompt-commands.d.ts +3 -0
  39. package/dist/src/cli/dev/tui/prompt-commands.js +1 -1
  40. package/dist/src/cli/dev/tui/remote-auth.d.ts +6 -3
  41. package/dist/src/cli/dev/tui/remote-auth.js +1 -1
  42. package/dist/src/cli/dev/tui/remote-connection-probe.js +1 -1
  43. package/dist/src/cli/dev/tui/runner.d.ts +6 -0
  44. package/dist/src/cli/dev/tui/runner.js +1 -1
  45. package/dist/src/cli/dev/tui/stream-format.d.ts +22 -0
  46. package/dist/src/cli/dev/tui/stream-format.js +2 -2
  47. package/dist/src/cli/dev/tui/terminal-background.d.ts +23 -0
  48. package/dist/src/cli/dev/tui/terminal-background.js +1 -0
  49. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +3 -0
  50. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  51. package/dist/src/cli/dev/tui/test/mock-terminal.js +3 -3
  52. package/dist/src/cli/dev/tui/traces/trace-content.d.ts +35 -0
  53. package/dist/src/cli/dev/tui/traces/trace-content.js +2 -0
  54. package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +63 -0
  55. package/dist/src/cli/dev/tui/traces/trace-conversation.js +2 -0
  56. package/dist/src/cli/dev/tui/traces/trace-store.d.ts +27 -0
  57. package/dist/src/cli/dev/tui/traces/trace-store.js +1 -0
  58. package/dist/src/cli/dev/tui/traces/trace-surfaces.d.ts +40 -0
  59. package/dist/src/cli/dev/tui/traces/trace-surfaces.js +1 -0
  60. package/dist/src/cli/dev/tui/traces/trace-view.d.ts +55 -0
  61. package/dist/src/cli/dev/tui/traces/trace-view.js +2 -0
  62. package/dist/src/cli/dev/tui/traces/trace-viewer-session.d.ts +54 -0
  63. package/dist/src/cli/dev/tui/traces/trace-viewer-session.js +1 -0
  64. package/dist/src/cli/dev/tui/traces/trace-viewer-state.d.ts +110 -0
  65. package/dist/src/cli/dev/tui/traces/trace-viewer-state.js +1 -0
  66. package/dist/src/cli/dev/tui/tui.js +1 -1
  67. package/dist/src/cli/invoke/invoke.js +1 -1
  68. package/dist/src/cli/invoke/result.js +1 -1
  69. package/dist/src/cli/run.d.ts +3 -0
  70. package/dist/src/cli/run.js +3 -3
  71. package/dist/src/cli/ui/alt-screen.d.ts +42 -0
  72. package/dist/src/cli/ui/alt-screen.js +1 -0
  73. package/dist/src/cli/ui/terminal-text.d.ts +4 -3
  74. package/dist/src/cli/ui/terminal-text.js +1 -1
  75. package/dist/src/client/index.d.ts +1 -1
  76. package/dist/src/client/open-stream.js +1 -1
  77. package/dist/src/client/session.d.ts +15 -1
  78. package/dist/src/client/session.js +1 -1
  79. package/dist/src/client/types.d.ts +9 -0
  80. package/dist/src/compiled/.vendor-stamp.json +3 -1
  81. package/dist/src/compiled/@agentclientprotocol/sdk/LICENSE +191 -0
  82. package/dist/src/compiled/@agentclientprotocol/sdk/index.d.ts +1835 -0
  83. package/dist/src/compiled/@agentclientprotocol/sdk/index.js +65 -0
  84. package/dist/src/compiled/@agentclientprotocol/sdk/jsonrpc.d.ts +603 -0
  85. package/dist/src/compiled/@agentclientprotocol/sdk/schema/guards.gen.d.ts +199 -0
  86. package/dist/src/compiled/@agentclientprotocol/sdk/schema/index.d.ts +51 -0
  87. package/dist/src/compiled/@agentclientprotocol/sdk/schema/types.gen.d.ts +6118 -0
  88. package/dist/src/compiled/@agentclientprotocol/sdk/stream.d.ts +35 -0
  89. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/LICENSE +21 -0
  90. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/_spectrum-core.d.ts +3 -0
  91. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/_spectrum-imessage.d.ts +2 -0
  92. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/index.d.ts +496 -0
  93. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/index.js +137 -0
  94. package/dist/src/compiled/@vercel/sandbox/index.js +13 -107
  95. package/dist/src/compiled/_chunks/node/auth-BS3UoyvT.js +2 -0
  96. package/dist/src/compiled/_chunks/node/compat-Dm2n85Mx.js +1 -0
  97. package/dist/src/compiled/_chunks/node/schemas-DtQwuPdM.js +65 -0
  98. package/dist/src/compiled/_chunks/node/undici-DWL_MYmT.js +95 -0
  99. package/dist/src/compiled/_chunks/node/version-Cztrk7z6.js +1 -0
  100. package/dist/src/compiled/shadcn-registry/index.js +461 -893
  101. package/dist/src/compiler/artifacts.js +1 -1
  102. package/dist/src/compiler/extension-compatibility.js +1 -1
  103. package/dist/src/compiler/model-catalog.js +1 -1
  104. package/dist/src/compiler/normalize-sandbox.js +1 -1
  105. package/dist/src/compiler/workspace-resources.js +1 -1
  106. package/dist/src/context/keys.d.ts +3 -1
  107. package/dist/src/context/keys.js +1 -1
  108. package/dist/src/discover/project-source.js +1 -1
  109. package/dist/src/evals/cli/eval.js +2 -2
  110. package/dist/src/evals/loaders/json.js +1 -1
  111. package/dist/src/evals/loaders/yaml.js +1 -1
  112. package/dist/src/evals/runner/artifacts.js +1 -1
  113. package/dist/src/evals/runner/discover.js +1 -1
  114. package/dist/src/evals/runner/reporters/junit.js +1 -1
  115. package/dist/src/evals/session.js +1 -1
  116. package/dist/src/execution/delegated-parent-notification.js +1 -1
  117. package/dist/src/execution/delegated-parent-result.js +1 -1
  118. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  119. package/dist/src/execution/runtime-context.js +1 -1
  120. package/dist/src/execution/sandbox/bindings/docker-cli.js +1 -1
  121. package/dist/src/execution/sandbox/bindings/docker-templates.js +1 -1
  122. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  123. package/dist/src/execution/sandbox/bindings/just-bash.js +1 -1
  124. package/dist/src/execution/sandbox/bindings/local-backend-utils.js +1 -1
  125. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -1
  126. package/dist/src/execution/sandbox/bindings/microsandbox-metadata.js +1 -1
  127. package/dist/src/execution/sandbox/bindings/microsandbox-platform.js +1 -1
  128. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
  129. package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +1 -1
  130. package/dist/src/execution/sandbox/development-cleanup.js +1 -1
  131. package/dist/src/execution/sandbox/glob-tool.js +3 -3
  132. package/dist/src/execution/sandbox/grep-tool.js +1 -1
  133. package/dist/src/execution/sandbox/read-file-tool.js +3 -3
  134. package/dist/src/execution/sandbox/require-sandbox.d.ts +3 -3
  135. package/dist/src/execution/sandbox/require-sandbox.js +1 -1
  136. package/dist/src/execution/sandbox/template-prewarm-lock.js +1 -1
  137. package/dist/src/execution/sandbox/write-file-tool.js +1 -1
  138. package/dist/src/execution/subagent-adapter-state.d.ts +39 -0
  139. package/dist/src/execution/subagent-adapter-state.js +1 -0
  140. package/dist/src/execution/subagent-adapter.d.ts +0 -34
  141. package/dist/src/execution/subagent-adapter.js +1 -1
  142. package/dist/src/execution/subagent-tool.d.ts +2 -1
  143. package/dist/src/execution/subagent-tool.js +1 -1
  144. package/dist/src/execution/workflow-steps.js +1 -1
  145. package/dist/src/harness/attachment-staging.js +1 -1
  146. package/dist/src/harness/instrumentation-lifecycle.d.ts +18 -0
  147. package/dist/src/harness/instrumentation-native-events.d.ts +3 -1
  148. package/dist/src/harness/instrumentation-native-events.js +1 -1
  149. package/dist/src/harness/parent-lineage.d.ts +11 -0
  150. package/dist/src/harness/parent-lineage.js +1 -0
  151. package/dist/src/harness/tool-loop.js +2 -2
  152. package/dist/src/internal/application/build-profile.js +1 -1
  153. package/dist/src/internal/application/build-workspace.js +1 -1
  154. package/dist/src/internal/application/cache-metadata.js +1 -1
  155. package/dist/src/internal/application/compiled-artifacts.js +8 -8
  156. package/dist/src/internal/application/optional-package-install.js +2 -2
  157. package/dist/src/internal/application/output-publication-artifacts.js +1 -1
  158. package/dist/src/internal/application/output-publication-journal.js +1 -1
  159. package/dist/src/internal/application/output-publication-lock.js +1 -1
  160. package/dist/src/internal/application/output-publication.js +1 -1
  161. package/dist/src/internal/application/package.js +1 -1
  162. package/dist/src/internal/application/paths.js +1 -1
  163. package/dist/src/internal/application/production-compiler-artifacts.js +1 -1
  164. package/dist/src/internal/application/tsconfig-dependencies.js +1 -1
  165. package/dist/src/internal/authored-asset-import-plugin.js +1 -1
  166. package/dist/src/internal/authored-module-loader.js +3 -3
  167. package/dist/src/internal/authored-package-tsconfig-paths.js +1 -1
  168. package/dist/src/internal/materialized-authored-modules.js +1 -1
  169. package/dist/src/internal/nitro/dev-runtime-artifacts-retention.js +1 -1
  170. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  171. package/dist/src/internal/nitro/dev-runtime-source-snapshot-copy.js +1 -1
  172. package/dist/src/internal/nitro/dev-runtime-source-snapshot.js +1 -1
  173. package/dist/src/internal/nitro/host/build-application.js +1 -1
  174. package/dist/src/internal/nitro/host/build-extension.js +1 -1
  175. package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -1
  176. package/dist/src/internal/nitro/host/configure-nitro-routes.js +3 -3
  177. package/dist/src/internal/nitro/host/copy-host-middleware.js +1 -1
  178. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  179. package/dist/src/internal/nitro/host/cron-handler-route.js +1 -1
  180. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.js +1 -1
  181. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  182. package/dist/src/internal/nitro/host/dev-host-fingerprint.js +1 -1
  183. package/dist/src/internal/nitro/host/dev-host-workspace.js +1 -1
  184. package/dist/src/internal/nitro/host/dev-server-http.js +1 -1
  185. package/dist/src/internal/nitro/host/dev-server-state.js +1 -1
  186. package/dist/src/internal/nitro/host/dev-workspace-extensions.js +1 -1
  187. package/dist/src/internal/nitro/host/extension-build-config.js +1 -1
  188. package/dist/src/internal/nitro/host/extension-declarations.js +2 -2
  189. package/dist/src/internal/nitro/host/extension-distribution.js +3 -3
  190. package/dist/src/internal/nitro/host/extension-state-usage.js +1 -1
  191. package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.js +1 -1
  192. package/dist/src/internal/nitro/host/normalize-vercel-service-crons.js +1 -1
  193. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  194. package/dist/src/internal/nitro/host/start-production-server.js +2 -2
  195. package/dist/src/internal/nitro/host/types.d.ts +2 -0
  196. package/dist/src/internal/vercel/project-link.js +1 -1
  197. package/dist/src/internal/workflow/development-world-client.js +1 -1
  198. package/dist/src/internal/workflow-bundle/builder-support.js +6 -6
  199. package/dist/src/internal/workflow-bundle/builder.js +3 -3
  200. package/dist/src/internal/workflow-bundle/nitro-step-entry.js +2 -2
  201. package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
  202. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  203. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  204. package/dist/src/public/channels/chat-sdk/chatSdkChannel.d.ts +7 -0
  205. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +2 -2
  206. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  207. package/dist/src/public/channels/discord/verify.js +1 -1
  208. package/dist/src/public/channels/github/auth.js +2 -2
  209. package/dist/src/public/channels/github/githubChannel.js +1 -1
  210. package/dist/src/public/channels/github/verify.js +1 -1
  211. package/dist/src/public/channels/linear/inbound.js +2 -2
  212. package/dist/src/public/channels/linear/linearChannel.js +1 -1
  213. package/dist/src/public/channels/linear/verify.js +1 -1
  214. package/dist/src/public/channels/photon/inboundContent.d.ts +4 -0
  215. package/dist/src/public/channels/photon/inboundContent.js +1 -0
  216. package/dist/src/public/channels/photon/index.d.ts +1 -0
  217. package/dist/src/public/channels/photon/index.js +1 -0
  218. package/dist/src/public/channels/photon/photonIMessageChannel.d.ts +54 -0
  219. package/dist/src/public/channels/photon/photonIMessageChannel.js +1 -0
  220. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  221. package/dist/src/public/channels/telegram/verify.js +1 -1
  222. package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
  223. package/dist/src/public/models/openai/chatgpt/auth.js +1 -1
  224. package/dist/src/public/next/server.js +2 -2
  225. package/dist/src/public/next/vercel-output-config.js +1 -1
  226. package/dist/src/public/nuxt/dev-server.js +1 -1
  227. package/dist/src/public/nuxt/vercel-services.js +1 -1
  228. package/dist/src/public/sveltekit/dev-server.js +1 -1
  229. package/dist/src/public/sveltekit/vercel-json.js +1 -1
  230. package/dist/src/runtime/channels/registry.js +1 -1
  231. package/dist/src/runtime/framework-tools/file-state.js +1 -1
  232. package/dist/src/runtime/framework-tools/glob.js +1 -1
  233. package/dist/src/runtime/framework-tools/grep.js +1 -1
  234. package/dist/src/runtime/framework-tools/read-file.js +1 -1
  235. package/dist/src/runtime/framework-tools/write-file.js +1 -1
  236. package/dist/src/runtime/sandbox/keys.js +1 -1
  237. package/dist/src/runtime/workspace/seed-files.js +1 -1
  238. package/dist/src/setup/boxes/detect-ai-gateway.js +1 -1
  239. package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
  240. package/dist/src/setup/connect-provisioning.d.ts +32 -0
  241. package/dist/src/setup/connect-provisioning.js +1 -0
  242. package/dist/src/setup/flows/login.js +1 -1
  243. package/dist/src/setup/flows/registry.js +1 -1
  244. package/dist/src/setup/index.d.ts +1 -0
  245. package/dist/src/setup/index.js +1 -1
  246. package/dist/src/setup/integrations/discord/api.d.ts +15 -0
  247. package/dist/src/setup/integrations/discord/api.js +1 -0
  248. package/dist/src/setup/integrations/discord/connect.d.ts +24 -0
  249. package/dist/src/setup/integrations/discord/connect.js +1 -0
  250. package/dist/src/setup/integrations/discord/setup.d.ts +19 -0
  251. package/dist/src/setup/integrations/discord/setup.js +8 -0
  252. package/dist/src/setup/integrations/photon/connect.d.ts +40 -0
  253. package/dist/src/setup/integrations/photon/connect.js +1 -0
  254. package/dist/src/setup/integrations/photon/management.d.ts +34 -0
  255. package/dist/src/setup/integrations/photon/management.js +1 -0
  256. package/dist/src/setup/integrations/photon/setup-flow.d.ts +39 -0
  257. package/dist/src/setup/integrations/photon/setup-flow.js +20 -0
  258. package/dist/src/setup/integrations/photon/setup.d.ts +3 -0
  259. package/dist/src/setup/integrations/photon/setup.js +1 -0
  260. package/dist/src/setup/integrations/registry.d.ts +6 -0
  261. package/dist/src/setup/integrations/registry.js +1 -0
  262. package/dist/src/setup/integrations/runner.d.ts +25 -0
  263. package/dist/src/setup/integrations/runner.js +1 -0
  264. package/dist/src/setup/integrations/{channels → shared}/environment.d.ts +3 -3
  265. package/dist/src/setup/integrations/shared/environment.js +1 -0
  266. package/dist/src/setup/integrations/shared/scaffold.d.ts +19 -0
  267. package/dist/src/setup/integrations/shared/scaffold.js +1 -0
  268. package/dist/src/setup/integrations/{channels → shared}/ui.d.ts +3 -3
  269. package/dist/src/setup/integrations/shared/ui.js +2 -0
  270. package/dist/src/setup/integrations/slack/setup.d.ts +16 -0
  271. package/dist/src/setup/integrations/slack/setup.js +1 -0
  272. package/dist/src/setup/integrations/types.d.ts +26 -0
  273. package/dist/src/setup/integrations/types.js +1 -0
  274. package/dist/src/setup/integrations/web/setup.d.ts +3 -0
  275. package/dist/src/setup/integrations/web/setup.js +1 -0
  276. package/dist/src/setup/package-manager.js +1 -1
  277. package/dist/src/setup/primitives/pm/pnpm.js +3 -3
  278. package/dist/src/setup/primitives/run-vercel.d.ts +2 -7
  279. package/dist/src/setup/primitives/run-vercel.js +1 -1
  280. package/dist/src/setup/project-resolution.js +1 -1
  281. package/dist/src/setup/prompter.js +1 -1
  282. package/dist/src/setup/registry-setup-client.d.ts +6 -2
  283. package/dist/src/setup/registry-setup-client.js +1 -1
  284. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  285. package/dist/src/setup/scaffold/create/extension.js +1 -1
  286. package/dist/src/setup/scaffold/create/project.js +3 -10
  287. package/dist/src/setup/scaffold/files.js +1 -1
  288. package/dist/src/setup/scaffold/update/channels.js +2 -2
  289. package/dist/src/setup/scaffold/update/connections.js +1 -1
  290. package/dist/src/setup/scaffold/workspace-root.js +1 -1
  291. package/dist/src/setup/slack-connect-lifecycle.d.ts +2 -8
  292. package/dist/src/setup/slack-connect-lifecycle.js +1 -1
  293. package/dist/src/setup/state.d.ts +0 -12
  294. package/dist/src/setup/state.js +1 -1
  295. package/dist/src/setup/vercel-project-framework.js +1 -1
  296. package/dist/src/shared/guards.d.ts +2 -0
  297. package/dist/src/shared/guards.js +1 -1
  298. package/dist/src/shared/skill-package.js +1 -1
  299. package/dist/src/shared/skill-paths.d.ts +14 -4
  300. package/dist/src/shared/skill-paths.js +2 -2
  301. package/dist/src/shared/vercel-output-directory.js +1 -1
  302. package/dist/src/source-change/static-source-change.js +1 -1
  303. package/dist/src/svelte/index.js +1 -1
  304. package/dist/src/svelte/use-eve-agent.js +1 -1
  305. package/dist/src/tracing/agent-otel-content.d.ts +32 -0
  306. package/dist/src/tracing/agent-otel-content.js +4 -0
  307. package/dist/src/{harness → tracing}/agent-otel-provider.d.ts +10 -1
  308. package/dist/src/tracing/agent-otel-provider.js +2 -0
  309. package/dist/src/{harness → tracing}/agent-trace-context-store.d.ts +8 -1
  310. package/dist/src/tracing/agent-trace-context-store.js +1 -0
  311. package/dist/src/{harness → tracing}/agent-trace-span-processor.d.ts +5 -1
  312. package/dist/src/tracing/agent-trace-span-processor.js +1 -0
  313. package/dist/src/tracing/local-instrumentation-runtime.js +1 -0
  314. package/dist/src/tracing/local-trace-reader.d.ts +74 -0
  315. package/dist/src/tracing/local-trace-reader.js +1 -0
  316. package/dist/src/{harness → tracing}/local-trace-retention.js +1 -1
  317. package/dist/src/{harness → tracing}/local-trace-span-processor.js +1 -1
  318. package/dist/src/vue/index.js +1 -1
  319. package/dist/src/vue/use-eve-agent.js +1 -1
  320. package/docs/channels/chat-sdk.mdx +18 -1
  321. package/docs/channels/discord.mdx +30 -14
  322. package/docs/channels/meta.json +1 -0
  323. package/docs/channels/overview.mdx +1 -1
  324. package/docs/channels/photon.mdx +78 -0
  325. package/docs/concepts/default-harness.md +2 -0
  326. package/docs/guides/acp.md +91 -0
  327. package/docs/guides/client/streaming.mdx +24 -0
  328. package/docs/guides/dev-tui.md +20 -1
  329. package/docs/guides/instrumentation.md +8 -7
  330. package/docs/guides/meta.json +1 -0
  331. package/docs/reference/cli.md +12 -1
  332. package/docs/sandbox.mdx +1 -1
  333. package/package.json +8 -1
  334. package/dist/src/compiled/_chunks/node/auth-DMsLOrh7.js +0 -2
  335. package/dist/src/compiled/_chunks/node/version-BQBAL95V.js +0 -64
  336. package/dist/src/harness/agent-otel-provider.js +0 -1
  337. package/dist/src/harness/agent-trace-context-store.js +0 -1
  338. package/dist/src/harness/agent-trace-span-processor.js +0 -1
  339. package/dist/src/harness/local-instrumentation-runtime.js +0 -1
  340. package/dist/src/setup/integrations/channels/environment.js +0 -1
  341. package/dist/src/setup/integrations/channels/index.d.ts +0 -7
  342. package/dist/src/setup/integrations/channels/index.js +0 -1
  343. package/dist/src/setup/integrations/channels/runner.d.ts +0 -7
  344. package/dist/src/setup/integrations/channels/runner.js +0 -1
  345. package/dist/src/setup/integrations/channels/setup.d.ts +0 -130
  346. package/dist/src/setup/integrations/channels/setup.js +0 -2
  347. package/dist/src/setup/integrations/channels/slack.d.ts +0 -3
  348. package/dist/src/setup/integrations/channels/slack.js +0 -1
  349. package/dist/src/setup/integrations/channels/types.d.ts +0 -49
  350. package/dist/src/setup/integrations/channels/ui.js +0 -2
  351. package/dist/src/setup/integrations/channels/web.d.ts +0 -3
  352. package/dist/src/setup/integrations/channels/web.js +0 -1
  353. /package/dist/src/{setup/integrations/channels/types.js → cli/dev/command-options.js} +0 -0
  354. /package/dist/src/{harness → tracing}/local-instrumentation-runtime.d.ts +0 -0
  355. /package/dist/src/{harness → tracing}/local-trace-retention.d.ts +0 -0
  356. /package/dist/src/{harness → tracing}/local-trace-span-processor.d.ts +0 -0
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Live reader over the local trace spool for the `/traces` viewer.
3
+ *
4
+ * The spool's segments are immutable — one file per span, written atomically,
5
+ * never rewritten — so reads cache parsed spans by span id and only parse
6
+ * files that appeared since the last poll. Listing stats directories instead
7
+ * of parsing spans, keeping a 1s poll cheap even with a large spool.
8
+ */
9
+ import type { LocalTrace } from "#tracing/local-trace-reader.js";
10
+ export interface TraceStoreEntry {
11
+ readonly traceId: string;
12
+ /** Mtime of the trace's segments directory — the instant it last received a span. */
13
+ readonly lastActivityMs: number;
14
+ }
15
+ export interface TraceStore {
16
+ /** Lists stored traces, most recent activity first. */
17
+ list(): Promise<readonly TraceStoreEntry[]>;
18
+ /**
19
+ * Reads one trace, parsing only segments not seen by earlier reads.
20
+ * Returns `undefined` when the trace is missing or has no valid spans
21
+ * (e.g. retention pruned it between list and read).
22
+ */
23
+ read(traceId: string): Promise<LocalTrace | undefined>;
24
+ }
25
+ export declare function createTraceStore(options: {
26
+ readonly appRoot: string;
27
+ }): TraceStore;
@@ -0,0 +1 @@
1
+ import{assembleLocalTrace,listLocalTraceIds,listLocalTraceSegments,readLocalTraceActivityMs,readLocalTraceSegment}from"#tracing/local-trace-reader.js";function createTraceStore(i){let a=new Map;return{async list(){let e=[];for(let n of await listLocalTraceIds(i.appRoot)){let t=await readLocalTraceActivityMs(i.appRoot,n);t!==void 0&&e.push({traceId:n,lastActivityMs:t})}return e.sort((e,t)=>t.lastActivityMs===e.lastActivityMs?e.traceId.localeCompare(t.traceId):t.lastActivityMs-e.lastActivityMs)},async read(t){let r=await listLocalTraceSegments(i.appRoot,t);if(r===void 0){a.delete(t);return}let o=a.get(t);o===void 0&&(o={seen:new Set,spans:new Map},a.set(t,o));let s=!1;for(let e of r)if(!o.seen.has(e)){o.seen.add(e);for(let n of await readLocalTraceSegment(i.appRoot,t,e))o.spans.has(n.spanId)||(o.spans.set(n.spanId,n),s=!0)}if(o.spans.size!==0)return(s||o.assembled===void 0)&&(o.assembled=assembleLocalTrace(t,[...o.spans.values()])),o.assembled}}}export{createTraceStore};
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Card surfaces for the `/traces` viewer, derived from the terminal's own
3
+ * background color (the OSC 11 probe) so they look native in any theme: a
4
+ * dark background gets slightly lighter bands, a light background slightly
5
+ * darker ones, and error bands blend toward red from either side. When the
6
+ * terminal never answers the probe, the viewer falls back to gutter rails.
7
+ */
8
+ import type { RgbColor } from "../terminal-background.js";
9
+ /** Truecolor background opens (`ESC[48;2;…m`) for the viewer's card bands. */
10
+ export interface TraceViewerSurfaces {
11
+ /** Card title band. */
12
+ readonly header: string;
13
+ /** Card body band, slightly more elevated than the header. */
14
+ readonly body: string;
15
+ readonly errorHeader: string;
16
+ readonly errorBody: string;
17
+ /**
18
+ * Style for primary text over the surfaces (card titles, selection bar,
19
+ * toast): truecolor white on dark backgrounds, truecolor black on light
20
+ * ones. The theme's fixed bright-white primary assumes a dark terminal
21
+ * and washes out on light backgrounds.
22
+ */
23
+ readonly primaryText: (text: string) => string;
24
+ /**
25
+ * Style for secondary text (control hints, header metadata, drawer
26
+ * labels): a truecolor grey blended from the probed background toward the
27
+ * primary, so muted text keeps guaranteed contrast on any background.
28
+ */
29
+ readonly mutedText: (text: string) => string;
30
+ }
31
+ /** Closes a surface, restoring the terminal's default background. */
32
+ export declare const SURFACE_CLOSE = "\u001B[49m";
33
+ /**
34
+ * Derives the viewer's card surfaces from the terminal's background color.
35
+ * Everything — bands and text styles alike — is truecolor: palette colors
36
+ * (SGR 30/97) and SGR dim are theme-remappable, so a terminal like ghostty
37
+ * can render them without contrast against the very background it reported.
38
+ * Truecolor is exempt from palette remapping and always lands as derived.
39
+ */
40
+ export declare function deriveTraceViewerSurfaces(background: RgbColor): TraceViewerSurfaces;
@@ -0,0 +1 @@
1
+ const SURFACE_CLOSE=`\x1B[49m`,ERROR_ACCENT={r:230,g:105,b:123},WHITE={r:255,g:255,b:255},BLACK={r:0,g:0,b:0};function deriveTraceViewerSurfaces(e){let r=relativeLuminance(e)<.5?WHITE:BLACK,i=foregroundOpen(r),a=foregroundOpen(mix(e,r,.55));return{header:backgroundOpen(mix(e,r,.086)),body:backgroundOpen(mix(e,r,.141)),errorHeader:backgroundOpen(mix(e,ERROR_ACCENT,.3)),errorBody:backgroundOpen(mix(e,ERROR_ACCENT,.25)),primaryText:e=>`${i}${e}\x1b[39m`,mutedText:e=>`${a}${e}\x1b[39m`}}function backgroundOpen(e){return`\x1b[48;2;${e.r};${e.g};${e.b}m`}function foregroundOpen(e){return`\x1b[38;2;${e.r};${e.g};${e.b}m`}function mix(e,t,n){let blend=(e,t)=>Math.round(e+(t-e)*n);return{r:blend(e.r,t.r),g:blend(e.g,t.g),b:blend(e.b,t.b)}}function relativeLuminance(e){return(.2126*e.r+.7152*e.g+.0722*e.b)/255}export{SURFACE_CLOSE,deriveTraceViewerSurfaces};
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Pure frame renderer for the `/traces` conversation viewer: state in,
3
+ * styled rows out. The layout is a header (trace identity), a body (the
4
+ * conversation cards, plus the optional details drawer on the right), and a
5
+ * footer (key hints + position/notice). Every row is clipped to the
6
+ * terminal width so the alt-screen painter can write rows verbatim.
7
+ */
8
+ import type { LocalTraceSpan } from "#tracing/local-trace-reader.js";
9
+ import type { Theme } from "../theme.js";
10
+ import type { TraceViewerSurfaces } from "./trace-surfaces.js";
11
+ import type { TextSelectionRange, TraceViewerState } from "./trace-viewer-state.js";
12
+ export interface TraceViewerFrame {
13
+ readonly rows: readonly string[];
14
+ /** Detail rows the panel has for the selected span — fed back into key handling. */
15
+ readonly panelTotalRows: number;
16
+ /** Body rows available to the conversation. */
17
+ readonly timelineViewportRows: number;
18
+ /** Body rows available to the panel. */
19
+ readonly panelViewportRows: number;
20
+ /** Column width the body renders at (expandability is width-dependent). */
21
+ readonly contentWidth: number;
22
+ }
23
+ export interface RenderTraceViewerOptions {
24
+ readonly width: number;
25
+ readonly height: number;
26
+ readonly theme: Theme;
27
+ /** The viewed trace received spans recently — the window extends to "now". */
28
+ readonly activeWindowEndNs?: bigint;
29
+ /** Tracing is disabled via `EVE_TRACES=off` (empty-state copy). */
30
+ readonly tracingDisabled?: boolean;
31
+ /** Transient confirmation shown in the header's top-right corner. */
32
+ readonly toast?: string;
33
+ /**
34
+ * Card surfaces derived from the terminal's background (OSC 11 probe).
35
+ * Absent when the terminal never answered — cards fall back to rails.
36
+ */
37
+ readonly surfaces?: TraceViewerSurfaces;
38
+ }
39
+ export declare function renderTraceViewer(state: TraceViewerState, options: RenderTraceViewerOptions): TraceViewerFrame;
40
+ export declare function renderSpanDetail(span: LocalTraceSpan, innerWidth: number, theme: Theme, options?: {
41
+ readonly excludeKeys?: ReadonlySet<string>;
42
+ readonly surfaces?: TraceViewerSurfaces;
43
+ }): string[];
44
+ /**
45
+ * Plain text covered by a drag selection over the conversation, extracted
46
+ * from the same rendered lines the user saw.
47
+ */
48
+ export declare function conversationSelectionText(state: TraceViewerState, width: number, theme: Theme, selection: TextSelectionRange, surfaces?: TraceViewerSurfaces): string;
49
+ /**
50
+ * Plain text covered by a drag selection over the details drawer, extracted
51
+ * from the same detail lines the frame painted. `totalWidth` is the full
52
+ * terminal width — the drawer's width derives from it exactly as rendering
53
+ * does, so columns map to the same cells the user selected.
54
+ */
55
+ export declare function panelSelectionText(state: TraceViewerState, totalWidth: number, theme: Theme, selection: TextSelectionRange): string;
@@ -0,0 +1,2 @@
1
+ import{formatAttributeContent}from"./trace-content.js";import{renderConversationItem}from"./trace-conversation.js";import{orderedTextSelection,selectedTraceViewerSpan}from"./trace-viewer-state.js";import{formatElapsed}from"#cli/format-elapsed.js";import{describeLocalTraceSpan}from"#tracing/local-trace-reader.js";import{clipVisible,sliceVisible,stripAnsi,stripTerminalControls,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";function renderTraceViewer(e,t){let{width:n,height:r,theme:i}=t,a=chromeStyles(i,t.surfaces),o=Math.max(1,r-3-3),s=e.panelOpen?panelWidthFor(n):0,c=Math.max(20,n-(s===0?0:s+1)),l=panelDetailLines(e,s,i,t.surfaces),u=o,d=[];if(d.push(...renderHeader(e,t)),e.traces.length===0)d.push(...renderEmptyState(t,i,o));else if(e.trace===void 0)d.push(...center(o,a.muted(`Loading trace…`)));else{let r=renderConversation(e,t,c,o);for(let t=0;t<o;t+=1){let i=r[t]??``;if(s===0){d.push(i);continue}let a=l[e.panelScroll+t]??``;e.textSelection!==void 0&&e.textSelection.region===`panel`&&(a=highlightSelection(a,e.panelScroll+t,e.textSelection,s)),d.push(joinPanels(i,c,a,n))}}return d.push(...renderFooter(e,n,i,t.surfaces)),t.toast!==void 0&&overlayToast(d,t.toast,n,i,t.surfaces),{rows:d,panelTotalRows:l.length,timelineViewportRows:o,panelViewportRows:u,contentWidth:c}}function chromeStyles(e,t){let n=e.color?t:void 0;return{muted:n?.mutedText??e.colors.dim,primary:n?.primaryText??(e=>e)}}function overlayToast(e,t,n,r,i){let a=` ${stripTerminalControls(t)} `,o=visibleLength(a),s=r.unicode?`▌`:r.glyph.rule,c=r.color?i:void 0,d=c===void 0?``:c.body,f=c?.primaryText??r.colors.white,p=r.color?`\x1B[0m`:``,m=[`${d}${f(s)}${` `.repeat(o)}${p}`,`${d}${f(s)}${f(a)}${p}`,`${d}${f(s)}${` `.repeat(o)}${p}`];for(let[t,r]of m.entries()){let i=2+t;if(i>=e.length)break;e[i]=overlayRight(e[i],r,n,1)}}function overlayRight(e,t,n,r){let i=Math.max(0,n-r-visibleLength(t)),a=visibleLength(e);return`${sliceVisible(a<i?e+` `.repeat(i-a):e,i)}\x1b[0m${t}`}const CONVERSATION_CONTENT_KEYS=new Set([`ai.prompt.messages`,`ai.prompt.system`,`ai.response.reasoning`,`ai.response.text`,`ai.response.tool_calls`,`ai.response.tool_results`,`gen_ai.tool.call.arguments`,`gen_ai.tool.call.result`]);function renderSpanDetail(t,n,r,s){let{colors:c}=r,{muted:u,primary:f}=chromeStyles(r,s?.surfaces),p=[],m=stripTerminalControls(t.name);p.push(...wrapVisibleLine(c.bold(f(m)),n));let h=describeLocalTraceSpan(t).map(stripTerminalControls);h.length>0&&p.push(u(h.join(`, `))),p.push(``);let fact=(e,t)=>`${u(e.padEnd(10))}${t}`,g=t.statusCode===2;p.push(fact(`status`,g?c.red(`ERROR`):c.green(`ok`))),p.push(fact(`duration`,formatElapsed(durationMs(t.startTimeNs,t.endTimeNs)))),p.push(fact(`started`,clockTime(t.startTimeNs))),p.push(fact(`span`,t.spanId)),t.parentSpanId!==void 0&&p.push(fact(`parent`,t.parentSpanId)),t.scope!==void 0&&p.push(fact(`scope`,stripTerminalControls(t.scope))),p.push(``);let _=Object.keys(t.attributes).filter(e=>s?.excludeKeys?.has(e)!==!0).sort();if(_.length===0)p.push(u(`no attributes`));else{p.push(u(`attributes (${_.length})`));for(let i of _){let a=formatAttributeContent(i,t.attributes[i],r,n-2),o=stripTerminalControls(i);if(a.length===1)p.push(...wrapVisibleLine(`${u(o)} ${a[0]}`,n));else{p.push(u(o));for(let e of a)p.push(` ${e}`)}}}return p.map(e=>clipVisible(e,n))}function renderHeader(e,t){let{theme:n,width:r}=t,{colors:a,glyph:s}=n,{muted:c,primary:d}=chromeStyles(n,t.surfaces),f=[];if(e.trace?.agentName!==void 0&&f.push(stripTerminalControls(e.trace.agentName)),e.trace?.sessionId!==void 0&&f.push(`session ${stripTerminalControls(e.trace.sessionId)}`),e.trace!==void 0){let n=t.activeWindowEndNs!==void 0&&t.activeWindowEndNs>e.trace.endTimeNs?t.activeWindowEndNs:e.trace.endTimeNs;f.push(clockTime(e.trace.startTimeNs),`${e.trace.spans.length} span${e.trace.spans.length===1?``:`s`}`,formatElapsed(durationMs(e.trace.startTimeNs,n)))}let p=`${a.bold(d(`${s.brand} traces`))}${f.length===0?``:c(` · ${f.join(` · `)}`)}`,m=e.traces.length===0?``:c(`[${e.traceIndex+1}/${e.traces.length}]`),h=[t.activeWindowEndNs===void 0?``:a.green(`● live`),m].filter(e=>e.length>0).join(` `);return[``,clipVisible(joinRight(` ${clipVisible(p,Math.max(0,r-visibleLength(h)-2))}`,h,r),r),``]}function renderConversation(e,t,n,r){let{theme:i}=t;if(e.conversationItems.length===0)return[chromeStyles(i,t.surfaces).muted(` No conversation content in this trace — content capture may be off (EVE_TRACES_CONTENT).`)];let a=conversationLines(e,n,i,t.surfaces).slice(e.scrollRow,e.scrollRow+r);return e.textSelection===void 0||e.textSelection.region!==`conversation`?a:a.map((t,r)=>highlightSelection(t,e.scrollRow+r,e.textSelection,n))}function conversationLines(e,n,r,i){let a=[];for(let o=0;o<e.conversationItems.length;o+=1)a.push(...renderConversationItem(e.conversationItems[o],n,r,o===e.selectedRow,e.expandedItems.has(o),i),``);return a}function panelDetailLines(e,t,n,i){let a=selectedTraceViewerSpan(e);return!e.panelOpen||t<=0||a===void 0?[]:[``,...renderSpanDetail(a,Math.max(16,t-3),n,{excludeKeys:CONVERSATION_CONTENT_KEYS,surfaces:i}).map(e=>` ${e}`)]}function conversationSelectionText(e,t,n,r,i){return selectionText(conversationLines(e,t,n,i),r)}function panelSelectionText(e,t,n,r){return selectionText(panelDetailLines(e,e.panelOpen?panelWidthFor(t):0,n),r)}function selectionText(e,t){let{start:r,end:i}=orderedTextSelection(t),a=[];for(let t=Math.max(0,r.line);t<=i.line&&t<e.length;t+=1){let n=stripAnsi(e[t]),o=t===r.line?r.column:0,l=t===i.line?i.column+1:1/0,u=l===1/0?n:sliceVisible(n,l),d=sliceVisible(n,o).length;a.push(u.slice(d).trimEnd())}return a.join(`
2
+ `)}function highlightSelection(e,t,r,i){let{start:a,end:o}=orderedTextSelection(r);if(t<a.line||t>o.line)return e;let c=t===a.line?a.column:0,l=t===o.line?o.column+1:i,d=visibleLength(e),f=d<l?e+` `.repeat(l-d):e,p=sliceVisible(f,c),m=sliceVisible(f,l),h=m.slice(p.length),g=f.slice(m.length);return h.length===0?e:`${p}\x1b[7m${h.replaceAll(`\x1B[0m`,`\x1B[0m\x1B[7m`)}\x1b[27m${g}`}function renderFooter(e,t,n,r){let{colors:i}=n,{muted:a}=chromeStyles(n,r),[s,c]=n.unicode?[`↑↓`,`←→`]:[`^/v`,`</>`],l=e.panelFocus?`${s} scroll · tab cards · esc back`:`${s} select · ${c} expand · enter attrs · tab focus · [ ] traces · q close`,u=e.conversationItems.length,d=u===0?``:a(`item ${e.selectedRow+1}/${u}`),f=[e.notice===void 0?``:i.yellow(e.notice),d].filter(e=>e.length>0).join(a(` · `));return[``,clipVisible(` ${a(l)}`,t),clipVisible(f.length===0?``:` ${f}`,t)]}function renderEmptyState(e,t,n){let{muted:r,primary:i}=chromeStyles(t,e.surfaces),[a,o]=e.tracingDisabled===!0?[`Tracing is disabled (EVE_TRACES=off).`,`Re-enable it and spans stream in live.`]:[`No local traces yet.`,`Chat with your agent — spans stream in live.`];return center(n,t.colors.bold(i(a)),r(o))}function center(e,...t){let n=Array.from({length:e},()=>``),r=Math.max(0,Math.floor(e/2)-1);return t.forEach((t,i)=>{r+i<e&&(n[r+i]=t)}),n}function joinPanels(e,t,n,r){let i=Math.max(0,r-t-1);return`${padTo(e,t)} ${clipVisible(n,i)}`}function joinRight(e,t,n){if(t.length===0)return e;let r=Math.max(1,n-visibleLength(e)-visibleLength(t));return`${e}${` `.repeat(r)}${t}`}function padTo(e,t){let n=visibleLength(e);return n>=t?clipVisible(e,t):e+` `.repeat(t-n)}function panelWidthFor(e){return e<42?0:Math.min(64,Math.max(20,Math.floor(e*.42)),e-20-1)}function durationMs(e,t){return Math.max(0,Number(t-e)/1e6)}function clockTime(e){let t=new Date(Number(e/1000000n)),pad=(e,t=2)=>String(e).padStart(t,`0`);return`${pad(t.getHours())}:${pad(t.getMinutes())}:${pad(t.getSeconds())}.${pad(t.getMilliseconds(),3)}`}export{conversationSelectionText,panelSelectionText,renderSpanDetail,renderTraceViewer};
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Owns one open `/traces` viewer: the store poller, the navigation state, and
3
+ * frame production. The terminal renderer wires it to the alt screen and the
4
+ * keyboard; everything else lives here so `terminal-renderer.ts` stays small
5
+ * and the poll/repaint lifecycle is testable without a TTY.
6
+ */
7
+ import type { TerminalKey } from "../stream-format.js";
8
+ import type { RgbColor } from "../terminal-background.js";
9
+ import type { Theme } from "../theme.js";
10
+ import type { TraceStore } from "./trace-store.js";
11
+ export interface TraceViewerOpenOptions {
12
+ readonly appRoot: string;
13
+ /** Current chat session — its trace opens first. */
14
+ readonly sessionId?: string;
15
+ /** Optional trace id (prefix) from `/traces <trace>`. */
16
+ readonly reference?: string;
17
+ }
18
+ /** The renderer capability the runner's `/traces` dispatch awaits. */
19
+ export interface TraceViewerRenderer {
20
+ open(options: TraceViewerOpenOptions): Promise<void>;
21
+ }
22
+ export interface TraceViewerSessionOptions extends TraceViewerOpenOptions {
23
+ readonly theme: Theme;
24
+ readonly paint: (rows: readonly string[]) => void;
25
+ readonly dimensions: () => {
26
+ readonly width: number;
27
+ readonly height: number;
28
+ };
29
+ readonly tracingDisabled?: boolean;
30
+ readonly store?: TraceStore;
31
+ /** Receives drag-selected text (wired to the clipboard by the renderer). */
32
+ readonly copyText?: (text: string) => void;
33
+ /**
34
+ * The terminal's default background from an earlier OSC 11 reply, so a
35
+ * reopened viewer paints its card surfaces on the first frame instead of
36
+ * waiting for the terminal to answer the probe again.
37
+ */
38
+ readonly terminalBackground?: RgbColor;
39
+ }
40
+ export declare class TraceViewerSession {
41
+ #private;
42
+ constructor(options: TraceViewerSessionOptions);
43
+ start(): void;
44
+ /** Feeds one key through the reducer; returns `"close"` when the viewer should close. */
45
+ handleKey(key: TerminalKey): "close" | undefined;
46
+ /**
47
+ * Applies the terminal's OSC 11 background reply: derives the card
48
+ * surfaces from the user's own palette and repaints. No-color themes keep
49
+ * the plain rail rendering.
50
+ */
51
+ setTerminalBackground(background: RgbColor): void;
52
+ repaint(): void;
53
+ dispose(): void;
54
+ }
@@ -0,0 +1 @@
1
+ import{createTraceStore}from"./trace-store.js";import{deriveTraceViewerSurfaces}from"./trace-surfaces.js";import{conversationItemLineCount}from"./trace-conversation.js";import{applyLoadedTrace,applyTraceList,createTraceViewerState,reduceTraceViewerKey}from"./trace-viewer-state.js";import{conversationSelectionText,panelSelectionText,renderTraceViewer}from"./trace-view.js";var TraceViewerSession=class{#e;#t;#n=createTraceViewerState();#r;#i;#a;#o;#s;#c=!1;#l=!1;#u=!1;#d;#f={timelineViewportRows:0,panelViewportRows:0,panelTotalRows:0,contentWidth:0};constructor(n){this.#e=n,this.#t=n.store??createTraceStore({appRoot:n.appRoot}),n.terminalBackground!==void 0&&n.theme.color&&(this.#d=deriveTraceViewerSurfaces(n.terminalBackground)),n.sessionId!==void 0&&(this.#i=n.sessionId),n.reference!==void 0&&(this.#i=void 0,this.#n={...this.#n,notice:`No local trace matches "${n.reference}" yet.`})}start(){this.repaint(),this.#m(),this.#a=setInterval(()=>void this.#m(),1e3),this.#a.unref?.()}handleKey(e){if(this.#c)return`close`;e.type===`text`&&(e.value===`[`||e.value===`]`)&&(this.#r=void 0,this.#i=void 0);let t=this.#n.trace!==void 0,{state:n,effect:r,copySelection:i}=reduceTraceViewerKey(this.#n,e,this.#f);if(this.#n=n,r===`close`)return`close`;i!==void 0&&this.#p(i),this.repaint(),t&&n.trace===void 0&&this.#m()}setTerminalBackground(e){this.#c||!this.#e.theme.color||(this.#d=deriveTraceViewerSurfaces(e),this.repaint())}repaint(){if(this.#c)return;let{width:e,height:t}=this.#e.dimensions(),r=renderTraceViewer(this.#n,{width:e,height:t,theme:this.#e.theme,tracingDisabled:this.#e.tracingDisabled,activeWindowEndNs:this.#_(),toast:this.#o,surfaces:this.#d});this.#f={timelineViewportRows:r.timelineViewportRows,panelViewportRows:r.panelViewportRows,panelTotalRows:r.panelTotalRows,contentWidth:r.contentWidth,conversationLineCounts:this.#n.conversationItems.map((e,t)=>conversationItemLineCount(e,r.contentWidth,this.#e.theme,this.#n.expandedItems.has(t)))},this.#e.paint(r.rows)}dispose(){this.#c=!0,this.#a!==void 0&&(clearInterval(this.#a),this.#a=void 0),this.#s!==void 0&&(clearTimeout(this.#s),this.#s=void 0)}#p(e){let t=e.region===`panel`?panelSelectionText(this.#n,this.#e.dimensions().width,this.#e.theme,e):conversationSelectionText(this.#n,this.#f.contentWidth,this.#e.theme,e,this.#d);t.trim().length!==0&&(this.#e.copyText?.(t),this.#o=`Copied to clipboard`,this.#s!==void 0&&clearTimeout(this.#s),this.#s=setTimeout(()=>{this.#s=void 0,this.#o=void 0,this.repaint()},2e3),this.#s.unref?.())}async#m(){if(!this.#c){if(this.#l){this.#u=!0;return}this.#l=!0;try{do this.#u=!1,await this.#h();while(this.#u&&!this.#c)}finally{this.#l=!1}}}async#h(){try{let e=await this.#t.list(),t=this.#r,n=this.#e.reference;if(t===void 0&&n!==void 0&&(t=e.find(e=>e.traceId.startsWith(n))?.traceId),t===void 0&&this.#i!==void 0&&(t=await this.#g(e,this.#i)),this.#c)return;t!==void 0&&(this.#r=t);let a=e[applyTraceList(this.#n,e,{preferTraceId:t}).traceIndex]?.traceId,o=a===void 0?void 0:await this.#t.read(a);if(this.#c)return;let s=applyTraceList(this.#n,e,{preferTraceId:this.#r});this.#r!==void 0&&e[s.traceIndex]?.traceId===this.#r&&(this.#r=void 0,this.#i=void 0,s.notice?.startsWith(`No local trace matches`)&&(s={...s,notice:void 0})),e[s.traceIndex]?.traceId===a&&(s=applyLoadedTrace(s,o)),this.#n=s,this.repaint()}catch{}}async#g(e,t){for(let n of e){let e=await this.#t.read(n.traceId);if(this.#c)return;if(e?.sessionIds.includes(t))return n.traceId}}#_(){let e=this.#n.traces[this.#n.traceIndex];if(!(e===void 0||this.#n.trace===void 0)&&!(Date.now()-e.lastActivityMs>3e3))return BigInt(Date.now())*1000000n}};export{TraceViewerSession};
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Navigation state for the `/traces` conversation viewer — a pure reducer in
3
+ * the style of `select-state.ts`: keys go in, a new state (plus an optional
4
+ * `close` effect) comes out, and rendering lives elsewhere. Data updates
5
+ * from the store poller arrive through {@link applyTraceList}/
6
+ * {@link applyLoadedTrace} so a live trace can grow underneath an open
7
+ * viewer without losing the user's selection.
8
+ */
9
+ import type { LocalTrace, LocalTraceSpan } from "#tracing/local-trace-reader.js";
10
+ import type { ConversationItem } from "#cli/dev/tui/traces/trace-conversation.js";
11
+ import type { TraceStoreEntry } from "#cli/dev/tui/traces/trace-store.js";
12
+ import type { TerminalKey } from "#cli/dev/tui/stream-format.js";
13
+ /**
14
+ * Rows above the conversation body (padding, title, padding). Lives here
15
+ * rather than in the renderer because the mouse handlers need the same
16
+ * offset to map terminal rows to conversation lines.
17
+ */
18
+ export declare const TRACE_VIEWER_HEADER_ROWS = 3;
19
+ export interface TraceViewerState {
20
+ /** Stored traces, most recent activity first. */
21
+ readonly traces: readonly TraceStoreEntry[];
22
+ /** Index into `traces` of the trace being viewed. */
23
+ readonly traceIndex: number;
24
+ /** The loaded trace, or `undefined` while it has no readable spans. */
25
+ readonly trace?: LocalTrace;
26
+ /** The trace re-told as conversation items (system/user/assistant/tool cards). */
27
+ readonly conversationItems: readonly ConversationItem[];
28
+ /** Conversation cards toggled open (the system card starts collapsed). */
29
+ readonly expandedItems: ReadonlySet<number>;
30
+ /** Index into `conversationItems` of the highlighted card. */
31
+ readonly selectedRow: number;
32
+ /** First conversation line painted (line-level scroll offset). */
33
+ readonly scrollRow: number;
34
+ readonly panelOpen: boolean;
35
+ /** Whether ↑/↓ scroll the details drawer instead of moving the selection. */
36
+ readonly panelFocus: boolean;
37
+ readonly panelScroll: number;
38
+ /** One-line status for edge cases (trace pruned, tracing disabled, …). */
39
+ readonly notice?: string;
40
+ /** Mouse drag selection over the conversation or drawer, in line/column cells. */
41
+ readonly textSelection?: TextSelectionRange;
42
+ }
43
+ /**
44
+ * One end of a text selection: line index + 0-based column, both relative
45
+ * to the selection's region — absolute conversation lines for the cards,
46
+ * absolute detail lines (and panel-content columns) for the drawer.
47
+ */
48
+ export interface TextSelectionPoint {
49
+ readonly line: number;
50
+ readonly column: number;
51
+ }
52
+ /** A drag selection from anchor (press) to head (latest drag position). */
53
+ export interface TextSelectionRange {
54
+ readonly anchor: TextSelectionPoint;
55
+ readonly head: TextSelectionPoint;
56
+ /** The pointer moved off the anchor cell — release copies instead of clicking. */
57
+ readonly dragging: boolean;
58
+ /** Where the drag started; the selection stays in that region. */
59
+ readonly region: "conversation" | "panel";
60
+ }
61
+ /** Selection endpoints ordered top-to-bottom for rendering and extraction. */
62
+ export declare function orderedTextSelection(selection: TextSelectionRange): {
63
+ start: TextSelectionPoint;
64
+ end: TextSelectionPoint;
65
+ };
66
+ /** Viewport metrics the controller measures so scrolling math stays pure. */
67
+ export interface TraceViewerKeyEnvironment {
68
+ /** Body rows available to the conversation. */
69
+ readonly timelineViewportRows: number;
70
+ /** Body rows available to the detail panel. */
71
+ readonly panelViewportRows: number;
72
+ /** Total detail rows the panel would paint for the selected span. */
73
+ readonly panelTotalRows: number;
74
+ /** Body column width — card expandability is width-dependent. */
75
+ readonly contentWidth: number;
76
+ /**
77
+ * Rendered height of each conversation card. The conversation viewport
78
+ * scrolls by lines, not items — without these, long conversations overflow
79
+ * the screen with no way to reach lower cards.
80
+ */
81
+ readonly conversationLineCounts?: readonly number[];
82
+ }
83
+ export interface TraceViewerKeyResult {
84
+ readonly state: TraceViewerState;
85
+ readonly effect?: "close";
86
+ /** A completed drag selection to copy — the controller extracts and copies the text. */
87
+ readonly copySelection?: TextSelectionRange;
88
+ }
89
+ export declare function createTraceViewerState(): TraceViewerState;
90
+ export declare function selectedTraceViewerSpan(state: TraceViewerState): LocalTraceSpan | undefined;
91
+ /** The number of selectable cards. */
92
+ export declare function traceViewerItemCount(state: TraceViewerState): number;
93
+ /**
94
+ * Applies a fresh trace listing. The viewed trace is kept by identity across
95
+ * reorders (a live trace climbs the list as spans land); when it disappears,
96
+ * selection falls back to the newest trace. `preferTraceId` wins on first
97
+ * load — the viewer opens on the current chat session's trace.
98
+ */
99
+ export declare function applyTraceList(state: TraceViewerState, entries: readonly TraceStoreEntry[], options?: {
100
+ readonly preferTraceId?: string;
101
+ }): TraceViewerState;
102
+ /**
103
+ * Applies a freshly read trace. Selection follows the previously selected
104
+ * card (span id + kind — cards can share spans) so live growth never jumps
105
+ * the cursor; a pruned trace clears the view with a notice instead of
106
+ * pretending stale data is current.
107
+ */
108
+ export declare function applyLoadedTrace(state: TraceViewerState, trace: LocalTrace | undefined): TraceViewerState;
109
+ /** The one key handler: navigation, expansion, the details drawer, closing. */
110
+ export declare function reduceTraceViewerKey(state: TraceViewerState, key: TerminalKey, environment: TraceViewerKeyEnvironment): TraceViewerKeyResult;
@@ -0,0 +1 @@
1
+ import{buildConversationItems,conversationItemExpandable}from"#cli/dev/tui/traces/trace-conversation.js";const TRACE_VIEWER_HEADER_ROWS=3;function orderedTextSelection(e){let{anchor:t,head:n}=e;return t.line<n.line||t.line===n.line&&t.column<=n.column?{start:t,end:n}:{start:n,end:t}}function createTraceViewerState(){return{...clearedTraceView(),traces:[],traceIndex:0}}function clearedTraceView(){return{trace:void 0,conversationItems:[],expandedItems:new Set,selectedRow:0,scrollRow:0,panelOpen:!1,panelFocus:!1,panelScroll:0,textSelection:void 0}}function selectedTraceViewerSpan(e){return e.conversationItems[e.selectedRow]?.span}function traceViewerItemCount(e){return e.conversationItems.length}function applyTraceList(e,t,n={}){let r=e.traces[e.traceIndex]?.traceId,i=n.preferTraceId===void 0?-1:t.findIndex(e=>e.traceId===n.preferTraceId);i===-1&&(i=r===void 0?-1:t.findIndex(e=>e.traceId===r)),i===-1&&(i=t.length===0?0:Math.max(0,e.traceIndex)),i>=t.length&&(i=Math.max(0,t.length-1));let a=t[i]?.traceId!==r,o=t.length===0?e.notice??`No local traces yet — chat with your agent and spans stream in live.`:e.notice?.startsWith(`No local traces`)?void 0:e.notice;return a?{...e,...clearedTraceView(),traces:t,traceIndex:i,notice:o}:{...e,traces:t,traceIndex:i,notice:o}}function applyLoadedTrace(t,n){if(n===void 0)return t.trace===void 0?t:{...t,trace:void 0,conversationItems:[],selectedRow:0,scrollRow:0,panelOpen:!1,panelFocus:!1,panelScroll:0,notice:`This trace was pruned — pick another with [ and ].`};let r=selectedTraceViewerSpan(t)?.spanId,i=t.conversationItems[t.selectedRow]?.kind,a=buildConversationItems(n),o;if(r===void 0)o=t.selectedRow;else{let matches=e=>e.span.spanId===r&&e.kind===i,e=t.conversationItems.slice(0,t.selectedRow).filter(matches).length,n=a.flatMap((e,t)=>matches(e)?[t]:[]);o=n[Math.min(e,n.length-1)]??-1}o===-1&&(o=Math.min(t.selectedRow,a.length-1)),o<0&&(o=0);let s=t.notice?.startsWith(`This trace was pruned`)?void 0:t.notice;return{...t,trace:n,conversationItems:a,selectedRow:o,notice:s}}function reduceTraceViewerKey(e,n,r){let i=Math.max(0,r.panelTotalRows-r.panelViewportRows),a=e.panelScroll>i?{...e,panelScroll:i}:e;switch(n.type){case`escape`:return a.textSelection===void 0?a.panelFocus?{state:{...a,panelFocus:!1}}:a.panelOpen?{state:{...a,panelOpen:!1,panelScroll:0}}:{state:a,effect:`close`}:{state:{...a,textSelection:void 0}};case`ctrl-c`:return{state:a,effect:`close`};case`mouse`:{if(n.action===`press`&&(n.button===64||n.button===65)){let e=n.button===64?-3:3;if(a.panelOpen&&n.x-1>=r.contentWidth){let t=Math.min(i,Math.max(0,a.panelScroll+e));return{state:{...a,panelScroll:t}}}return{state:scrollConversation(a,e,r)}}if(n.action===`press`&&n.button===0){let e=selectionCellAt(a,r,n.x,n.y);return e===void 0?{state:{...a,textSelection:void 0}}:{state:{...a,textSelection:{anchor:e.point,head:e.point,dragging:!1,region:e.region}}}}if(n.action===`press`&&n.button===32){if(a.textSelection===void 0)return{state:a};let e=a.textSelection.region===`panel`?panelCellAt(a,r,n.x,n.y):conversationCellAt(a,r,n.x,n.y);if(e===void 0)return{state:a};let t=a.textSelection.dragging||e.line!==a.textSelection.anchor.line||e.column!==a.textSelection.anchor.column;return{state:{...a,textSelection:{...a.textSelection,head:e,dragging:t}}}}if(n.action!==`release`||n.button!==0)return{state:a};let e=a.textSelection,o={...a,textSelection:void 0};if(e!==void 0&&e.dragging)return{state:o,copySelection:e};let s=n.y-1-3;if(s<0)return{state:o};let c=conversationItemAtBodyRow(o,r,s);if(c===void 0)return{state:o};let l=o.conversationItems[c],u=new Set(o.expandedItems);return l!==void 0&&!u.has(c)&&conversationItemExpandable(l,r.contentWidth)?u.add(c):u.delete(c),{state:{...o,selectedRow:c,expandedItems:u}}}case`enter`:return traceViewerItemCount(a)===0?{state:a}:a.panelOpen?{state:{...a,panelOpen:!1,panelFocus:!1}}:{state:{...a,panelOpen:!0,panelScroll:0}};case`tab`:return a.panelOpen?{state:{...a,panelFocus:!a.panelFocus}}:{state:a};case`up`:case`ctrl-p`:return a.panelFocus?{state:{...a,panelScroll:Math.max(0,a.panelScroll-1)}}:{state:moveSelection(a,-1,r)};case`down`:case`ctrl-n`:return a.panelFocus?{state:{...a,panelScroll:Math.min(i,a.panelScroll+1)}}:{state:moveSelection(a,1,r)};case`home`:return a.panelFocus?{state:{...a,panelScroll:0}}:{state:moveSelection(a,-a.selectedRow,r)};case`end`:return a.panelFocus?{state:{...a,panelScroll:i}}:{state:moveSelection(a,traceViewerItemCount(a)-1-a.selectedRow,r)};case`left`:case`right`:{if(a.panelFocus)return{state:a};let e=a.conversationItems[a.selectedRow];if(e===void 0||!a.expandedItems.has(a.selectedRow)&&!conversationItemExpandable(e,r.contentWidth))return{state:a};let n=new Set(a.expandedItems);n.has(a.selectedRow)?n.delete(a.selectedRow):n.add(a.selectedRow);let i={...a,expandedItems:n};return{state:{...i,scrollRow:conversationScrollRow(i,r)}}}case`text`:return n.framing===`bracketed-paste`?{state:a}:n.value===`q`?{state:a,effect:`close`}:n.value===`[`||n.value===`]`?{state:switchTrace(a,n.value===`[`?1:-1)}:{state:a};default:return{state:a}}}function switchTrace(e,t){if(e.traces.length===0)return e;let n=Math.min(Math.max(0,e.traceIndex+t),e.traces.length-1);return n===e.traceIndex?e:{...e,...clearedTraceView(),traceIndex:n}}function moveSelection(e,t,n){let r=traceViewerItemCount(e);if(r===0)return e;let i=Math.min(Math.max(0,e.selectedRow+t),r-1);return{...e,selectedRow:i,panelScroll:0,scrollRow:conversationScrollRow({...e,selectedRow:i},n)}}function cardLineOffsets(e,t){let n=[0];for(let r=0;r<e.conversationItems.length;r+=1)n.push(n[r]+(t[r]??1)+1);return n}function conversationLineTotal(e,t){let n=cardLineOffsets(e,t);return n[n.length-1]}function conversationScrollRow(e,t){let n=t.conversationLineCounts;if(n===void 0)return e.scrollRow;let r=t.timelineViewportRows,i=cardLineOffsets(e,n)[e.selectedRow]??0,a=n[e.selectedRow]??1,o=i+a;return e.scrollRow<=i&&o<=e.scrollRow+r?e.scrollRow:a>r?i:Math.max(0,o-r)}function conversationCellAt(e,t,n,r){let i=t.conversationLineCounts;if(i===void 0||e.conversationItems.length===0)return;let a=r-1-3;if(a<0||a>=t.timelineViewportRows)return;let o=n-1;if(o<0||o>=t.contentWidth)return;let s=conversationLineTotal(e,i),c=e.scrollRow+a;if(!(c>=s))return{column:o,line:c}}function panelCellAt(e,t,n,r){if(!e.panelOpen||t.panelTotalRows===0)return;let i=r-1-3;if(i<0||i>=t.panelViewportRows)return;let a=n-1-(t.contentWidth+1);if(a<0)return;let o=e.panelScroll+i;if(!(o>=t.panelTotalRows))return{column:a,line:o}}function selectionCellAt(e,t,n,r){let i=conversationCellAt(e,t,n,r);if(i!==void 0)return{point:i,region:`conversation`};let a=panelCellAt(e,t,n,r);if(a!==void 0)return{point:a,region:`panel`}}function conversationItemAtBodyRow(e,t,n){let r=t.conversationLineCounts;if(r===void 0)return;let i=e.scrollRow+n,a=cardLineOffsets(e,r);for(let t=0;t<e.conversationItems.length;t+=1)if(i<a[t+1])return t}function scrollConversation(e,t,n){let r=n.conversationLineCounts;if(r===void 0||e.conversationItems.length===0)return e;let i=n.timelineViewportRows,a=Math.max(0,conversationLineTotal(e,r)-i),o=Math.min(a,Math.max(0,e.scrollRow+t));return o===e.scrollRow?e:{...e,scrollRow:o}}export{TRACE_VIEWER_HEADER_ROWS,applyLoadedTrace,applyTraceList,createTraceViewerState,orderedTextSelection,reduceTraceViewerKey,selectedTraceViewerSpan,traceViewerItemCount};
@@ -1 +1 @@
1
- import{createDevDiagnostics}from"../diagnostics.js";import{promptCommandsFor}from"./prompt-commands.js";import{probeMcpConnection}from"./mcp-connection-status.js";import{createPromptCommandHandler}from"./prompt-command-handler.js";import{formatRemoteAuthChallengeMessage}from"./remote-auth-result.js";import{remoteHost}from"./target.js";import{EveTUIRunner}from"./runner.js";import{toErrorMessage}from"#shared/errors.js";import{resolveDevelopmentOidcToken,resolveLinkedDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{isVercelAuthChallenge}from"#services/dev-client/vercel-auth-error.js";import{resolveVercelDeployment}from"#setup/vercel-deployment.js";import{Client}from"#client/index.js";import{resolveLocalDevelopmentClientOptions,resolveRemoteDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{createDevelopmentCredentialGate}from"#services/dev-client/credential-gate.js";function prepareRemoteTarget(e){return{target:e,credentials:createDevelopmentCredentialGate(e.serverUrl),resolveOidcToken:resolveDevelopmentOidcToken,resolveDeployment:t=>resolveVercelDeployment({workspaceRoot:e.workspaceRoot,host:remoteHost(e),signal:t})}}function prepareDevelopmentTarget(e){return e.kind===`local`?{kind:`local`,target:e}:{kind:`remote`,target:e,remote:prepareRemoteTarget(e)}}async function runDevelopmentTui(n){let{target:r,headers:i,initialInput:a,onBootProgress:o,lifecycle:s,withExclusiveTerminal:c,...l}=n,u=prepareDevelopmentTarget(r),{serverUrl:d}=r,f=i===void 0?{}:{headers:i},p=new Client(u.kind===`local`?resolveLocalDevelopmentClientOptions({...f,serverUrl:d,token:()=>resolveLinkedDevelopmentOidcToken(u.target.workspaceRoot)}):resolveRemoteDevelopmentClientOptions({...f,serverUrl:d,credentials:u.remote.credentials})),m={...l,session:p.session(),client:p,serverUrl:d,promptCommandHandler:createPromptCommandHandler({target:r}),availablePromptCommands:promptCommandsFor(r.kind),formatTransportError:e=>isVercelAuthChallenge(e)?formatRemoteAuthChallengeMessage(d):toErrorMessage(e)};u.kind===`local`?(m.appRoot=u.target.workspaceRoot,m.probeMcpConnection=probeMcpConnection):m.remote=u.remote,a!==void 0&&(m.initialInput=a),o!==void 0&&(m.onBootProgress=o),s!==void 0&&(m.lifecycle=s),c!==void 0&&(m.withExclusiveTerminal=c);let h=u.kind===`local`?await createDevDiagnostics(u.target.workspaceRoot).catch(()=>void 0):void 0;h!==void 0&&(m.diagnostics=h);try{await new EveTUIRunner(m).run()}finally{await h?.close()}}export{runDevelopmentTui};
1
+ import{createDevDiagnostics}from"../diagnostics.js";import{promptCommandsFor}from"./prompt-commands.js";import{probeMcpConnection}from"./mcp-connection-status.js";import{createPromptCommandHandler}from"./prompt-command-handler.js";import{formatRemoteAuthChallengeMessage}from"./remote-auth-result.js";import{remoteHost}from"./target.js";import{EveTUIRunner}from"./runner.js";import{Client}from"#client/index.js";import{toErrorMessage}from"#shared/errors.js";import{resolveDevelopmentOidcToken,resolveLinkedDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{isVercelAuthChallenge}from"#services/dev-client/vercel-auth-error.js";import{resolveVercelDeployment}from"#setup/vercel-deployment.js";import{resolveLocalDevelopmentClientOptions,resolveRemoteDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{createDevelopmentCredentialGate}from"#services/dev-client/credential-gate.js";function prepareRemoteTarget(e){return{target:e,credentials:createDevelopmentCredentialGate(e.serverUrl),resolveOidcToken:resolveDevelopmentOidcToken,resolveDeployment:t=>resolveVercelDeployment({workspaceRoot:e.workspaceRoot,host:remoteHost(e),signal:t})}}function prepareDevelopmentTarget(e){return e.kind===`local`?{kind:`local`,target:e}:{kind:`remote`,target:e,remote:prepareRemoteTarget(e)}}async function runDevelopmentTui(n){let{target:r,headers:i,initialInput:a,onBootProgress:o,lifecycle:s,withExclusiveTerminal:c,...l}=n,u=prepareDevelopmentTarget(r),{serverUrl:d}=r,f=i===void 0?{}:{headers:i},p=new Client(u.kind===`local`?resolveLocalDevelopmentClientOptions({...f,serverUrl:d,token:()=>resolveLinkedDevelopmentOidcToken(u.target.workspaceRoot)}):resolveRemoteDevelopmentClientOptions({...f,serverUrl:d,credentials:u.remote.credentials})),m={...l,session:p.session(),client:p,serverUrl:d,promptCommandHandler:createPromptCommandHandler({target:r}),availablePromptCommands:promptCommandsFor(r.kind),formatTransportError:e=>isVercelAuthChallenge(e)?formatRemoteAuthChallengeMessage(d):toErrorMessage(e)};u.kind===`local`?(m.appRoot=u.target.workspaceRoot,m.probeMcpConnection=probeMcpConnection):m.remote=u.remote,a!==void 0&&(m.initialInput=a),o!==void 0&&(m.onBootProgress=o),s!==void 0&&(m.lifecycle=s),c!==void 0&&(m.withExclusiveTerminal=c);let h=u.kind===`local`?await createDevDiagnostics(u.target.workspaceRoot).catch(()=>void 0):void 0;h!==void 0&&(m.diagnostics=h);try{await new EveTUIRunner(m).run()}finally{await h?.close()}}export{runDevelopmentTui};
@@ -1 +1 @@
1
- import{projectInvocationInputRequest}from"./result.js";import{resolveLinkedDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{formatVercelTrustedSourcesFailure,isVercelAuthChallenge,vercelTrustedSourcesErrorCode}from"#services/dev-client/vercel-auth-error.js";import{Client,ClientError}from"#client/index.js";import{resolveLocalDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{collectTurnEvents,summarizeTurnEvents}from"#client/session-utils.js";import{resolveVerifiedRemoteDevelopmentClient}from"#setup/verified-remote-client.js";async function runInvoke(e){let{client:t,deploymentResolution:n}=await createInvokeClient(e),r=e.operation.resume,i=t.session(r?.session);if(e.operation.kind===`follow`)return observeSafely(e,i,i.stream({signal:e.signal}),n);let a;try{a=await i.send({...e.operation.payload,signal:e.signal})}catch(e){let t=authenticationFailure(e,void 0,n);if(t!==void 0)return t;throw e}return observeSafely(e,i,a,n)}function resolveInvokeOperation(e){let t=e.prompt?.trim(),n=e.previous;if(n===void 0){if(!t)throw Error(`eve invoke requires a prompt unless --resume is provided.`);return{kind:`send`,payload:{message:t}}}if(n.status===`input-required`){if(!t)throw Error(`This invocation is waiting for an input response.`);return{kind:`send`,payload:{message:t},resume:n.resume}}if(n.status===`running`||n.status===`authorization-required`||n.status===`authentication-required`){if(t)throw Error(n.status===`running`?`A running invocation cannot accept a follow-up prompt.`:`Complete the requested authorization, then resume without a prompt.`);return{kind:`follow`,resume:n.resume}}if(n.status!==`ready`)throw Error(`A terminal ${n.status} invocation cannot be resumed.`);if(!t)throw Error(`A ready invocation requires a follow-up prompt.`);return{kind:`send`,payload:{message:t},resume:n.resume}}async function createInvokeClient(e){if(e.target.kind===`local`)return{client:new Client({...resolveLocalDevelopmentClientOptions({headers:e.headers,serverUrl:e.target.serverUrl,token:()=>resolveLinkedDevelopmentOidcToken(e.target.workspaceRoot)}),preserveCompletedSessions:!0})};let{deploymentResolution:n,options:r}=await resolveVerifiedRemoteDevelopmentClient({headers:e.headers,serverUrl:e.target.serverUrl,signal:e.signal,vercelScope:e.vercelScope,workspaceRoot:e.target.workspaceRoot});return{client:new Client({...r,preserveCompletedSessions:!0}),deploymentResolution:n}}async function observeSafely(e,t,n,r){try{return await observeInvocation(e.target,t,n)}catch(n){if(e.signal?.aborted===!0)return runningResult(e.target,t.state);let i=authenticationFailure(n,createResume(e.target,t.state),r);if(i!==void 0)return i;throw n}}async function observeInvocation(t,n,r){let i=summarizeTurnEvents(await collectTurnEvents(r));if(i.boundary===void 0)return runningResult(t,n.state);if(i.boundary.type===`session.failed`)return{status:`failed`,message:i.boundary.data.message};let a=createResume(t,n.state);if(i.failure?.type===`turn.failed`)return{status:`ready`,outcome:{status:`failed`,message:i.failure.data.message},resume:a};if(i.inputRequests.length>0)return{status:`input-required`,requests:i.inputRequests.map(projectInvocationInputRequest),resume:a};let o=i.pendingAuthorizations;return o.length>0?t.kind===`local`&&o.some(e=>e.webhookUrl!==void 0)?{status:`failed`,message:`Local eve invoke cannot pause for connection authorization because its temporary server must remain available for the callback. Run eve dev, then invoke its URL with --url.`}:{status:`authorization-required`,authorizations:o,resume:a}:{status:`ready`,outcome:i.message===void 0?{status:`completed`}:{status:`completed`,message:i.message},resume:a}}function runningResult(e,t){return{status:`running`,resume:createResume(e,t)}}function createResume(e,t){if(t.sessionId===void 0)throw Error(`Invocation has no resumable session ID.`);return{session:t.continuationToken===void 0?{sessionId:t.sessionId,streamIndex:t.streamIndex}:{continuationToken:t.continuationToken,sessionId:t.sessionId,streamIndex:t.streamIndex},target:e.kind===`local`?{kind:`local`}:{kind:`remote`,serverUrl:e.serverUrl}}}function authenticationFailure(e,t,a){let s,c;if(a?.kind===`not-found`?s=`Vercel could not resolve this deployment in the selected scope. Retry with the owning team's slug via --scope <team-slug>, or provide an explicit Authorization header with -H.`:isVercelAuthChallenge(e)?s=`Vercel Deployment Protection rejected the available credentials. Configure Trusted Sources or set VERCEL_AUTOMATION_BYPASS_SECRET, then retry.`:e instanceof ClientError&&(c=vercelTrustedSourcesErrorCode(e.message),e.status===403&&c===`TRUSTED_SOURCES_ENVIRONMENT_MISMATCH`?s=formatVercelTrustedSourcesFailure(e.message):isEveAuthorizationError(e)&&(s=`The deployment rejected the available credentials. Confirm its eve channel authorization and that your account can access the owning project.`)),s!==void 0)return t===void 0?c===void 0?{status:`authentication-required`,message:s}:{status:`authentication-required`,code:c,message:s}:c===void 0?{status:`authentication-required`,message:s,resume:t}:{status:`authentication-required`,code:c,message:s,resume:t}}function isEveAuthorizationError(e){if(e.status!==401)return!1;try{let t=JSON.parse(e.body);return t.ok===!1&&t.code===`unauthorized`}catch{return!1}}export{resolveInvokeOperation,runInvoke};
1
+ import{projectInvocationInputRequest}from"./result.js";import{Client,ClientError}from"#client/index.js";import{resolveLinkedDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{formatVercelTrustedSourcesFailure,isVercelAuthChallenge,vercelTrustedSourcesErrorCode}from"#services/dev-client/vercel-auth-error.js";import{resolveLocalDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{collectTurnEvents,summarizeTurnEvents}from"#client/session-utils.js";import{resolveVerifiedRemoteDevelopmentClient}from"#setup/verified-remote-client.js";async function runInvoke(e){let{client:t,deploymentResolution:n}=await createInvokeClient(e),r=e.operation.resume,i=t.session(r?.session);if(e.operation.kind===`follow`)return observeSafely(e,i,i.stream({signal:e.signal}),n);let a;try{a=await i.send({...e.operation.payload,signal:e.signal})}catch(e){let t=authenticationFailure(e,void 0,n);if(t!==void 0)return t;throw e}return observeSafely(e,i,a,n)}function resolveInvokeOperation(e){let t=e.prompt?.trim(),n=e.previous;if(n===void 0){if(!t)throw Error(`eve invoke requires a prompt unless --resume is provided.`);return{kind:`send`,payload:{message:t}}}if(n.status===`input-required`){if(!t)throw Error(`This invocation is waiting for an input response.`);return{kind:`send`,payload:{message:t},resume:n.resume}}if(n.status===`running`||n.status===`authorization-required`||n.status===`authentication-required`){if(t)throw Error(n.status===`running`?`A running invocation cannot accept a follow-up prompt.`:`Complete the requested authorization, then resume without a prompt.`);return{kind:`follow`,resume:n.resume}}if(n.status!==`ready`)throw Error(`A terminal ${n.status} invocation cannot be resumed.`);if(!t)throw Error(`A ready invocation requires a follow-up prompt.`);return{kind:`send`,payload:{message:t},resume:n.resume}}async function createInvokeClient(e){if(e.target.kind===`local`)return{client:new Client({...resolveLocalDevelopmentClientOptions({headers:e.headers,serverUrl:e.target.serverUrl,token:()=>resolveLinkedDevelopmentOidcToken(e.target.workspaceRoot)}),preserveCompletedSessions:!0})};let{deploymentResolution:n,options:i}=await resolveVerifiedRemoteDevelopmentClient({headers:e.headers,serverUrl:e.target.serverUrl,signal:e.signal,vercelScope:e.vercelScope,workspaceRoot:e.target.workspaceRoot});return{client:new Client({...i,preserveCompletedSessions:!0}),deploymentResolution:n}}async function observeSafely(e,t,n,r){try{return await observeInvocation(e.target,t,n)}catch(n){if(e.signal?.aborted===!0)return runningResult(e.target,t.state);let i=authenticationFailure(n,createResume(e.target,t.state),r);if(i!==void 0)return i;throw n}}async function observeInvocation(t,n,r){let i=summarizeTurnEvents(await collectTurnEvents(r));if(i.boundary===void 0)return runningResult(t,n.state);if(i.boundary.type===`session.failed`)return{status:`failed`,message:i.boundary.data.message};let a=createResume(t,n.state);if(i.failure?.type===`turn.failed`)return{status:`ready`,outcome:{status:`failed`,message:i.failure.data.message},resume:a};if(i.inputRequests.length>0)return{status:`input-required`,requests:i.inputRequests.map(projectInvocationInputRequest),resume:a};let o=i.pendingAuthorizations;return o.length>0?t.kind===`local`&&o.some(e=>e.webhookUrl!==void 0)?{status:`failed`,message:`Local eve invoke cannot pause for connection authorization because its temporary server must remain available for the callback. Run eve dev, then invoke its URL with --url.`}:{status:`authorization-required`,authorizations:o,resume:a}:{status:`ready`,outcome:i.message===void 0?{status:`completed`}:{status:`completed`,message:i.message},resume:a}}function runningResult(e,t){return{status:`running`,resume:createResume(e,t)}}function createResume(e,t){if(t.sessionId===void 0)throw Error(`Invocation has no resumable session ID.`);return{session:t.continuationToken===void 0?{sessionId:t.sessionId,streamIndex:t.streamIndex}:{continuationToken:t.continuationToken,sessionId:t.sessionId,streamIndex:t.streamIndex},target:e.kind===`local`?{kind:`local`}:{kind:`remote`,serverUrl:e.serverUrl}}}function authenticationFailure(e,t,r){let s,c;if(r?.kind===`not-found`?s=`Vercel could not resolve this deployment in the selected scope. Retry with the owning team's slug via --scope <team-slug>, or provide an explicit Authorization header with -H.`:isVercelAuthChallenge(e)?s=`Vercel Deployment Protection rejected the available credentials. Configure Trusted Sources or set VERCEL_AUTOMATION_BYPASS_SECRET, then retry.`:e instanceof ClientError&&(c=vercelTrustedSourcesErrorCode(e.message),e.status===403&&c===`TRUSTED_SOURCES_ENVIRONMENT_MISMATCH`?s=formatVercelTrustedSourcesFailure(e.message):isEveAuthorizationError(e)&&(s=`The deployment rejected the available credentials. Confirm its eve channel authorization and that your account can access the owning project.`)),s!==void 0)return t===void 0?c===void 0?{status:`authentication-required`,message:s}:{status:`authentication-required`,code:c,message:s}:c===void 0?{status:`authentication-required`,message:s,resume:t}:{status:`authentication-required`,code:c,message:s,resume:t}}function isEveAuthorizationError(e){if(e.status!==401)return!1;try{let t=JSON.parse(e.body);return t.ok===!1&&t.code===`unauthorized`}catch{return!1}}export{resolveInvokeOperation,runInvoke};
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";import{inputOptionSchema,inputRequestSchema}from"#client/index.js";const sessionCursorSchema=z.object({continuationToken:z.string().optional(),sessionId:z.string().min(1),streamIndex:z.number().int().nonnegative()}).strict(),targetSchema=z.discriminatedUnion(`kind`,[z.object({kind:z.literal(`local`)}).strict(),z.object({kind:z.literal(`remote`),serverUrl:z.url()}).strict()]),invokeResumeSchema=z.object({session:sessionCursorSchema,target:targetSchema}).strict(),invocationInputRequestSchema=inputRequestSchema.omit({action:!0,display:!0,options:!0}).extend({options:z.array(inputOptionSchema.omit({style:!0})).optional()}),authorizationChallengeSchema=z.object({displayName:z.string().optional(),expiresAt:z.string().optional(),instructions:z.string().optional(),url:z.string().optional(),userCode:z.string().optional()}).strict(),authorizationInterruptSchema=z.object({authorization:authorizationChallengeSchema.optional(),description:z.string(),name:z.string(),webhookUrl:z.string().optional()}).strict(),turnOutcomeSchema=z.discriminatedUnion(`status`,[z.object({message:z.string().optional(),status:z.literal(`completed`)}).strict(),z.object({message:z.string(),status:z.literal(`failed`)}).strict()]),invokeResultSchema=z.discriminatedUnion(`status`,[z.object({resume:invokeResumeSchema,status:z.literal(`running`)}).strict(),z.object({requests:z.array(invocationInputRequestSchema).readonly(),resume:invokeResumeSchema,status:z.literal(`input-required`)}).strict(),z.object({authorizations:z.array(authorizationInterruptSchema).min(1).readonly(),resume:invokeResumeSchema,status:z.literal(`authorization-required`)}).strict(),z.object({outcome:turnOutcomeSchema,resume:invokeResumeSchema,status:z.literal(`ready`)}).strict(),z.object({message:z.string(),status:z.literal(`failed`)}).strict(),z.object({code:z.string().optional(),message:z.string(),resume:invokeResumeSchema.optional(),status:z.literal(`authentication-required`)}).strict()]);function projectInvocationInputRequest(e){let{allowFreeform:t,kind:n,options:r,prompt:i,requestId:a}=e;return{allowFreeform:t,kind:n,options:r?.map(({description:e,id:t,label:n})=>({description:e,id:t,label:n})),prompt:i,requestId:a}}function parseInvokeResumeInput(e){let t=invokeResultSchema.safeParse(e);if(t.success&&`resume`in t.data&&t.data.resume!==void 0)return t.data;throw Error(`Resume JSON is not a valid resumable eve invoke result.`)}const invokeResultJsonSchema={...z.toJSONSchema(invokeResultSchema,{io:`input`,target:`draft-2020-12`,unrepresentable:`any`}),$id:`https://eve.dev/schemas/invoke-result.json`,title:`eve invoke result`};export{invokeResultJsonSchema,parseInvokeResumeInput,projectInvocationInputRequest};
1
+ import{inputOptionSchema,inputRequestSchema}from"#client/index.js";import{z}from"#compiled/zod/index.js";const sessionCursorSchema=z.object({continuationToken:z.string().optional(),sessionId:z.string().min(1),streamIndex:z.number().int().nonnegative()}).strict(),targetSchema=z.discriminatedUnion(`kind`,[z.object({kind:z.literal(`local`)}).strict(),z.object({kind:z.literal(`remote`),serverUrl:z.url()}).strict()]),invokeResumeSchema=z.object({session:sessionCursorSchema,target:targetSchema}).strict(),invocationInputRequestSchema=inputRequestSchema.omit({action:!0,display:!0,options:!0}).extend({options:z.array(inputOptionSchema.omit({style:!0})).optional()}),authorizationChallengeSchema=z.object({displayName:z.string().optional(),expiresAt:z.string().optional(),instructions:z.string().optional(),url:z.string().optional(),userCode:z.string().optional()}).strict(),authorizationInterruptSchema=z.object({authorization:authorizationChallengeSchema.optional(),description:z.string(),name:z.string(),webhookUrl:z.string().optional()}).strict(),turnOutcomeSchema=z.discriminatedUnion(`status`,[z.object({message:z.string().optional(),status:z.literal(`completed`)}).strict(),z.object({message:z.string(),status:z.literal(`failed`)}).strict()]),invokeResultSchema=z.discriminatedUnion(`status`,[z.object({resume:invokeResumeSchema,status:z.literal(`running`)}).strict(),z.object({requests:z.array(invocationInputRequestSchema).readonly(),resume:invokeResumeSchema,status:z.literal(`input-required`)}).strict(),z.object({authorizations:z.array(authorizationInterruptSchema).min(1).readonly(),resume:invokeResumeSchema,status:z.literal(`authorization-required`)}).strict(),z.object({outcome:turnOutcomeSchema,resume:invokeResumeSchema,status:z.literal(`ready`)}).strict(),z.object({message:z.string(),status:z.literal(`failed`)}).strict(),z.object({code:z.string().optional(),message:z.string(),resume:invokeResumeSchema.optional(),status:z.literal(`authentication-required`)}).strict()]);function projectInvocationInputRequest(e){let{allowFreeform:t,kind:n,options:r,prompt:i,requestId:a}=e;return{allowFreeform:t,kind:n,options:r?.map(({description:e,id:t,label:n})=>({description:e,id:t,label:n})),prompt:i,requestId:a}}function parseInvokeResumeInput(e){let t=invokeResultSchema.safeParse(e);if(t.success&&`resume`in t.data&&t.data.resume!==void 0)return t.data;throw Error(`Resume JSON is not a valid resumable eve invoke result.`)}const invokeResultJsonSchema={...z.toJSONSchema(invokeResultSchema,{io:`input`,target:`draft-2020-12`,unrepresentable:`any`}),$id:`https://eve.dev/schemas/invoke-result.json`,title:`eve invoke result`};export{invokeResultJsonSchema,parseInvokeResumeInput,projectInvocationInputRequest};
@@ -1,5 +1,6 @@
1
1
  import { type BuildHost } from "#cli/commands/build.js";
2
2
  import { resolveDevUiMode, resolveTuiDisplayOptions } from "#cli/dev/ui-options.js";
3
+ import { type ResolveVerifiedRemoteDevelopmentClient, type RunAcpServer } from "#cli/acp/command.js";
3
4
  import type { RunDevelopmentTuiInput } from "#cli/dev/tui/tui.js";
4
5
  import type { EvalCliOptions } from "#evals/cli/eval.js";
5
6
  import { type InvokeCliRuntimeDependencies } from "#cli/invoke/command.js";
@@ -16,6 +17,8 @@ interface CliRuntimeDependencies {
16
17
  readonly serverUrl: string;
17
18
  }): Promise<boolean>;
18
19
  buildHost: BuildHost;
20
+ resolveVerifiedRemoteDevelopmentClient: ResolveVerifiedRemoteDevelopmentClient;
21
+ runAcpServer: RunAcpServer;
19
22
  printApplicationInfo(logger: CliLogger, appRoot: string, options?: {
20
23
  json?: boolean;
21
24
  }): Promise<void>;
@@ -1,4 +1,4 @@
1
- import{createLogger}from"#internal/logging.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{eveCliBanner}from"#cli/banner.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{Command,CommanderError,InvalidArgumentError}from"#compiled/commander/index.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"#cli/dev/url-target.js";import{parseDevelopmentServerUrl}from"#cli/dev/url.js";import{registerBuildCommand}from"#cli/commands/build.js";import{resolveApplicationRoot}from"#internal/application/paths.js";import{registerIntegrationCommands}from"#cli/commands/register-integration-commands.js";import{registerProjectCommands}from"#cli/commands/register-project-commands.js";import{registerRegistryCommands}from"#cli/commands/register-registry-commands.js";import{resolveDevUiMode,resolveTuiDisplayOptions}from"#cli/dev/ui-options.js";import{FORCED_EXIT_BACKSTOP_MS,installShutdownSignal,waitForShutdownSignal}from"#cli/shutdown.js";import{waitForServerOrStop,waitForUiOrServer}from"#cli/dev/wait-for-ui.js";import{registerRuntimeInvokeCommand}from"#cli/invoke/command.js";import{parseContextSizeOption,parseDisplayMode,parseLogsMode,parsePortOption,parseStatsMode}from"#cli/option-parsers.js";import{resolveTuiTitle}from"#cli/dev/tui/target.js";import{resumeDevelopmentRuntimeArtifacts,suspendDevelopmentRuntimeArtifacts}from"#services/dev-client/runtime-artifacts.js";const devBootLog=createLogger(`dev.boot`);function createDevBootProgressReporter(e){return t=>{switch(t.type){case`phase-started`:e?.update(`Building your agent`,t.phase),devBootLog.debug(t.phase);return;case`phase-finished`:devBootLog.debug(`${t.phase} finished`,{ms:t.elapsedMs});return;case`before-first-paint`:e?.stop();return;default:return t}}}async function loadPrintApplicationInfo(){return(await import(`#cli/commands/info.js`)).printApplicationInfo}async function loadRunDevelopmentTui(){return(await import(`#cli/dev/tui/tui.js`)).runDevelopmentTui}async function loadRunEvalCommand(){return(await import(`#evals/cli/eval.js`)).runEvalCommand}async function loadStartHost(){return(await import(`#cli/dev/local-server-process.js`)).createDevelopmentServer}const loadIsActiveDevelopmentServerForApp=async()=>(await import(`#internal/nitro/host.js`)).isActiveDevelopmentServerForApp;async function loadStartProductionHost(){return(await import(`#internal/nitro/host.js`)).startProductionServer}function hasInteractiveTerminal(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}function createCliProgram(e,i){let c=resolveApplicationRoot(),y=resolveInstalledPackageInfo().version,b=new Command,x=createCliTheme();b.name(`eve`).description(`Build and run an eve application.`).version(y).showHelpAfterError().exitOverride().hook(`preAction`,(t,n)=>{[`info`,`dev`,`init`].includes(n.name())&&e.log(eveCliBanner())}).configureOutput({writeErr:t=>{e.error(t.trimEnd())},writeOut:t=>{e.log(t.trimEnd())}}),b.command(`channels`).description(`Manage user-authored channels in the current project.`).command(`list`).description(`List user-authored channels in the current project.`).option(`--json`,`Output as JSON`).action(async t=>{let{runChannelsListCommand:n}=await import(`#cli/commands/channels.js`);await n(e,c,t)}),registerIntegrationCommands({program:b,logger:e,appRoot:c});let S=b.command(`extension`).description(`Create and build reusable eve extension packages.`);S.command(`init [target]`).description(`Create a new eve extension package.`).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,n)=>{n.yes&&e.error(`warning: --yes has no effect for eve extension init.`);let{runExtensionInitCommand:r}=await import(`#cli/commands/extension-init.js`);await r(e,c,t)}),S.command(`build`).description(`Build the current package as an eve extension.`).action(async()=>{let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);t(c);let{runExtensionBuildCommand:n}=await import(`#cli/commands/extension-build.js`);await n(e,c)}),registerRegistryCommands({program:b,logger:e,appRoot:c}),b.command(`init [target]`).description(`Create a new eve agent, or add one to an existing project directory.`).option(`--channel-web-nextjs`,`Add the Web Chat application (Next.js)`).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,n)=>{n.yes&&e.error(`warning: --yes has no effect for eve init.`);let{runInitCommand:r}=await import(`#cli/commands/init.js`);await r(e,c,t,{channelWebNextjs:n.channelWebNextjs})}),registerProjectCommands({program:b,logger:e,appRoot:c}),registerBuildCommand({appRoot:c,buildHost:i.buildHost,logger:e,program:b}),b.command(`start`).description(`Start a built eve application.`).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 3000)`,parsePortOption).action(async t=>{let{loadDevelopmentEnvironmentFiles:n}=await import(`#cli/dev/environment.js`);n(c);let a=await(i.startProductionHost??await loadStartProductionHost())(c,{host:t.host,port:t.port});e.log(renderCliTaggedLine(x,{message:`server listening at ${a.url}`,tag:`start`,tone:`success`})),await waitForShutdownSignal({close:()=>a.close(),wait:()=>a.wait()})}),registerRuntimeInvokeCommand({appRoot:c,logger:e,program:b,runtime:i}),b.command(`dev`).description(`Start the eve development server or connect to an existing URL.`).argument(`[url]`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 2000)`,parsePortOption).option(`-u, --url <url>`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`-H, --header <header>`,`Request header for a URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).option(`--no-ui`,`Start the server without an interactive UI`).option(`--name <name>`,`Title shown in the terminal UI (defaults to the app folder name)`).option(`--input <text>`,`Pre-fill the prompt input, or start onboarding with /model`).option(`--tools <mode>`,`How tool calls render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--reasoning <mode>`,`How reasoning renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--subagents <mode>`,`How subagent sections render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--connection-auth <mode>`,`How connection authorization renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--assistant-response-stats <mode>`,`Assistant header statistic: tokens | tokensPerSecond`,parseStatsMode).option(`--context-size <tokens>`,`Model context window size, shown as a usage percentage`,parseContextSizeOption).option(`--logs <mode>`,`Which server/agent logs to show: all | stderr | sandbox | none`,parseLogsMode).addHelpText(`after`,`
1
+ import{createLogger}from"#internal/logging.js";import{Command,CommanderError,InvalidArgumentError}from"#compiled/commander/index.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"#cli/dev/url-target.js";import{parseDevelopmentServerUrl}from"#cli/dev/url.js";import{FORCED_EXIT_BACKSTOP_MS,installShutdownSignal,waitForShutdownSignal}from"#cli/shutdown.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{eveCliBanner}from"#cli/banner.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{registerBuildCommand}from"#cli/commands/build.js";import{resolveApplicationRoot}from"#internal/application/paths.js";import{registerIntegrationCommands}from"#cli/commands/register-integration-commands.js";import{registerProjectCommands}from"#cli/commands/register-project-commands.js";import{registerRegistryCommands}from"#cli/commands/register-registry-commands.js";import{resolveDevUiMode,resolveTuiDisplayOptions}from"#cli/dev/ui-options.js";import{registerAcpCommand}from"#cli/acp/command.js";import{waitForServerOrStop,waitForUiOrServer}from"#cli/dev/wait-for-ui.js";import{registerRuntimeInvokeCommand}from"#cli/invoke/command.js";import{parseContextSizeOption,parseDisplayMode,parseLogsMode,parsePortOption,parseStatsMode}from"#cli/option-parsers.js";import{resolveTuiTitle}from"#cli/dev/tui/target.js";import{resumeDevelopmentRuntimeArtifacts,suspendDevelopmentRuntimeArtifacts}from"#services/dev-client/runtime-artifacts.js";const devBootLog=createLogger(`dev.boot`);function createDevBootProgressReporter(e){return t=>{switch(t.type){case`phase-started`:e?.update(`Building your agent`,t.phase),devBootLog.debug(t.phase);return;case`phase-finished`:devBootLog.debug(`${t.phase} finished`,{ms:t.elapsedMs});return;case`before-first-paint`:e?.stop();return;default:return t}}}async function loadPrintApplicationInfo(){return(await import(`#cli/commands/info.js`)).printApplicationInfo}async function loadRunDevelopmentTui(){return(await import(`#cli/dev/tui/tui.js`)).runDevelopmentTui}async function loadRunEvalCommand(){return(await import(`#evals/cli/eval.js`)).runEvalCommand}async function loadStartHost(){return(await import(`#cli/dev/local-server-process.js`)).createDevelopmentServer}const loadIsActiveDevelopmentServerForApp=async()=>(await import(`#internal/nitro/host.js`)).isActiveDevelopmentServerForApp;async function loadStartProductionHost(){return(await import(`#internal/nitro/host.js`)).startProductionServer}function hasInteractiveTerminal(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}function createCliProgram(e,n){let f=resolveApplicationRoot(),y=resolveInstalledPackageInfo().version,b=new Command,x=createCliTheme();b.name(`eve`).description(`Build and run an eve application.`).version(y).showHelpAfterError().exitOverride().hook(`preAction`,(t,n)=>{[`info`,`dev`,`init`].includes(n.name())&&e.log(eveCliBanner())}).configureOutput({writeErr:t=>{e.error(t.trimEnd())},writeOut:t=>{e.log(t.trimEnd())}}),b.command(`channels`).description(`Manage user-authored channels in the current project.`).command(`list`).description(`List user-authored channels in the current project.`).option(`--json`,`Output as JSON`).action(async t=>{let{runChannelsListCommand:n}=await import(`#cli/commands/channels.js`);await n(e,f,t)}),registerIntegrationCommands({program:b,logger:e,appRoot:f});let S=b.command(`extension`).description(`Create and build reusable eve extension packages.`);S.command(`init [target]`).description(`Create a new eve extension package.`).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,n)=>{n.yes&&e.error(`warning: --yes has no effect for eve extension init.`);let{runExtensionInitCommand:r}=await import(`#cli/commands/extension-init.js`);await r(e,f,t)}),S.command(`build`).description(`Build the current package as an eve extension.`).action(async()=>{let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);t(f);let{runExtensionBuildCommand:n}=await import(`#cli/commands/extension-build.js`);await n(e,f)}),registerRegistryCommands({program:b,logger:e,appRoot:f}),b.command(`init [target]`).description(`Create a new eve agent, or add one to an existing project directory.`).option(`--channel-web-nextjs`,`Add the Web Chat application (Next.js)`).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,n)=>{n.yes&&e.error(`warning: --yes has no effect for eve init.`);let{runInitCommand:r}=await import(`#cli/commands/init.js`);await r(e,f,t,{channelWebNextjs:n.channelWebNextjs})}),registerProjectCommands({program:b,logger:e,appRoot:f}),registerBuildCommand({appRoot:f,buildHost:n.buildHost,logger:e,program:b}),b.command(`start`).description(`Start a built eve application.`).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 3000)`,parsePortOption).action(async t=>{let{loadDevelopmentEnvironmentFiles:r}=await import(`#cli/dev/environment.js`);r(f);let i=await(n.startProductionHost??await loadStartProductionHost())(f,{host:t.host,port:t.port});e.log(renderCliTaggedLine(x,{message:`server listening at ${i.url}`,tag:`start`,tone:`success`})),await waitForShutdownSignal({close:()=>i.close(),wait:()=>i.wait()})}),registerRuntimeInvokeCommand({appRoot:f,logger:e,program:b,runtime:n}),registerAcpCommand({appRoot:f,eveVersion:y,program:b,resolveVerifiedRemoteDevelopmentClient:n.resolveVerifiedRemoteDevelopmentClient,runAcpServer:n.runAcpServer,startHost:n.startHost}),b.command(`dev`).description(`Start the eve development server or connect to an existing URL.`).argument(`[url]`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 2000)`,parsePortOption).option(`-u, --url <url>`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`-H, --header <header>`,`Request header for a URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).option(`--no-ui`,`Start the server without an interactive UI`).option(`--name <name>`,`Title shown in the terminal UI (defaults to the app folder name)`).option(`--input <text>`,`Pre-fill the prompt input, or start onboarding with /model`).option(`--tools <mode>`,`How tool calls render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--reasoning <mode>`,`How reasoning renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--subagents <mode>`,`How subagent sections render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--connection-auth <mode>`,`How connection authorization renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--assistant-response-stats <mode>`,`Assistant header statistic: tokens | tokensPerSecond`,parseStatsMode).option(`--context-size <tokens>`,`Model context window size, shown as a usage percentage`,parseContextSizeOption).option(`--logs <mode>`,`Which server/agent logs to show: all | stderr | sandbox | none`,parseLogsMode).addHelpText(`after`,`
2
2
  You can also pass a bare URL, for example: eve dev https://example.com
3
- `).action(async(t,n)=>{let a=resolveDevelopmentUrlTarget(n,t),s=a?.serverUrl,u=hasInteractiveTerminal(),f=resolveDevUiMode({options:n,interactive:u});if(n.input!==void 0&&f===`headless`)throw new InvalidArgumentError(`--input requires the interactive UI.`);let p=!1;s!==void 0&&(p=await(i.isActiveDevelopmentServerForApp??await loadIsActiveDevelopmentServerForApp())({appRoot:c,serverUrl:s}));let runInteractiveUi=async(e,t,r)=>{let o=await devBootPhase(`loading interactive UI`,async()=>i.runDevelopmentTui??await loadRunDevelopmentTui(),t),l=resolveTuiDisplayOptions(n),u=s===void 0||p?{kind:`local`,serverUrl:e.serverUrl,workspaceRoot:e.appRoot??c}:{kind:`remote`,serverUrl:e.serverUrl,workspaceRoot:c},d=resolveTuiTitle({name:n.name,target:u});d!==void 0&&(l.name=d);let f={target:u,initialInput:n.input,onBootProgress:t,lifecycle:r,...l};u.kind===`local`&&(f.withExclusiveTerminal=async t=>await(async()=>{if(!await suspendDevelopmentRuntimeArtifacts({serverUrl:e.serverUrl}))throw Error(`Could not pause the development server for integration setup.`);try{return await t()}finally{await resumeDevelopmentRuntimeArtifacts({serverUrl:e.serverUrl,silent:!0})}})()),a?.headers===void 0?await o(f):await o({...f,headers:a.headers})};if(s){let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);if(t(c),e.log(`↗ ${p?`local`:`remote`} mode targeting ${x.info(new URL(s).host)}`),f===`headless`){e.log(renderCliTaggedLine(x,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`}));return}e.log(``);let n=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS});try{await runInteractiveUi({serverUrl:s},void 0,n)}finally{n.dispose()}return}f===`tui`&&e.log(``);let m=f===`tui`?startCliLiveRow(e):void 0,h=createDevBootProgressReporter(m);m?.update(`Building your agent`);let g,_,closeServer=()=>g===void 0?Promise.resolve():(_??=g.close(),_.catch(()=>void 0),_),v=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS,onStop:()=>{closeServer()}});try{g=(i.startHost??await loadStartHost())(c,{existing:f===`tui`?`attach-if-unconfigured`:`reject`,host:n.host,onBootProgress:h,port:n.port});let t=(await Promise.race([g.start().then(e=>({handle:e})),v.stopped.then(()=>({handle:void 0}))])).handle;if(t===void 0)return;if(f!==`tui`&&e.log(renderCliTaggedLine(x,{message:`server listening at ${t.url}`,tag:`dev`,tone:`success`})),f===`headless`){n.ui!==!1&&!u&&e.log(renderCliTaggedLine(x,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`})),await waitForServerOrStop(g,v);return}await waitForUiOrServer({handle:t,lifecycle:v,server:g,runUi:async()=>await runInteractiveUi({appRoot:t.appRoot,serverUrl:t.url},h,v)})}finally{m?.stop(),await closeServer(),v.dispose()}});let C=b.command(`logs`).description("Inspect local `eve dev` diagnostic logs (.eve/logs).");return C.command(`show [logid]`,{isDefault:!0}).description(`Print a diagnostic log (the most recent when logid is omitted).`).option(`--dump`,`Prepend the log's environment dump (.dump sibling)`).option(`--events`,`Interleave session events from the local workflow store`).action(async(t,n)=>{let{runLogsShowCommand:r}=await import(`#cli/commands/logs.js`);await r(e,c,t,n)}),C.command(`ls`).description(`List diagnostic logs, most recent first.`).option(`--json`,`Output as JSON`).action(async t=>{let{runLogsListCommand:n}=await import(`#cli/commands/logs.js`);await n(e,c,t)}),b.command(`traces [trace]`).usage(`[options] [trace]
4
- eve traces ls [options]`).description("Show a local `eve dev` trace (the most recent when trace is omitted).").action(async t=>{let{runTraceShowCommand:n}=await import(`#cli/commands/trace.js`);await n(e,c,t)}).command(`ls`).description(`List local traces, most recent first.`).option(`--json`,`Output as JSON`).action(async t=>{let{runTraceListCommand:n}=await import(`#cli/commands/trace.js`);await n(e,c,t)}),b.command(`info`).description(`Print resolved application information.`).option(`--json`,`Output as JSON`).action(async t=>{await(i.printApplicationInfo??await loadPrintApplicationInfo())(e,c,t)}),b.command(`eval`).description(`Run evals against an eve agent.`).argument(`[evalIds...]`,`Eval ids (or directory prefixes) to run (all discovered evals when omitted)`).option(`--url <url>`,`Remote agent URL (skip local host startup)`,parseDevelopmentServerUrl).option(`--tag <tag...>`,`Run only evals carrying a tag`).option(`--exclude-tag <tag...>`,`Skip evals carrying a tag`).option(`--strict`,`Fail the exit code when any score falls below its threshold`).option(`--list`,`Print discovered evals without running them`).option(`--timeout <ms>`,`Per-eval timeout in milliseconds`).option(`--max-concurrency <n>`,`Max concurrent eval executions`).option(`--json`,`Output results as JSON`).option(`--junit <path>`,`Write JUnit XML results to a file`).option(`--skip-report`,`Skip eval-defined reporters (e.g. Braintrust)`).option(`--verbose`,`Stream per-eval t.log lines to stdout`).action(async(t,n)=>{await(i.runEvalCommand??await loadRunEvalCommand())(t,n,e)}),b}async function runCli(e=process.argv.slice(2),t=console,n={}){let r=createCliProgram(t,n),a=e.length===0?[`dev`]:e;try{await r.parseAsync(a,{from:`user`})}catch(e){if(e instanceof CommanderError){if(e.exitCode===0)return;let r=await(n.isCodingAgentLaunch??isCodingAgentLaunch)();if(a[0]===`init`&&r){let{initAgentInstructions:e}=await import(`#cli/commands/agent-instructions.js`);t.log(e())}throw Error(e.message)}throw e}}export{resolveDevUiMode,resolveTuiDisplayOptions,runCli};
3
+ `).action(async(t,i)=>{let o=resolveDevelopmentUrlTarget(i,t),l=o?.serverUrl,u=hasInteractiveTerminal(),d=resolveDevUiMode({options:i,interactive:u});if(i.input!==void 0&&d===`headless`)throw new InvalidArgumentError(`--input requires the interactive UI.`);let p=!1;l!==void 0&&(p=await(n.isActiveDevelopmentServerForApp??await loadIsActiveDevelopmentServerForApp())({appRoot:f,serverUrl:l}));let runInteractiveUi=async(e,t,r)=>{let a=await devBootPhase(`loading interactive UI`,async()=>n.runDevelopmentTui??await loadRunDevelopmentTui(),t),s=resolveTuiDisplayOptions(i),c=l===void 0||p?{kind:`local`,serverUrl:e.serverUrl,workspaceRoot:e.appRoot??f}:{kind:`remote`,serverUrl:e.serverUrl,workspaceRoot:f},u=resolveTuiTitle({name:i.name,target:c});u!==void 0&&(s.name=u);let d={target:c,initialInput:i.input,onBootProgress:t,lifecycle:r,...s};c.kind===`local`&&(d.withExclusiveTerminal=async t=>await(async()=>{if(!await suspendDevelopmentRuntimeArtifacts({serverUrl:e.serverUrl}))throw Error(`Could not pause the development server for integration setup.`);try{return await t()}finally{await resumeDevelopmentRuntimeArtifacts({serverUrl:e.serverUrl,silent:!0})}})()),o?.headers===void 0?await a(d):await a({...d,headers:o.headers})};if(l){let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);if(t(f),e.log(`↗ ${p?`local`:`remote`} mode targeting ${x.info(new URL(l).host)}`),d===`headless`){e.log(renderCliTaggedLine(x,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`}));return}e.log(``);let n=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS});try{await runInteractiveUi({serverUrl:l},void 0,n)}finally{n.dispose()}return}d===`tui`&&e.log(``);let m=d===`tui`?startCliLiveRow(e):void 0,h=createDevBootProgressReporter(m);m?.update(`Building your agent`);let g,_,closeServer=()=>g===void 0?Promise.resolve():(_??=g.close(),_.catch(()=>void 0),_),v=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS,onStop:()=>{closeServer()}});try{g=(n.startHost??await loadStartHost())(f,{existing:d===`tui`?`attach-if-unconfigured`:`reject`,host:i.host,onBootProgress:h,port:i.port});let t=(await Promise.race([g.start().then(e=>({handle:e})),v.stopped.then(()=>({handle:void 0}))])).handle;if(t===void 0)return;if(d!==`tui`&&e.log(renderCliTaggedLine(x,{message:`server listening at ${t.url}`,tag:`dev`,tone:`success`})),d===`headless`){i.ui!==!1&&!u&&e.log(renderCliTaggedLine(x,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`})),await waitForServerOrStop(g,v);return}await waitForUiOrServer({handle:t,lifecycle:v,server:g,runUi:async()=>await runInteractiveUi({appRoot:t.appRoot,serverUrl:t.url},h,v)})}finally{m?.stop(),await closeServer(),v.dispose()}});let C=b.command(`logs`).description("Inspect local `eve dev` diagnostic logs (.eve/logs).");return C.command(`show [logid]`,{isDefault:!0}).description(`Print a diagnostic log (the most recent when logid is omitted).`).option(`--dump`,`Prepend the log's environment dump (.dump sibling)`).option(`--events`,`Interleave session events from the local workflow store`).action(async(t,n)=>{let{runLogsShowCommand:r}=await import(`#cli/commands/logs.js`);await r(e,f,t,n)}),C.command(`ls`).description(`List diagnostic logs, most recent first.`).option(`--json`,`Output as JSON`).action(async t=>{let{runLogsListCommand:n}=await import(`#cli/commands/logs.js`);await n(e,f,t)}),b.command(`traces [trace]`).usage(`[options] [trace]
4
+ eve traces ls [options]`).description("Show a local `eve dev` trace (the most recent when trace is omitted).").action(async t=>{let{runTraceShowCommand:n}=await import(`#cli/commands/trace.js`);await n(e,f,t)}).command(`ls`).description(`List local traces, most recent first.`).option(`--json`,`Output as JSON`).action(async t=>{let{runTraceListCommand:n}=await import(`#cli/commands/trace.js`);await n(e,f,t)}),b.command(`info`).description(`Print resolved application information.`).option(`--json`,`Output as JSON`).action(async t=>{await(n.printApplicationInfo??await loadPrintApplicationInfo())(e,f,t)}),b.command(`eval`).description(`Run evals against an eve agent.`).argument(`[evalIds...]`,`Eval ids (or directory prefixes) to run (all discovered evals when omitted)`).option(`--url <url>`,`Remote agent URL (skip local host startup)`,parseDevelopmentServerUrl).option(`--tag <tag...>`,`Run only evals carrying a tag`).option(`--exclude-tag <tag...>`,`Skip evals carrying a tag`).option(`--strict`,`Fail the exit code when any score falls below its threshold`).option(`--list`,`Print discovered evals without running them`).option(`--timeout <ms>`,`Per-eval timeout in milliseconds`).option(`--max-concurrency <n>`,`Max concurrent eval executions`).option(`--json`,`Output results as JSON`).option(`--junit <path>`,`Write JUnit XML results to a file`).option(`--skip-report`,`Skip eval-defined reporters (e.g. Braintrust)`).option(`--verbose`,`Stream per-eval t.log lines to stdout`).action(async(t,r)=>{await(n.runEvalCommand??await loadRunEvalCommand())(t,r,e)}),b}async function runCli(e=process.argv.slice(2),t=console,r={}){let i=createCliProgram(t,r),a=e.length===0?[`dev`]:e;try{await i.parseAsync(a,{from:`user`})}catch(e){if(e instanceof CommanderError){if(e.exitCode===0)return;let n=await(r.isCodingAgentLaunch??isCodingAgentLaunch)();if(a[0]===`init`&&n){let{initAgentInstructions:e}=await import(`#cli/commands/agent-instructions.js`);t.log(e())}throw Error(e.message)}throw e}}export{resolveDevUiMode,resolveTuiDisplayOptions,runCli};
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Alternate-screen mode for full-screen modal views (the `/traces` viewer).
3
+ *
4
+ * The dev TUI's transcript deliberately streams into native scrollback (see
5
+ * `live-region.ts`), but a modal viewer wants the whole terminal without
6
+ * fighting the transcript's repaint cycle. Entering the alternate buffer
7
+ * gives the viewer a blank screen it fully owns; leaving restores the
8
+ * transcript exactly where the user left it.
9
+ *
10
+ * Like {@link LiveRegion}, writes go through the terminal's original `write`
11
+ * captured at construction so foreign-output capture never sees the paints.
12
+ */
13
+ export interface AltScreenOutput {
14
+ write(chunk: string): boolean;
15
+ }
16
+ export declare class AltScreen {
17
+ #private;
18
+ constructor(output: AltScreenOutput);
19
+ get active(): boolean;
20
+ /** Switches to the alternate buffer, hides the cursor, enables SGR mouse. */
21
+ enter(): void;
22
+ /**
23
+ * Paints a full-screen frame. Each row must already be styled and fit
24
+ * within the terminal width (one row == one screen line); rows beyond the
25
+ * terminal height are dropped. The screen is erased before the rows are
26
+ * written — terminals only erase via explicit sequences, so a shrinking
27
+ * frame would otherwise leave stale text behind.
28
+ *
29
+ * Rows are placed with absolute cursor positions rather than `\n`: a row
30
+ * filling the last column leaves terminals in an autowrap-pending state
31
+ * whose interaction with `\n` varies (immediate-wrap terminals insert a
32
+ * phantom line). Absolute positioning is immune to all of it.
33
+ */
34
+ paint(rows: readonly string[], height: number): void;
35
+ /**
36
+ * Writes an out-of-band sequence (e.g. an OSC 52 clipboard write) through
37
+ * the same captured write the paints use, bypassing foreign-output capture.
38
+ */
39
+ writeRaw(chunk: string): void;
40
+ /** Restores the main screen, cursor, and mouse reporting. */
41
+ exit(): void;
42
+ }
@@ -0,0 +1 @@
1
+ var AltScreen=class{#e;#t=!1;constructor(e){this.#e=e.write.bind(e)}get active(){return this.#t}enter(){this.#t||=(this.#e(`\x1B[?1049h\x1B[?25l\x1B[?1002h\x1B[?1006h`),!0)}paint(e,t){if(!this.#t)return;let n=e.slice(0,Math.max(0,t)).map((e,t)=>`[${t+1}H${e}`).join(``);this.#e(`[?2026h${n}[?2026l`)}writeRaw(e){this.#t&&this.#e(e)}exit(){this.#t&&=(this.#e(`\x1B[?1006l\x1B[?1002l\x1B[?25h\x1B[?1049l`),!1)}};export{AltScreen};
@@ -1,5 +1,3 @@
1
- export declare const ansiPattern: RegExp;
2
- export declare const ansiPrefixPattern: RegExp;
3
1
  export declare function stripAnsi(input: string): string;
4
2
  export declare function stripTerminalControls(input: string): string;
5
3
  export declare function visibleLength(input: string): number;
@@ -29,7 +27,10 @@ export declare function offsetAtVisibleColumn(input: string, column: number): nu
29
27
  * Word-wraps a single logical line to `width` visible columns, preserving
30
28
  * ANSI styling and never splitting inside an escape sequence. Breaks on the
31
29
  * last space that fits; falls back to a hard cut for unbreakable runs.
30
+ *
31
+ * Tokenizes once and walks the units with a cursor, so a long unbroken
32
+ * payload wraps in linear time instead of re-measuring the remainder on
33
+ * every emitted row.
32
34
  */
33
35
  export declare function wrapVisibleLine(line: string, width: number): string[];
34
- export declare function codePointWidth(codePoint: number): number;
35
36
  export {};
@@ -1 +1 @@
1
- import{graphemes}from"#shared/text-boundaries.js";const ansiPattern=RegExp(`\x1B\\[[0-?]*[ -/]*[@-~]`,`g`),ansiPrefixPattern=RegExp(`^\x1B\\[[0-?]*[ -/]*[@-~]`),emojiPresentationPattern=/\p{Emoji_Presentation}/u,extendedPictographicPattern=/\p{Extended_Pictographic}/u,keycapPattern=/^[#*0-9]\u{fe0f}?\u{20e3}$/u;function stripAnsi(e){return stripTerminalControls(e.replaceAll(ansiPattern,``))}function stripTerminalControls(e){let t=``,n=0;for(;n<e.length;){let r=e.codePointAt(n);if(r==null)break;let i=String.fromCodePoint(r);n+=i.length,!isUnsafeTerminalControlCodePoint(r)&&(t+=i)}return t}function visibleLength(e){let t=0;for(let n of terminalTextUnits(e))t+=n.width;return t}function sliceVisible(e,t){if(t<=0)return``;let n=``,r=0,i=terminalTextUnits(e),a=0;for(;a<i.length&&r<t;){let e=i[a];if(e.width>0&&r+e.width>t)break;n+=e.text,r+=e.width,a+=1}for(;i[a]?.ansi===!0;)n+=i[a].text,a+=1;return n}function clipVisible(e,t){if(visibleLength(e)<=t)return e;let n=sliceVisible(e,t);return n.includes(`\x1B`)?`${n}`:n}function inputTextWidth(t){let n=0;for(let r of graphemes(t))n+=terminalGraphemeWidth(r.text);return n}function renderInputText(e){return e.replaceAll(` `,` `)}function renderInputWithBlockCursor(e){let t=e.render??renderInputText,n=e.under.length>0?e.under:` `,r=e.visible?e.inverse(renderInputText(n)):t(n);return`${t(e.before)}${r}${t(e.after)}`}function offsetAtVisibleColumn(t,n){if(n<=0)return 0;let r=0;for(let i of graphemes(t)){let e=r+terminalGraphemeWidth(i.text);if(e>n)return i.start;if(e===n)return i.end;r=e}return t.length}function terminalGraphemeWidth(e){let t=0;for(let n of e){let e=n.codePointAt(0);e!==void 0&&(t=Math.max(t,codePointWidth(e)))}return emojiPresentationPattern.test(e)||keycapPattern.test(e)||e.includes(`️`)&&extendedPictographicPattern.test(e)?Math.max(2,t):t}function terminalTextUnits(r){let i=[],a=0;for(;a<r.length;){let o=r.slice(a),s=o.match(ansiPrefixPattern);if(s!==null){i.push({text:s[0],width:0,ansi:!0}),a+=s[0].length;continue}let c=o.search(ansiPattern),l=o.slice(0,c===-1?o.length:c);for(let t of graphemes(l))i.push({text:t.text,width:terminalGraphemeWidth(t.text),ansi:!1});a+=l.length}return i}function wrapVisibleLine(e,t){if(t<=0)return[e];if(e.length===0)return[``];let n=[],r=e;for(;visibleLength(r)>t;){let e=findVisibleBreakPoint(r,t);n.push(r.slice(0,e).trimEnd()),r=r.slice(e).trimStart()}return(r.length>0||n.length===0)&&n.push(r),n}function findVisibleBreakPoint(e,t){let n=sliceVisible(e,t+1).lastIndexOf(` `);if(n>0)return n;let r=sliceVisible(e,t);if(visibleLength(r)>0)return r.length;let i=0,a=!1;for(let t of terminalTextUnits(e)){if(a&&t.width>0)return i;i+=t.text.length,t.width>0&&(a=!0)}return i}function codePointWidth(e){return e===9?4:e<32||e>=127&&e<160||isZeroWidthCodePoint(e)?0:isWideCodePoint(e)?2:1}function isUnsafeTerminalControlCodePoint(e){return e>=0&&e<=8||e>=11&&e<=31||e>=127&&e<=159}function isZeroWidthCodePoint(e){return e>=768&&e<=879||e>=1155&&e<=1161||e>=1425&&e<=1469||e===1471||e>=1473&&e<=1474||e>=1476&&e<=1477||e===1479||e>=1552&&e<=1562||e>=1611&&e<=1631||e===1648||e>=1750&&e<=1756||e>=1759&&e<=1764||e>=1767&&e<=1768||e>=1770&&e<=1773||e===1809||e>=1840&&e<=1866||e>=1958&&e<=1968||e>=2027&&e<=2035||e>=2070&&e<=2073||e>=2075&&e<=2083||e>=2085&&e<=2087||e>=2089&&e<=2093||e>=2137&&e<=2139||e>=2259&&e<=2306||e===2362||e===2364||e>=2369&&e<=2376||e===2381||e>=2385&&e<=2391||e===8205||e>=65024&&e<=65039||e>=917760&&e<=917999}function isWideCodePoint(e){return e>=4352&&(e<=4447||e===9001||e===9002||e>=11904&&e<=42191&&e!==12351||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65135||e>=65280&&e<=65376||e>=65504&&e<=65510||e>=127744&&e<=128591||e>=129280&&e<=129535||e>=131072&&e<=262141)}export{ansiPattern,ansiPrefixPattern,clipVisible,codePointWidth,inputTextWidth,offsetAtVisibleColumn,renderInputText,renderInputWithBlockCursor,sliceVisible,stripAnsi,stripTerminalControls,visibleLength,wrapVisibleLine};
1
+ import{graphemes}from"#shared/text-boundaries.js";const ansiPattern=RegExp(`\x1B\\[[0-?]*[ -/]*[@-~]`,`g`),ansiPrefixPattern=RegExp(`^\x1B\\[[0-?]*[ -/]*[@-~]`),emojiPresentationPattern=/\p{Emoji_Presentation}/u,extendedPictographicPattern=/\p{Extended_Pictographic}/u,keycapPattern=/^[#*0-9]\u{fe0f}?\u{20e3}$/u;function stripAnsi(e){return stripTerminalControls(e.replaceAll(ansiPattern,``))}function stripTerminalControls(e){let t=``,n=0;for(;n<e.length;){let r=e.codePointAt(n);if(r==null)break;let i=String.fromCodePoint(r);n+=i.length,!isUnsafeTerminalControlCodePoint(r)&&(t+=i)}return t}function visibleLength(e){let t=0;for(let n of terminalTextUnits(e))t+=n.width;return t}function sliceVisible(e,t){return sliceUnits(terminalTextUnits(e),0,t)}function sliceUnits(e,t,n){if(n<=0)return``;let r=``,i=0,a=t;for(;a<e.length&&i<n;){let t=e[a];if(t.width>0&&i+t.width>n)break;r+=t.text,i+=t.width,a+=1}for(;e[a]?.ansi===!0;)r+=e[a].text,a+=1;return r}function clipVisible(e,t){if(visibleLength(e)<=t)return e;let n=sliceVisible(e,t);return n.includes(`\x1B`)?`${n}`:n}function inputTextWidth(t){let n=0;for(let r of graphemes(t))n+=terminalGraphemeWidth(r.text);return n}function renderInputText(e){return e.replaceAll(` `,` `)}function renderInputWithBlockCursor(e){let t=e.render??renderInputText,n=e.under.length>0?e.under:` `,r=e.visible?e.inverse(renderInputText(n)):t(n);return`${t(e.before)}${r}${t(e.after)}`}function offsetAtVisibleColumn(t,n){if(n<=0)return 0;let r=0;for(let i of graphemes(t)){let e=r+terminalGraphemeWidth(i.text);if(e>n)return i.start;if(e===n)return i.end;r=e}return t.length}function terminalGraphemeWidth(e){let t=0;for(let n of e){let e=n.codePointAt(0);e!==void 0&&(t=Math.max(t,codePointWidth(e)))}return emojiPresentationPattern.test(e)||keycapPattern.test(e)||e.includes(`️`)&&extendedPictographicPattern.test(e)?Math.max(2,t):t}function terminalTextUnits(r){let i=[],a=0;for(;a<r.length;){let o=r.slice(a),s=o.match(ansiPrefixPattern);if(s!==null){i.push({text:s[0],width:0,ansi:!0}),a+=s[0].length;continue}let c=o.search(ansiPattern),l=o.slice(0,c===-1?o.length:c);for(let t of graphemes(l))i.push({text:t.text,width:terminalGraphemeWidth(t.text),ansi:!1});a+=l.length}return i}function wrapVisibleLine(e,t){if(t<=0)return[e];let n=terminalTextUnits(e),r=0;for(let e of n)r+=e.width;let i=[],a=0,o=0,consume=()=>{let e=n[a];o+=e.text.length,r-=e.width,a+=1};for(;r>t;){let r=findVisibleBreakPoint(n,a,t);i.push(e.slice(o,o+r).trimEnd());let s=o+r;for(;o<s&&a<n.length;)consume();for(;a<n.length;){let e=n[a];if(e.ansi||e.text.trimStart().length>0)break;consume()}}let s=e.slice(o);return(s.length>0||i.length===0)&&i.push(s),i}function findVisibleBreakPoint(e,t,n){let r=sliceUnits(e,t,n+1).lastIndexOf(` `);if(r>0)return r;let i=sliceUnits(e,t,n);if(visibleLength(i)>0)return i.length;let a=0,o=!1;for(let n=t;n<e.length;n+=1){let t=e[n];if(o&&t.width>0)return a;a+=t.text.length,t.width>0&&(o=!0)}return a}function codePointWidth(e){return e===9?4:e<32||e>=127&&e<160||isZeroWidthCodePoint(e)?0:isWideCodePoint(e)?2:1}function isUnsafeTerminalControlCodePoint(e){return e>=0&&e<=8||e>=11&&e<=31||e>=127&&e<=159}function isZeroWidthCodePoint(e){return e>=768&&e<=879||e>=1155&&e<=1161||e>=1425&&e<=1469||e===1471||e>=1473&&e<=1474||e>=1476&&e<=1477||e===1479||e>=1552&&e<=1562||e>=1611&&e<=1631||e===1648||e>=1750&&e<=1756||e>=1759&&e<=1764||e>=1767&&e<=1768||e>=1770&&e<=1773||e===1809||e>=1840&&e<=1866||e>=1958&&e<=1968||e>=2027&&e<=2035||e>=2070&&e<=2073||e>=2075&&e<=2083||e>=2085&&e<=2087||e>=2089&&e<=2093||e>=2137&&e<=2139||e>=2259&&e<=2306||e===2362||e===2364||e>=2369&&e<=2376||e===2381||e>=2385&&e<=2391||e===8205||e>=65024&&e<=65039||e>=917760&&e<=917999}function isWideCodePoint(e){return e>=4352&&(e<=4447||e===9001||e===9002||e>=11904&&e<=42191&&e!==12351||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65135||e>=65280&&e<=65376||e>=65504&&e<=65510||e>=127744&&e<=128591||e>=129280&&e<=129535||e>=131072&&e<=262141)}export{clipVisible,inputTextWidth,offsetAtVisibleColumn,renderInputText,renderInputWithBlockCursor,sliceVisible,stripAnsi,stripTerminalControls,visibleLength,wrapVisibleLine};
@@ -7,7 +7,7 @@ export { createDataUrlFilePart, createTextWithFileContent } from "#client/file-p
7
7
  export { MessageResponse } from "#client/message-response.js";
8
8
  export { ClientSession } from "#client/session.js";
9
9
  export type { EveAgentStoreCallbacks, EveAgentStoreInit, EveAgentStoreSnapshot, EveAgentStoreStatus, PrepareSend, } from "#client/eve-agent-store.js";
10
- export type { AgentInfoEntry, AgentInfoChannelEntry, AgentInfoChannels, AgentInfoConnectionEntry, AgentInfoDynamicResolverEntry, AgentInfoFrameworkChannelEntry, AgentInfoFrameworkToolEntry, AgentInfoHookEntry, AgentInfoInstructions, AgentInfoInstructionsEntry, AgentInfoResult, AgentInfoSandboxEntry, AgentInfoScheduleEntry, AgentInfoSkillEntry, AgentInfoSource, AgentInfoSubagentEntry, AgentInfoToolEntry, AgentInfoTools, CancelSessionResult, ClientAuth, ClientOptions, ClientRedirectPolicy, HeadersValue, HealthResult, MessageResult, ResetResult, ResolvedStreamReconnectPolicy, SendTurnInput, SendTurnPayload, SessionState, StreamOptions, StreamReconnectPolicy, StreamReconnectRetryPolicy, TokenValue, } from "#client/types.js";
10
+ export type { AgentInfoEntry, AgentInfoChannelEntry, AgentInfoChannels, AgentInfoConnectionEntry, AgentInfoDynamicResolverEntry, AgentInfoFrameworkChannelEntry, AgentInfoFrameworkToolEntry, AgentInfoHookEntry, AgentInfoInstructions, AgentInfoInstructionsEntry, AgentInfoResult, AgentInfoSandboxEntry, AgentInfoScheduleEntry, AgentInfoSkillEntry, AgentInfoSource, AgentInfoSubagentEntry, AgentInfoToolEntry, AgentInfoTools, CancelSessionResult, ClientAuth, ClientOptions, ClientRedirectPolicy, HeadersValue, HealthResult, MessageResult, ResetResult, ResolvedStreamReconnectPolicy, SendTurnInput, SendTurnPayload, SessionSnapshot, SessionState, StreamOptions, StreamReconnectPolicy, StreamReconnectRetryPolicy, TokenValue, } from "#client/types.js";
11
11
  export type { EveAgentReducer, EveAgentReducerEvent, ClientInputRespondedEvent, ClientMessageFailedEvent, ClientMessageSubmittedEvent, } from "#client/reducer.js";
12
12
  export type { EveAuthorizationChallenge, EveAuthorizationOutcome, EveAuthorizationPart, EveMessageData, EveDynamicToolPart, EveMessageInputRequest, EveMessage, EveMessageMetadata, EveMessagePart, EveMessageToolMetadata, } from "#client/message-reducer.js";
13
13
  export type { ActionResultStreamEvent, ActionsRequestedStreamEvent, AssistantStepFinishReason, AuthorizationOutcome, CompactionCompletedStreamEvent, CompactionRequestedStreamEvent, AuthorizationCompletedStreamEvent, ConnectionAuthorizationOutcome, AuthorizationRequiredStreamEvent, HandleMessageStreamEvent, MessageStreamEventMeta, InputRequestedStreamEvent, MessageAppendedStreamEvent, MessageCompletedStreamEvent, MessageReceivedPart, MessageReceivedStreamEvent, ReasoningAppendedStreamEvent, ReasoningCompletedStreamEvent, ResultCompletedStreamEvent, SessionCompletedStreamEvent, SessionFailedStreamEvent, SessionStartedStreamEvent, SessionWaitingStreamEvent, MessageStreamEvent, StepCompletedStreamEvent, StepFailedStreamEvent, StepStartedStreamEvent, SubagentCalledStreamEvent, SubagentChildEventStreamEvent, SubagentCompletedStreamEvent, SubagentStartedStreamEvent, TurnCancelledStreamEvent, TurnCompletedStreamEvent, TurnFailedStreamEvent, TurnStartedStreamEvent, TurnFailureStreamEvent, } from "#protocol/message.js";