@assistant-ui/mcp-docs-server 0.1.29 → 0.1.31

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 (214) hide show
  1. package/.docs/organized/code-examples/waterfall.md +15 -7
  2. package/.docs/organized/code-examples/with-a2a.md +9 -21
  3. package/.docs/organized/code-examples/with-ag-ui.md +11 -8
  4. package/.docs/organized/code-examples/with-ai-sdk-v6.md +10 -10
  5. package/.docs/organized/code-examples/with-artifacts.md +12 -10
  6. package/.docs/organized/code-examples/with-assistant-transport.md +11 -12
  7. package/.docs/organized/code-examples/with-chain-of-thought.md +83 -54
  8. package/.docs/organized/code-examples/with-cloud-standalone.md +14 -11
  9. package/.docs/organized/code-examples/with-cloud.md +9 -10
  10. package/.docs/organized/code-examples/with-custom-thread-list.md +61 -16
  11. package/.docs/organized/code-examples/with-elevenlabs-conversational.md +17 -12
  12. package/.docs/organized/code-examples/with-elevenlabs-scribe.md +13 -13
  13. package/.docs/organized/code-examples/with-expo.md +25 -21
  14. package/.docs/organized/code-examples/with-external-store.md +8 -8
  15. package/.docs/organized/code-examples/with-ffmpeg.md +17 -12
  16. package/.docs/organized/code-examples/with-generative-ui.md +9 -9
  17. package/.docs/organized/code-examples/with-google-adk.md +8 -8
  18. package/.docs/organized/code-examples/with-heat-graph.md +5 -5
  19. package/.docs/organized/code-examples/with-interactables.md +10 -25
  20. package/.docs/organized/code-examples/with-langchain.md +437 -0
  21. package/.docs/organized/code-examples/with-langgraph.md +16 -16
  22. package/.docs/organized/code-examples/with-livekit.md +18 -13
  23. package/.docs/organized/code-examples/with-opencode.md +105 -62
  24. package/.docs/organized/code-examples/with-parent-id-grouping.md +10 -10
  25. package/.docs/organized/code-examples/with-react-hook-form.md +220 -148
  26. package/.docs/organized/code-examples/with-react-ink.md +2 -2
  27. package/.docs/organized/code-examples/with-react-router.md +12 -12
  28. package/.docs/organized/code-examples/with-store.md +8 -5
  29. package/.docs/organized/code-examples/with-tanstack.md +10 -10
  30. package/.docs/organized/code-examples/with-tap-runtime.md +10 -6
  31. package/.docs/raw/docs/(docs)/cli.mdx +2 -1
  32. package/.docs/raw/docs/(docs)/copilots/assistant-frame.mdx +1 -0
  33. package/.docs/raw/docs/(docs)/copilots/make-assistant-tool-ui.mdx +10 -3
  34. package/.docs/raw/docs/(docs)/copilots/make-assistant-tool.mdx +8 -3
  35. package/.docs/raw/docs/(docs)/copilots/make-assistant-visible.mdx +1 -0
  36. package/.docs/raw/docs/(docs)/copilots/model-context.mdx +1 -0
  37. package/.docs/raw/docs/(docs)/copilots/motivation.mdx +1 -0
  38. package/.docs/raw/docs/(docs)/copilots/use-assistant-instructions.mdx +1 -0
  39. package/.docs/raw/docs/(docs)/devtools.mdx +1 -0
  40. package/.docs/raw/docs/(docs)/index.mdx +1 -0
  41. package/.docs/raw/docs/(docs)/installation.mdx +1 -0
  42. package/.docs/raw/docs/(docs)/rtl.mdx +80 -0
  43. package/.docs/raw/docs/(reference)/api-reference/adapters/attachments.mdx +34 -0
  44. package/.docs/raw/docs/(reference)/api-reference/adapters/feedback-speech.mdx +41 -0
  45. package/.docs/raw/docs/(reference)/api-reference/adapters/index.mdx +26 -0
  46. package/.docs/raw/docs/(reference)/api-reference/adapters/persistence.mdx +34 -0
  47. package/.docs/raw/docs/(reference)/api-reference/adapters/runtime.mdx +31 -0
  48. package/.docs/raw/docs/(reference)/api-reference/context-providers/index.mdx +20 -0
  49. package/.docs/raw/docs/(reference)/api-reference/hooks/index.mdx +26 -0
  50. package/.docs/raw/docs/(reference)/api-reference/hooks/model-context.mdx +72 -0
  51. package/.docs/raw/docs/(reference)/api-reference/hooks/runtimes.mdx +41 -0
  52. package/.docs/raw/docs/(reference)/api-reference/hooks/state.mdx +48 -0
  53. package/.docs/raw/docs/(reference)/api-reference/hooks/utilities.mdx +30 -0
  54. package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +23 -0
  55. package/.docs/raw/docs/(reference)/api-reference/overview.mdx +21 -0
  56. package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-if.mdx +7 -0
  57. package/.docs/raw/docs/(reference)/api-reference/primitives/composer.mdx +149 -40
  58. package/.docs/raw/docs/(reference)/api-reference/primitives/index.mdx +65 -0
  59. package/.docs/raw/docs/(reference)/api-reference/primitives/message-part.mdx +2 -0
  60. package/.docs/raw/docs/(reference)/api-reference/primitives/message.mdx +50 -6
  61. package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list.mdx +15 -0
  62. package/.docs/raw/docs/(reference)/api-reference/primitives/thread.mdx +36 -1
  63. package/.docs/raw/docs/(reference)/api-reference/runtimes/index.mdx +38 -0
  64. package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-runtime.mdx +9 -0
  65. package/.docs/raw/docs/(reference)/migrations/v0-14.mdx +144 -6
  66. package/.docs/raw/docs/cloud/ai-sdk-assistant-ui.mdx +231 -3
  67. package/.docs/raw/docs/cloud/ai-sdk.mdx +221 -3
  68. package/.docs/raw/docs/cloud/langgraph.mdx +274 -2
  69. package/.docs/raw/docs/{(docs)/guides → guides}/attachments.mdx +41 -36
  70. package/.docs/raw/docs/guides/branching.mdx +76 -0
  71. package/.docs/raw/docs/guides/chain-of-thought.mdx +166 -0
  72. package/.docs/raw/docs/{(docs)/guides → guides}/context-api.mdx +50 -22
  73. package/.docs/raw/docs/{(docs)/guides → guides}/dictation.mdx +2 -0
  74. package/.docs/raw/docs/guides/editing.mdx +102 -0
  75. package/.docs/raw/docs/guides/index.mdx +103 -0
  76. package/.docs/raw/docs/{(docs)/guides → guides}/interactables.mdx +49 -0
  77. package/.docs/raw/docs/{(docs)/guides → guides}/latex.mdx +51 -8
  78. package/.docs/raw/docs/guides/mentions.mdx +520 -0
  79. package/.docs/raw/docs/{(docs)/guides → guides}/message-timing.mdx +8 -2
  80. package/.docs/raw/docs/{(docs)/guides → guides}/multi-agent.mdx +64 -4
  81. package/.docs/raw/docs/{(docs)/guides → guides}/quoting.mdx +10 -17
  82. package/.docs/raw/docs/guides/slash-commands.mdx +361 -0
  83. package/.docs/raw/docs/guides/speech.mdx +156 -0
  84. package/.docs/raw/docs/{(docs)/guides → guides}/suggestions.mdx +21 -83
  85. package/.docs/raw/docs/{(docs)/guides → guides}/tool-ui.mdx +108 -36
  86. package/.docs/raw/docs/{(docs)/guides → guides}/tools.mdx +131 -35
  87. package/.docs/raw/docs/{(docs)/guides → guides}/voice.mdx +39 -0
  88. package/.docs/raw/docs/ink/index.mdx +1 -3
  89. package/.docs/raw/docs/ink/migration.mdx +1 -3
  90. package/.docs/raw/docs/ink/primitives.mdx +37 -1
  91. package/.docs/raw/docs/integrations/attachments/custom-adapter.mdx +520 -0
  92. package/.docs/raw/docs/integrations/auth/better-auth.mdx +191 -0
  93. package/.docs/raw/docs/integrations/auth/clerk.mdx +172 -0
  94. package/.docs/raw/docs/integrations/auth/next-auth.mdx +196 -0
  95. package/.docs/raw/docs/integrations/frameworks/ai-sdk.mdx +79 -0
  96. package/.docs/raw/docs/integrations/frameworks/mastra/full-stack.mdx +188 -0
  97. package/.docs/raw/docs/integrations/frameworks/mastra/overview.mdx +57 -0
  98. package/.docs/raw/docs/integrations/frameworks/mastra/separate-server.mdx +201 -0
  99. package/.docs/raw/docs/integrations/gateways/index.mdx +157 -0
  100. package/.docs/raw/docs/integrations/index.mdx +173 -0
  101. package/.docs/raw/docs/integrations/observability/helicone.mdx +130 -0
  102. package/.docs/raw/docs/integrations/observability/langfuse.mdx +156 -0
  103. package/.docs/raw/docs/integrations/observability/langsmith.mdx +146 -0
  104. package/.docs/raw/docs/integrations/persistence/custom-adapter.mdx +712 -0
  105. package/.docs/raw/docs/integrations/tools/mcp.mdx +267 -0
  106. package/.docs/raw/docs/primitives/action-bar.mdx +1 -0
  107. package/.docs/raw/docs/primitives/assistant-modal.mdx +1 -0
  108. package/.docs/raw/docs/primitives/attachment.mdx +1 -0
  109. package/.docs/raw/docs/primitives/branch-picker.mdx +1 -0
  110. package/.docs/raw/docs/primitives/chain-of-thought.mdx +90 -85
  111. package/.docs/raw/docs/primitives/composer.mdx +96 -63
  112. package/.docs/raw/docs/primitives/error.mdx +1 -0
  113. package/.docs/raw/docs/primitives/index.mdx +2 -1
  114. package/.docs/raw/docs/primitives/message.mdx +68 -5
  115. package/.docs/raw/docs/primitives/selection-toolbar.mdx +1 -0
  116. package/.docs/raw/docs/primitives/suggestion.mdx +1 -0
  117. package/.docs/raw/docs/primitives/thread-list.mdx +39 -0
  118. package/.docs/raw/docs/primitives/thread.mdx +16 -13
  119. package/.docs/raw/docs/react-native/index.mdx +1 -3
  120. package/.docs/raw/docs/react-native/migration.mdx +1 -3
  121. package/.docs/raw/docs/runtimes/a2a/client-and-hooks.mdx +396 -0
  122. package/.docs/raw/docs/runtimes/a2a/overview.mdx +60 -0
  123. package/.docs/raw/docs/runtimes/a2a/quickstart.mdx +216 -0
  124. package/.docs/raw/docs/runtimes/ag-ui/overview.mdx +70 -0
  125. package/.docs/raw/docs/runtimes/ag-ui/quickstart.mdx +243 -0
  126. package/.docs/raw/docs/runtimes/ag-ui/runtime-options.mdx +123 -0
  127. package/.docs/raw/docs/runtimes/ai-sdk/overview.mdx +52 -0
  128. package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +71 -131
  129. package/.docs/raw/docs/runtimes/ai-sdk/v5-legacy.mdx +69 -63
  130. package/.docs/raw/docs/runtimes/ai-sdk/v6.mdx +365 -101
  131. package/.docs/raw/docs/runtimes/concepts/adapters.mdx +265 -0
  132. package/.docs/raw/docs/runtimes/concepts/architecture.mdx +125 -0
  133. package/.docs/raw/docs/runtimes/concepts/stability.mdx +67 -0
  134. package/.docs/raw/docs/runtimes/concepts/threads.mdx +428 -0
  135. package/.docs/raw/docs/runtimes/custom/assistant-transport.mdx +703 -0
  136. package/.docs/raw/docs/runtimes/custom/data-stream.mdx +323 -0
  137. package/.docs/raw/docs/runtimes/custom/external-store.mdx +253 -1236
  138. package/.docs/raw/docs/runtimes/custom/local-runtime.mdx +746 -0
  139. package/.docs/raw/docs/runtimes/custom/overview.mdx +71 -0
  140. package/.docs/raw/docs/runtimes/google-adk/api.mdx +256 -0
  141. package/.docs/raw/docs/runtimes/google-adk/hooks.mdx +717 -0
  142. package/.docs/raw/docs/runtimes/google-adk/overview.mdx +69 -0
  143. package/.docs/raw/docs/runtimes/google-adk/quickstart.mdx +229 -0
  144. package/.docs/raw/docs/runtimes/langchain.mdx +533 -0
  145. package/.docs/raw/docs/runtimes/langgraph/generative-ui.mdx +305 -0
  146. package/.docs/raw/docs/runtimes/langgraph/interrupts.mdx +104 -0
  147. package/.docs/raw/docs/runtimes/langgraph/overview.mdx +84 -0
  148. package/.docs/raw/docs/runtimes/langgraph/quickstart.mdx +496 -0
  149. package/.docs/raw/docs/runtimes/langgraph/streaming.mdx +127 -0
  150. package/.docs/raw/docs/runtimes/langgraph/threads.mdx +113 -0
  151. package/.docs/raw/docs/runtimes/langgraph/tutorial/introduction.mdx +3 -3
  152. package/.docs/raw/docs/runtimes/langgraph/tutorial/part-1.mdx +0 -23
  153. package/.docs/raw/docs/runtimes/langgraph/tutorial/part-2.mdx +1 -1
  154. package/.docs/raw/docs/runtimes/opencode/hooks.mdx +191 -0
  155. package/.docs/raw/docs/runtimes/opencode/overview.mdx +48 -0
  156. package/.docs/raw/docs/runtimes/opencode/quickstart.mdx +119 -0
  157. package/.docs/raw/docs/runtimes/pick-a-runtime.mdx +74 -198
  158. package/.docs/raw/docs/ui/accordion.mdx +1 -0
  159. package/.docs/raw/docs/ui/assistant-modal.mdx +1 -0
  160. package/.docs/raw/docs/ui/assistant-sidebar.mdx +1 -0
  161. package/.docs/raw/docs/ui/attachment.mdx +1 -0
  162. package/.docs/raw/docs/ui/badge.mdx +1 -0
  163. package/.docs/raw/docs/ui/composer-trigger-popover.mdx +200 -0
  164. package/.docs/raw/docs/ui/context-display.mdx +1 -0
  165. package/.docs/raw/docs/ui/diff-viewer.mdx +1 -0
  166. package/.docs/raw/docs/ui/directive-text.mdx +114 -0
  167. package/.docs/raw/docs/ui/file.mdx +1 -0
  168. package/.docs/raw/docs/ui/image.mdx +1 -0
  169. package/.docs/raw/docs/ui/markdown.mdx +2 -14
  170. package/.docs/raw/docs/ui/mermaid.mdx +1 -0
  171. package/.docs/raw/docs/ui/message-timing.mdx +3 -2
  172. package/.docs/raw/docs/ui/model-selector.mdx +1 -0
  173. package/.docs/raw/docs/ui/part-grouping.mdx +325 -313
  174. package/.docs/raw/docs/ui/quote.mdx +1 -0
  175. package/.docs/raw/docs/ui/reasoning.mdx +69 -32
  176. package/.docs/raw/docs/ui/scrollbar.mdx +1 -0
  177. package/.docs/raw/docs/ui/select.mdx +1 -0
  178. package/.docs/raw/docs/ui/sources.mdx +1 -0
  179. package/.docs/raw/docs/ui/streamdown.mdx +1 -0
  180. package/.docs/raw/docs/ui/syntax-highlighting.mdx +1 -0
  181. package/.docs/raw/docs/ui/tabs.mdx +1 -0
  182. package/.docs/raw/docs/ui/thread-list.mdx +17 -0
  183. package/.docs/raw/docs/ui/thread.mdx +56 -1
  184. package/.docs/raw/docs/ui/tool-fallback.mdx +1 -0
  185. package/.docs/raw/docs/ui/tool-group.mdx +39 -11
  186. package/.docs/raw/docs/ui/voice.mdx +1 -0
  187. package/.docs/raw/docs/utilities/heat-graph.mdx +1 -0
  188. package/.docs/raw/docs/utilities/react-o11y.mdx +278 -0
  189. package/.docs/raw/docs/utilities/tw-shimmer.mdx +1 -0
  190. package/dist/utils/logger.js +1 -1
  191. package/dist/utils/logger.js.map +1 -1
  192. package/package.json +4 -4
  193. package/src/tools/tests/path-traversal.test.ts +1 -1
  194. package/src/utils/logger.ts +1 -1
  195. package/.docs/raw/docs/(docs)/guides/branching.mdx +0 -65
  196. package/.docs/raw/docs/(docs)/guides/chain-of-thought.mdx +0 -164
  197. package/.docs/raw/docs/(docs)/guides/editing.mdx +0 -66
  198. package/.docs/raw/docs/(docs)/guides/mentions.mdx +0 -406
  199. package/.docs/raw/docs/(docs)/guides/slash-commands.mdx +0 -275
  200. package/.docs/raw/docs/(docs)/guides/speech.mdx +0 -38
  201. package/.docs/raw/docs/runtimes/a2a/index.mdx +0 -298
  202. package/.docs/raw/docs/runtimes/assistant-transport.mdx +0 -1033
  203. package/.docs/raw/docs/runtimes/custom/custom-thread-list.mdx +0 -268
  204. package/.docs/raw/docs/runtimes/custom/local.mdx +0 -1464
  205. package/.docs/raw/docs/runtimes/data-stream.mdx +0 -422
  206. package/.docs/raw/docs/runtimes/google-adk/index.mdx +0 -686
  207. package/.docs/raw/docs/runtimes/helicone.mdx +0 -61
  208. package/.docs/raw/docs/runtimes/langgraph/index.mdx +0 -607
  209. package/.docs/raw/docs/runtimes/langgraph/tutorial/index.mdx +0 -12
  210. package/.docs/raw/docs/runtimes/langserve.mdx +0 -116
  211. package/.docs/raw/docs/runtimes/mastra/full-stack-integration.mdx +0 -218
  212. package/.docs/raw/docs/runtimes/mastra/overview.mdx +0 -18
  213. package/.docs/raw/docs/runtimes/mastra/separate-server-integration.mdx +0 -217
  214. package/.docs/raw/docs/ui/mention.mdx +0 -168
