@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
@@ -1,25 +1,29 @@
1
1
  /**
2
2
  * AI Chat 前端类型定义
3
3
  * 核心类型从 bridge-electron 导出,保持类型一致性
4
+ *
5
+ * 架构:消息内容使用 ContentPart 数组,支持流式渲染和自定义 UI
4
6
  */
5
7
 
6
8
  // 从 bridge-electron 导入类型
7
9
  import type {
8
10
  ChatMode as ChatModeType,
9
- ModelConfig as ModelConfigType,
10
- ModelProvider as ModelProviderType,
11
11
  ThinkingMode as ThinkingModeType,
12
12
  SessionRecord as SessionRecordType,
13
13
  MessageRecord as MessageRecordType,
14
+ ModelOption as ModelOptionType,
15
+ ProviderType as ProviderTypeType,
14
16
  } from '@huyooo/ai-chat-bridge-electron/renderer'
15
17
 
16
18
  // 重新导出核心类型
17
19
  export type ChatMode = ChatModeType
18
- export type ModelConfig = ModelConfigType
19
- export type ModelProvider = ModelProviderType
20
20
  export type ThinkingMode = ThinkingModeType
21
21
  export type SessionRecord = SessionRecordType
22
22
  export type MessageRecord = MessageRecordType
23
+ export type ModelOption = ModelOptionType
24
+ export type ProviderType = ProviderTypeType
25
+
26
+ // ==================== Content Part 类型 ====================
23
27
 
24
28
  /** 搜索结果 */
