site-operator 0.2.8 → 0.3.0

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/dist/index.d.ts CHANGED
@@ -34,6 +34,22 @@ export declare type Action = NavigationAction | {
34
34
  targetId: string;
35
35
  /** Optional reason for the click */
36
36
  reason?: string;
37
+ } | {
38
+ /** Sets a value to an input element (e.g., text, number) */
39
+ type: "setValue";
40
+ /** Identifier for the target input element */
41
+ targetId: string;
42
+ /** The value to set (string or number) */
43
+ value: string | number;
44
+ /** Optional reason for setting the value */
45
+ reason?: string;
46
+ } | {
47
+ /** Sequence of actions to be performed in order */
48
+ type: "plan";
49
+ /** Ordered list of actions to execute */
50
+ steps: Action[];
51
+ /** Description of the plan's overall goal */
52
+ goal?: string;
37
53
  } | {
38
54
  /** Generic action type for extension */
39
55
  type: string;
@@ -46,6 +62,7 @@ export declare class AgentChat extends LitElement {
46
62
  get controller(): ChatController;
47
63
  protected firstUpdated(): void;
48
64
  connectedCallback(): void;
65
+ private _injectFonts;
49
66
  disconnectedCallback(): void;
50
67
  backendUrl: string;
51
68
  appName: string;
@@ -341,6 +358,10 @@ export declare class ChatController implements ReactiveController {
341
358
  * Refresca el listado de conversaciones desde el servidor.
342
359
  */
343
360
  refreshConversations(): Promise<void>;
361
+ /**
362
+ * Obtiene el listado de conversaciones desde el servidor.
363
+ */
364
+ getConversations(): Promise<ConversationSummary[]>;
344
365
  /**
345
366
  * Manejador interno para cambios de estado.
346
367
  * Llama a requestUpdate() en el host para forzar el renderizado.
@@ -498,11 +519,17 @@ declare class ChatService extends EventTarget {
498
519
  sendMessage(content: string, role?: "developer" | "user" | "assistant" | "system" | "tool" | "activity"): Promise<void>;
499
520
  _ensureConversation(): Promise<void>;
500
521
  addPlaceholderMessage(): void;
522
+ cleanupThinkingPlaceholder(): void;
501
523
  prepareMessageForStreaming(newId: string): void;
502
524
  appendMessageContent(id: string, content: string): void;
503
525
  setMessages(messages: Message[]): void;
504
526
  addA2UIMessage(event: ActivitySnapshotEvent): void;
505
527
  startNewThread(): Promise<void>;
528
+ /**
529
+ * Obtiene el listado de conversaciones desde el servidor.
530
+ * @returns Promesa con el listado de conversaciones.
531
+ */
532
+ getConversations(): Promise<ConversationSummary[]>;
506
533
  /**
507
534
  * Refresca la lista de conversaciones desde el servicio de conversaciones.
508
535
  */
@@ -925,6 +925,8 @@ const styles$4 = i$1`
925
925
  color: var(--agent-text-foreground, #09090b);
926
926
  line-height: 1.5;
927
927
  white-space: pre-wrap;
928
+ overflow-wrap: anywhere;
929
+ word-break: break-word;
928
930
  }
929
931
 
930
932
  :host([role="user"]) .bubble {
@@ -1000,6 +1002,22 @@ const styles$4 = i$1`
1000
1002
  constructor() {
1001
1003
  this.processor = v0_8.Data.createSignalA2uiMessageProcessor();
1002
1004
  }
1005
+ resolveValue(o, O) {
1006
+ if (O) {
1007
+ if (O.literalString !== void 0) return O.literalString;
1008
+ if (O.literalNumber !== void 0) return O.literalNumber;
1009
+ if (O.literalBoolean !== void 0) return O.literalBoolean;
1010
+ if (O.literalArray !== void 0) return O.literalArray;
1011
+ if (O.path) {
1012
+ let M = this.processor.getSurfaces().get(o);
1013
+ if (M) {
1014
+ let o = O.path.startsWith("/") ? O.path.substring(1) : O.path, F = M.dataModel.get(o);
1015
+ if (F !== void 0) return F;
1016
+ }
1017
+ console.warn(`A2UIService: Could not resolve path ${O.path} for surface ${o}`);
1018
+ }
1019
+ }
1020
+ }
1003
1021
  mapMessage(o) {
1004
1022
  if (o.role !== "assistant" || !o.toolCalls) throw Error("Unsupported message type for A2UI processing");
1005
1023
  let O = [];
@@ -1074,11 +1092,11 @@ const styles$4 = i$1`
1074
1092
  return typeof o.path == "string" && (M.path = o.path), M;
1075
1093
  }
1076
1094
  normalizeDataModelUpdate(o) {
1077
- let O = {
1078
- surfaceId: o.surfaceId,
1095
+ let O = o.surfaceId || o.surface_id, M = {
1096
+ surfaceId: O,
1079
1097
  contents: this.normalizeValueMapArray(o.contents)
1080
1098
  };
1081
- return typeof o.path == "string" && (O.path = o.path), O;
1099
+ return typeof o.path == "string" && (M.path = o.path), console.log(`A2UIService: Normalized DataModelUpdate for ${O}`, M), M;
1082
1100
  }
1083
1101
  mapDeleteSurface(o) {
1084
1102
  let O = this.getSurfaceId(o);
@@ -1093,18 +1111,23 @@ const styles$4 = i$1`
1093
1111
  return typeof O == "string" && O.trim() ? O : typeof O == "number" ? String(O) : null;
1094
1112
  }
1095
1113
  normalizeValueMapArray(o) {
1096
- return Array.isArray(o) ? o.filter((o) => o && typeof o == "object" && "key" in o).map((o) => this.normalizeValueMapEntry(o)) : [];
1114
+ return Array.isArray(o) ? o.filter((o) => o && typeof o == "object" && ("key" in o || "path" in o)).map((o) => this.normalizeValueMapEntry(o)) : [];
1097
1115
  }
1098
1116
  normalizeValueMapEntry(o) {
1099
1117
  let O = { ...o };
1100
- "value_string" in o && (O.valueString = o.value_string), "valueString" in o && (O.valueString = o.valueString), "value_number" in o && (O.valueNumber = o.value_number), "valueNumber" in o && (O.valueNumber = o.valueNumber), "value_boolean" in o && (O.valueBoolean = o.value_boolean), "valueBoolean" in o && (O.valueBoolean = o.valueBoolean);
1118
+ if ("value_string" in o && (O.valueString = o.value_string), "valueString" in o && (O.valueString = o.valueString), "value_number" in o && (O.valueNumber = o.value_number), "valueNumber" in o && (O.valueNumber = o.valueNumber), "value_boolean" in o && (O.valueBoolean = o.value_boolean), "valueBoolean" in o && (O.valueBoolean = o.valueBoolean), !("key" in O) && "path" in o && (O.key = o.path), !("valueString" in O) && !("valueNumber" in O) && !("valueBoolean" in O) && "value" in o) {
1119
+ let M = o.value;
1120
+ typeof M == "string" ? O.valueString = M : typeof M == "number" ? O.valueNumber = M : typeof M == "boolean" && (O.valueBoolean = M);
1121
+ }
1101
1122
  let M = o.valueMap ?? o.value_map;
1102
- return M !== void 0 && (O.valueMap = this.normalizeValueMapArray(M)), delete O.value_string, delete O.value_number, delete O.value_boolean, delete O.value_map, typeof O.key != "string" && (O.key = String(O.key ?? "")), O;
1123
+ M !== void 0 && (O.valueMap = this.normalizeValueMapArray(M)), delete O.value_string, delete O.value_number, delete O.value_boolean, delete O.value_map, typeof O.key != "string" && (O.key = String(O.key ?? ""));
1124
+ let F = O.key;
1125
+ return F.startsWith("/") && (O.key = F.substring(1)), O;
1103
1126
  }
1104
1127
  isServerToClientMessage(o) {
1105
1128
  if (!o || typeof o != "object") return !1;
1106
- let O = o;
1107
- return "beginRendering" in O || "begin_rendering" in O || "surfaceUpdate" in O || "surface_update" in O || "dataModelUpdate" in O || "data_model_update" in O || "deleteSurface" in O || "delete_surface" in O;
1129
+ let O = o, M = O.content, F = typeof M == "object" && !!M && ("beginRendering" in M || "surfaceUpdate" in M);
1130
+ return "beginRendering" in O || "begin_rendering" in O || "surfaceUpdate" in O || "surface_update" in O || "dataModelUpdate" in O || "data_model_update" in O || "deleteSurface" in O || "delete_surface" in O || F;
1108
1131
  }
1109
1132
  normalizeServerMessage(o) {
1110
1133
  let O = o;
@@ -1144,9 +1167,32 @@ const styles$4 = i$1`
1144
1167
  O.push(this.normalizeServerMessage(M));
1145
1168
  continue;
1146
1169
  }
1170
+ if (M.role === "tool" && typeof M.content == "string") {
1171
+ try {
1172
+ let o = JSON.parse(M.content);
1173
+ if (o.role === "activity" && o.activity_type === "a2ui" && o.content) {
1174
+ let M = o.content;
1175
+ if (this.isServerToClientMessage(M)) O.push(this.normalizeServerMessage(M));
1176
+ else {
1177
+ let o = Array.isArray(M) ? M : [M];
1178
+ for (let M of o) this.isServerToClientMessage(M) && O.push(this.normalizeServerMessage(M));
1179
+ }
1180
+ }
1181
+ } catch {}
1182
+ continue;
1183
+ }
1184
+ let o = M;
1185
+ if (o.role === "activity" && o.activityType === "a2ui" && o.content) {
1186
+ if (this.isServerToClientMessage(o.content)) O.push(this.normalizeServerMessage(o.content));
1187
+ else {
1188
+ let M = o.content, F = Array.isArray(M) ? M : [M];
1189
+ for (let o of F) this.isServerToClientMessage(o) && O.push(this.normalizeServerMessage(o));
1190
+ }
1191
+ continue;
1192
+ }
1147
1193
  M.role === "assistant" && M.toolCalls && O.push(...this.mapMessage(M));
1148
1194
  }
1149
- if (O.length !== 0) return this.processor.processMessages(O);
1195
+ if (O.length !== 0) return console.log("A2UIService: Processing mapped messages:", JSON.stringify(O, null, 2)), this.processor.processMessages(O);
1150
1196
  }
1151
1197
  processMessage(o) {
1152
1198
  this.processMessages([o]);
@@ -1168,8 +1214,8 @@ const styles$4 = i$1`
1168
1214
  }
1169
1215
  }
1170
1216
  return o;
1171
- }).flat(), G = [...U, ...W];
1172
- console.log("A2UIService: Processing messages (fixed)", G), this.processor.processMessages(G);
1217
+ }).flat(), G = [...U, ...W].map((o) => this.normalizeServerMessage(o));
1218
+ console.log("A2UIService: Processing messages (fixed & normalized)", JSON.stringify(G, null, 2)), this.processor.processMessages(G);
1173
1219
  let K = Array.from(this.processor.getSurfaces().entries());
