@meistrari/chat-nuxt 3.9.1 → 3.10.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.
Files changed (87) hide show
  1. package/README.md +50 -440
  2. package/dist/module.d.mts +1 -1
  3. package/dist/module.json +1 -1
  4. package/dist/module.mjs +56 -3
  5. package/dist/runtime/assets/css/markstream.css +1 -1
  6. package/dist/runtime/conversations/components/chat-conversation-creator-filter.vue +11 -67
  7. package/dist/runtime/conversations/components/chat-conversation-item.d.vue.ts +2 -1
  8. package/dist/runtime/conversations/components/chat-conversation-item.vue +29 -33
  9. package/dist/runtime/conversations/components/chat-conversation-item.vue.d.ts +2 -1
  10. package/dist/runtime/conversations/components/chat-conversation-list.d.vue.ts +0 -1
  11. package/dist/runtime/conversations/components/chat-conversation-list.vue +117 -158
  12. package/dist/runtime/conversations/components/chat-conversation-list.vue.d.ts +0 -1
  13. package/dist/runtime/conversations/components/chat-conversation-new-group-button.vue +34 -73
  14. package/dist/runtime/conversations/components/chat-conversation-search.vue +1 -21
  15. package/dist/runtime/conversations/components/chat-widget-history-list.d.vue.ts +12 -0
  16. package/dist/runtime/conversations/components/chat-widget-history-list.vue +27 -0
  17. package/dist/runtime/conversations/components/chat-widget-history-list.vue.d.ts +12 -0
  18. package/dist/runtime/conversations/composables/conversation-groups.d.ts +1 -0
  19. package/dist/runtime/conversations/composables/conversation-groups.js +2 -0
  20. package/dist/runtime/conversations/composables/conversation-item.js +4 -4
  21. package/dist/runtime/conversations/composables/conversation-list.js +14 -5
  22. package/dist/runtime/embed/components/chat-configuration-modal.d.vue.ts +3 -3
  23. package/dist/runtime/embed/components/chat-configuration-modal.vue.d.ts +3 -3
  24. package/dist/runtime/embed/components/chat-embed-inner.d.vue.ts +6 -3
  25. package/dist/runtime/embed/components/chat-embed-inner.vue +365 -152
  26. package/dist/runtime/embed/components/chat-embed-inner.vue.d.ts +6 -3
  27. package/dist/runtime/embed/components/chat-embed.d.vue.ts +31 -4
  28. package/dist/runtime/embed/components/chat-embed.vue +10 -4
  29. package/dist/runtime/embed/components/chat-embed.vue.d.ts +31 -4
  30. package/dist/runtime/embed/components/chat-topbar.vue +83 -85
  31. package/dist/runtime/embed/components/meistrari-chat-embed.d.vue.ts +5 -3
  32. package/dist/runtime/embed/components/meistrari-chat-embed.vue +118 -57
  33. package/dist/runtime/embed/components/meistrari-chat-embed.vue.d.ts +5 -3
  34. package/dist/runtime/embed/components/mobile/chat-mobile-drawer.d.vue.ts +0 -1
  35. package/dist/runtime/embed/components/mobile/chat-mobile-drawer.vue +2 -45
  36. package/dist/runtime/embed/components/mobile/chat-mobile-drawer.vue.d.ts +0 -1
  37. package/dist/runtime/embed/components/mobile/chat-mobile-home-suggestions.d.vue.ts +9 -5
  38. package/dist/runtime/embed/components/mobile/chat-mobile-home-suggestions.vue +14 -25
  39. package/dist/runtime/embed/components/mobile/chat-mobile-home-suggestions.vue.d.ts +9 -5
  40. package/dist/runtime/embed/components/mobile/chat-mobile-shell.d.vue.ts +6 -6
  41. package/dist/runtime/embed/components/mobile/chat-mobile-shell.vue +2 -3
  42. package/dist/runtime/embed/components/mobile/chat-mobile-shell.vue.d.ts +6 -6
  43. package/dist/runtime/embed/feature-config.d.ts +7 -0
  44. package/dist/runtime/embed/types.d.ts +47 -8
  45. package/dist/runtime/files/icons.d.ts +1 -1
  46. package/dist/runtime/files/icons.js +1 -1
  47. package/dist/runtime/messages/components/chat-mention-dropdown.d.vue.ts +6 -1
  48. package/dist/runtime/messages/components/chat-mention-dropdown.vue +46 -22
  49. package/dist/runtime/messages/components/chat-mention-dropdown.vue.d.ts +6 -1
  50. package/dist/runtime/messages/components/chat-message-bubble.vue +53 -71
  51. package/dist/runtime/messages/components/chat-message-feedback.vue +25 -229
  52. package/dist/runtime/messages/components/chat-message-input.vue +176 -134
  53. package/dist/runtime/messages/components/chat-message-list.d.vue.ts +6 -0
  54. package/dist/runtime/messages/components/chat-message-list.vue +27 -23
  55. package/dist/runtime/messages/components/chat-message-list.vue.d.ts +6 -0
  56. package/dist/runtime/messages/components/chat-model-selector.vue +10 -22
  57. package/dist/runtime/messages/components/reasoning/chat-reasoning-message.vue +2 -3
  58. package/dist/runtime/messages/components/reasoning/chat-reasoning-thought.vue +60 -69
  59. package/dist/runtime/messages/components/reasoning/chat-thinking-indicator.vue +3 -9
  60. package/dist/runtime/messages/components/widgets/chat-bash-widget.vue +3 -12
  61. package/dist/runtime/messages/components/widgets/chat-doc-sdk-widget.vue +3 -12
  62. package/dist/runtime/messages/components/widgets/chat-generic-tool-widget.vue +3 -12
  63. package/dist/runtime/messages/components/widgets/chat-grep-widget.vue +7 -17
  64. package/dist/runtime/messages/components/widgets/chat-read-widget.vue +7 -17
  65. package/dist/runtime/messages/components/widgets/chat-tela-skill-widget.vue +4 -13
  66. package/dist/runtime/messages/components/widgets/chat-thinking-widget.vue +11 -22
  67. package/dist/runtime/messages/components/widgets/chat-web-search-widget.vue +13 -40
  68. package/dist/runtime/messages/components/widgets/chat-workstation-query-widget.vue +52 -65
  69. package/dist/runtime/messages/components/widgets/chat-write-widget.vue +8 -18
  70. package/dist/runtime/messages/composables/mention-autocomplete.js +4 -0
  71. package/dist/runtime/messages/message-reasoning.js +4 -0
  72. package/dist/runtime/messages/message-state.js +1 -0
  73. package/dist/runtime/public/files/generic.svg +2 -5
  74. package/dist/runtime/public/files/image.svg +2 -1
  75. package/dist/runtime/types/embed.d.ts +1 -1
  76. package/dist/runtime/types/schemas/chat/conversations.d.ts +2 -0
  77. package/dist/runtime/types/schemas/chat/conversations.js +3 -0
  78. package/dist/runtime/types/schemas/chat/messages.d.ts +4 -0
  79. package/dist/runtime/types/schemas/chat/messages.js +7 -0
  80. package/dist/types.d.mts +1 -1
  81. package/package.json +5 -4
  82. package/dist/runtime/conversations/components/chat-conversation-new-group-popover-content.d.vue.ts +0 -23
  83. package/dist/runtime/conversations/components/chat-conversation-new-group-popover-content.vue +0 -75
  84. package/dist/runtime/conversations/components/chat-conversation-new-group-popover-content.vue.d.ts +0 -23
  85. package/dist/runtime/messages/components/reasoning/chat-reasoning-step-item.d.vue.ts +0 -37
  86. package/dist/runtime/messages/components/reasoning/chat-reasoning-step-item.vue +0 -125
  87. package/dist/runtime/messages/components/reasoning/chat-reasoning-step-item.vue.d.ts +0 -37
