@huyooo/ai-chat-frontend-vue 0.1.6 → 0.1.7

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 (159) hide show
  1. package/README.md +367 -0
  2. package/dist/adapter.d.ts +7 -7
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/components/ChatPanel.vue.d.ts +120 -9
  5. package/dist/components/ChatPanel.vue.d.ts.map +1 -1
  6. package/dist/components/common/ConfirmDialog.vue.d.ts +30 -0
  7. package/dist/components/common/ConfirmDialog.vue.d.ts.map +1 -0
  8. package/dist/components/common/CopyButton.vue.d.ts +18 -0
  9. package/dist/components/common/CopyButton.vue.d.ts.map +1 -0
  10. package/dist/components/common/IndexingSettings.vue.d.ts +3 -0
  11. package/dist/components/common/IndexingSettings.vue.d.ts.map +1 -0
  12. package/dist/components/common/SettingsPanel.vue.d.ts +16 -0
  13. package/dist/components/common/SettingsPanel.vue.d.ts.map +1 -0
  14. package/dist/components/common/Toast.vue.d.ts +18 -0
  15. package/dist/components/common/Toast.vue.d.ts.map +1 -0
  16. package/dist/components/common/ToggleSwitch.vue.d.ts +10 -0
  17. package/dist/components/common/ToggleSwitch.vue.d.ts.map +1 -0
  18. package/dist/components/{chat/ui → header}/ChatHeader.vue.d.ts +5 -3
  19. package/dist/components/header/ChatHeader.vue.d.ts.map +1 -0
  20. package/dist/components/input/AtFilePicker.vue.d.ts +21 -0
  21. package/dist/components/input/AtFilePicker.vue.d.ts.map +1 -0
  22. package/dist/components/{ChatInput.vue.d.ts → input/ChatInput.vue.d.ts} +16 -14
  23. package/dist/components/input/ChatInput.vue.d.ts.map +1 -0
  24. package/dist/components/input/DropdownSelector.vue.d.ts +42 -0
  25. package/dist/components/input/DropdownSelector.vue.d.ts.map +1 -0
  26. package/dist/components/input/ImagePreviewModal.vue.d.ts +17 -0
  27. package/dist/components/input/ImagePreviewModal.vue.d.ts.map +1 -0
  28. package/dist/components/input/at-views/AtBranchView.vue.d.ts +18 -0
  29. package/dist/components/input/at-views/AtBranchView.vue.d.ts.map +1 -0
  30. package/dist/components/input/at-views/AtBrowserView.vue.d.ts +18 -0
  31. package/dist/components/input/at-views/AtBrowserView.vue.d.ts.map +1 -0
  32. package/dist/components/input/at-views/AtChatsView.vue.d.ts +18 -0
  33. package/dist/components/input/at-views/AtChatsView.vue.d.ts.map +1 -0
  34. package/dist/components/input/at-views/AtDocsView.vue.d.ts +18 -0
  35. package/dist/components/input/at-views/AtDocsView.vue.d.ts.map +1 -0
  36. package/dist/components/input/at-views/AtFilesView.vue.d.ts +23 -0
  37. package/dist/components/input/at-views/AtFilesView.vue.d.ts.map +1 -0
  38. package/dist/components/input/at-views/AtTerminalsView.vue.d.ts +18 -0
  39. package/dist/components/input/at-views/AtTerminalsView.vue.d.ts.map +1 -0
  40. package/dist/components/message/MessageBubble.vue.d.ts +45 -0
  41. package/dist/components/message/MessageBubble.vue.d.ts.map +1 -0
  42. package/dist/components/message/PartsRenderer.vue.d.ts +15 -0
  43. package/dist/components/message/PartsRenderer.vue.d.ts.map +1 -0
  44. package/dist/components/message/WelcomeMessage.vue.d.ts +14 -0
  45. package/dist/components/message/WelcomeMessage.vue.d.ts.map +1 -0
  46. package/dist/components/message/blocks/CodeBlock.vue.d.ts +11 -0
  47. package/dist/components/message/blocks/CodeBlock.vue.d.ts.map +1 -0
  48. package/dist/components/{chat/SearchResultBlock.vue.d.ts → message/blocks/TextBlock.vue.d.ts} +3 -4
  49. package/dist/components/message/blocks/TextBlock.vue.d.ts.map +1 -0
  50. package/dist/components/message/blocks/index.d.ts +6 -0
  51. package/dist/components/message/blocks/index.d.ts.map +1 -0
  52. package/dist/components/message/parts/CollapsibleCard.vue.d.ts +45 -0
  53. package/dist/components/message/parts/CollapsibleCard.vue.d.ts.map +1 -0
  54. package/dist/components/{chat/ToolCallBlock.vue.d.ts → message/parts/ErrorPart.vue.d.ts} +4 -5
  55. package/dist/components/message/parts/ErrorPart.vue.d.ts.map +1 -0
  56. package/dist/components/{chat/ThinkingBlock.vue.d.ts → message/parts/ImagePart.vue.d.ts} +3 -3
  57. package/dist/components/message/parts/ImagePart.vue.d.ts.map +1 -0
  58. package/dist/components/message/parts/SearchPart.vue.d.ts +12 -0
  59. package/dist/components/message/parts/SearchPart.vue.d.ts.map +1 -0
  60. package/dist/components/{chat/messages/ExecutionSteps.vue.d.ts → message/parts/TextPart.vue.d.ts} +2 -9
  61. package/dist/components/message/parts/TextPart.vue.d.ts.map +1 -0
  62. package/dist/components/message/parts/ThinkingPart.vue.d.ts +12 -0
  63. package/dist/components/message/parts/ThinkingPart.vue.d.ts.map +1 -0
  64. package/dist/components/message/parts/ToolCallPart.vue.d.ts +19 -0
  65. package/dist/components/message/parts/ToolCallPart.vue.d.ts.map +1 -0
  66. package/dist/components/message/parts/ToolResultPart.vue.d.ts +14 -0
  67. package/dist/components/message/parts/ToolResultPart.vue.d.ts.map +1 -0
  68. package/dist/components/message/parts/index.d.ts +12 -0
  69. package/dist/components/message/parts/index.d.ts.map +1 -0
  70. package/dist/components/message/tool-results/DefaultToolResult.vue.d.ts +4 -0
  71. package/dist/components/message/tool-results/DefaultToolResult.vue.d.ts.map +1 -0
  72. package/dist/components/message/tool-results/SearchResults.vue.d.ts +4 -0
  73. package/dist/components/message/tool-results/SearchResults.vue.d.ts.map +1 -0
  74. package/dist/components/message/tool-results/WeatherCard.vue.d.ts +4 -0
  75. package/dist/components/message/tool-results/WeatherCard.vue.d.ts.map +1 -0
  76. package/dist/components/message/tool-results/index.d.ts +7 -0
  77. package/dist/components/message/tool-results/index.d.ts.map +1 -0
  78. package/dist/components/message/welcome-types.d.ts +28 -0
  79. package/dist/components/message/welcome-types.d.ts.map +1 -0
  80. package/dist/composables/useChat.d.ts +99 -44
  81. package/dist/composables/useChat.d.ts.map +1 -1
  82. package/dist/composables/useImageUpload.d.ts +55 -0
  83. package/dist/composables/useImageUpload.d.ts.map +1 -0
  84. package/dist/index.d.ts +25 -26
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +55871 -1252
  87. package/dist/style.css +1 -1
  88. package/dist/types/index.d.ts +113 -53
  89. package/dist/types/index.d.ts.map +1 -1
  90. package/dist/utils/fileIcon.d.ts +13 -0
  91. package/dist/utils/fileIcon.d.ts.map +1 -0
  92. package/package.json +12 -6
  93. package/src/adapter.ts +12 -70
  94. package/src/components/ChatPanel.vue +329 -110
  95. package/src/components/common/ConfirmDialog.vue +208 -0
  96. package/src/components/common/CopyButton.vue +71 -0
  97. package/src/components/common/IndexingSettings.vue +580 -0
  98. package/src/components/common/SettingsPanel.vue +293 -0
  99. package/src/components/common/Toast.vue +90 -0
  100. package/src/components/common/ToggleSwitch.vue +75 -0
  101. package/src/components/{chat/ui → header}/ChatHeader.vue +170 -93
  102. package/src/components/input/AtFilePicker.vue +657 -0
  103. package/src/components/input/ChatInput.vue +653 -0
  104. package/src/components/input/DropdownSelector.vue +322 -0
  105. package/src/components/input/ImagePreviewModal.vue +238 -0
  106. package/src/components/input/at-views/AtBranchView.vue +63 -0
  107. package/src/components/input/at-views/AtBrowserView.vue +63 -0
  108. package/src/components/input/at-views/AtChatsView.vue +63 -0
  109. package/src/components/input/at-views/AtDocsView.vue +63 -0
  110. package/src/components/input/at-views/AtFilesView.vue +255 -0
  111. package/src/components/input/at-views/AtTerminalsView.vue +63 -0
  112. package/src/components/message/ContentRenderer.vue +61 -0
  113. package/src/components/message/MessageBubble.vue +411 -0
  114. package/src/components/message/PartsRenderer.vue +101 -0
  115. package/src/components/message/ToolResultRenderer.vue +27 -0
  116. package/src/components/message/WelcomeMessage.vue +308 -0
  117. package/src/components/message/blocks/CodeBlock.vue +113 -0
  118. package/src/components/message/blocks/TextBlock.vue +21 -0
  119. package/src/components/message/blocks/index.ts +6 -0
  120. package/src/components/message/parts/CollapsibleCard.vue +135 -0
  121. package/src/components/message/parts/ErrorPart.vue +51 -0
  122. package/src/components/message/parts/ImagePart.vue +98 -0
  123. package/src/components/message/parts/SearchPart.vue +101 -0
  124. package/src/components/message/parts/TextPart.vue +28 -0
  125. package/src/components/message/parts/ThinkingPart.vue +54 -0
  126. package/src/components/message/parts/ToolCallPart.vue +460 -0
  127. package/src/components/message/parts/ToolResultPart.vue +78 -0
  128. package/src/components/message/parts/index.ts +13 -0
  129. package/src/components/message/tool-results/DefaultToolResult.vue +43 -0
  130. package/src/components/message/tool-results/SearchResults.vue +133 -0
  131. package/src/components/message/tool-results/WeatherCard.vue +139 -0
  132. package/src/components/message/tool-results/index.ts +7 -0
  133. package/src/components/message/welcome-types.ts +47 -0
  134. package/src/composables/useChat.ts +807 -155
  135. package/src/composables/useImageUpload.ts +228 -0
  136. package/src/index.ts +93 -46
  137. package/src/styles.css +47 -0
  138. package/src/types/index.ts +146 -98
  139. package/src/utils/fileIcon.ts +49 -0
  140. package/dist/components/ChatInput.vue.d.ts.map +0 -1
  141. package/dist/components/chat/SearchResultBlock.vue.d.ts.map +0 -1
  142. package/dist/components/chat/ThinkingBlock.vue.d.ts.map +0 -1
  143. package/dist/components/chat/ToolCallBlock.vue.d.ts.map +0 -1
  144. package/dist/components/chat/messages/ExecutionSteps.vue.d.ts.map +0 -1
  145. package/dist/components/chat/messages/MessageBubble.vue.d.ts +0 -28
  146. package/dist/components/chat/messages/MessageBubble.vue.d.ts.map +0 -1
  147. package/dist/components/chat/ui/ChatHeader.vue.d.ts.map +0 -1
  148. package/dist/components/chat/ui/WelcomeMessage.vue.d.ts +0 -7
  149. package/dist/components/chat/ui/WelcomeMessage.vue.d.ts.map +0 -1
  150. package/dist/preload/preload.d.ts +0 -6
  151. package/dist/preload/preload.d.ts.map +0 -1
  152. package/src/components/ChatInput.vue +0 -649
  153. package/src/components/chat/SearchResultBlock.vue +0 -155
  154. package/src/components/chat/ThinkingBlock.vue +0 -109
  155. package/src/components/chat/ToolCallBlock.vue +0 -213
  156. package/src/components/chat/messages/ExecutionSteps.vue +0 -281
  157. package/src/components/chat/messages/MessageBubble.vue +0 -272
  158. package/src/components/chat/ui/WelcomeMessage.vue +0 -135
  159. package/src/preload/preload.ts +0 -79
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .chat-header[data-v-fd156e6a]{display:flex;align-items:center;height:40px;padding:0 12px;background:var(--chat-header-bg, #1e1e1e);border-bottom:1px solid var(--chat-border, #333);flex-shrink:0}.tabs-container[data-v-fd156e6a]{display:flex;align-items:center;gap:4px;flex:1;overflow-x:auto;padding-right:8px}.tabs-container[data-v-fd156e6a]::-webkit-scrollbar{display:none}.tab-item[data-v-fd156e6a]{position:relative;display:flex;align-items:center;gap:4px;padding:4px 8px;background:transparent;border:none;border-radius:4px;color:var(--chat-text-muted, #888);font-size:13px;font-weight:500;cursor:pointer;transition:all .15s;white-space:nowrap;max-width:120px;flex-shrink:0}.tab-item[data-v-fd156e6a]:hover{color:var(--chat-text, #ccc)}.tab-item.active[data-v-fd156e6a]{background:var(--chat-muted, #3c3c3c);color:var(--chat-text, #fff)}.tab-title[data-v-fd156e6a]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tab-close[data-v-fd156e6a]{display:none;width:16px;height:16px;padding:0;background:transparent;border:none;border-radius:2px;color:var(--chat-text-muted, #888);cursor:pointer;align-items:center;justify-content:center;flex-shrink:0}.tab-item:hover .tab-close[data-v-fd156e6a]{display:flex}.tab-close[data-v-fd156e6a]:hover{color:var(--chat-text, #fff);background:var(--chat-muted, #444)}.header-actions[data-v-fd156e6a]{display:flex;align-items:center;gap:2px;flex-shrink:0}.icon-btn[data-v-fd156e6a]{display:flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;background:transparent;border:none;border-radius:4px;color:var(--chat-text-muted, #888);cursor:pointer;transition:all .15s}.icon-btn[data-v-fd156e6a]:hover,.icon-btn.active[data-v-fd156e6a]{color:var(--chat-text, #fff)}.icon-btn.small[data-v-fd156e6a]{width:20px;height:20px}.dropdown-container[data-v-fd156e6a]{position:relative}.dropdown-panel[data-v-fd156e6a]{position:absolute;top:100%;right:0;margin-top:4px;background:var(--chat-dropdown-bg, #252526);border:1px solid rgba(255,255,255,.1);border-radius:8px;box-shadow:0 4px 16px #0006;z-index:100;overflow:hidden}.history-panel[data-v-fd156e6a]{width:280px}.more-panel[data-v-fd156e6a]{width:200px;padding:4px}.panel-header[data-v-fd156e6a]{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid var(--chat-border, #333);font-size:12px;font-weight:500;color:var(--chat-text-muted, #888)}.panel-content[data-v-fd156e6a]{max-height:300px;overflow-y:auto}.history-item[data-v-fd156e6a]{display:flex;align-items:center;gap:8px;padding:10px 12px;cursor:pointer;transition:background .15s}.history-item[data-v-fd156e6a]:hover{background:#ffffff14}.history-item.active[data-v-fd156e6a]{background:#ffffff1a}.history-title[data-v-fd156e6a]{flex:1;font-size:13px;color:var(--chat-text, #ccc);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.history-date[data-v-fd156e6a]{font-size:11px;color:var(--chat-text-muted, #666);flex-shrink:0}.history-delete[data-v-fd156e6a]{display:none;width:20px;height:20px;padding:0;background:transparent;border:none;border-radius:4px;color:var(--chat-text-muted, #666);cursor:pointer;align-items:center;justify-content:center;flex-shrink:0}.history-item:hover .history-delete[data-v-fd156e6a]{display:flex}.history-delete[data-v-fd156e6a]:hover{color:var(--chat-destructive, #ef4444);background:var(--chat-destructive, #ef444420)}.empty-state[data-v-fd156e6a]{padding:20px;text-align:center;font-size:13px;color:var(--chat-text-muted, #666)}.menu-item[data-v-fd156e6a]{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;background:transparent;border:none;border-radius:4px;font-size:13px;color:var(--chat-text-muted, #999);cursor:pointer;transition:all .15s;text-align:left}.menu-item[data-v-fd156e6a]:hover{background:#ffffff14;color:var(--chat-text, #ccc)}.menu-divider[data-v-fd156e6a]{height:1px;background:var(--chat-border, #333);margin:4px 0}.welcome-message[data-v-f478d3aa]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:32px 20px;text-align:center}.welcome-icon[data-v-f478d3aa]{display:flex;align-items:center;justify-content:center;width:80px;height:80px;background:#ffffff1a;border-radius:20px;color:var(--chat-text, #ccc);margin-bottom:20px}.welcome-title[data-v-f478d3aa]{font-size:20px;font-weight:600;color:var(--chat-text, #ccc);margin-bottom:8px}.welcome-desc[data-v-f478d3aa]{font-size:14px;color:var(--chat-text-muted, #888);margin-bottom:24px}.quick-actions[data-v-f478d3aa]{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;max-width:320px}.quick-btn[data-v-f478d3aa]{display:flex;align-items:center;gap:6px;padding:8px 14px;background:var(--chat-muted, #2d2d2d);border:1px solid var(--chat-border, #444);border-radius:8px;color:var(--chat-text, #ccc);font-size:13px;cursor:pointer;transition:all .15s}.quick-btn[data-v-f478d3aa]:hover{background:#ffffff1a;border-color:#fff3}.quick-icon[data-v-f478d3aa]{color:var(--chat-text-muted, #888)}.quick-btn:hover .quick-icon[data-v-f478d3aa]{color:var(--chat-text, #fff)}.chat-input[data-v-79ec50ab]{padding:12px}.chat-input.message-variant[data-v-79ec50ab]{padding:0;margin-bottom:16px}.input-container[data-v-79ec50ab]{display:flex;flex-direction:column;background:var(--chat-input-bg, #2d2d2d);border:1px solid var(--chat-border, #444);border-radius:12px;padding:12px;transition:border-color .15s}.input-container.focused[data-v-79ec50ab]{border-color:#fff3}.attachment-preview[data-v-79ec50ab]{margin-bottom:8px}.preview-images[data-v-79ec50ab]{display:flex;gap:6px;flex-wrap:wrap}.preview-item[data-v-79ec50ab]{position:relative}.preview-thumb[data-v-79ec50ab]{width:48px;height:48px;object-fit:cover;border-radius:8px;border:1px solid var(--chat-border, #444)}.preview-more[data-v-79ec50ab]{display:flex;align-items:center;justify-content:center;width:48px;height:48px;background:var(--chat-muted, #3c3c3c);border-radius:8px;color:var(--chat-text-muted, #888);font-size:12px}.remove-btn[data-v-79ec50ab]{position:absolute;top:-4px;right:-4px;width:16px;height:16px;display:flex;align-items:center;justify-content:center;background:var(--chat-bg, #1e1e1e);border:1px solid var(--chat-border, #444);border-radius:50%;color:var(--chat-text-muted, #888);cursor:pointer;padding:0}.remove-btn[data-v-79ec50ab]:hover{background:var(--chat-muted, #3c3c3c);color:var(--chat-text, #ccc)}.input-field-wrapper[data-v-79ec50ab]{margin-bottom:8px}.input-field[data-v-79ec50ab]{width:100%;background:transparent;border:none;padding:0;color:var(--chat-text, #ccc);font-size:14px;resize:none;min-height:24px;max-height:150px;line-height:1.5;font-family:inherit}.input-field[data-v-79ec50ab]:focus{outline:none}.input-field[data-v-79ec50ab]::placeholder{color:var(--chat-text-muted, #666)}.input-controls[data-v-79ec50ab]{display:flex;align-items:center;justify-content:space-between;gap:8px}.input-left[data-v-79ec50ab]{display:flex;align-items:center;gap:4px}.selector[data-v-79ec50ab]{position:relative;display:flex;align-items:center;gap:4px;padding:4px 8px;background:var(--chat-muted, #3c3c3c);border:none;border-radius:6px;font-size:12px;color:var(--chat-text-muted, #888);cursor:pointer;transition:all .15s}.selector[data-v-79ec50ab]:hover{background:var(--chat-muted-hover, #444);color:var(--chat-text, #ccc)}.chevron[data-v-79ec50ab]{color:var(--chat-text-muted, #666)}.dropdown-menu[data-v-79ec50ab]{position:absolute;bottom:100%;left:0;margin-bottom:4px;min-width:160px;background:var(--chat-dropdown-bg, #252526);border:1px solid rgba(255,255,255,.1);border-radius:8px;box-shadow:0 4px 16px #0006;z-index:100;padding:4px}.dropdown-item[data-v-79ec50ab]{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;border:none;background:transparent;border-radius:4px;font-size:13px;color:var(--chat-text-muted, #999);cursor:pointer;transition:all .15s}.dropdown-item[data-v-79ec50ab]:hover{background:#ffffff14;color:var(--chat-text, #ccc)}.dropdown-item.active[data-v-79ec50ab]{background:#ffffff1a;color:var(--chat-text, #fff)}.check-icon[data-v-79ec50ab]{margin-left:auto;color:var(--chat-text, #ccc)}.input-right[data-v-79ec50ab]{display:flex;align-items:center;gap:2px}.icon-btn[data-v-79ec50ab]{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:transparent;border:none;border-radius:6px;color:var(--chat-text-muted, #666);cursor:pointer;transition:all .15s}.icon-btn[data-v-79ec50ab]:hover{color:var(--chat-text, #ccc)}.toggle-btn[data-v-79ec50ab]{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:transparent;border:none;border-radius:6px;color:var(--chat-text-muted, #666);cursor:pointer;transition:all .15s}.toggle-btn[data-v-79ec50ab]:hover{color:var(--chat-text, #ccc)}.toggle-btn.active[data-v-79ec50ab]{color:var(--chat-text, #fff);background:#ffffff1a}.send-btn[data-v-79ec50ab]{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:#ffffffe6;border:none;border-radius:6px;color:#1e1e1e;cursor:pointer;transition:all .15s}.send-btn[data-v-79ec50ab]:hover{background:#fff}.send-btn.loading[data-v-79ec50ab]{background:var(--chat-destructive, #ef4444)}.send-btn.loading[data-v-79ec50ab]:hover{background:var(--chat-destructive-hover, #dc2626)}.execution-steps[data-v-5ad7fab1]{display:flex;flex-direction:column;gap:4px;margin-bottom:8px}.step[data-v-5ad7fab1]{background:var(--chat-muted, #2d2d2d);border-radius:8px;overflow:hidden}.step-header[data-v-5ad7fab1]{display:flex;align-items:center;gap:8px;padding:8px 12px;cursor:pointer;transition:background .15s}.step-header[data-v-5ad7fab1]:hover{background:var(--chat-muted-hover, #3a3a3a)}.step-icon[data-v-5ad7fab1]{display:flex;align-items:center;justify-content:center;width:20px;height:20px;color:var(--chat-text-muted, #888)}.step-title[data-v-5ad7fab1]{flex:1;font-size:13px;color:var(--chat-text, #ccc)}.step-chevron[data-v-5ad7fab1]{color:var(--chat-text-muted, #666);transition:transform .2s}.step-chevron.expanded[data-v-5ad7fab1]{transform:rotate(180deg)}.step-content[data-v-5ad7fab1]{padding:8px 12px 12px;border-top:1px solid var(--chat-border, #333);margin-top:4px}.thinking-content[data-v-5ad7fab1]{font-size:13px;line-height:1.6;color:var(--chat-text-muted, #999);white-space:pre-wrap;word-break:break-word}.search-results[data-v-5ad7fab1]{display:flex;flex-direction:column;gap:8px}.search-result[data-v-5ad7fab1]{display:flex;flex-direction:column;gap:2px;padding:8px;background:var(--chat-bg, #1e1e1e);border-radius:6px;text-decoration:none;transition:background .15s}.search-result[data-v-5ad7fab1]:hover{background:var(--chat-muted-hover, #333)}.result-title[data-v-5ad7fab1]{font-size:13px;color:var(--chat-text, #ccc);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result:hover .result-title[data-v-5ad7fab1]{color:var(--chat-text, #fff)}.result-url[data-v-5ad7fab1]{font-size:11px;color:var(--chat-text-muted, #666)}.tool-result[data-v-5ad7fab1]{font-size:12px;line-height:1.5;color:var(--chat-text-muted, #999);background:var(--chat-bg, #1e1e1e);padding:8px;border-radius:6px;overflow-x:auto;white-space:pre-wrap;word-break:break-word;font-family:SF Mono,Monaco,monospace;margin:0}.animate-spin[data-v-5ad7fab1]{animation:spin-5ad7fab1 1s linear infinite}@keyframes spin-5ad7fab1{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.text-green[data-v-5ad7fab1]{color:var(--chat-success, #22c55e)}.text-red[data-v-5ad7fab1]{color:var(--chat-destructive, #ef4444)}.message-bubble[data-v-bb746e4b]{padding:8px 0;animation:fadeIn-bb746e4b .2s ease}@keyframes fadeIn-bb746e4b{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.message-bubble.user[data-v-bb746e4b]{width:100%}.user-content[data-v-bb746e4b]{width:100%;background:var(--chat-muted, #2d2d2d);color:var(--chat-text, #ccc);padding:12px;border-radius:12px;border:1px solid var(--chat-border, #444)}.user-text[data-v-bb746e4b]{font-size:14px;line-height:1.5;white-space:pre-wrap;word-break:break-word}.user-images[data-v-bb746e4b]{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}.user-image[data-v-bb746e4b]{width:80px;height:80px;object-fit:cover;border-radius:8px;cursor:pointer;transition:transform .15s}.user-image[data-v-bb746e4b]:hover{transform:scale(1.05)}.message-bubble.assistant[data-v-bb746e4b]{position:relative}.assistant-content[data-v-bb746e4b]{max-width:100%}.assistant-text[data-v-bb746e4b]{font-size:14px;line-height:1.7;color:var(--chat-text, #ccc);font-weight:500;letter-spacing:.01em}.assistant-text[data-v-bb746e4b] .code-block{background:var(--chat-code-bg, #1f2937);color:var(--chat-code-text, #e5e7eb);padding:12px;border-radius:8px;margin:8px 0;overflow-x:auto;font-family:SF Mono,Monaco,monospace;font-size:13px}.assistant-text[data-v-bb746e4b] .inline-code{background:var(--chat-muted, #3c3c3c);color:var(--chat-text, #e5e7eb);padding:2px 6px;border-radius:4px;font-family:SF Mono,Monaco,monospace;font-size:13px}.loading-indicator[data-v-bb746e4b]{display:flex;gap:4px;padding:8px 0}.loading-dot[data-v-bb746e4b]{width:6px;height:6px;background:var(--chat-text-muted, #666);border-radius:50%;animation:pulse-bb746e4b 1.4s ease-in-out infinite}.loading-dot[data-v-bb746e4b]:nth-child(2){animation-delay:.2s}.loading-dot[data-v-bb746e4b]:nth-child(3){animation-delay:.4s}@keyframes pulse-bb746e4b{0%,to{opacity:.4;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}.message-actions[data-v-bb746e4b]{display:flex;gap:4px;margin-top:8px;justify-content:flex-end}.action-btn[data-v-bb746e4b]{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;color:var(--chat-text-muted, #666);cursor:pointer;transition:all .15s}.action-btn[data-v-bb746e4b]:hover{background:var(--chat-muted, #3c3c3c);color:var(--chat-text, #ccc)}.chat-panel[data-v-2332ad8f]{display:flex;flex-direction:column;width:420px;height:100%;background:var(--chat-bg, #1e1e1e);border-left:1px solid var(--chat-border, #333);flex-shrink:0;overflow:hidden}.messages-container[data-v-2332ad8f]{flex:1;min-height:0;overflow-y:auto;padding:12px;scroll-behavior:smooth}.messages-container[data-v-2332ad8f]::-webkit-scrollbar{width:6px}.messages-container[data-v-2332ad8f]::-webkit-scrollbar-track{background:transparent}.messages-container[data-v-2332ad8f]::-webkit-scrollbar-thumb{background:var(--chat-scrollbar, rgba(255, 255, 255, .2));border-radius:3px}.messages-container[data-v-2332ad8f]::-webkit-scrollbar-thumb:hover{background:var(--chat-scrollbar-hover, rgba(255, 255, 255, .3))}.thinking-block[data-v-318aa171]{margin:8px 0;background:var(--chat-muted, #2d2d2d);border-radius:8px;overflow:hidden}.thinking-header[data-v-318aa171]{display:flex;align-items:center;gap:8px;width:100%;padding:10px 12px;border:none;background:transparent;cursor:pointer;transition:background .15s}.thinking-header[data-v-318aa171]:hover{background:var(--chat-muted-hover, #3a3a3a)}.thinking-icon[data-v-318aa171]{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:#ffffff1a;border-radius:50%;color:var(--chat-text, #ccc)}.spinning[data-v-318aa171]{animation:spin-318aa171 1s linear infinite}@keyframes spin-318aa171{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.thinking-title[data-v-318aa171]{flex:1;text-align:left;font-size:13px;color:var(--chat-text, #ccc);font-weight:500}.chevron[data-v-318aa171]{color:var(--chat-text-muted, #666);transition:transform .2s}.chevron.rotated[data-v-318aa171]{transform:rotate(180deg)}.thinking-content[data-v-318aa171]{padding:8px 12px 12px;border-top:1px solid var(--chat-border, #333);margin-top:4px}.thinking-text[data-v-318aa171]{font-size:13px;color:var(--chat-text-muted, #999);line-height:1.6;white-space:pre-wrap;word-break:break-word}.tool-call-block[data-v-7098f4a3]{margin:8px 0;background:var(--chat-muted, #2d2d2d);border-radius:8px;overflow:hidden}.tool-header[data-v-7098f4a3]{display:flex;align-items:center;gap:8px;padding:10px 12px;cursor:pointer;transition:background .15s}.tool-header[data-v-7098f4a3]:hover{background:var(--chat-muted-hover, #3a3a3a)}.tool-icon[data-v-7098f4a3]{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:var(--chat-muted, #3c3c3c);border-radius:4px;color:var(--chat-text-muted, #888)}.running .tool-icon[data-v-7098f4a3]{background:#ffffff1a;color:var(--chat-text, #ccc)}.success .tool-icon[data-v-7098f4a3]{background:var(--chat-success, #22c55e20);color:var(--chat-success, #22c55e)}.error .tool-icon[data-v-7098f4a3]{background:var(--chat-destructive, #ef444420);color:var(--chat-destructive, #ef4444)}.spinning[data-v-7098f4a3]{animation:spin-7098f4a3 1s linear infinite}@keyframes spin-7098f4a3{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.tool-name[data-v-7098f4a3]{flex:1;font-size:13px;font-weight:500;color:var(--chat-text, #ccc)}.chevron[data-v-7098f4a3]{color:var(--chat-text-muted, #666);transition:transform .2s}.chevron.rotated[data-v-7098f4a3]{transform:rotate(180deg)}.tool-args[data-v-7098f4a3]{padding:8px 12px;border-top:1px solid var(--chat-border, #333)}.arg-item[data-v-7098f4a3]{display:flex;gap:8px;font-size:12px;line-height:1.6}.arg-key[data-v-7098f4a3]{color:var(--chat-text-muted, #888);font-weight:500}.arg-value[data-v-7098f4a3]{color:var(--chat-text, #ccc);font-family:SF Mono,Monaco,monospace;word-break:break-all}.tool-result[data-v-7098f4a3]{border-top:1px solid var(--chat-border, #333);padding:8px 12px;background:var(--chat-bg, #1e1e1e)}.tool-result pre[data-v-7098f4a3]{margin:0;font-size:12px;color:var(--chat-text-muted, #999);white-space:pre-wrap;word-break:break-word;font-family:SF Mono,Monaco,monospace;max-height:200px;overflow-y:auto}.search-block[data-v-f1490d29]{margin:8px 0;background:var(--chat-muted, #2d2d2d);border-radius:8px;overflow:hidden}.search-header[data-v-f1490d29]{display:flex;align-items:center;gap:8px;padding:10px 12px;cursor:pointer;transition:background .15s}.search-header[data-v-f1490d29]:hover{background:var(--chat-muted-hover, #3a3a3a)}.search-icon[data-v-f1490d29]{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:#ffffff1a;border-radius:50%;color:var(--chat-text, #ccc)}.spinning[data-v-f1490d29]{animation:spin-f1490d29 1s linear infinite}@keyframes spin-f1490d29{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.search-title[data-v-f1490d29]{flex:1;font-size:13px;font-weight:500;color:var(--chat-text, #ccc)}.chevron[data-v-f1490d29]{color:var(--chat-text-muted, #666);transition:transform .2s}.chevron.rotated[data-v-f1490d29]{transform:rotate(180deg)}.search-results[data-v-f1490d29]{border-top:1px solid var(--chat-border, #333);padding:8px;display:flex;flex-direction:column;gap:6px}.result-item[data-v-f1490d29]{display:flex;flex-direction:column;gap:2px;padding:8px;background:var(--chat-bg, #1e1e1e);border-radius:6px;text-decoration:none;transition:background .15s}.result-item[data-v-f1490d29]:hover{background:var(--chat-muted-hover, #333)}.result-title[data-v-f1490d29]{font-size:13px;color:var(--chat-text, #ccc);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.result-item:hover .result-title[data-v-f1490d29]{color:var(--chat-text, #fff)}.result-url[data-v-f1490d29]{font-size:11px;color:var(--chat-text-muted, #666)}
1
+ .markdown-content{font-size:15px;line-height:1.75;color:var(--chat-text, #e4e4e7);word-break:break-word;overflow-wrap:break-word;letter-spacing:.01em}.markdown-content p{margin:1em 0;line-height:1.75}.markdown-content p:first-child{margin-top:0}.markdown-content p:last-child{margin-bottom:0}.markdown-content h1,.markdown-content h2,.markdown-content h3,.markdown-content h4,.markdown-content h5,.markdown-content h6{margin-top:1em;margin-bottom:.5em;font-weight:600;line-height:1.4;color:var(--chat-text, #e4e4e7);letter-spacing:-.01em}.markdown-content h1:first-child,.markdown-content h2:first-child,.markdown-content h3:first-child,.markdown-content h4:first-child,.markdown-content h5:first-child,.markdown-content h6:first-child{margin-top:0}.markdown-content h1{font-size:2em;font-weight:700}.markdown-content h2{font-size:1.5em}.markdown-content h3{font-size:1.25em}.markdown-content h4{font-size:1.1em}.markdown-content h5{font-size:1em}.markdown-content h6{font-size:.9em;color:var(--chat-text-muted, #a1a1aa)}.markdown-content ul,.markdown-content ol{margin:1em 0;padding-left:2em;line-height:1.75}.markdown-content li{margin:.4em 0;line-height:1.75}.markdown-content li>p{margin:.4em 0}.markdown-content ul{list-style-type:disc}.markdown-content ol{list-style-type:decimal}.markdown-content ul ul,.markdown-content ol ol,.markdown-content ul ol,.markdown-content ol ul{margin:.3em 0}.markdown-content ul ul{list-style-type:circle}.markdown-content ul ul ul{list-style-type:square}.markdown-content code{background:var(--chat-muted, #2a2a2a);padding:.2em .4em;border-radius:4px;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;font-size:.9em;color:var(--chat-code-text, #f4f4f5);font-weight:500}.markdown-content pre{background:transparent;border:1px solid var(--chat-border, rgba(255, 255, 255, .1));border-radius:8px;padding:16px;overflow-x:auto;margin:1em 0;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;font-size:14px;line-height:1.6;position:relative}.markdown-content pre::-webkit-scrollbar{width:6px;height:6px}.markdown-content pre::-webkit-scrollbar-track{background:transparent}.markdown-content pre::-webkit-scrollbar-thumb{background:var(--chat-scrollbar, rgba(255, 255, 255, .2));border-radius:3px}.markdown-content pre::-webkit-scrollbar-thumb:hover{background:var(--chat-scrollbar-hover, rgba(255, 255, 255, .3))}.markdown-content pre code{background:transparent;padding:0;border-radius:0;font-size:inherit;color:inherit;border:none;font-weight:400}.markdown-code-block{background:transparent;border:1px solid var(--chat-border, rgba(255, 255, 255, .1));border-radius:8px;padding:16px;overflow-x:auto;margin:1em 0;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;font-size:14px;line-height:1.6;position:relative}.markdown-code-block::-webkit-scrollbar{width:6px;height:6px}.markdown-code-block::-webkit-scrollbar-track{background:transparent}.markdown-code-block::-webkit-scrollbar-thumb{background:var(--chat-scrollbar, rgba(255, 255, 255, .2));border-radius:3px}.markdown-code-block::-webkit-scrollbar-thumb:hover{background:var(--chat-scrollbar-hover, rgba(255, 255, 255, .3))}.markdown-code-block code{background:transparent;padding:0;border-radius:0;font-size:inherit;color:var(--chat-code-text, #f4f4f5);border:none;font-weight:400}.markdown-code-block .hljs-keyword{color:#c678dd}.markdown-code-block .hljs-string{color:#98c379}.markdown-code-block .hljs-number{color:#d19a66}.markdown-code-block .hljs-comment{color:#5c6370;font-style:italic}.markdown-code-block .hljs-function{color:#61afef}.markdown-code-block .hljs-class{color:#e5c07b}.markdown-code-block .hljs-variable{color:#e06c75}.markdown-code-block .hljs-operator{color:#56b6c2}.markdown-code-block .hljs-punctuation{color:#abb2bf}.markdown-code-block .hljs-property{color:#e06c75}.markdown-code-block .hljs-attr{color:#d19a66}.markdown-code-block .hljs-built_in{color:#e5c07b}.markdown-code-block .hljs-title{color:#61afef}.markdown-code-block .hljs-params{color:#abb2bf}.markdown-code-block .hljs-literal{color:#56b6c2}.markdown-code-block .hljs-type{color:#e5c07b}.markdown-content blockquote{margin:1em 0;padding:.5em 1em;border-left:4px solid var(--chat-primary, #3b82f6);background:var(--chat-muted, #2a2a2a);border-radius:0 4px 4px 0;color:var(--chat-text, #e4e4e7)}.markdown-content blockquote p{margin:.5em 0}.markdown-content blockquote p:first-child{margin-top:0}.markdown-content blockquote p:last-child{margin-bottom:0}.markdown-content .markdown-table-wrapper{width:100%;overflow-x:auto;margin:1em 0;border-radius:8px}.markdown-content .markdown-table-wrapper::-webkit-scrollbar{width:6px;height:6px}.markdown-content .markdown-table-wrapper::-webkit-scrollbar-track{background:transparent}.markdown-content .markdown-table-wrapper::-webkit-scrollbar-thumb{background:var(--chat-scrollbar, rgba(255, 255, 255, .2));border-radius:3px}.markdown-content .markdown-table-wrapper::-webkit-scrollbar-thumb:hover{background:var(--chat-scrollbar-hover, rgba(255, 255, 255, .3))}.markdown-table{width:100%;border-collapse:separate;border-spacing:0;margin:0;font-size:.95em;border:1px solid var(--chat-border, #333);border-radius:8px;overflow:hidden}.markdown-table thead{display:table-header-group}.markdown-table th{padding:.875em 1em;text-align:left;font-weight:600;color:var(--chat-text, #ccc);border-bottom:1px solid var(--chat-border, #333);border-right:1px solid var(--chat-border, #333);border-top:none;background:transparent}.markdown-table th:last-child{border-right:none}.markdown-table tbody{display:table-row-group}.markdown-table td{padding:.875em 1em;text-align:left;color:var(--chat-text, #ccc);border-bottom:1px solid var(--chat-border, #333);border-right:1px solid var(--chat-border, #333);border-top:none;vertical-align:top}.markdown-table td:last-child{border-right:none}.markdown-table tbody tr:last-child td{border-bottom:none}.markdown-table tbody tr{transition:opacity .15s ease}.markdown-table td img,.markdown-table td svg,.markdown-table th img,.markdown-table th svg{vertical-align:middle;margin-right:.5em;display:inline-block}.markdown-table td .progress,.markdown-table td .stars{display:inline-flex;align-items:center;gap:.25em}.markdown-table td code,.markdown-table th code{font-size:.85em;padding:.15em .35em}@media(max-width:768px){.markdown-table{font-size:13px;border-radius:6px}.markdown-table th,.markdown-table td{padding:.6em .8em}}.markdown-link{color:var(--chat-link, #60a5fa);text-decoration:none;border-bottom:1px solid transparent;transition:all .2s ease;font-weight:500}.markdown-link:hover{color:var(--chat-link, #3b82f6);border-bottom-color:var(--chat-link, #3b82f6)}.markdown-content img{max-width:100%;height:auto;border-radius:6px;margin:1em 0;box-shadow:0 2px 8px #0003}.markdown-content hr{border:none;border-top:1px solid var(--chat-border, rgba(255, 255, 255, .1));margin:1em 0;height:0}.markdown-content strong{font-weight:600;color:var(--chat-text, #e4e4e7)}.markdown-content em{font-style:italic;color:var(--chat-text, #e4e4e7)}.markdown-content u{text-decoration:underline;text-decoration-color:var(--chat-text-muted, #a1a1aa);text-underline-offset:.15em}.markdown-content s{text-decoration:line-through;opacity:.7;color:var(--chat-text-muted, #a1a1aa)}.markdown-content .markdown-task-item{list-style-type:disc}.markdown-content .markdown-task-checkbox{font-size:1em;color:var(--chat-text, #e4e4e7);-webkit-user-select:none;user-select:none}.markdown-content dl{margin:1em 0}.markdown-content dt{font-weight:600;margin-top:.8em;color:var(--chat-text, #e4e4e7)}.markdown-content dd{margin:.4em 0 .8em 2em;color:var(--chat-text-muted, #a1a1aa)}.markdown-code-block .line-numbers{padding-right:1em;border-right:1px solid var(--chat-border, rgba(255, 255, 255, .1));margin-right:1em;-webkit-user-select:none;user-select:none;opacity:.5}:root{--chat-bg: #1e1e1e;--chat-header-bg: #1e1e1e;--chat-input-bg: #2d2d2d;--chat-dropdown-bg: #252526;--chat-muted: #2d2d2d;--chat-muted-hover: #3c3c3c;--chat-border: #333;--chat-text: #ccc;--chat-text-muted: #888;--chat-primary: #2563eb;--chat-primary-hover: #1d4ed8;--chat-destructive: #ef4444;--chat-destructive-hover: #dc2626;--chat-success: #22c55e;--chat-code-bg: #1f2937;--chat-code-text: #e5e7eb;--chat-scrollbar: rgba(255, 255, 255, .2);--chat-scrollbar-hover: rgba(255, 255, 255, .3)}.chat-scrollbar::-webkit-scrollbar{width:6px}.chat-scrollbar::-webkit-scrollbar-track{background:transparent}.chat-scrollbar::-webkit-scrollbar-thumb{background:var(--chat-scrollbar, rgba(255, 255, 255, .2));border-radius:3px}.chat-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--chat-scrollbar-hover, rgba(255, 255, 255, .3))}.chat-header[data-v-b5a58a06]{display:flex;align-items:center;height:40px;padding:0 12px;background:var(--chat-header-bg, #1e1e1e);border-bottom:1px solid var(--chat-border, #333);flex-shrink:0}.tabs-container[data-v-b5a58a06]{display:flex;align-items:center;gap:4px;flex:1;overflow-x:auto;padding-right:8px}.tabs-container[data-v-b5a58a06]::-webkit-scrollbar{display:none}.tab-item[data-v-b5a58a06]{position:relative;display:flex;align-items:center;padding:4px 8px;background:transparent;border:none;border-radius:4px;color:var(--chat-text-muted, #888);font-size:14px;font-weight:500;cursor:pointer;transition:all .15s;white-space:nowrap;max-width:120px;flex-shrink:0}.tab-item[data-v-b5a58a06]:hover{color:var(--chat-text, #ccc)}.tab-item.active[data-v-b5a58a06]{background:var(--chat-muted, #3c3c3c);color:var(--chat-text, #fff)}.tab-title[data-v-b5a58a06]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tab-close[data-v-b5a58a06]{position:absolute;right:0;top:0;bottom:0;display:flex;align-items:center;justify-content:center;width:32px;padding:0 0 0 8px;background:linear-gradient(to right,transparent,var(--chat-bg, #1e1e1e) 50%);border:none;border-radius:0 4px 4px 0;color:var(--chat-text-muted, #666);cursor:pointer;transition:all .15s;opacity:0}.tab-item:hover .tab-close[data-v-b5a58a06]{opacity:1}.tab-item.active .tab-close[data-v-b5a58a06]{background:linear-gradient(to right,transparent,var(--chat-muted, #3c3c3c) 50%)}.tab-close[data-v-b5a58a06]:hover{color:var(--chat-text, #fff)}.header-actions[data-v-b5a58a06]{display:flex;align-items:center;gap:2px;flex-shrink:0}.icon-btn[data-v-b5a58a06]{display:flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;background:transparent;border:none;border-radius:4px;color:var(--chat-text-muted, #888);cursor:pointer;transition:all .15s}.icon-btn[data-v-b5a58a06]:hover,.icon-btn.active[data-v-b5a58a06]{color:var(--chat-text, #fff)}.icon-btn.small[data-v-b5a58a06]{width:20px;height:20px}.dropdown-container[data-v-b5a58a06]{position:relative}.dropdown-panel[data-v-b5a58a06]{position:absolute;top:100%;right:0;margin-top:4px;background:var(--chat-dropdown-bg, #252526);border:1px solid rgba(255,255,255,.1);border-radius:8px;box-shadow:0 4px 16px #0006;z-index:100;overflow:hidden}.history-panel[data-v-b5a58a06]{width:360px}.more-panel[data-v-b5a58a06]{width:200px;padding:4px}.panel-header[data-v-b5a58a06]{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid var(--chat-border, #333);font-size:14px;font-weight:500;color:var(--chat-text-muted, #888)}.panel-content[data-v-b5a58a06]{max-height:400px;overflow-y:auto}.history-group-label[data-v-b5a58a06]{padding:8px 12px 4px;font-size:14px;font-weight:500;color:var(--chat-text-muted, #666)}.history-group-label[data-v-b5a58a06]:not(:first-child){border-top:1px solid var(--chat-border, #333);margin-top:4px;padding-top:12px}.history-item[data-v-b5a58a06]{display:flex;align-items:center;gap:4px;padding:6px 12px;cursor:pointer;transition:background .15s}.history-item[data-v-b5a58a06]:hover{background:#ffffff14}.history-item.active[data-v-b5a58a06]{background:#ffffff1a}.history-title[data-v-b5a58a06]{flex:1;font-size:14px;color:var(--chat-text, #ccc);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.history-time[data-v-b5a58a06]{font-size:14px;color:var(--chat-text-muted, #666);flex-shrink:0;margin-right:10px}.history-actions[data-v-b5a58a06]{display:flex;align-items:center;gap:2px;flex-shrink:0;opacity:0;transition:opacity .15s}.history-item:hover .history-actions[data-v-b5a58a06]{opacity:1}.history-action-btn[data-v-b5a58a06]{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;border:none;border-radius:6px;color:var(--chat-text-muted, #666);cursor:pointer;transition:all .15s}.history-action-btn[data-v-b5a58a06]:hover{color:var(--chat-text, #fff)}.history-action-btn.delete[data-v-b5a58a06]:hover{color:var(--chat-destructive, #ef4444)}.empty-state[data-v-b5a58a06]{padding:20px;text-align:center;font-size:14px;color:var(--chat-text-muted, #666)}.menu-item[data-v-b5a58a06]{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;background:transparent;border:none;border-radius:4px;font-size:14px;color:var(--chat-text-muted, #999);cursor:pointer;transition:all .15s;text-align:left}.menu-item[data-v-b5a58a06]:hover{background:#ffffff14;color:var(--chat-text, #ccc)}.menu-divider[data-v-b5a58a06]{height:1px;background:var(--chat-border, #333);margin:4px 0}.welcome-message[data-v-73f17e4c]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:28px;padding:40px 24px;max-width:640px;margin:0 auto;min-height:100%}.welcome-header[data-v-73f17e4c]{display:flex;flex-direction:column;align-items:center;text-align:center;gap:8px}.welcome-title-row[data-v-73f17e4c]{display:flex;align-items:center;gap:10px}.welcome-icon[data-v-73f17e4c]{color:var(--chat-text-muted, #888)}.welcome-title[data-v-73f17e4c]{font-size:24px;font-weight:600;color:var(--chat-text, #fff);margin:0}.welcome-subtitle[data-v-73f17e4c]{font-size:13px;color:var(--chat-text-muted, #888);margin:0}.section-header[data-v-73f17e4c]{display:flex;align-items:center;gap:6px;margin-bottom:12px;padding-left:2px}.section-icon[data-v-73f17e4c]{color:var(--chat-text-muted, #666)}.section-title[data-v-73f17e4c]{font-size:12px;font-weight:500;color:var(--chat-text-muted, #888);text-transform:uppercase;letter-spacing:.5px}.features-section[data-v-73f17e4c]{width:100%}.features-list[data-v-73f17e4c]{display:flex;flex-wrap:wrap;gap:8px;justify-content:center}.feature-tag[data-v-73f17e4c]{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:var(--chat-muted, #2a2a2a);border:1px solid var(--chat-border, #3a3a3a);border-radius:20px;font-size:12px;color:var(--chat-text, #ccc);transition:all .15s}.feature-tag[data-v-73f17e4c]:hover{background:#ffffff14;border-color:#ffffff26}.feature-icon[data-v-73f17e4c]{color:var(--chat-text-muted, #888)}.tasks-section[data-v-73f17e4c]{width:100%}.tasks-grid[data-v-73f17e4c]{display:grid;gap:10px}.tasks-single[data-v-73f17e4c]{grid-template-columns:minmax(200px,320px);justify-content:center}.tasks-two[data-v-73f17e4c]{grid-template-columns:repeat(2,1fr)}.tasks-three[data-v-73f17e4c]{grid-template-columns:repeat(3,1fr)}.tasks-multi[data-v-73f17e4c]{grid-template-columns:repeat(2,1fr)}.task-card[data-v-73f17e4c]{display:flex;align-items:center;gap:10px;padding:12px 14px;background:var(--chat-muted, #2a2a2a);border:1px solid var(--chat-border, #3a3a3a);border-radius:10px;color:var(--chat-text, #ccc);text-align:left;cursor:pointer;transition:all .2s}.task-card[data-v-73f17e4c]:hover{background:#ffffff14;border-color:#3b82f680;transform:translateY(-1px);box-shadow:0 4px 12px #00000026}.task-icon[data-v-73f17e4c]{flex-shrink:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:#3b82f626;border-radius:8px;color:#60a5fa}.task-card:hover .task-icon[data-v-73f17e4c]{background:#3b82f640}.task-content[data-v-73f17e4c]{flex:1;min-width:0}.task-name[data-v-73f17e4c]{font-size:13px;font-weight:500;color:var(--chat-text, #fff);margin-bottom:2px}.task-desc[data-v-73f17e4c]{font-size:11px;color:var(--chat-text-muted, #888);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.task-arrow[data-v-73f17e4c]{flex-shrink:0;color:var(--chat-text-muted, #666);opacity:0;transform:translate(-4px);transition:all .2s}.task-card:hover .task-arrow[data-v-73f17e4c]{opacity:1;transform:translate(0)}@media(max-width:540px){.welcome-message[data-v-73f17e4c]{padding:32px 16px;gap:24px}.welcome-title[data-v-73f17e4c]{font-size:24px}.tasks-two[data-v-73f17e4c],.tasks-three[data-v-73f17e4c],.tasks-multi[data-v-73f17e4c]{grid-template-columns:1fr}.task-arrow[data-v-73f17e4c]{display:none}}.at-files-view[data-v-1b1ef833]{display:flex;flex-direction:column}.at-view-section-title[data-v-1b1ef833]{font-size:11px;color:#888;padding:6px 8px 4px;text-transform:uppercase;letter-spacing:.5px}.at-view-pathbar[data-v-1b1ef833]{display:flex;align-items:center;gap:4px;padding:4px 8px 8px}.at-view-pathbtn[data-v-1b1ef833]{width:22px;height:22px;border-radius:4px;background:transparent;border:1px solid rgba(255,255,255,.1);color:#999;cursor:pointer;display:flex;align-items:center;justify-content:center}.at-view-pathbtn[data-v-1b1ef833]:hover{background:#ffffff0f;color:#ccc}.at-view-pathtext[data-v-1b1ef833]{flex:1;min-width:0;font-size:11px;color:#777;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.at-view-list[data-v-1b1ef833]{display:flex;flex-direction:column;gap:1px}.at-view-item[data-v-1b1ef833]{display:flex;align-items:center;gap:8px;text-align:left;padding:7px 10px;border-radius:6px;border:1px solid transparent;background:transparent;cursor:pointer;color:#ccc;width:100%}.at-view-item[data-v-1b1ef833]:hover{background:#ffffff0f}.at-view-item.active[data-v-1b1ef833]{background:#3b82f626;border-color:#3b82f64d}.at-view-item-icon[data-v-1b1ef833]{color:#999;flex-shrink:0}.at-view-item-name[data-v-1b1ef833]{font-size:13px;color:#ddd;flex-shrink:0;max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.at-view-item-path[data-v-1b1ef833]{font-size:11px;color:#555;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.at-view-empty[data-v-1b1ef833]{padding:12px 10px;color:#666;font-size:12px;text-align:center}.at-placeholder-view[data-v-b05cb615]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px 16px;text-align:center}.at-placeholder-icon[data-v-b05cb615]{color:#555;margin-bottom:12px}.at-placeholder-title[data-v-b05cb615]{font-size:14px;font-weight:500;color:#888;margin-bottom:8px}.at-placeholder-desc[data-v-b05cb615]{font-size:13px;color:#666;margin-bottom:4px}.at-placeholder-hint[data-v-b05cb615]{font-size:11px;color:#555}.at-placeholder-view[data-v-f8b23821]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px 16px;text-align:center}.at-placeholder-icon[data-v-f8b23821]{color:#555;margin-bottom:12px}.at-placeholder-title[data-v-f8b23821]{font-size:14px;font-weight:500;color:#888;margin-bottom:8px}.at-placeholder-desc[data-v-f8b23821]{font-size:13px;color:#666;margin-bottom:4px}.at-placeholder-hint[data-v-f8b23821]{font-size:11px;color:#555}.at-placeholder-view[data-v-d3846042]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px 16px;text-align:center}.at-placeholder-icon[data-v-d3846042]{color:#555;margin-bottom:12px}.at-placeholder-title[data-v-d3846042]{font-size:14px;font-weight:500;color:#888;margin-bottom:8px}.at-placeholder-desc[data-v-d3846042]{font-size:13px;color:#666;margin-bottom:4px}.at-placeholder-hint[data-v-d3846042]{font-size:11px;color:#555}.at-placeholder-view[data-v-8fcc6d17]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px 16px;text-align:center}.at-placeholder-icon[data-v-8fcc6d17]{color:#555;margin-bottom:12px}.at-placeholder-title[data-v-8fcc6d17]{font-size:14px;font-weight:500;color:#888;margin-bottom:8px}.at-placeholder-desc[data-v-8fcc6d17]{font-size:13px;color:#666;margin-bottom:4px}.at-placeholder-hint[data-v-8fcc6d17]{font-size:11px;color:#555}.at-placeholder-view[data-v-9fb11d2e]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px 16px;text-align:center}.at-placeholder-icon[data-v-9fb11d2e]{color:#555;margin-bottom:12px}.at-placeholder-title[data-v-9fb11d2e]{font-size:14px;font-weight:500;color:#888;margin-bottom:8px}.at-placeholder-desc[data-v-9fb11d2e]{font-size:13px;color:#666;margin-bottom:4px}.at-placeholder-hint[data-v-9fb11d2e]{font-size:11px;color:#555}.at-picker-dropdown[data-v-e4398dce]{position:fixed;width:332px;background:var(--chat-dropdown-bg, #252526);border:1px solid rgba(255,255,255,.1);border-radius:10px;box-shadow:0 8px 32px #0006;z-index:99999;display:flex;flex-direction:column;overflow:hidden}.at-picker-header[data-v-e4398dce]{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid rgba(255,255,255,.06)}.at-picker-back[data-v-e4398dce]{width:24px;height:24px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:4px;color:#888;cursor:pointer;flex-shrink:0}.at-picker-back[data-v-e4398dce]:hover{background:#ffffff14;color:#ccc}.at-picker-search-icon[data-v-e4398dce]{color:#666;flex-shrink:0}.at-picker-search[data-v-e4398dce]{flex:1;background:transparent;border:none;outline:none;color:#ddd;font-size:13px}.at-picker-body[data-v-e4398dce]{padding:6px;flex:1;min-height:0;overflow-y:auto}.at-picker-body.is-scrolling .at-picker-item[data-v-e4398dce],.at-picker-body.is-scrolling .at-view-item[data-v-e4398dce]{pointer-events:none}.at-picker-section[data-v-e4398dce]{margin-bottom:2px}.at-picker-recent[data-v-e4398dce]{padding-bottom:6px;margin-bottom:6px;border-bottom:1px solid rgba(255,255,255,.08)}.at-picker-list[data-v-e4398dce]{display:flex;flex-direction:column;gap:1px}.at-picker-item[data-v-e4398dce]{display:flex;align-items:center;gap:8px;text-align:left;padding:7px 10px;border-radius:6px;border:1px solid transparent;background:transparent;cursor:pointer;color:#ccc;width:100%}.at-picker-item[data-v-e4398dce]:hover{background:#ffffff0f}.at-picker-item.active[data-v-e4398dce]{background:#3b82f626;border-color:#3b82f64d}.at-picker-item-icon[data-v-e4398dce]{color:#999;flex-shrink:0}.at-picker-item-name[data-v-e4398dce]{font-size:13px;color:#ddd;flex-shrink:0;max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.at-picker-item-path[data-v-e4398dce]{font-size:11px;color:#555;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.at-picker-category .at-picker-item-name[data-v-e4398dce]{flex:1;max-width:none}.at-picker-chevron[data-v-e4398dce]{color:#555;flex-shrink:0}.at-picker-footer[data-v-e4398dce]{padding:8px 12px;border-top:1px solid rgba(255,255,255,.06);color:#555;font-size:11px}.fade-enter-active[data-v-d983b603],.fade-leave-active[data-v-d983b603]{transition:opacity .2s ease}.fade-enter-from[data-v-d983b603],.fade-leave-to[data-v-d983b603]{opacity:0}.image-preview-modal[data-v-d983b603]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:99999;display:flex;flex-direction:column;background:#3d3d3d66;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.preview-header[data-v-d983b603]{position:relative;z-index:10;display:flex;align-items:center;justify-content:center;gap:12px;padding:16px 20px;min-height:52px}.preview-counter[data-v-d983b603]{color:#ffffffd9;font-size:14px;font-variant-numeric:tabular-nums}.preview-close-btn[data-v-d983b603]{position:absolute;right:16px;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;height:36px;padding:0 12px;background:#ffffff1a;border:none;border-radius:8px;color:#fff;cursor:pointer;transition:all .15s}.preview-close-btn[data-v-d983b603]:hover{background:#fff3;transform:translateY(-50%) scale(1.05)}.preview-close-btn[data-v-d983b603]:active{transform:translateY(-50%) scale(.95)}.preview-nav-btn[data-v-d983b603]{position:absolute;top:50%;transform:translateY(-50%);z-index:10;display:flex;align-items:center;justify-content:center;height:40px;padding:0 12px;background:#ffffff1a;border:none;border-radius:8px;color:#fff;cursor:pointer;transition:all .15s}.preview-nav-btn[data-v-d983b603]:hover:not(.disabled){background:#fff3;transform:translateY(-50%) scale(1.1)}.preview-nav-btn[data-v-d983b603]:active:not(.disabled){transform:translateY(-50%) scale(.95)}.preview-nav-btn.disabled[data-v-d983b603]{opacity:.4;cursor:not-allowed}.preview-nav-prev[data-v-d983b603]{left:24px}.preview-nav-next[data-v-d983b603]{right:24px}.preview-main[data-v-d983b603]{flex:1;display:flex;align-items:center;justify-content:center;overflow:hidden;padding:0 80px}.preview-image[data-v-d983b603]{max-width:calc(100% - 80px);max-height:calc(100vh - 140px);object-fit:contain;border-radius:8px;box-shadow:0 8px 32px #00000080}.dropdown-selector[data-v-20627bb2]{position:relative;display:flex;align-items:center;gap:4px;padding:4px 8px;background:var(--chat-muted, #3c3c3c);border:none;border-radius:6px;font-size:14px;color:var(--chat-text-muted, #888);cursor:pointer;transition:all .15s}.dropdown-selector[data-v-20627bb2]:hover:not(.disabled){background:var(--chat-muted-hover, #444);color:var(--chat-text, #ccc)}.dropdown-selector.disabled[data-v-20627bb2]{opacity:.6;cursor:not-allowed}.selector-text[data-v-20627bb2]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chevron[data-v-20627bb2]{color:var(--chat-text-muted, #666)}.dropdown-menu[data-v-20627bb2]{position:absolute;left:0;right:auto;min-width:180px;max-height:320px;overflow-y:auto;background:var(--chat-dropdown-bg, #252526);border:1px solid rgba(255,255,255,.1);border-radius:8px;box-shadow:0 4px 16px #0006;z-index:9999;padding:4px 8px 4px 4px;display:flex;flex-direction:column;gap:2px}.dropdown-menu.dropdown-up[data-v-20627bb2]{bottom:100%;top:auto;margin-bottom:4px}.dropdown-menu.dropdown-down[data-v-20627bb2]{top:100%;bottom:auto;margin-top:4px}.dropdown-menu.dropdown-align-right[data-v-20627bb2]{left:auto;right:0}.dropdown-item[data-v-20627bb2]{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;border:none;background:transparent;border-radius:4px;font-size:14px;color:var(--chat-text-muted, #999);cursor:pointer;transition:all .15s;white-space:nowrap;text-align:left}.dropdown-item[data-v-20627bb2]:hover{background:#ffffff14;color:var(--chat-text, #ccc)}.dropdown-item.active[data-v-20627bb2]{background:#ffffff1a;color:var(--chat-text, #fff)}.check-icon[data-v-20627bb2]{margin-left:auto;color:var(--chat-text, #ccc);flex-shrink:0}.dropdown-empty[data-v-20627bb2]{padding:12px 10px;font-size:12px;color:var(--chat-text-muted, #666);text-align:center}.group-title[data-v-20627bb2]{padding:8px 10px 4px;margin-top:4px;font-size:11px;color:var(--chat-text-muted, #666);font-weight:500}.group-title[data-v-20627bb2]:first-child{margin-top:0}.option-label[data-v-20627bb2]{flex:1;text-align:left}.option-right[data-v-20627bb2]{display:flex;align-items:center;gap:8px;margin-left:auto}.chat-input[data-v-0aa6b9f9]{padding:12px}.chat-input.message-variant[data-v-0aa6b9f9]{padding:0;margin-bottom:16px}.input-container[data-v-0aa6b9f9]{display:flex;flex-direction:column;background:var(--chat-input-bg, #2d2d2d);border:1px solid var(--chat-border, #444);border-radius:12px;padding:12px;transition:border-color .15s}.input-container.focused[data-v-0aa6b9f9]{border-color:#fff3}.input-container.drag-over[data-v-0aa6b9f9]{border-color:var(--chat-primary, #2563eb);background:#2563eb1a}.images-preview[data-v-0aa6b9f9]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.image-preview-item[data-v-0aa6b9f9]{position:relative;width:48px;height:48px;border-radius:6px;overflow:hidden;background:#0003}.image-thumbnail[data-v-0aa6b9f9]{width:100%;height:100%;object-fit:cover;cursor:pointer;transition:opacity .15s}.image-thumbnail[data-v-0aa6b9f9]:hover{opacity:.8}.image-remove-btn[data-v-0aa6b9f9]{position:absolute;top:2px;right:2px;width:16px;height:16px;display:flex;align-items:center;justify-content:center;background:#00000080;border:none;border-radius:50%;color:#fff;cursor:pointer;opacity:0;transition:all .15s}.image-preview-item:hover .image-remove-btn[data-v-0aa6b9f9]{opacity:1}.image-remove-btn[data-v-0aa6b9f9]:hover{background:#ef4444e6}.hidden-input[data-v-0aa6b9f9]{display:none}.input-field-wrapper[data-v-0aa6b9f9]{margin-bottom:8px}.input-field[data-v-0aa6b9f9]{width:100%;background:transparent;border:none;padding:0 8px 0 0;color:var(--chat-text, #ccc);font-size:14px;resize:none;min-height:24px;max-height:150px;line-height:1.5;font-family:inherit;overflow-y:auto}.input-field[data-v-0aa6b9f9]:focus{outline:none}.input-field[data-v-0aa6b9f9]::placeholder{color:var(--chat-text-muted, #666)}.input-controls[data-v-0aa6b9f9]{display:flex;align-items:center;justify-content:space-between;gap:8px}.input-left[data-v-0aa6b9f9]{display:flex;align-items:center;gap:4px}.input-right[data-v-0aa6b9f9]{display:flex;align-items:center;gap:2px}.at-picker-wrapper[data-v-0aa6b9f9]{position:relative}.input-right .icon-btn[data-v-0aa6b9f9]{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:transparent;border:none;border-radius:6px;color:var(--chat-text-muted, #666);cursor:pointer;transition:all .15s}.input-right .icon-btn[data-v-0aa6b9f9]:hover{color:var(--chat-text, #ccc)}.toggle-btn[data-v-0aa6b9f9]{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:transparent;border:none;border-radius:6px;color:var(--chat-text-muted, #666);cursor:pointer;transition:all .15s}.toggle-btn[data-v-0aa6b9f9]:hover{color:var(--chat-text, #ccc)}.toggle-btn.active[data-v-0aa6b9f9]{color:var(--chat-text, #fff)}.send-btn[data-v-0aa6b9f9]{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:transparent;border:none;border-radius:6px;color:var(--chat-text-muted, #666);cursor:pointer;transition:all .15s}.send-btn[data-v-0aa6b9f9]:hover{color:var(--chat-text, #ccc)}.text-part[data-v-07eabd25]{font-size:14px;line-height:1.7;color:var(--chat-text, #ccc);word-break:break-word;overflow-wrap:break-word}.collapsible-card[data-v-28c685c8]{margin:8px 0;border-radius:8px;background:var(--chat-muted, #2a2a2a);border:1px solid var(--chat-border, #333);overflow:hidden}.card-header[data-v-28c685c8]{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 12px;-webkit-user-select:none;user-select:none}.card-header-left[data-v-28c685c8]{display:flex;align-items:center;gap:8px;flex:1;cursor:pointer}.card-header-right[data-v-28c685c8]{display:flex;align-items:center;gap:4px;flex-shrink:0}.card-icon[data-v-28c685c8]{display:flex;align-items:center;justify-content:center;flex-shrink:0}.spinning[data-v-28c685c8]{animation:spin-28c685c8 1s linear infinite}@keyframes spin-28c685c8{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.card-title[data-v-28c685c8]{font-size:13px;color:var(--chat-text-muted, #888)}.card-subtitle[data-v-28c685c8]{font-size:12px;color:var(--chat-text-muted, #666)}.card-chevron[data-v-28c685c8]{color:var(--chat-text-muted, #666);transition:transform .2s;flex-shrink:0;cursor:pointer}.collapsible-card.expanded .card-chevron[data-v-28c685c8]{transform:rotate(180deg)}.card-content[data-v-28c685c8]{padding:12px;min-width:0;overflow:hidden}.thinking-content[data-v-f9487fcb]{font-size:13px;line-height:1.5;color:var(--chat-text-muted, #999);white-space:pre-wrap;word-break:break-word;overflow-wrap:break-word;margin:0}.search-results[data-v-626f98d6]{display:flex;flex-direction:column;gap:8px}.search-item[data-v-626f98d6]{display:block;padding:8px;border-radius:6px;background:var(--chat-bg, #1e1e1e);text-decoration:none;transition:background .15s}.search-item[data-v-626f98d6]:hover{background:var(--chat-hover, #333)}.search-item-title[data-v-626f98d6]{font-size:13px;font-weight:500;color:var(--chat-accent, #3b82f6);margin-bottom:4px}.search-item-snippet[data-v-626f98d6]{font-size:12px;color:var(--chat-text-muted, #888);line-height:1.4;margin-bottom:4px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.search-item-url[data-v-626f98d6]{font-size:11px;color:var(--chat-text-muted, #666);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.copy-btn[data-v-5b003ddd]{display:flex;align-items:center;justify-content:center;padding:4px;background:transparent;border:none;color:var(--chat-text-muted, #888);cursor:pointer;border-radius:4px;transition:all .2s}.copy-btn[data-v-5b003ddd]:hover{background:#ffffff1a;color:var(--chat-text, #fff)}.copy-btn.copied[data-v-5b003ddd]{color:var(--chat-success, #22c55e)}.tool-call-content[data-v-e1396557]{display:flex;flex-direction:column}.tool-call-command[data-v-e1396557]{margin-bottom:12px}.command-header[data-v-e1396557],.result-header[data-v-e1396557]{display:block;margin-bottom:8px;padding:0;cursor:default;-webkit-user-select:none;user-select:none;font-size:12px;line-height:1.5}.command-header[data-v-e1396557]:hover,.result-header[data-v-e1396557]:hover,.command-label[data-v-e1396557]:hover,.result-label[data-v-e1396557]:hover,.command-name[data-v-e1396557]:hover,.result-name[data-v-e1396557]:hover{background:transparent!important}.command-code[data-v-e1396557]{display:block;padding:10px;background:#0000004d;border:1px solid var(--chat-border, #333);border-radius:6px;font-family:Monaco,Menlo,Courier New,monospace;font-size:13px;color:var(--chat-text, #ccc);white-space:pre-wrap;word-break:break-all;overflow-x:auto}.tool-call-result[data-v-e1396557]{margin-bottom:12px}.result-label[data-v-e1396557],.command-label[data-v-e1396557]{color:var(--chat-text-muted, #888);font-weight:500}.result-name[data-v-e1396557],.command-name[data-v-e1396557]{color:var(--chat-text, #ccc)}.result-content[data-v-e1396557]{display:block;padding:10px;background:#0000004d;border:1px solid var(--chat-border, #333);border-radius:6px;font-family:Monaco,Menlo,Courier New,monospace;font-size:13px;color:var(--chat-text, #ccc);white-space:pre-wrap;word-break:break-all;overflow-x:auto}.tool-call-footer[data-v-e1396557]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:12px;border-top:1px solid var(--chat-border, #333)}.footer-left[data-v-e1396557]{flex-shrink:0;position:relative;z-index:10}.footer-right[data-v-e1396557]{display:flex;align-items:center;gap:12px}.execution-status[data-v-e1396557]{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:500}.execution-status.done[data-v-e1396557]{color:var(--chat-success, #22c55e)}.execution-status.error[data-v-e1396557]{color:#ef4444}.execution-status.running[data-v-e1396557]{color:var(--chat-accent, #3b82f6)}.execution-status.pending[data-v-e1396557]{color:var(--chat-text-muted, #888)}.execution-status.cancelled[data-v-e1396557]{color:var(--chat-warning, #f59e0b)}.execution-status.skipped[data-v-e1396557]{color:var(--chat-text-muted, #888)}.spinning[data-v-e1396557]{animation:spin-e1396557 1s linear infinite}@keyframes spin-e1396557{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.action-buttons[data-v-e1396557]{display:flex;gap:8px}.btn[data-v-e1396557]{padding:6px 12px;border-radius:6px;font-size:12px;font-weight:500;cursor:pointer;border:none;display:flex;align-items:center;gap:6px;transition:all .2s}.btn-skip[data-v-e1396557]{background:var(--chat-muted, #2a2a2a);color:var(--chat-text, #ccc);border:1px solid var(--chat-border, #333)}.btn-skip[data-v-e1396557]:hover{background:var(--chat-muted-hover, #333)}.btn-run[data-v-e1396557]{background:var(--chat-accent, #3b82f6);color:#fff}.btn-run[data-v-e1396557]:hover{background:var(--chat-accent-hover, #2563eb)}.btn-cancel[data-v-e1396557]{background:transparent;color:var(--chat-text-muted, #888);border:1px solid var(--chat-border, #333)}.btn-cancel[data-v-e1396557]:hover{background:#ef44441a;color:#ef4444;border-color:#ef4444}.tool-result-part[data-v-7aa847c7]{margin:8px 0}.result-content[data-v-7aa847c7]{margin:0;font-size:12px;font-family:SF Mono,Monaco,Cascadia Code,monospace;color:var(--chat-text-muted, #999);white-space:pre-wrap;word-break:break-word}.image-part[data-v-8ff66582]{position:relative;margin:8px 0;max-width:100%;display:inline-block}.image-content[data-v-8ff66582]{max-width:100%;max-height:400px;border-radius:8px;cursor:pointer;transition:opacity .2s}.image-content[data-v-8ff66582]:hover{opacity:.9}.image-loading[data-v-8ff66582],.image-error[data-v-8ff66582]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:24px;background:var(--chat-muted, #2a2a2a);border-radius:8px;color:var(--chat-text-muted, #888);min-width:200px;min-height:150px}.spinning[data-v-8ff66582]{animation:spin-8ff66582 1s linear infinite}@keyframes spin-8ff66582{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.image-error span[data-v-8ff66582]{font-size:13px}.error-content[data-v-3d8fe7e4]{font-size:13px;line-height:1.5;color:var(--chat-text-muted, #999);white-space:pre-wrap;word-break:break-word;overflow-wrap:break-word;margin:0}.parts-renderer[data-v-dc2ecaff]{display:flex;flex-direction:column}.message-bubble[data-v-589daa91]{padding:8px 0;animation:fadeIn-589daa91 .2s ease}@keyframes fadeIn-589daa91{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.message-bubble.user[data-v-589daa91]{width:100%}.user-content[data-v-589daa91]{width:100%;background:var(--chat-muted, #2d2d2d);color:var(--chat-text, #ccc);padding:12px;border-radius:12px;border:1px solid var(--chat-border, #444)}.user-text[data-v-589daa91]{font-size:14px;line-height:1.5;white-space:pre-wrap;word-break:break-word}.user-images[data-v-589daa91]{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}.user-image[data-v-589daa91]{width:80px;height:80px;object-fit:cover;border-radius:8px;cursor:pointer;transition:transform .15s}.user-image[data-v-589daa91]:hover{transform:scale(1.05)}.message-bubble.assistant[data-v-589daa91]{position:relative}.assistant-content[data-v-589daa91]{max-width:100%}.loading-indicator[data-v-589daa91]{position:relative;display:flex;align-items:center;width:100%;padding:10px 16px;background:var(--chat-muted, #2a2a2a);border-radius:8px;overflow:hidden;margin:8px 0}.loading-text[data-v-589daa91]{font-size:13px;color:var(--chat-text-muted, #888);position:relative;z-index:1}.loading-shimmer[data-v-589daa91]{position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.08) 50%,transparent 100%);animation:shimmer-589daa91 1.5s ease-in-out infinite}@keyframes shimmer-589daa91{0%{left:-100%}to{left:100%}}.message-actions[data-v-589daa91]{display:flex;align-items:center;justify-content:space-between;margin-top:8px}.message-meta[data-v-589daa91]{display:flex;align-items:center;gap:6px}.model-name[data-v-589daa91]{font-size:11px;color:var(--chat-text-muted, #888);background:var(--chat-muted, #2a2a2a);padding:2px 8px;border-radius:10px;border:1px solid var(--chat-border, #333)}.mode-badge[data-v-589daa91]{font-size:10px;color:var(--chat-text-muted, #888);background:var(--chat-muted, #2a2a2a);padding:2px 6px;border-radius:10px;border:1px solid var(--chat-border, #333)}.action-buttons[data-v-589daa91]{display:flex;align-items:center;gap:4px}.action-btn[data-v-589daa91]{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;color:var(--chat-text-muted, #666);cursor:pointer;transition:all .15s}.action-btn[data-v-589daa91]:hover{background:var(--chat-muted, #3c3c3c);color:var(--chat-text, #ccc)}.message-time[data-v-589daa91]{font-size:12px;color:var(--chat-text-muted, #666)}.user-time[data-v-589daa91]{text-align:right;margin-top:8px}.assistant-time[data-v-589daa91]{margin-right:8px}.confirm-dialog-overlay[data-v-35ec8a18]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;display:flex;align-items:center;justify-content:center;background:#00000080;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.confirm-dialog[data-v-35ec8a18]{width:100%;max-width:400px;margin:16px;background:var(--chat-dropdown-bg, #252526);border:1px solid rgba(255,255,255,.1);border-radius:12px;box-shadow:0 8px 32px #0006;overflow:hidden}.confirm-dialog-header[data-v-35ec8a18]{display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid var(--chat-border, #333)}.confirm-dialog-header .icon[data-v-35ec8a18]{flex-shrink:0}.confirm-dialog-header .icon.warning[data-v-35ec8a18]{color:#f59e0b}.confirm-dialog-header .icon.danger[data-v-35ec8a18]{color:#ef4444}.confirm-dialog-header .icon.info[data-v-35ec8a18]{color:#3b82f6}.confirm-dialog-header .title[data-v-35ec8a18]{font-size:14px;font-weight:600;color:var(--chat-text, #fff)}.confirm-dialog-content[data-v-35ec8a18]{padding:16px;font-size:13px;line-height:1.6;color:var(--chat-text-muted, #999)}.confirm-dialog-footer[data-v-35ec8a18]{display:flex;justify-content:flex-end;gap:8px;padding:12px 16px;border-top:1px solid var(--chat-border, #333)}.btn[data-v-35ec8a18]{padding:6px 12px;font-size:13px;font-weight:500;border:none;border-radius:4px;cursor:pointer;transition:all .15s}.btn-cancel[data-v-35ec8a18]{background:transparent;color:var(--chat-text-muted, #999);border:1px solid var(--chat-border, #444)}.btn-cancel[data-v-35ec8a18]:hover{background:#ffffff0d;color:var(--chat-text, #fff)}.btn-info[data-v-35ec8a18]{background:#3b82f6;color:#fff}.btn-info[data-v-35ec8a18]:hover{background:#2563eb}.btn-warning[data-v-35ec8a18]{background:#f59e0b;color:#000}.btn-warning[data-v-35ec8a18]:hover{background:#d97706}.btn-danger[data-v-35ec8a18]{background:#ef4444;color:#fff}.btn-danger[data-v-35ec8a18]:hover{background:#dc2626}.dialog-enter-active[data-v-35ec8a18],.dialog-leave-active[data-v-35ec8a18]{transition:opacity .2s ease}.dialog-enter-active .confirm-dialog[data-v-35ec8a18],.dialog-leave-active .confirm-dialog[data-v-35ec8a18]{transition:transform .2s ease,opacity .2s ease}.dialog-enter-from[data-v-35ec8a18],.dialog-leave-to[data-v-35ec8a18]{opacity:0}.dialog-enter-from .confirm-dialog[data-v-35ec8a18],.dialog-leave-to .confirm-dialog[data-v-35ec8a18]{transform:scale(.95);opacity:0}.toast-container[data-v-94f5a9a4]{position:fixed;top:60px;left:50%;transform:translate(-50%);z-index:10000;pointer-events:none}.toast[data-v-94f5a9a4]{padding:8px 16px;border-radius:6px;font-size:13px;border:1px solid;box-shadow:0 2px 8px #0003}.toast-info[data-v-94f5a9a4],.toast-success[data-v-94f5a9a4]{background:var(--chat-bg-secondary, #2a2a2a);color:var(--chat-text, #fff);border-color:var(--chat-border, #444)}.toast-warning[data-v-94f5a9a4]{background:#f59e0b26;color:#f59e0b;border-color:#f59e0b4d}.toast-error[data-v-94f5a9a4]{background:#ef444426;color:#ef4444;border-color:#ef44444d}.toast-enter-active[data-v-94f5a9a4],.toast-leave-active[data-v-94f5a9a4]{transition:all .2s ease}.toast-enter-from[data-v-94f5a9a4],.toast-leave-to[data-v-94f5a9a4]{opacity:0;transform:translate(-50%) translateY(-10px)}.indexing-settings[data-v-2fc55690]{display:flex;flex-direction:column;gap:0}.indexing-section[data-v-2fc55690]{align-items:flex-start}.indexing-content[data-v-2fc55690]{display:flex;flex-direction:column;gap:12px;margin-top:12px;width:100%;min-width:0}.progress-container[data-v-2fc55690]{display:flex;flex-direction:column;gap:6px}.progress-bar[data-v-2fc55690]{width:100%;height:4px;background:var(--chat-border, #333);border-radius:2px;overflow:hidden}.progress-fill[data-v-2fc55690]{height:100%;background:var(--chat-accent, #3b82f6);border-radius:2px;transition:width .3s ease}.progress-text[data-v-2fc55690]{font-size:13px;color:var(--chat-text-muted, #888)}.stats-info[data-v-2fc55690]{display:flex;flex-wrap:wrap;gap:12px;padding:8px 0}.stat-item[data-v-2fc55690]{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--chat-text-muted, #888)}.current-file[data-v-2fc55690]{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--chat-text-muted, #888);padding:6px 8px;background:var(--chat-muted, #2a2a2a);border-radius:4px;width:100%;min-width:0}.file-path[data-v-2fc55690]{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.action-buttons[data-v-2fc55690]{display:flex;gap:8px}.action-buttons .edit-btn[data-v-2fc55690]{margin:0}.action-buttons .edit-btn[data-v-2fc55690]:disabled{opacity:.5;cursor:not-allowed}.action-buttons .delete-btn[data-v-2fc55690]{color:#ef4444}.action-buttons .delete-btn[data-v-2fc55690]:hover:not(:disabled){color:#ef4444}.spinning[data-v-2fc55690]{animation:spin-2fc55690 1s linear infinite}@keyframes spin-2fc55690{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.indexing-settings .setting-item[data-v-2fc55690]{display:flex;align-items:center;justify-content:space-between;padding:16px 0;border-bottom:1px solid var(--chat-border, #333)}.indexing-settings .setting-item[data-v-2fc55690]:last-child{border-bottom:none}.indexing-settings .setting-info[data-v-2fc55690]{flex:1;margin-right:24px;min-width:0}.indexing-settings .setting-label[data-v-2fc55690]{font-size:14px;font-weight:500;color:var(--chat-text, #fff);margin-bottom:4px}.indexing-settings .setting-description[data-v-2fc55690]{font-size:13px;color:var(--chat-text-muted, #888);line-height:1.5;margin-bottom:0}.link-btn[data-v-2fc55690]{display:inline;padding:0;background:transparent;border:none;color:var(--chat-accent, #3b82f6);cursor:pointer;text-decoration:underline;font-size:inherit}.link-btn[data-v-2fc55690]:hover{color:var(--chat-accent-hover, #60a5fa)}.indexing-settings .setting-control[data-v-2fc55690]{flex-shrink:0}.edit-btn[data-v-2fc55690]{display:flex;align-items:center;gap:6px;padding:6px 12px;font-size:13px;font-weight:500;border:1px solid var(--chat-border, #333);border-radius:6px;background:transparent;color:var(--chat-text, #fff);cursor:pointer;transition:all .15s}.edit-btn[data-v-2fc55690]:hover{background:var(--chat-muted, #2a2a2a);border-color:var(--chat-border, #444)}.settings-panel-overlay[data-v-fbee608f]{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:1000}.settings-panel[data-v-fbee608f]{background:var(--chat-bg, #1e1e1e);border:1px solid var(--chat-border, #333);border-radius:12px;width:90%;max-width:900px;height:80vh;max-height:700px;display:flex;flex-direction:row;box-shadow:0 8px 32px #00000080;overflow:hidden}.settings-sidebar[data-v-fbee608f]{width:240px;background:var(--chat-muted, #2a2a2a);border-right:1px solid var(--chat-border, #333);display:flex;flex-direction:column;flex-shrink:0}.sidebar-header[data-v-fbee608f]{display:flex;align-items:center;height:50px;padding:0 16px;border-bottom:1px solid var(--chat-border, #333)}.sidebar-title[data-v-fbee608f]{margin:0;font-size:15px;font-weight:600;color:var(--chat-text, #fff)}.sidebar-content[data-v-fbee608f]{flex:1;overflow-y:auto;padding:8px}.sidebar-item[data-v-fbee608f]{display:flex;align-items:center;gap:12px;width:100%;padding:10px 12px;margin-bottom:2px;background:transparent;border:none;border-radius:8px;font-size:14px;font-weight:500;color:var(--chat-text-muted, #888);cursor:pointer;transition:all .15s ease;text-align:left}.sidebar-item[data-v-fbee608f]:hover{background:#ffffff0d;color:var(--chat-text, #ccc)}.sidebar-item.active[data-v-fbee608f]{background:#ffffff1a;color:var(--chat-text, #fff)}.settings-content[data-v-fbee608f]{flex:1;display:flex;flex-direction:column;overflow:hidden}.content-header[data-v-fbee608f]{display:flex;align-items:center;justify-content:space-between;height:50px;padding:0 16px;border-bottom:1px solid var(--chat-border, #333)}.content-title[data-v-fbee608f]{margin:0;font-size:15px;font-weight:600;color:var(--chat-text, #fff)}.close-btn[data-v-fbee608f]{display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;background:transparent;border:none;border-radius:6px;color:var(--chat-text-muted, #888);cursor:pointer;transition:all .15s}.close-btn[data-v-fbee608f]:hover{background:var(--chat-muted, #2a2a2a);color:var(--chat-text, #fff)}.content-body[data-v-fbee608f]{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:24px;padding:16px}.section-title[data-v-fbee608f]{font-size:16px;font-weight:500;color:var(--chat-text, #fff);margin-bottom:4px}.section-description[data-v-fbee608f]{font-size:13px;color:var(--chat-text-muted, #888);margin-bottom:16px}.setting-item[data-v-fbee608f]{display:flex;align-items:center;justify-content:space-between;padding:16px 0;border-bottom:1px solid var(--chat-border, #333)}.setting-item[data-v-fbee608f]:last-child{border-bottom:none}.setting-info[data-v-fbee608f]{flex:1;margin-right:24px}.setting-label[data-v-fbee608f]{font-size:14px;font-weight:500;color:var(--chat-text, #fff);margin-bottom:4px}.setting-description[data-v-fbee608f]{font-size:13px;color:var(--chat-text-muted, #888);line-height:1.5}.setting-control[data-v-fbee608f]{flex-shrink:0}.chat-panel[data-v-2bb913d3]{display:flex;flex-direction:column;width:100%;height:100%;background:var(--chat-bg, #1e1e1e);overflow:hidden}.messages-wrapper[data-v-2bb913d3]{flex:1;min-height:0;position:relative;display:flex;flex-direction:column}.messages-container[data-v-2bb913d3]{flex:1;min-height:0;overflow-y:auto;padding:12px;scroll-behavior:smooth}.scroll-to-bottom-btn[data-v-2bb913d3]{position:absolute;bottom:16px;right:16px;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;background:var(--chat-bubble-bg, #2d2d2d);border:1px solid var(--chat-border, #3d3d3d);color:var(--chat-text-secondary, #888);cursor:pointer;transition:all .2s ease;box-shadow:0 2px 8px #0000004d;z-index:10;pointer-events:auto}.scroll-to-bottom-btn[data-v-2bb913d3]:hover{background:var(--chat-bubble-bg-hover, #3a3a3a);color:var(--chat-text, #e0e0e0);transform:scale(1.1)}.fade-enter-active[data-v-2bb913d3],.fade-leave-active[data-v-2bb913d3]{transition:opacity .2s ease}.fade-enter-from[data-v-2bb913d3],.fade-leave-to[data-v-2bb913d3]{opacity:0}
@@ -1,76 +1,136 @@
1
- import { ChatMode as ChatModeType, ModelConfig as ModelConfigType, ModelProvider as ModelProviderType, ThinkingMode as ThinkingModeType, SessionRecord as SessionRecordType, MessageRecord as MessageRecordType } from '@huyooo/ai-chat-bridge-electron/renderer';
1
+ import { ChatMode as ChatModeType, ThinkingMode as ThinkingModeType, SessionRecord as SessionRecordType, MessageRecord as MessageRecordType, ModelOption as ModelOptionType, ProviderType as ProviderTypeType } from '@huyooo/ai-chat-bridge-electron/renderer';
2
2
  export type ChatMode = ChatModeType;
3
- export type ModelConfig = ModelConfigType;
4
- export type ModelProvider = ModelProviderType;
5
3
  export type ThinkingMode = ThinkingModeType;
6
4
  export type SessionRecord = SessionRecordType;
7
5
  export type MessageRecord = MessageRecordType;
6
+ export type ModelOption = ModelOptionType;
7
+ export type ProviderType = ProviderTypeType;
8
8
  /** 搜索结果 */
9
9
  export interface SearchResult {
10
10
  title: string;
11
11
  url: string;
12
12
  snippet: string;
13
13
  }
14
- /** 工具调用 */
15
- export interface ToolCall {
14
+ /** 文本内容 Part */
15
+ export interface TextPart {
16
+ type: 'text';
17
+ text: string;
18
+ }
19
+ /** 思考过程 Part */
20
+ export interface ThinkingPart {
21
+ type: 'thinking';
22
+ text: string;
23
+ status: 'running' | 'done';
24
+ duration?: number;
25
+ }
26
+ /** 搜索 Part */
27
+ export interface SearchPart {
28
+ type: 'search';
29
+ query?: string;
30
+ results?: SearchResult[];
31
+ status: 'running' | 'done';
32
+ }
33
+ /** 工具调用 Part */
34
+ export interface ToolCallPart {
35
+ type: 'tool_call';
36
+ id: string;
16
37
  name: string;
17
38
  args?: Record<string, unknown>;
18
- result?: string;
19
- status: 'running' | 'success' | 'error';
39
+ status: 'pending' | 'running' | 'done' | 'error' | 'cancelled' | 'skipped';
40
+ result: unknown | null;
41
+ }
42
+ /** 工具结果 Part - 用于自定义 UI 渲染(备用,主要使用 ToolCallPart) */
43
+ export interface ToolResultPart {
44
+ type: 'tool_result';
45
+ id: string;
46
+ name: string;
47
+ args?: Record<string, unknown>;
48
+ result: unknown;
49
+ status: 'done' | 'error' | 'cancelled' | 'skipped';
50
+ }
51
+ /** 图片 Part */
52
+ export interface ImagePart {
53
+ type: 'image';
54
+ url: string;
20
55
  }
21
- /** 聊天消息(前端显示用) */
56
+ /** 错误 Part */
57
+ export interface ErrorPart {
58
+ type: 'error';
59
+ message: string;
60
+ category?: string;
61
+ retryable?: boolean;
62
+ }
63
+ /** 内容 Part 联合类型 */
64
+ export type ContentPart = TextPart | ThinkingPart | SearchPart | ToolCallPart | ToolResultPart | ImagePart | ErrorPart;
65
+ /** 内容 Part 类型字符串 */
66
+ export type ContentPartType = ContentPart['type'];
67
+ /** 步骤折叠模式 */
68
+ export type StepsExpandedType = 'open' | 'close' | 'auto';
69
+ /** 错误详情(结构化错误信息) */
70
+ export interface ErrorDetails {
71
+ category?: string;
72
+ message: string;
73
+ code?: string;
74
+ statusCode?: number;
75
+ retryable?: boolean;
76
+ retryAfter?: number;
77
+ }
78
+ /** 聊天消息(前端显示用)- 新架构:基于 parts 数组 */
22
79
  export interface ChatMessage {
23
80
  id: string;
24
81
  role: 'user' | 'assistant';
25
- content: string;
82
+ /** 内容 parts 数组 - 核心渲染数据 */
83
+ parts: ContentPart[];
84
+ /** 生成此消息时使用的模型 */
85
+ model?: string;
86
+ /** 生成此消息时使用的模式 (ask/agent) */
87
+ mode?: string;
88
+ /** 生成此消息时是否启用 web 搜索 */
89
+ webSearchEnabled?: boolean;
90
+ /** 生成此消息时是否启用深度思考 */
91
+ thinkingEnabled?: boolean;
92
+ /** 用户上传的图片(仅用户消息) */
26
93
  images?: string[];
27
- thinking?: string;
28
- thinkingComplete?: boolean;
29
- searchResults?: SearchResult[];
30
- searching?: boolean;
31
- toolCalls?: ToolCall[];
32
- copied?: boolean;
94
+ /** 是否正在加载 */
33
95
  loading?: boolean;
96
+ /** 是否已复制 */
97
+ copied?: boolean;
98
+ /** 消息时间戳 */
34
99
  timestamp?: Date;
100
+ /** 错误详情(如果有错误) */
101
+ error?: ErrorDetails;
102
+ /** 是否被用户中止 */
103
+ aborted?: boolean;
35
104
  }
36
- /** 默认模型列表 */
37
- export declare const DEFAULT_MODELS: ModelConfigType[];
38
- /** @deprecated 使用 SessionRecord */
39
- export interface ChatSession {
40
- id: string;
41
- title: string;
42
- messages: ChatMessage[];
43
- createdAt: Date;
44
- updatedAt: Date;
105
+ /** 获取消息的纯文本内容(用于复制、保存等) */
106
+ export declare function getMessageText(message: ChatMessage): string;
107
+ /** 输入区配置快照(用于历史回溯/重发) */
108
+ export interface ChatInputOptions {
109
+ mode: ChatMode;
110
+ model: string;
111
+ webSearchEnabled: boolean;
112
+ thinkingEnabled: boolean;
45
113
  }
46
- /** 音视频操作类型 */
47
- export interface MediaOperation {
114
+ /** @deprecated 使用 ContentPart 替代 */
115
+ export type ExecutionStepType = 'thinking' | 'search' | 'tool_call' | 'error';
116
+ /** @deprecated 使用 ContentPart 替代 */
117
+ export type ExecutionStepStatus = 'running' | 'completed' | 'error';
118
+ /** @deprecated 使用 ContentPart 替代 */
119
+ export type ExecutionStep = {
48
120
  id: string;
49
- type: 'clip' | 'transcode' | 'merge' | 'extract_audio' | 'add_subtitle' | 'analyze';
50
- description: string;
51
- sourceFiles: string[];
52
- targetFile?: string;
53
- parameters?: Record<string, unknown>;
54
- status?: 'pending' | 'applied' | 'rejected';
55
- preview?: string;
56
- }
57
- /** @deprecated 使用字符串枚举 */
58
- export type AiModel = 'gemini-3-pro-preview' | 'gemini-3-pro-image-preview';
59
- export declare enum FileType {
60
- FOLDER = "folder",
61
- IMAGE = "image",
62
- VIDEO = "video",
63
- AUDIO = "audio",
64
- TEXT = "text",
65
- PDF = "pdf",
66
- CODE = "code",
67
- ARCHIVE = "archive",
68
- OTHER = "other"
69
- }
70
- export interface DiffStat {
71
- file: string;
72
- additions: number;
73
- deletions: number;
74
- type: 'modified' | 'added' | 'deleted';
75
- }
121
+ type: ExecutionStepType;
122
+ status: ExecutionStepStatus;
123
+ startedAt?: number;
124
+ completedAt?: number;
125
+ duration?: number;
126
+ content?: string;
127
+ query?: string;
128
+ results?: SearchResult[];
129
+ callId?: string;
130
+ name?: string;
131
+ args?: Record<string, unknown>;
132
+ result?: string;
133
+ message?: string;
134
+ category?: string;
135
+ };
76
136
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 根据文件名或路径获取对应的图标
3
+ */
4
+ export declare function getFileIcon(nameOrPath: string): string;
5
+ /**
6
+ * 获取路径的文件名部分
7
+ */
8
+ export declare function basename(p: string): string;
9
+ /**
10
+ * 获取路径的目录部分
11
+ */
12
+ export declare function dirname(p: string): string;
13
+ //# sourceMappingURL=fileIcon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileIcon.d.ts","sourceRoot":"","sources":["../../src/utils/fileIcon.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA2BtD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI1C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAIzC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huyooo/ai-chat-frontend-vue",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "AI Chat Frontend - Vue components with adapter pattern",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -20,25 +20,31 @@
20
20
  "src"
21
21
  ],
22
22
  "scripts": {
23
+ "prebuild": "npm run clean",
23
24
  "build": "vite build",
24
25
  "dev": "vite build --watch",
25
26
  "typecheck": "vue-tsc --noEmit",
26
- "clean": "rm -rf dist"
27
+ "clean": "rm -rf dist",
28
+ "prepublishOnly": "npm run build && npm run typecheck"
27
29
  },
28
30
  "peerDependencies": {
29
31
  "vue": "^3.4.0"
30
32
  },
31
33
  "dependencies": {
32
- "@huyooo/ai-chat-bridge-electron": "^0.1.6",
33
- "lucide-vue-next": "^0.460.0",
34
- "vscode-uri": "^3.1.0"
34
+ "@huyooo/ai-chat-bridge-electron": "^0.1.7",
35
+ "@huyooo/ai-chat-shared": "^0.1.0",
36
+ "@iconify/vue": "^4.1.2",
37
+ "vscode-uri": "^3.1.0",
38
+ "marked": "^12.0.0",
39
+ "dompurify": "^3.2.0"
35
40
  },
36
41
  "devDependencies": {
37
42
  "@rollup/pluginutils": "^5.3.0",
38
43
  "@types/node": "^22.0.0",
44
+ "@types/dompurify": "^3.0.5",
45
+ "@types/marked": "^6.0.0",
39
46
  "@vitejs/plugin-vue": "^5.0.0",
40
47
  "local-pkg": "^1.1.2",
41
- "lucide-vue-next": "^0.460.0",
42
48
  "magic-string": "^0.30.21",
43
49
  "typescript": "^5.0.0",
44
50
  "vite": "^6.0.0",
package/src/adapter.ts CHANGED
@@ -3,11 +3,16 @@
3
3
  * 核心 ChatAdapter 接口从 bridge-electron 导入
4
4
  */
5
5
 
6
- import type { ChatAdapter as ChatAdapterType, ChatMode, ThinkingMode } from '@huyooo/ai-chat-bridge-electron/renderer'
6
+ import type {
7
+ ChatAdapter as ChatAdapterType,
8
+ ChatMode,
9
+ ThinkingMode,
10
+ } from '@huyooo/ai-chat-bridge-electron/renderer'
7
11
 
8
- // 重新导出 ChatAdapter 类型供内部组件使用
12
+ /**
13
+ * 重新导出 ChatAdapter 类型供内部组件使用
14
+ */
9
15
  export type ChatAdapter = ChatAdapterType
10
- import type { SearchResult } from './types'
11
16
 
12
17
  /** 思考数据 */
13
18
  export interface ThinkingData {
@@ -38,6 +43,7 @@ export interface SendMessageOptions {
38
43
  mode: ChatMode
39
44
  model: string
40
45
  enableWebSearch: boolean
46
+ /** 深度思考开关(每个 provider 内部使用最优参数) */
41
47
  thinkingMode: ThinkingMode
42
48
  }
43
49
 
@@ -60,71 +66,7 @@ export interface SaveMessageOptions {
60
66
  sessionId: string
61
67
  role: 'user' | 'assistant'
62
68
  content: string
63
- thinking?: string
64
- toolCalls?: string
65
- searchResults?: string
66
- }
67
-
68
- /**
69
- * 创建空 Adapter(用于测试或无后端场景)
70
- */
71
- export function createNullAdapter(): ChatAdapterType {
72
- return {
73
- async getModels() {
74
- return []
75
- },
76
- async getSessions() {
77
- return []
78
- },
79
- async getSession() {
80
- return null
81
- },
82
- async createSession(params) {
83
- return {
84
- id: Date.now().toString(),
85
- appId: null,
86
- userId: null,
87
- title: params?.title || '新对话',
88
- model: params?.model || '',
89
- mode: (params?.mode || 'agent') as ChatMode,
90
- createdAt: new Date(),
91
- updatedAt: new Date(),
92
- }
93
- },
94
- async updateSession() {
95
- return null
96
- },
97
- async deleteSession() {},
98
- async getMessages() {
99
- return []
100
- },
101
- async saveMessage(params) {
102
- return {
103
- id: Date.now().toString(),
104
- sessionId: params.sessionId,
105
- role: params.role,
106
- content: params.content,
107
- thinking: params.thinking || null,
108
- toolCalls: params.toolCalls || null,
109
- searchResults: params.searchResults || null,
110
- operationIds: null,
111
- timestamp: new Date(),
112
- }
113
- },
114
- async deleteMessagesAfter() {},
115
- async getOperations() {
116
- return []
117
- },
118
- async getTrashItems() {
119
- return []
120
- },
121
- async restoreFromTrash() {
122
- return undefined
123
- },
124
- async *sendMessage() {
125
- yield { type: 'text', data: '无可用的 Adapter' }
126
- yield { type: 'done', data: '' }
127
- },
128
- cancel() {},
129
- }
69
+ /** 执行步骤列表 JSON */
70
+ steps?: string
71
+ operationIds?: string
130
72
  }