Skip to content

feat(eve): add the /traces conversation viewer to the dev TUI - #1403

Open
chadhietala wants to merge 2 commits into
trace-local-readerfrom
trace-conversation
Open

feat(eve): add the /traces conversation viewer to the dev TUI#1403
chadhietala wants to merge 2 commits into
trace-local-readerfrom
trace-conversation

Conversation

@chadhietala

@chadhietala chadhietala commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Stacked on #1444base is trace-local-reader, review that first. This is the core layer of the /traces stack: capture (#1443) and reading (#1444) sit below; provider-executed tool cards (#1445), drag-to-select copy (#1446), and chrome polish (#1447) sit above.

eve dev writes a local trace spool while you chat, but inspecting it meant leaving the TUI for eve traces and reading span trees. This adds /traces: a full-screen viewer that re-tells a trace as the conversation it recorded.

What changed

/traces opens on the terminal's alternate screen (the transcript's scrollback stays untouched underneath) and renders the trace as cards, discovered from the span tree and ordered by when their spans started:

  • the system prompt collapsed at the top with a token estimate; user and assistant message cards; tool cards with Input:/Output: sections. Assistant cards carry model, duration, token, and gateway-cost metadata plus a dim Thought: reasoning section; error spans paint their whole card red
  • work a subagent performed interleaves in time order — between the parent's dispatch and its resumed reply — with a dim subagent:<name> badge on every card of the delegated turn, and the delegated prompt rendered as a task card rather than a user message (uses the lineage attributes from feat(eve): attribute a subagent turn to the call that dispatched it #1433)
  • cards expand/collapse with / or a mouse click (SGR reporting); the viewport scrolls by lines with keys or the wheel, so an expanded card taller than the screen is reachable to its end
  • Enter opens a right-hand attributes drawer that stays metadata-only — status, timing, ids, non-payload OTLP attributes — since the cards already carry the payloads
  • the spool is polled about once a second, so spans from the live session stream in (● live badge); [/] cycles traces, and the viewer opens on the current chat session's trace by matching session ids against the spool

The state is a pure reducer (trace-viewer-state.ts) with rendering split from it (trace-view.ts, trace-conversation.ts), a store that caches parsed segments so the 1 s poll only touches new files, and a session controller owning the poll/repaint lifecycle — all testable without a TTY. Keys survive in-flight polls: navigation during a slow disk read is re-applied against the fresh data rather than clobbered.

Verification

Unit coverage for the store, reducer, frame renderer, and conversation builder (819 tests under cli/dev/tui at this layer). test/tui-client/tui-traces.ts drives the real runner through a pty: open → arrow-key fold → mouse-click expand → drawer metadata-only → subagent badge → trace cycling → escape → empty spool. Repeated end-to-end use against real spool data (fixtures through the gateway). Sweep green; full suite at the stack top.

@vercel

vercel Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
eve-docs Ready Ready Preview Jul 31, 2026 11:14am
eve-docs-4759 Ready Ready Preview, v0 Jul 31, 2026 11:14am

@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Bundle + Package Summary: apps/fixtures/weather-agent

Key takeaways

  • No notable deltas vs trace-local-reader (436af4e).

Delta vs trace-local-reader (436af4e)

Area Metric Baseline Current Delta
Package Packed tarball 7.63 MB 7.65 MB +15.7 kB ⚠️
Package Unpacked publish size 28.81 MB 28.86 MB +48.9 kB ⚠️
Package Installed footprint 85.78 MB 85.83 MB +48.9 kB ⚠️
Package Published files 2876 2890 +14
Package Installed files 6669 6683 +14
Runtime Unique function payloads 2 2 0
Runtime Total function bytes 16.82 MB 16.82 MB -40 B ✅
Runtime Public routes 11 11 0
Changed function payloads vs trace-local-reader (436af4e) (2)
Function Status Baseline Current Delta Route changes
functions/__server.func changed 8.41 MB 8.41 MB -20 B ✅ none
functions/.well-known/workflow/v1/flow.func changed 8.41 MB 8.41 MB -20 B ✅ none

eve init install

