@huyooo/ai-chat-frontend-vue 0.1.4 → 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 +28 -28
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +55889 -1359
  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 +96 -49
  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
@@ -0,0 +1,208 @@
1
+ <template>
2
+ <Teleport to="body">
3
+ <Transition name="dialog">
4
+ <div v-if="visible" class="confirm-dialog-overlay" @click.self="handleCancel">
5
+ <div class="confirm-dialog">
6
+ <div class="confirm-dialog-header">
7
+ <Icon v-if="type === 'warning'" icon="lucide:alert-triangle" class="icon warning" width="18" />
8
+ <Icon v-else-if="type === 'danger'" icon="lucide:alert-circle" class="icon danger" width="18" />
9
+ <Icon v-else icon="lucide:info" class="icon info" width="18" />
10
+ <span class="title">{{ title }}</span>
11
+ </div>
12
+ <div class="confirm-dialog-content">
13
+ {{ message }}
14
+ </div>
15
+ <div class="confirm-dialog-footer">
16
+ <button class="btn btn-cancel" @click="handleCancel">
17
+ {{ cancelText }}
18
+ </button>
19
+ <button :class="['btn', `btn-${type}`]" @click="handleConfirm">
20
+ {{ confirmText }}
21
+ </button>
22
+ </div>
23
+ </div>
24
+ </div>
25
+ </Transition>
26
+ </Teleport>
27
+ </template>
28
+
29
+ <script setup lang="ts">
30
+ import { Icon } from '@iconify/vue';
31
+
32
+ interface Props {
33
+ /** 是否显示 */
34
+ visible: boolean;
35
+ /** 标题 */
36
+ title?: string;
37
+ /** 消息内容 */
38
+ message: string;
39
+ /** 类型:info | warning | danger */
40
+ type?: 'info' | 'warning' | 'danger';
41
+ /** 确认按钮文字 */
42
+ confirmText?: string;
43
+ /** 取消按钮文字 */
44
+ cancelText?: string;
45
+ }
46
+
47
+ withDefaults(defineProps<Props>(), {
48
+ title: '确认',
49
+ type: 'warning',
50
+ confirmText: '确定',
51
+ cancelText: '取消',
52
+ });
53
+
54
+ const emit = defineEmits<{
55
+ 'update:visible': [value: boolean];
56
+ confirm: [];
57
+ cancel: [];
58
+ }>();
59
+
60
+ function handleConfirm() {
61
+ emit('update:visible', false);
62
+ emit('confirm');
63
+ }
64
+
65
+ function handleCancel() {
66
+ emit('update:visible', false);
67
+ emit('cancel');
68
+ }
69
+ </script>
70
+
71
+ <style scoped>
72
+ .confirm-dialog-overlay {
73
+ position: fixed;
74
+ inset: 0;
75
+ z-index: 1000;
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ background: rgba(0, 0, 0, 0.5);
80
+ backdrop-filter: blur(2px);
81
+ }
82
+
83
+ .confirm-dialog {
84
+ width: 100%;
85
+ max-width: 400px;
86
+ margin: 16px;
87
+ background: var(--chat-dropdown-bg, #252526);
88
+ border: 1px solid rgba(255, 255, 255, 0.1);
89
+ border-radius: 12px;
90
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
91
+ overflow: hidden;
92
+ }
93
+
94
+ .confirm-dialog-header {
95
+ display: flex;
96
+ align-items: center;
97
+ gap: 8px;
98
+ padding: 12px 16px;
99
+ border-bottom: 1px solid var(--chat-border, #333);
100
+ }
101
+
102
+ .confirm-dialog-header .icon {
103
+ flex-shrink: 0;
104
+ }
105
+
106
+ .confirm-dialog-header .icon.warning {
107
+ color: #f59e0b;
108
+ }
109
+
110
+ .confirm-dialog-header .icon.danger {
111
+ color: #ef4444;
112
+ }
113
+
114
+ .confirm-dialog-header .icon.info {
115
+ color: #3b82f6;
116
+ }
117
+
118
+ .confirm-dialog-header .title {
119
+ font-size: 14px;
120
+ font-weight: 600;
121
+ color: var(--chat-text, #fff);
122
+ }
123
+
124
+ .confirm-dialog-content {
125
+ padding: 16px;
126
+ font-size: 13px;
127
+ line-height: 1.6;
128
+ color: var(--chat-text-muted, #999);
129
+ }
130
+
131
+ .confirm-dialog-footer {
132
+ display: flex;
133
+ justify-content: flex-end;
134
+ gap: 8px;
135
+ padding: 12px 16px;
136
+ border-top: 1px solid var(--chat-border, #333);
137
+ }
138
+
139
+ .btn {
140
+ padding: 6px 12px;
141
+ font-size: 13px;
142
+ font-weight: 500;
143
+ border: none;
144
+ border-radius: 4px;
145
+ cursor: pointer;
146
+ transition: all 0.15s;
147
+ }
148
+
149
+ .btn-cancel {
150
+ background: transparent;
151
+ color: var(--chat-text-muted, #999);
152
+ border: 1px solid var(--chat-border, #444);
153
+ }
154
+
155
+ .btn-cancel:hover {
156
+ background: rgba(255, 255, 255, 0.05);
157
+ color: var(--chat-text, #fff);
158
+ }
159
+
160
+ .btn-info {
161
+ background: #3b82f6;
162
+ color: #fff;
163
+ }
164
+
165
+ .btn-info:hover {
166
+ background: #2563eb;
167
+ }
168
+
169
+ .btn-warning {
170
+ background: #f59e0b;
171
+ color: #000;
172
+ }
173
+
174
+ .btn-warning:hover {
175
+ background: #d97706;
176
+ }
177
+
178
+ .btn-danger {
179
+ background: #ef4444;
180
+ color: #fff;
181
+ }
182
+
183
+ .btn-danger:hover {
184
+ background: #dc2626;
185
+ }
186
+
187
+ /* 过渡动画 */
188
+ .dialog-enter-active,
189
+ .dialog-leave-active {
190
+ transition: opacity 0.2s ease;
191
+ }
192
+
193
+ .dialog-enter-active .confirm-dialog,
194
+ .dialog-leave-active .confirm-dialog {
195
+ transition: transform 0.2s ease, opacity 0.2s ease;
196
+ }
197
+
198
+ .dialog-enter-from,
199
+ .dialog-leave-to {
200
+ opacity: 0;
201
+ }
202
+
203
+ .dialog-enter-from .confirm-dialog,
204
+ .dialog-leave-to .confirm-dialog {
205
+ transform: scale(0.95);
206
+ opacity: 0;
207
+ }
208
+ </style>
@@ -0,0 +1,71 @@
1
+ <template>
2
+ <button
3
+ class="copy-btn"
4
+ :class="{ copied }"
5
+ :title="copied ? '已复制' : title"
6
+ @click.stop="handleCopy"
7
+ >
8
+ <Icon :icon="copied ? 'lucide:check' : 'lucide:copy'" :width="size" />
9
+ </button>
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ import { ref } from 'vue'
14
+ import { Icon } from '@iconify/vue'
15
+
16
+ const props = withDefaults(defineProps<{
17
+ /** 要复制的文本 */
18
+ text: string
19
+ /** 按钮标题 */
20
+ title?: string
21
+ /** 图标大小 */
22
+ size?: number
23
+ }>(), {
24
+ title: '复制',
25
+ size: 14,
26
+ })
27
+
28
+ const emit = defineEmits<{
29
+ copy: [text: string]
30
+ }>()
31
+
32
+ const copied = ref(false)
33
+
34
+ async function handleCopy() {
35
+ try {
36
+ await navigator.clipboard.writeText(props.text)
37
+ copied.value = true
38
+ emit('copy', props.text)
39
+ setTimeout(() => {
40
+ copied.value = false
41
+ }, 2000)
42
+ } catch (err) {
43
+ console.error('复制失败:', err)
44
+ }
45
+ }
46
+ </script>
47
+
48
+ <style scoped>
49
+ .copy-btn {
50
+ display: flex;
51
+ align-items: center;
52
+ justify-content: center;
53
+ padding: 4px;
54
+ background: transparent;
55
+ border: none;
56
+ color: var(--chat-text-muted, #888);
57
+ cursor: pointer;
58
+ border-radius: 4px;
59
+ transition: all 0.2s;
60
+ }
61
+
62
+ .copy-btn:hover {
63
+ background: rgba(255, 255, 255, 0.1);
64
+ color: var(--chat-text, #fff);
65
+ }
66
+
67
+ .copy-btn.copied {
68
+ color: var(--chat-success, #22c55e);
69
+ }
70
+ </style>
71
+