@@ -8,7 +8,10 @@ import ChatMobileShell from "./mobile/chat-mobile-shell.vue";
8
8
  import { normalizeConversationId } from "../../conversations/scope";
9
9
  import { resolveChatFeatures } from "../feature-config";
10
10
  import { resolveConversationCreator } from "../../conversations/creator";
11
- import { resolveTelaAgentInputs, useChat } from "../../messages/composables/chat";
11
+ import {
12
+ resolveTelaAgentInputs,
13
+ useChat
14
+ } from "../../messages/composables/chat";
12
15
  import { useChatAction } from "../../messages/composables/chat-action";
13
16
  import { useChatApi } from "../../shared/composables/chat-api";
14
17
  import { useConversationFiles } from "../../files/composables/conversation-files";
@@ -30,17 +33,22 @@ const props = defineProps({
30
33
  hideSidebar: { type: Boolean, required: false, default: true },
31
34
  sidebar: { type: Object, required: false },
32
35
  hideSettings: { type: Boolean, required: false, default: false },
33
- hideFolderHint: { type: Boolean, required: false, default: false },
36
+ compact: { type: Boolean, required: false, default: false },
37
+ suggestions: { type: [Array, null], required: false },
34
38
  user: { type: [Object, null], required: false },
35
39
  features: { type: Object, required: false }
36
40
  });
37
- const emit = defineEmits(["update:conversationId"]);
41
+ const emit = defineEmits(["update:conversationId", "update:conversationTitle"]);
38
42
  const sidebarPosition = computed(() => props.sidebar?.position ?? "left");
39
43
  const sidebarWidth = computed(() => props.sidebar?.width ?? 240);
40
- const sidebarBottomHeight = computed(() => Math.min(100, Math.max(0, props.sidebar?.bottomHeight ?? 50)));
44
+ const sidebarBottomHeight = computed(
45
+ () => Math.min(100, Math.max(0, props.sidebar?.bottomHeight ?? 50))
46
+ );
41
47
  const sidebarCollapsible = computed(() => props.sidebar?.collapsible ?? false);
42
48
  const isSidebarCollapsed = ref(props.sidebar?.defaultCollapsed ?? false);