1174
1220
  console.log("A2UIService: Estado del procesador tras procesado:", K.map(([o, O]) => ({
1175
1221
  id: o,
@@ -1187,6 +1233,42 @@ const styles$4 = i$1`
1187
1233
  M && F.add(M);
1188
1234
  }), Array.from(F);
1189
1235
  }
1236
+ isBeginRenderingOnly(o) {
1237
+ let O = this.getA2UIPayloads(o);
1238
+ return O.length === 0 ? !1 : O.every((o) => {
1239
+ let O = !!o.beginRendering, M = !!o.surfaceUpdate || !!o.dataModelUpdate || !!o.deleteSurface;
1240
+ return O && !M;
1241
+ });
1242
+ }
1243
+ isA2UIMessage(o) {
1244
+ if (o.role === "activity" && o.activityType === "a2ui" || o.role === "assistant" && o.toolCalls && o.toolCalls.some((o) => o.function?.name.startsWith("a2ui_"))) return !0;
1245
+ if (o.role === "tool" && typeof o.content == "string") try {
1246
+ let O = JSON.parse(o.content);
1247
+ return O.role === "activity" && O.activity_type === "a2ui";
1248
+ } catch {
1249
+ return !1;
1250
+ }
1251
+ return !1;
1252
+ }
1253
+ getA2UIPayloads(o) {
1254
+ let O = [];
1255
+ if (o.role === "assistant" && o.toolCalls) O.push(...this.mapMessage(o));
1256
+ else if (o.role === "activity" && o.activityType === "a2ui" && o.content) {
1257
+ let M = o.content;
1258
+ (Array.isArray(M) ? M : [M]).forEach((o) => {
1259
+ this.isServerToClientMessage(o) && O.push(this.normalizeServerMessage(o));
1260
+ });
1261
+ } else if (o.role === "tool" && typeof o.content == "string") try {
1262
+ let M = JSON.parse(o.content);
1263
+ if (M.role === "activity" && M.activity_type === "a2ui" && M.content) {
1264
+ let o = M.content;
1265
+ (Array.isArray(o) ? o : [o]).forEach((o) => {
1266
+ this.isServerToClientMessage(o) && O.push(this.normalizeServerMessage(o));
1267
+ });
1268
+ }
1269
+ } catch {}
1270
+ return O;
1271
+ }
1190
1272
  }();
1191
1273
  var ChatMessage = class extends i {
1192
1274
  constructor(...o) {
@@ -1209,11 +1291,12 @@ var ChatMessage = class extends i {
1209
1291
  }
1210
1292
  render() {
1211
1293
  let o = this.message.role === "user";
1212
- if (this.message.role === "assistant" && Array.isArray(this.message.toolCalls) && this.message.toolCalls.length > 0) {
1294
+ if (a2uiService.isA2UIMessage(this.message)) {
1213
1295
  a2uiService.processMessages([this.message]);
1214
1296
  let o = Array.from(a2uiService.processor.getSurfaces().entries()), O = a2uiService.processor;
1215
1297
  if (o.length > 0) return b`
1216
1298
  <div class="message-container activity">
1299
+ ${this.agentAvatar ? b`<img src="${this.agentAvatar}" class="avatar-img" alt="AI">` : b`<div class="avatar">C</div>`}
1217
1300
  <div class="content-wrapper">
1218
1301
  ${o.map(([o, M]) => b`
1219
1302
  <a2ui-theme-provider
@@ -1264,7 +1347,7 @@ var ChatThread = class extends i {
1264
1347
  }
1265
1348
  static #e = this.styles = styles$4;
1266
1349
  updated(o) {
1267
- o.has("messages") && this.scrollToBottom();
1350
+ o.has("messages") && (a2uiService.processMessages(this.messages), this.scrollToBottom());
1268
1351
  }
1269
1352
  async scrollToBottom() {
1270
1353
  await this.updateComplete, (this.shadowRoot?.querySelector("agent-chat-message:last-of-type"))?.scrollIntoView({
@@ -1280,7 +1363,7 @@ var ChatThread = class extends i {
1280
1363
  </div>
1281
1364
  ` : b`
1282
1365
  <div class="messages-list">
1283
- ${this.messages.filter((o) => o.role === "assistant" || o.role === "user" || o.role === "activity").map((o, O, M) => b`
1366
+ ${this.messages.filter((o) => a2uiService.isA2UIMessage(o) ? (console.log("A2UIService: isA2UIMessage", o), !a2uiService.isBeginRenderingOnly(o)) : !0).map((o, O, M) => b`
1284
1367
  <agent-chat-message
1285
1368
  .message=${o}
1286
1369
  .isLast=${O === M.length - 1}
@@ -3055,9 +3138,18 @@ var ChatPortalService = class o extends EventTarget {
3055
3138
  this._visibleTargetIds = new Set(o), this.dispatchEvent(new CustomEvent("targets-updated", { detail: o }));
3056
3139
  }
3057
3140
  async executePlan(o) {
3058
- if (o.type === "click") {
3141
+ if (o.type === "plan") {
3142
+ let O = o.steps;
3143
+ console.log(`ChatPortalService: Executing multi-step plan with ${O.length} steps.`);
3144
+ for (let o of O) {
3145
+ let O = await this.executePlan(o);
3146
+ if (O.status === "error") return O;
3147
+ }
3148
+ return { status: "ok" };
3149
+ }
3150
+ if (o.type === "click" || o.type === "setValue") {
3059
3151
  let O = o.targetId;
3060
- if (console.log(`ChatPortalService: Waiting for click target "${O}"...`), !await this._waitForTarget(O)) return {
3152
+ if (console.log(`ChatPortalService: Waiting for target "${O}" for action "${o.type}"...`), !await this._waitForTarget(O)) return {
3061
3153
  status: "error",
3062
3154
  details: `Target "${O}" not found or not visible after timeout.`
3063
3155
  };
@@ -3090,13 +3182,13 @@ var ChatSubscriber = class {
3090
3182
  this.service = o;
3091
3183
  }
3092
3184
  onRunFinishedEvent(o) {
3093
- inspectorService.addEvent("onRunFinishedEvent", o.event);
3185
+ inspectorService.addEvent("onRunFinishedEvent", o.event), this.service.cleanupThinkingPlaceholder();
3094
3186
  }
3095
3187
  onRunStartedEvent(o) {
3096
3188
  inspectorService.addEvent("onRunStartedEvent", o.event), this.service.addPlaceholderMessage();
3097
3189
  }
3098
3190
  onRunErrorEvent(o) {
3099
- inspectorService.addEvent("onRunErrorEvent", o.event), console.error("ChatSubscriber: Run Error", o.event);
3191
+ inspectorService.addEvent("onRunErrorEvent", o.event), console.error("ChatSubscriber: Run Error", o.event), this.service.cleanupThinkingPlaceholder();
3100
3192
  }
3101
3193
  onStepStartedEvent(o) {
3102
3194
  inspectorService.addEvent("onStepStartedEvent", o.event);
@@ -3117,7 +3209,14 @@ var ChatSubscriber = class {
3117
3209
  }
3118
3210
  onMessagesSnapshotEvent(o) {
3119
3211
  inspectorService.addEvent("onMessagesSnapshotEvent", o.event);
3120
- let O = o.event.messages.map((o) => ({
3212
+ let O = o.event.messages.filter((o) => {
3213
+ if (o.role === "tool") return !1;
3214
+ if (o.role === "assistant" && o.toolCalls && o.toolCalls.length > 0) {
3215
+ let O = o.toolCalls.some((o) => o.function?.name?.startsWith("a2ui_")), M = typeof o.content == "string" && o.content.trim().length > 0;
3216
+ if (!O && !M) return !1;
3217
+ }
3218
+ return !0;
3219
+ }).map((o) => ({
3121
3220
  ...o,
3122
3221
  createdAt: o.createdAt || Date.now()
3123
3222
  }));
@@ -3153,6 +3252,21 @@ var ChatSubscriber = class {
3153
3252
  });
3154
3253
  console.log("ChatSubscriber: click_element result", O);
3155
3254
  }
3255
+ if (o.toolCallName === "set_value") {
3256
+ console.log("ChatSubscriber: Received set_value tool call", o.toolCallArgs);
3257
+ let O = await chatPortalService.executePlan({
3258
+ type: "setValue",
3259
+ targetId: o.toolCallArgs.target_id,
3260
+ value: o.toolCallArgs.value,
3261
+ reason: o.toolCallArgs.reason
3262
+ });
3263
+ console.log("ChatSubscriber: set_value result", O);
3264
+ }
3265
+ if (o.toolCallName === "execute_ui_plan" || o.toolCallName === "executePlan") {
3266
+ console.log("ChatSubscriber: Received UI plan tool call", o.toolCallArgs);
3267
+ let O = await chatPortalService.executePlan(o.toolCallArgs);
3268
+ console.log("ChatSubscriber: UI plan result", O);
3269
+ }
3156
3270
  }
3157
3271
  onToolCallResultEvent(o) {
3158
3272
  inspectorService.addEvent("onToolCallResultEvent", o.event);
@@ -3164,7 +3278,12 @@ var ChatSubscriber = class {
3164
3278
  inspectorService.addEvent("onStateDeltaEvent", o.event);
3165
3279
  }
3166
3280
  onActivitySnapshotEvent(o) {
3167
- inspectorService.addEvent("onActivitySnapshotEvent", o.event), o.event.activityType == "a2ui" && o.event.content.surfaceUpdate ? this.service.addA2UIMessage(o.event) : o.event.activityType == "a2ui" && o.event.content.beginRendering ? a2uiService.processMessages([o.event.content]) : (o.event.activityType == "navigation" || o.event.activityType == "click") && chatPortalService.executePlan(o.event.content);
3281
+ inspectorService.addEvent("onActivitySnapshotEvent", o.event), o.event.activityType === "a2ui" ? a2uiService.processSnapshot(o.event) : [
3282
+ "navigation",
3283
+ "click",
3284
+ "setValue",
3285
+ "plan"
3286
+ ].includes(o.event.activityType) && chatPortalService.executePlan(o.event.content);
3168
3287
  }
3169
3288
  onActivityDeltaEvent(o) {
3170
3289
  inspectorService.addEvent("onActivityDeltaEvent", o.event);
@@ -3361,12 +3480,9 @@ const chatService = new class extends EventTarget {
3361
3480
  };
3362
3481
  break;
3363
3482
  }
3364
- this.notify();
3483
+ this.agent.addMessage(U), this.notify();
3365
3484
  try {
3366
- this.agent?.threadId == threadIdPlaceHolder && await this._ensureConversation(), this.agent.addMessage(U), this.agent.state = {
3367
- appContext: this._appContext,
3368
- appState: this._appState
3369
- }, await this.agent.runAgent({ tools: [] }, this.subscriber);
3485
+ this.agent?.threadId == threadIdPlaceHolder && await this._ensureConversation(), this.agent.state = { appState: this._appState }, await this.agent.runAgent({ tools: [] }, this.subscriber);
3370
3486
  } catch (o) {
3371
3487
  console.error("Failed to send message", o);
3372
3488
  } finally {
@@ -3389,7 +3505,12 @@ const chatService = new class extends EventTarget {
3389
3505
  createdAt: Date.now(),
3390
3506
  isThinking: !0
3391
3507
  };
3392
- this.agent.messages = [...this.agent.messages, o], this.notify();
3508
+ this.agent.messages = [...this.agent.messages || [], o], this.notify();
3509
+ }
3510
+ cleanupThinkingPlaceholder() {
3511
+ if (!this.agent) return;
3512
+ let o = this.agent.messages.filter((o) => o.id !== "thinking-placeholder");
3513
+ o.length !== this.agent.messages.length && (this.agent.messages = o, this.notify());
3393
3514
  }
3394
3515
  prepareMessageForStreaming(o) {
3395
3516
  if (!this.agent) throw Error("Agent not initialized");
@@ -3429,7 +3550,10 @@ const chatService = new class extends EventTarget {
3429
3550
  this.agent.messages = [...F, M], this.notify();
3430
3551
  }
3431
3552
  async startNewThread() {
3432
- localStorage.removeItem(STORAGE_THREAD_ID_KEY), this.agent && (this.agent.threadId = threadIdPlaceHolder, this.agent.messages = [], this.agent.isRunning = !1), this._suggestedPrompts.length > 0 && (this._showPrompts = !0), this.notify();
3553
+ localStorage.removeItem(STORAGE_THREAD_ID_KEY), console.log("ChatService: startNewThread"), this.agent && (this.agent.threadId = threadIdPlaceHolder, this.agent.messages = [], this.agent.isRunning = !1), this._suggestedPrompts.length > 0 && (this._showPrompts = !0), this.notify();
3554
+ }
3555
+ async getConversations() {
3556
+ return await this.refreshConversations(), this._conversations;
3433
3557
  }
3434
3558
  async refreshConversations() {
3435
3559
  try {
@@ -3479,7 +3603,7 @@ var ChatController = class {
3479
3603
  return chatService.sendMessage(o, O);
3480
3604
  }
3481
3605
  startNewThread() {
3482
- return chatService.startNewThread();
3606
+ return console.log("Starting new thread"), chatService.startNewThread();
3483
3607
  }
3484
3608
  loadConversation(o) {
3485
3609
  return chatService.loadConversation(o);
@@ -3508,6 +3632,9 @@ var ChatController = class {
3508
3632
  refreshConversations() {
3509
3633
  return chatService.refreshConversations();
3510
3634
  }
3635
+ getConversations() {
3636
+ return chatService.getConversations();
3637
+ }
3511
3638
  }, FetchInterceptorService = class {
3512
3639
  constructor() {
3513
3640
  this.originalFetch = window.fetch.bind(window), this._isEnabled = !1;
@@ -3521,7 +3648,7 @@ var ChatController = class {
3521
3648
  window.fetch = async function(O, M) {
3522
3649
  try {
3523
3650
  let F = new Headers(M?.headers || {});
3524
- return F.has("Authorization") || F.append("Authorization", "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6InhmcDRfR0tObWNBMHl3UUNrZ1BXVkJjTHZmRDVfZXZKOWg3bUhGbExBVWMiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiIwZWZhNWFhNy04OWRiLTQ5MTYtYmZlNC0wNTM3MjhlZWY2M2QiLCJpc3MiOiJodHRwczovL3NrY290ZXN0LmIyY2xvZ2luLmNvbS8wZGI2ZGJjMy02OTA4LTQ1MTctYTdmMi04MWVhNjg1YTI1ZTIvdjIuMC8iLCJleHAiOjE3NjkxMjA3OTgsIm5iZiI6MTc2OTExOTg5OCwibmFtZSI6IlZpYW5hIFZlbGFzcXVleiwgSm9zZSBTdGV2ZW4iLCJpZHBfYWNjZXNzX3Rva2VuIjoiZXlKMGVYQWlPaUpLVjFRaUxDSnViMjVqWlNJNkltNTFURzV6ZVc1WFFYSTFOa2hNYTFCblRXMUViWFF0UW14YVVsWjBXRFV0TUdSbVlYVk1WRTgxY3pnaUxDSmhiR2NpT2lKU1V6STFOaUlzSW5nMWRDSTZJbEJqV0RrNFIxZzBNakJVTVZnMmMwSkVhM3BvVVcxeFozZE5WU0lzSW10cFpDSTZJbEJqV0RrNFIxZzBNakJVTVZnMmMwSkVhM3BvVVcxeFozZE5WU0o5LmV5SmhkV1FpT2lJd01EQXdNREF3TXkwd01EQXdMVEF3TURBdFl6QXdNQzB3TURBd01EQXdNREF3TURBaUxDSnBjM01pT2lKb2RIUndjem92TDNOMGN5NTNhVzVrYjNkekxtNWxkQzh3T0RJM01XWTBNaTA0TVdWbUxUUTFaRFl0T0RGaFl5MDBPVGMzTm1NMFltVTJNVFV2SWl3aWFXRjBJam94TnpZNU1EazNORGt5TENKdVltWWlPakUzTmprd09UYzBPVElzSW1WNGNDSTZNVGMyT1RFd01UZzRNU3dpWVdOamRDSTZNQ3dpWVdOeUlqb2lNU0lzSW1GamNuTWlPbHNpY0RFaVhTd2lZV2x2SWpvaVFXVlJRVWN2T0dKQlFVRkJUVTQ0YmpFdllqWk9kMVZTTmpGMFpGSlZXSGhNUzJOak5WQnNVREpyYUdvcmVEbDFlWFZXTkVGYU5WRjZUSEo1U0dSTlVVeGpOSHBpVFV0UE9GQTJXRGREVEZVd1luVjFUMGczTml0WlVIUTBOamx1Unk5Q1ZEVjZiMDF5WkRkbmFXTnlXVk12VW5ac1VYaHVTWHBETkc5bE9HMXFTSFUyUkdodmVUUm1RakJGWlcwNGVTdFdLMGhRVEdoSWRraElhVlZUVFdFMWRYRlhaRlJvVTJrNE1WVndlakZzYUUxWFJVaFlZMGhaUjFORGRESkhVR0puWVRoUFNtSjRaVEJNVm5kaFpWTm9MMVZPYkdkU1VHdEdURlZLWlZwWWFURkNVVFJzVldjNU1YSXdTM1ZIY1dNeGMxTkZaSEp4SzJoWlVtTlZNMWRNUkRJd1VqVTJSRVl2WkhkbU1WVjZUVVZqUkRFMlZVa3hZelpXVjBjdlQweElSRzFyUVRkUFMzTkVOMFpGWkZWVlZXdERSbEU5SWl3aVlXMXlJanBiSW5CM1pDSXNJbTFtWVNKZExDSmhjSEJmWkdsemNHeGhlVzVoYldVaU9pSkVZV3hwTFZCeVpDSXNJbUZ3Y0dsa0lqb2laR1prTURrNVlqQXRaV05pT1MwME0yVTFMV0kzWWpjdE5USTVObUk0TUdFME5qSXdJaXdpWVhCd2FXUmhZM0lpT2lJeElpd2labUZ0YVd4NVgyNWhiV1VpT2lKV2FXRnVZU0JXWld4aGMzRjFaWG9pTENKbmFYWmxibDl1WVcxbElqb2lTbTl6WlNCVGRHVjJaVzRpTENKcFpIUjVjQ0k2SW5WelpYSWlMQ0pwY0dGa1pISWlPaUl6T0M0NUxqSXlNQzR4TXpJaUxDSnVZVzFsSWpvaVZtbGhibUVnVm1Wc1lYTnhkV1Y2TENCS2IzTmxJRk4wWlhabGJpSXNJbTlwWkNJNkltVXdNbU0wTmpaakxXVTVaRGd0TkdGa01pMDVaVGhrTFdReFltUTJObUV6TkRNd01pSXNJbTl1Y0hKbGJWOXphV1FpT2lKVExURXROUzB5TVMweU5EZzVPVGM1T1RRd0xUSTFOVEl3TVRnM016RXRNVGN3TWpjeE9UTTFPUzB5TVRrNE1DSXNJbkJzWVhSbUlqb2lPQ0lzSW5CMWFXUWlPaUl4TURBek1qQXdNVUV4UWpCQ016azBJaXdpY21naU9pSXhMa0ZVVVVGUmFEaHVRMDh0UWpGclYwSnlSV3d6WWtWMmJVWlJUVUZCUVVGQlFVRkJRWGRCUVVGQlFVRkJRVUZDVVVGUmF6QkJRUzRpTENKelkzQWlPaUpOWVdsc0xsSmxZV1FnVFdGcGJDNVRaVzVrSUc5d1pXNXBaQ0J3Y205bWFXeGxJRlZ6WlhJdVVtVmhaQ0JsYldGcGJDSXNJbk5wWkNJNklqQXdNVEkxTnpaaExXTmhOVFF0TVdVeVl5MWlZbVEwTFdFNU4yVTBNekUzT1dNeE15SXNJbk5wWjI1cGJsOXpkR0YwWlNJNld5SnJiWE5wSWwwc0luTjFZaUk2SW5GaFNsbFhNelEzT0RWcFdFUktVbDlyYVZCa1NuSm5VWGhoVGs5d1RsaHRhVmhFV0dVM1NVTktaMWtpTENKMFpXNWhiblJmY21WbmFXOXVYM05qYjNCbElqb2lVMEVpTENKMGFXUWlPaUl3T0RJM01XWTBNaTA0TVdWbUxUUTFaRFl0T0RGaFl5MDBPVGMzTm1NMFltVTJNVFVpTENKMWJtbHhkV1ZmYm1GdFpTSTZJbXAyYVdGdVlVQnphMkZ1WkdsaExtTnZiUzVqYnlJc0luVndiaUk2SW1wMmFXRnVZVUJ6YTJGdVpHbGhMbU52YlM1amJ5SXNJblYwYVNJNkluSlVaMVpmZUVWTVJHdFBSMmx3Y210R01tZDVRVUVpTENKMlpYSWlPaUl4TGpBaUxDSjNhV1J6SWpwYkltSTNPV1ppWmpSa0xUTmxaamt0TkRZNE9TMDRNVFF6TFRjMllqRTVOR1U0TlRVd09TSmRMQ0o0YlhOZllXTmtJam94TnpVeU5UZzVNVEk0TENKNGJYTmZZV04wWDJaamRDSTZJak1nT1NJc0luaHRjMTltZEdRaU9pSXRkalJ3UW10NmRXRlFYMjVSUmpkVVZVWnlRVkZtYkdSNlIzTlpjRWxwT1dnMGFrdDZhbU5SVFZaQlFtUllUbXhaV0U0d1RGZFNlbUpZVFNJc0luaHRjMTlwWkhKbGJDSTZJakVnTWpBaUxDSjRiWE5mYzNRaU9uc2ljM1ZpSWpvaWMzUkNiazAzV25FME1td3hVa1l5ZEV0RU1GaEJVbVpoVGtOUlFXOW9WbTFmVUZWWFltSnJSbDlST0NKOUxDSjRiWE5mYzNWaVgyWmpkQ0k2SWpFd0lETWlMQ0o0YlhOZmRHTmtkQ0k2TVRNNU16WXdNek0wTVN3aWVHMXpYM1J1ZEY5bVkzUWlPaUkySURNaWZRLkEyZl9aRHNVcmp3UFh1NFVRMkYxN2tLNzVXTE1lN3lWX09YNHFKYk1zNTQxQmFmdk1GU3pOQnJILVJsR1FTdjEybjlrRm0yTGJ6bzdoMnJzR0JiRWsyOFQzdmtlTW95TVNPVFdfaldELUFHSVZOVVdaYnc3emVZWHVZYmEydUtfblR5cGpwQVNoV3hBNlJkMUV5QUhGZjVQakIxOTlYRGgySkp2bWJfZzVHazhJY2VEZ3QzcEVRRWF0QUdzZzVZRjN0ZlctLTdGT05EY3NTQjJjS2pMdXJwUl8tUG90LVF6TV9CaV9CeHhBZU1tNlAtb2JGRzB4WGRlRnFkUW9lS2pIVFEzN2EzeE9MMkZ2TFg4ZUhjN2x1SWstUkFBQnlmOXhhMnlxS0NkWGFiQkVSejRzeWhCRkpuMzdCeDc1cUlsZk1rQUlTX2NlemZZYndnSEJJWmZEZyIsInN1YiI6Ijg4MjBkNmI2LTcyNWItNDA0NC1hZGNiLWEzZTE4YTM4ZTRmYyIsImdpdmVuX25hbWUiOiJKb3NlIFN0ZXZlbiIsImZhbWlseV9uYW1lIjoiVmlhbmEgVmVsYXNxdWV6IiwiZW1haWwiOiJqdmlhbmFAc2thbmRpYS5jb20uY28iLCJub25jZSI6IjAxOWJlNjcyLTA4NWYtNzkxNi04MmZjLTk0MTA4OTRjODMyNSIsImF6cCI6IjBlZmE1YWE3LTg5ZGItNDkxNi1iZmU0LTA1MzcyOGVlZjYzZCIsInZlciI6IjEuMCIsImlhdCI6MTc2OTExOTg5OH0.TrBEO5lXpR34n7aA7J5LniTPw36mpwR51latCn7whw0s496hSXf7NJl-822mSGlmhShjQXiiIZCodQa-3nh2A4V1ecGDeCdqh_m-BCqlSsEO8LPEQ3-F-tm74J4iiO6NUm7FDQf3tK0jfxHlpFZJaP45T22389B3xVsPmnvDezHxsltOjtFJtv2sN2csF3CgNiJVvQv6xaX_cs7R4PpTxELCVOyUdjJ3NthE7kMKFvFQgz8Okq_buR7-O8ylRq35Ixxqp8He3nCJ3OWuZEj3xGLBCocGwlc8Vwt4_03Fu94UoU_XHmMD9RsjDA4nJY-o43Dkeldyj_1O5Deo7fhjtg"), o.originalFetch(O, {
3651
+ return F.has("Authorization") || F.append("Authorization", "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6InhmcDRfR0tObWNBMHl3UUNrZ1BXVkJjTHZmRDVfZXZKOWg3bUhGbExBVWMiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiIwZWZhNWFhNy04OWRiLTQ5MTYtYmZlNC0wNTM3MjhlZWY2M2QiLCJpc3MiOiJodHRwczovL3NrY290ZXN0LmIyY2xvZ2luLmNvbS8wZGI2ZGJjMy02OTA4LTQ1MTctYTdmMi04MWVhNjg1YTI1ZTIvdjIuMC8iLCJleHAiOjE3Njk3MTc5MjAsIm5iZiI6MTc2OTcxNzAyMCwibmFtZSI6IlZpYW5hIFZlbGFzcXVleiwgSm9zZSBTdGV2ZW4iLCJpZHBfYWNjZXNzX3Rva2VuIjoiZXlKMGVYQWlPaUpLVjFRaUxDSnViMjVqWlNJNkltdDVZM2h1ZGs5TlRtOVJZblpuU2psd1JuTnVMVGs0V1VsQlJVSjNjM1U0VTJjMmIzUmxjVjh3UldjaUxDSmhiR2NpT2lKU1V6STFOaUlzSW5nMWRDSTZJbEJqV0RrNFIxZzBNakJVTVZnMmMwSkVhM3BvVVcxeFozZE5WU0lzSW10cFpDSTZJbEJqV0RrNFIxZzBNakJVTVZnMmMwSkVhM3BvVVcxeFozZE5WU0o5LmV5SmhkV1FpT2lJd01EQXdNREF3TXkwd01EQXdMVEF3TURBdFl6QXdNQzB3TURBd01EQXdNREF3TURBaUxDSnBjM01pT2lKb2RIUndjem92TDNOMGN5NTNhVzVrYjNkekxtNWxkQzh3T0RJM01XWTBNaTA0TVdWbUxUUTFaRFl0T0RGaFl5MDBPVGMzTm1NMFltVTJNVFV2SWl3aWFXRjBJam94TnpZNU5qazFORFkwTENKdVltWWlPakUzTmprMk9UVTBOalFzSW1WNGNDSTZNVGMyT1RZNU9UZ3hPU3dpWVdOamRDSTZNQ3dpWVdOeUlqb2lNU0lzSW1GamNuTWlPbHNpY0RFaVhTd2lZV2x2SWpvaVFWcFJRV0V2T0dKQlFVRkJURWcxV0U1bFVrNXVTMDFxTm1WNlNHb3hjbUZYVWtzNGFqQTBTMGRLVVZVek5tdE9jamR3TldNMFdFNWxlbEpqWlc1WFUzazFWbUppVFdWUlp6UnVVRXBtVGtwS2JtWkNkVEJQZDIxSmRtbFhWazEwZEhGMUswVjVSR3BEWWxBNFppOXlVMUI2YVZCUUsyeEZZbEpYYXk5RGJUWXdkRzFHWldwUVoxQmhNamh0ZWtabWJtNUdjVzVhUzJGNFQwZFNMM2wwWkZOMGVVaFJLMkk1Um01emVqQlNUbmRKV2xGS2VqTnViVzEzVWpWUFlUVjZjV1pWVVRWVVJYaFhTekY2SWl3aVlXMXlJanBiSW5CM1pDSXNJbTFtWVNKZExDSmhjSEJmWkdsemNHeGhlVzVoYldVaU9pSkVZV3hwTFZCeVpDSXNJbUZ3Y0dsa0lqb2laR1prTURrNVlqQXRaV05pT1MwME0yVTFMV0kzWWpjdE5USTVObUk0TUdFME5qSXdJaXdpWVhCd2FXUmhZM0lpT2lJeElpd2labUZ0YVd4NVgyNWhiV1VpT2lKV2FXRnVZU0JXWld4aGMzRjFaWG9pTENKbmFYWmxibDl1WVcxbElqb2lTbTl6WlNCVGRHVjJaVzRpTENKcFpIUjVjQ0k2SW5WelpYSWlMQ0pwY0dGa1pISWlPaUl6T0M0NUxqSXlNQzR4TXpJaUxDSnVZVzFsSWpvaVZtbGhibUVnVm1Wc1lYTnhkV1Y2TENCS2IzTmxJRk4wWlhabGJpSXNJbTlwWkNJNkltVXdNbU0wTmpaakxXVTVaRGd0TkdGa01pMDVaVGhrTFdReFltUTJObUV6TkRNd01pSXNJbTl1Y0hKbGJWOXphV1FpT2lKVExURXROUzB5TVMweU5EZzVPVGM1T1RRd0xUSTFOVEl3TVRnM016RXRNVGN3TWpjeE9UTTFPUzB5TVRrNE1DSXNJbkJzWVhSbUlqb2lPQ0lzSW5CMWFXUWlPaUl4TURBek1qQXdNVUV4UWpCQ016azBJaXdpY21naU9pSXhMa0ZVVVVGUmFEaHVRMDh0UWpGclYwSnlSV3d6WWtWMmJVWlJUVUZCUVVGQlFVRkJRWGRCUVVGQlFVRkJRVUZDVVVGUmF6QkJRUzRpTENKelkzQWlPaUpOWVdsc0xsSmxZV1FnVFdGcGJDNVRaVzVrSUc5d1pXNXBaQ0J3Y205bWFXeGxJRlZ6WlhJdVVtVmhaQ0JsYldGcGJDSXNJbk5wWkNJNklqQXdNVE0yT0dSaExUTTVORFV0WkdSaU55MW1ZVGd6TFRjek16ZzFNVGMxTnpZNU1DSXNJbk5wWjI1cGJsOXpkR0YwWlNJNld5SnJiWE5wSWwwc0luTjFZaUk2SW5GaFNsbFhNelEzT0RWcFdFUktVbDlyYVZCa1NuSm5VWGhoVGs5d1RsaHRhVmhFV0dVM1NVTktaMWtpTENKMFpXNWhiblJmY21WbmFXOXVYM05qYjNCbElqb2lVMEVpTENKMGFXUWlPaUl3T0RJM01XWTBNaTA0TVdWbUxUUTFaRFl0T0RGaFl5MDBPVGMzTm1NMFltVTJNVFVpTENKMWJtbHhkV1ZmYm1GdFpTSTZJbXAyYVdGdVlVQnphMkZ1WkdsaExtTnZiUzVqYnlJc0luVndiaUk2SW1wMmFXRnVZVUJ6YTJGdVpHbGhMbU52YlM1amJ5SXNJblYwYVNJNklrMUlWVnAzTjJSRmJHc3RkRkZGZEcxMmJGVlBRVUVpTENKMlpYSWlPaUl4TGpBaUxDSjNhV1J6SWpwYkltSTNPV1ppWmpSa0xUTmxaamt0TkRZNE9TMDRNVFF6TFRjMllqRTVOR1U0TlRVd09TSmRMQ0o0YlhOZllXTmtJam94TnpVeU5UZzVNVEk0TENKNGJYTmZZV04wWDJaamRDSTZJak1nT1NJc0luaHRjMTltZEdRaU9pSk1halZqUjJ3Mk5YZzNXREJqTWtkMGJtcE5VbXBpY0VRd1IzVmlNbFJRWkZGRVoyRjRSV1JQT0VGSlFtUllUbnBpTTFZd1lVTXhhMk15TVhvaUxDSjRiWE5mYVdSeVpXd2lPaUl4TUNBeElpd2llRzF6WDNOMElqcDdJbk4xWWlJNkluTjBRbTVOTjFweE5ESnNNVkpHTW5STFJEQllRVkptWVU1RFVVRnZhRlp0WDFCVlYySmlhMFpmVVRnaWZTd2llRzF6WDNOMVlsOW1ZM1FpT2lJeklERTRJaXdpZUcxelgzUmpaSFFpT2pFek9UTTJNRE16TkRFc0luaHRjMTkwYm5SZlptTjBJam9pTXlBNEluMC5mSU1udzdwOTlvNzNxY2QtVW9DZ1ZFRVotODI2cTNZNVZaMG1DYWVrdW9pNnR3SmpUdHQyY0JyVFJqQ3ZadE5JOF9FNFNGY0hZQ3hSTm9pY1MzUkd4aGwwdFNvRndCaHNwUDFpREg0SHNrRjFkVWRTTi1XNmNIZDJKMnJFc19GLTJsQkNaR0Z4dTdkTEFpdXR4b2t1amlIUE96MS12MDRfOS01ZWswUUVITVUtcEVfNHlabnNWVERfaFc4ZC04UUVEOVNlN0dWRFFWcUZac1RSMDRSRlFGSGhuN19Sd0hwc2ptYWp1LUFVUlpaVy1KZEpzM1hHT1Flam41NTZMSUpJT01WdzN4T0wtSkVaQlQxRTlKR3NyTjFFSVhJbGJzOVUtNHZfT21JQURZVXlFWnBzV3pIeXpMTHRxUFFjRDhvTEpLZUFYYU1Kbml0czlHVjY0NFBIUUEiLCJzdWIiOiI4ODIwZDZiNi03MjViLTQwNDQtYWRjYi1hM2UxOGEzOGU0ZmMiLCJnaXZlbl9uYW1lIjoiSm9zZSBTdGV2ZW4iLCJmYW1pbHlfbmFtZSI6IlZpYW5hIFZlbGFzcXVleiIsImVtYWlsIjoianZpYW5hQHNrYW5kaWEuY29tLmNvIiwibm9uY2UiOiIwMTljMGExNi01ZGQ0LTdiNTktYjlkOS00MTBhOGRjMzdjM2YiLCJhenAiOiIwZWZhNWFhNy04OWRiLTQ5MTYtYmZlNC0wNTM3MjhlZWY2M2QiLCJ2ZXIiOiIxLjAiLCJpYXQiOjE3Njk3MTcwMjB9.nfO771YIggoRk1Q6VrhEhGL8hSgu_O6_yLgp9MHwPbb2oUuUlclKXq1xdstjs7ERBi8mQtqlmEb2b0JCM5BV-2WIe41RlIErQgACBdoFUPLnBWnOLnffl6Y-Ce88WjoRfSAtj6GUn09aD53ocUkU_t4ca2ozpcpQGgrJxx2QxZpRp7uTB0Wxdt5KzLTpc05JpJe4AdKxLImrKgqMaR2R2IRn8zhZmlLQR2TfEPqPW-tbCVLdWLn2XJx6mWtcKtgCC0O9fNz2WeyyOnxLFV9pEjWm93cUXX9VEBhwmyKD0vReU9fnUwJqL3s09hg3hUMptZr4FjrJsXaoxaxbZhitrg"), o.originalFetch(O, {
3525
3652
  ...M,
3526
3653
  headers: F
3527
3654
  });
@@ -3547,7 +3674,15 @@ var AgentChat = class extends i {
3547
3674
  this.dispatchEvent(new CustomEvent("controller-ready", { detail: this._chatController }));
3548
3675
  }
3549
3676
  connectedCallback() {
3550
- super.connectedCallback(), this.addEventListener("a2uiaction", this._handleA2UIAction);
3677
+ super.connectedCallback(), this._injectFonts(), this.addEventListener("a2uiaction", this._handleA2UIAction);
3678
+ }
3679
+ _injectFonts() {
3680
+ ["https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200", "https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200"].forEach((o) => {
3681
+ if (!document.querySelector(`link[href="${o}"]`)) {
3682
+ let O = document.createElement("link");
3683
+ O.rel = "stylesheet", O.href = o, document.head.appendChild(O);
3684
+ }
3685
+ });
3551
3686
  }
3552
3687
  disconnectedCallback() {
3553
3688
  this.removeEventListener("a2uiaction", this._handleA2UIAction), super.disconnectedCallback();
@@ -3645,29 +3780,30 @@ var AgentChat = class extends i {
3645
3780
  this.setAppContext(o.detail);
3646
3781
  }
3647
3782
  _handleA2UIAction(o) {
3648
- let { action: O } = o.detail;
3649
- if (O) {
3650
- if (console.log("AgentChat: A2UI Action received:", O), O.name === "decision") {
3651
- this._handleAuthDecision(O);
3652
- return;
3653
- }
3654
- this._handleGenericUrlAction(O);
3783
+ let { action: O, surfaceId: M } = o.detail;
3784
+ if (!O) return;
3785
+ console.log("AgentChat: A2UI Action received:", O, "Surface:", M);
3786
+ let F = M || Array.from(a2uiService.processor.getSurfaces().keys())[0] || "root";
3787
+ if (O.name === "decision") {
3788
+ this._handleAuthDecision(O, F);
3789
+ return;
3655
3790
  }
3791
+ this._handleGenericUrlAction(O, F);
3656
3792
  }
3657
- _handleAuthDecision(o) {
3658
- let O = o.context || [], M = O.find((o) => o.key === "userDecision")?.value?.literalString, F = O.find((o) => [
3793
+ _handleAuthDecision(o, O) {
3794
+ let M = o.context || [], F = M.find((o) => o.key === "userDecision"), U = a2uiService.resolveValue(O, F?.value), W = M.find((o) => [
3659
3795
  "url",
3660
3796
  "href",
3661
3797
  "link",
3662
3798
  "uri"
3663
- ].includes(o.key?.toLowerCase()))?.value?.literalString;
3664
- if (console.log(`AgentChat: Specialized decision handler: ${M}`, o), M === "deny") {
3799
+ ].includes(o.key?.toLowerCase())), G = a2uiService.resolveValue(O, W?.value);
3800
+ if (console.log(`AgentChat: Specialized decision handler: ${U}`, o), U === "deny") {
3665
3801
  console.log("AgentChat: User denied the request."), this._chatController.sendMessage(`User selected "Deny" for action "${o.name}".`, "tool");
3666
3802
  return;
3667
3803
  }
3668
- if (M === "approve") if (F) {
3669
- console.log(`AgentChat: User selected "Approve". Opening auth URL: ${F}`);
3670
- let O = window.open(F, "_blank");
3804
+ if (U === "approve") if (G) {
3805
+ console.log(`AgentChat: User selected "Approve". Opening auth URL: ${G}`);
3806
+ let O = window.open(G, "_blank");
3671
3807
  if (O) {
3672
3808
  let M = setInterval(() => {
3673
3809
  O.closed && (clearInterval(M), console.log("AgentChat: Auth tab closed. Notifying approval."), this._chatController.sendMessage(`User approved the request "${o.name}" and completed authentication.`, "tool"));
@@ -3675,14 +3811,14 @@ var AgentChat = class extends i {
3675
3811
  } else console.error("AgentChat: Failed to open auth tab.");
3676
3812
  } else console.log("AgentChat: User approved (no URL provided)."), this._chatController.sendMessage(`User selected "Approve" for action "${o.name}".`, "tool");
3677
3813
  }
3678
- _handleGenericUrlAction(o) {
3679
- let O = o.context?.find((o) => [
3814
+ _handleGenericUrlAction(o, O) {
3815
+ let M = o.context?.find((o) => [
3680
3816
  "url",
3681
3817
  "href",
3682
3818
  "link",
3683
3819
  "uri"
3684
- ].includes(o.key?.toLowerCase())), M = O?.value?.literalString || O?.value?.path;
3685
- M ? (console.log(`AgentChat: Opening generic URL: ${M}`), window.open(M, "_blank")) : console.warn("AgentChat: A2UI Action received without recognizable purpose:", o);
3820
+ ].includes(o.key?.toLowerCase())), F = a2uiService.resolveValue(O, M?.value);
3821
+ F ? (console.log(`AgentChat: Opening generic URL: ${F}`), window.open(F, "_blank")) : o.name === "openLink" ? console.warn("AgentChat: openLink action received but no URL could be resolved:", o) : console.warn("AgentChat: A2UI Action received without recognizable purpose:", o);
3686
3822
  }
3687
3823
  _handleStateUpdate(o) {
3688
3824
  this.setAppState(o.detail);