feat: ai-chat reference project + MCP agent-chat tooling (5/5)#3546
feat: ai-chat reference project + MCP agent-chat tooling (5/5)#3546ericallam wants to merge 4 commits into
Conversation
🦋 Changeset detectedLatest commit: 3c71eeb The changes in this PR will be included in the next version bump. This PR includes changesets to release 30 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
| }, | ||
| }); | ||
| session.runId = result.id; | ||
| session.lastEventId = undefined; |
There was a problem hiding this comment.
🔴 Resetting lastEventId to undefined on upgrade causes SSE replay of entire session history
In collectAgentResponse, when a trigger:upgrade-required chunk is received, session.lastEventId is set to undefined (line 390) before recursively calling collectAgentResponse. The recursive call creates a new SSEStreamSubscription using session.lastEventId (now undefined) as the lastEventId option (agentChat.ts:338), which means the new subscription replays the entire session .out stream from the very beginning.
Since session .out is a durable stream containing all historical chunks across runs, the replayed events will include old turns' trigger:turn-complete chunks. The first historical trigger:turn-complete hit (line 366-368) immediately breaks the collection loop, causing the function to return with empty/partial text from a previous turn instead of the new run's response.
Expected fix
Keep session.lastEventId as-is (pointing to the trigger:upgrade-required chunk's SSE id) so the recursive subscription resumes right after the upgrade marker, where the new run's output will appear.
| session.lastEventId = undefined; | |
| reader.releaseLock(); |
Was this helpful? React with 👍 or 👎 to provide feedback.
| packageVersion: buildManifest.packageVersion, | ||
| cliPackageVersion: buildManifest.cliPackageVersion, | ||
| tasks: workerManifest.tasks, | ||
| prompts: workerManifest.prompts, |
There was a problem hiding this comment.
🚩 managed-index-controller adds prompts but not skills to worker registration payload
Both dev-index-worker.ts:187 and managed-index-worker.ts:183 now emit skills: resourceCatalog.listSkillManifests() in their worker manifests. The managed-index-controller.ts forwards tasks, prompts (newly added at line 107), and queues to the server — but does NOT forward skills. If skills need to be registered server-side (for dashboard display, deploy metadata, etc.), this omission would silently drop them in the managed (production) indexing path. Could be intentional if skills are only used at runtime and don't need server-side registration, but it's asymmetric with the prompts addition in the same PR.
Was this helpful? React with 👍 or 👎 to provide feedback.
ecfac76 to
7ee523e
Compare
882544c to
5baac29
Compare
7ee523e to
fdc61c6
Compare
5baac29 to
e16efbb
Compare
fdc61c6 to
96700b1
Compare
e16efbb to
f4a7923
Compare
96700b1 to
482d752
Compare
f4a7923 to
04b98af
Compare
482d752 to
920e876
Compare
04b98af to
417344a
Compare
920e876 to
d96e2f7
Compare
417344a to
43fde3f
Compare
d96e2f7 to
3256f42
Compare
43fde3f to
c27cef9
Compare
3256f42 to
220b33c
Compare
c27cef9 to
48f030a
Compare
Adds chat.agent({...}), a session-aware task definition for AI chat
agents. The runtime sits on top of the Sessions primitive and handles:
- Delta-only wire: each /in/append carries at most one message; agent
rebuilds prior history at run boot from an S3 snapshot + session.out
replay tail. Awaited snapshot writes after every onTurnComplete keep
the chain durable across idle suspends.
- Lifecycle hooks: onChatStart, onTurnStart, onTurnComplete, onAction,
onValidateMessages, hydrateMessages (short-circuits snapshot+replay
if the customer owns history).
- chat.history read primitives for HITL flows (getPendingToolCalls,
getResolvedToolCalls, extractNewToolResults, findMessage, all/getChain).
- chat.local — per-run typed data with Proxy access + dirty tracking.
- chat.headStart — first-turn TTFC bridge via a customer HTTP handler.
- oomMachine — one-shot OOM-retry on a larger machine; cutoff derived
from latest trigger:turn-complete chunk on session.out.
- Actions are no longer turns — onAction may mutate via chat.history.*
and may return a StreamTextResult without bumping the turn counter.
- gen_ai.conversation.id stamped on chat spans + metrics for telemetry.
- Skills runtime (loadable per-agent and per-task) + agent skills bundling.
Snapshot + replay integration tests in apps/webapp/test/.
mockChatAgent test harness updated for the new wire.
Includes the chat-agent, chat-agent-delta-wire-snapshots,
chat-history-read-primitives, chat-head-start, chat-actions-no-turn,
chat-session-attributes, agent-skills, and mock-chat-agent-test-harness
changesets.
The browser-facing half of chat.agent: a TriggerChatTransport that plugs into ai-sdk's useChat, plus AgentChat for direct programmatic use. Together they let a Next.js or React app drive a chat.agent task in trigger.dev cloud over SSE. - TriggerChatTransport (packages/trigger-sdk/src/v3/chat.ts): Vercel ai-sdk Transport implementation. Delta-only wire sends, SSE reconnection with lastEventId resume, stop/abort cleanup, dynamic accessToken refresh, X-Peek-Settled fast-close. - AgentChat (chat-client.ts): direct programmatic chat with the same underlying transport. - useTriggerChatTransport (chat-react.ts): React hook for the ai-sdk Transport. - chat-tab-coordinator: cross-tab leader election for shared SSE. - auth.ts: token plumbing for the transport. - packages/core/src/v3/chat-client.ts: shared envelope/wire types used by both browser and server runtime.
Dashboard surfaces for inspecting and debugging chat.agent runs. Depends on the Sessions primitive (L1) and chat.agent runtime (L2+L3). Run inspector — chat-aware: - AgentView + AgentMessageView (run inspector tab for chat.agent runs) - AIChatMessages + AISpanDetails + types.ts (per-span chat message rendering, tool-call/tool-output handling) - PromptSpanDetails (gen_ai.* span detail panel) - StreamdownRenderer + shikiTheme (markdown renderer with shiki highlighting and v2 patch) - useAutoScrollToBottom hook Playground UI (interactive chat.agent debugger): - /playground index + /playground/$agentParam routes - /agents route + AgentListPresenter - PlaygroundPresenter (per-org basin variants, clientData wiring) - realtime session routes for playground + run inspector chat - AI-generate-payload + AIPayloadTabContent for the test panel Navigation + theming: - SideMenu links for Agents and Playground - BlankStatePanels copy updates - tailwind config + tailwind.css storybook hooks - streamdown@2 dep in apps/webapp/package.json Includes agent-view-sessions, playground-trigger-config-fields, run-agent-view, and streamdown-v2-upgrade .server-changes.
Top of the chat.agent stack: a full Next.js reference project that exercises chat.agent end-to-end, plus the CLI MCP tools that drive agent runs from Claude Code / Cursor / etc. references/ai-chat: - Full Next.js app with prisma persistence, multi-chat sidebar, per-chat model picker, debug panel, tool examples, smoke tests - Reference tools: getCurrentTime, searchHackerNews, createGithubIssue, PR review helpers, code sandbox - chat-client-test orchestrator for concurrent-send stress - references/hello-world chatAgent + triggerAndSubscribe examples CLI MCP tooling for chat.agent: - mcp/tools/agentChat.ts (start_agent_chat, send_agent_message, close_agent_chat) - mcp/tools/agents.ts + tasks.ts (list agents, agent run details) - dev-run-controller OOM kill + taskRunProcessPool tweaks - dev/managed entry-point hooks for skills bundling - buildWorker + bundleSkills (agent skills support) Includes ai-tool-helpers + mcp-agent-chat-sessions changesets, plus the streamdown@2 patch and pnpm-lock reconciliation. (Will be renamed to feature/ai-chat-reference-and-cli before push.)
220b33c to
067109f
Compare
48f030a to
3c71eeb
Compare
067109f to
c1f6db7
Compare
Layer 5 of 5 in the chat.agent stack split
Top of the chat.agent stack: a full Next.js reference project that
exercises chat.agent end-to-end, plus the CLI MCP tools that drive
agent runs from Claude Code / Cursor / etc.
Targets
feature/agent-view-dashboard— merge lastreferences/ai-chat
per-chat model picker, debug panel, tool examples, smoke tests
getCurrentTime,searchHackerNews,createGithubIssue, PR review helpers, code sandboxchat-client-testorchestrator for concurrent-send stressreferences/hello-worldchatAgent+triggerAndSubscribeexamplesCLI MCP tooling for chat.agent
mcp/tools/agentChat.ts(start_agent_chat,send_agent_message,close_agent_chat)mcp/tools/agents.ts+tasks.ts(list agents, agent run details)dev-run-controllerOOM kill +taskRunProcessPooltweaksbuildWorker+bundleSkills(agent skills support)Includes
ai-tool-helpers+mcp-agent-chat-sessionschangesets, plusthe
streamdown@2patch andpnpm-lockreconciliation.Stack