Metric Baseline Current Delta
Installed footprint 124.19 MB 124.24 MB +48.9 kB ⚠️
Installed packages 128 128 0
dependencies 4 4 0
devDependencies 2 2 0
Dependency package bytes 43.18 MB 43.23 MB +48.9 kB ⚠️
devDependency package bytes 5.04 MB 5.04 MB 0 B ➖
Build Metadata
  • Preset: vercel
  • Nitro: nitro@3.0.260610-beta
  • Output directory: apps/fixtures/weather-agent/.vercel/output
  • Build metadata timestamp: 2026-07-31T11:14:56.123Z
  • Route aliases: 11 public, 1 internal (12 total aliases)
  • Vercel routes in config: 14
  • Severity legend: 🔴 dominant/large, 🟠 notable, 🟡 watch, ⚪ small
Package Drill-Down

Package Details

  • Package: eve@0.29.2
  • Package directory: packages/eve
  • Tarball: 7.65 MB (eve-0.29.2.tgz)
  • Unpacked payload: 28.86 MB across 2890 published files
  • Installed footprint: 85.83 MB across 6683 installed files
  • Installed root package: 27.50 MB
  • Installed dependencies: 58.33 MB
  • Runtime dependencies: 2
  • Peer dependencies: 5 (4 optional)

Installed footprint is measured from an isolated temporary npm install of the packed tarball.

Heavy installed dependencies

  • eve: 27.50 MB (32.0%)
  • @rolldown/binding-linux-x64-gnu: 19.28 MB (22.5%)
  • @rolldown/binding-wasm32-wasi: 10.66 MB (12.4%)
  • ai: 6.56 MB (7.6%)
  • zod: 5.07 MB (5.9%)
