@artooi/ag-ui-web-component 0.2.0 → 0.2.2

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.
@@ -91,6 +91,15 @@ export declare class AgUiChat extends HTMLElement {
91
91
  * this from the current page; a missing placeholder blocks the send.
92
92
  */
93
93
  skillContext: () => Record<string, unknown>;
94
+ /**
95
+ * Friendly display labels for tool-call cards, keyed by tool name (e.g.
96
+ * `{ list_projects: "Search projects" }`). Used as a fallback when a tool has
97
+ * no `x-summary` in its own schema — chiefly **server-side tools** (drf-mcp,
98
+ * `@tool` registry), whose schema never reaches the browser (AG-UI streams
99
+ * only the tool-call name). Client tools should prefer `x-summary` on their
100
+ * schema; this map is the seam for everything else.
101
+ */
102
+ toolSummaries: Record<string, string>;
94
103
  constructor();
95
104
  /** Attributes whose late changes must reflect in already-rendered chrome. */
96
105
  static get observedAttributes(): string[];
@@ -1 +1 @@
1
- {"version":3,"file":"ag_ui_chat.d.ts","sourceRoot":"","sources":["../../src/core/ag_ui_chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAW,IAAI,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EACL,YAAY,EAOb,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,KAAK,UAAU,EAAsB,MAAM,kCAAkC,CAAC;AAGvF,OAAO,EAAwB,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAM9E,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAO7E,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EAE1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,wBAAwB,CAAC;AAE5E,8CAA8C;AAC9C,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE3E,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAKD;;;;;;;;;;;GAWG;AACH,qBAAa,QAAS,SAAQ,WAAW;;IACvC,wEAAwE;IACxE,YAAY,EAAE,YAAY,CAAmB;IAE7C,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IAErC,yEAAyE;IACzE,WAAW,UAAS;IAEpB;;;;;;OAMG;IACH,gBAAgB,EACZ,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GACjF,IAAI,CAAQ;IAEhB;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,IAAI,EAAE,CAOpB;IAEF;;;OAGG;IACH,UAAU,EAAE,MAAM,OAAO,EAAE,CAAuE;IAElG;;;OAGG;IACH,QAAQ,EAAE,QAAQ,CAAM;IAExB;;;;OAIG;IACH,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAEjD,iEAAiE;IACjE,UAAU,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,IAAI,CAAQ;IAE1C,iEAAiE;IACjE,iBAAiB,UAAQ;IAEzB;;;;OAIG;IACH,iBAAiB,EAAE,uBAAuB,CAA6B;IAEvE;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,UAAU,EAAE,oBAAoB,KAAK,OAAO,CAG5D;IAEH;;;;OAIG;IACH,YAAY,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAc;;IAoCzD,6EAA6E;IAC7E,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAM7F,kDAAkD;IAClD,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIpC,wEAAwE;IACxE,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAqDxC,kEAAkE;IAClE,IAAI,QAAQ,IAAI,MAAM,CAErB;IAKD,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,EAEzB;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,eAAe,CAMjC;IAED,IAAI,WAAW,CAAC,KAAK,EAAE,eAAe,EAErC;IAED,iBAAiB,IAAI,IAAI;IAUzB;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,IAAI;IAoEzC,gFAAgF;IAChF,IAAI,SAAS,IAAI,OAAO,CAEvB;IAID,IAAI,SAAS,CAAC,KAAK,EAAE,OAAO,EAE3B;IAED;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAgBtC,qEAAqE;IACrE,eAAe,IAAI,IAAI;IAIvB;;;OAGG;IACH,OAAO,IAAI,IAAI;IA6Df;;;;;;OAMG;IACH,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc;CAuTlE"}
1
+ {"version":3,"file":"ag_ui_chat.d.ts","sourceRoot":"","sources":["../../src/core/ag_ui_chat.ts"],"names":[],"mappings":"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"}
@@ -40,8 +40,21 @@ export interface AgUiClientHandlers {
40
40
  onTextEnd(buffer: string): void;
41
41
  /** Fired when the agent finishes calling a tool (server- or frontend-side). */
42
42
  onToolCall(call: AgUiToolCall): void;
43
+ /**
44
+ * Fired when a server-side tool's result streams back (AG-UI's
45
+ * `TOOL_CALL_RESULT`). Frontend tools don't emit this — the client supplies
46
+ * their result itself — so this is the channel for server-executed output.
47
+ */
48
+ onToolResult(toolCallId: string, content: string): void;
43
49
  onRunEnd(): void;
44
50
  onError(message: string): void;
51
+ /**
52
+ * Fired exactly once when the whole interaction settles — after the run loop
53
+ * ends for any reason (a server-only round, frontend-tool rounds exhausted,
54
+ * or an error). The terminal guarantee that the UI returns to rest (pending
55
+ * indicator cleared, input re-enabled) no matter how the run finished.
56
+ */
57
+ onSettled(): void;
45
58
  }
46
59
  /**
47
60
  * Provider of the per-run frontend tool catalog and context. Both are read
@@ -1 +1 @@
1
- {"version":3,"file":"agui_client.d.ts","sourceRoot":"","sources":["../../src/core/agui_client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAoC,MAAM,eAAe,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAG1D,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,mFAAmF;AACnF,MAAM,WAAW,aAAa;IAC5B,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;AAEhF;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,IAAI,IAAI,CAAC;IACnB,yEAAyE;IACzE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,gFAAgF;IAChF,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,+EAA+E;IAC/E,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IACrC,QAAQ,IAAI,IAAI,CAAC;IACjB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,OAAO,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,sEAAsE;IACtE,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,oEAAoE;IACpE,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,KAAK,IAAI,CAAC;CACpD;AAED;;;;;;GAMG;AACH,qBAAa,UAAU;;gBAQT,MAAM,EAAE,gBAAgB;IASpC,4CAA4C;IAC5C,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,wEAAwE;IACxE,IAAI,QAAQ,IAAI,SAAS,OAAO,EAAE,CAEjC;IAED;;;;;;OAMG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1C;;;;OAIG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,0EAA0E;IAC1E,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;CA+EzD"}
1
+ {"version":3,"file":"agui_client.d.ts","sourceRoot":"","sources":["../../src/core/agui_client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAoC,MAAM,eAAe,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAG1D,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,mFAAmF;AACnF,MAAM,WAAW,aAAa;IAC5B,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;AAEhF;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,IAAI,IAAI,CAAC;IACnB,yEAAyE;IACzE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,gFAAgF;IAChF,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,+EAA+E;IAC/E,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IACrC;;;;OAIG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACxD,QAAQ,IAAI,IAAI,CAAC;IACjB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;;;;OAKG;IACH,SAAS,IAAI,IAAI,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,OAAO,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,sEAAsE;IACtE,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,oEAAoE;IACpE,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,KAAK,IAAI,CAAC;CACpD;AAED;;;;;;GAMG;AACH,qBAAa,UAAU;;gBAQT,MAAM,EAAE,gBAAgB;IASpC,4CAA4C;IAC5C,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,wEAAwE;IACxE,IAAI,QAAQ,IAAI,SAAS,OAAO,EAAE,CAEjC;IAED;;;;;;OAMG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1C;;;;OAIG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,0EAA0E;IAC1E,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;CAoFzD"}
package/dist/index.js CHANGED
@@ -143,7 +143,7 @@ function createRouteTools(getRouteMap, getNavigate) {
143
143
  {
144
144
  name: "list_routes",
145
145
  description: "List the routes the app can navigate to. Each route's `pathParams` names the dynamic segments to pass as `params` to `navigate_to_route`.",
146
- parameters: { type: "object", properties: {}, required: [] },
146
+ parameters: { type: "object", properties: {}, required: [], [X_SUMMARY_KEY]: "List pages" },
147
147
  handler: () => getRouteMap().map((route) => ({ ...route, pathParams: pathParamNames(route.path) }))
148
148
  },
149
149
  {
@@ -156,7 +156,8 @@ function createRouteTools(getRouteMap, getNavigate) {
156
156
  params: { type: "object" }
157
157
  },
158
158
  required: ["route_id"],
159
- [X_NAVIGATES_KEY]: true
159
+ [X_NAVIGATES_KEY]: true,
160
+ [X_SUMMARY_KEY]: "Navigate"
160
161
  },
161
162
  handler: (args) => {
162
163
  const routeId = args["route_id"];
@@ -185,7 +186,12 @@ function createStateHookTools(hook) {
185
186
  {
186
187
  name: `read_${hook.name}`,
187
188
  description: `Read the "${hook.name}" state.`,
188
- parameters: { type: "object", properties: {}, required: [] },
189
+ parameters: {
190
+ type: "object",
191
+ properties: {},
192
+ required: [],
193
+ [X_SUMMARY_KEY]: `Read ${hook.name}`
194
+ },
189
195
  handler: () => hook.read()
190
196
  }
191
197
  ];
@@ -194,7 +200,11 @@ function createStateHookTools(hook) {
194
200
  tools.push({
195
201
  name: `set_${hook.name}`,
196
202
  description: `Update the "${hook.name}" state.`,
197
- parameters: { ...hook.schema ?? { type: "object" }, [X_DESTRUCTIVE_KEY]: true },
203
+ parameters: {
204
+ ...hook.schema ?? { type: "object" },
205
+ [X_DESTRUCTIVE_KEY]: true,
206
+ [X_SUMMARY_KEY]: `Update ${hook.name}`
207
+ },
198
208
  handler: (args) => write(args)
199
209
  });
200
210
  }
@@ -3145,7 +3155,10 @@ var STYLES = `
3145
3155
  }
3146
3156
 
3147
3157
  /* \u2500\u2500 Incoming-text animations (data-text-animation) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3148
- :host([data-text-animation="fade"]) .message--assistant {
3158
+ /* .message--restored (rehydrated history) is excluded: entrance animations are
3159
+ for freshly-arriving messages, not the whole transcript replaying on reload.
3160
+ Word mode is excluded implicitly \u2014 restored bubbles aren't wrapped. */
3161
+ :host([data-text-animation="fade"]) .message--assistant:not(.message--restored) {
3149
3162
  animation: ag-ui-msg-fade 0.25s ease both;
3150
3163
  }
3151
3164
 
@@ -3669,6 +3682,8 @@ var AgUiClient = class {
3669
3682
  await this.#runLoop();
3670
3683
  } catch (error) {
3671
3684
  this.#handlers.onError(error instanceof Error ? error.message : String(error));
3685
+ } finally {
3686
+ this.#handlers.onSettled();
3672
3687
  }
3673
3688
  }
3674
3689
  async #runLoop() {
@@ -3726,6 +3741,9 @@ var AgUiClient = class {
3726
3741
  pending.push(call);
3727
3742
  h.onToolCall(call);
3728
3743
  },
3744
+ onToolCallResultEvent({ event }) {
3745
+ h.onToolResult(event.toolCallId, event.content);
3746
+ },
3729
3747
  onRunErrorEvent({ event }) {
3730
3748
  h.onError(event.message);
3731
3749
  },
@@ -3877,9 +3895,24 @@ var AgUiChat = class extends HTMLElement {
3877
3895
  * this from the current page; a missing placeholder blocks the send.
3878
3896
  */
3879
3897
  skillContext = () => ({});
3898
+ /**
3899
+ * Friendly display labels for tool-call cards, keyed by tool name (e.g.
3900
+ * `{ list_projects: "Search projects" }`). Used as a fallback when a tool has
3901
+ * no `x-summary` in its own schema — chiefly **server-side tools** (drf-mcp,
3902
+ * `@tool` registry), whose schema never reaches the browser (AG-UI streams
3903
+ * only the tool-call name). Client tools should prefer `x-summary` on their
3904
+ * schema; this map is the seam for everything else.
3905
+ */
3906
+ toolSummaries = {};
3880
3907
  #toolRegistry = new ClientToolRegistry();
3881
3908
  /** Tool-call cards awaiting execution, keyed by call id. */
3882
3909
  #toolCards = /* @__PURE__ */ new Map();
3910
+ /**
3911
+ * Call ids whose card was already settled from a streamed server-side result
3912
+ * (`TOOL_CALL_RESULT`), so the post-run executeTool sweep doesn't overwrite
3913
+ * the real output with the generic "executed on the server" fallback.
3914
+ */
3915
+ #serverSettled = /* @__PURE__ */ new Set();
3883
3916
  #root;
3884
3917
  #chat;
3885
3918
  #messages;
@@ -3890,6 +3923,10 @@ var AgUiChat = class extends HTMLElement {
3890
3923
  #skillHint;
3891
3924
  #client = null;
3892
3925
  #streamingBubble = null;
3926
+ // Text deltas applied to the current streaming bubble. >1 ⇒ the message
3927
+ // revealed progressively as it streamed, so the word reveal must not re-animate
3928
+ // it; ≤1 ⇒ it arrived at once and the word reveal is appropriate.
3929
+ #streamDeltas = 0;
3893
3930
  #pending = null;
3894
3931
  #threadId = "";
3895
3932
  #initialMessages = [];
@@ -3949,7 +3986,12 @@ var AgUiChat = class extends HTMLElement {
3949
3986
  {
3950
3987
  name: "read_page",
3951
3988
  description: "Read the current page's structure (fields, buttons, route). Call after acting to observe the result within the same turn.",
3952
- parameters: { type: "object", properties: {}, required: [] },
3989
+ parameters: {
3990
+ type: "object",
3991
+ properties: {},
3992
+ required: [],
3993
+ [X_SUMMARY_KEY]: "Read the page"
3994
+ },
3953
3995
  handler: () => getPageMap()
3954
3996
  }
3955
3997
  ];
@@ -4107,6 +4149,7 @@ var AgUiChat = class extends HTMLElement {
4107
4149
  this.#streamingBubble = null;
4108
4150
  this.#hidePending();
4109
4151
  this.#toolCards.clear();
4152
+ this.#serverSettled.clear();
4110
4153
  this.#initialMessages = [];
4111
4154
  this.#messages.replaceChildren();
4112
4155
  this.#threadId = this.conversationStore.threadId();
@@ -4130,16 +4173,53 @@ var AgUiChat = class extends HTMLElement {
4130
4173
  await this.#resumeFrom(checkpoint);
4131
4174
  }
4132
4175
  }
4133
- /** Render a restored message as a chat bubble (text turns only). */
4176
+ /**
4177
+ * Replay a restored message: text bubbles *and* tool activity. An assistant
4178
+ * turn may carry `toolCalls` (rendered as cards) and/or text; a `tool` turn
4179
+ * carries a result that settles the matching card. So a refreshed page shows
4180
+ * the full transcript — tool calls and their results — not just the prose.
4181
+ */
4134
4182
  #renderHistoricMessage(message) {
4135
- if (typeof message.content !== "string" || message.content === "") {
4183
+ const text2 = typeof message.content === "string" ? message.content : "";
4184
+ if (message.role === MESSAGE_ROLE.USER) {
4185
+ if (text2 !== "") {
4186
+ this.appendMessage(MESSAGE_ROLE.USER, text2);
4187
+ }
4136
4188
  return;
4137
4189
  }
4138
- if (message.role === MESSAGE_ROLE.USER) {
4139
- this.appendMessage(MESSAGE_ROLE.USER, message.content);
4140
- } else if (message.role === MESSAGE_ROLE.ASSISTANT) {
4141
- this.#revealWords(this.appendMessage(MESSAGE_ROLE.ASSISTANT, message.content));
4190
+ if (message.role === MESSAGE_ROLE.ASSISTANT) {
4191
+ if (text2 !== "") {
4192
+ this.appendMessage(MESSAGE_ROLE.ASSISTANT, text2).classList.add("message--restored");
4193
+ }
4194
+ const toolCalls = message.toolCalls;
4195
+ if (toolCalls !== void 0) {
4196
+ for (const call of toolCalls) {
4197
+ this.#cardFor({
4198
+ id: call.id,
4199
+ name: call.function.name,
4200
+ args: this.#parseArgs(call.function.arguments)
4201
+ });
4202
+ }
4203
+ }
4204
+ return;
4205
+ }
4206
+ if (message.role === "tool") {
4207
+ const card = this.#toolCards.get(message.toolCallId);
4208
+ if (card !== void 0) {
4209
+ card.settle(TOOL_CALL_STATUS.DONE, message.content);
4210
+ }
4211
+ }
4212
+ }
4213
+ /** Parse a tool call's JSON `arguments` string from history into an object. */
4214
+ #parseArgs(raw) {
4215
+ try {
4216
+ const parsed = JSON.parse(raw);
4217
+ if (typeof parsed === "object" && parsed !== null) {
4218
+ return parsed;
4219
+ }
4220
+ } catch {
4142
4221
  }
4222
+ return {};
4143
4223
  }
4144
4224
  /**
4145
4225
  * Word-by-word reveal for the `word` text-animation mode, applied to a
@@ -4305,8 +4385,9 @@ var AgUiChat = class extends HTMLElement {
4305
4385
  this.#toolCards.delete(call.id);
4306
4386
  const tool = this.#resolveTool(call.name);
4307
4387
  if (tool === null) {
4308
- card.settle(TOOL_CALL_STATUS.DONE, "Executed on the server.");
4309
- this.#showPending();
4388
+ if (!this.#serverSettled.has(call.id)) {
4389
+ card.settle(TOOL_CALL_STATUS.DONE, "No result returned.");
4390
+ }
4310
4391
  return null;
4311
4392
  }
4312
4393
  if (await this.#needsConfirmation(call, tool)) {
@@ -4358,15 +4439,27 @@ var AgUiChat = class extends HTMLElement {
4358
4439
  onTextDelta: (buffer) => {
4359
4440
  this.#hidePending();
4360
4441
  this.#streamInto(buffer);
4442
+ this.#streamDeltas += 1;
4361
4443
  },
4362
4444
  onTextEnd: (buffer) => {
4363
- this.#revealWords(this.#streamInto(buffer));
4445
+ const bubble = this.#streamInto(buffer);
4446
+ if (this.#streamDeltas <= 1) {
4447
+ this.#revealWords(bubble);
4448
+ }
4364
4449
  this.#streamingBubble = null;
4365
4450
  },
4366
4451
  onToolCall: (call) => {
4367
4452
  this.#hidePending();
4368
4453
  this.#cardFor(call);
4369
4454
  },
4455
+ onToolResult: (toolCallId, content) => {
4456
+ const card = this.#toolCards.get(toolCallId);
4457
+ if (card === void 0) {
4458
+ return;
4459
+ }
4460
+ card.settle(TOOL_CALL_STATUS.DONE, content);
4461
+ this.#serverSettled.add(toolCallId);
4462
+ },
4370
4463
  onRunEnd: () => {
4371
4464
  this.#hidePending();
4372
4465
  this.#send.disabled = false;
@@ -4377,6 +4470,11 @@ var AgUiChat = class extends HTMLElement {
4377
4470
  this.#revealWords(this.appendMessage(MESSAGE_ROLE.ASSISTANT, `\u26A0\uFE0F ${message}`));
4378
4471
  this.#send.disabled = false;
4379
4472
  this.#streamingBubble = null;
4473
+ },
4474
+ onSettled: () => {
4475
+ this.#hidePending();
4476
+ this.#send.disabled = false;
4477
+ this.#streamingBubble = null;
4380
4478
  }
4381
4479
  };
4382
4480
  }
@@ -4410,6 +4508,7 @@ var AgUiChat = class extends HTMLElement {
4410
4508
  #streamInto(buffer) {
4411
4509
  if (this.#streamingBubble === null) {
4412
4510
  this.#streamingBubble = this.appendMessage(MESSAGE_ROLE.ASSISTANT, "");
4511
+ this.#streamDeltas = 0;
4413
4512
  }
4414
4513
  this.#streamingBubble.innerHTML = renderMarkdown(buffer);
4415
4514
  this.#messages.scrollTop = this.#messages.scrollHeight;
@@ -4426,13 +4525,9 @@ var AgUiChat = class extends HTMLElement {
4426
4525
  if (existing !== void 0) {
4427
4526
  return existing;
4428
4527
  }
4429
- const summary = this.#resolveTool(call.name)?.parameters[X_SUMMARY_KEY];
4430
- const card = new ToolCallCard(
4431
- call.name,
4432
- call.args,
4433
- this.toolDisplay,
4434
- typeof summary === "string" ? summary : void 0
4435
- );
4528
+ const labelled = this.#resolveTool(call.name)?.parameters[X_SUMMARY_KEY];
4529
+ const summary = typeof labelled === "string" ? labelled : this.toolSummaries[call.name];
4530
+ const card = new ToolCallCard(call.name, call.args, this.toolDisplay, summary);
4436
4531
  this.#toolCards.set(call.id, card);
4437
4532
  this.#messages.appendChild(card.element);
4438
4533
  this.#messages.scrollTop = this.#messages.scrollHeight;
@@ -4604,7 +4699,7 @@ function setControlValue(el, value) {
4604
4699
  }
4605
4700
 
4606
4701
  // src/version.ts
4607
- var VERSION = "0.2.0";
4702
+ var VERSION = "0.2.2";
4608
4703
  export {
4609
4704
  AgUiChat,
4610
4705
  AgUiClient,