eve 0.69.0 → 0.70.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/dist/src/acp/adapter.js +1 -1
  3. package/dist/src/channel/task-card.d.ts +3 -3
  4. package/dist/src/channel/task-card.js +1 -1
  5. package/dist/src/channel/types.d.ts +18 -0
  6. package/dist/src/chunks/{use-eve-agent-Dab2MnT2.js → use-eve-agent-CJQeE7-t.js} +1873 -1236
  7. package/dist/src/chunks/{use-eve-agent-D_5129A9.js → use-eve-agent-DdemtY6C.js} +1874 -1234
  8. package/dist/src/cli/dev/command.js +1 -1
  9. package/dist/src/cli/dev/console-records-preload.d.ts +1 -0
  10. package/dist/src/cli/dev/console-records-preload.js +1 -0
  11. package/dist/src/cli/dev/console-records.d.ts +17 -0
  12. package/dist/src/cli/dev/console-records.js +3 -0
  13. package/dist/src/cli/dev/diagnostic-sink.d.ts +1 -0
  14. package/dist/src/cli/dev/local-server-process.js +1 -1
  15. package/dist/src/cli/dev/tui/blocks.d.ts +2 -1
  16. package/dist/src/cli/dev/tui/blocks.js +3 -3
  17. package/dist/src/cli/dev/tui/conversation-view.d.ts +54 -0
  18. package/dist/src/cli/dev/tui/conversation-view.js +1 -0
  19. package/dist/src/cli/dev/tui/flow-drawer.d.ts +5 -2
  20. package/dist/src/cli/dev/tui/flow-drawer.js +1 -1
  21. package/dist/src/cli/dev/tui/log-display-mode.d.ts +4 -10
  22. package/dist/src/cli/dev/tui/log-display-mode.js +1 -1
  23. package/dist/src/cli/dev/tui/message-queue.d.ts +7 -63
  24. package/dist/src/cli/dev/tui/message-queue.js +3 -1
  25. package/dist/src/cli/dev/tui/prompt-commands.d.ts +7 -7
  26. package/dist/src/cli/dev/tui/prompt-commands.js +1 -1
  27. package/dist/src/cli/dev/tui/question-panel.d.ts +3 -1
  28. package/dist/src/cli/dev/tui/question-panel.js +1 -1
  29. package/dist/src/cli/dev/tui/runner.d.ts +58 -195
  30. package/dist/src/cli/dev/tui/runner.js +3 -3
  31. package/dist/src/cli/dev/tui/task-activity.d.ts +11 -24
  32. package/dist/src/cli/dev/tui/task-activity.js +1 -1
  33. package/dist/src/cli/dev/tui/task-records.d.ts +17 -0
  34. package/dist/src/cli/dev/tui/task-records.js +1 -0
  35. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +15 -37
  36. package/dist/src/cli/dev/tui/terminal-renderer.js +10 -13
  37. package/dist/src/cli/dev/tui/terminal-tool-part.d.ts +2 -0
  38. package/dist/src/cli/dev/tui/terminal-tool-part.js +1 -0
  39. package/dist/src/cli/dev/tui/test/fake-eve-server.d.ts +34 -0
  40. package/dist/src/cli/dev/tui/test/fake-eve-server.js +1 -0
  41. package/dist/src/cli/dev/tui/test/index.d.ts +1 -0
  42. package/dist/src/cli/dev/tui/test/index.js +1 -1
  43. package/dist/src/cli/dev/tui/tool-block-groups.js +1 -1
  44. package/dist/src/cli/dev/tui/tool-presentation.d.ts +1 -0
  45. package/dist/src/cli/dev/tui/tool-presentation.js +1 -1
  46. package/dist/src/cli/dev/tui/tool-rows.d.ts +1 -0
  47. package/dist/src/cli/dev/tui/tool-rows.js +2 -2
  48. package/dist/src/cli/dev/tui/transcript-parts.d.ts +81 -0
  49. package/dist/src/cli/dev/tui/transcript-parts.js +3 -0
  50. package/dist/src/cli/dev/tui/transcript.d.ts +47 -0
  51. package/dist/src/cli/dev/tui/transcript.js +1 -0
  52. package/dist/src/cli/dev/tui/tui.js +1 -1
  53. package/dist/src/cli/dev/tui/turn-clock.d.ts +11 -26
  54. package/dist/src/cli/dev/tui/turn-clock.js +1 -1
  55. package/dist/src/cli/dev/tui/types.d.ts +2 -4
  56. package/dist/src/cli/dev/ui-options.js +1 -1
  57. package/dist/src/client/agent-stream-follower.d.ts +26 -0
  58. package/dist/src/client/agent-stream-follower.js +1 -0
  59. package/dist/src/client/authorization-message-parts.js +1 -1
  60. package/dist/src/client/conversation-client.d.ts +40 -0
  61. package/dist/src/client/conversation-client.js +1 -0
  62. package/dist/src/client/conversation-reducer.d.ts +29 -0
  63. package/dist/src/client/conversation-reducer.js +1 -0
  64. package/dist/src/client/conversation-state.d.ts +110 -0
  65. package/dist/src/client/conversation-state.js +1 -0
  66. package/dist/src/client/eve-agent-projection.d.ts +24 -7
  67. package/dist/src/client/eve-agent-projection.js +1 -1
  68. package/dist/src/client/eve-agent-store-helpers.d.ts +21 -2
  69. package/dist/src/client/eve-agent-store-helpers.js +2 -2
  70. package/dist/src/client/eve-agent-store-state.d.ts +15 -3
  71. package/dist/src/client/eve-agent-store.d.ts +10 -1
  72. package/dist/src/client/eve-agent-store.js +1 -1
  73. package/dist/src/client/index.d.ts +4 -1
  74. package/dist/src/client/index.js +1 -1
  75. package/dist/src/client/message-reducer-primitives.d.ts +1 -2
  76. package/dist/src/client/message-reducer-primitives.js +1 -1
  77. package/dist/src/client/message-reducer-types.d.ts +9 -2
  78. package/dist/src/client/message-reducer.js +1 -1
  79. package/dist/src/client/message-response.js +1 -1
  80. package/dist/src/client/message-run-parts.d.ts +10 -6
  81. package/dist/src/client/message-run-parts.js +1 -1
  82. package/dist/src/client/optimistic-message-submissions.d.ts +6 -4
  83. package/dist/src/client/optimistic-message-submissions.js +1 -1
  84. package/dist/src/client/reducer.d.ts +5 -1
  85. package/dist/src/client/session-turn-dispatch.d.ts +15 -0
  86. package/dist/src/client/session-turn-dispatch.js +1 -0
  87. package/dist/src/client/session-utils.d.ts +27 -10
  88. package/dist/src/client/session-utils.js +1 -1
  89. package/dist/src/client/session.js +1 -1
  90. package/dist/src/client/types.d.ts +2 -1
  91. package/dist/src/compiled/.vendor-stamp.json +2 -2
  92. package/dist/src/compiled/{gray-matter → js-yaml}/LICENSE +2 -2
  93. package/dist/src/compiled/js-yaml/index.d.ts +12 -0
  94. package/dist/src/compiled/js-yaml/index.js +34 -0
  95. package/dist/src/compiler/extension-compatibility.d.ts +18 -18
  96. package/dist/src/compiler/extension-compatibility.js +1 -1
  97. package/dist/src/compiler/load-binding-namespace.js +1 -1
  98. package/dist/src/context/keys.d.ts +5 -2
  99. package/dist/src/context/keys.js +1 -1
  100. package/dist/src/context/provider.d.ts +5 -9
  101. package/dist/src/context/run-step.d.ts +4 -4
  102. package/dist/src/context/run-step.js +1 -1
  103. package/dist/src/context/serialize.d.ts +5 -1
  104. package/dist/src/context/serialize.js +1 -1
  105. package/dist/src/evals/loaders/yaml.js +1 -1
  106. package/dist/src/evals/runner/derive-run-facts.js +1 -1
  107. package/dist/src/evals/runner/execute-task.js +1 -1
  108. package/dist/src/evals/session.js +2 -2
  109. package/dist/src/evals/types.d.ts +16 -0
  110. package/dist/src/eve-channel/index.js +1 -1
  111. package/dist/src/execution/agent-sessions/context.d.ts +4 -2
  112. package/dist/src/execution/agent-sessions/context.js +1 -1
  113. package/dist/src/execution/agent-sessions/steps.js +1 -1
  114. package/dist/src/execution/cancelled-model-call-batch.js +1 -1
  115. package/dist/src/execution/coordination-dispatch-shared.d.ts +6 -4
  116. package/dist/src/execution/coordination-dispatch-shared.js +1 -1
  117. package/dist/src/execution/create-session-step.d.ts +4 -2
  118. package/dist/src/execution/create-session-step.js +1 -1
  119. package/dist/src/execution/durable-session-store.d.ts +10 -4
  120. package/dist/src/execution/durable-session-store.js +1 -1
  121. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  122. package/dist/src/execution/legacy-remote-agent/protocol.d.ts +8 -0
  123. package/dist/src/execution/legacy-remote-agent/protocol.js +1 -1
  124. package/dist/src/execution/legacy-session/completion-step.d.ts +2 -0
  125. package/dist/src/execution/legacy-session/completion-step.js +1 -1
  126. package/dist/src/execution/legacy-session/interrupt-step.js +1 -1
  127. package/dist/src/execution/legacy-session/prepare-step.d.ts +1 -0
  128. package/dist/src/execution/legacy-session/prepare-step.js +1 -1
  129. package/dist/src/execution/legacy-session/snapshot.d.ts +8 -4
  130. package/dist/src/execution/legacy-session/snapshot.js +1 -1
  131. package/dist/src/execution/legacy-session/turn-workflow.js +1 -1
  132. package/dist/src/execution/proxied-deliver-step.js +1 -1
  133. package/dist/src/execution/publish-session-events.d.ts +27 -7
  134. package/dist/src/execution/publish-session-events.js +1 -1
  135. package/dist/src/execution/reconcile-session-continuation-token.d.ts +2 -2
  136. package/dist/src/execution/runtime-context.js +1 -1
  137. package/dist/src/execution/session/active-turn.d.ts +97 -0
  138. package/dist/src/execution/session/active-turn.js +1 -0
  139. package/dist/src/execution/session/checkpoint-migrations.d.ts +23 -0
  140. package/dist/src/execution/session/checkpoint-migrations.js +1 -0
  141. package/dist/src/execution/session/entry.js +1 -1
  142. package/dist/src/execution/session/finalization.js +1 -1
  143. package/dist/src/execution/session/handoff-steps.d.ts +24 -5
  144. package/dist/src/execution/session/handoff-steps.js +1 -1
  145. package/dist/src/execution/session/handoff.d.ts +10 -6
  146. package/dist/src/execution/session/handoff.js +1 -1
  147. package/dist/src/execution/session/input-queue.d.ts +19 -13
  148. package/dist/src/execution/session/input-queue.js +1 -1
  149. package/dist/src/execution/session/next-input.d.ts +2 -10
  150. package/dist/src/execution/session/next-input.js +1 -1
  151. package/dist/src/execution/session/pending-turn-state.d.ts +2 -0
  152. package/dist/src/execution/session/pending-turn-state.js +1 -1
  153. package/dist/src/execution/session/program.d.ts +2 -0
  154. package/dist/src/execution/session/program.js +1 -1
  155. package/dist/src/execution/session/state-cursor.d.ts +22 -16
  156. package/dist/src/execution/session/state-cursor.js +1 -1
  157. package/dist/src/execution/session/state-delta.d.ts +8 -1
  158. package/dist/src/execution/session/state-delta.js +1 -1
  159. package/dist/src/execution/session/turn-event-handler.js +1 -1
  160. package/dist/src/execution/session/turn-step-result.js +1 -1
  161. package/dist/src/execution/session/turn-step-types.d.ts +20 -4
  162. package/dist/src/execution/session/turn-step.js +1 -1
  163. package/dist/src/execution/session/turn-waiting-step.js +1 -1
  164. package/dist/src/execution/session/turn.d.ts +22 -3
  165. package/dist/src/execution/session/turn.js +1 -1
  166. package/dist/src/execution/session.d.ts +5 -5
  167. package/dist/src/execution/session.js +2 -2
  168. package/dist/src/execution/settle-cancelled-turn-step.d.ts +5 -4
  169. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  170. package/dist/src/execution/tasks/start.d.ts +2 -2
  171. package/dist/src/execution/tasks/task-id-input.d.ts +1 -1
  172. package/dist/src/execution/tasks/task-id-input.js +1 -1
  173. package/dist/src/execution/terminal-session-completion-step.d.ts +2 -0
  174. package/dist/src/execution/terminal-session-completion-step.js +1 -1
  175. package/dist/src/execution/terminal-session-failure-step.d.ts +2 -0
  176. package/dist/src/execution/terminal-session-failure-step.js +1 -1
  177. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  178. package/dist/src/execution/tools/connection-target.d.ts +5 -0
  179. package/dist/src/execution/tools/connection-target.js +1 -1
  180. package/dist/src/execution/tools/connection-tools.js +2 -2
  181. package/dist/src/execution/tools/workflow/start.d.ts +3 -3
  182. package/dist/src/harness/authorization.d.ts +15 -2
  183. package/dist/src/harness/authorization.js +1 -1
  184. package/dist/src/harness/cancelled-turn-emission.d.ts +2 -1
  185. package/dist/src/harness/cancelled-turn-emission.js +1 -1
  186. package/dist/src/harness/coordination.d.ts +5 -3
  187. package/dist/src/harness/emission.d.ts +5 -2
  188. package/dist/src/harness/emission.js +1 -1
  189. package/dist/src/harness/held-requests.d.ts +18 -0
  190. package/dist/src/harness/held-requests.js +1 -0
  191. package/dist/src/harness/hitl/approval-input-requests.d.ts +16 -0
  192. package/dist/src/harness/hitl/approval-input-requests.js +1 -1
  193. package/dist/src/harness/input-extraction.js +1 -1
  194. package/dist/src/harness/input-requests.d.ts +0 -4
  195. package/dist/src/harness/input-requests.js +1 -1
  196. package/dist/src/harness/model-call-error.js +1 -1
  197. package/dist/src/harness/proxy-input-requests.d.ts +4 -4
  198. package/dist/src/harness/session-limit-enforcement.js +1 -1
  199. package/dist/src/harness/stale-input-responses.js +1 -1
  200. package/dist/src/harness/tool-loop.js +2 -2
  201. package/dist/src/harness/turn-tag-state.d.ts +2 -0
  202. package/dist/src/harness/turn-tag-state.js +1 -1
  203. package/dist/src/harness/types.d.ts +23 -11
  204. package/dist/src/instrumentation/channel-delivery.d.ts +1 -0
  205. package/dist/src/instrumentation/channel-delivery.js +1 -1
  206. package/dist/src/instrumentation/lifecycle.d.ts +4 -0
  207. package/dist/src/instrumentation/memory.d.ts +2 -0
  208. package/dist/src/instrumentation/memory.js +1 -1
  209. package/dist/src/instrumentation/native-events.d.ts +1 -0
  210. package/dist/src/instrumentation/native-events.js +1 -1
  211. package/dist/src/instrumentation/runtime.d.ts +4 -3
  212. package/dist/src/instrumentation/runtime.js +1 -1
  213. package/dist/src/instrumentation/session-init.js +1 -1
  214. package/dist/src/internal/application/package.js +1 -1
  215. package/dist/src/internal/authored-module-loader.d.ts +14 -6
  216. package/dist/src/internal/authored-module-loader.js +1 -1
  217. package/dist/src/internal/authored-package-boundary.d.ts +1 -1
  218. package/dist/src/internal/authored-package-boundary.js +1 -1
  219. package/dist/src/internal/bundler/extension-mount-plugin.js +1 -1
  220. package/dist/src/internal/helpers/frontmatter.d.ts +24 -0
  221. package/dist/src/internal/helpers/frontmatter.js +1 -0
  222. package/dist/src/internal/helpers/markdown.js +1 -3
  223. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  224. package/dist/src/internal/nitro/host/nitro-bundler-config.js +1 -1
  225. package/dist/src/internal/node-esm-compat-banner.js +1 -1
  226. package/dist/src/internal/workflow-bundle/dynamic-remote-agent-transform.js +1 -1
  227. package/dist/src/internal/workflow-bundle/dynamic-tool-ast-references.d.ts +27 -1
  228. package/dist/src/internal/workflow-bundle/dynamic-tool-ast-references.js +1 -1
  229. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +2 -2
  230. package/dist/src/protocol/message.d.ts +41 -3
  231. package/dist/src/protocol/message.js +2 -2
  232. package/dist/src/public/channels/slack/action-status.d.ts +2 -2
  233. package/dist/src/public/channels/slack/action-status.js +1 -1
  234. package/dist/src/public/channels/slack/approval-cards.d.ts +15 -0
  235. package/dist/src/public/channels/slack/approval-cards.js +2 -0
  236. package/dist/src/public/channels/slack/auth.d.ts +2 -0
  237. package/dist/src/public/channels/slack/auth.js +1 -1
  238. package/dist/src/public/channels/slack/connections.d.ts +15 -11
  239. package/dist/src/public/channels/slack/connections.js +1 -1
  240. package/dist/src/public/channels/slack/defaults.d.ts +1 -15
  241. package/dist/src/public/channels/slack/defaults.js +3 -4
  242. package/dist/src/public/channels/slack/hitl.js +1 -1
  243. package/dist/src/public/channels/slack/inbound.d.ts +10 -2
  244. package/dist/src/public/channels/slack/inbound.js +1 -1
  245. package/dist/src/public/channels/slack/index.d.ts +2 -0
  246. package/dist/src/public/channels/slack/index.js +1 -1
  247. package/dist/src/public/channels/slack/input-response.js +1 -1
  248. package/dist/src/public/channels/slack/interaction-cards.js +1 -1
  249. package/dist/src/public/channels/slack/interactions.js +1 -1
  250. package/dist/src/public/channels/slack/limits.d.ts +5 -3
  251. package/dist/src/public/channels/slack/private-approval-delivery.js +1 -1
  252. package/dist/src/public/channels/slack/renderers.d.ts +1 -1
  253. package/dist/src/public/channels/slack/renderers.js +1 -1
  254. package/dist/src/public/channels/slack/reply-delivery.d.ts +72 -0
  255. package/dist/src/public/channels/slack/reply-delivery.js +1 -0
  256. package/dist/src/public/channels/slack/sign-in-cancel.d.ts +20 -0
  257. package/dist/src/public/channels/slack/sign-in-cancel.js +1 -0
  258. package/dist/src/public/channels/slack/slackChannel.d.ts +15 -0
  259. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  260. package/dist/src/public/channels/slack/task-card.js +1 -1
  261. package/dist/src/public/channels/teams/defaults.d.ts +1 -1
  262. package/dist/src/public/channels/teams/defaults.js +2 -2
  263. package/dist/src/public/definitions/channel.d.ts +1 -0
  264. package/dist/src/public/definitions/channel.js +1 -1
  265. package/dist/src/public/definitions/state.d.ts +2 -0
  266. package/dist/src/public/definitions/state.js +1 -1
  267. package/dist/src/public/next/index.js +1 -1
  268. package/dist/src/public/next/server.d.ts +2 -0
  269. package/dist/src/public/next/server.js +1 -2
  270. package/dist/src/public/nuxt/module.d.ts +6 -0
  271. package/dist/src/public/nuxt/module.js +1 -1
  272. package/dist/src/react/index.d.ts +3 -0
  273. package/dist/src/react/index.js +1 -1
  274. package/dist/src/react/use-eve-agent.d.ts +7 -5
  275. package/dist/src/react/use-eve-agent.js +1 -1
  276. package/dist/src/runtime/connections/openapi-spec.d.ts +1 -4
  277. package/dist/src/runtime/connections/openapi-spec.js +1 -1
  278. package/dist/src/runtime/connections/scoped-authorization.d.ts +2 -0
  279. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  280. package/dist/src/setup/boxes/deploy-project.js +1 -1
  281. package/dist/src/setup/integrations/web/setup.js +6 -2
  282. package/dist/src/setup/scaffold/create/project.js +1 -1
  283. package/dist/src/setup/scaffold/create/web-template.d.ts +5 -5
  284. package/dist/src/setup/scaffold/create/web-template.js +61 -35
  285. package/dist/src/setup/vercel-project-framework.js +1 -1
  286. package/dist/src/shared/display-name.d.ts +15 -0
  287. package/dist/src/shared/display-name.js +1 -0
  288. package/dist/src/shared/framework-eve-server.d.ts +43 -0
  289. package/dist/src/shared/framework-eve-server.js +2 -0
  290. package/dist/src/shared/token-usage.d.ts +2 -0
  291. package/dist/src/shared/token-usage.js +1 -1
  292. package/dist/src/shared/trace-root.d.ts +8 -0
  293. package/dist/src/shared/trace-root.js +1 -0
  294. package/dist/src/subagents/callback-route.js +1 -1
  295. package/dist/src/subagents/hitl-proxy.d.ts +3 -3
  296. package/dist/src/subagents/hitl-proxy.js +1 -1
  297. package/dist/src/subagents/invocation.d.ts +3 -1
  298. package/dist/src/subagents/parent-notification.d.ts +7 -7
  299. package/dist/src/subagents/parent-notification.js +1 -1
  300. package/dist/src/subagents/tool.js +1 -1
  301. package/dist/src/svelte/index.d.ts +3 -0
  302. package/dist/src/svelte/index.js +2 -2
  303. package/dist/src/svelte/use-eve-agent.d.ts +7 -4
  304. package/dist/src/svelte/use-eve-agent.js +1 -1
  305. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  306. package/dist/src/tools/provided/load-skill.js +1 -1
  307. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  308. package/dist/src/tracing/agent-action-instrumentation.js +1 -1
  309. package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
  310. package/dist/src/tracing/agent-memory-instrumentation.js +1 -1
  311. package/dist/src/tracing/agent-otel-attributes.d.ts +6 -0
  312. package/dist/src/tracing/agent-otel-attributes.js +1 -1
  313. package/dist/src/tracing/agent-otel-provider.js +2 -2
  314. package/dist/src/tracing/agent-otel-runtime-context.d.ts +1 -1
  315. package/dist/src/tracing/agent-otel-runtime-context.js +1 -1
  316. package/dist/src/tracing/agent-otel-session-context.js +1 -1
  317. package/dist/src/tracing/agent-span-contract.js +1 -1
  318. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  319. package/dist/src/tracing/agent-trace-context-codec.d.ts +4 -0
  320. package/dist/src/tracing/agent-trace-context-codec.js +1 -1
  321. package/dist/src/tracing/agent-trace-span-processor.js +1 -1
  322. package/dist/src/tracing/agent-trace-state.d.ts +3 -0
  323. package/dist/src/tracing/conversation-context.d.ts +10 -0
  324. package/dist/src/tracing/conversation-context.js +1 -1
  325. package/dist/src/tracing/otel-registration.js +1 -1
  326. package/dist/src/vue/index.d.ts +3 -0
  327. package/dist/src/vue/index.js +2 -2
  328. package/dist/src/vue/use-eve-agent.d.ts +7 -3
  329. package/dist/src/vue/use-eve-agent.js +1 -1
  330. package/docs/channels/slack.mdx +60 -13
  331. package/docs/concepts/built-in-tools.md +3 -2
  332. package/docs/concepts/execution-model-and-durability.mdx +3 -1
  333. package/docs/concepts/sessions-runs-and-streaming.md +4 -4
  334. package/docs/connections/overview.mdx +9 -3
  335. package/docs/evals/reporters.mdx +4 -0
  336. package/docs/extensions.md +15 -3
  337. package/docs/guides/client/streaming.mdx +7 -6
  338. package/docs/guides/deployment/vercel.mdx +2 -1
  339. package/docs/guides/dev-tui.md +17 -17
  340. package/docs/guides/dynamic-capabilities.md +1 -1
  341. package/docs/guides/frontend/nuxt.mdx +24 -4
  342. package/docs/guides/frontend/overview.mdx +44 -38
  343. package/docs/guides/frontend/use-eve-agent-svelte.mdx +4 -10
  344. package/docs/guides/frontend/use-eve-agent-vue.mdx +4 -10
  345. package/docs/guides/instrumentation/otel.mdx +24 -6
  346. package/docs/guides/remote-agents.md +26 -8
  347. package/docs/reference/cli.md +4 -4
  348. package/docs/tools/human-in-the-loop.md +4 -4
  349. package/docs/tools/overview.mdx +1 -1
  350. package/docs/tools/tasks.md +8 -8
  351. package/package.json +2 -2
  352. package/dist/src/cli/dev/tui/steering-stream.d.ts +0 -15
  353. package/dist/src/cli/dev/tui/steering-stream.js +0 -1
  354. package/dist/src/cli/dev/tui/subagent-pump.d.ts +0 -134
  355. package/dist/src/cli/dev/tui/subagent-pump.js +0 -1
  356. package/dist/src/compiled/gray-matter/index.d.ts +0 -62
  357. package/dist/src/compiled/gray-matter/index.js +0 -48
  358. package/dist/src/internal/helpers/gray-matter.d.ts +0 -25
  359. package/dist/src/internal/helpers/gray-matter.js +0 -1
  360. package/dist/src/public/nuxt/dev-server.d.ts +0 -25
  361. package/dist/src/public/nuxt/dev-server.js +0 -1