43
- const sidebarCollapsed = computed(() => sidebarCollapsible.value && isSidebarCollapsed.value);
49
+ const sidebarCollapsed = computed(
50
+ () => sidebarCollapsible.value && isSidebarCollapsed.value
51
+ );
44
52
  const sidebarToggleIcon = computed(() => {
45
53
  const pointsRight = sidebarPosition.value === "right" ? !sidebarCollapsed.value : sidebarCollapsed.value;
46
54
  return pointsRight ? "i-ph-caret-right" : "i-ph-caret-left";
@@ -54,12 +62,32 @@ const chatAction = useChatAction();
54
62
  const { user: authUser, activeOrganization, logout } = useChatAuth();
55
63
  const { getMember, getMemberImage } = useWorkspaceMembers();
56
64
  const statusToast = useStatusToast();
57
- const { conversations, loading: conversationsLoading, fetchConversations, createConversation, deleteConversation, renameConversation, updateConversationModel, duplicateConversation, moveConversationToGroup, updateConversationInList } = useConversations();
65
+ const {
66
+ conversations,
67
+ loading: conversationsLoading,
68
+ fetchConversations,
69
+ createConversation,
70
+ deleteConversation,
71
+ renameConversation,
72
+ updateConversationModel,
73
+ duplicateConversation,
74
+ moveConversationToGroup,
75
+ updateConversationInList
76
+ } = useConversations();
58
77
  const { settings: workspaceSettingsState, fetchSettings } = useWorkspaceSettings();
59
- const { metadata: telaAgentMetadata, loading: telaAgentMetadataLoading, fetchAgentMetadata } = useTelaAgentMetadata();
60
- const { summary: workspaceAgentSummary, fetchSummary: fetchWorkspaceAgentSummary } = useWorkspaceAgentSummary();
78
+ const {
79
+ metadata: telaAgentMetadata,
80
+ loading: telaAgentMetadataLoading,
81
+ fetchAgentMetadata
82
+ } = useTelaAgentMetadata();
83
+ const {
84
+ summary: workspaceAgentSummary,
85
+ fetchSummary: fetchWorkspaceAgentSummary
86
+ } = useWorkspaceAgentSummary();
61
87
  const isTelaAgentMode = computed(() => !!embedConfig?.telaAgentId.value);
62
- const hasConfiguredTelaAgentInputs = computed(() => embedConfig?.telaAgentInputs?.value !== void 0 && embedConfig?.telaAgentInputs?.value !== null);
88
+ const hasConfiguredTelaAgentInputs = computed(
89
+ () => embedConfig?.telaAgentInputs?.value !== void 0 && embedConfig?.telaAgentInputs?.value !== null
90
+ );
63
91
  const shouldLoadTelaAgentMetadata = computed(() => isTelaAgentMode.value);
64
92
  const telaAgentInputSchema = computed(
65
93
  () => hasConfiguredTelaAgentInputs.value ? null : isTelaAgentMode.value ? telaAgentMetadata.value?.inputSchema ?? [] : null
@@ -80,7 +108,12 @@ const effectiveWorkspaceSettings = computed(() => {
80
108
  return embedConfig?.workspaceSettings.value !== void 0 ? embedConfig.workspaceSettings.value : workspaceSettingsState.value;
81
109
  });
82
110
  const { closePanel: closeFilesPanel } = useConversationFilesPanel();
83
- const { isOpen: isPreviewPanelOpen, panelWidth: previewPanelWidth, currentFile: currentPreviewFile, closePreview } = useFilePreviewPanel();
111
+ const {
112
+ isOpen: isPreviewPanelOpen,
113
+ panelWidth: previewPanelWidth,
114
+ currentFile: currentPreviewFile,
115
+ closePreview
116
+ } = useFilePreviewPanel();
84
117
  const { isOpen: isCitationPanelOpen } = useCitationPanel();
85
118
  const activeConversationId = ref(
86
119
  normalizeConversationId(props.conversationId) ?? normalizeConversationId(props.initialConversationId)
@@ -96,6 +129,16 @@ const resolvedFeatures = computed(() => resolveChatFeatures(props.features));
96
129
  const dropZoneRef = ref(null);
97
130
  const activeTab = ref("chat");
98
131
  const messageInputRef = ref(null);
132
+ const PROMPT_INPUT_HINTS = [
133
+ { icon: "i-ph-at-bold", label: "Para mencionar arquivos" },
134
+ { char: "/", label: "Para acionar skills" }
135
+ ];
136
+ const resolvedSuggestions = computed(
137
+ () => props.suggestions ?? []
138
+ );
139
+ function applySuggestion(prompt) {
140
+ messageInputRef.value?.setDraft(prompt);
141
+ }
99
142
  const breakpoints = useBreakpoints({ mobile: CHAT_MOBILE_BREAKPOINT });
100
143
  const isMobile = breakpoints.smaller("mobile");
101
144
  const drawerOpen = ref(false);
@@ -133,8 +176,9 @@ const selectedModel = computed({
133
176
  const previousModel = conversation.model;
134
177
  setConversationModel(value);
135
178
  void updateConversationModel(conversation.id, value).then((updated) => {
136
- if (!updated && currentConversation.value?.id === conversation.id && currentConversation.value.model === value)
179
+ if (!updated && currentConversation.value?.id === conversation.id && currentConversation.value.model === value) {
137
180
  setConversationModel(previousModel);
181
+ }
138
182
  });
139
183
  }
140
184
  }
@@ -154,10 +198,16 @@ const mobilePreviewFile = computed(() => {
154
198
  size: file.fileSize
155
199
  };
156
200
  });
157
- const visibleTelaAgentInputSchema = computed(() => !hasMessages.value ? telaAgentInputSchema.value : null);
158
- const visibleTelaAgentInputSchemaLoading = computed(() => !hasMessages.value && isTelaAgentMode.value && !hasConfiguredTelaAgentInputs.value && telaAgentMetadataLoading.value);
201
+ const visibleTelaAgentInputSchema = computed(
202
+ () => !hasMessages.value ? telaAgentInputSchema.value : null
203
+ );
204
+ const visibleTelaAgentInputSchemaLoading = computed(
205
+ () => !hasMessages.value && isTelaAgentMode.value && !hasConfiguredTelaAgentInputs.value && telaAgentMetadataLoading.value
206
+ );
159
207
  const visibleConversations = computed(
160
- () => conversations.value.filter((conversation) => conversation.title || conversation.id === activeConversationId.value)
208
+ () => conversations.value.filter(
209
+ (conversation) => conversation.title || conversation.id === activeConversationId.value
210
+ )
161
211
  );
162
212
  function syncConversationId(nextConversationId) {
163
213
  activeConversationId.value = normalizeConversationId(nextConversationId);
@@ -182,7 +232,10 @@ async function ensureConversationLoaded(conversationId) {
182
232
  try {
183
233
  await loadConversation(conversationId);
184
234
  if (currentConversation.value?.id !== conversationId) {
185
- statusToast.update({ text: "Erro ao carregar conversa", icon: "i-ph-warning" });
235
+ statusToast.update({
236
+ text: "Erro ao carregar conversa",
237
+ icon: "i-ph-warning"
238
+ });
186
239
  return;
187
240
  }
188
241
  startPolling();
@@ -215,29 +268,32 @@ async function openConversation(nextConversationId) {
215
268
  updateConversationId(normalizedConversationId);
216
269
  await ensureConversationLoaded(normalizedConversationId);
217
270
  }
218
- watch(() => props.conversationId, async (nextConversationId) => {
219
- if (nextConversationId === void 0) {
220
- return;
221
- }
222
- const normalizedConversationId = normalizeConversationId(nextConversationId);
223
- if (normalizedConversationId) {
224
- clearPendingConversationGroup();
225
- }
226
- if (!isReady.value) {
271
+ watch(
272
+ () => props.conversationId,
273
+ async (nextConversationId) => {
274
+ if (nextConversationId === void 0) {
275
+ return;
276
+ }
277
+ const normalizedConversationId = normalizeConversationId(nextConversationId);
278
+ if (normalizedConversationId) {
279
+ clearPendingConversationGroup();
280
+ }
281
+ if (!isReady.value) {
282
+ syncConversationId(normalizedConversationId);
283
+ return;
284
+ }
285
+ if (normalizedConversationId === activeConversationId.value && currentConversation.value?.id === normalizedConversationId) {
286
+ return;
287
+ }
288
+ if (!normalizedConversationId) {
289
+ resetConversation(false);
290
+ return;
291
+ }
227
292
  syncConversationId(normalizedConversationId);
228
- return;
229
- }
230
- if (normalizedConversationId === activeConversationId.value && currentConversation.value?.id === normalizedConversationId) {
231
- return;
232
- }
233
- if (!normalizedConversationId) {
234
- resetConversation(false);
235
- return;
293
+ closePreview();
294
+ await ensureConversationLoaded(normalizedConversationId);
236
295
  }
237
- syncConversationId(normalizedConversationId);
238
- closePreview();
239
- await ensureConversationLoaded(normalizedConversationId);
240
- });
296
+ );
241
297
  onMounted(async () => {
242
298
  void fetchConversations();
243
299
  if (shouldLoadTelaAgentMetadata.value) {
@@ -277,23 +333,34 @@ const isSettingsOutdated = computed(() => {
277
333
  if (!rawAppliedAt)
278
334
  return false;
279
335
  const appliedAt = new Date(rawAppliedAt).getTime();
280
- const updatedAt = new Date(effectiveWorkspaceSettings.value.updatedAt).getTime();
336
+ const updatedAt = new Date(
337
+ effectiveWorkspaceSettings.value.updatedAt
338
+ ).getTime();
281
339
  return appliedAt < updatedAt;
282
340
  });
283
341
  const isBannerDismissed = computed(
284
342
  () => currentConversation.value ? dismissedChats.value.has(currentConversation.value.id) : false
285
343
  );
286
- const showOutdatedBanner = computed(() => isSettingsOutdated.value && !isBannerDismissed.value);
287
- const showOutdatedBadge = computed(() => isSettingsOutdated.value && isBannerDismissed.value);
344
+ const showOutdatedBanner = computed(
345
+ () => isSettingsOutdated.value && !isBannerDismissed.value
346
+ );
347
+ const showOutdatedBadge = computed(
348
+ () => isSettingsOutdated.value && isBannerDismissed.value
349
+ );
288
350
  function dismissOutdatedBanner() {
289
351
  if (!currentConversation.value)
290
352
  return;
291
353
  dismissedChats.value.delete(currentConversation.value.id);
292
354
  dismissedChats.value.add(currentConversation.value.id);
293
355
  const nextDismissedChats = [...dismissedChats.value];
294
- dismissedChats.value = new Set(nextDismissedChats.slice(-MAX_DISMISSED_CHAT_IDS));
356
+ dismissedChats.value = new Set(
357
+ nextDismissedChats.slice(-MAX_DISMISSED_CHAT_IDS)
358
+ );
295
359
  try {
296
- localStorage.setItem(dismissedStorageKey.value, JSON.stringify([...dismissedChats.value]));
360
+ localStorage.setItem(
361
+ dismissedStorageKey.value,
362
+ JSON.stringify([...dismissedChats.value])
363
+ );
297
364
  } catch {
298
365
  }
299
366
  }
@@ -306,7 +373,10 @@ const displayTitle = computed(() => {
306
373
  return currentConversation.value?.title ?? "";
307
374
  });
308
375
  watch(
309
- () => [currentConversation.value?.id ?? null, currentConversation.value?.title ?? null],
376
+ () => [
377
+ currentConversation.value?.id ?? null,
378
+ currentConversation.value?.title ?? null
379
+ ],
310
380
  ([conversationId, conversationTitle], [previousConversationId, previousTitle]) => {
311
381
  if (conversationId !== previousConversationId) {
312
382
  optimisticTitle.value = null;
@@ -320,6 +390,13 @@ watch(
320
390
  }
321
391
  }
322
392
  );
393
+ watch(
394
+ () => currentConversation.value?.title ?? null,
395
+ (title) => {
396
+ emit("update:conversationTitle", title);
397
+ },
398
+ { immediate: true }
399
+ );
323
400
  const currentUser = computed(() => props.user ?? authUser.value ?? null);
324
401
  const conversationCreator = computed(
325
402
  () => resolveConversationCreator(currentConversation.value?.userId, {
@@ -329,7 +406,10 @@ const conversationCreator = computed(
329
406
  );
330
407
  async function handleSend(content, files, agentInputs) {
331
408
  let createdConversationId = null;
332
- const resolvedAgentInputs = resolveTelaAgentInputs(agentInputs, embedConfig?.telaAgentInputs?.value);
409
+ const resolvedAgentInputs = resolveTelaAgentInputs(
410
+ agentInputs,
411
+ embedConfig?.telaAgentInputs?.value
412
+ );
333
413
  if (!activeConversationId.value || !currentConversation.value) {
334
414
  const conversation = await createConversation({
335
415
  model: selectedModel.value,
@@ -349,7 +429,11 @@ async function handleSend(content, files, agentInputs) {
349
429
  }
350
430
  if (!currentConversation.value)
351
431
  return;
352
- const sendPromise = sendMessage(content, files.length > 0 ? files : void 0, resolvedAgentInputs);
432
+ const sendPromise = sendMessage(
433
+ content,
434
+ files.length > 0 ? files : void 0,
435
+ resolvedAgentInputs
436
+ );
353
437
  if (createdConversationId) {
354
438
  updateConversationId(createdConversationId);
355
439
  }
@@ -387,8 +471,12 @@ async function handleSignout() {
387
471
  chatAction.emit("signout");
388
472
  await logout();
389
473
  }
390
- const workspaceName = computed(() => activeOrganization.value?.name ?? "Workspace");
391
- const workspaceLogo = computed(() => activeOrganization.value?.logo ?? void 0);
474
+ const workspaceName = computed(
475
+ () => activeOrganization.value?.name ?? "Workspace"
476
+ );
477
+ const workspaceLogo = computed(
478
+ () => activeOrganization.value?.logo ?? void 0
479
+ );
392
480
  function handleTabChange(tab) {
393
481
  activeTab.value = tab;
394
482
  if (tab === "chat")
@@ -398,7 +486,9 @@ const isEditing = ref(false);
398
486
  const editTitle = ref("");
399
487
  const justStartedEditing = ref(false);
400
488
  const showDebugModal = ref(false);
401
- const debugSessionId = computed(() => currentConversation.value?.threadSessionId ?? "Sess\xE3o ainda n\xE3o criada");
489
+ const debugSessionId = computed(
490
+ () => currentConversation.value?.threadSessionId ?? "Sess\xE3o ainda n\xE3o criada"
491
+ );
402
492
  async function copyDebugInfo() {
403
493
  const conversation = currentConversation.value;
404
494
  const conversationId = conversation?.id ?? activeConversationId.value;
@@ -422,7 +512,10 @@ async function copyDebugInfo() {
422
512
  await navigator.clipboard.writeText(JSON.stringify(debugInfo, null, 2));
423
513
  statusToast.update({ text: "Dados de debug copiados", icon: "i-ph-check" });
424
514
  } catch {
425
- statusToast.update({ text: "Erro ao copiar dados de debug", icon: "i-ph-warning" });
515
+ statusToast.update({
516
+ text: "Erro ao copiar dados de debug",
517
+ icon: "i-ph-warning"
518
+ });
426
519
  }
427
520
  }
428
521
  function startEditing() {
@@ -439,7 +532,10 @@ async function saveTitle() {
439
532
  const trimmed = editTitle.value.trim();
440
533
  if (trimmed && trimmed !== currentConversation.value?.title && currentConversation.value) {
441
534
  optimisticTitle.value = trimmed;
442
- const success = await renameConversation(currentConversation.value.id, trimmed);
535
+ const success = await renameConversation(
536
+ currentConversation.value.id,
537
+ trimmed
538
+ );
443
539
  if (!success)
444
540
  optimisticTitle.value = null;
445
541
  }
@@ -510,27 +606,48 @@ async function handleDelete() {
510
606
  sidebarCollapsed ? 'chat-sidebar--collapsed' : ''
511
607
  ]"
512
608
  :style="{ '--chat-sidebar-width': `${sidebarWidth}px` }"
513
- h-full flex-shrink-0 relative
609
+ h-full
610
+ flex-shrink-0
611
+ relative
514
612
  >
515
613
  <div class="chat-sidebar__clip">
516
614
  <div
517
615
  class="chat-sidebar__panel"
518
616
  :inert="sidebarCollapsed || void 0"
519
- h-full flex="~ col"
617
+ h-full
618
+ flex="~ col"
520
619
  bg-neutral-50
521
620
  :style="{ width: `${sidebarWidth}px` }"
522
- :class="sidebarPosition === 'right' ? 'border-l-0.5px border-l-neutral-200' : 'border-r-0.5px border-r-neutral-200'"
621
+ :class="
622
+ sidebarPosition === 'right' ? 'border-l-0.5px border-l-neutral-200' : 'border-r-0.5px border-r-neutral-200'
623
+ "
523
624
  >
524
625
  <div px-12px pt-16px pb-8px flex gap-8px>
525
626
  <button
526
- flex items-center justify-center gap-6px
527
- h-32px px-12px flex-1 min-w-0
528
- bg-white b=".5px neutral-300" rounded-10px
529
- hover:bg-neutral-50 transition-colors cursor-pointer
627
+ flex
628
+ items-center
629
+ justify-center
630
+ gap-6px
631
+ h-32px
632
+ px-12px
633
+ flex-1
634
+ min-w-0
635
+ bg-white
636
+ b=".5px neutral-300"
637
+ rounded-10px
638
+ hover:bg-neutral-50
639
+ transition-colors
640
+ cursor-pointer
530
641
  @click="() => handleNewConversation()"
531
642
  >
532
643
  <span i-ph-chat-circle text-12px text-gray-900 />
533
- <span text-14px font-semibold text-neutral-900 tracking="-.15px" leading-18px>
644
+ <span
645
+ text-14px
646
+ font-semibold
647
+ text-neutral-900
648
+ tracking="-.15px"
649
+ leading-18px
650
+ >
534
651
  Nova conversa
535
652
  </span>
536
653
  </button>
@@ -538,9 +655,13 @@ async function handleDelete() {
538
655
  </div>
539
656
 
540
657
  <div
541
- min-h-0 overflow-y-auto px-4px
658
+ min-h-0
659
+ overflow-y-auto
660
+ px-4px
542
661
  :class="$slots['sidebar-bottom'] ? '' : 'flex-1'"
543
- :style="$slots['sidebar-bottom'] ? { flexGrow: 100 - sidebarBottomHeight, flexBasis: 0 } : void 0"
662
+ :style="
663
+ $slots['sidebar-bottom'] ? { flexGrow: 100 - sidebarBottomHeight, flexBasis: 0 } : void 0
664
+ "
544
665
  >
545
666
  <ChatConversationList
546
667
  :conversations="visibleConversations"
@@ -550,13 +671,13 @@ async function handleDelete() {
550
671
  :reset-conversation="handleNewConversation"
551
672
  :start-conversation="handleNewConversation"
552
673
  :loading="conversationsLoading"
553
- :hide-folder-hint="hideFolderHint"
554
674
  />
555
675
  </div>
556
676
 
557
677
  <div
558
678
  v-if="$slots['sidebar-bottom']"
559
- min-h-0 overflow-y-auto
679
+ min-h-0
680
+ overflow-y-auto
560
681
  b-t=".5px neutral-200"
561
682
  :style="{ flexGrow: sidebarBottomHeight, flexBasis: 0 }"
562
683
  >
@@ -569,7 +690,9 @@ async function handleDelete() {
569
690
  v-if="sidebarCollapsible"
570
691
  type="button"
571
692
  class="chat-sidebar__toggle"
572
- :aria-label="sidebarCollapsed ? 'Expandir conversas' : 'Recolher conversas'"
693
+ :aria-label="
694
+ sidebarCollapsed ? 'Expandir conversas' : 'Recolher conversas'
695
+ "
573
696
  :aria-expanded="!sidebarCollapsed"
574
697
  @click="toggleSidebarCollapsed"
575
698
  >
@@ -578,9 +701,14 @@ async function handleDelete() {
578
701
  </div>
579
702
 
580
703
  <!-- Main content -->
581
- <div flex-1 h-full flex="~ col" overflow-hidden relative style="--chat-panel-offset: 0px">
582
- <div v-if="loading && currentConversation" class="loading-bar" />
583
-
704
+ <div
705
+ flex-1
706
+ h-full
707
+ flex="~ col"
708
+ overflow-hidden
709
+ relative
710
+ style="--chat-panel-offset: 0px"
711
+ >
584
712
  <ChatMobileShell
585
713
  v-if="isMobile"
586
714
  v-model:drawer-open="drawerOpen"
@@ -602,8 +730,8 @@ async function handleDelete() {
602
730
  :has-pending-message="hasPendingMessage"
603
731
  :hide-settings="hideSettings"
604
732
  :hide-sidebar="hideSidebar"
605
- :hide-folder-hint="hideFolderHint"
606
733
  :is-editing="isEditing"
734
+ :suggestions="resolvedSuggestions"
607
735
  :loading="loading"
608
736
  :messages="messages"
609
737
  :agent-input-schema="visibleTelaAgentInputSchema"
@@ -637,10 +765,7 @@ async function handleDelete() {
637
765
  @tab-change="handleTabChange"
638
766
  >
639
767
  <template #loading>
640
- <ChatMessageList
641
- :messages="[]"
642
- loading
643
- />
768
+ <ChatMessageList :messages="[]" loading variant="mobile" />
644
769
  <ChatMessageInput
645
770
  v-model:selected-model="selectedModel"
646
771
  :disabled="true"
@@ -651,43 +776,54 @@ async function handleDelete() {
651
776
  </template>
652
777
 
653
778
  <template #empty>
654
- <div
655
- flex-1 flex="~ col" items-center justify-center gap-40px px-24px
656
- :class="currentConversation ? 'pt-64px' : ''"
779
+ <TelaChatEmptyState
780
+ compact
781
+ :title="`Ol\xE1, ${currentUser?.name?.split(' ')[0] ?? 'usu\xE1rio'}`"
782
+ description="Como posso te ajudar hoje?"
657
783
  >
658
- <div flex="~ col" items-center gap-8px text-center>
659
- <h1 text-24px font-semibold text-gray-800 leading-28px tracking="-.8px">
660
- Olá, {{ currentUser?.name?.split(" ")[0] ?? "usu\xE1rio" }}
661
- </h1>
662
- <p text-16px text-gray-500 leading-20px tracking="-.2px">
663
- Como posso te ajudar hoje?
664
- </p>
665
- </div>
666
- <ChatMessageInput
667
- ref="messageInputRef"
668
- v-model:selected-model="selectedModel"
669
- :disabled="hasPendingMessage"
670
- :loading="hasPendingMessage"
671
- :creator-name="currentUser?.name ?? void 0"
672
- :creator-email="currentConversation?.createdBy ?? currentUser?.email ?? void 0"
673
- :creator-image="currentUser?.image ?? void 0"
674
- :messages="messages"
675
- :conversation-files="conversationFiles"
676
- :workspace-settings="effectiveWorkspaceSettings"
677
- :agent-input-schema="visibleTelaAgentInputSchema"
678
- :agent-input-schema-loading="visibleTelaAgentInputSchemaLoading"
679
- :agent-skills="agentSkills"
680
- :agent-context-files="agentContextFiles"
681
- :show-cancel-button="resolvedFeatures.showCancelButton"
682
- centered
683
- @send="handleSend"
684
- @cancel="cancelConversation"
685
- />
686
- </div>
784
+ <TelaChatSuggestions v-if="resolvedSuggestions.length">
785
+ <TelaChatSuggestion
786
+ v-for="suggestion in resolvedSuggestions"
787
+ :key="suggestion.title"
788
+ :suggestion="suggestion.prompt"
789
+ @click="applySuggestion($event)"
790
+ >
791
+ {{ suggestion.title }}
792
+ </TelaChatSuggestion>
793
+ </TelaChatSuggestions>
794
+
795
+ <TelaChatPromptInputHints size="sm" :hints="PROMPT_INPUT_HINTS" />
796
+
797
+ <template #input>
798
+ <ChatMessageInput
799
+ ref="messageInputRef"
800
+ v-model:selected-model="selectedModel"
801
+ :disabled="hasPendingMessage"
802
+ :loading="hasPendingMessage"
803
+ :creator-name="currentUser?.name ?? void 0"
804
+ :creator-email="
805
+ currentConversation?.createdBy ?? currentUser?.email ?? void 0
806
+ "
807
+ :creator-image="currentUser?.image ?? void 0"
808
+ :messages="messages"
809
+ :conversation-files="conversationFiles"
810
+ :workspace-settings="effectiveWorkspaceSettings"
811
+ :agent-input-schema="visibleTelaAgentInputSchema"
812
+ :agent-input-schema-loading="visibleTelaAgentInputSchemaLoading"
813
+ :agent-skills="agentSkills"
814
+ :agent-context-files="agentContextFiles"
815
+ :show-cancel-button="resolvedFeatures.showCancelButton"
816
+ centered
817
+ @send="handleSend"
818
+ @cancel="cancelConversation"
819
+ />
820
+ </template>
821
+ </TelaChatEmptyState>
687
822
  </template>
688
823
 
689
824
  <ChatMessageList
690
825
  :messages="messages"
826
+ variant="mobile"
691
827
  @retry="handleRetry"
692
828
  />
693
829
  <ChatMessageInput
@@ -696,7 +832,9 @@ async function handleDelete() {
696
832
  :disabled="hasPendingMessage"
697
833
  :loading="hasPendingMessage"
698
834
  :creator-name="currentUser?.name ?? void 0"
699
- :creator-email="currentConversation?.createdBy ?? currentUser?.email ?? void 0"
835
+ :creator-email="
836
+ currentConversation?.createdBy ?? currentUser?.email ?? void 0
837
+ "
700
838
  :creator-image="currentUser?.image ?? void 0"
701
839
  :messages="messages"
702
840
  :conversation-files="conversationFiles"
@@ -710,13 +848,10 @@ async function handleDelete() {
710
848
  @send="handleSend"
711
849
  @cancel="cancelConversation"
712
850
  />
713
- <p text-center text-12px font-400 leading-16px text-tertiary my-8px>
714
- As respostas podem conter erros. Verifique documentos originais.
715
- </p>
716
851
  </ChatMobileShell>
717
852
 
718
853
  <ChatTopbar
719
- v-if="currentConversation && !isMobile"
854
+ v-if="currentConversation && !isMobile && !compact"
720
855
  :title="displayTitle"
721
856
  :creator-name="conversationCreator?.name ?? void 0"
722
857
  :creator-email="currentConversation.createdBy ?? void 0"
@@ -745,7 +880,12 @@ async function handleDelete() {
745
880
 
746
881
  <div
747
882
  v-if="!isMobile && showOutdatedBanner"
748
- mt-64px flex items-center h-36px px-12px bg="#FFF1D8"
883
+ flex
884
+ items-center
885
+ h-36px
886
+ px-12px
887
+ bg="#FFF1D8"
888
+ :class="compact ? '' : 'mt-64px'"
749
889
  >
750
890
  <div flex items-center gap-8px flex-1>
751
891
  <span i-ph-warning text-12px text-gray-900 shrink-0 />
@@ -758,17 +898,27 @@ async function handleDelete() {
758
898
  </div>
759
899
  <div flex items-center gap-24px shrink-0>
760
900
  <button
761
- flex items-center gap-4px px-10px py-4px
762
- b=".5px gray-500" rounded-8px
763
- class="hover:bg-white/50" transition-colors
901
+ flex
902
+ items-center
903
+ gap-4px
904
+ px-10px
905
+ py-4px
906
+ b=".5px gray-500"
907
+ rounded-8px
908
+ class="hover:bg-white/50"
909
+ transition-colors
764
910
  @click="() => handleNewConversation()"
765
911
  >
766
912
  <span i-ph-plus text-12px text-gray-900 />
767
913
  <span text-12px font-580 text-gray-900 leading-16px>Nova conversa</span>
768
914
  </button>
769
915
  <button
770
- flex items-center justify-center
771
- class="hover:bg-black/5" transition-colors rounded-4px
916
+ flex
917
+ items-center
918
+ justify-center
919
+ class="hover:bg-black/5"
920
+ transition-colors
921
+ rounded-4px
772
922
  @click="dismissOutdatedBanner"
773
923
  >
774
924
  <span i-ph-x text-12px text-gray-900 />
@@ -776,11 +926,17 @@ async function handleDelete() {
776
926
  </div>
777
927
  </div>
778
928
 
779
- <template v-if="!isMobile && activeTab === 'files' && currentConversation">
929
+ <template
930
+ v-if="!isMobile && activeTab === 'files' && currentConversation"
931
+ >
780
932
  <ChatFilesView :conversation-id="currentConversation.id" />
781
933
  </template>
782
934
 
783
- <template v-else-if="!isMobile && activeTab === 'usage' && resolvedFeatures.showUsageTab && currentConversation">
935
+ <template
936
+ v-else-if="
937
+ !isMobile && activeTab === 'usage' && resolvedFeatures.showUsageTab && currentConversation
938
+ "
939
+ >
784
940
  <ChatUsageView
785
941
  :conversation-id="currentConversation.id"
786
942
  :created-at="currentConversation.createdAt"
@@ -788,10 +944,14 @@ async function handleDelete() {
788
944
  />
789
945
  </template>
790
946
 
791
- <template v-else-if="!isMobile && loading">
947
+ <TelaChatBody
948
+ v-else-if="!isMobile && loading"
949
+ :variant="compact ? 'widget' : 'page'"
950
+ >
792
951
  <ChatMessageList
793
952
  :messages="[]"
794
953
  loading
954
+ :variant="compact ? 'widget' : 'page'"
795
955
  />
796
956
  <ChatMessageInput
797
957
  v-model:selected-model="selectedModel"
@@ -800,28 +960,43 @@ async function handleDelete() {
800
960
  :agent-input-schema-loading="visibleTelaAgentInputSchemaLoading"
801
961
  :show-cancel-button="resolvedFeatures.showCancelButton"
802
962
  />
803
- </template>
963
+ </TelaChatBody>
804
964
 
805
- <template v-else-if="!isMobile && !hasMessages">
806
- <div
807
- flex-1 flex="~ col" items-center justify-center gap-40px px-24px
808
- :class="currentConversation ? 'pt-64px' : ''"
809
- >
810
- <div flex="~ col" items-center gap-8px text-center>
811
- <h1 text-24px font-semibold text-gray-800 leading-28px tracking="-.8px">
812
- Olá, {{ currentUser?.name?.split(" ")[0] ?? "usu\xE1rio" }}
813
- </h1>
814
- <p text-16px text-gray-500 leading-20px tracking="-.2px">
815
- Como posso te ajudar hoje?
816
- </p>
817
- </div>
965
+ <!-- Outside TelaChatBody on purpose: the body pins any [data-chat-prompt-input]
966
+ to its bottom edge, which would tear the input out of the empty-state stack. -->
967
+ <TelaChatEmptyState
968
+ v-else-if="!isMobile && !hasMessages"
969
+ :compact="compact"
970
+ :title="`Ol\xE1, ${currentUser?.name?.split(' ')[0] ?? 'usu\xE1rio'}`"
971
+ description="Como posso te ajudar hoje?"
972
+ :class="currentConversation && !compact ? 'pt-64px' : ''"
973
+ >
974
+ <TelaChatSuggestions v-if="resolvedSuggestions.length">
975
+ <TelaChatSuggestion
976
+ v-for="suggestion in resolvedSuggestions"
977
+ :key="suggestion.title"
978
+ :suggestion="suggestion.prompt"
979
+ @click="applySuggestion($event)"
980
+ >
981
+ {{ suggestion.title }}
982
+ </TelaChatSuggestion>
983
+ </TelaChatSuggestions>
984
+
985
+ <TelaChatPromptInputHints
986
+ :size="compact ? 'sm' : 'md'"
987
+ :hints="PROMPT_INPUT_HINTS"
988
+ />
989
+
990
+ <template #input>
818
991
  <ChatMessageInput
819
992
  ref="messageInputRef"
820
993
  v-model:selected-model="selectedModel"
821
994
  :disabled="hasPendingMessage"
822
995
  :loading="hasPendingMessage"
823
996
  :creator-name="currentUser?.name ?? void 0"
824
- :creator-email="currentConversation?.createdBy ?? currentUser?.email ?? void 0"
997
+ :creator-email="
998
+ currentConversation?.createdBy ?? currentUser?.email ?? void 0
999
+ "
825
1000
  :creator-image="currentUser?.image ?? void 0"
826
1001
  :messages="messages"
827
1002
  :conversation-files="conversationFiles"
@@ -835,12 +1010,16 @@ async function handleDelete() {
835
1010
  @send="handleSend"
836
1011
  @cancel="cancelConversation"
837
1012
  />
838
- </div>
839
- </template>
1013
+ </template>
1014
+ </TelaChatEmptyState>
840
1015
 
841
- <template v-else-if="!isMobile">
1016
+ <TelaChatBody
1017
+ v-else-if="!isMobile"
1018
+ :variant="compact ? 'widget' : 'page'"
1019
+ >
842
1020
  <ChatMessageList
843
1021
  :messages="messages"
1022
+ :variant="compact ? 'widget' : 'page'"
844
1023
  @retry="handleRetry"
845
1024
  />
846
1025
  <ChatMessageInput
@@ -849,7 +1028,9 @@ async function handleDelete() {
849
1028
  :disabled="hasPendingMessage"
850
1029
  :loading="hasPendingMessage"
851
1030
  :creator-name="currentUser?.name ?? void 0"
852
- :creator-email="currentConversation?.createdBy ?? currentUser?.email ?? void 0"
1031
+ :creator-email="
1032
+ currentConversation?.createdBy ?? currentUser?.email ?? void 0
1033
+ "
853
1034
  :creator-image="currentUser?.image ?? void 0"
854
1035
  :messages="messages"
855
1036
  :conversation-files="conversationFiles"
@@ -863,10 +1044,7 @@ async function handleDelete() {
863
1044
  @send="handleSend"
864
1045
  @cancel="cancelConversation"
865
1046
  />
866
- <p text-center text-12px font-400 leading-16px text-tertiary my-8px>
867
- As respostas podem conter erros. Verifique documentos originais.
868
- </p>
869
- </template>
1047
+ </TelaChatBody>
870
1048
 
871
1049
  <Transition name="fade">
872
1050
  <div
@@ -874,10 +1052,23 @@ async function handleDelete() {
874
1052
  class="absolute inset-0 z-50 flex items-center justify-center bg-white/90 backdrop-blur-sm"
875
1053
  >
876
1054
  <div
877
- flex="~ col" items-center gap-16px p-40px rounded-24px
878
- border="2 dashed gray-300" bg-gray-50
1055
+ flex="~ col"
1056
+ items-center
1057
+ gap-16px
1058
+ p-40px
1059
+ rounded-24px
1060
+ border="2 dashed gray-300"
1061
+ bg-gray-50
879
1062
  >
880
- <div w-64px h-64px rounded-full bg-gray-100 flex items-center justify-center>
1063
+ <div
1064
+ w-64px
1065
+ h-64px
1066
+ rounded-full
1067
+ bg-gray-100
1068
+ flex
1069
+ items-center
1070
+ justify-center
1071
+ >
881
1072
  <span i-ph-upload-simple text-32px text-gray-500 />
882
1073
  </div>
883
1074
  <div text-center>
@@ -901,7 +1092,8 @@ async function handleDelete() {
901
1092
  @confirm="handleDelete"
902
1093
  @cancel="showDeleteModal = false"
903
1094
  >
904
- Tem certeza que deseja excluir esta conversa? Esta ação não pode ser desfeita.
1095
+ Tem certeza que deseja excluir esta conversa? Esta ação não pode ser
1096
+ desfeita.
905
1097
  </TelaConfirmationModal>
906
1098
 
907
1099
  <TelaModal
@@ -918,11 +1110,13 @@ async function handleDelete() {
918
1110
  Conversation Id
919
1111
  </p>
920
1112
  <div
921
- px-12px py-10px
1113
+ px-12px
1114
+ py-10px
922
1115
  rounded-8px
923
1116
  bg-gray-50
924
1117
  justify-between
925
- flex items-center
1118
+ flex
1119
+ items-center
926
1120
  border="0.5px gray-200"
927
1121
  >
928
1122
  <p text-13px text-gray-700 break-all leading-18px>
@@ -936,11 +1130,13 @@ async function handleDelete() {
936
1130
  Session Id
937
1131
  </p>
938
1132
  <div
939
- px-12px py-10px
1133
+ px-12px
1134
+ py-10px
940
1135
  rounded-8px
941
1136
  bg-gray-50
942
1137
  justify-between
943
- flex items-center
1138
+ flex
1139
+ items-center
944
1140
  border="0.5px gray-200"
945
1141
  >
946
1142
  <p text-13px text-gray-700 break-all leading-18px>
@@ -955,7 +1151,13 @@ async function handleDelete() {
955
1151
  <p text-12px font-400 leading-16px text-tertiary>
956
1152
  Inclui os ids da conversa e os links de debug no Datadog e no Tela
957
1153
  </p>
958
- <TelaButton variant="primary" icon="i-ph-copy" leading flex-shrink-0 @click="copyDebugInfo">
1154
+ <TelaButton
1155
+ variant="primary"
1156
+ icon="i-ph-copy"
1157
+ leading
1158
+ flex-shrink-0
1159
+ @click="copyDebugInfo"
1160
+ >
959
1161
  Copiar dados completos
960
1162
  </TelaButton>
961
1163
  </div>
@@ -971,7 +1173,9 @@ async function handleDelete() {
971
1173
 
972
1174
  <div
973
1175
  v-if="isPreviewPanelOpen && !isMobile"
974
- h-full flex-shrink-0 pt-64px
1176
+ h-full
1177
+ flex-shrink-0
1178
+ pt-64px
975
1179
  :style="{ width: `${previewPanelWidth}px` }"
976
1180
  >
977
1181
  <FilePreviewPanel />
@@ -979,14 +1183,19 @@ async function handleDelete() {
979
1183
 
980
1184
  <div
981
1185
  v-if="isCitationPanelOpen && !isMobile"
982
- h-full flex-shrink-0 pt-64px
1186
+ h-full
1187
+ flex-shrink-0
1188
+ pt-64px
983
1189
  w-440px
984
1190
  >
985
1191
  <CitationDocumentPanel />
986
1192
  </div>
987
1193
  <div
988
1194
  v-else-if="isCitationPanelOpen && isMobile"
989
- fixed inset-0 z-50 bg-neutral-50
1195
+ fixed
1196
+ inset-0
1197
+ z-50
1198
+ bg-neutral-50
990
1199
  >
991
1200
  <CitationDocumentPanel />
992
1201
  </div>
@@ -994,5 +1203,9 @@ async function handleDelete() {
994
1203
  </template>
995
1204
 
996
1205
  <style scoped>
997
- .loading-bar{animation:loading-pulse 1.5s ease-in-out infinite;background:linear-gradient(90deg,transparent,#ea580b,#fb923c,#fdba74,transparent);background-size:200% 100%;height:4px;left:0;position:absolute;right:0;top:0;z-index:100}@keyframes loading-pulse{0%{background-position:200% 0}to{background-position:-200% 0}}.fade-enter-active,.fade-leave-active{transition:opacity .2s ease}.fade-enter-from,.fade-leave-to{opacity:0}.chat-sidebar{width:var(--chat-sidebar-width)}.chat-sidebar__clip{display:flex;height:100%;width:100%}.chat-sidebar__panel{flex:none}.chat-sidebar--collapsible{min-width:0;transition:width .26s cubic-bezier(.2,.8,.2,1)}.chat-sidebar--collapsible .chat-sidebar__clip{overflow:hidden}.chat-sidebar--collapsible.chat-sidebar--right .chat-sidebar__clip{justify-content:flex-end}.chat-sidebar--collapsible .chat-sidebar__panel{transition:opacity .2s ease}.chat-sidebar--collapsed{width:0}.chat-sidebar--collapsed .chat-sidebar__panel{opacity:0}.chat-sidebar__toggle{align-items:center;background:#fff;border:.5px solid #e5e5e5;border-radius:8px;box-shadow:0 1px 2px rgba(16,24,40,.06);cursor:pointer;display:flex;height:44px;justify-content:center;padding:0;position:absolute;top:50%;transition:transform .26s cubic-bezier(.2,.8,.2,1),background-color .12s ease;width:20px;z-index:20}.chat-sidebar__toggle:hover{background:#fafafa}.chat-sidebar--right .chat-sidebar__toggle{left:0;transform:translate(-50%,-50%)}.chat-sidebar--right.chat-sidebar--collapsed .chat-sidebar__toggle{transform:translate(-100%,-50%)}.chat-sidebar--left .chat-sidebar__toggle{right:0;transform:translate(50%,-50%)}.chat-sidebar--left.chat-sidebar--collapsed .chat-sidebar__toggle{transform:translate(100%,-50%)}@media (prefers-reduced-motion:reduce){.chat-sidebar__clip,.chat-sidebar__panel,.chat-sidebar__toggle{transition:none}}
1206
+ .chat-sidebar{width:var(--chat-sidebar-width)}.chat-sidebar__clip{display:flex;height:100%;width:100%}.chat-sidebar__panel{flex:none}.chat-sidebar--collapsible{min-width:0;transition:width .26s cubic-bezier(.2,.8,.2,1)}.chat-sidebar--collapsible .chat-sidebar__clip{overflow:hidden}.chat-sidebar--collapsible.chat-sidebar--right .chat-sidebar__clip{justify-content:flex-end}.chat-sidebar--collapsible .chat-sidebar__panel{transition:opacity .2s ease}.chat-sidebar--collapsed{width:0}.chat-sidebar--collapsed .chat-sidebar__panel{opacity:0}.chat-sidebar__toggle{align-items:center;background:#fff;border:.5px solid #e5e5e5;border-radius:8px;box-shadow:0 1px 2px rgba(16,24,40,.06);cursor:pointer;display:flex;height:44px;justify-content:center;padding:0;position:absolute;top:50%;transition:transform .26s cubic-bezier(.2,.8,.2,1),background-color .12s ease;width:20px;z-index:20}.chat-sidebar__toggle:hover{background:#fafafa}.chat-sidebar--right .chat-sidebar__toggle{left:0;transform:translate(-50%,-50%)}.chat-sidebar--right.chat-sidebar--collapsed .chat-sidebar__toggle{transform:translate(-100%,-50%)}.chat-sidebar--left .chat-sidebar__toggle{right:0;transform:translate(50%,-50%)}.chat-sidebar--left.chat-sidebar--collapsed .chat-sidebar__toggle{transform:translate(100%,-50%)}@media (prefers-reduced-motion:reduce){.chat-sidebar__clip,.chat-sidebar__panel,.chat-sidebar__toggle{transition:none}}
1207
+ </style>
1208
+
1209
+ <style>
1210
+ [data-chat-body][data-variant=page] [data-chat-prompt-input]{margin-inline:auto!important;max-width:700px}
998
1211
  </style>