@genesislcap/ai-assistant 14.459.0 → 14.461.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.
@@ -3454,7 +3454,7 @@
3454
3454
  {
3455
3455
  "kind": "Method",
3456
3456
  "canonicalReference": "@genesislcap/ai-assistant!ChatDriver#requestInteraction:member(1)",
3457
- "docComment": "/**\n * Request a custom UI interaction. Emits a new message with the interaction. Tool handlers can call this to pause execution until the user completes the UI interaction.\n *\n * If a host requester is wired (sub-agent case), the call delegates upward so the interaction lives on the parent — the main UI is only listening to the root driver. Only one interaction may be in flight at any time on a given root: concurrent calls (e.g. two parallel sub-agents both spawning a widget) throw. Parallel sub-agents are for parallel work, not for user interaction, which is inherently sequential.\n *\n * @param componentName - The custom element name to render.\n *\n * @param data - Data to pass to the component.\n *\n * @param options - Optional per-call overrides, including `chatInputDuringExecution` to hide or disable the main chat input while the widget is awaiting user input. Reverts when the interaction resolves.\n */\n",
3457
+ "docComment": "/**\n * Request a custom UI interaction. Emits a new message with the interaction. Tool handlers can call this to pause execution until the user completes the UI interaction.\n *\n * If a host requester is wired (sub-agent case), the call delegates upward so the interaction lives on the parent — the main UI is only listening to the root driver. Only one interaction may be in flight at any time on a given root: concurrent calls (e.g. two parallel sub-agents both spawning a widget) throw. Parallel sub-agents are for parallel work, not for user interaction, which is inherently sequential.\n *\n * @param componentName - The custom element name to render.\n *\n * @param data - Data to pass to the component.\n *\n * @param options - Optional per-call overrides, including `chatInputDuringExecution` to hide or disable the main chat input while the widget is awaiting user input (reverts when the interaction resolves), and `presentation` to control whether the host wraps the widget in a chat bubble and/or shows the \"Assistant\" label.\n */\n",
3458
3458
  "excerptTokens": [
3459
3459
  {
3460
3460
  "kind": "Content",
@@ -967,7 +967,9 @@ export declare class ChatDriver extends EventTarget implements AiDriver {
967
967
  * @param data - Data to pass to the component.
968
968
  * @param options - Optional per-call overrides, including
969
969
  * `chatInputDuringExecution` to hide or disable the main chat input while
970
- * the widget is awaiting user input. Reverts when the interaction resolves.
970
+ * the widget is awaiting user input (reverts when the interaction resolves),
971
+ * and `presentation` to control whether the host wraps the widget in a chat
972
+ * bubble and/or shows the "Assistant" label.
971
973
  */
972
974
  requestInteraction<T>(componentName: string, data: any, options?: InteractionRequestOptions): Promise<T>;
973
975
  /**
@@ -411,7 +411,9 @@ export declare class ChatDriver extends EventTarget implements AiDriver {
411
411
  * @param data - Data to pass to the component.
412
412
  * @param options - Optional per-call overrides, including
413
413
  * `chatInputDuringExecution` to hide or disable the main chat input while
414
- * the widget is awaiting user input. Reverts when the interaction resolves.
414
+ * the widget is awaiting user input (reverts when the interaction resolves),
415
+ * and `presentation` to control whether the host wraps the widget in a chat
416
+ * bubble and/or shows the "Assistant" label.
415
417
  */
416
418
  requestInteraction<T>(componentName: string, data: any, options?: InteractionRequestOptions): Promise<T>;
417
419
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"chat-driver.d.ts","sourceRoot":"","sources":["../../../../src/components/chat-driver/chat-driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-driver.d.ts","sourceRoot":"","sources":["../../../../src/components/chat-driver/chat-driver.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"main.styles.d.ts","sourceRoot":"","sources":["../../../src/main/main.styles.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,MAAM,iDAy2BlB,CAAC"}
1
+ {"version":3,"file":"main.styles.d.ts","sourceRoot":"","sources":["../../../src/main/main.styles.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,MAAM,iDA83BlB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"main.template.d.ts","sourceRoot":"","sources":["../../../src/main/main.template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AASH,OAAO,EAAuC,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AA2MpD,gBAAgB;AAChB,eAAO,MAAM,6BAA6B,GACxC,oBAAoB,MAAM,KACzB,YAAY,CAAC,qBAAqB,CAijBpC,CAAC"}
1
+ {"version":3,"file":"main.template.d.ts","sourceRoot":"","sources":["../../../src/main/main.template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,OAAO,EAAuC,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAmNpD,gBAAgB;AAChB,eAAO,MAAM,6BAA6B,GACxC,oBAAoB,MAAM,KACzB,YAAY,CAAC,qBAAqB,CA2jBpC,CAAC"}
@@ -628,7 +628,9 @@ export class ChatDriver extends EventTarget {
628
628
  * @param data - Data to pass to the component.
629
629
  * @param options - Optional per-call overrides, including
630
630
  * `chatInputDuringExecution` to hide or disable the main chat input while
631
- * the widget is awaiting user input. Reverts when the interaction resolves.
631
+ * the widget is awaiting user input (reverts when the interaction resolves),
632
+ * and `presentation` to control whether the host wraps the widget in a chat
633
+ * bubble and/or shows the "Assistant" label.
632
634
  */
633
635
  requestInteraction(componentName, data, options) {
634
636
  return __awaiter(this, void 0, void 0, function* () {
@@ -643,6 +645,7 @@ export class ChatDriver extends EventTarget {
643
645
  const interactionId = crypto.randomUUID();
644
646
  const chatInputDuringExecution = options === null || options === void 0 ? void 0 : options.chatInputDuringExecution;
645
647
  const timeoutMs = options === null || options === void 0 ? void 0 : options.timeoutMs;
648
+ const presentation = options === null || options === void 0 ? void 0 : options.presentation;
646
649
  return new Promise((resolve, reject) => {
647
650
  this.pendingInteractions.set(interactionId, {
648
651
  resolve,
@@ -674,7 +677,9 @@ export class ChatDriver extends EventTarget {
674
677
  this.appendToHistory({
675
678
  role: 'assistant',
676
679
  content: '',
677
- interaction: { interactionId, componentName, data },
680
+ interaction: Object.assign({ interactionId,
681
+ componentName,
682
+ data }, (presentation ? { presentation } : {})),
678
683
  });
679
684
  });
680
685
  });
@@ -779,6 +779,30 @@ syntheticUser('omitted or whitespace-only userMessage appends no synthetic-user
779
779
  }));
780
780
  syntheticUser.run();
781
781
  // ---------------------------------------------------------------------------
782
+ // interaction presentation — the per-call `presentation` option is stamped
783
+ // onto the appended interaction so the renderer can frame the widget, and is
784
+ // absent (the historical default) when the option is omitted.
785
+ // ---------------------------------------------------------------------------
786
+ const interactionPresentation = createLogicSuite('ChatDriver interaction presentation');
787
+ interactionPresentation('presentation option is stamped onto the appended interaction', () => __awaiter(void 0, void 0, void 0, function* () {
788
+ const driver = makeDriver(agent({ name: 'a' }), scriptedProvider([]));
789
+ const pending = driver.requestInteraction('w', {}, { presentation: 'bubble' });
790
+ const interaction = driver.getHistory().at(-1).interaction;
791
+ assert.is(interaction.presentation, 'bubble');
792
+ // Clean up the pending interaction so it does not dangle.
793
+ driver.resolveInteraction(interaction.interactionId, { status: 'approved' });
794
+ yield pending;
795
+ }));
796
+ interactionPresentation('presentation is absent when the option is omitted', () => __awaiter(void 0, void 0, void 0, function* () {
797
+ const driver = makeDriver(agent({ name: 'a' }), scriptedProvider([]));
798
+ const pending = driver.requestInteraction('w', {});
799
+ const interaction = driver.getHistory().at(-1).interaction;
800
+ assert.ok(!('presentation' in interaction));
801
+ driver.resolveInteraction(interaction.interactionId, { status: 'approved' });
802
+ yield pending;
803
+ }));
804
+ interactionPresentation.run();
805
+ // ---------------------------------------------------------------------------
782
806
  // interaction timeout — requestInteraction({ timeoutMs }) resolves with a
783
807
  // status:'timeout' result (never rejects) and closes the widget read-only.
784
808
  // ---------------------------------------------------------------------------
@@ -427,6 +427,13 @@ export const styles = css `
427
427
  animation: slide-in-left 0.25s ease-out;
428
428
  }
429
429
 
430
+ /* A 'bubble' interaction reads like a normal assistant message: avatar to the
431
+ left, bubble to the right — not the full-width column the other interaction
432
+ presentations use. */
433
+ .message-row.interaction.present-bubble {
434
+ flex-direction: row;
435
+ }
436
+
430
437
  .avatar {
431
438
  position: relative;
432
439
  width: 32px;
@@ -535,7 +542,10 @@ export const styles = css `
535
542
  border: 1px solid color-mix(in srgb, var(--ai-function-color, #86efac) 20%, transparent);
536
543
  }
537
544
 
538
- .message.interaction {
545
+ /* 'label' (default) and 'bare' interactions render the widget chrome-free and
546
+ full-width — the widget owns its body. */
547
+ .message-row.interaction.present-label .message,
548
+ .message-row.interaction.present-bare .message {
539
549
  background: none;
540
550
  border: none;
541
551
  padding: 0;
@@ -543,6 +553,17 @@ export const styles = css `
543
553
  width: 100%;
544
554
  }
545
555
 
556
+ /* 'bubble' interactions reuse the standard assistant-message skin so the
557
+ widget sits inside a normal chat bubble. Padding, max-width and min-width
558
+ come from the base .message rule. */
559
+ .message-row.interaction.present-bubble .message {
560
+ background: linear-gradient(135deg, var(--neutral-layer-3) 0%, var(--neutral-layer-4) 100%);
561
+ color: var(--neutral-foreground-rest);
562
+ border-radius: 4px 18px 18px;
563
+ border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-rest);
564
+ box-shadow: var(--ai-message-shadow, 0 2px 8px rgb(0 0 0 / 15%));
565
+ }
566
+
546
567
  .sender {
547
568
  font-weight: bold;
548
569
  font-size: 0.9em;
@@ -100,6 +100,12 @@ const senderLabel = {
100
100
  interaction: 'Assistant',
101
101
  ai: 'Assistant',
102
102
  };
103
+ /**
104
+ * Resolves how the host frames an interaction widget, defaulting to `'label'`
105
+ * (the historical "Assistant" label, no bubble). Callers guard on
106
+ * `m.interaction` first; non-interaction messages never consult this.
107
+ */
108
+ const interactionPresentation = (m) => { var _a, _b; return (_b = (_a = m.interaction) === null || _a === void 0 ? void 0 : _a.presentation) !== null && _b !== void 0 ? _b : 'label'; };
103
109
  // ─── Sub-agent trace fragments ────────────────────────────────────────────────
104
110
  const subAgentAssistantTemplate = html `
105
111
  <div class="sub-agent-message sub-agent-assistant">${(m) => m.content}</div>
@@ -218,7 +224,9 @@ ${(tc) => { var _a; return (((_a = tc.foldPath) === null || _a === void 0 ? void
218
224
  </div>
219
225
  `)}
220
226
  ${when((m) => m.role !== 'system-event', html `
221
- <div class="message-row ${(m) => messageType(m)}">
227
+ <div
228
+ class="message-row ${(m) => messageType(m)} ${(m) => m.interaction ? `present-${interactionPresentation(m)}` : ''}"
229
+ >
222
230
  <div class="avatar ${(m) => messageType(m)}">
223
231
  ${when(
224
232
  // Keyed on messageType (not raw role) so a synthetic-user message,
@@ -227,8 +235,12 @@ ${(tc) => { var _a; return (((_a = tc.foldPath) === null || _a === void 0 ? void
227
235
  (m) => messageType(m) === 'user', userAvatarTemplate)}${when((m) => messageType(m) !== 'user', assistantAvatarTemplate)}
228
236
  </div>
229
237
  <div class="message ${(m) => messageType(m)}">
230
- <div class="sender">
231
- ${(m, c) => {
238
+ ${when(
239
+ // A 'bare' interaction owns its full presentation — suppress the
240
+ // host sender label. Every other message keeps it.
241
+ (m) => !(m.interaction && interactionPresentation(m) === 'bare'), html `
242
+ <div class="sender">
243
+ ${(m, c) => {
232
244
  var _a;
233
245
  return messageType(m) === 'ai-function' &&
234
246
  m.agentName &&
@@ -236,7 +248,8 @@ ${(tc) => { var _a; return (((_a = tc.foldPath) === null || _a === void 0 ? void
236
248
  ? `Tool Call · ${(_a = m.agentLabel) !== null && _a !== void 0 ? _a : m.agentName}`
237
249
  : senderLabel[messageType(m)];
238
250
  }}
239
- </div>
251
+ </div>
252
+ `)}
240
253
  <div class="content">
241
254
  ${when((m) => m.content, html `
242
255
  <ai-chat-markdown :content="${(m) => m.content}"></ai-chat-markdown>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genesislcap/ai-assistant",
3
3
  "description": "Genesis AI Assistant micro-frontend",
4
- "version": "14.459.0",
4
+ "version": "14.461.0",
5
5
  "license": "SEE LICENSE IN license.txt",
6
6
  "main": "dist/esm/index.js",
7
7
  "types": "dist/ai-assistant.d.ts",
@@ -64,24 +64,24 @@
64
64
  }
65
65
  },
66
66
  "devDependencies": {
67
- "@genesislcap/foundation-testing": "14.459.0",
68
- "@genesislcap/genx": "14.459.0",
69
- "@genesislcap/rollup-builder": "14.459.0",
70
- "@genesislcap/ts-builder": "14.459.0",
71
- "@genesislcap/uvu-playwright-builder": "14.459.0",
72
- "@genesislcap/vite-builder": "14.459.0",
73
- "@genesislcap/webpack-builder": "14.459.0",
67
+ "@genesislcap/foundation-testing": "14.461.0",
68
+ "@genesislcap/genx": "14.461.0",
69
+ "@genesislcap/rollup-builder": "14.461.0",
70
+ "@genesislcap/ts-builder": "14.461.0",
71
+ "@genesislcap/uvu-playwright-builder": "14.461.0",
72
+ "@genesislcap/vite-builder": "14.461.0",
73
+ "@genesislcap/webpack-builder": "14.461.0",
74
74
  "@types/dompurify": "^3.0.5",
75
75
  "@types/marked": "^5.0.2"
76
76
  },
77
77
  "dependencies": {
78
- "@genesislcap/foundation-ai": "14.459.0",
79
- "@genesislcap/foundation-logger": "14.459.0",
80
- "@genesislcap/foundation-redux": "14.459.0",
81
- "@genesislcap/foundation-ui": "14.459.0",
82
- "@genesislcap/foundation-utils": "14.459.0",
83
- "@genesislcap/rapid-design-system": "14.459.0",
84
- "@genesislcap/web-core": "14.459.0",
78
+ "@genesislcap/foundation-ai": "14.461.0",
79
+ "@genesislcap/foundation-logger": "14.461.0",
80
+ "@genesislcap/foundation-redux": "14.461.0",
81
+ "@genesislcap/foundation-ui": "14.461.0",
82
+ "@genesislcap/foundation-utils": "14.461.0",
83
+ "@genesislcap/rapid-design-system": "14.461.0",
84
+ "@genesislcap/web-core": "14.461.0",
85
85
  "dompurify": "^3.3.1",
86
86
  "marked": "^17.0.3"
87
87
  },
@@ -93,5 +93,5 @@
93
93
  "publishConfig": {
94
94
  "access": "public"
95
95
  },
96
- "gitHead": "b501804b11ff99945c7c6d2afbe7a101e1bb735a"
96
+ "gitHead": "d87c27bf9e91f6f5d1cf51992e7892df9434c9be"
97
97
  }
@@ -1058,6 +1058,42 @@ syntheticUser(
1058
1058
 
1059
1059
  syntheticUser.run();
1060
1060
 
1061
+ // ---------------------------------------------------------------------------
1062
+ // interaction presentation — the per-call `presentation` option is stamped
1063
+ // onto the appended interaction so the renderer can frame the widget, and is
1064
+ // absent (the historical default) when the option is omitted.
1065
+ // ---------------------------------------------------------------------------
1066
+
1067
+ const interactionPresentation = createLogicSuite('ChatDriver interaction presentation');
1068
+
1069
+ interactionPresentation(
1070
+ 'presentation option is stamped onto the appended interaction',
1071
+ async () => {
1072
+ const driver = makeDriver(agent({ name: 'a' }), scriptedProvider([]));
1073
+
1074
+ const pending = driver.requestInteraction('w', {}, { presentation: 'bubble' });
1075
+ const interaction = driver.getHistory().at(-1)!.interaction!;
1076
+ assert.is(interaction.presentation, 'bubble');
1077
+
1078
+ // Clean up the pending interaction so it does not dangle.
1079
+ driver.resolveInteraction(interaction.interactionId, { status: 'approved' });
1080
+ await pending;
1081
+ },
1082
+ );
1083
+
1084
+ interactionPresentation('presentation is absent when the option is omitted', async () => {
1085
+ const driver = makeDriver(agent({ name: 'a' }), scriptedProvider([]));
1086
+
1087
+ const pending = driver.requestInteraction('w', {});
1088
+ const interaction = driver.getHistory().at(-1)!.interaction!;
1089
+ assert.ok(!('presentation' in interaction));
1090
+
1091
+ driver.resolveInteraction(interaction.interactionId, { status: 'approved' });
1092
+ await pending;
1093
+ });
1094
+
1095
+ interactionPresentation.run();
1096
+
1061
1097
  // ---------------------------------------------------------------------------
1062
1098
  // interaction timeout — requestInteraction({ timeoutMs }) resolves with a
1063
1099
  // status:'timeout' result (never rejects) and closes the widget read-only.
@@ -874,7 +874,9 @@ export class ChatDriver extends EventTarget implements AiDriver {
874
874
  * @param data - Data to pass to the component.
875
875
  * @param options - Optional per-call overrides, including
876
876
  * `chatInputDuringExecution` to hide or disable the main chat input while
877
- * the widget is awaiting user input. Reverts when the interaction resolves.
877
+ * the widget is awaiting user input (reverts when the interaction resolves),
878
+ * and `presentation` to control whether the host wraps the widget in a chat
879
+ * bubble and/or shows the "Assistant" label.
878
880
  */
879
881
  public async requestInteraction<T>(
880
882
  componentName: string,
@@ -894,6 +896,7 @@ export class ChatDriver extends EventTarget implements AiDriver {
894
896
  const interactionId = crypto.randomUUID();
895
897
  const chatInputDuringExecution = options?.chatInputDuringExecution;
896
898
  const timeoutMs = options?.timeoutMs;
899
+ const presentation = options?.presentation;
897
900
  return new Promise((resolve, reject) => {
898
901
  this.pendingInteractions.set(interactionId, {
899
902
  resolve,
@@ -928,7 +931,12 @@ export class ChatDriver extends EventTarget implements AiDriver {
928
931
  this.appendToHistory({
929
932
  role: 'assistant',
930
933
  content: '',
931
- interaction: { interactionId, componentName, data },
934
+ interaction: {
935
+ interactionId,
936
+ componentName,
937
+ data,
938
+ ...(presentation ? { presentation } : {}),
939
+ },
932
940
  });
933
941
  });
934
942
  }
@@ -433,6 +433,13 @@ export const styles = css`
433
433
  animation: slide-in-left 0.25s ease-out;
434
434
  }
435
435
 
436
+ /* A 'bubble' interaction reads like a normal assistant message: avatar to the
437
+ left, bubble to the right — not the full-width column the other interaction
438
+ presentations use. */
439
+ .message-row.interaction.present-bubble {
440
+ flex-direction: row;
441
+ }
442
+
436
443
  .avatar {
437
444
  position: relative;
438
445
  width: 32px;
@@ -541,7 +548,10 @@ export const styles = css`
541
548
  border: 1px solid color-mix(in srgb, var(--ai-function-color, #86efac) 20%, transparent);
542
549
  }
543
550
 
544
- .message.interaction {
551
+ /* 'label' (default) and 'bare' interactions render the widget chrome-free and
552
+ full-width — the widget owns its body. */
553
+ .message-row.interaction.present-label .message,
554
+ .message-row.interaction.present-bare .message {
545
555
  background: none;
546
556
  border: none;
547
557
  padding: 0;
@@ -549,6 +559,17 @@ export const styles = css`
549
559
  width: 100%;
550
560
  }
551
561
 
562
+ /* 'bubble' interactions reuse the standard assistant-message skin so the
563
+ widget sits inside a normal chat bubble. Padding, max-width and min-width
564
+ come from the base .message rule. */
565
+ .message-row.interaction.present-bubble .message {
566
+ background: linear-gradient(135deg, var(--neutral-layer-3) 0%, var(--neutral-layer-4) 100%);
567
+ color: var(--neutral-foreground-rest);
568
+ border-radius: 4px 18px 18px;
569
+ border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-rest);
570
+ box-shadow: var(--ai-message-shadow, 0 2px 8px rgb(0 0 0 / 15%));
571
+ }
572
+
552
573
  .sender {
553
574
  font-weight: bold;
554
575
  font-size: 0.9em;
@@ -20,6 +20,7 @@ import type {
20
20
  ChatAttachment,
21
21
  ChatMessage,
22
22
  ChatToolCall,
23
+ InteractionPresentation,
23
24
  } from '@genesislcap/foundation-ai';
24
25
  import { isChatToolCallUnknown } from '@genesislcap/foundation-ai';
25
26
  import { classNames, html, ref, repeat, when, ViewTemplate } from '@genesislcap/web-core';
@@ -117,6 +118,14 @@ const senderLabel: Record<string, string> = {
117
118
  ai: 'Assistant',
118
119
  };
119
120
 
121
+ /**
122
+ * Resolves how the host frames an interaction widget, defaulting to `'label'`
123
+ * (the historical "Assistant" label, no bubble). Callers guard on
124
+ * `m.interaction` first; non-interaction messages never consult this.
125
+ */
126
+ const interactionPresentation = (m: ChatMessage): InteractionPresentation =>
127
+ m.interaction?.presentation ?? 'label';
128
+
120
129
  // ─── Sub-agent trace fragments ────────────────────────────────────────────────
121
130
 
122
131
  const subAgentAssistantTemplate = html<ChatMessage>`
@@ -284,7 +293,10 @@ ${(tc) => (tc.foldPath?.length ? `${tc.foldPath.join(' › ')} › ` : '')}<stro
284
293
  ${when(
285
294
  (m) => m.role !== 'system-event',
286
295
  html<ChatMessage, FoundationAiAssistant>`
287
- <div class="message-row ${(m) => messageType(m)}">
296
+ <div
297
+ class="message-row ${(m) => messageType(m)} ${(m) =>
298
+ m.interaction ? `present-${interactionPresentation(m)}` : ''}"
299
+ >
288
300
  <div class="avatar ${(m) => messageType(m)}">
289
301
  ${when(
290
302
  // Keyed on messageType (not raw role) so a synthetic-user message,
@@ -295,14 +307,21 @@ ${(tc) => (tc.foldPath?.length ? `${tc.foldPath.join(' › ')} › ` : '')}<stro
295
307
  )}${when((m) => messageType(m) !== 'user', assistantAvatarTemplate)}
296
308
  </div>
297
309
  <div class="message ${(m) => messageType(m)}">
298
- <div class="sender">
299
- ${(m, c) =>
300
- messageType(m) === 'ai-function' &&
301
- m.agentName &&
302
- (c.parent as FoundationAiAssistant).showAgentSwitchIndicator
303
- ? `Tool Call · ${m.agentLabel ?? m.agentName}`
304
- : senderLabel[messageType(m)]}
305
- </div>
310
+ ${when(
311
+ // A 'bare' interaction owns its full presentation — suppress the
312
+ // host sender label. Every other message keeps it.
313
+ (m) => !(m.interaction && interactionPresentation(m) === 'bare'),
314
+ html<ChatMessage, FoundationAiAssistant>`
315
+ <div class="sender">
316
+ ${(m, c) =>
317
+ messageType(m) === 'ai-function' &&
318
+ m.agentName &&
319
+ (c.parent as FoundationAiAssistant).showAgentSwitchIndicator
320
+ ? `Tool Call · ${m.agentLabel ?? m.agentName}`
321
+ : senderLabel[messageType(m)]}
322
+ </div>
323
+ `,
324
+ )}
306
325
  <div class="content">
307
326
  ${when(
308
327
  (m) => m.content,