@genesislcap/ai-assistant 14.420.0 → 14.421.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/ai-assistant.api.json +4061 -1416
  2. package/dist/ai-assistant.d.ts +594 -81
  3. package/dist/dts/channel/ai-activity-channel.d.ts +4 -22
  4. package/dist/dts/channel/ai-activity-channel.d.ts.map +1 -1
  5. package/dist/dts/components/ai-driver/ai-driver.d.ts +52 -0
  6. package/dist/dts/components/ai-driver/ai-driver.d.ts.map +1 -0
  7. package/dist/dts/components/ai-driver/index.d.ts +2 -0
  8. package/dist/dts/components/ai-driver/index.d.ts.map +1 -0
  9. package/dist/dts/components/chat-driver/chat-driver.d.ts +63 -8
  10. package/dist/dts/components/chat-driver/chat-driver.d.ts.map +1 -1
  11. package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.d.ts +3 -3
  12. package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.d.ts.map +1 -1
  13. package/dist/dts/components/chat-markdown/chat-markdown.d.ts +1 -1
  14. package/dist/dts/components/chat-markdown/chat-markdown.d.ts.map +1 -1
  15. package/dist/dts/components/halo-overlay.d.ts +13 -1
  16. package/dist/dts/components/halo-overlay.d.ts.map +1 -1
  17. package/dist/dts/components/orchestrating-driver/index.d.ts +2 -0
  18. package/dist/dts/components/orchestrating-driver/index.d.ts.map +1 -0
  19. package/dist/dts/components/orchestrating-driver/orchestrating-driver.d.ts +39 -0
  20. package/dist/dts/components/orchestrating-driver/orchestrating-driver.d.ts.map +1 -0
  21. package/dist/dts/components/popout-manager/index.d.ts +2 -0
  22. package/dist/dts/components/popout-manager/index.d.ts.map +1 -0
  23. package/dist/dts/components/popout-manager/popout-manager.d.ts +72 -0
  24. package/dist/dts/components/popout-manager/popout-manager.d.ts.map +1 -0
  25. package/dist/dts/config/config.d.ts +43 -15
  26. package/dist/dts/config/config.d.ts.map +1 -1
  27. package/dist/dts/config/fallback-agents.d.ts +20 -0
  28. package/dist/dts/config/fallback-agents.d.ts.map +1 -0
  29. package/dist/dts/config/index.d.ts +1 -0
  30. package/dist/dts/config/index.d.ts.map +1 -1
  31. package/dist/dts/index.d.ts +6 -0
  32. package/dist/dts/index.d.ts.map +1 -1
  33. package/dist/dts/main/main.d.ts +122 -21
  34. package/dist/dts/main/main.d.ts.map +1 -1
  35. package/dist/dts/main/main.styles.d.ts.map +1 -1
  36. package/dist/dts/main/main.template.d.ts.map +1 -1
  37. package/dist/dts/main/main.types.d.ts +16 -0
  38. package/dist/dts/main/main.types.d.ts.map +1 -1
  39. package/dist/dts/state/ai-assistant-slice.d.ts +38 -0
  40. package/dist/dts/state/ai-assistant-slice.d.ts.map +1 -0
  41. package/dist/dts/state/driver-registry.d.ts +22 -0
  42. package/dist/dts/state/driver-registry.d.ts.map +1 -0
  43. package/dist/dts/state/session-store.d.ts +37 -0
  44. package/dist/dts/state/session-store.d.ts.map +1 -0
  45. package/dist/dts/suggestions/chat-suggestions.d.ts +7 -0
  46. package/dist/dts/suggestions/chat-suggestions.d.ts.map +1 -0
  47. package/dist/dts/types/ai-chat-widget.d.ts +3 -2
  48. package/dist/dts/types/ai-chat-widget.d.ts.map +1 -1
  49. package/dist/dts/utils/index.d.ts +1 -0
  50. package/dist/dts/utils/index.d.ts.map +1 -1
  51. package/dist/dts/utils/tool-fold.d.ts +133 -0
  52. package/dist/dts/utils/tool-fold.d.ts.map +1 -0
  53. package/dist/esm/components/ai-driver/ai-driver.js +1 -0
  54. package/dist/esm/components/ai-driver/index.js +1 -0
  55. package/dist/esm/components/chat-driver/chat-driver.js +499 -67
  56. package/dist/esm/components/chat-interaction-wrapper/chat-interaction-wrapper.js +2 -2
  57. package/dist/esm/components/chat-markdown/chat-markdown.js +1 -1
  58. package/dist/esm/components/halo-overlay.js +53 -7
  59. package/dist/esm/components/orchestrating-driver/index.js +1 -0
  60. package/dist/esm/components/orchestrating-driver/orchestrating-driver.js +247 -0
  61. package/dist/esm/components/popout-manager/index.js +1 -0
  62. package/dist/esm/components/popout-manager/popout-manager.js +126 -0
  63. package/dist/esm/config/fallback-agents.js +26 -0
  64. package/dist/esm/config/index.js +1 -0
  65. package/dist/esm/index.js +6 -0
  66. package/dist/esm/main/main.js +546 -112
  67. package/dist/esm/main/main.styles.js +200 -4
  68. package/dist/esm/main/main.template.js +163 -63
  69. package/dist/esm/state/ai-assistant-slice.js +54 -0
  70. package/dist/esm/state/driver-registry.js +46 -0
  71. package/dist/esm/state/session-store.js +39 -0
  72. package/dist/esm/suggestions/chat-suggestions.js +147 -0
  73. package/dist/esm/utils/index.js +1 -0
  74. package/dist/esm/utils/tool-fold.js +92 -0
  75. package/dist/tsconfig.tsbuildinfo +1 -1
  76. package/docs/migration-FUI-2495.md +339 -0
  77. package/docs/sub_agent.md +310 -0
  78. package/package.json +16 -15
  79. package/src/channel/ai-activity-channel.ts +4 -20
  80. package/src/components/ai-driver/ai-driver.ts +69 -0
  81. package/src/components/ai-driver/index.ts +1 -0
  82. package/src/components/chat-driver/chat-driver.ts +600 -73
  83. package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.ts +3 -3
  84. package/src/components/chat-markdown/chat-markdown.ts +1 -1
  85. package/src/components/halo-overlay.ts +45 -7
  86. package/src/components/orchestrating-driver/index.ts +1 -0
  87. package/src/components/orchestrating-driver/orchestrating-driver.ts +328 -0
  88. package/src/components/popout-manager/index.ts +1 -0
  89. package/src/components/popout-manager/popout-manager.ts +147 -0
  90. package/src/config/config.ts +45 -15
  91. package/src/config/fallback-agents.ts +29 -0
  92. package/src/config/index.ts +1 -0
  93. package/src/index.ts +6 -0
  94. package/src/main/main.styles.ts +200 -4
  95. package/src/main/main.template.ts +200 -80
  96. package/src/main/main.ts +567 -94
  97. package/src/main/main.types.ts +11 -0
  98. package/src/state/ai-assistant-slice.ts +80 -0
  99. package/src/state/driver-registry.ts +51 -0
  100. package/src/state/session-store.ts +56 -0
  101. package/src/suggestions/chat-suggestions.ts +158 -0
  102. package/src/types/ai-chat-widget.ts +4 -2
  103. package/src/utils/index.ts +1 -0
  104. package/src/utils/tool-fold.ts +181 -0
  105. package/docs/multi-agent-architecture.md +0 -198