@@ -417,6 +417,7 @@ export function WaterfallRow() {
417
417
  <AuiIf condition={(s) => s.span.hasChildren}>
418
418
  <SpanPrimitive.CollapseToggle className="flex shrink-0 items-center justify-center rounded p-0.5 text-muted-foreground hover:text-foreground">
419
419
  <svg
420
+ aria-hidden="true"
420
421
  className="size-3.5 transition-transform data-[collapsed=true]:[-rotate-90]"
421
422
  viewBox="0 0 16 16"
422
423
  fill="currentColor"
@@ -438,7 +439,7 @@ export function WaterfallRow() {
438
439
  className="group-hover:bg-accent/30"
439
440
  style={{ width: barWidth, height: barHeight }}
440
441
  >
441
- <svg width={barWidth} height={barHeight}>
442
+ <svg aria-hidden="true" width={barWidth} height={barHeight}>
442
443
  <WaterfallBar />
443
444
  </svg>
444
445
  </div>
@@ -515,7 +516,12 @@ function TimeAxisTicks({
515
516
  });
516
517
 
517
518
  return (
518
- <svg width={barWidth} height={28} className="overflow-visible">
519
+ <svg
520
+ aria-hidden="true"
521
+ width={barWidth}
522
+ height={28}
523
+ className="overflow-visible"
524
+ >
519
525
  {ticks.map(({ t, x }) => (
520
526
  <g key={x}>
521
527
  <line
@@ -678,6 +684,8 @@ export function WaterfallTimeline() {
678
684
 
679
685
  {/* Span rows */}
680
686
  <WaterfallLayoutContext.Provider value={layoutValue}>
687
+ {/* biome-ignore lint/a11y/useKeyWithClickEvents: event delegation on span rows */}
688
+ {/* biome-ignore lint/a11y/noStaticElementInteractions: event delegation on span rows */}
681
689
  <div
682
690
  style={{ width: contentWidth }}
683
691
  onClick={(e) => {
@@ -769,19 +777,19 @@ export default nextConfig;
769
777
  "@assistant-ui/react-o11y": "workspace:*",
770
778
  "@assistant-ui/store": "workspace:*",
771
779
  "@assistant-ui/tap": "workspace:*",
772
- "next": "^16.2.3",
780
+ "next": "^16.2.4",
773
781
  "react": "^19.2.5",
774
782
  "react-dom": "^19.2.5"
775
783
  },
776
784
  "devDependencies": {
777
785
  "@assistant-ui/x-buildutils": "workspace:*",
778
- "@tailwindcss/postcss": "^4.2.2",
786
+ "@tailwindcss/postcss": "^4.2.4",
779
787
  "@types/node": "^25.6.0",
780
788
  "@types/react": "^19.2.14",
781
789
  "@types/react-dom": "^19.2.3",
782
- "postcss": "^8.5.9",
783
- "tailwindcss": "^4.2.2",
784
- "typescript": "^6.0.2"
790
+ "postcss": "^8.5.14",
791
+ "tailwindcss": "^4.2.4",
792
+ "typescript": "^6.0.3"
785
793
  }
786
794
  }
787
795
 
@@ -170,7 +170,7 @@ export function MyRuntimeProvider({
170
170
  children,
171
171
  }: Readonly<{ children: ReactNode }>) {
172
172
  const serverUrl =
173
- (process.env["NEXT_PUBLIC_A2A_SERVER_URL"] as string | undefined) ??
173
+ (process.env.NEXT_PUBLIC_A2A_SERVER_URL as string | undefined) ??
174
174
  "http://localhost:9999";
175
175
 
176
176
  const runtime = useA2ARuntime({
@@ -201,8 +201,6 @@ import {
201
201
  } from "@assistant-ui/react-a2a";
202
202
  import { Thread } from "@/components/assistant-ui/thread";
203
203
 
204
- // === State Badge ===
205
-
206
204
  const STATE_CONFIG: Record<
207
205
  string,
208
206
  { label: string; color: string; bg: string }
@@ -274,8 +272,6 @@ function StateBadge({ state }: { state: A2ATaskState }) {
274
272
  );
275
273
  }
276
274
 
277
- // === Task Status Bar ===
278
-
279
275
  function TaskStatusBar() {
280
276
  const task = useA2ATask();
281
277
 
@@ -296,8 +292,6 @@ function TaskStatusBar() {
296
292
  );
297
293
  }
298
294
 
299
- // === Artifact Part Renderer ===
300
-
301
295
  function ArtifactPartView({ part }: { part: A2APart }) {
302
296
  if (part.text !== undefined) {
303
297
  return (
@@ -322,6 +316,7 @@ function ArtifactPartView({ part }: { part: A2APart }) {
322
316
  const isImage = part.mediaType?.startsWith("image/");
323
317
  if (isImage) {
324
318
  return (
319
+ // biome-ignore lint/performance/noImgElement: example component
325
320
  <img
326
321
  src={part.url}
327
322
  alt={part.filename ?? "image"}
@@ -350,6 +345,7 @@ function ArtifactPartView({ part }: { part: A2APart }) {
350
345
  const isImage = part.mediaType?.startsWith("image/");
351
346
  if (isImage) {
352
347
  return (
348
+ // biome-ignore lint/performance/noImgElement: example component
353
349
  <img
354
350
  src={`data:${part.mediaType};base64,${part.raw}`}
355
351
  alt={part.filename ?? "image"}
@@ -377,8 +373,6 @@ function ArtifactPartView({ part }: { part: A2APart }) {
377
373
  return null;
378
374
  }
379
375
 
380
- // === Artifact Panel ===
381
-
382
376
  function ArtifactPanel() {
383
377
  const artifacts = useA2AArtifacts();
384
378
 
@@ -417,8 +411,6 @@ function ArtifactPanel() {
417
411
  );
418
412
  }
419
413
 
420
- // === Agent Card Banner ===
421
-
422
414
  function AgentCardBanner() {
423
415
  const card = useA2AAgentCard();
424
416
 
@@ -449,8 +441,6 @@ function AgentCardBanner() {
449
441
  );
450
442
  }
451
443
 
452
- // === Thread with Suggestions ===
453
-
454
444
  function ThreadWithSuggestions() {
455
445
  const aui = useAui({
456
446
  suggestions: Suggestions([
@@ -488,8 +478,6 @@ function ThreadWithSuggestions() {
488
478
  );
489
479
  }
490
480
 
491
- // === Main ===
492
-
493
481
  export default function Home() {
494
482
  return (
495
483
  <main className="flex h-dvh flex-col">
@@ -568,22 +556,22 @@ export default nextConfig;
568
556
  "@assistant-ui/ui": "workspace:*",
569
557
  "class-variance-authority": "^0.7.1",
570
558
  "clsx": "^2.1.1",
571
- "lucide-react": "^1.8.0",
572
- "next": "^16.2.3",
559
+ "lucide-react": "^1.14.0",
560
+ "next": "^16.2.4",
573
561
  "react": "^19.2.5",
574
562
  "react-dom": "^19.2.5",
575
563
  "tailwind-merge": "^3.5.0"
576
564
  },
577
565
  "devDependencies": {
578
566
  "@assistant-ui/x-buildutils": "workspace:*",
579
- "@tailwindcss/postcss": "^4.2.2",
567
+ "@tailwindcss/postcss": "^4.2.4",
580
568
  "@types/node": "^25.6.0",
581
569
  "@types/react": "^19.2.14",
582
570
  "@types/react-dom": "^19.2.3",
583
- "postcss": "^8.5.9",
584
- "tailwindcss": "^4.2.2",
571
+ "postcss": "^8.5.14",
572
+ "tailwindcss": "^4.2.4",
585
573
  "tw-animate-css": "^1.4.0",
586
- "typescript": "^6.0.2"
574
+ "typescript": "^6.0.3"
587
575
  }
588
576
  }
589
577
 
@@ -141,6 +141,8 @@ export const metadata: Metadata = {
141
141
  description: "Generated by create next app",
142
142
  };
143
143
 
144
+ export const dynamic = "force-dynamic";
145
+
144
146
  export default function RootLayout({
145
147
  children,
146
148
  }: Readonly<{
@@ -182,7 +184,7 @@ export function MyRuntimeProvider({
182
184
  children,
183
185
  }: Readonly<{ children: ReactNode }>) {
184
186
  const agentUrl =
185
- (process.env["NEXT_PUBLIC_AGUI_AGENT_URL"] as string | undefined) ??
187
+ (process.env.NEXT_PUBLIC_AGUI_AGENT_URL as string | undefined) ??
186
188
  "http://localhost:8000/agent";
187
189
 
188
190
  // Simple in-memory thread storage
@@ -313,6 +315,7 @@ function NewThreadButton() {
313
315
 
314
316
  return (
315
317
  <button
318
+ type="button"
316
319
  onClick={() => aui.threads().switchToNewThread()}
317
320
  className="absolute top-4 right-4 z-10 flex items-center gap-2 rounded-lg border bg-background px-3 py-2 font-medium text-sm shadow-sm transition-colors hover:bg-accent"
318
321
  >
@@ -413,29 +416,29 @@ export default nextConfig;
413
416
  "start": "next start"
414
417
  },
415
418
  "dependencies": {
416
- "@ag-ui/client": "^0.0.52",
419
+ "@ag-ui/client": "^0.0.53",
417
420
  "@assistant-ui/react": "workspace:*",
418
421
  "@assistant-ui/react-ag-ui": "workspace:*",
419
422
  "@assistant-ui/react-markdown": "workspace:*",
420
423
  "@assistant-ui/ui": "workspace:*",
421
424
  "class-variance-authority": "^0.7.1",
422
425
  "clsx": "^2.1.1",
423
- "lucide-react": "^1.8.0",
424
- "next": "^16.2.3",
426
+ "lucide-react": "^1.14.0",
427
+ "next": "^16.2.4",
425
428
  "react": "^19.2.5",
426
429
  "react-dom": "^19.2.5",
427
430
  "tailwind-merge": "^3.5.0"
428
431
  },
429
432
  "devDependencies": {
430
433
  "@assistant-ui/x-buildutils": "workspace:*",
431
- "@tailwindcss/postcss": "^4.2.2",
434
+ "@tailwindcss/postcss": "^4.2.4",
432
435
  "@types/node": "^25.6.0",
433
436
  "@types/react": "^19.2.14",
434
437
  "@types/react-dom": "^19.2.3",
435
- "postcss": "^8.5.9",
436
- "tailwindcss": "^4.2.2",
438
+ "postcss": "^8.5.14",
439
+ "tailwindcss": "^4.2.4",
437
440
  "tw-animate-css": "^1.4.0",
438
- "typescript": "^6.0.2"
441
+ "typescript": "^6.0.3"
439
442
  }
440
443
  }
441
444
 
@@ -6,7 +6,7 @@
6
6
  import { openai } from "@ai-sdk/openai";
7
7
  import { frontendTools } from "@assistant-ui/react-ai-sdk";
8
8
  import {
9
- JSONSchema7,
9
+ type JSONSchema7,
10
10
  streamText,
11
11
  convertToModelMessages,
12
12
  type UIMessage,
@@ -315,31 +315,31 @@ export default nextConfig;
315
315
  "start": "next start"
316
316
  },
317
317
  "dependencies": {
318
- "@ai-sdk/openai": "^3.0.52",
318
+ "@ai-sdk/openai": "^3.0.61",
319
319
  "@assistant-ui/react": "workspace:*",
320
320
  "@assistant-ui/react-ai-sdk": "workspace:*",
321
321
  "@assistant-ui/react-markdown": "workspace:*",
322
322
  "@assistant-ui/ui": "workspace:*",
323
- "ai": "^6.0.159",
323
+ "ai": "^6.0.175",
324
324
  "class-variance-authority": "^0.7.1",
325
325
  "clsx": "^2.1.1",
326
- "lucide-react": "^1.8.0",
327
- "next": "^16.2.3",
326
+ "lucide-react": "^1.14.0",
327
+ "next": "^16.2.4",
328
328
  "react": "^19.2.5",
329
329
  "react-dom": "^19.2.5",
330
330
  "tailwind-merge": "^3.5.0",
331
- "zod": "^4.3.6"
331
+ "zod": "^4.4.3"
332
332
  },
333
333
  "devDependencies": {
334
334
  "@assistant-ui/x-buildutils": "workspace:*",
335
- "@tailwindcss/postcss": "^4.2.2",
335
+ "@tailwindcss/postcss": "^4.2.4",
336
336
  "@types/node": "^25.6.0",
337
337
  "@types/react": "^19.2.14",
338
338
  "@types/react-dom": "^19.2.3",
339
- "postcss": "^8.5.9",
340
- "tailwindcss": "^4.2.2",
339
+ "postcss": "^8.5.14",
340
+ "tailwindcss": "^4.2.4",
341
341
  "tw-animate-css": "^1.4.0",
342
- "typescript": "^6.0.2"
342
+ "typescript": "^6.0.3"
343
343
  }
344
344
  }
345
345
 
@@ -258,7 +258,7 @@ function ArtifactsView() {
258
258
  .at(-1);
259
259
  });
260
260
 
261
- const code = lastToolCall?.args["code"] as string | undefined;
261
+ const code = lastToolCall?.args.code as string | undefined;
262
262
  const isComplete = lastToolCall?.result !== undefined;
263
263
 
264
264
  if (!code) return null;
@@ -268,6 +268,7 @@ function ArtifactsView() {
268
268
  <div className="flex h-full w-full flex-col overflow-hidden rounded-lg border">
269
269
  <div className="flex border-b">
270
270
  <button
271
+ type="button"
271
272
  onClick={() => setTab("source")}
272
273
  className={`inline-flex flex-1 items-center justify-center gap-2 px-4 py-2.5 font-medium text-sm transition-colors ${
273
274
  tab === "source"
@@ -279,6 +280,7 @@ function ArtifactsView() {
279
280
  Source Code
280
281
  </button>
281
282
  <button
283
+ type="button"
282
284
  onClick={() => isComplete && setTab("preview")}
283
285
  disabled={!isComplete}
284
286
  className={`inline-flex flex-1 items-center justify-center gap-2 px-4 py-2.5 font-medium text-sm transition-colors ${
@@ -413,31 +415,31 @@ export default nextConfig;
413
415
  "start": "next start"
414
416
  },
415
417
  "dependencies": {
416
- "@ai-sdk/openai": "^3.0.52",
418
+ "@ai-sdk/openai": "^3.0.61",
417
419
  "@assistant-ui/react": "workspace:*",
418
420
  "@assistant-ui/react-ai-sdk": "workspace:*",
419
421
  "@assistant-ui/react-markdown": "workspace:*",
420
422
  "@assistant-ui/ui": "workspace:*",
421
- "ai": "^6.0.159",
423
+ "ai": "^6.0.175",
422
424
  "class-variance-authority": "^0.7.1",
423
425
  "clsx": "^2.1.1",
424
- "lucide-react": "^1.8.0",
425
- "next": "^16.2.3",
426
+ "lucide-react": "^1.14.0",
427
+ "next": "^16.2.4",
426
428
  "react": "^19.2.5",
427
429
  "react-dom": "^19.2.5",
428
430
  "tailwind-merge": "^3.5.0",
429
- "zod": "^4.3.6"
431
+ "zod": "^4.4.3"
430
432
  },
431
433
  "devDependencies": {
432
434
  "@assistant-ui/x-buildutils": "workspace:*",
433
- "@tailwindcss/postcss": "^4.2.2",
435
+ "@tailwindcss/postcss": "^4.2.4",
434
436
  "@types/node": "^25.6.0",
435
437
  "@types/react": "^19.2.14",
436
438
  "@types/react-dom": "^19.2.3",
437
- "postcss": "^8.5.9",
438
- "tailwindcss": "^4.2.2",
439
+ "postcss": "^8.5.14",
440
+ "tailwindcss": "^4.2.4",
439
441
  "tw-animate-css": "^1.4.0",
440
- "typescript": "^6.0.2"
442
+ "typescript": "^6.0.3"
441
443
  }
442
444
  }
443
445
 
@@ -170,16 +170,16 @@ export default function RootLayout({
170
170
 
171
171
  import {
172
172
  AssistantRuntimeProvider,
173
- AssistantTransportConnectionMetadata,
173
+ type AssistantTransportConnectionMetadata,
174
174
  makeAssistantTool,
175
175
  unstable_createMessageConverter as createMessageConverter,
176
176
  useAssistantTransportRuntime,
177
177
  } from "@assistant-ui/react";
178
178
  import {
179
179
  convertLangChainMessages,
180
- LangChainMessage,
180
+ type LangChainMessage,
181
181
  } from "@assistant-ui/react-langgraph";
182
- import { ReactNode } from "react";
182
+ import type { ReactNode } from "react";
183
183
  import { z } from "zod";
184
184
 
185
185
  // Frontend tool with execute function
@@ -274,8 +274,7 @@ export function MyRuntimeProvider({ children }: MyRuntimeProviderProps) {
274
274
  initialState: {
275
275
  messages: [],
276
276
  },
277
- api:
278
- process.env["NEXT_PUBLIC_API_URL"] || "http://localhost:8010/assistant",
277
+ api: process.env.NEXT_PUBLIC_API_URL || "http://localhost:8010/assistant",
279
278
  converter,
280
279
  headers: async () => ({
281
280
  "Test-Header": "test-value",
@@ -423,23 +422,23 @@ export default nextConfig;
423
422
  "@assistant-ui/ui": "workspace:*",
424
423
  "class-variance-authority": "^0.7.1",
425
424
  "clsx": "^2.1.1",
426
- "lucide-react": "^1.8.0",
427
- "next": "^16.2.3",
425
+ "lucide-react": "^1.14.0",
426
+ "next": "^16.2.4",
428
427
  "react": "^19.2.5",
429
428
  "react-dom": "^19.2.5",
430
429
  "tailwind-merge": "^3.5.0",
431
- "zod": "^4.3.6"
430
+ "zod": "^4.4.3"
432
431
  },
433
432
  "devDependencies": {
434
433
  "@assistant-ui/x-buildutils": "workspace:*",
435
- "@tailwindcss/postcss": "^4.2.2",
434
+ "@tailwindcss/postcss": "^4.2.4",
436
435
  "@types/node": "^25.6.0",
437
436
  "@types/react": "^19.2.14",
438
437
  "@types/react-dom": "^19.2.3",
439
- "postcss": "^8.5.9",
440
- "tailwindcss": "^4.2.2",
438
+ "postcss": "^8.5.14",
439
+ "tailwindcss": "^4.2.4",
441
440
  "tw-animate-css": "^1.4.0",
442
- "typescript": "^6.0.2"
441
+ "typescript": "^6.0.3"
443
442
  }
444
443
  }
445
444
 
@@ -25,7 +25,7 @@ export async function POST(req: Request) {
25
25
 
26
26
  const result = streamText({
27
27
  // Use a reasoning model to showcase chain of thought
28
- model: openai("o4-mini"),
28
+ model: openai("gpt-5.4-mini"),
29
29
  messages: await convertToModelMessages(messages),
30
30
  stopWhen: stepCountIs(10),
31
31
  tools: {
@@ -45,9 +45,15 @@ export async function POST(req: Request) {
45
45
  },
46
46
  }),
47
47
  },
48
+ providerOptions: {
49
+ openai: {
50
+ reasoningEffort: "high",
51
+ reasoningSummary: "auto",
52
+ },
53
+ },
48
54
  });
49
55
 
50
- return result.toUIMessageStreamResponse();
56
+ return result.toUIMessageStreamResponse({ sendReasoning: true });
51
57
  }
52
58
 
53
59
  ```
@@ -188,7 +194,7 @@ import "./globals.css";
188
194
 
189
195
  export const metadata: Metadata = {
190
196
  title: "Chain of Thought Example",
191
- description: "Example using ChainOfThoughtPrimitive with AI SDK",
197
+ description: "Example using MessagePrimitive.GroupedParts with AI SDK",
192
198
  };
193
199
 
194
200
  export default function RootLayout({
@@ -216,11 +222,9 @@ import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button
216
222
  import { Button } from "@/components/ui/button";
217
223
  import {
218
224
  AuiIf,
219
- ChainOfThoughtPrimitive,
220
225
  ComposerPrimitive,
221
226
  MessagePrimitive,
222
227
  ThreadPrimitive,
223
- useAuiState,
224
228
  } from "@assistant-ui/react";
225
229
  import {
226
230
  ArrowDownIcon,
@@ -286,61 +290,69 @@ const AssistantMessage: FC = () => {
286
290
  return (
287
291
  <MessagePrimitive.Root className="mx-auto w-full max-w-(--thread-max-width) py-3">
288
292
  <div className="flex flex-col gap-2 px-2 leading-relaxed">
289
- {/* Text parts are rendered inline; ChainOfThought is rendered separately below. */}
290
- <MessagePrimitive.Parts>
291
- {({ part }) => {
292
- if (part.type === "text") return <MarkdownText />;
293
+ <MessagePrimitive.GroupedParts
294
+ groupBy={(part) => {
295
+ if (part.type === "reasoning")
296
+ return ["group-chainOfThought", "group-reasoning"];
297
+ if (part.type === "tool-call")
298
+ return ["group-chainOfThought", "group-tool"];
293
299
  return null;
294
300
  }}
295
- </MessagePrimitive.Parts>
296
- <ChainOfThought />
301
+ >
302
+ {({ part, children }) => {
303
+ switch (part.type) {
304
+ case "group-chainOfThought":
305
+ return <ChainOfThoughtGroup>{children}</ChainOfThoughtGroup>;
306
+ case "group-reasoning":
307
+ return <PartLayout label="Thinking">{children}</PartLayout>;
308
+ case "group-tool":
309
+ return (
310
+ <PartLayout label="Taking action">{children}</PartLayout>
311
+ );
312
+ case "text":
313
+ return <MarkdownText />;
314
+ case "reasoning":
315
+ return <Reasoning {...part} />;
316
+ case "tool-call":
317
+ return <ToolCall {...part} />;
318
+ default:
319
+ return null;
320
+ }
321
+ }}
322
+ </MessagePrimitive.GroupedParts>
297
323
  </div>
298
324
  </MessagePrimitive.Root>
299
325
  );
300
326
  };
301
327
 
302
- /**
303
- * ChainOfThought component — rendered by MessagePrimitive.Parts when it
304
- * encounters consecutive reasoning + tool-call parts.
305
- *
306
- * Uses ChainOfThoughtPrimitive.Root, AccordionTrigger, and Parts to create
307
- * a collapsible accordion that groups all "thinking" steps together.
308
- */
309
- const ChainOfThought: FC = () => {
328
+ const ChainOfThoughtGroup: FC<PropsWithChildren> = ({ children }) => {
329
+ const [open, setOpen] = useState(false);
330
+
310
331
  return (
311
- <ChainOfThoughtPrimitive.Root className="my-2 rounded-lg border">
312
- <ChainOfThoughtPrimitive.AccordionTrigger className="flex w-full cursor-pointer items-center gap-2 px-4 py-2 font-medium text-sm hover:bg-muted/50">
313
- <AuiIf condition={(s) => s.chainOfThought.collapsed}>
314
- <ChevronRightIcon className="size-4 shrink-0" />
315
- </AuiIf>
316
- <AuiIf condition={(s) => !s.chainOfThought.collapsed}>
332
+ <div className="my-2 rounded-lg border">
333
+ <button
334
+ type="button"
335
+ className="flex w-full cursor-pointer items-center gap-2 px-4 py-2 font-medium text-sm hover:bg-muted/50"
336
+ onClick={() => setOpen((o) => !o)}
337
+ >
338
+ {open ? (
317
339
  <ChevronDownIcon className="size-4 shrink-0" />
318
- </AuiIf>
340
+ ) : (
341
+ <ChevronRightIcon className="size-4 shrink-0" />
342
+ )}
319
343
  Thinking
320
- </ChainOfThoughtPrimitive.AccordionTrigger>
321
- <AuiIf condition={(s) => !s.chainOfThought.collapsed}>
322
- <ChainOfThoughtPrimitive.Parts>
323
- {({ part }) => {
324
- if (part.type === "reasoning")
325
- return (
326
- <PartLayout>
327
- <Reasoning {...part} />
328
- </PartLayout>
329
- );
330
- return null;
331
- }}
332
- </ChainOfThoughtPrimitive.Parts>
333
- </AuiIf>
334
- </ChainOfThoughtPrimitive.Root>
344
+ </button>
345
+ {open && children}
346
+ </div>
335
347
  );
336
348
  };
337
349
 
338
- const PartLayout: FC<PropsWithChildren> = ({ children }) => {
339
- const partType = useAuiState((s) => s.part.type);
350
+ const PartLayout: FC<PropsWithChildren<{ label: string }>> = ({
351
+ children,
352
+ label,
353
+ }) => {
340
354
  const [open, setOpen] = useState(true);
341
355
 
342
- const label = partType === "reasoning" ? "Thinking" : "Taking action";
343
-
344
356
  return (
345
357
  <div className="border-t">
346
358
  <button
@@ -368,6 +380,23 @@ const Reasoning: FC<{ text: string }> = ({ text }) => {
368
380
  );
369
381
  };
370
382
 
383
+ const ToolCall: FC<{ toolName: string; status: { type: string } }> = ({
384
+ toolName,
385
+ status,
386
+ }) => {
387
+ return (
388
+ <div className="px-4 py-2 text-sm">
389
+ {status.type === "running"
390
+ ? `Running ${toolName}...`
391
+ : status.type === "complete"
392
+ ? `${toolName} completed`
393
+ : status.type === "incomplete"
394
+ ? `${toolName} failed`
395
+ : `${toolName} requires action`}
396
+ </div>
397
+ );
398
+ };
399
+
371
400
  const Composer: FC = () => {
372
401
  return (
373
402
  <ComposerPrimitive.Root className="flex w-full flex-col rounded-2xl border border-input bg-background px-1 pt-2 outline-none transition-shadow has-[textarea:focus-visible]:border-ring has-[textarea:focus-visible]:ring-2 has-[textarea:focus-visible]:ring-ring/20">
@@ -557,31 +586,31 @@ export default nextConfig;
557
586
  "start": "next start"
558
587
  },
559
588
  "dependencies": {
560
- "@ai-sdk/openai": "^3.0.52",
589
+ "@ai-sdk/openai": "^3.0.61",
561
590
  "@assistant-ui/react": "workspace:*",
562
591
  "@assistant-ui/react-ai-sdk": "workspace:*",
563
592
  "@assistant-ui/react-markdown": "workspace:*",
564
593
  "@assistant-ui/ui": "workspace:*",
565
- "ai": "^6.0.159",
594
+ "ai": "^6.0.175",
566
595
  "class-variance-authority": "^0.7.1",
567
596
  "clsx": "^2.1.1",
568
- "lucide-react": "^1.8.0",
569
- "next": "^16.2.3",
597
+ "lucide-react": "^1.14.0",
598
+ "next": "^16.2.4",
570
599
  "react": "^19.2.5",
571
600
  "react-dom": "^19.2.5",
572
601
  "tailwind-merge": "^3.5.0",
573
- "zod": "^4.3.6"
602
+ "zod": "^4.4.3"
574
603
  },
575
604
  "devDependencies": {
576
605
  "@assistant-ui/x-buildutils": "workspace:*",
577
- "@tailwindcss/postcss": "^4.2.2",
606
+ "@tailwindcss/postcss": "^4.2.4",
578
607
  "@types/node": "^25.6.0",
579
608
  "@types/react": "^19.2.14",
580
609
  "@types/react-dom": "^19.2.3",
581
- "postcss": "^8.5.9",
582
- "tailwindcss": "^4.2.2",
610
+ "postcss": "^8.5.14",
611
+ "tailwindcss": "^4.2.4",
583
612
  "tw-animate-css": "^1.4.0",
584
- "typescript": "^6.0.2"
613
+ "typescript": "^6.0.3"
585
614
  }
586
615
  }
587
616