@threadplane/chat 0.0.49 → 0.0.50

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threadplane/chat",
3
- "version": "0.0.49",
3
+ "version": "0.0.50",
4
4
  "exports": {
5
5
  "./chat.css": "./chat.css",
6
6
  "./themes/default-dark.css": "./themes/default-dark.css",
@@ -30,9 +30,9 @@
30
30
  "@threadplane/telemetry": "*"
31
31
  },
32
32
  "peerDependencies": {
33
+ "zod": "^3.25.0",
33
34
  "@angular/core": "^20.0.0 || ^21.0.0",
34
35
  "@angular/common": "^20.0.0 || ^21.0.0",
35
- "@angular/forms": "^20.0.0 || ^21.0.0",
36
36
  "@angular/platform-browser": "^20.0.0 || ^21.0.0",
37
37
  "@threadplane/licensing": "*",
38
38
  "@threadplane/render": "*",
@@ -1,18 +1,18 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { InjectionToken, Signal, TemplateRef, Type, WritableSignal } from '@angular/core';
3
3
  import * as _threadplane_render from '@threadplane/render';
4
- import { AngularRegistry, RenderEvent, ViewRegistry, RenderViewEntry } from '@threadplane/render';
4
+ import { AngularRegistry, StandardSchemaV1, RenderEvent, ViewRegistry, RenderViewEntry, RenderHost, StandardSchemaInferOutput } from '@threadplane/render';
5
5
  export { ViewRegistry, toRenderRegistry, views, withViews, withoutViews } from '@threadplane/render';
6
6
  import { Observable } from 'rxjs';
7
7
  import * as _json_render_core from '@json-render/core';
8
8
  import { StateStore, Spec } from '@json-render/core';
9
+ import * as _threadplane_chat from '@threadplane/chat';
9
10
  import { A2uiComponentDef, A2uiSurface, A2uiMessage, A2uiActionMessage } from '@threadplane/a2ui';
10
11
  export { A2uiAction, A2uiActionContextEntry, A2uiActionMessage, A2uiChildren, A2uiClientDataModel, A2uiComponent, A2uiComponentDef, A2uiSurface, A2uiTheme, DynamicBoolean, DynamicNumber, DynamicString, isLiteralBoolean, isLiteralNumber, isLiteralString, isPathRef } from '@threadplane/a2ui';
11
12
  import { PartialJsonParser } from '@cacheplane/partial-json';
12
13
  import { BaseMessage } from '@langchain/core/messages';
13
14
  import * as _cacheplane_partial_markdown from '@cacheplane/partial-markdown';
14
15
  import { CitationDefinition, MarkdownDocumentNode, MarkdownNode, MarkdownParagraphNode, MarkdownHeadingNode, MarkdownBlockquoteNode, MarkdownListNode, MarkdownListItemNode, MarkdownCodeBlockNode, MarkdownThematicBreakNode, MarkdownTextNode, MarkdownEmphasisNode, MarkdownStrongNode, MarkdownStrikethroughNode, MarkdownInlineCodeNode, MarkdownLinkNode, MarkdownAutolinkNode, MarkdownImageNode, MarkdownSoftBreakNode, MarkdownHardBreakNode, MarkdownCitationReferenceNode, MarkdownTableNode, MarkdownTableRowNode, MarkdownTableCellNode } from '@cacheplane/partial-markdown';
15
- import * as _threadplane_chat from '@threadplane/chat';
16
16
  import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
17
17
 
18
18
  interface ChatConfig {
@@ -210,6 +210,42 @@ interface AgentSubmitOptions {
210
210
  signal?: AbortSignal;
211
211
  }
212
212
 
213
+ /** A client tool spec as shipped to the model / AG-UI RunAgentInput.tools. */
214
+ interface ClientToolSpec {
215
+ readonly name: string;
216
+ readonly description: string;
217
+ readonly parameters: Record<string, unknown>;
218
+ }
219
+ /**
220
+ * Convert a Standard Schema to a JSON Schema for the model's `parameters`.
221
+ * Uses Zod's converter; throws a clear error for non-Zod validators (callers
222
+ * should supply a Zod schema — see the client-tools docs).
223
+ */
224
+ declare function deriveJsonSchema(toolName: string, schema: StandardSchemaV1): Record<string, unknown>;
225
+
226
+ /** The outcome of running a client tool. */
227
+ type ClientToolResult = {
228
+ readonly ok: true;
229
+ readonly value: unknown;
230
+ } | {
231
+ readonly ok: false;
232
+ readonly error: string;
233
+ };
234
+ /**
235
+ * Optional Agent capability that lets the client declare tools to the model
236
+ * and return their results. Implemented per-transport by each adapter
237
+ * (AG-UI: native RunAgentInput.tools + addMessage/re-run; LangGraph: catalog
238
+ * via run input + ToolMessage re-run).
239
+ */
240
+ interface ClientToolsCapability {
241
+ /** Ship the client tool catalog to the model at run start. */
242
+ setCatalog(specs: readonly ClientToolSpec[]): void;
243
+ /** Tool calls the model made for client tools that await a client result. */
244
+ readonly pending: Signal<readonly ToolCall[]>;
245
+ /** Return a client tool's result (or error) and continue the run. */
246
+ resolve(toolCallId: string, result: ClientToolResult): void;
247
+ }
248
+
213
249
  /**
214
250
  * Runtime-neutral contract chat primitives consume.
215
251
  *
@@ -244,6 +280,8 @@ interface Agent {
244
280
  regenerate: (assistantMessageIndex: number) => Promise<void>;
245
281
  interrupt?: Signal<AgentInterrupt | undefined>;
246
282
  subagents?: Signal<Map<string, Subagent>>;
283
+ /** Optional: client-declared, client-executed tools (see ClientToolsCapability). */
284
+ clientTools?: ClientToolsCapability;
247
285
  events$: Observable<AgentEvent>;
248
286
  }
249
287
 
@@ -472,6 +510,11 @@ declare class ChatInputComponent {
472
510
  constructor();
473
511
  focusTextarea(): void;
474
512
  onSubmit(): void;
513
+ /** Sync the textarea's value into the signal on user input. A direct
514
+ * [value]/(input) pair is used instead of ngModel: NgModel does not
515
+ * reliably write a programmatic clear back to the view under zoneless
516
+ * + OnPush, leaving sent text visible in the composer (audit F1). */
517
+ protected onInput(event: Event): void;
475
518
  /** Abort the current streaming response (if the adapter supports it). */
476
519
  onStop(): void;
477
520
  onKeydown(event: KeyboardEvent): void;
@@ -694,6 +737,7 @@ declare class ChatToolCallsComponent {
694
737
  */
695
738
  declare class ChatToolViewsComponent {
696
739
  readonly agent: _angular_core.InputSignal<Agent>;
740
+ readonly events: _angular_core.OutputEmitterRef<RenderEvent>;
697
741
  readonly message: _angular_core.InputSignal<Message | undefined>;
698
742
  readonly views: _angular_core.InputSignal<Readonly<Record<string, _angular_core.Type<unknown> | _threadplane_render.RenderViewEntry>> | undefined>;
699
743
  readonly store: _angular_core.InputSignal<StateStore | undefined>;
@@ -705,7 +749,7 @@ declare class ChatToolViewsComponent {
705
749
  spec: Spec;
706
750
  }[]>;
707
751
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChatToolViewsComponent, never>;
708
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChatToolViewsComponent, "chat-tool-views", never, { "agent": { "alias": "agent"; "required": true; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "views": { "alias": "views"; "required": false; "isSignal": true; }; "store": { "alias": "store"; "required": false; "isSignal": true; }; "handlers": { "alias": "handlers"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
752
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChatToolViewsComponent, "chat-tool-views", never, { "agent": { "alias": "agent"; "required": true; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "views": { "alias": "views"; "required": false; "isSignal": true; }; "store": { "alias": "store"; "required": false; "isSignal": true; }; "handlers": { "alias": "handlers"; "required": false; "isSignal": true; }; }, { "events": "events"; }, never, never, true, never>;
709
753
  }
710
754
 
711
755
  declare class ChatSubagentsComponent {
@@ -931,6 +975,17 @@ declare class ChatGenerativeUiComponent {
931
975
  readonly handlers: _angular_core.InputSignal<Record<string, (params: Record<string, unknown>) => unknown | Promise<unknown>> | undefined>;
932
976
  readonly loading: _angular_core.InputSignal<boolean>;
933
977
  readonly events: _angular_core.OutputEmitterRef<RenderEvent>;
978
+ /** The bound spec with schema-documented `{ statePath }` prop refs
979
+ * rewritten to engine-native `{ $bindState }` + `_bindings` so values
980
+ * resolve against the state store instead of interpolating as
981
+ * "[object Object]" (F4). */
982
+ protected readonly normalizedSpec: _angular_core.Signal<Spec | null>;
983
+ /** Last value this component seeded per state path. Lets the seeding
984
+ * effect distinguish "still the value we wrote (possibly a partial
985
+ * chunk from streaming — safe to overwrite with the newer one)" from
986
+ * "user edited it via a bound control — leave it alone". */
987
+ private readonly seeded;
988
+ constructor();
934
989
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChatGenerativeUiComponent, never>;
935
990
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChatGenerativeUiComponent, "chat-generative-ui", never, { "spec": { "alias": "spec"; "required": false; "isSignal": true; }; "registry": { "alias": "registry"; "required": false; "isSignal": true; }; "store": { "alias": "store"; "required": false; "isSignal": true; }; "handlers": { "alias": "handlers"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, { "events": "events"; }, never, never, true, never>;
936
991
  }
@@ -1161,6 +1216,14 @@ interface ChatRenderEvent {
1161
1216
  declare class ChatComponent {
1162
1217
  readonly agent: _angular_core.InputSignal<Agent>;
1163
1218
  readonly views: _angular_core.InputSignal<Readonly<Record<string, _angular_core.Type<unknown> | _threadplane_render.RenderViewEntry>> | undefined>;
1219
+ /**
1220
+ * Client-declared tools (`view`/`ask`/`function`) the model may call. When
1221
+ * provided, a coordinator ships their catalog to the agent, runs `function`
1222
+ * tools in the browser, and renders/resolves `view`/`ask` tools through the
1223
+ * same tool-views pipeline as `views`. Additive — leave undefined for the
1224
+ * classic server-tools-only experience.
1225
+ */
1226
+ readonly clientTools: _angular_core.InputSignal<Readonly<Record<string, _threadplane_chat.ClientToolDef>> | undefined>;
1164
1227
  readonly store: _angular_core.InputSignal<StateStore | undefined>;
1165
1228
  readonly handlers: _angular_core.InputSignal<Record<string, (params: Record<string, unknown>) => unknown | Promise<unknown>>>;
1166
1229
  readonly threads: _angular_core.InputSignal<Thread[]>;
@@ -1209,10 +1272,26 @@ declare class ChatComponent {
1209
1272
  }>;
1210
1273
  private readonly _internalStore;
1211
1274
  readonly resolvedStore: _angular_core.Signal<StateStore | undefined>;
1275
+ /**
1276
+ * Lazily-built client-tools coordinator, memoized on the `clientTools`
1277
+ * registry input. Undefined when no client tools are declared. The
1278
+ * coordinator owns the catalog/executor wiring and the view/ask render
1279
+ * registry; the composition merges and connects it below.
1280
+ */
1281
+ private readonly coordinator;
1282
+ /**
1283
+ * The view registry actually used for rendering tool-views and for
1284
+ * excluding view-backed tool names from default tool-call cards. Merges
1285
+ * the coordinator's `view`/`ask` components (keyed by tool name) into the
1286
+ * user-supplied `views()` so client-declared component tools render through
1287
+ * the same pipeline. Falls back to `views()` when no client tools exist.
1288
+ */
1289
+ protected readonly effectiveViews: _angular_core.Signal<Readonly<Record<string, _angular_core.Type<unknown> | _threadplane_render.RenderViewEntry>> | undefined>;
1212
1290
  readonly renderRegistry: _angular_core.Signal<_threadplane_render.AngularRegistry | undefined>;
1213
- /** Tool names that have a registered view (keys of the `views` registry).
1214
- * These render as inline tool-views and are excluded from the default
1215
- * tool-call card so they don't render twice. */
1291
+ /** Tool names that have a registered view (keys of the effective view
1292
+ * registry, including client-declared view/ask tools). These render as
1293
+ * inline tool-views and are excluded from the default tool-call card so
1294
+ * they don't render twice. */
1216
1295
  readonly viewToolNames: _angular_core.Signal<readonly string[]>;
1217
1296
  /** Union of GenUI dispatcher tool names and registered view tool names. */
1218
1297
  readonly excludedToolNames: _angular_core.Signal<readonly string[]>;
@@ -1242,6 +1321,7 @@ declare class ChatComponent {
1242
1321
  protected isReasoningStreaming(message: Message, index: number): boolean;
1243
1322
  private readonly classifiers;
1244
1323
  private readonly destroyRef;
1324
+ private readonly injector;
1245
1325
  private readonly lifecycle;
1246
1326
  private eventsSubscribed;
1247
1327
  /**
@@ -1323,6 +1403,13 @@ declare class ChatComponent {
1323
1403
  }): ContentClassifier;
1324
1404
  clearClassifiers(): void;
1325
1405
  onSpecEvent(event: RenderEvent, messageIndex: number): void;
1406
+ /**
1407
+ * Forwards a render event bubbled up from a `<chat-tool-views>` component
1408
+ * (a client-declared `view`/`ask` tool's rendered UI) to the client-tools
1409
+ * coordinator. The coordinator resolves the matching pending `ask` tool call
1410
+ * when the event is a `result`. No-op when no client tools are wired.
1411
+ */
1412
+ protected onClientToolEvent(event: RenderEvent): void;
1326
1413
  onA2uiAction(message: A2uiActionMessage): void;
1327
1414
  onA2uiEvent(event: RenderEvent, messageIndex: number, surfaceId: string): void;
1328
1415
  /** Regenerate the assistant response at the given message index. */
@@ -1330,7 +1417,7 @@ declare class ChatComponent {
1330
1417
  onRate(message: unknown, value: 'up' | 'down'): void;
1331
1418
  onCopy(message: unknown, content: string): void;
1332
1419
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChatComponent, never>;
1333
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChatComponent, "chat", never, { "agent": { "alias": "agent"; "required": true; "isSignal": true; }; "views": { "alias": "views"; "required": false; "isSignal": true; }; "store": { "alias": "store"; "required": false; "isSignal": true; }; "handlers": { "alias": "handlers"; "required": false; "isSignal": true; }; "threads": { "alias": "threads"; "required": false; "isSignal": true; }; "activeThreadId": { "alias": "activeThreadId"; "required": false; "isSignal": true; }; "welcomeDisabled": { "alias": "welcomeDisabled"; "required": false; "isSignal": true; }; "modelOptions": { "alias": "modelOptions"; "required": false; "isSignal": true; }; "showModelPicker": { "alias": "showModelPicker"; "required": false; "isSignal": true; }; "selectedModel": { "alias": "selectedModel"; "required": false; "isSignal": true; }; "modelPickerPlaceholder": { "alias": "modelPickerPlaceholder"; "required": false; "isSignal": true; }; "genuiToolNames": { "alias": "genuiToolNames"; "required": false; "isSignal": true; }; }, { "selectedModel": "selectedModelChange"; "threadSelected": "threadSelected"; "renderEvent": "renderEvent"; "regenerate": "regenerate"; "rate": "rate"; "messageCopy": "messageCopy"; }, never, ["[chatWelcomeSuggestions]", "[chatHeader]", "[chatToolCallTemplate]", "[chatInputModelSelect]"], true, never>;
1420
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChatComponent, "chat", never, { "agent": { "alias": "agent"; "required": true; "isSignal": true; }; "views": { "alias": "views"; "required": false; "isSignal": true; }; "clientTools": { "alias": "clientTools"; "required": false; "isSignal": true; }; "store": { "alias": "store"; "required": false; "isSignal": true; }; "handlers": { "alias": "handlers"; "required": false; "isSignal": true; }; "threads": { "alias": "threads"; "required": false; "isSignal": true; }; "activeThreadId": { "alias": "activeThreadId"; "required": false; "isSignal": true; }; "welcomeDisabled": { "alias": "welcomeDisabled"; "required": false; "isSignal": true; }; "modelOptions": { "alias": "modelOptions"; "required": false; "isSignal": true; }; "showModelPicker": { "alias": "showModelPicker"; "required": false; "isSignal": true; }; "selectedModel": { "alias": "selectedModel"; "required": false; "isSignal": true; }; "modelPickerPlaceholder": { "alias": "modelPickerPlaceholder"; "required": false; "isSignal": true; }; "genuiToolNames": { "alias": "genuiToolNames"; "required": false; "isSignal": true; }; }, { "selectedModel": "selectedModelChange"; "threadSelected": "threadSelected"; "renderEvent": "renderEvent"; "regenerate": "regenerate"; "rate": "rate"; "messageCopy": "messageCopy"; }, never, ["[chatWelcomeSuggestions]", "[chatHeader]", "[chatToolCallTemplate]", "[chatInputModelSelect]"], true, never>;
1334
1421
  }
1335
1422
 
1336
1423
  declare class ChatPopupComponent {
@@ -1339,6 +1426,8 @@ declare class ChatPopupComponent {
1339
1426
  * messages classified as A2UI parse correctly but never mount a
1340
1427
  * surface. Pass `a2uiBasicCatalog()` from `@threadplane/chat`. */
1341
1428
  readonly views: _angular_core.InputSignal<Readonly<Record<string, _angular_core.Type<unknown> | _threadplane_render.RenderViewEntry>> | undefined>;
1429
+ /** Frontend-declared client tools forwarded to the inner `<chat>`. */
1430
+ readonly clientTools: _angular_core.InputSignal<Readonly<Record<string, _threadplane_chat.ClientToolDef>> | undefined>;
1342
1431
  /** Forwarded to the inner <chat>. When non-empty, a model picker pill
1343
1432
  * renders in the chat-input chrome. */
1344
1433
  readonly modelOptions: _angular_core.InputSignal<readonly ChatSelectOption[]>;
@@ -1368,7 +1457,7 @@ declare class ChatPopupComponent {
1368
1457
  openWindow(): void;
1369
1458
  closeWindow(): void;
1370
1459
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChatPopupComponent, never>;
1371
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChatPopupComponent, "chat-popup", never, { "agent": { "alias": "agent"; "required": true; "isSignal": true; }; "views": { "alias": "views"; "required": false; "isSignal": true; }; "modelOptions": { "alias": "modelOptions"; "required": false; "isSignal": true; }; "showModelPicker": { "alias": "showModelPicker"; "required": false; "isSignal": true; }; "selectedModel": { "alias": "selectedModel"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "shortcut": { "alias": "shortcut"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; }, { "selectedModel": "selectedModelChange"; "open": "openChange"; }, never, ["[chatHeader]", "[chatWelcomeSuggestions]"], true, never>;
1460
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChatPopupComponent, "chat-popup", never, { "agent": { "alias": "agent"; "required": true; "isSignal": true; }; "views": { "alias": "views"; "required": false; "isSignal": true; }; "clientTools": { "alias": "clientTools"; "required": false; "isSignal": true; }; "modelOptions": { "alias": "modelOptions"; "required": false; "isSignal": true; }; "showModelPicker": { "alias": "showModelPicker"; "required": false; "isSignal": true; }; "selectedModel": { "alias": "selectedModel"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "shortcut": { "alias": "shortcut"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; }, { "selectedModel": "selectedModelChange"; "open": "openChange"; }, never, ["[chatHeader]", "[chatWelcomeSuggestions]"], true, never>;
1372
1461
  }
1373
1462
 
1374
1463
  declare class ChatSidebarComponent {
@@ -1377,6 +1466,8 @@ declare class ChatSidebarComponent {
1377
1466
  * messages classified as A2UI parse correctly but never mount a
1378
1467
  * surface. Pass `a2uiBasicCatalog()` from `@threadplane/chat`. */
1379
1468
  readonly views: _angular_core.InputSignal<Readonly<Record<string, _angular_core.Type<unknown> | _threadplane_render.RenderViewEntry>> | undefined>;
1469
+ /** Frontend-declared client tools forwarded to the inner `<chat>`. */
1470
+ readonly clientTools: _angular_core.InputSignal<Readonly<Record<string, _threadplane_chat.ClientToolDef>> | undefined>;
1380
1471
  /** Forwarded to the inner <chat>. When non-empty, a model picker pill
1381
1472
  * renders in the chat-input chrome. */
1382
1473
  readonly modelOptions: _angular_core.InputSignal<readonly ChatSelectOption[]>;
@@ -1400,7 +1491,7 @@ declare class ChatSidebarComponent {
1400
1491
  openWindow(): void;
1401
1492
  closeWindow(): void;
1402
1493
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChatSidebarComponent, never>;
1403
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChatSidebarComponent, "chat-sidebar", never, { "agent": { "alias": "agent"; "required": true; "isSignal": true; }; "views": { "alias": "views"; "required": false; "isSignal": true; }; "modelOptions": { "alias": "modelOptions"; "required": false; "isSignal": true; }; "showModelPicker": { "alias": "showModelPicker"; "required": false; "isSignal": true; }; "selectedModel": { "alias": "selectedModel"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "pushContent": { "alias": "pushContent"; "required": false; "isSignal": true; }; }, { "selectedModel": "selectedModelChange"; "open": "openChange"; }, never, ["*", "[chatSidebarPanelTitle]", "[chatHeader]", "[chatWelcomeSuggestions]"], true, never>;
1494
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChatSidebarComponent, "chat-sidebar", never, { "agent": { "alias": "agent"; "required": true; "isSignal": true; }; "views": { "alias": "views"; "required": false; "isSignal": true; }; "clientTools": { "alias": "clientTools"; "required": false; "isSignal": true; }; "modelOptions": { "alias": "modelOptions"; "required": false; "isSignal": true; }; "showModelPicker": { "alias": "showModelPicker"; "required": false; "isSignal": true; }; "selectedModel": { "alias": "selectedModel"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "pushContent": { "alias": "pushContent"; "required": false; "isSignal": true; }; }, { "selectedModel": "selectedModelChange"; "open": "openChange"; }, never, ["*", "[chatSidebarPanelTitle]", "[chatHeader]", "[chatWelcomeSuggestions]"], true, never>;
1404
1495
  }
1405
1496
 
1406
1497
  declare class ChatTimelineSliderComponent {
@@ -1583,9 +1674,9 @@ declare const MARKDOWN_VIEW_REGISTRY: InjectionToken<Readonly<Record<string, _an
1583
1674
  * registry. Each child's `type` is looked up in the registry; the resolved
1584
1675
  * component is rendered with `[node]` bound to that child.
1585
1676
  *
1586
- * Identity-preserving: `track $any(child)` keys on the JS reference of the
1587
- * child node. Because @cacheplane/partial-markdown preserves node identity
1588
- * across pushes, unchanged subtrees never re-render.
1677
+ * Position-stable: `track $index` avoids NG0956 re-creation warnings that
1678
+ * occur when the markdown pipeline re-parses content on every stream delta,
1679
+ * producing new child object references even for unchanged nodes.
1589
1680
  */
1590
1681
  declare class MarkdownChildrenComponent {
1591
1682
  readonly parent: _angular_core.InputSignal<MarkdownNode>;
@@ -1916,14 +2007,15 @@ declare function buildA2uiActionMessage(params: Record<string, unknown>, surface
1916
2007
 
1917
2008
  declare function a2uiBasicCatalog(): ViewRegistry;
1918
2009
 
1919
- /** Emits a data model binding event if the prop has a binding path. */
1920
- declare function emitBinding(emit: (event: string) => void, bindings: Record<string, string> | undefined, prop: string, value: unknown): void;
2010
+ /** Writes a typed value to the render state store if the prop has a binding path. */
2011
+ declare function emitBinding(host: RenderHost, bindings: Record<string, string> | undefined, prop: string, value: unknown): void;
1921
2012
 
1922
2013
  /** v1 textFieldType values from A2uiTextField. */
1923
2014
  type TextFieldType = 'date' | 'longText' | 'number' | 'shortText' | 'obscured';
1924
2015
  declare class A2uiTextFieldComponent {
1925
2016
  private static _idCounter;
1926
2017
  protected readonly _inputId: string;
2018
+ private readonly host;
1927
2019
  readonly label: _angular_core.InputSignal<string>;
1928
2020
  /** v1 prop: text (resolved string value). */
1929
2021
  readonly text: _angular_core.InputSignal<string>;
@@ -1933,7 +2025,6 @@ declare class A2uiTextFieldComponent {
1933
2025
  readonly textFieldType: _angular_core.InputSignal<TextFieldType>;
1934
2026
  readonly validationRegexp: _angular_core.InputSignal<string>;
1935
2027
  readonly _bindings: _angular_core.InputSignal<Record<string, string>>;
1936
- readonly emit: _angular_core.InputSignal<(event: string) => void>;
1937
2028
  readonly bindings: _angular_core.InputSignal<Record<string, string>>;
1938
2029
  readonly loading: _angular_core.InputSignal<boolean>;
1939
2030
  readonly childKeys: _angular_core.InputSignal<string[]>;
@@ -1941,17 +2032,17 @@ declare class A2uiTextFieldComponent {
1941
2032
  protected readonly htmlInputType: _angular_core.Signal<string>;
1942
2033
  onInput(event: Event): void;
1943
2034
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<A2uiTextFieldComponent, never>;
1944
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<A2uiTextFieldComponent, "a2ui-text-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "text": { "alias": "text"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "textFieldType": { "alias": "textFieldType"; "required": false; "isSignal": true; }; "validationRegexp": { "alias": "validationRegexp"; "required": false; "isSignal": true; }; "_bindings": { "alias": "_bindings"; "required": false; "isSignal": true; }; "emit": { "alias": "emit"; "required": false; "isSignal": true; }; "bindings": { "alias": "bindings"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "childKeys": { "alias": "childKeys"; "required": false; "isSignal": true; }; "spec": { "alias": "spec"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2035
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<A2uiTextFieldComponent, "a2ui-text-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "text": { "alias": "text"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "textFieldType": { "alias": "textFieldType"; "required": false; "isSignal": true; }; "validationRegexp": { "alias": "validationRegexp"; "required": false; "isSignal": true; }; "_bindings": { "alias": "_bindings"; "required": false; "isSignal": true; }; "bindings": { "alias": "bindings"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "childKeys": { "alias": "childKeys"; "required": false; "isSignal": true; }; "spec": { "alias": "spec"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1945
2036
  }
1946
2037
 
1947
2038
  declare class A2uiCheckBoxComponent {
2039
+ private readonly host;
1948
2040
  readonly label: _angular_core.InputSignal<string>;
1949
2041
  /** v1 canonical prop: boolean checked state. */
1950
2042
  readonly value: _angular_core.InputSignal<boolean | undefined>;
1951
2043
  /** Pre-v1 alias retained for back-compat. */
1952
2044
  readonly checked: _angular_core.InputSignal<boolean>;
1953
2045
  readonly _bindings: _angular_core.InputSignal<Record<string, string>>;
1954
- readonly emit: _angular_core.InputSignal<(event: string) => void>;
1955
2046
  readonly bindings: _angular_core.InputSignal<Record<string, string>>;
1956
2047
  readonly loading: _angular_core.InputSignal<boolean>;
1957
2048
  readonly childKeys: _angular_core.InputSignal<string[]>;
@@ -1959,7 +2050,7 @@ declare class A2uiCheckBoxComponent {
1959
2050
  protected readonly effectiveValue: _angular_core.Signal<boolean>;
1960
2051
  onChange(event: Event): void;
1961
2052
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<A2uiCheckBoxComponent, never>;
1962
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<A2uiCheckBoxComponent, "a2ui-check-box", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "_bindings": { "alias": "_bindings"; "required": false; "isSignal": true; }; "emit": { "alias": "emit"; "required": false; "isSignal": true; }; "bindings": { "alias": "bindings"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "childKeys": { "alias": "childKeys"; "required": false; "isSignal": true; }; "spec": { "alias": "spec"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2053
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<A2uiCheckBoxComponent, "a2ui-check-box", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "_bindings": { "alias": "_bindings"; "required": false; "isSignal": true; }; "bindings": { "alias": "bindings"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "childKeys": { "alias": "childKeys"; "required": false; "isSignal": true; }; "spec": { "alias": "spec"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1963
2054
  }
1964
2055
 
1965
2056
  declare class A2uiButtonComponent {
@@ -1982,6 +2073,7 @@ interface ResolvedOption {
1982
2073
  value: string;
1983
2074
  }
1984
2075
  declare class A2uiMultipleChoiceComponent {
2076
+ private readonly host;
1985
2077
  readonly label: _angular_core.InputSignal<string>;
1986
2078
  /** Resolved current selections from surface-to-spec. Normalized in
1987
2079
  * `selectionsArray` because LLMs sometimes seed the data model with a
@@ -1994,7 +2086,6 @@ declare class A2uiMultipleChoiceComponent {
1994
2086
  /** When ≤ 1 — render as single-select <select>; otherwise multi-select checkboxes. */
1995
2087
  readonly maxAllowedSelections: _angular_core.InputSignal<number>;
1996
2088
  readonly _bindings: _angular_core.InputSignal<Record<string, string>>;
1997
- readonly emit: _angular_core.InputSignal<(event: string) => void>;
1998
2089
  readonly bindings: _angular_core.InputSignal<Record<string, string>>;
1999
2090
  readonly loading: _angular_core.InputSignal<boolean>;
2000
2091
  readonly childKeys: _angular_core.InputSignal<string[]>;
@@ -2004,12 +2095,13 @@ declare class A2uiMultipleChoiceComponent {
2004
2095
  onSelectChange(event: Event): void;
2005
2096
  onCheckChange(value: string, event: Event): void;
2006
2097
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<A2uiMultipleChoiceComponent, never>;
2007
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<A2uiMultipleChoiceComponent, "a2ui-multiple-choice", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "selections": { "alias": "selections"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "maxAllowedSelections": { "alias": "maxAllowedSelections"; "required": false; "isSignal": true; }; "_bindings": { "alias": "_bindings"; "required": false; "isSignal": true; }; "emit": { "alias": "emit"; "required": false; "isSignal": true; }; "bindings": { "alias": "bindings"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "childKeys": { "alias": "childKeys"; "required": false; "isSignal": true; }; "spec": { "alias": "spec"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2098
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<A2uiMultipleChoiceComponent, "a2ui-multiple-choice", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "selections": { "alias": "selections"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "maxAllowedSelections": { "alias": "maxAllowedSelections"; "required": false; "isSignal": true; }; "_bindings": { "alias": "_bindings"; "required": false; "isSignal": true; }; "bindings": { "alias": "bindings"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "childKeys": { "alias": "childKeys"; "required": false; "isSignal": true; }; "spec": { "alias": "spec"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2008
2099
  }
2009
2100
 
2010
2101
  declare class A2uiSliderComponent {
2011
2102
  private static _idCounter;
2012
2103
  protected readonly _inputId: string;
2104
+ private readonly host;
2013
2105
  readonly label: _angular_core.InputSignal<string>;
2014
2106
  /** v1 prop: value (resolved DynamicNumber). */
2015
2107
  readonly value: _angular_core.InputSignal<number>;
@@ -2019,19 +2111,19 @@ declare class A2uiSliderComponent {
2019
2111
  readonly maxValue: _angular_core.InputSignal<number>;
2020
2112
  readonly step: _angular_core.InputSignal<number>;
2021
2113
  readonly _bindings: _angular_core.InputSignal<Record<string, string>>;
2022
- readonly emit: _angular_core.InputSignal<(event: string) => void>;
2023
2114
  readonly bindings: _angular_core.InputSignal<Record<string, string>>;
2024
2115
  readonly loading: _angular_core.InputSignal<boolean>;
2025
2116
  readonly childKeys: _angular_core.InputSignal<string[]>;
2026
2117
  readonly spec: _angular_core.InputSignal<Spec | undefined>;
2027
2118
  onInput(event: Event): void;
2028
2119
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<A2uiSliderComponent, never>;
2029
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<A2uiSliderComponent, "a2ui-slider", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "minValue": { "alias": "minValue"; "required": false; "isSignal": true; }; "maxValue": { "alias": "maxValue"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "_bindings": { "alias": "_bindings"; "required": false; "isSignal": true; }; "emit": { "alias": "emit"; "required": false; "isSignal": true; }; "bindings": { "alias": "bindings"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "childKeys": { "alias": "childKeys"; "required": false; "isSignal": true; }; "spec": { "alias": "spec"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2120
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<A2uiSliderComponent, "a2ui-slider", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "minValue": { "alias": "minValue"; "required": false; "isSignal": true; }; "maxValue": { "alias": "maxValue"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "_bindings": { "alias": "_bindings"; "required": false; "isSignal": true; }; "bindings": { "alias": "bindings"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "childKeys": { "alias": "childKeys"; "required": false; "isSignal": true; }; "spec": { "alias": "spec"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2030
2121
  }
2031
2122
 
2032
2123
  declare class A2uiDateTimeInputComponent {
2033
2124
  private static _idCounter;
2034
2125
  protected readonly _inputId: string;
2126
+ private readonly host;
2035
2127
  readonly label: _angular_core.InputSignal<string>;
2036
2128
  /** v1 prop: value (resolved DynamicString). */
2037
2129
  readonly value: _angular_core.InputSignal<string>;
@@ -2040,7 +2132,6 @@ declare class A2uiDateTimeInputComponent {
2040
2132
  /** v1 prop: enableTime — include time portion. */
2041
2133
  readonly enableTime: _angular_core.InputSignal<boolean>;
2042
2134
  readonly _bindings: _angular_core.InputSignal<Record<string, string>>;
2043
- readonly emit: _angular_core.InputSignal<(event: string) => void>;
2044
2135
  readonly bindings: _angular_core.InputSignal<Record<string, string>>;
2045
2136
  readonly loading: _angular_core.InputSignal<boolean>;
2046
2137
  readonly childKeys: _angular_core.InputSignal<string[]>;
@@ -2049,7 +2140,7 @@ declare class A2uiDateTimeInputComponent {
2049
2140
  protected readonly htmlInputType: _angular_core.Signal<string>;
2050
2141
  onChange(event: Event): void;
2051
2142
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<A2uiDateTimeInputComponent, never>;
2052
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<A2uiDateTimeInputComponent, "a2ui-date-time-input", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "enableDate": { "alias": "enableDate"; "required": false; "isSignal": true; }; "enableTime": { "alias": "enableTime"; "required": false; "isSignal": true; }; "_bindings": { "alias": "_bindings"; "required": false; "isSignal": true; }; "emit": { "alias": "emit"; "required": false; "isSignal": true; }; "bindings": { "alias": "bindings"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "childKeys": { "alias": "childKeys"; "required": false; "isSignal": true; }; "spec": { "alias": "spec"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2143
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<A2uiDateTimeInputComponent, "a2ui-date-time-input", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "enableDate": { "alias": "enableDate"; "required": false; "isSignal": true; }; "enableTime": { "alias": "enableTime"; "required": false; "isSignal": true; }; "_bindings": { "alias": "_bindings"; "required": false; "isSignal": true; }; "bindings": { "alias": "bindings"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "childKeys": { "alias": "childKeys"; "required": false; "isSignal": true; }; "spec": { "alias": "spec"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2053
2144
  }
2054
2145
 
2055
2146
  type UsageHint = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'caption' | 'body';
@@ -2257,6 +2348,71 @@ declare class A2uiVideoComponent {
2257
2348
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<A2uiVideoComponent, "a2ui-video", never, { "url": { "alias": "url"; "required": false; "isSignal": true; }; "autoPlay": { "alias": "autoPlay"; "required": false; "isSignal": true; }; "controls": { "alias": "controls"; "required": false; "isSignal": true; }; "bindings": { "alias": "bindings"; "required": false; "isSignal": true; }; "emit": { "alias": "emit"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "childKeys": { "alias": "childKeys"; "required": false; "isSignal": true; }; "spec": { "alias": "spec"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2258
2349
  }
2259
2350
 
2351
+ /** A client tool the model can call; executed in the browser. */
2352
+ type ClientToolDef = FunctionToolDef | ViewToolDef | AskToolDef;
2353
+ interface FunctionToolDef<S extends StandardSchemaV1 = StandardSchemaV1> {
2354
+ readonly kind: 'function';
2355
+ readonly description: string;
2356
+ readonly schema: S;
2357
+ readonly handler: (args: StandardSchemaInferOutput<S>) => unknown | Promise<unknown>;
2358
+ }
2359
+ interface ViewToolDef {
2360
+ readonly kind: 'view';
2361
+ readonly description: string;
2362
+ readonly schema: StandardSchemaV1;
2363
+ readonly component: Type<unknown>;
2364
+ }
2365
+ interface AskToolDef {
2366
+ readonly kind: 'ask';
2367
+ readonly description: string;
2368
+ readonly schema: StandardSchemaV1;
2369
+ readonly component: Type<unknown>;
2370
+ }
2371
+ /** A frozen, name-keyed registry of client tools. */
2372
+ type ClientToolRegistry = Readonly<Record<string, ClientToolDef>>;
2373
+
2374
+ /** Async function tool — its resolved return value becomes the tool result. */
2375
+ declare function action<S extends StandardSchemaV1>(description: string, schema: S, handler: (args: StandardSchemaInferOutput<S>) => unknown | Promise<unknown>): FunctionToolDef<S>;
2376
+ /** Render-only component tool — the model fills its props; auto-acknowledged. */
2377
+ declare function view(description: string, schema: StandardSchemaV1, component: Type<unknown>): ClientToolDef;
2378
+ /** Interactive (HITL) component tool — the value it emits becomes the result. */
2379
+ declare function ask(description: string, schema: StandardSchemaV1, component: Type<unknown>): ClientToolDef;
2380
+ /** Collect named client tools into a frozen registry (the key is the tool name). */
2381
+ declare function tools(map: Record<string, ClientToolDef>): ClientToolRegistry;
2382
+
2383
+ /** Validate raw model args against a Standard Schema. */
2384
+ declare function validateArgs(schema: StandardSchemaV1, args: unknown): Promise<{
2385
+ ok: true;
2386
+ value: unknown;
2387
+ } | {
2388
+ ok: false;
2389
+ error: string;
2390
+ }>;
2391
+ /** Validate args, run the handler, and normalize the outcome to a ClientToolResult. */
2392
+ declare function executeFunctionTool(def: FunctionToolDef, rawArgs: unknown): Promise<ClientToolResult>;
2393
+
2394
+ /**
2395
+ * Watches the agent's pending client tool calls and auto-runs FUNCTION tools,
2396
+ * resolving each with its result. View/ask (component) tools are handled by the
2397
+ * rendering layer, not here. No-op if the agent lacks the clientTools
2398
+ * capability. MUST be called in an injection context (sets up an effect).
2399
+ */
2400
+ declare function startClientToolExecutor(agent: Agent, registry: ClientToolRegistry): void;
2401
+
2402
+ interface ClientToolsCoordinator {
2403
+ /** Components for `view`/`ask` tools, keyed by tool name — merge into the chat `views`. */
2404
+ readonly viewRegistry: ViewRegistry;
2405
+ /** Wire the coordinator to an agent: ship the catalog, run function tools, auto-ack view tools.
2406
+ * MUST be called inside an injection context (sets up effects). Safe no-op if the agent lacks
2407
+ * the clientTools capability. */
2408
+ connect(agent: Agent): void;
2409
+ /** Handle a render event bubbled up from a mounted view/ask component (resolves `ask` results). */
2410
+ handleRenderEvent(agent: Agent, event: RenderEvent): void;
2411
+ }
2412
+ /** Build the catalog spec list shipped to the model. */
2413
+ declare function toClientToolSpecs(registry: ClientToolRegistry): ClientToolSpec[];
2414
+ declare function createClientToolsCoordinator(registry: ClientToolRegistry): ClientToolsCoordinator;
2415
+
2260
2416
  interface MockAgent extends Agent {
2261
2417
  messages: WritableSignal<Message[]>;
2262
2418
  status: WritableSignal<AgentStatus>;
@@ -2308,5 +2464,5 @@ interface MockAgentOptions {
2308
2464
  }
2309
2465
  declare function mockAgent(opts?: MockAgentOptions): MockAgent;
2310
2466
 
2311
- export { A2uiAudioPlayerComponent, A2uiButtonComponent, A2uiCardComponent, A2uiCheckBoxComponent, A2uiColumnComponent, A2uiDateTimeInputComponent, A2uiDividerComponent, A2uiIconComponent, A2uiImageComponent, A2uiListComponent, A2uiModalComponent, A2uiMultipleChoiceComponent, A2uiRowComponent, A2uiSliderComponent, A2uiSurfaceComponent, A2uiTabsComponent, A2uiTextComponent, A2uiTextFieldComponent, A2uiVideoComponent, CHAT_CONFIG, CHAT_LIFECYCLE, CHAT_MARKDOWN_STYLES, ChatApprovalCardComponent, ChatCitationCardTemplateDirective, ChatCitationsCardComponent, ChatCitationsComponent, ChatComponent, ChatConfirmDialogComponent, ChatErrorComponent, ChatGenerativeUiComponent, ChatGenuiSkeletonComponent, ChatHistorySearchPaletteComponent, ChatInputComponent, ChatInterruptComponent, ChatInterruptPanelComponent, ChatLauncherButtonComponent, ChatMessageActionsComponent, ChatMessageComponent, ChatMessageListComponent, ChatOverflowMenuComponent, ChatPopupComponent, ChatProjectListComponent, ChatReasoningComponent, ChatScrollBubbleComponent, ChatSelectComponent, ChatSidebarComponent, ChatSidenavComponent, ChatSidenavScrimComponent, ChatStreamingMdComponent, ChatSubagentCardComponent, ChatSubagentsComponent, ChatSuggestionsComponent, ChatThreadListComponent, ChatTimelineComponent, ChatTimelineSliderComponent, ChatToolCallCardComponent, ChatToolCallTemplateDirective, ChatToolCallsComponent, ChatToolViewsComponent, ChatTraceComponent, ChatTypingIndicatorComponent, ChatWelcomeComponent, ChatWelcomeSuggestionComponent, ChatWindowComponent, CitationsResolverService, ICON_AGENT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CHEVRON_UP, ICON_SEND, ICON_TOOL, ICON_WARNING, IS_HEADER_ROW, MARKDOWN_VIEW_REGISTRY, MarkdownAutolinkComponent, MarkdownBlockquoteComponent, MarkdownChildrenComponent, MarkdownCitationReferenceComponent, MarkdownCodeBlockComponent, MarkdownDocumentComponent, MarkdownEmphasisComponent, MarkdownHardBreakComponent, MarkdownHeadingComponent, MarkdownImageComponent, MarkdownInlineCodeComponent, MarkdownLinkComponent, MarkdownListComponent, MarkdownListItemComponent, MarkdownParagraphComponent, MarkdownSoftBreakComponent, MarkdownStrikethroughComponent, MarkdownStrongComponent, MarkdownTableCellComponent, MarkdownTableComponent, MarkdownTableRowComponent, MarkdownTextComponent, MarkdownThematicBreakComponent, MessageTemplateDirective, a2uiBasicCatalog, buildA2uiActionMessage, cacheplaneMarkdownViews, createA2uiSurfaceStore, createContentClassifier, createParseTreeStore, createPartialArgsBridge, emitBinding, extractErrorMessage, formatDuration, getInterrupt, getMessageType, isAssistantMessage, isSystemMessage, isToolMessage, isTyping, isUserMessage, messageContent, mockAgent, normalizeEnvelopeArgs, normalizeViewEntry, provideChat, renderMarkdown, statusColor, submitMessage, surfaceToSpec };
2312
- export type { A2uiComponentView, A2uiSurfaceState, A2uiSurfaceStore, A2uiViewEntry, A2uiViews, Agent, AgentCheckpoint, AgentCustomEvent, AgentEvent, AgentInterrupt, AgentRuntimeTelemetryEvent, AgentRuntimeTelemetryPayload, AgentRuntimeTelemetryProperties, AgentRuntimeTelemetrySink, AgentStateUpdateEvent, AgentStatus, AgentSubmitInput, AgentSubmitOptions, AgentWithHistory, ChatApprovalAction, ChatConfig, ChatLifecycle, ChatMessageRole, ChatRenderEvent, ChatScrollBubbleMode, ChatSelectOption, ChatSidenavMode, ChatToolCallTemplateContext, Citation, ContentBlock, ContentClassifier, ContentType, ElementAccumulationState, InterruptAction, Message, MessageTemplateType, MockAgent, MockAgentOptions, OverflowMenuItem, ParseTreeStore, PartialArgsBridge, Project, ProjectActionAdapter, ResolvedCitation, Role, Subagent, SubagentStatus, Thread, ThreadActionAdapter, ThreadMatch, ToolCall, ToolCallInfo, ToolCallStatus, TraceState };
2467
+ export { A2uiAudioPlayerComponent, A2uiButtonComponent, A2uiCardComponent, A2uiCheckBoxComponent, A2uiColumnComponent, A2uiDateTimeInputComponent, A2uiDividerComponent, A2uiIconComponent, A2uiImageComponent, A2uiListComponent, A2uiModalComponent, A2uiMultipleChoiceComponent, A2uiRowComponent, A2uiSliderComponent, A2uiSurfaceComponent, A2uiTabsComponent, A2uiTextComponent, A2uiTextFieldComponent, A2uiVideoComponent, CHAT_CONFIG, CHAT_LIFECYCLE, CHAT_MARKDOWN_STYLES, ChatApprovalCardComponent, ChatCitationCardTemplateDirective, ChatCitationsCardComponent, ChatCitationsComponent, ChatComponent, ChatConfirmDialogComponent, ChatErrorComponent, ChatGenerativeUiComponent, ChatGenuiSkeletonComponent, ChatHistorySearchPaletteComponent, ChatInputComponent, ChatInterruptComponent, ChatInterruptPanelComponent, ChatLauncherButtonComponent, ChatMessageActionsComponent, ChatMessageComponent, ChatMessageListComponent, ChatOverflowMenuComponent, ChatPopupComponent, ChatProjectListComponent, ChatReasoningComponent, ChatScrollBubbleComponent, ChatSelectComponent, ChatSidebarComponent, ChatSidenavComponent, ChatSidenavScrimComponent, ChatStreamingMdComponent, ChatSubagentCardComponent, ChatSubagentsComponent, ChatSuggestionsComponent, ChatThreadListComponent, ChatTimelineComponent, ChatTimelineSliderComponent, ChatToolCallCardComponent, ChatToolCallTemplateDirective, ChatToolCallsComponent, ChatToolViewsComponent, ChatTraceComponent, ChatTypingIndicatorComponent, ChatWelcomeComponent, ChatWelcomeSuggestionComponent, ChatWindowComponent, CitationsResolverService, ICON_AGENT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CHEVRON_UP, ICON_SEND, ICON_TOOL, ICON_WARNING, IS_HEADER_ROW, MARKDOWN_VIEW_REGISTRY, MarkdownAutolinkComponent, MarkdownBlockquoteComponent, MarkdownChildrenComponent, MarkdownCitationReferenceComponent, MarkdownCodeBlockComponent, MarkdownDocumentComponent, MarkdownEmphasisComponent, MarkdownHardBreakComponent, MarkdownHeadingComponent, MarkdownImageComponent, MarkdownInlineCodeComponent, MarkdownLinkComponent, MarkdownListComponent, MarkdownListItemComponent, MarkdownParagraphComponent, MarkdownSoftBreakComponent, MarkdownStrikethroughComponent, MarkdownStrongComponent, MarkdownTableCellComponent, MarkdownTableComponent, MarkdownTableRowComponent, MarkdownTextComponent, MarkdownThematicBreakComponent, MessageTemplateDirective, a2uiBasicCatalog, action, ask, buildA2uiActionMessage, cacheplaneMarkdownViews, createA2uiSurfaceStore, createClientToolsCoordinator, createContentClassifier, createParseTreeStore, createPartialArgsBridge, deriveJsonSchema, emitBinding, executeFunctionTool, extractErrorMessage, formatDuration, getInterrupt, getMessageType, isAssistantMessage, isSystemMessage, isToolMessage, isTyping, isUserMessage, messageContent, mockAgent, normalizeEnvelopeArgs, normalizeViewEntry, provideChat, renderMarkdown, startClientToolExecutor, statusColor, submitMessage, surfaceToSpec, toClientToolSpecs, tools, validateArgs, view };
2468
+ export type { A2uiComponentView, A2uiSurfaceState, A2uiSurfaceStore, A2uiViewEntry, A2uiViews, Agent, AgentCheckpoint, AgentCustomEvent, AgentEvent, AgentInterrupt, AgentRuntimeTelemetryEvent, AgentRuntimeTelemetryPayload, AgentRuntimeTelemetryProperties, AgentRuntimeTelemetrySink, AgentStateUpdateEvent, AgentStatus, AgentSubmitInput, AgentSubmitOptions, AgentWithHistory, AskToolDef, ChatApprovalAction, ChatConfig, ChatLifecycle, ChatMessageRole, ChatRenderEvent, ChatScrollBubbleMode, ChatSelectOption, ChatSidenavMode, ChatToolCallTemplateContext, Citation, ClientToolDef, ClientToolRegistry, ClientToolResult, ClientToolSpec, ClientToolsCapability, ClientToolsCoordinator, ContentBlock, ContentClassifier, ContentType, ElementAccumulationState, FunctionToolDef, InterruptAction, Message, MessageTemplateType, MockAgent, MockAgentOptions, OverflowMenuItem, ParseTreeStore, PartialArgsBridge, Project, ProjectActionAdapter, ResolvedCitation, Role, Subagent, SubagentStatus, Thread, ThreadActionAdapter, ThreadMatch, ToolCall, ToolCallInfo, ToolCallStatus, TraceState, ViewToolDef };