25
29
  export interface SearchResult {
@@ -28,115 +32,159 @@ export interface SearchResult {
28
32
  snippet: string
29
33
  }
30
34
 
31
- /** 工具调用 */
32
- export interface ToolCall {
35
+ /** 文本内容 Part */
36
+ export interface TextPart {
37
+ type: 'text'
38
+ text: string
39
+ }
40
+
41
+ /** 思考过程 Part */
42
+ export interface ThinkingPart {
43
+ type: 'thinking'
44
+ text: string
45
+ status: 'running' | 'done'
46
+ duration?: number // 秒
47
+ }
48
+
49
+ /** 搜索 Part */
50
+ export interface SearchPart {
51
+ type: 'search'
52
+ query?: string
53
+ results?: SearchResult[]
54
+ status: 'running' | 'done'
55
+ }
56
+
57
+ /** 工具调用 Part */
58
+ export interface ToolCallPart {
59
+ type: 'tool_call'
60
+ id: string
33
61
  name: string
34
62
  args?: Record<string, unknown>
35
- result?: string
36
- status: 'running' | 'success' | 'error'
63
+ status: 'pending' | 'running' | 'done' | 'error' | 'cancelled' | 'skipped' // pending: 等待用户批准, cancelled: 已取消, skipped: 已跳过
64
+ result: unknown | null // 执行结果,null 表示尚未执行或没有结果
65
+ }
66
+
67
+ /** 工具结果 Part - 用于自定义 UI 渲染(备用,主要使用 ToolCallPart) */
68
+ export interface ToolResultPart {
69
+ type: 'tool_result'
70
+ id: string
71
+ name: string
72
+ args?: Record<string, unknown>
73
+ result: unknown // 解析后的结构化数据
74
+ status: 'done' | 'error' | 'cancelled' | 'skipped'
75
+ }
76
+
77
+ /** 图片 Part */
78
+ export interface ImagePart {
79
+ type: 'image'
80
+ url: string
81
+ }
82
+
83
+ /** 错误 Part */
84
+ export interface ErrorPart {
85
+ type: 'error'
86
+ message: string
87
+ category?: string
88
+ retryable?: boolean
37
89
  }
38
90
 
39
- /** 聊天消息(前端显示用) */
91
+ /** 内容 Part 联合类型 */
92
+ export type ContentPart =
93
+ | TextPart
94
+ | ThinkingPart
95
+ | SearchPart
96
+ | ToolCallPart
97
+ | ToolResultPart
98
+ | ImagePart
99
+ | ErrorPart
100
+
101
+ /** 内容 Part 类型字符串 */
102
+ export type ContentPartType = ContentPart['type']
103
+
104
+ /** 步骤折叠模式 */
105
+ export type StepsExpandedType = 'open' | 'close' | 'auto'
106
+
107
+
108
+ // ==================== 消息类型 ====================
109
+
110
+ /** 错误详情(结构化错误信息) */
111
+ export interface ErrorDetails {
112
+ category?: string
113
+ message: string
114
+ code?: string
115
+ statusCode?: number
116
+ retryable?: boolean
117
+ retryAfter?: number
118
+ }
119
+
120
+ /** 聊天消息(前端显示用)- 新架构:基于 parts 数组 */
40
121
  export interface ChatMessage {
41
122
  id: string
42
123
  role: 'user' | 'assistant'
43
- content: string
124
+ /** 内容 parts 数组 - 核心渲染数据 */
125
+ parts: ContentPart[]
126
+ /** 生成此消息时使用的模型 */
127
+ model?: string
128
+ /** 生成此消息时使用的模式 (ask/agent) */
129
+ mode?: string
130
+ /** 生成此消息时是否启用 web 搜索 */
131
+ webSearchEnabled?: boolean
132
+ /** 生成此消息时是否启用深度思考 */
133
+ thinkingEnabled?: boolean
134
+ /** 用户上传的图片(仅用户消息) */
44
135
  images?: string[]
45
- thinking?: string
46
- thinkingComplete?: boolean
47
- searchResults?: SearchResult[]
48
- searching?: boolean
49
- toolCalls?: ToolCall[]
50
- copied?: boolean
136
+ /** 是否正在加载 */
51
137
  loading?: boolean
138
+ /** 是否已复制 */
139
+ copied?: boolean
140
+ /** 消息时间戳 */
52
141
  timestamp?: Date
142
+ /** 错误详情(如果有错误) */
143
+ error?: ErrorDetails
144
+ /** 是否被用户中止 */
145
+ aborted?: boolean
53
146
  }
54
147
 
55
- /** 默认模型列表 */
56
- export const DEFAULT_MODELS: ModelConfigType[] = [
57
- {
58
- provider: 'openrouter',
59
- model: 'anthropic/claude-opus-4.5',
60
- displayName: 'Claude Opus 4.5',
61
- supportsTools: true,
62
- supportsWebSearch: true,
63
- supportedThinkingModes: ['enabled', 'disabled'],
64
- },
65
- {
66
- provider: 'doubao',
67
- model: 'doubao-seed-1-6-251015',
68
- displayName: 'Doubao Seed',
69
- supportsTools: true,
70
- supportsWebSearch: true,
71
- supportedThinkingModes: ['enabled', 'disabled'],
72
- },
73
- {
74
- provider: 'deepseek',
75
- model: 'deepseek-v3-1-terminus',
76
- displayName: 'DeepSeek V3',
77
- supportsTools: true,
78
- supportsWebSearch: true,
79
- supportedThinkingModes: ['enabled', 'disabled'],
80
- },
81
- {
82
- provider: 'qwen',
83
- model: 'qwen3-max-preview',
84
- displayName: 'Qwen Max',
85
- supportsTools: true,
86
- supportsWebSearch: true,
87
- supportedThinkingModes: ['enabled', 'disabled'],
88
- },
89
- {
90
- provider: 'gemini',
91
- model: 'gemini-3-pro-preview',
92
- displayName: 'Gemini 3 Pro',
93
- supportsTools: true,
94
- supportsWebSearch: true,
95
- supportedThinkingModes: ['enabled', 'disabled'],
96
- },
97
- ]
98
-
99
- // ================ 以下为向后兼容的类型 ================
100
-
101
- /** @deprecated 使用 SessionRecord */
102
- export interface ChatSession {
103
- id: string
104
- title: string
105
- messages: ChatMessage[]
106
- createdAt: Date
107
- updatedAt: Date
148
+ /** 获取消息的纯文本内容(用于复制、保存等) */
149
+ export function getMessageText(message: ChatMessage): string {
150
+ return message.parts
151
+ .filter((p): p is TextPart => p.type === 'text')
152
+ .map(p => p.text)
153
+ .join('')
108
154
  }
109
155
 
110
- /** 音视频操作类型 */
111
- export interface MediaOperation {
112
- id: string
113
- type: 'clip' | 'transcode' | 'merge' | 'extract_audio' | 'add_subtitle' | 'analyze'
114
- description: string
115
- sourceFiles: string[]
116
- targetFile?: string
117
- parameters?: Record<string, unknown>
118
- status?: 'pending' | 'applied' | 'rejected'
119
- preview?: string
156
+ /** 输入区配置快照(用于历史回溯/重发) */
157
+ export interface ChatInputOptions {
158
+ mode: ChatMode
159
+ model: string
160
+ webSearchEnabled: boolean
161
+ thinkingEnabled: boolean
120
162
  }
121
163
 
122
- /** @deprecated 使用字符串枚举 */
123
- export type AiModel = 'gemini-3-pro-preview' | 'gemini-3-pro-image-preview'
124
-
125
- export enum FileType {
126
- FOLDER = 'folder',
127
- IMAGE = 'image',
128
- VIDEO = 'video',
129
- AUDIO = 'audio',
130
- TEXT = 'text',
131
- PDF = 'pdf',
132
- CODE = 'code',
133
- ARCHIVE = 'archive',
134
- OTHER = 'other'
135
- }
164
+ // ==================== 兼容旧类型(逐步废弃)====================
165
+
166
+ /** @deprecated 使用 ContentPart 替代 */
167
+ export type ExecutionStepType = 'thinking' | 'search' | 'tool_call' | 'error'
168
+
169
+ /** @deprecated 使用 ContentPart 替代 */
170
+ export type ExecutionStepStatus = 'running' | 'completed' | 'error'
136
171
 
137
- export interface DiffStat {
138
- file: string
139
- additions: number
140
- deletions: number
141
- type: 'modified' | 'added' | 'deleted'
172
+ /** @deprecated 使用 ContentPart 替代 */
173
+ export type ExecutionStep = {
174
+ id: string
175
+ type: ExecutionStepType
176
+ status: ExecutionStepStatus
177
+ startedAt?: number
178
+ completedAt?: number
179
+ duration?: number
180
+ content?: string
181
+ query?: string
182
+ results?: SearchResult[]
183
+ callId?: string
184
+ name?: string
185
+ args?: Record<string, unknown>
186
+ result?: string
187
+ message?: string
188
+ category?: string
142
189
  }
190
+
@@ -0,0 +1,49 @@
1
+ /**
2
+ * 根据文件名或路径获取对应的图标
3
+ */
4
+ export function getFileIcon(nameOrPath: string): string {
5
+ const name = basename(nameOrPath).toLowerCase();
6
+ const ext = name.includes('.') ? name.slice(name.lastIndexOf('.')) : '';
7
+
8
+ if (ext === '.vue') return 'vscode-icons:file-type-vue';
9
+ if (ext === '.tsx') return 'vscode-icons:file-type-reactts';
10
+ if (ext === '.jsx') return 'vscode-icons:file-type-reactjs';
11
+ if (ext === '.ts') return 'vscode-icons:file-type-typescript';
12
+ if (ext === '.js') return 'vscode-icons:file-type-js';
13
+ if (ext === '.css') return 'vscode-icons:file-type-css';
14
+ if (ext === '.scss' || ext === '.sass') return 'vscode-icons:file-type-scss';
15
+ if (ext === '.less') return 'vscode-icons:file-type-less';
16
+ if (ext === '.json') return 'vscode-icons:file-type-json';
17
+ if (ext === '.yaml' || ext === '.yml') return 'vscode-icons:file-type-yaml';
18
+ if (ext === '.xml') return 'vscode-icons:file-type-xml';
19
+ if (ext === '.md') return 'vscode-icons:file-type-markdown';
20
+ if (ext === '.txt') return 'vscode-icons:file-type-text';
21
+ if (['.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.ico'].includes(ext)) {
22
+ return 'vscode-icons:file-type-image';
23
+ }
24
+ if (ext === '.html' || ext === '.htm') return 'vscode-icons:file-type-html';
25
+ if (ext === '.py') return 'vscode-icons:file-type-python';
26
+ if (ext === '.go') return 'vscode-icons:file-type-go';
27
+ if (ext === '.rs') return 'vscode-icons:file-type-rust';
28
+ if (ext === '.sh' || ext === '.bash' || ext === '.zsh') return 'vscode-icons:file-type-shell';
29
+
30
+ return 'lucide:file';
31
+ }
32
+
33
+ /**
34
+ * 获取路径的文件名部分
35
+ */
36
+ export function basename(p: string): string {
37
+ const normalized = p.replace(/\\/g, '/');
38
+ const idx = normalized.lastIndexOf('/');
39
+ return idx >= 0 ? normalized.slice(idx + 1) || normalized : normalized;
40
+ }
41
+
42
+ /**
43
+ * 获取路径的目录部分
44
+ */
45
+ export function dirname(p: string): string {
46
+ const normalized = p.replace(/\\/g, '/');
47
+ const idx = normalized.lastIndexOf('/');
48
+ return idx > 0 ? normalized.slice(0, idx) : '';
49
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChatInput.vue.d.ts","sourceRoot":"","sources":["../../src/components/ChatInput.vue"],"names":[],"mappings":"AAiJA;AA0pBA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGtD,KAAK,WAAW,GAAG;IACf,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;;;oBAuMc,MAAM;;;;;;;;;;;;;;;;;;;;;;;WA3MZ,MAAM;UADP,QAAQ;aALL,OAAO,GAAG,SAAS;WAErB,MAAM;oBACG,MAAM,EAAE;eACb,OAAO;YAGV,WAAW,EAAE;sBACH,OAAO;qBACR,OAAO;;;;;AA+nB7B,wBAWG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchResultBlock.vue.d.ts","sourceRoot":"","sources":["../../../src/components/chat/SearchResultBlock.vue"],"names":[],"mappings":"AAgCA;AA+JA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;;AA4IF,wBAOG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ThinkingBlock.vue.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ThinkingBlock.vue"],"names":[],"mappings":"AAgBA;AAkHA,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;;AAmHF,wBAOG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ToolCallBlock.vue.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ToolCallBlock.vue"],"names":[],"mappings":"AA+BA;AAoOA,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;CACzC,CAAC;;AA6MF,wBAOG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExecutionSteps.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/messages/ExecutionSteps.vue"],"names":[],"mappings":"AA8EA;AA6RA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE7D,KAAK,WAAW,GAAG;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CACxB,CAAC;;AA8VF,wBAMG"}
@@ -1,28 +0,0 @@
1
- import { ToolCall, SearchResult } from '../../../types';
2
- type __VLS_Props = {
3
- role: 'user' | 'assistant';
4
- content: string;
5
- images?: string[];
6
- thinking?: string;
7
- thinkingComplete?: boolean;
8
- searchResults?: SearchResult[];
9
- searching?: boolean;
10
- toolCalls?: ToolCall[];
11
- loading?: boolean;
12
- copied?: boolean;
13
- /** 是否支持重新发送(仅用户消息) */
14
- onSend?: (text: string) => void;
15
- };
16
- declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
17
- copy: () => any;
18
- send: (text: string) => any;
19
- regenerate: () => any;
20
- "view-image": (url: string) => any;
21
- }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
22
- onCopy?: (() => any) | undefined;
23
- onSend?: ((text: string) => any) | undefined;
24
- onRegenerate?: (() => any) | undefined;
25
- "onView-image"?: ((url: string) => any) | undefined;
26
- }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
27
- export default _default;
28
- //# sourceMappingURL=MessageBubble.vue.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MessageBubble.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/messages/MessageBubble.vue"],"names":[],"mappings":"AA8DA;AAsRA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE7D,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sBAAsB;IACtB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,CAAC;;;;;;;;;;;;AAyOF,wBAQG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChatHeader.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/ui/ChatHeader.vue"],"names":[],"mappings":"AAqIA;AAsiBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkhBF,wBASG"}
@@ -1,7 +0,0 @@
1
- declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
2
- "quick-action": (prompt: string) => any;
3
- }, string, import('vue').PublicProps, Readonly<{}> & Readonly<{
4
- "onQuick-action"?: ((prompt: string) => any) | undefined;
5
- }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
6
- export default _default;
7
- //# sourceMappingURL=WelcomeMessage.vue.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WelcomeMessage.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/ui/WelcomeMessage.vue"],"names":[],"mappings":"AAqBA;;;;;;AA8QA,wBAOG"}
@@ -1,6 +0,0 @@
1
- /**
2
- * AI Chat 模块的 Preload 脚本(完全独立实现)
3
- */
4
- declare const _default: {};
5
- export default _default;
6
- //# sourceMappingURL=preload.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preload.d.ts","sourceRoot":"","sources":["../../src/preload/preload.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAyEH,wBAEE"}