@@ -1 +1 @@
1
- import{createDevBootProgressReporter}from"./boot-progress.js";import{resolveDevUiMode,resolveTuiDisplayOptions}from"./ui-options.js";import{runInteractiveDevelopmentUi}from"./run-interactive-ui.js";import{parseDevelopmentServerUrl}from"./url.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"./url-target.js";import{waitForServerOrStop,waitForUiOrServer}from"./wait-for-ui.js";import{parseContextSizeOption,parseDisplayMode,parseLogsMode,parsePortOption,parseStatsMode,parseSubagentDisplayMode}from"../option-parsers.js";import{InvalidArgumentError,Option}from"#compiled/commander/index.js";import{agentCommand}from"#cli/agent-command.js";import{FORCED_EXIT_BACKSTOP_MS,installShutdownSignal}from"#cli/shutdown.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{eveCliBanner}from"#cli/banner.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{inspectVerifiedRemoteAgent}from"#setup/verified-remote-agent.js";import{noDevelopmentExtensions}from"#compiler/development-extensions.js";async function loadDevelopmentTuiModule(){return await import(`#cli/dev/tui/tui.js`)}async function loadStartHost(){return(await import(`#cli/dev/local-server-process.js`)).createDevelopmentServer}function hasInteractiveTerminal(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}function registerRemoteCommands(e){let{applicationContext:t,logger:n,program:r,runtime:i,telemetry:a}=e,o=createCliTheme();r.command(`info`).description(`Inspect an existing eve agent.`).requiredOption(`-u, --url <url>`,`Existing eve agent URL`,parseDevelopmentServerUrl).option(`-H, --header <header>`,`Request header for the URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).option(`--json`,`Output as JSON`).action(async e=>{let r=resolveDevelopmentUrlTarget({header:e.header,url:e.url},void 0),i=await inspectVerifiedRemoteAgent({headers:r.headers,prompter:process.stdin.isTTY&&process.stdout.isTTY?(await import(`#setup/prompter.js`)).createPrompter():void 0,serverUrl:r.serverUrl,workspaceRoot:t.root});n.log(JSON.stringify(i.info,null,e.json===!0?0:2))}),r.command(`connect`).description(`Open the terminal UI for an existing eve agent.`).requiredOption(`-u, --url <url>`,`Existing eve agent URL`,parseDevelopmentServerUrl).option(`-H, --header <header>`,`Request header for the URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).option(`--name <name>`,`Title shown in the terminal UI`).option(`--input <text>`,`Pre-fill the prompt input`).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 tasks render: full | collapsed | hidden`,parseSubagentDisplayMode).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).action(async e=>{let r=resolveDevelopmentUrlTarget(e,void 0),s=resolveDevUiMode({options:e,interactive:hasInteractiveTerminal()});if(s===`headless`)throw new InvalidArgumentError(`eve remote connect requires an interactive terminal.`);a.trackDevContext({target:`remote`,ui:s});let{loadDevelopmentEnvironmentFiles:c}=await import(`#cli/dev/environment.js`);await c(t.root),n.log(`↗ remote agent ${o.info(new URL(r.serverUrl).host)}`),n.log(``);let l=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS});try{await runInteractiveDevelopmentUi({applicationRoot:t.root,lifecycle:l,onOnboardingStep:a.trackSetupStep,onOnboardingTerminal:a.trackSetupTerminal,options:e,remoteTarget:r,runDevelopmentTui:i.runDevelopmentTui,server:{serverUrl:r.serverUrl}})}finally{l.dispose()}})}function registerDevelopmentCommand(e){let{applicationContext:t,logger:n,program:r,runtime:i,telemetry:a}=e,o=createCliTheme();agentCommand(r.command(`dev`),t).description(`Start the local eve development server.`).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 2000)`,parsePortOption).option(`--no-ui`,`Start the server without an interactive UI`).option(`--resume`,`Attempt recovery of retained runs from previous local dev invocations`).option(`--no-default-extensions`,`Do not mount default development extensions`).option(`--name <name>`,`Title shown in the terminal UI (defaults to the app folder name)`).option(`--input <text>`,`Pre-fill the prompt input`).addOption(new Option(`--onboard`,`Start fresh-agent onboarding`).hideHelp()).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 tasks render: full | collapsed | hidden`,parseSubagentDisplayMode).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).action(async e=>{let r=hasInteractiveTerminal(),s=resolveDevUiMode({options:e,interactive:r});if(a.trackDevContext({target:`local`,ui:s}),s===`headless`&&n.log(eveCliBanner()),e.input!==void 0&&s===`headless`)throw new InvalidArgumentError(`--input requires the interactive UI.`);let c=s===`tui`?startCliLiveRow(n,{elapsed:!0}):void 0,l=createDevBootProgressReporter(c);c?.update(`Starting your agent`);let u,d,closeServer=()=>u===void 0?Promise.resolve():(d??=u.close(),d.catch(()=>void 0),d),f=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS,onStop:()=>{closeServer()}}),p,m=s===`tui`&&i.runDevelopmentTui===void 0?loadDevelopmentTuiModule().then(n=>(l({type:`before-first-paint`}),n.startDevelopmentTuiStartup({appRoot:t.root,initialInput:e.input,onExitRequest:f.requestStop,...resolveTuiDisplayOptions(e)}))):void 0;try{u=(i.startHost??await loadStartHost())(t.root,{...e.defaultExtensions===!1?{developmentExtensions:noDevelopmentExtensions()}:{},resume:e.resume,existing:s===`tui`?`attach-if-unconfigured`:`reject`,host:e.host,onBootProgress:l,port:e.port});let[c,d]=await Promise.all([Promise.race([u.start().then(e=>({handle:e})),f.stopped.then(()=>({handle:void 0}))]),m]),h=c.handle;if(h===void 0){p=d,await p?.shutdown();return}if(p=d,s!==`tui`&&n.log(renderCliTaggedLine(o,{message:`server listening at ${h.url}`,tag:`dev`,tone:`success`})),s===`headless`){e.ui!==!1&&!r&&n.log(renderCliTaggedLine(o,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`})),await waitForServerOrStop(u,f);return}await waitForUiOrServer({handle:h,lifecycle:f,server:u,runUi:async()=>await runInteractiveDevelopmentUi({applicationRoot:t.root,lifecycle:f,onOnboardingStep:a.trackSetupStep,onOnboardingTerminal:a.trackSetupTerminal,options:e,report:l,runDevelopmentTui:i.runDevelopmentTui,server:{appRoot:h.appRoot,serverUrl:h.url},startup:p})})}finally{c?.stop(),p===void 0&&(p=await m?.catch(()=>void 0),await p?.shutdown()),await closeServer(),f.dispose()}})}export{registerDevelopmentCommand,registerRemoteCommands};
1
+ import{createDevBootProgressReporter}from"./boot-progress.js";import{resolveDevUiMode,resolveTuiDisplayOptions}from"./ui-options.js";import{runInteractiveDevelopmentUi}from"./run-interactive-ui.js";import{parseDevelopmentServerUrl}from"./url.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"./url-target.js";import{waitForServerOrStop,waitForUiOrServer}from"./wait-for-ui.js";import{parseContextSizeOption,parseDisplayMode,parseLogsMode,parsePortOption,parseStatsMode,parseSubagentDisplayMode}from"../option-parsers.js";import{InvalidArgumentError,Option}from"#compiled/commander/index.js";import{agentCommand}from"#cli/agent-command.js";import{FORCED_EXIT_BACKSTOP_MS,installShutdownSignal}from"#cli/shutdown.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{eveCliBanner}from"#cli/banner.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{inspectVerifiedRemoteAgent}from"#setup/verified-remote-agent.js";import{noDevelopmentExtensions}from"#compiler/development-extensions.js";async function loadDevelopmentTuiModule(){return await import(`#cli/dev/tui/tui.js`)}async function loadStartHost(){return(await import(`#cli/dev/local-server-process.js`)).createDevelopmentServer}function hasInteractiveTerminal(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}function registerRemoteCommands(e){let{applicationContext:t,logger:n,program:r,runtime:i,telemetry:a}=e,o=createCliTheme();r.command(`info`).description(`Inspect an existing eve agent.`).requiredOption(`-u, --url <url>`,`Existing eve agent URL`,parseDevelopmentServerUrl).option(`-H, --header <header>`,`Request header for the URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).option(`--json`,`Output as JSON`).action(async e=>{let r=resolveDevelopmentUrlTarget({header:e.header,url:e.url},void 0),i=await inspectVerifiedRemoteAgent({headers:r.headers,prompter:process.stdin.isTTY&&process.stdout.isTTY?(await import(`#setup/prompter.js`)).createPrompter():void 0,serverUrl:r.serverUrl,workspaceRoot:t.root});n.log(JSON.stringify(i.info,null,e.json===!0?0:2))}),r.command(`connect`).description(`Open the terminal UI for an existing eve agent.`).requiredOption(`-u, --url <url>`,`Existing eve agent URL`,parseDevelopmentServerUrl).option(`-H, --header <header>`,`Request header for the URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).option(`--name <name>`,`Title shown in the terminal UI`).option(`--input <text>`,`Pre-fill the prompt input`).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 tasks render: full | collapsed | hidden`,parseSubagentDisplayMode).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>`,`Log severity: none | error | warn | debug | all`,parseLogsMode).action(async e=>{let r=resolveDevelopmentUrlTarget(e,void 0),s=resolveDevUiMode({options:e,interactive:hasInteractiveTerminal()});if(s===`headless`)throw new InvalidArgumentError(`eve remote connect requires an interactive terminal.`);a.trackDevContext({target:`remote`,ui:s});let{loadDevelopmentEnvironmentFiles:c}=await import(`#cli/dev/environment.js`);await c(t.root),n.log(`↗ remote agent ${o.info(new URL(r.serverUrl).host)}`),n.log(``);let l=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS});try{await runInteractiveDevelopmentUi({applicationRoot:t.root,lifecycle:l,onOnboardingStep:a.trackSetupStep,onOnboardingTerminal:a.trackSetupTerminal,options:e,remoteTarget:r,runDevelopmentTui:i.runDevelopmentTui,server:{serverUrl:r.serverUrl}})}finally{l.dispose()}})}function registerDevelopmentCommand(e){let{applicationContext:t,logger:n,program:r,runtime:i,telemetry:a}=e,o=createCliTheme();agentCommand(r.command(`dev`),t).description(`Start the local eve development server.`).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 2000)`,parsePortOption).option(`--no-ui`,`Start the server without an interactive UI`).option(`--resume`,`Attempt recovery of retained runs from previous local dev invocations`).option(`--no-default-extensions`,`Do not mount default development extensions`).option(`--name <name>`,`Title shown in the terminal UI (defaults to the app folder name)`).option(`--input <text>`,`Pre-fill the prompt input`).addOption(new Option(`--onboard`,`Start fresh-agent onboarding`).hideHelp()).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 tasks render: full | collapsed | hidden`,parseSubagentDisplayMode).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>`,`Log severity: none | error | warn | debug | all`,parseLogsMode).action(async e=>{let r=hasInteractiveTerminal(),s=resolveDevUiMode({options:e,interactive:r});if(a.trackDevContext({target:`local`,ui:s}),s===`headless`&&n.log(eveCliBanner()),e.input!==void 0&&s===`headless`)throw new InvalidArgumentError(`--input requires the interactive UI.`);let c=s===`tui`?startCliLiveRow(n,{elapsed:!0}):void 0,l=createDevBootProgressReporter(c);c?.update(`Starting your agent`);let u,d,closeServer=()=>u===void 0?Promise.resolve():(d??=u.close(),d.catch(()=>void 0),d),f=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS,onStop:()=>{closeServer()}}),p,m=s===`tui`&&i.runDevelopmentTui===void 0?loadDevelopmentTuiModule().then(n=>(l({type:`before-first-paint`}),n.startDevelopmentTuiStartup({appRoot:t.root,initialInput:e.input,onExitRequest:f.requestStop,...resolveTuiDisplayOptions(e)}))):void 0;try{u=(i.startHost??await loadStartHost())(t.root,{...e.defaultExtensions===!1?{developmentExtensions:noDevelopmentExtensions()}:{},resume:e.resume,existing:s===`tui`?`attach-if-unconfigured`:`reject`,host:e.host,onBootProgress:l,port:e.port});let[c,d]=await Promise.all([Promise.race([u.start().then(e=>({handle:e})),f.stopped.then(()=>({handle:void 0}))]),m]),h=c.handle;if(h===void 0){p=d,await p?.shutdown();return}if(p=d,s!==`tui`&&n.log(renderCliTaggedLine(o,{message:`server listening at ${h.url}`,tag:`dev`,tone:`success`})),s===`headless`){e.ui!==!1&&!r&&n.log(renderCliTaggedLine(o,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`})),await waitForServerOrStop(u,f);return}await waitForUiOrServer({handle:h,lifecycle:f,server:u,runUi:async()=>await runInteractiveDevelopmentUi({applicationRoot:t.root,lifecycle:f,onOnboardingStep:a.trackSetupStep,onOnboardingTerminal:a.trackSetupTerminal,options:e,report:l,runDevelopmentTui:i.runDevelopmentTui,server:{appRoot:h.appRoot,serverUrl:h.url},startup:p})})}finally{c?.stop(),p===void 0&&(p=await m?.catch(()=>void 0),await p?.shutdown()),await closeServer(),f.dispose()}})}export{registerDevelopmentCommand,registerRemoteCommands};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{installConsoleRecords}from"./console-records.js";installConsoleRecords();export{};
@@ -0,0 +1,17 @@
1
+ import { type LogLevel } from "#internal/logging.js";
2
+ export declare const CONSOLE_RECORD_PREFIX = "\u001Eeve-console:";
3
+ export interface ConsoleRecord {
4
+ readonly level: LogLevel;
5
+ readonly text: string;
6
+ }
7
+ declare let subscriber: ((record: ConsoleRecord) => void) | undefined;
8
+ export declare function setConsoleRecordSubscriber(value: typeof subscriber): void;
9
+ export declare function forwardConsoleRecord(record: ConsoleRecord): void;
10
+ export declare function createConsoleOutputForwarder(raw: (text: string) => void): {
11
+ write(chunk: string): void;
12
+ flush(): void;
13
+ };
14
+ export declare function parseConsoleRecord(line: string): ConsoleRecord | undefined;
15
+ /** Runs in the dev child and its worker threads before application imports. */
16
+ export declare function installConsoleRecords(): void;
17
+ export {};
@@ -0,0 +1,3 @@
1
+ import{setLogRecordSubscriber}from"#internal/logging.js";import{format}from"node:util";const CONSOLE_RECORD_PREFIX=`eve-console:`;let subscriber;function setConsoleRecordSubscriber(e){subscriber=e}function forwardConsoleRecord(e){if(subscriber!==void 0)try{subscriber(e);return}catch{}console[e.level===`info`?`log`:e.level](e.text)}function createConsoleOutputForwarder(e){let t=``;return{write(n){t+=n,t.length>1048576&&!t.includes(`
2
+ `)&&(e(t),t=``);let r;for(;(r=t.indexOf(`
3
+ `))!==-1;){let n=t.slice(0,r);t=t.slice(r+1);let i=parseConsoleRecord(n);i===void 0?e(`${n}\n`):forwardConsoleRecord(i)}},flush(){t.length>0&&e(t),t=``}}}function parseConsoleRecord(e){if(e.startsWith(`eve-console:`))try{let t=JSON.parse(e.slice(13));if([`error`,`warn`,`info`,`debug`].includes(t.level)&&typeof t.text==`string`)return t}catch{}}function installConsoleRecords(){let write=e=>process.stderr.write(`${CONSOLE_RECORD_PREFIX}${JSON.stringify(e)}\n`);setLogRecordSubscriber(e=>write({level:e.level,text:`[eve:${e.namespace}] ${e.message}${e.fields===void 0?``:` ${JSON.stringify(e.fields)}`}`}));for(let[e,t]of Object.entries({error:`error`,warn:`warn`,log:`info`,info:`info`,debug:`debug`}))console[e]=(...e)=>{write({level:t,text:format(...e)})}}export{CONSOLE_RECORD_PREFIX,createConsoleOutputForwarder,forwardConsoleRecord,installConsoleRecords,parseConsoleRecord,setConsoleRecordSubscriber};
@@ -4,6 +4,7 @@ type DevDiagnosticSource = "stderr" | "stdout" | "sandbox" | "workflow" | "tool"
4
4
  /** Captured output or a failure summary attributed to one capture point. */
