Files
triggerdotdev--trigger.dev/apps
Eric Allam 6730467944 feat(webapp,sdk): dashboard AgentView → session streams
Migrates the dashboard's Agent tab (span inspector) onto the backing
Session's .out / .in channels so it stays in sync with
TriggerChatTransport, the server-side AgentChat, and the MCP chat
tools after the chat.agent -> Sessions migration.

Webapp

- SpanPresenter.server.ts extracts agentSession from the run payload:
  prefers the explicit sessionId that TriggerChatTransport and
  chat.createTriggerAction now thread through; falls back to chatId
  for pre-Sessions agent runs (the session resource route accepts
  either form via resolveSessionByIdOrExternalId).
- Span route (runs.$runParam.spans.$spanParam) threads agentSession
  through AgentViewAuth. agentView is only minted when we have an
  identifiable session — runs without one render a loading spinner
  without subscribing.
- New dashboard resource route
  resources.orgs.../runs.$runParam/realtime/v1/sessions/$sessionId/$io
  proxies S2RealtimeStreams.streamResponseFromSessionStream under
  dashboard session auth. The run param binds the resource hierarchy
  (keeps callers from subscribing to arbitrary sessions); the session
  identity is verified against the environment. GET-only — appends go
  through the public session API, not the dashboard.
- AgentView.tsx:
  - AgentViewAuth grows `sessionId: string`; `useAgentRunMessages`
    threads it into the effect dep array and URL construction.
  - Subscription URLs collapse from two run-scoped paths
    (.../streams/{runId}/chat + .../streams/{runId}/input/chat-messages)
    to one session base (.../sessions/{sessionId}/{out|in}).
  - Local CHAT_STREAM_KEY / CHAT_MESSAGES_STREAM_ID constants dropped.
  - `.in` parser switches from raw ChatTaskWirePayload to ChatInputChunk
    tagged union: only kind: "message" chunks surface user messages
    (pulled from chunk.payload.messages); kind: "stop" is ignored.
  - `.out` parsing is unchanged — session v2 SSE already delivers
    parsed UIMessageChunk objects via record.body.data.

SDK type fixes (byproducts)

- TriggerChatTransportOptions.sessions.sessionId is now optional so
  pre-Sessions localStorage state (chatId -> {runId, token, lastEventId})
  hydrates without migration. The runtime already `continue`s when
  sessionId is missing and lets ensureSession upsert on next send;
  the type just catches up.
- chat.test.ts session-change accumulator shape widened to match the
  new runtime state (adds optional runId / sessionId fields).

Smoke

Opened a completed test-agent run (sessionId threaded via prior smoke
test) in the dashboard. Agent tab rendered:
- user message from initialMessages seed
- assistant reply streamed over session.out
Both SSE endpoints returned 200; no console errors. Full SDK test
suite still passes (86/86).
2026-05-10 22:11:20 +01:00
..