@@ -1,12 +1,27 @@
1
+ import { isChatToolCallUnknown } from '@genesislcap/foundation-ai';
1
2
  import type { ChatAttachment, ChatMessage, ChatToolCall } from '@genesislcap/foundation-ai';
2
- import { html, repeat, when, ViewTemplate } from '@genesislcap/web-core';
3
+ import { html, ref, repeat, when, ViewTemplate } from '@genesislcap/web-core';
3
4
  import type { FoundationAiAssistant } from './main';
4
5
  import { ANIMATION_DEFS } from './main.types';
5
6
 
7
+ function unknownToolPayload(tc: ChatToolCall): string {
8
+ if (!isChatToolCallUnknown(tc)) return '';
9
+ const lines = [`${tc.name} — tool does not exist`];
10
+ if (tc.availableTools.length > 0) {
11
+ lines.push('Available tools:');
12
+ tc.availableTools.forEach((t) => lines.push(` • ${t}`));
13
+ }
14
+ return lines.join('\n');
15
+ }
16
+
6
17
  const animationItemRenderer = (option: any): ViewTemplate => html`
7
18
  <span part="option-label" title="${() => option.tooltip}">${() => option.label}</span>
8
19
  `;
9
20
 
21
+ const HALO_SPEED_DEFAULT = 1.5;
22
+ const HALO_SPEED_ORCHESTRATING = 0.4;
23
+ const HALO_BORDER_SIZE_DEFAULT = 3;
24
+
10
25
  const animationOptions = Object.entries(ANIMATION_DEFS).map(([value, def]) => ({
11
26
  value,
12
27
  label: def.label,
@@ -34,6 +49,8 @@ const genesisIconTemplate = html`
34
49
  */
35
50
  const messageType = (m: ChatMessage): string => {
36
51
  switch (true) {
52
+ case m.role === 'system-event':
53
+ return 'agent-switch';
37
54
  case m.role === 'user':
38
55
  return 'user';
39
56
  case !!m.thinking:
@@ -64,17 +81,18 @@ export const FoundationAiAssistantTemplate = (
64
81
  const multiselectTag = `${designSystemPrefix}-multiselect`;
65
82
  const textareaTag = `${designSystemPrefix}-text-area`;
66
83
  const iconTag = `${designSystemPrefix}-icon`;
84
+ const progressTag = `${designSystemPrefix}-progress`;
67
85
 
68
86
  return html<FoundationAiAssistant>`
69
87
  <div class="chat-wrapper" part="chat-wrapper">
70
88
  ${when(
71
- (x) => !!x.chatConfig.acceptedFiles,
89
+ (x) => !!x.chatConfig.ui?.acceptedFiles,
72
90
  html<FoundationAiAssistant>`
73
91
  <input
74
92
  class="file-input"
75
93
  type="file"
76
94
  multiple
77
- accept=${(x) => x.chatConfig.acceptedFiles}
95
+ accept=${(x) => x.chatConfig.ui?.acceptedFiles}
78
96
  @change=${(x, c) => x.handleFileSelect(c.event)}
79
97
  />
80
98
  `,
@@ -82,23 +100,21 @@ export const FoundationAiAssistantTemplate = (
82
100
  ${when(
83
101
  (x) =>
84
102
  !!x.popoutMode ||
85
- x.chatConfig.showToolCalls != null ||
86
- x.chatConfig.showThinkingSteps != null ||
87
- x.chatConfig.allowDebugDownload === true ||
88
- x.chatConfig.animations != null,
103
+ x.chatConfig.ui?.showToolCalls != null ||
104
+ x.chatConfig.ui?.showThinkingSteps != null ||
105
+ x.chatConfig.ui?.showAgentSwitchIndicator != null ||
106
+ x.chatConfig.ui?.allowDebugDownload === true ||
107
+ x.chatConfig.ui?.animations != null,
89
108
  html<FoundationAiAssistant>`
90
109
  <div
91
- class="chat-header ${(x) => (x.popoutMode === 'expand' ? 'draggable' : '')}"
110
+ class="chat-header ${(x) => (x.popoutMode !== 'collapse' ? 'draggable' : '')}"
92
111
  part="chat-header"
93
112
  @mousedown="${(x, c) => x.onChatHeaderMouseDown(c.event as MouseEvent)}"
94
113
  >
95
114
  ${when(
96
- (x) => !!(x.headerTitle ?? x.agents?.[0]?.name),
115
+ (x) => !!x.headerTitle,
97
116
  html<FoundationAiAssistant>`
98
- <!-- TODO: multi-agent orchestration — bind to active agent name rather than always agents[0] -->
99
- <span class="chat-title" part="chat-title">
100
- ${(x) => x.headerTitle ?? x.agents?.[0]?.name}
101
- </span>
117
+ <span class="chat-title" part="chat-title">${(x) => x.headerTitle}</span>
102
118
  `,
103
119
  )}
104
120
  <div class="header-actions" part="header-actions">
@@ -118,10 +134,11 @@ export const FoundationAiAssistantTemplate = (
118
134
  )}
119
135
  ${when(
120
136
  (x) =>
121
- x.chatConfig.showToolCalls != null ||
122
- x.chatConfig.showThinkingSteps != null ||
123
- x.chatConfig.allowDebugDownload === true ||
124
- x.chatConfig.animations != null,
137
+ x.chatConfig.ui?.showToolCalls != null ||
138
+ x.chatConfig.ui?.showThinkingSteps != null ||
139
+ x.chatConfig.ui?.showAgentSwitchIndicator != null ||
140
+ x.chatConfig.ui?.allowDebugDownload === true ||
141
+ x.chatConfig.ui?.animations != null,
125
142
  html<FoundationAiAssistant>`
126
143
  <${buttonTag}
127
144
  class="settings-button"
@@ -139,7 +156,7 @@ export const FoundationAiAssistantTemplate = (
139
156
  html<FoundationAiAssistant>`
140
157
  <div class="settings-panel" part="settings-panel">
141
158
  ${when(
142
- (x) => x.chatConfig.showToolCalls != null,
159
+ (x) => x.chatConfig.ui?.showToolCalls != null,
143
160
  html<FoundationAiAssistant>`
144
161
  <${switchTag}
145
162
  part="toggle-tool-calls"
@@ -149,7 +166,7 @@ export const FoundationAiAssistantTemplate = (
149
166
  `,
150
167
  )}
151
168
  ${when(
152
- (x) => x.chatConfig.showThinkingSteps != null,
169
+ (x) => x.chatConfig.ui?.showThinkingSteps != null,
153
170
  html<FoundationAiAssistant>`
154
171
  <${switchTag}
155
172
  part="toggle-thinking"
@@ -159,17 +176,27 @@ export const FoundationAiAssistantTemplate = (
159
176
  `,
160
177
  )}
161
178
  ${when(
162
- (x) => x.chatConfig.allowDebugDownload === true,
179
+ (x) => x.chatConfig.ui?.showAgentSwitchIndicator != null,
180
+ html<FoundationAiAssistant>`
181
+ <${switchTag}
182
+ part="toggle-agent-switch"
183
+ :checked=${(x) => x.showAgentSwitchIndicator}
184
+ @change=${(x) => x.toggleShowAgentSwitchIndicator()}
185
+ >Agents</${switchTag}>
186
+ `,
187
+ )}
188
+ ${when(
189
+ (x) => x.chatConfig.ui?.allowDebugDownload === true,
163
190
  html<FoundationAiAssistant>`
164
191
  <${buttonTag}
165
192
  part="download-button"
166
193
  appearance="stealth"
167
- @click=${(x) => x.downloadHistory()}
168
- >Download debug state</${buttonTag}>
194
+ @click=${(x) => x.downloadDebugLog()}
195
+ >Download agent log</${buttonTag}>
169
196
  `,
170
197
  )}
171
198
  ${when(
172
- (x) => x.chatConfig.animations?.userConfigurable === true,
199
+ (x) => x.chatConfig.ui?.animations?.userConfigurable === true,
173
200
  html<FoundationAiAssistant>`
174
201
  <div class="settings-animations">
175
202
  <span class="settings-label">Animations</span>
@@ -191,77 +218,156 @@ export const FoundationAiAssistantTemplate = (
191
218
  )}
192
219
  `,
193
220
  )}
221
+ ${when(
222
+ (x) =>
223
+ x.settingsOpen &&
224
+ x.chatConfig.ui?.showContextUsage !== false &&
225
+ x.contextTokens != null &&
226
+ x.contextLimit != null,
227
+ html<FoundationAiAssistant>`
228
+ <div class="context-usage" part="context-usage">
229
+ <div class="context-usage-header">
230
+ <span class="context-usage-label">Context window</span>
231
+ <span class="context-usage-tokens">
232
+ ${(x) => x.contextTokens!.toLocaleString()} /
233
+ ${(x) => x.contextLimit!.toLocaleString()} tokens
234
+ (${(x) => Math.round((x.contextTokens! / x.contextLimit!) * 100)}%)
235
+ </span>
236
+ </div>
237
+ <${progressTag}
238
+ part="context-progress"
239
+ value="${(x) => Math.min(100, Math.round((x.contextTokens! / x.contextLimit!) * 100))}"
240
+ ></${progressTag}>
241
+ </div>
242
+ `,
243
+ )}
194
244
 
195
- <div class="messages" part="messages">
245
+ <div class="splash-wrapper" part="splash">
246
+ <slot name="splash"></slot>
247
+ </div>
248
+
249
+ <div class="messages" part="messages" ${ref('messagesEl')}>
196
250
 
197
251
  ${repeat(
198
252
  (x) => x.visibleMessages,
199
253
  html<ChatMessage, FoundationAiAssistant>`
200
- <div class="message-row ${(m) => messageType(m)}">
201
- ${when(
202
- (m) => m.role !== 'user',
203
- html<ChatMessage, FoundationAiAssistant>`
204
- <div class="avatar ${(m) => messageType(m)}">
205
- ${when(
206
- (m, c) => !!(c.parent as FoundationAiAssistant).imageSrc,
207
- html<ChatMessage, FoundationAiAssistant>`
208
- <img
209
- src="${(m, c) => (c.parent as FoundationAiAssistant).imageSrc}"
210
- alt="Assistant"
211
- class="avatar-img"
212
- />
213
- `,
214
- )}
215
- ${when(
216
- (m, c) => !(c.parent as FoundationAiAssistant).imageSrc,
217
- genesisIconTemplate,
218
- )}
219
- </div>
220
- `,
221
- )}
222
- <div class="message ${(m) => messageType(m)}">
223
- <div class="sender">${(m) => senderLabel[messageType(m)]}</div>
224
- <div class="content">
254
+ ${when(
255
+ (m) => m.role === 'system-event',
256
+ html<ChatMessage, FoundationAiAssistant>`
257
+ <div class="agent-switch-indicator" part="agent-switch-indicator">
258
+ <span class="agent-switch-label">${(m) => m.content}</span>
259
+ </div>
260
+ `,
261
+ )}
262
+ ${when(
263
+ (m) => m.role !== 'system-event',
264
+ html<ChatMessage, FoundationAiAssistant>`
265
+ <div class="message-row ${(m) => messageType(m)}">
225
266
  ${when(
226
- (m) => m.content,
267
+ (m) => m.role !== 'user',
227
268
  html<ChatMessage, FoundationAiAssistant>`
228
- <ai-chat-markdown :content="${(m) => m.content}"></ai-chat-markdown>
269
+ <div class="avatar ${(m) => messageType(m)}">
270
+ ${when(
271
+ (m, c) => !!(c.parent as FoundationAiAssistant).imageSrc,
272
+ html<ChatMessage, FoundationAiAssistant>`
273
+ <img
274
+ src="${(m, c) => (c.parent as FoundationAiAssistant).imageSrc}"
275
+ alt="Assistant"
276
+ class="avatar-img"
277
+ />
278
+ `,
279
+ )}
280
+ ${when(
281
+ (m, c) => !(c.parent as FoundationAiAssistant).imageSrc,
282
+ genesisIconTemplate,
283
+ )}
284
+ </div>
229
285
  `,
230
286
  )}
231
- ${when(
232
- (m) => m.toolCalls,
233
- html<ChatMessage, FoundationAiAssistant>`
234
- ${repeat(
235
- (m) => m.toolCalls ?? [],
236
- html<ChatToolCall>`
237
- <pre class="payload"><strong>${(tc) => tc.name}</strong>(${(tc) =>
238
- JSON.stringify(tc.args, null, 2)})</pre>
287
+ <div class="message ${(m) => messageType(m)}">
288
+ <div class="sender">
289
+ ${(m, c) =>
290
+ messageType(m) === 'ai-function' &&
291
+ m.agentName &&
292
+ (c.parent as FoundationAiAssistant).showAgentSwitchIndicator
293
+ ? `Tool Call · ${m.agentName}`
294
+ : senderLabel[messageType(m)]}
295
+ </div>
296
+ <div class="content">
297
+ ${when(
298
+ (m) => m.content,
299
+ html<ChatMessage, FoundationAiAssistant>`
300
+ <ai-chat-markdown :content="${(m) => m.content}"></ai-chat-markdown>
239
301
  `,
240
302
  )}
241
- `,
242
- )}
243
- ${when(
244
- (m) => m.interaction,
245
- html<ChatMessage, FoundationAiAssistant>`
246
- <ai-chat-interaction-wrapper
247
- :componentName=${(m) => m.interaction!.componentName}
248
- :data=${(m) => m.interaction!.data}
249
- :interactionId=${(m) => m.interaction!.interactionId}
250
- :resolved=${(m) => !!m.interaction!.resolved}
251
- @interaction-completed=${(m, c) =>
252
- c.parent.handleInteractionCompleted(c.event)}
253
- ></ai-chat-interaction-wrapper>
254
- `,
255
- )}
303
+ ${when(
304
+ (m) => m.toolCalls,
305
+ html<ChatMessage, FoundationAiAssistant>`
306
+ ${repeat(
307
+ (m) => m.toolCalls ?? [],
308
+ html<ChatToolCall>`
309
+ ${when(
310
+ (tc) => tc.foldEvent === 'open',
311
+ html<ChatToolCall>`
312
+ <pre class="payload fold-event fold-open">
313
+ &#9658; ${(tc) => tc.name}</pre
314
+ >
315
+ `,
316
+ )}
317
+ ${when(
318
+ (tc) => tc.foldEvent === 'close',
319
+ html<ChatToolCall>`
320
+ <pre class="payload fold-event fold-close">
321
+ &#9668; ${(tc) => tc.name}</pre
322
+ >
323
+ `,
324
+ )}
325
+ ${when(
326
+ (tc) => !tc.foldEvent && !isChatToolCallUnknown(tc),
327
+ html<ChatToolCall>`
328
+ <pre class="payload">
329
+ ${(tc) => (tc.foldPath?.length ? `${tc.foldPath.join(' › ')} › ` : '')}<strong>${(tc) =>
330
+ tc.name}</strong>(${(tc) =>
331
+ JSON.stringify(tc.args, null, 2)})</pre
332
+ >
333
+ `,
334
+ )}
335
+ ${when(
336
+ isChatToolCallUnknown,
337
+ html<ChatToolCall>`
338
+ <pre class="payload unknown-tool">
339
+ ${(tc) => unknownToolPayload(tc)}</pre
340
+ >
341
+ `,
342
+ )}
343
+ `,
344
+ )}
345
+ `,
346
+ )}
347
+ ${when(
348
+ (m) => m.interaction,
349
+ html<ChatMessage, FoundationAiAssistant>`
350
+ <ai-chat-interaction-wrapper
351
+ :componentName=${(m) => m.interaction!.componentName}
352
+ :data=${(m) => m.interaction!.data}
353
+ :interactionId=${(m) => m.interaction!.interactionId}
354
+ :resolved=${(m) => m.interaction!.resolved}
355
+ @interaction-completed=${(m, c) =>
356
+ c.parent.handleInteractionCompleted(c.event)}
357
+ ></ai-chat-interaction-wrapper>
358
+ `,
359
+ )}
360
+ </div>
361
+ </div>
256
362
  </div>
257
- </div>
258
- </div>
363
+ `,
364
+ )}
259
365
  `,
260
366
  )}
261
367
  ${when(
262
368
  (x) =>
263
369
  x.showLoadingIndicator &&
264
- (x.chatConfig.animations == null || x.enabledAnimations.includes('loading')),
370
+ (x.chatConfig.ui?.animations == null || x.enabledAnimations.includes('loading')),
265
371
  html<FoundationAiAssistant>`
266
372
  <div class="message-row ai" part="thinking">
267
373
  <div class="avatar">
@@ -322,15 +428,26 @@ export const FoundationAiAssistantTemplate = (
322
428
  `,
323
429
  )}
324
430
 
431
+ ${when(
432
+ (x) => x.chatConfig.suggestions?.behavior !== 'never',
433
+ html<FoundationAiAssistant>`
434
+ <chat-suggestions
435
+ :state="${(x) => x.suggestionsState}"
436
+ @suggestion-clicked="${(x, c) =>
437
+ x.handleSuggestionClick((c.event as CustomEvent).detail)}"
438
+ ></chat-suggestions>
439
+ `,
440
+ )}
441
+
325
442
  <div class="input-row" part="input-row">
326
443
  ${when(
327
- (x) => !!x.chatConfig.acceptedFiles,
444
+ (x) => !!x.chatConfig.ui?.acceptedFiles,
328
445
  html<FoundationAiAssistant>`
329
446
  <${buttonTag}
330
447
  class="attach-button"
331
448
  part="attach-button"
332
449
  appearance="stealth"
333
- title=${(x) => `Attach file (${x.chatConfig.acceptedFiles})`}
450
+ title=${(x) => `Attach file (${x.chatConfig.ui?.acceptedFiles})`}
334
451
  ?disabled=${(x) => x.state === 'loading'}
335
452
  @click=${(x) => x.triggerFileInput()}
336
453
  ><${iconTag} name="paperclip"></${iconTag}></${buttonTag}>
@@ -364,7 +481,10 @@ export const FoundationAiAssistantTemplate = (
364
481
  </div>
365
482
  <ai-halo-overlay
366
483
  part="halo-overlay"
367
- ?active=${(x) => x.showHalo && x.enabledAnimations.includes('halo')}
484
+ ?active=${(x) => x.showHalo !== 'no' && x.enabledAnimations.includes('halo')}
485
+ :speed="${(x) => (x.showHalo === 'orchestrating' ? HALO_SPEED_ORCHESTRATING : HALO_SPEED_DEFAULT)}"
486
+ direction="${(x) => (x.showHalo === 'orchestrating' ? 'ccw' : 'cw')}"
487
+ :borderSize="${(x) => (x.showHalo === 'orchestrating' ? 2 : HALO_BORDER_SIZE_DEFAULT)}"
368
488
  ></ai-halo-overlay>
369
489
  </div>
370
490
  `;