5
5
  export interface DevDiagnosticOutputEntry {
6
6
  readonly source: Exclude<DevDiagnosticSource, "log">;
7
+ readonly level?: LogLevel;
7
8
  readonly summary?: string;
8
9
  readonly detail: string;
9
10
  /** Structured remediation carried by cataloged failures. */
@@ -1 +1 @@
1
- import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{fork}from"node:child_process";import{fileURLToPath}from"node:url";import{EVE_DEV_ENV_FLAG}from"#internal/application/optional-package-install.js";const childPath=fileURLToPath(new URL(`./local-server-child.js`,import.meta.url)),DEV_SERVER_CLOSE_BUDGET_MS=800;function createDevelopmentServer(e,t={}){let n,r,i=!1,a=!1,o=Promise.withResolvers(),s=Promise.withResolvers();o.promise.catch(()=>void 0);let release=()=>{let e=n;e!==void 0&&(n=void 0,e.stdout?.destroy(),e.stderr?.destroy(),e.connected&&e.disconnect(),e.unref())};return{start:async()=>{if(n!==void 0)throw Error(`DevelopmentServer.start() was already called.`);let r={...process.env};await loadDevelopmentEnvironmentFiles(e),process.env[EVE_DEV_ENV_FLAG]??=`1`;let c=fork(childPath,[JSON.stringify({developmentExtensions:t.developmentExtensions,existing:t.existing,host:t.host,port:t.port,resume:t.resume})],{cwd:e,detached:!0,env:{...r,[EVE_DEV_ENV_FLAG]:`1`},stdio:[`ignore`,`pipe`,`pipe`,`ipc`]});return n=c,c.stdout?.on(`data`,e=>(t.output===`stderr`?process.stderr:process.stdout).write(e)),c.stderr?.on(`data`,e=>process.stderr.write(e)),new Promise((e,n)=>{let r=!1;c.once(`error`,n),c.once(`exit`,(e,t)=>{a=!0,s.resolve(),release(),r?i?o.resolve():o.reject(Error(`Development server exited unexpectedly (${String(e)}, ${String(t)}).`)):n(Error(`Development server exited during startup (${String(e)}, ${String(t)}).`))}),c.on(`message`,a=>{if(a.type===`progress`&&t.onBootProgress?.(a.event),a.type===`started`&&!r&&(r=!0,e(a.handle),a.handle.kind===`existing`&&(i=!0,release())),a.type===`failed`&&!r){r=!0;let e=Error(a.message);a.stack!==void 0&&(e.stack=a.stack),n(e)}})})},close(){if(r!==void 0)return r;let e=n;return e===void 0?Promise.resolve():(i=!0,r=(async()=>{e.connected&&e.send({type:`shutdown`}),!await terminatesWithin(e,s.promise,()=>a,550)&&(signalProcessGroup(e,`SIGTERM`),!await terminatesWithin(e,s.promise,()=>a,150)&&(signalProcessGroup(e,`SIGKILL`),await terminatesWithin(e,s.promise,()=>a,100),release()))})(),r)},wait:()=>o.promise}}async function terminatesWithin(e,t,n,r){let i=Date.now()+r;for(await settlesOrTimesOut(t,r);!hasTerminated(e,n())&&Date.now()<i;)await sleep(Math.min(25,i-Date.now()));return hasTerminated(e,n())}async function settlesOrTimesOut(e,t){let n;try{await Promise.race([e,new Promise(e=>{n=setTimeout(e,t)})])}finally{n!==void 0&&clearTimeout(n)}}function sleep(e){return new Promise(t=>setTimeout(t,e))}function hasTerminated(e,t){return t&&!isProcessGroupAlive(e)}function isProcessGroupAlive(e){if(process.platform===`win32`||e.pid===void 0)return!1;try{return process.kill(-e.pid,0),!0}catch{return!1}}function signalProcessGroup(e,t){if(process.platform!==`win32`&&e.pid!==void 0)try{process.kill(-e.pid,t);return}catch{}e.kill(t)}export{DEV_SERVER_CLOSE_BUDGET_MS,createDevelopmentServer};
1
+ import{createConsoleOutputForwarder}from"./console-records.js";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{fork}from"node:child_process";import{fileURLToPath}from"node:url";import{EVE_DEV_ENV_FLAG}from"#internal/application/optional-package-install.js";const childPath=fileURLToPath(new URL(`./local-server-child.js`,import.meta.url)),DEV_SERVER_CLOSE_BUDGET_MS=800;function createDevelopmentServer(e,t={}){let n,r,i=!1,a=!1,o=Promise.withResolvers(),s=Promise.withResolvers();o.promise.catch(()=>void 0);let c=createConsoleOutputForwarder(e=>process.stderr.write(e)),release=()=>{c.flush();let e=n;e!==void 0&&(n=void 0,e.stdout?.destroy(),e.stderr?.destroy(),e.connected&&e.disconnect(),e.unref())};return{start:async()=>{if(n!==void 0)throw Error(`DevelopmentServer.start() was already called.`);let r={...process.env};await loadDevelopmentEnvironmentFiles(e),process.env[EVE_DEV_ENV_FLAG]??=`1`;let l=fork(childPath,[JSON.stringify({developmentExtensions:t.developmentExtensions,existing:t.existing,host:t.host,port:t.port,resume:t.resume})],{cwd:e,detached:!0,env:{...r,[EVE_DEV_ENV_FLAG]:`1`},stdio:[`ignore`,`pipe`,`pipe`,`ipc`],execArgv:[...process.execArgv,`--import`,new URL(`./console-records-preload.js`,import.meta.url).href]});return n=l,l.stdout?.on(`data`,e=>(t.output===`stderr`?process.stderr:process.stdout).write(e)),l.stderr?.on(`data`,e=>c.write(e.toString())),new Promise((e,n)=>{let r=!1;l.once(`error`,n),l.once(`exit`,(e,t)=>{a=!0,s.resolve(),release(),r?i?o.resolve():o.reject(Error(`Development server exited unexpectedly (${String(e)}, ${String(t)}).`)):n(Error(`Development server exited during startup (${String(e)}, ${String(t)}).`))}),l.on(`message`,a=>{if(a.type===`progress`&&t.onBootProgress?.(a.event),a.type===`started`&&!r&&(r=!0,e(a.handle),a.handle.kind===`existing`&&(i=!0,release())),a.type===`failed`&&!r){r=!0;let e=Error(a.message);a.stack!==void 0&&(e.stack=a.stack),n(e)}})})},close(){if(r!==void 0)return r;let e=n;return e===void 0?Promise.resolve():(i=!0,r=(async()=>{e.connected&&e.send({type:`shutdown`}),!await terminatesWithin(e,s.promise,()=>a,550)&&(signalProcessGroup(e,`SIGTERM`),!await terminatesWithin(e,s.promise,()=>a,150)&&(signalProcessGroup(e,`SIGKILL`),await terminatesWithin(e,s.promise,()=>a,100),release()))})(),r)},wait:()=>o.promise}}async function terminatesWithin(e,t,n,r){let i=Date.now()+r;for(await settlesOrTimesOut(t,r);!hasTerminated(e,n())&&Date.now()<i;)await sleep(Math.min(25,i-Date.now()));return hasTerminated(e,n())}async function settlesOrTimesOut(e,t){let n;try{await Promise.race([e,new Promise(e=>{n=setTimeout(e,t)})])}finally{n!==void 0&&clearTimeout(n)}}function sleep(e){return new Promise(t=>setTimeout(t,e))}function hasTerminated(e,t){return t&&!isProcessGroupAlive(e)}function isProcessGroupAlive(e){if(process.platform===`win32`||e.pid===void 0)return!1;try{return process.kill(-e.pid,0),!0}catch{return!1}}function signalProcessGroup(e,t){if(process.platform!==`win32`&&e.pid!==void 0)try{process.kill(-e.pid,t);return}catch{}e.kill(t)}export{DEV_SERVER_CLOSE_BUDGET_MS,createDevelopmentServer};
@@ -61,7 +61,8 @@ export interface Block {
61
61
  /** When true, expand tool input/output instead of summarizing. */
62
62
  expanded?: boolean;
63
63
  /** Captured-log visibility used for concise-vs-raw diagnostic replay. */
64
- logVisibility?: "stderr-only" | "all-only";
64
+ logVisibility?: "summary" | "all-only";
65
+ logLevel?: "error" | "warn" | "info" | "debug";
65
66
  /** Raw tool input / output for the expanded view. */
66
67
  toolInput?: unknown;
67
68
  toolOutput?: unknown;
@@ -1,8 +1,8 @@
1
- import{isPromptControlCommand}from"./prompt-commands.js";import{renderMarkdown}from"./markdown.js";import{truncate}from"./tool-format.js";import{elisionText}from"./rail.js";import{renderTool}from"./tool-rows.js";import{clipVisible,sliceVisible,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";function renderBlockLines(e,t,n,r){let i=nestingPrefix(e.depth??0,n),a=renderBody(e,Math.max(8,t-visibleLength(i)),n,r).map(e=>`${i}${e}`);if(e.agentName!==void 0&&r.previous?.subagentCallId!==e.subagentCallId&&a.length>0){let r=`${n.colors.orange(n.glyph.subagent)} ${n.colors.dim(e.agentName)}`;return[clipVisible(` ${r}`,t),...a]}return a}function nestingPrefix(e,t){return e<=0?``:` ${`${t.colors.dim(t.glyph.rule)} `.repeat(e)}`}function renderBody(e,t,n,r){switch(e.kind){case`user`:return renderUser(e,t,n);case`assistant`:case`subagent-step`:return renderProse(e,t,n,r);case`reasoning`:return renderReasoning(e,t,n);case`tool`:case`subagent-tool`:return renderTool(e,t,n,r);case`error`:return renderError(e,t,n);case`notice`:return renderNotice(e,t,n);case`warning`:return renderWarning(e,t,n);case`result`:return renderResult(e,t,n);case`flow`:return renderFlow(e,t,n);case`command`:return renderCommand(e,n,r);case`question`:case`connection-auth`:return renderPreformatted(e,t,n);case`sandbox`:return renderSandbox(e,t,n,r);case`log`:return renderLog(e,t,n);case`task`:return renderTask(e,t,n);case`turn-stats`:return renderTurnStats(e,t,n);case`session-boundary`:case`agent-header`:return(e.body??``).split(`
1
+ import{isPromptControlCommand}from"./prompt-commands.js";import{renderMarkdown}from"./markdown.js";import{truncate}from"./tool-format.js";import{elisionText}from"./rail.js";import{renderTool,renderToolHeader}from"./tool-rows.js";import{clipVisible,sliceVisible,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";function renderBlockLines(e,t,n,r){let i=nestingPrefix(e.depth??0,n),a=renderBody(e,Math.max(8,t-visibleLength(i)),n,r).map(e=>`${i}${e}`);if(e.agentName!==void 0&&r.previous?.subagentCallId!==e.subagentCallId&&a.length>0){let r=`${n.colors.orange(n.glyph.subagent)} ${n.colors.dim(e.agentName)}`;return[clipVisible(` ${r}`,t),...a]}return a}function nestingPrefix(e,t){return e<=0?``:` ${`${t.colors.dim(t.glyph.rule)} `.repeat(e)}`}function renderBody(e,t,n,r){switch(e.kind){case`user`:return renderUser(e,t,n);case`assistant`:case`subagent-step`:return renderProse(e,t,n,r);case`reasoning`:return renderReasoning(e,t,n);case`tool`:case`subagent-tool`:return renderTool(e,t,n,r);case`error`:return renderError(e,t,n);case`notice`:return renderNotice(e,t,n);case`warning`:return renderWarning(e,t,n);case`result`:return renderResult(e,t,n);case`flow`:return renderFlow(e,t,n);case`command`:return renderCommand(e,n,r);case`question`:case`connection-auth`:return renderPreformatted(e,t,n);case`sandbox`:return renderSandbox(e,t,n,r);case`log`:return renderLog(e,t,n);case`task`:return renderTask(e,t,n);case`turn-stats`:return renderTurnStats(e,t,n);case`session-boundary`:case`agent-header`:return(e.body??``).split(`
2
2
  `)}}function renderUser(e,t,n){let r=e.promptOrigin===`steer`?n.colors.yellow(n.glyph.user):n.glyph.user;return wrap(e.body??``,t-2).map(e=>`${r} ${n.colors.bold(e)}`)}function renderProse(e,t,n,r){let i=[],a=e.kind===`subagent-step`,o=r.renderMarkdown??!0,s=a?``:`${n.colors.bold(n.glyph.brand)} `,c=a?``:` `;e.reasoning&&e.reasoning.trim().length>0&&i.push(...renderReasoningLines(e.reasoning,t,n));let l=(e.body??``).trim();return l.length===0&&i.length===0?[`${s}${n.colors.dim(`thinking${n.glyph.ellipsis}`)}`]:(l.length>0&&(o?renderMarkdown(l,t-c.length):l).split(`
3
3
  `).flatMap(e=>wrapVisibleLine(e,t-c.length)).forEach((e,t)=>{t===0&&!a&&i.length===0?i.push(`${s}${e}`):i.push(`${c}${e}`)}),i.length>0?i:[`${s}`])}function renderReasoning(e,t,n){return e.collapsed?[`${n.colors.gray(n.glyph.reasoning)} ${n.colors.dim(e.title??`thinking`)}`]:renderReasoningLines(e.body??``,t,n,n.glyph.reasoning)}function renderReasoningLines(e,t,n,r){let i=r?2:0,a=wrap(e.trim(),t-i);return a.length===0?[]:a.map((e,t)=>`${r?t===0?`${n.colors.gray(r)} `:` `:``}${n.colors.dim(n.colors.italic(e))}`)}function renderError(e,t,n){let r=n.colors.red(n.colors.bold(n.glyph.error)),i=e.title??`Error`,a=[`${r} ${n.colors.red(n.colors.bold(i))}`];for(let r of wrap(e.body??``,t-2))a.push(` ${colorizeError(r,n)}`);if(e.hint!==void 0&&e.hint.trim().length>0)for(let[r,i]of wrap(e.hint,t-4).entries()){let e=r===0?`${n.glyph.arrow} `:` `;a.push(` ${n.colors.cyan(`${e}${i}`)}`)}return a.push(...renderErrorDetail(e.detail,t,n)),a}function renderErrorDetail(e,t,n){if(e===void 0||e.trim().length===0)return[];let r=e.split(`
4
4
  `),i=r.slice(0,12),a=i.map(e=>` ${n.colors.dim(truncatePlain(e,Math.max(1,t-2)))}`),o=r.length-i.length;return o>0&&a.push(` ${n.colors.dim(`${n.glyph.ellipsis} +${o} more line${o===1?``:`s`}`)}`),a}const URL_PATTERN=/(https?:\/\/\S+)/u;function colorizeError(e,t){return URL_PATTERN.test(e)?e.split(URL_PATTERN).map((e,n)=>n%2==1?t.colors.cyan(e):t.colors.red(e)).join(``):t.colors.red(e)}function renderNotice(e,t,n){let r=n.colors.dim(n.glyph.dot),i=wrap(e.body??``,t-2);return i.length===0?[r]:i.map(e=>`${r} ${n.colors.dim(e)}`)}function renderAttentionRows(e,t,n){let r=n.colors.yellow(n.glyph.warning);return wrap(e,t-2).map((e,t)=>`${t===0?r:` `} ${paintCommands(e,n)}`)}function renderWarning(e,t,n){return renderAttentionRows(e.body??``,t,n)}function paintCommands(e,t){return e.replace(/\/[a-z:-]+/g,e=>isPromptControlCommand(e)?t.colors.blue(e):e)}function renderCommand(e,t,n){let r=t.colors;return[`${e.live===!0?n.transientPanelOpen===!0?t.glyph.user:n.setupFlowOpen===!0?r.gray(t.glyph.square):r.gray(n.activityPulse):e.status===`done`?r.gray(`*`):t.glyph.user} ${e.result===void 0?e.body??``:r.dim(e.result)}`]}function renderFlow(e,t,n){let r=wrap(e.body??``,t-2),i=n.colors.dim(`*`);return r.map((e,t)=>`${t===0?i:` `} ${e}`)}function renderResult(e,t,n){let r=wrap(e.body??``,t-7),i=n.colors.dim(n.glyph.elbow);if(r.length===0)return[` ${i}`];let dim=e=>n.colors.dim(e.replaceAll(`\x1B[22m`,`\x1B[22m\x1B[2m`));return r.map((e,t)=>t===0?` ${i} ${dim(e)}`:` ${dim(e)}`)}function renderPreformatted(e,t,n){let r=e.kind===`connection-auth`?n.colors.yellow(n.glyph.connection):n.colors.yellow(n.colors.bold(n.glyph.question)),i=e.kind===`question`?` `:` `,a=wrap(e.title??``,t-2),o=a.length===0?[`${r} `]:a.map((e,t)=>t===0?`${r} ${n.colors.bold(e)}`:` ${n.colors.bold(e)}`);for(let n of(e.body??``).split(`
5
5
  `))for(let e of wrapVisibleLine(n,Math.max(1,t-i.length)))o.push(`${i}${e}`);return o}function renderSandbox(e,t,n,r){let i=n.colors.cyan(n.glyph.rule),a=n.colors.dim(`sandbox ${n.glyph.dot} `),o=visibleLength(a),s=` `.repeat(o),c=r.previous?.kind===`sandbox`,l=(e.body??``).split(`
6
- `),u=[];for(let e of l){let r=wrapVisibleLine(e,Math.max(1,t-2-o));for(let e of r){let t=u.length===0&&!c?a:s;u.push(`${i} ${t}${n.colors.gray(e)}`)}}return u.length>0?u:[`${i}`]}function renderLog(e,t,n){let r=e.title===`stderr`,i=r?n.colors.red:n.colors.gray,a=n.colors.dim(n.glyph.rule),o=r?`stderr`:`stdout`,s=[`${n.colors.dim(n.glyph.reasoning)} ${n.colors.dim(o)}`];e.elided!==void 0&&e.elided>0&&s.push(`${a} ${elisionText(e.elided,n)}`);for(let r of(e.body??``).split(`
7
- `))for(let e of wrapVisibleLine(r,Math.max(1,t-2)))s.push(`${a} ${n.colors.dim(i(e))}`);return s}function renderTurnStats(e,t,n){let r=e.body??``;return[n.colors.dim(truncatePlain(r,Math.max(1,t)))]}function renderTask(e,t,n){let r=n.colors,{mark:i,detail:a,color:o}=taskLineStyle(e,n),s=` ${i} ${r.bold(truncate(e.title??`task`,t-4))}`,c=t-visibleLength(s)-2;return a.length===0||c<6?[clipVisible(s,Math.max(1,t))]:[clipVisible(`${s} ${o(truncate(a,c))}`,Math.max(1,t))]}function taskLineStyle(e,t){let n=t.colors;switch(e.status){case`done`:return{mark:n.green(t.glyph.success),detail:e.body??``,color:n.dim};case`error`:return{mark:n.red(t.glyph.error),detail:e.body??`failed`,color:n.red};case`denied`:return{mark:n.dim(t.glyph.square),detail:e.body??`stopped`,color:n.dim};default:return{mark:(e.taskKind===`agent`?n.orange:n.gray)(t.glyph.subagent),detail:e.subtitle??``,color:n.gray}}}function wrap(e,t){return e.trim().length===0?[]:e.split(`
6
+ `),u=[];for(let e of l){let r=wrapVisibleLine(e,Math.max(1,t-2-o));for(let e of r){let t=u.length===0&&!c?a:s;u.push(`${i} ${t}${n.colors.gray(e)}`)}}return u.length>0?u:[`${i}`]}function renderLog(e,t,n){let r=e.logLevel===`error`?n.colors.red:e.logLevel===`warn`?n.colors.yellow:n.colors.gray,i=n.colors.dim(n.glyph.rule),a=e.logLevel??e.title??`stdout`,o=[`${n.colors.dim(n.glyph.reasoning)} ${n.colors.dim(a)}`];e.elided!==void 0&&e.elided>0&&o.push(`${i} ${elisionText(e.elided,n)}`);for(let a of(e.body??``).split(`
7
+ `))for(let e of wrapVisibleLine(a,Math.max(1,t-2)))o.push(`${i} ${n.colors.dim(r(e))}`);return o}function renderTurnStats(e,t,n){let r=e.body??``;return[n.colors.dim(truncatePlain(r,Math.max(1,t)))]}function renderTask(e,t,n){if(e.status===void 0)return[` ${renderToolHeader(e.title??`task`,e.subtitle??``,n.colors.gray(n.glyph.square),t-1,n)}`];let r=n.colors,{mark:i,detail:a,color:o}=taskLineStyle(e,n),s=` ${i} ${r.bold(truncate(e.title??`task`,t-4))}`,c=t-visibleLength(s)-2;return a.length===0||c<6?[clipVisible(s,Math.max(1,t))]:[clipVisible(`${s} ${o(truncate(a,c))}`,Math.max(1,t))]}function taskLineStyle(e,t){let n=t.colors;switch(e.status){case`done`:return{mark:n.green(t.glyph.success),detail:e.body??``,color:n.dim};case`error`:return{mark:n.red(t.glyph.error),detail:e.body??`failed`,color:n.red};case`denied`:return{mark:n.dim(t.glyph.square),detail:e.body??`stopped`,color:n.dim};default:return{mark:(e.taskKind===`agent`?n.orange:n.gray)(t.glyph.subagent),detail:e.subtitle??``,color:n.gray}}}function wrap(e,t){return e.trim().length===0?[]:e.split(`
8
8
  `).flatMap(e=>wrapVisibleLine(e,Math.max(1,t)))}function truncatePlain(e,t){return visibleLength(e)<=t?e:sliceVisible(e,t)}export{renderAttentionRows,renderBlockLines};
@@ -0,0 +1,54 @@
1
+ import type { ConversationState } from "#client/conversation-state.js";
2
+ import type { EveAgentStoreSnapshot } from "#client/eve-agent-store.js";
3
+ import type { EveAgentReducer } from "#client/reducer.js";
4
+ import { type FailureStreamEvent } from "./errors.js";
5
+ export interface TokenUsage {
6
+ readonly inputTokens: number;
7
+ readonly outputTokens: number;
8
+ }
9
+ /** Terminal presentation facts that the canonical conversation does not model. */
10
+ export interface TuiSessionData {
11
+ /** Step usage summed across the session; the renderer subtracts a turn baseline. */
12
+ readonly usage: TokenUsage;
13
+ /** The latest step's report, whose input restates the context size. */
14
+ readonly lastStepUsage?: {
15
+ readonly inputTokens?: number;
16
+ readonly outputTokens?: number;
17
+ };
18
+ /** The model the latest turn resolved; cleared when another turn starts. */
19
+ readonly modelId?: string;
20
+ readonly modelTurnId?: string;
21
+ /** One entry per failure cascade (`step.failed` → `turn.failed` → `session.failed`). */
22
+ readonly failures: readonly FailureStreamEvent[];
23
+ readonly sessionFailed: boolean;
24
+ /** Failure keys seen since the last `turn.started`, for cascade deduplication. */
25
+ readonly turnFailureKeys: readonly string[];
26
+ /** Tools' authored `label` copy by call, which the canonical conversation drops. */
27
+ readonly toolLabels: Readonly<Record<string, ToolLabels>>;
28
+ /** Calls the session refused for the model to retry; people only see the retry. */
29
+ readonly withdrawnCallIds: readonly string[];
30
+ }
31
+ export interface ToolLabels {
32
+ readonly start?: string;
33
+ readonly complete?: string;
34
+ }
35
+ export declare const tuiSessionReducer: EveAgentReducer<TuiSessionData>;
36
+ /** One rendered failure cascade. */
37
+ export interface AgentTUIFailure {
38
+ readonly message: string;
39
+ readonly hint?: string;
40
+ /** Diagnostic dump for unrecognized failures. */
41
+ readonly detail?: string;
42
+ }
43
+ /** Everything the renderer draws for the session, derived from one store snapshot. */
44
+ export interface AgentTUIConversationView {
45
+ readonly conversation: ConversationState;
46
+ /** A turn is being submitted or is running, including server-initiated turns. */
47
+ readonly working: boolean;
48
+ readonly data: TuiSessionData;
49
+ readonly failures: readonly AgentTUIFailure[];
50
+ }
51
+ export declare function conversationView(snapshot: EveAgentStoreSnapshot<TuiSessionData>,
52
+ /** Replaces a failure's harness hint with a surface-local fix. */
53
+ failureHint?: (event: FailureStreamEvent) => string | undefined): AgentTUIConversationView;
54
+ export declare function isWorking(status: EveAgentStoreSnapshot<unknown>["status"]): boolean;
@@ -0,0 +1 @@
1
+ import{failureKey,formatFailureDetail,formatFailureHint,formatFailureMessage}from"./errors.js";import{isTaskRetryRefusal}from"#protocol/task-tools.js";import{stripAnsi}from"#cli/ui/terminal-text.js";const tuiSessionReducer={initial:()=>({usage:{inputTokens:0,outputTokens:0},failures:[],sessionFailed:!1,turnFailureKeys:[],toolLabels:{},withdrawnCallIds:[]}),reduce(e,t){switch(t.type){case`actions.requested`:{let n=t.data.presentation;if(n===void 0)return e;let r={...e.toolLabels};for(let e of t.data.actions){let t=n[e.callId]?.label;t!==void 0&&(r[e.callId]={start:t})}return{...e,toolLabels:r}}case`action.result`:{let{callId:n}=t.data.result;if(isTaskRetryRefusal(t))return{...e,withdrawnCallIds:[...e.withdrawnCallIds,n]};let r=t.data.presentation?.[n]?.label;if(r===void 0)return e;let i={...e.toolLabels,[n]:{...e.toolLabels[n],complete:r}};return{...e,toolLabels:i}}case`turn.started`:{let{turnId:n}=t.data;if(e.turnFailureKeys.length===0&&n===e.modelTurnId)return e;let{modelId:r,...i}=e;return n===e.modelTurnId?{...e,turnFailureKeys:[]}:{...i,modelTurnId:n,turnFailureKeys:[]}}case`step.started`:{let n=stripAnsi(t.data.modelId.slice(0,256)).replace(/\s+/gu,` `).trim()||void 0;if(n===e.modelId)return e;let{modelId:r,...i}=e,a=t.data.turnId;return n===void 0?{...i,modelTurnId:a}:{...i,modelId:n,modelTurnId:a}}case`step.completed`:{let n=t.data.usage;return n===void 0?e:{...e,lastStepUsage:n,usage:{inputTokens:e.usage.inputTokens+(n.inputTokens??0),outputTokens:e.usage.outputTokens+(n.outputTokens??0)}}}case`step.failed`:case`turn.failed`:case`session.failed`:{let n=failureKey(t),r=e.sessionFailed||t.type===`session.failed`;return e.turnFailureKeys.includes(n)?{...e,sessionFailed:r}:{...e,failures:[...e.failures,t],sessionFailed:r,turnFailureKeys:[...e.turnFailureKeys,n]}}default:return e}}};function conversationView(e,t){return{conversation:e.conversation,working:isWorking(e.status),data:e.data,failures:e.data.failures.map(e=>{let n={message:formatFailureMessage(e)},r=t?.(e)??formatFailureHint(e);r!==void 0&&(n.hint=r);let i=formatFailureDetail(e);return i!==void 0&&(n.detail=i),n})}}function isWorking(e){return e===`submitted`||e===`streaming`||e===`resuming`}export{conversationView,isWorking,tuiSessionReducer};
@@ -7,6 +7,9 @@ interface FlowDrawer {
7
7
  }
8
8
  /** Frames an active setup flow above the terminal footer. */
9
9
  export declare function renderFlowDrawer(state: FlowPanelState, theme: Theme, width: number): FlowDrawer;
10
- /** Frames a transient command panel with the same rules as a setup flow. */
11
- export declare function renderTransientDrawer(body: readonly string[], controls: readonly string[], theme: Theme, width: number): FlowDrawer;
10
+ /**
11
+ * Frames a transient command panel with the same rules as a setup flow. A `corner` label sits at
12
+ * the right end of the top rule.
13
+ */
14
+ export declare function renderTransientDrawer(body: readonly string[], controls: readonly string[], theme: Theme, width: number, corner?: string, compact?: boolean, labelSide?: "left" | "right"): FlowDrawer;
12
15
  export {};
@@ -1 +1 @@
1
- import{renderFlowPanel}from"./setup-panel.js";function renderFlowDrawer(e,t,n){let r=renderFlowPanel({...e,title:``},t,n),i=e.content.kind===`question`?r.lastIndexOf(``):-1,a=i===-1?[]:r.slice(i+1).map(e=>e.trimStart());return{rows:frameDrawer(i===-1?r:r.slice(0,i),t,n),controls:a}}function renderTransientDrawer(e,t,n,r){return{rows:frameDrawer(e,n,r),controls:t.map(e=>` ${n.colors.dim(e)}`)}}function frameDrawer(e,t,n){let r=t.colors.dim(t.glyph.dash.repeat(Math.max(1,n)));return[r,``,...e,``,r]}export{renderFlowDrawer,renderTransientDrawer};
1
+ import{renderFlowPanel}from"./setup-panel.js";import{sliceVisible,visibleLength}from"#cli/ui/terminal-text.js";function renderFlowDrawer(e,t,n){let r=renderFlowPanel({...e,title:``},t,n),i=e.content.kind===`question`?r.lastIndexOf(``):-1,a=i===-1?[]:r.slice(i+1).map(e=>e.trimStart());return{rows:frameDrawer(i===-1?r:r.slice(0,i),t,n),controls:a}}function renderTransientDrawer(e,t,n,r,i,a=!1,o=`right`){return{rows:frameDrawer(e,n,r,i,a,o),controls:t.map(e=>` ${n.colors.dim(e)}`)}}function frameDrawer(e,t,n,r,i=!1,a=`right`){let o=t.colors.dim(t.glyph.dash.repeat(Math.max(1,n)));return[r===void 0?o:labeledRule(r,t,n,a),...i?[]:[``],...e,...i?[]:[``],o]}function labeledRule(e,t,n,r){let i=t.glyph.dash,a=n-6;if(a<1)return t.colors.dim(i.repeat(Math.max(1,n)));let o=visibleLength(e)<=a?e:`${sliceVisible(e,a-visibleLength(t.glyph.ellipsis))}${t.glyph.ellipsis}`,s=n-visibleLength(o)-4;return t.colors.dim(r===`left`?`${i.repeat(2)} ${o} ${i.repeat(s)}`:`${i.repeat(s)} ${o} ${i.repeat(2)}`)}export{renderFlowDrawer,renderTransientDrawer};
@@ -1,13 +1,7 @@
1
- /** Every supported captured-output filter, in CLI help order. */
2
- export declare const LOG_DISPLAY_MODES: readonly ["all", "stderr", "sandbox", "none"];
1
+ import type { LogLevel } from "#internal/logging.js";
2
+ export declare const LOG_DISPLAY_MODES: readonly ["none", "error", "warn", "debug", "all"];
3
3
  export type LogDisplayMode = (typeof LOG_DISPLAY_MODES)[number];
4
- /**
5
- * Order the dev TUI's Ctrl+L shortcut steps through {@link LogDisplayMode}
6
- * values, starting from `none`: each press reveals the next view and wraps
7
- * back to `none`.
8
- */
9
- export declare const LOG_DISPLAY_MODE_CYCLE: readonly ["none", "all", "stderr", "sandbox"];
10
- /** Parses one CLI or `/loglevel` argument into a supported display mode. */
4
+ export declare const LOG_DISPLAY_MODE_CYCLE: readonly ["none", "error", "warn", "debug", "all"];
11
5
  export declare function parseLogDisplayMode(value: string): LogDisplayMode | undefined;
12
- /** The mode after `current` in the Ctrl+L cycle, wrapping at the end. */
13
6
  export declare function nextLogDisplayMode(current: LogDisplayMode): LogDisplayMode;
7
+ export declare function isLogVisible(mode: LogDisplayMode, level?: LogLevel): boolean;
@@ -1 +1 @@
1
- const LOG_DISPLAY_MODES=[`all`,`stderr`,`sandbox`,`none`],LOG_DISPLAY_MODE_CYCLE=[`none`,`all`,`stderr`,`sandbox`];function parseLogDisplayMode(e){return LOG_DISPLAY_MODES.find(t=>t===e)}function nextLogDisplayMode(e){let t=LOG_DISPLAY_MODE_CYCLE.indexOf(e);return LOG_DISPLAY_MODE_CYCLE[(t+1)%LOG_DISPLAY_MODE_CYCLE.length]??`none`}export{LOG_DISPLAY_MODES,LOG_DISPLAY_MODE_CYCLE,nextLogDisplayMode,parseLogDisplayMode};
1
+ const LOG_DISPLAY_MODES=[`none`,`error`,`warn`,`debug`,`all`],LOG_DISPLAY_MODE_CYCLE=[`none`,`error`,`warn`,`debug`,`all`];function parseLogDisplayMode(e){return LOG_DISPLAY_MODES.find(t=>t===e)}function nextLogDisplayMode(e){let t=LOG_DISPLAY_MODE_CYCLE.indexOf(e);return LOG_DISPLAY_MODE_CYCLE[(t+1)%LOG_DISPLAY_MODE_CYCLE.length]??`none`}function isLogVisible(e,t){return e===`none`?!1:e===`all`||t===`error`?!0:e===`debug`?t!==void 0:e===`warn`&&t===`warn`}export{LOG_DISPLAY_MODES,LOG_DISPLAY_MODE_CYCLE,isLogVisible,nextLogDisplayMode,parseLogDisplayMode};
@@ -1,89 +1,33 @@
1
1
  /**
2
- * The pinned message-queue panel: client-side state and pure rendering for
3
- * messages submitted while a turn is still streaming.
4
- *
5
- * When steering is unavailable, Enter queues the draft (up to
6
- * {@link MESSAGE_QUEUE_LIMIT}); each queued
7
- * message waits for the turn to end, where the whole queue coalesces into
8
- * the next turn's message. Esc or Ctrl+C pops the oldest message to steer the
9
- * conversation instead of waiting: the renderer sends the popped message to
10
- * the active session for admission at its next execution boundary.
11
- * `/cancel` requests cancellation directly. Either key on an empty queue
12
- * cancels the turn immediately without a replacement message.
13
- *
14
- * The renderer owns lifecycle (keys, cancel requests, when the runner drains
15
- * the queue); this module only holds the queue state machine and paints rows.
2
+ * The pinned message-queue panel: messages submitted while the agent is still
3
+ * starting. Each queued message waits for the agent to become ready, where the
4
+ * whole queue coalesces into the first turn's message.
16
5
  */
17
6
  import type { Theme } from "./theme.js";
18
7
  /** Most messages the queue holds; Enter on a full queue keeps the draft. */
19
8
  export declare const MESSAGE_QUEUE_LIMIT = 5;
20
- /** What one Esc press did to the queue state. */
21
- type MessageQueueEscapeOutcome =
22
- /**
23
- * A message is staged for steering. The caller sends it to the active
24
- * session; repeated presses may select more queued messages.
25
- */
26
- "steer"
27
- /** Empty queue — the caller should cancel the turn. */
28
- | "cancel";
29
9
  /** Read-only projection consumed by {@link renderMessageQueueRows}. */
30
- interface MessageQueueView {
10
+ export interface MessageQueueView {
31
11
  readonly messages: readonly string[];
32
12
  readonly full: boolean;
33
- /** A popped message is awaiting steering admission. */
34
- readonly steering: boolean;
35
- /** A cancel key on an empty queue landed; cancellation was requested. */
36
- readonly cancelling: boolean;
37
13
  }
38
14
  export declare class MessageQueue {
39
15
  #private;
40
- get size(): number;
41
16
  get full(): boolean;
42
- /** True when nothing is queued, staged, or cancelling. */
43
- get idle(): boolean;
44
17
  /** Queues one message; returns false (draft stays put) when full. */
45
18
  enqueue(message: string): boolean;
46
- /**
47
- * Applies one Esc or Ctrl+C press. Pops the oldest queued message into the
48
- * staged steer payload while any remain; with an empty queue, requests
49
- * cancellation immediately.
50
- */
51
- handleEscape(): MessageQueueEscapeOutcome;
52
- /** Marks a direct cancellation request without consuming queued messages. */
53
- requestCancellation(): void;
54
- /** Clears per-turn Esc state when a new stream starts rendering. */
55
- beginTurn(): void;
56
- /**
57
- * The next prompt to submit after a turn boundary: the staged steer
58
- * message when one exists (remaining queued messages stay queued for the
59
- * steered turn), otherwise the whole queue coalesced into one message.
60
- */
19
+ /** Every queued message coalesced into one prompt; clears the queue. */
61
20
  takePrompt(): string | undefined;
62
- /** Takes only a key-selected message for immediate boundary steering. */
63
- takeSteering(): string | undefined;
64
- /** Preserves an unaccepted steering message for a later retry. */
65
- restoreSteering(message: string): void;
66
- /**
67
- * Everything still held — staged steer payload plus queued messages —
68
- * coalesced for restoring into the prompt editor when a turn ends without
69
- * a clean boundary (interrupt, transport failure). Clears the queue.
70
- */
71
- restoreDraft(): string | undefined;
72
- reset(): void;
73
21
  view(): MessageQueueView;
74
22
  }
75
- interface MessageQueuePanelRowsInput {
23
+ export interface MessageQueuePanelRowsInput {
76
24
  readonly view: MessageQueueView;
77
25
  readonly width: number;
78
26
  readonly theme: Theme;
79
- /** True while a turn streams — the only state in which keys steer. */
80
- readonly working: boolean;
81
27
  }
82
28
  /**
83
29
  * Paints the pinned queue panel, indented so its marks share the tool
84
30
  * column. Queued messages ride a `│` rail under the header (one clipped
85
- * line each) and the last closes it with `└`. The header carries the Esc
86
- * affordance — the panel is where steering and cancellation are taught.
31
+ * line each) and the last closes it with `└`.
87
32
  */
88
33
  export declare function renderMessageQueueRows(input: MessageQueuePanelRowsInput): string[];
89
- export {};
@@ -1 +1,3 @@
1
- import"./rail.js";import{clipVisible,stripTerminalControls}from"#cli/ui/terminal-text.js";const MESSAGE_QUEUE_LIMIT=5;var MessageQueue=class{#e=[];#t;#n=!1;get size(){return this.#e.length}get full(){return this.#e.length>=5}get idle(){return this.#e.length===0&&this.#t===void 0&&!this.#n}enqueue(e){return!this.full&&(this.#e.push(e),!0)}handleEscape(){let e=this.#e.shift();return e===void 0?this.#t===void 0?(this.#n=!0,`cancel`):`steer`:(this.#t=joinMessages(this.#t,e),`steer`)}requestCancellation(){this.#n=!0}beginTurn(){this.#n=!1}takePrompt(){this.#n=!1;let e=this.#t;return e===void 0?this.#r():(this.#t=void 0,e)}takeSteering(){let e=this.#t;return this.#t=void 0,e}restoreSteering(e){this.#t=joinOptionalMessages(e,this.#t)}restoreDraft(){this.#n=!1;let e=this.#t;return this.#t=void 0,joinOptionalMessages(e,this.#r())}reset(){this.#e=[],this.#t=void 0,this.#n=!1}view(){return{messages:[...this.#e],full:this.full,steering:this.#t!==void 0,cancelling:this.#n}}#r(){if(this.#e.length===0)return;let e=this.#e.reduce(joinOptionalMessages,void 0);return this.#e=[],e}};function joinMessages(e,t){return e===void 0?t:`${e}\n\n${t}`}function joinOptionalMessages(e,t){return t===void 0?e:joinMessages(e,t)}function renderMessageQueueRows(e){let{view:t,width:n,theme:r,working:i}=e,a=r.colors,o=r.glyph;if(t.messages.length===0&&!t.steering)return i&&t.cancelling?[clipVisible(` ${a.yellow(o.dotActive)} ${a.dim(`Cancelling turn… · Ctrl+C to stop waiting, then again to exit`)}`,n)]:[];let s=[clipVisible(` ${a.gray(o.arrowUp)} ${headerBody(t,i,r)}`,n)];for(let[e,r]of t.messages.entries()){let i=e===t.messages.length-1?o.corner:o.rule,c=firstLine(stripTerminalControls(r));s.push(clipVisible(` ${a.dim(i)} ${a.dim(c)}`,n))}return s}function headerBody(e,t,n){let r=n.colors,i=` ${n.glyph.dot} `,a=`${String(e.messages.length)}/5`;if(e.steering){let t=e.messages.length>0?`${i}${a} still queued`:``;return r.dim(`Steering — waiting for the next boundary…${t}`)}let o=e.full?`${i}queue full`:``,s=t?`${i}esc or ctrl+c steers with the next message`:``;return`${r.bold(`Queue`)} ${r.dim(`${a}${o}${s}`)}`}function firstLine(e){return e.split(/\r?\n/u,1)[0]??``}export{MESSAGE_QUEUE_LIMIT,MessageQueue,renderMessageQueueRows};
1
+ import"./rail.js";import{clipVisible,stripTerminalControls}from"#cli/ui/terminal-text.js";const MESSAGE_QUEUE_LIMIT=5;var MessageQueue=class{#e=[];get full(){return this.#e.length>=5}enqueue(e){return!this.full&&(this.#e.push(e),!0)}takePrompt(){if(this.#e.length===0)return;let e=this.#e.join(`
2
+
3
+ `);return this.#e=[],e}view(){return{messages:[...this.#e],full:this.full}}};function renderMessageQueueRows(e){let{view:t,width:n,theme:r}=e;if(t.messages.length===0)return[];let i=r.colors,a=r.glyph,o=`${String(t.messages.length)}/5`,s=t.full?` ${a.dot} queue full`:``,c=[clipVisible(` ${i.gray(a.arrowUp)} ${i.bold(`Queue`)} ${i.dim(`${o}${s}`)}`,n)];for(let[e,r]of t.messages.entries()){let o=e===t.messages.length-1?a.corner:a.rule,s=firstLine(stripTerminalControls(r));c.push(clipVisible(` ${i.dim(o)} ${i.dim(s)}`,n))}return c}function firstLine(e){return e.split(/\r?\n/u,1)[0]??``}export{MESSAGE_QUEUE_LIMIT,MessageQueue,renderMessageQueueRows};
@@ -2,7 +2,7 @@ export type PromptCommandExtensionName = "login" | "model" | "add" | "deploy";
2
2
  type PromptCommandTarget = "local" | "remote";
3
3
  /** The slash commands the prompt accepts. */
4
4
  export type PromptCommand = {
5
- type: "reset";
5
+ type: "new";
6
6
  } | {
7
7
  type: "cancel";
8
8
  } | {
@@ -76,11 +76,11 @@ declare const PROMPT_COMMAND_DEFINITIONS: ({
76
76
  } | {
77
77
  name: string;
78
78
  history: "keep";
79
- aliases: never[];
79
+ aliases: string[];
80
80
  description: string;
81
81
  takesArgument: false;
82
82
  build: () => {
83
- type: "reset";
83
+ type: "new";
84
84
  };
85
85
  targets: ("local" | "remote")[];
86
86
  argumentHint?: undefined;
@@ -88,7 +88,7 @@ declare const PROMPT_COMMAND_DEFINITIONS: ({
88
88
  } | {
89
89
  name: string;
90
90
  history: "keep";
91
- aliases: string[];
91
+ aliases: never[];
92
92
  description: string;
93
93
  takesArgument: false;
94
94
  build: () => {
@@ -243,9 +243,9 @@ export declare function promptCommandsFor(target: PromptCommandTarget): readonly
243
243
  /** Whether a command runs against this target — the one authority dispatch shares with discovery. */
244
244
  export declare function isPromptCommandAvailableFor(name: PromptCommandExtensionName, target: PromptCommandTarget): boolean;
245
245
  /**
246
- * Recognizes the slash commands the prompt accepts. `/reset` clears the
247
- * session and transcript; `/cancel` stops the running turn; `/clear` (and
248
- * `/new`) clears context; `/compact` queues context compaction; `/exit` (and
246
+ * Recognizes the slash commands the prompt accepts. `/new` (and `/reset`)
247
+ * starts a fresh session and transcript; `/cancel` stops the running turn;
248
+ * `/clear` clears context in place; `/compact` queues context compaction; `/exit` (and
249
249
  * `/quit`) terminate the TUI like Ctrl+C; extension commands are dispatched
250
250
  * outside the runner. Anything else — including unknown `/text` — is a normal
251
251
  * message.
@@ -1,2 +1,2 @@
1
- const PROMPT_COMMAND_DEFINITIONS=[{name:`model`,history:`omit`,aliases:[],description:`Choose a model, speed, and reasoning`,argumentHint:`[provider/model]`,takesArgument:!0,typeahead:{maxArguments:2,loadingLabel:`models`},build:e=>({type:`extension`,name:`model`,argument:e}),targets:[`local`]},{name:`reset`,history:`keep`,aliases:[],description:`Start a fresh session`,takesArgument:!1,build:()=>({type:`reset`}),targets:[`local`,`remote`]},{name:`clear`,history:`keep`,aliases:[`new`],description:`Clear the current session context`,takesArgument:!1,build:()=>({type:`clear`}),targets:[`local`,`remote`]},{name:`compact`,history:`keep`,aliases:[],description:`Compact the current session context`,takesArgument:!1,build:()=>({type:`compact`}),targets:[`local`,`remote`]},{name:`cancel`,history:`keep`,aliases:[],description:`Cancel the running turn`,takesArgument:!1,build:()=>({type:`cancel`}),targets:[`local`,`remote`]},{name:`login`,history:`omit`,aliases:[],description:`Connect a model provider`,argumentHint:`[connection]`,takesArgument:!0,typeahead:{maxArguments:1,loadingLabel:`connections`},build:e=>({type:`extension`,name:`login`,argument:e}),targets:[`local`]},{name:`add`,history:`omit`,aliases:[],description:`Add an integration from the registry`,takesArgument:!0,typeahead:{maxArguments:1,loadingLabel:`registry`},build:e=>({type:`extension`,name:`add`,argument:e}),targets:[`local`]},{name:`deploy`,history:`keep`,aliases:[],description:`Deploy the agent to Vercel`,takesArgument:!1,build:()=>({type:`extension`,name:`deploy`,argument:``}),targets:[`local`]},{name:`traces`,history:`omit`,aliases:[],description:`Open the local trace viewer`,argumentHint:`[trace]`,takesArgument:!0,build:e=>({type:`traces`,argument:e}),targets:[`local`]},{name:`loglevel`,history:`omit`,aliases:[],description:`Show or hide captured stdout/stderr/sandbox logs`,argumentHint:`[all|stderr|sandbox|none]`,takesArgument:!0,typeahead:{maxArguments:1,loadingLabel:`log levels`},build:e=>({type:`loglevel`,argument:e}),targets:[`local`,`remote`]},{name:`info`,history:`omit`,aliases:[],description:`Show application and messaging information`,takesArgument:!1,build:()=>({type:`info`}),targets:[`local`]},{name:`help`,history:`omit`,aliases:[],description:`Show available commands`,takesArgument:!1,build:()=>({type:`help`}),targets:[`local`,`remote`]},{name:`exit`,history:`keep`,aliases:[`quit`],description:`Quit the TUI`,takesArgument:!1,build:()=>({type:`exit`}),targets:[`local`,`remote`]}],PROMPT_COMMANDS=PROMPT_COMMAND_DEFINITIONS;function promptCommandsFor(e){let t=PROMPT_COMMAND_DEFINITIONS.filter(t=>t.targets.some(t=>t===e));return e===`remote`?[...t.filter(e=>e.name===`help`),...t.filter(e=>e.name!==`help`)]:t}function isPromptCommandAvailableFor(e,t){return(PROMPT_COMMAND_DEFINITIONS.find(t=>t.name===e)?.targets)?.includes(t)??!1}function parsePromptCommand(e){let t=promptCommandSpec(e);return t===void 0?null:t.spec.build(t.argument)}function promptCommandSpec(e){let t=e.trim();if(t.startsWith(`/`))for(let e of PROMPT_COMMANDS)for(let n of[e.name,...e.aliases]){let r=`/${n}`;if(t===r)return{spec:e,argument:``};if(e.takesArgument&&t.startsWith(`${r} `))return{spec:e,argument:t.slice(r.length).trim()}}}function isPromptControlCommand(e){return parsePromptCommand(e)!==null}function formatPromptCommandHelp(e=PROMPT_COMMANDS){let t=e.map(e=>{let t=e.argumentHint===void 0?``:` ${e.argumentHint}`,n=e.aliases.map(e=>` (/${e})`).join(``);return{invocation:`/${e.name}${t}${n}`,description:e.description}}),n=Math.max(...t.map(e=>e.invocation.length))+2;return t.map(e=>e.invocation.padEnd(n)+e.description).join(`
1
+ const PROMPT_COMMAND_DEFINITIONS=[{name:`model`,history:`omit`,aliases:[],description:`Choose a model, speed, and reasoning`,argumentHint:`[provider/model]`,takesArgument:!0,typeahead:{maxArguments:2,loadingLabel:`models`},build:e=>({type:`extension`,name:`model`,argument:e}),targets:[`local`]},{name:`new`,history:`keep`,aliases:[`reset`],description:`Start a fresh session`,takesArgument:!1,build:()=>({type:`new`}),targets:[`local`,`remote`]},{name:`clear`,history:`keep`,aliases:[],description:`Clear the session context and keep the session`,takesArgument:!1,build:()=>({type:`clear`}),targets:[`local`,`remote`]},{name:`compact`,history:`keep`,aliases:[],description:`Compact the current session context`,takesArgument:!1,build:()=>({type:`compact`}),targets:[`local`,`remote`]},{name:`cancel`,history:`keep`,aliases:[],description:`Cancel the running turn`,takesArgument:!1,build:()=>({type:`cancel`}),targets:[`local`,`remote`]},{name:`login`,history:`omit`,aliases:[],description:`Connect a model provider`,argumentHint:`[connection]`,takesArgument:!0,typeahead:{maxArguments:1,loadingLabel:`connections`},build:e=>({type:`extension`,name:`login`,argument:e}),targets:[`local`]},{name:`add`,history:`omit`,aliases:[],description:`Add an integration from the registry`,takesArgument:!0,typeahead:{maxArguments:1,loadingLabel:`registry`},build:e=>({type:`extension`,name:`add`,argument:e}),targets:[`local`]},{name:`deploy`,history:`keep`,aliases:[],description:`Deploy the agent to Vercel`,takesArgument:!1,build:()=>({type:`extension`,name:`deploy`,argument:``}),targets:[`local`]},{name:`traces`,history:`omit`,aliases:[],description:`Open the local trace viewer`,argumentHint:`[trace]`,takesArgument:!0,build:e=>({type:`traces`,argument:e}),targets:[`local`]},{name:`loglevel`,history:`omit`,aliases:[],description:`Choose the minimum displayed log severity`,argumentHint:`[none|error|warn|debug|all]`,takesArgument:!0,typeahead:{maxArguments:1,loadingLabel:`log levels`},build:e=>({type:`loglevel`,argument:e}),targets:[`local`,`remote`]},{name:`info`,history:`omit`,aliases:[],description:`Show application and messaging information`,takesArgument:!1,build:()=>({type:`info`}),targets:[`local`]},{name:`help`,history:`omit`,aliases:[],description:`Show available commands`,takesArgument:!1,build:()=>({type:`help`}),targets:[`local`,`remote`]},{name:`exit`,history:`keep`,aliases:[`quit`],description:`Quit the TUI`,takesArgument:!1,build:()=>({type:`exit`}),targets:[`local`,`remote`]}],PROMPT_COMMANDS=PROMPT_COMMAND_DEFINITIONS;function promptCommandsFor(e){let t=PROMPT_COMMAND_DEFINITIONS.filter(t=>t.targets.some(t=>t===e));return e===`remote`?[...t.filter(e=>e.name===`help`),...t.filter(e=>e.name!==`help`)]:t}function isPromptCommandAvailableFor(e,t){return(PROMPT_COMMAND_DEFINITIONS.find(t=>t.name===e)?.targets)?.includes(t)??!1}function parsePromptCommand(e){let t=promptCommandSpec(e);return t===void 0?null:t.spec.build(t.argument)}function promptCommandSpec(e){let t=e.trim();if(t.startsWith(`/`))for(let e of PROMPT_COMMANDS)for(let n of[e.name,...e.aliases]){let r=`/${n}`;if(t===r)return{spec:e,argument:``};if(e.takesArgument&&t.startsWith(`${r} `))return{spec:e,argument:t.slice(r.length).trim()}}}function isPromptControlCommand(e){return parsePromptCommand(e)!==null}function formatPromptCommandHelp(e=PROMPT_COMMANDS){let t=e.map(e=>{let t=e.argumentHint===void 0?``:` ${e.argumentHint}`,n=e.aliases.map(e=>` (/${e})`).join(``);return{invocation:`/${e.name}${t}${n}`,description:e.description}}),n=Math.max(...t.map(e=>e.invocation.length))+2;return t.map(e=>e.invocation.padEnd(n)+e.description).join(`
2
2
  `)}export{PROMPT_COMMANDS,formatPromptCommandHelp,isPromptCommandAvailableFor,isPromptControlCommand,parsePromptCommand,promptCommandSpec,promptCommandsFor};
@@ -7,7 +7,7 @@
7
7
  * rests on it (the provider-key grammar from the setup panel). The renderer
8
8
  * hosts lifecycle and keys; this module only paints rows.
9
9
  */
10
- import type { AgentTUIInputOption } from "./runner.js";
10
+ import type { AgentTUIInputContext, AgentTUIInputOption } from "./runner.js";
11
11
  import { type LineState } from "./line-editor.js";
12
12
  import type { Theme } from "./theme.js";
13
13
  interface QuestionPanelState {
@@ -22,5 +22,7 @@ interface QuestionPanelState {
22
22
  readonly caretVisible: boolean;
23
23
  }
24
24
  export declare function renderQuestionPanel(state: QuestionPanelState, theme: Theme, width: number): string[];
25
+ /** Who asked for a prompt and where it sits among the open requests, for the drawer's corner. */
26
+ export declare function inputContextLabel(context: AgentTUIInputContext | undefined, theme: Theme): string | undefined;
25
27
  export declare function renderQuestionChoices(options: readonly AgentTUIInputOption[], cursor: number, theme: Theme, forceCursor?: boolean): string[];
26
28
  export {};
@@ -1 +1 @@
1
- import{visibleLine}from"./line-editor.js";import{clipVisible,renderInputText,renderInputWithBlockCursor,wrapVisibleLine}from"#cli/ui/terminal-text.js";import{renderOptionRow}from"#setup/cli/option-row.js";const FREEFORM_ROW_LABEL=`Type your own answer…`;function renderQuestionPanel(e,t,n){let r=t.colors,i=[];for(let t of e.prompt.split(/\r?\n/u))for(let e of wrapVisibleLine(t,Math.max(8,n-2)))i.push(` ${r.bold(e)}`);return i.push(``),i.push(...renderQuestionChoices(e.options,e.cursor,t)),e.allowFreeform&&i.push(renderFreeformRow(e,t,n)),i.map(e=>clipVisible(e,n))}function renderQuestionChoices(e,t,n,r=!1){return e.flatMap((e,i)=>{let a=r||t===i,o=[` ${renderOptionRow({colors:n.colors,glyphs:{pointer:n.glyph.pointer,selectedPointer:n.glyph.selectedPointer,success:n.glyph.success,placeholder:n.glyph.option,dot:n.glyph.dot,warning:n.glyph.warning},label:e.label,isCursor:a,state:{kind:`available`,checked:!1},placeholder:!1,presentation:`minimal`})}`];return e.description!==void 0&&e.description.length>0&&o.push(` ${n.colors.dim(e.description)}`),o})}function renderFreeformRow(e,t,n){let r=t.colors,i=e.cursor===e.options.length,a=Math.max(4,n-6);if(!i){let n=visibleLine(e.editor,a,t.glyph.ellipsis),i=e.editor.text.length===0?FREEFORM_ROW_LABEL:`${n.before}${n.under}${n.after}`;return` ${r.dim(i)}`}let o=e.editor.text.length===0,s=o?{text:FREEFORM_ROW_LABEL,cursor:0}:e.editor;return` ${renderInputWithBlockCursor({...visibleLine(s,a,t.glyph.ellipsis),visible:e.caretVisible,inverse:r.inverse,render:o?e=>r.dim(renderInputText(e)):void 0})}`}export{renderQuestionChoices,renderQuestionPanel};
1
+ import{visibleLine}from"./line-editor.js";import{clipVisible,renderInputText,renderInputWithBlockCursor,stripTerminalControls,wrapVisibleLine}from"#cli/ui/terminal-text.js";import{renderOptionRow}from"#setup/cli/option-row.js";const FREEFORM_ROW_LABEL=`Type your own answer…`;function renderQuestionPanel(e,t,n){let r=t.colors,i=[];for(let t of e.prompt.split(/\r?\n/u))for(let e of wrapVisibleLine(t,Math.max(8,n-2)))i.push(` ${r.bold(e)}`);return i.push(``),i.push(...renderQuestionChoices(e.options,e.cursor,t)),e.allowFreeform&&i.push(renderFreeformRow(e,t,n)),i.map(e=>clipVisible(e,n))}function inputContextLabel(e,t){let n=[];return e?.requester!==void 0&&n.push(stripTerminalControls(e.requester)),e?.position!==void 0&&n.push(`${e.position.index} of ${e.position.total}`),n.length===0?void 0:n.join(` ${t.glyph.dot} `)}function renderQuestionChoices(e,t,n,r=!1){return e.flatMap((e,i)=>{let a=r||t===i,o=[` ${renderOptionRow({colors:n.colors,glyphs:{pointer:n.glyph.pointer,selectedPointer:n.glyph.selectedPointer,success:n.glyph.success,placeholder:n.glyph.option,dot:n.glyph.dot,warning:n.glyph.warning},label:e.label,isCursor:a,state:{kind:`available`,checked:!1},placeholder:!1,presentation:`minimal`})}`];return e.description!==void 0&&e.description.length>0&&o.push(` ${n.colors.dim(e.description)}`),o})}function renderFreeformRow(e,t,n){let r=t.colors,i=e.cursor===e.options.length,a=Math.max(4,n-6);if(!i){let n=visibleLine(e.editor,a,t.glyph.ellipsis),i=e.editor.text.length===0?FREEFORM_ROW_LABEL:`${n.before}${n.under}${n.after}`;return` ${r.dim(i)}`}let o=e.editor.text.length===0,s=o?{text:FREEFORM_ROW_LABEL,cursor:0}:e.editor;return` ${renderInputWithBlockCursor({...visibleLine(s,a,t.glyph.ellipsis),visible:e.caretVisible,inverse:r.inverse,render:o?e=>r.dim(renderInputText(e)):void 0})}`}export{inputContextLabel,renderQuestionChoices,renderQuestionPanel};