Publish payload breakdown
Published file size
🔴 dist/src/compiled/shadcn-registry/index.js       [########################] 13.15 MB 45.6%
🟠 dist/src/compiled/experimental-ai-sdk-code-mo... [###.....................] 1.51 MB 5.2%
🟡 dist/src/compiled/@vercel/sandbox/index.js       [#.......................] 632.5 kB 2.2%
🟡 dist/src/compiled/_chunks/workflow/undici-DWL... [#.......................] 502.4 kB 1.7%
🟡 dist/src/compiled/@chat-adapter/slack/index.js   [#.......................] 440.5 kB 1.5%
🔴 Other published files                            [#######################.] 12.62 MB 43.7%
Installed footprint breakdown
Installed package size
🔴 eve                             [########################] 27.50 MB 32.0%
🔴 @rolldown/binding-linux-x64-gnu [#################.......] 19.28 MB 22.5%
🔴 @rolldown/binding-wasm32-wasi   [#########...............] 10.66 MB 12.4%
🔴 ai                              [######..................] 6.56 MB 7.6%
🔴 zod                             [####....................] 5.07 MB 5.9%
🟠 undici                          [###.....................] 3.50 MB 4.1%
🔴 Other installed packages        [############............] 13.26 MB 15.4%
Runtime dependencies (2)
Package Range Notes
nitro 3.0.260610-beta
undici 8.9.0
Peer dependencies (5)
Package Range Notes
@opentelemetry/api ^1.0.0 optional peer
ai catalog:
braintrust ^3.0.0 optional peer
just-bash ^3.0.0 optional peer
microsandbox ^0.5.0 optional peer
eve init install drill-down

eve init install details

  • Command: eve init my-agent
  • Package manager: npm
  • Installed footprint: 124.24 MB across 8551 installed files
  • Installed packages: 128 total (122 transitive-only)
  • dependencies: 4 direct packages totaling 43.23 MB
  • devDependencies: 2 direct packages totaling 5.04 MB
  • Other transitive package files: 75.97 MB

Installed footprint is measured from an isolated temporary eve init my-agent using the current packed eve tarball.

Heavy installed dependencies

  • @typescript/typescript-linux-x64: 27.95 MB (22.5%)
  • eve: 27.50 MB (22.1%)
  • @rolldown/binding-linux-x64-gnu: 19.28 MB (15.5%)
  • @rolldown/binding-wasm32-wasi: 10.66 MB (8.6%)
  • zod: 9.02 MB (7.3%)
Installed footprint breakdown
Installed package size
🔴 @typescript/typescript-linux-x64 [########################] 27.95 MB 22.5%
🔴 eve                              [########################] 27.50 MB 22.1%
🔴 @rolldown/binding-linux-x64-gnu  [#################.......] 19.28 MB 15.5%
🔴 @rolldown/binding-wasm32-wasi    [#########...............] 10.66 MB 8.6%
🔴 zod                              [########................] 9.02 MB 7.3%
🔴 ai                               [######..................] 6.56 MB 5.3%
🔴 Other installed packages         [####################....] 23.26 MB 18.7%
dependencies (4)
Package Range Installed size Share
@vercel/connect 0.4.2 135.8 kB 0.1%
ai ^7.0.38 6.56 MB 5.3%
eve file:eve-0.29.2.tgz 27.50 MB 22.1%
zod 4.4.3 9.02 MB 7.3%
devDependencies (2)
Package Range Installed size Share
@types/node 24.x 2.54 MB 2.0%
typescript 7.0.2 2.50 MB 2.0%
Function Drill-Down

Payload Size Graph

Unique function payload size and share of total
🔴 functions/.well-known/workflow/v1/flow.func     [########################] 8.41 MB 50.0%
🔴 functions/__server.func                         [########################] 8.41 MB 50.0%

Top Function Payloads

🟠 functions/.well-known/workflow/v1/flow.func • 1 public route • 8.41 MB
Metric Value
Public routes /.well-known/workflow/v1/flow
Runtime nodejs24.x
Handler index.mjs
Payload 8.41 MB
Function files 8.41 MB across 43 files
Traced dependencies 0 B
Signal 🟠 Bundled file index.mjs is 2.31 MB (27.5%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 index.mjs                       [########################] 2.31 MB 27.5%
🟠 _chunks/runtime-artifacts.mjs   [################........] 1.59 MB 18.9%
🟡 _libs/undici.mjs                [##########..............] 980.5 kB 11.7%
🟡 _chunks/sandbox.mjs             [########................] 768.8 kB 9.1%
🟡 _libs/@ai-sdk/gateway+[...].mjs [####....................] 432.8 kB 5.1%
🟠 Other bundled files             [########################] 2.32 MB 27.6%

🧾 Vercel Config

{
  "handler": "index.mjs",
  "launcherType": "Nodejs",
  "shouldAddHelpers": false,
  "supportsResponseStreaming": true,
  "runtime": "nodejs24.x",
  "maxDuration": "max",
  "experimentalTriggers": [
    {
      "type": "queue/v2beta",
      "topic": "__eve776561746865722d6167656e74_wkf_workflow_*",
      "consumer": "default",
      "retryAfterSeconds": 5,
      "initialDelaySeconds": 0
    }
  ],
  "environment": {
    "WORKFLOW_PRECONDITION_GUARD": "1"
  }
}

🟠 functions/__server.func • 10 public routes, 1 internal alias • 8.41 MB
Metric Value
Public routes /
/eve/v1/callback/[token]
/eve/v1/connections/[name]/callback/[token]
/eve/v1/health
/eve/v1/info
/eve/v1/session
/eve/v1/session/[sessionId]
/eve/v1/session/[sessionId]/cancel
/eve/v1/session/[sessionId]/stream
/eve/v1/session/reset
Internal aliases /__server
Runtime nodejs24.x
Handler index.mjs
Payload 8.41 MB
Function files 8.41 MB across 43 files
Traced dependencies 0 B
Signal 🟠 Bundled file index.mjs is 2.31 MB (27.5%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 index.mjs                       [########################] 2.31 MB 27.5%
🟠 _chunks/runtime-artifacts.mjs   [################........] 1.59 MB 18.9%
🟡 _libs/undici.mjs                [##########..............] 980.5 kB 11.7%
🟡 _chunks/sandbox.mjs             [########................] 768.8 kB 9.1%
🟡 _libs/@ai-sdk/gateway+[...].mjs [####....................] 432.8 kB 5.1%
🟠 Other bundled files             [########################] 2.32 MB 27.6%

🧾 Vercel Config

{
  "handler": "index.mjs",
  "launcherType": "Nodejs",
  "shouldAddHelpers": false,
  "supportsResponseStreaming": true,
  "runtime": "nodejs24.x"
}

Build Timing: e2e/fixtures/agent-tools-sandbox

This is an informational timing measurement inside eve build, from preflight through publication. Output-size measurement and profile writing are excluded.

Build mode: deployable Vercel build with sandbox template prewarm included.

  • Build pipeline: 2.01 s -> 2.18 s (+162.6 ms) vs trace-local-reader (436af4e).
  • Timing is informational: shared GitHub runners are too variable for a hard timing budget.
Detailed phase timings vs `trace-local-reader (436af4e)`
Phase Baseline Current Delta
extension.check 12.4 ms 6.7 ms -5.7 ms
project.resolve 13.7 ms 6.5 ms -7.2 ms
workspace.create 1.2 ms 1.6 ms +0.4 ms
host.prepare 252.5 ms 375.0 ms +122.5 ms
vercel.service-prefix.resolve 2.9 ms 2.5 ms -0.4 ms
nitro.create 211.1 ms 206.9 ms -4.2 ms
sandbox.prewarm 196.0 ms 248.1 ms +52.1 ms
nitro.cache.prepare 0.2 ms 0.3 ms +0.1 ms
nitro.prepare 0.9 ms 0.9 ms 0.0 ms
nitro.public-assets 0.7 ms 0.8 ms +0.1 ms
nitro.prerender 0.6 ms 0.5 ms -0.1 ms
nitro.bundle 1.29 s 1.30 s +4.2 ms
nitro.cache.write 0.6 ms 0.5 ms -0.1 ms
vercel.workflow-function.materialize 21.8 ms 21.8 ms 0.0 ms
agent-summary.emit 0.6 ms 0.5 ms -0.1 ms
nitro.close 0.1 ms 0.1 ms 0.0 ms
output.publish 3.8 ms 4.6 ms +0.8 ms
workspace.remove 2.1 ms 2.3 ms +0.2 ms

Comment thread packages/eve/src/cli/dev/tui/traces/trace-viewer-session.ts Outdated
Comment thread packages/eve/src/cli/dev/tui/traces/trace-conversation.ts
// Recalculate the scroll offset: expanding changes card heights, so
// the previous offset may leave the selected card's bottom cut off.
const scrolled = { ...base, expandedItems };
return { state: { ...scrolled, scrollRow: conversationScrollRow(scrolled, environment) } };

@vercel vercel Bot Jul 30, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Expand/collapse scroll recalculation in reduceTraceViewerKey uses stale (pre-toggle) card line counts, so a just-expanded card taller than the viewport stays clipped at the bottom.

Fix on Vercel

/traces opens a full-screen alternate-screen viewer over the local
trace spool that re-tells a trace as a chat-style conversation: system,
user, assistant, and tool cards with expand/collapse (keys or mouse
click), line-level scrolling (keys or wheel), a metadata-only
attributes drawer, live 1s refresh, and [ ] trace cycling. Assistant
cards carry model, duration, token, and gateway-cost metadata plus a
dim reasoning section; work a subagent performed interleaves in time
order with a lineage badge, and its delegated prompt renders as a task
card. The viewer opens on the current chat session's trace, matched by
session id against the spool.

Signed-off-by: Chad Hietala <chadhietala@gmail.com>
@chadhietala
chadhietala changed the base branch from research/subagent-trace-lineage to trace-local-reader July 31, 2026 03:11
@chadhietala
chadhietala marked this pull request as ready for review July 31, 2026 03:11
@chadhietala chadhietala changed the title feat(eve): /traces viewer with conversation view for the dev TUI Add the /traces conversation viewer to the dev TUI Jul 31, 2026
@chadhietala chadhietala changed the title Add the /traces conversation viewer to the dev TUI feat(eve): add the /traces conversation viewer to the dev TUI Jul 31, 2026
OTLP array attributes can carry strings with raw escape sequences, and
the drawer rendered them through String(), joining elements with the
escapes intact. JSON-encode non-string values instead — arrays
pretty-print, scalars stay beside their key — which escapes control
characters; the regression test asserts on unstripped output so a
future injection cannot hide behind the test's own stripAnsi.

Signed-off-by: Chad Hietala <chadhietala@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant