feat(examples/ag-ui): itinerary client tools + capability suggestion chips#655
Merged
Conversation
Frontend-owned trip-itinerary state (signals + localStorage) that the user edits in a panel and the agent edits via client tools (get/add/move actions, ask-gated clear_day, day_card view), plus seven welcome chips covering the demo's full capability surface. Backend binds the client catalog via the published threadplane-client-tools middleware. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signals + localStorage (ag-ui-demo:itinerary), seeded with a 2-day Paris trip. Adds the app's missing tsconfig.spec.json (the vitest target silently ran 0 tests without it — analog plugin couldn't resolve the spec tsconfig). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…chips Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t-tools) - Add threadplane-client-tools>=0.0.1 dep; regenerate uv.lock + requirements.txt - Add tools: Optional[list] channel to State so ag-ui-langgraph retains the client catalog - Replace bare ChatOpenAI.bind_tools with bind_client_tools(llm, server_tools, state) - Update should_continue: pure-client-tool turns route to attach_citations so the browser can execute the call and re-run; mixed calls keep the tools route Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adds aimock fixtures and a Playwright spec covering the frontend-declared, frontend-executed itinerary client tools over the AG-UI transport: - panel renders the seeded itinerary - read round-trip: get_itinerary executes in the browser, the ToolMessage re-runs the graph, and the recap continuation streams back - ask chain: the clear_day confirm component mutates the shared store (panel updates live) and emits the tool result that resumes the run Also blanks AG_UI_INTERNAL_TOKEN in the e2e backend spawn so the suite is hermetic: the dev proxy forwards /agent without an x-internal-token header, so a developer's root .env (which carries the Railway deploy token) leaking into process.env via nx made the require_internal_token middleware 401 every backend-hitting test. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
blove
added a commit
that referenced
this pull request
Jun 12, 2026
Semantic merge — #655 landed on the pre-shell app, so its features relocate: - ItineraryStore provider + router union in app.config. - Itinerary panel hosted in the shell's new two-column body (toolbar-aware). - clientTools built once in AgUiShell; all three modes bind <chat [clientTools]>. - Welcome chips: #655's seven capability prompts presented via the canonical two-tier featured + 'More prompts' UI. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The public AG-UI demo gains the client-tools story told the strongest way: a frontend-owned trip itinerary (signals + localStorage) that the user edits in a side panel and the agent edits through client tools — plus seven welcome chips covering the demo's full capability surface (it previously had none).
Spec:
docs/superpowers/specs/2026-06-11-ag-ui-demo-itinerary-client-tools-design.md· Plan:docs/superpowers/plans/2026-06-11-ag-ui-demo-itinerary-client-tools.mdWhat's in
ItineraryStore— signals +localStorage(ag-ui-demo:itinerary), seeded 2-day Paris trip; 7 unit tests. Also adds the app's missingtsconfig.spec.json(the vitest target silently ran 0 tests without it).client-tools.ts):get_itinerary/add_stop/move_stop(actions),clear_day(ask — Clear/Cancel confirm card; Cancel leaves state untouched),day_card(view). No system-prompt coaching — the catalog descriptions carry the behavior.chat-welcome-suggestion: docs+citations, gen-UI, HITL refund, read/add/clear itinerary, research subagent.State.toolschannel +bind_client_tools(...)(publishedthreadplane-client-tools==0.0.1);should_continueends the turn on pure client-tool calls (server calls route toToolNodeas before).AG_UI_INTERNAL_TOKENin the e2e backend spawn (a populated root.envtoken 401'd every backend-hitting spec).Live-LLM smoke (real OpenAI, all new surface)
add_stop→ panel visibly updated (model even added a sensible note) + continuationget_itinerary→ exact seeded state echoed backmove_stop→ moved + model self-verified by chainingget_itineraryclear_dayCancel → state untouched, model reacted conversationallyclear_dayConfirm → day cleared,removed: 2round-tripped into the reply — and the model chained the backendrequest_approvalinterrupt before the client ask unprompted (interrupt panel → Accept → confirm card → Clear), a great capability-composition momentKnown polish items (follow-ups, not blockers)
askconfirm cards in the transcript stay interactive and re-compute their live count ("Clear all 0 stops…"); should freeze/disable once resolved.day_card(view) is model-discretionary and wasn't reached for during the smoke; schema/render covered by tests.🤖 Generated with Claude Code