@huyooo/ai-chat-bridge-electron 0.2.45 → 0.3.6
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.
- package/dist/main/asr/client.d.ts +112 -0
- package/dist/main/asr/index.d.ts +35 -0
- package/dist/main/asr/protocol.d.ts +135 -0
- package/dist/main/create-electron-chat.d.ts +100 -0
- package/dist/main/index.d.ts +88 -169
- package/dist/main/index.js +1 -1
- package/dist/preload/index.d.ts +47 -28
- package/dist/preload/index.js +1 -1
- package/dist/renderer/index.d.ts +10 -204
- package/dist/renderer/index.js +2 -1
- package/dist/renderer/logger.d.ts +16 -0
- package/package.json +13 -8
- package/dist/main/index.cjs +0 -364
- package/dist/main/index.d.cts +0 -61
- package/dist/main/index.js.map +0 -1
- package/dist/preload/index.cjs +0 -122
- package/dist/preload/index.d.cts +0 -276
- package/dist/preload/index.js.map +0 -1
- package/dist/renderer/index.cjs +0 -199
- package/dist/renderer/index.d.cts +0 -504
- package/dist/renderer/index.js.map +0 -1
|
@@ -1,504 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Electron Preload 桥接
|
|
3
|
-
*
|
|
4
|
-
* 在 preload 脚本中调用,暴露 API 给渲染进程
|
|
5
|
-
*/
|
|
6
|
-
/** 发送消息参数 */
|
|
7
|
-
interface SendMessageParams {
|
|
8
|
-
message: string;
|
|
9
|
-
images?: string[];
|
|
10
|
-
sessionId?: string;
|
|
11
|
-
options?: {
|
|
12
|
-
mode?: string;
|
|
13
|
-
model?: string;
|
|
14
|
-
provider?: string;
|
|
15
|
-
enableWebSearch?: boolean;
|
|
16
|
-
thinkingMode?: string;
|
|
17
|
-
thinkingBudget?: number;
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
/** 模型配置 */
|
|
21
|
-
interface ModelOption$1 {
|
|
22
|
-
modelId: string;
|
|
23
|
-
displayName: string;
|
|
24
|
-
/** 分组名称(由后端决定,前端只负责渲染,必填) */
|
|
25
|
-
group: string;
|
|
26
|
-
/** 是否来自 OpenRouter(保留用于兼容,后续可能移除) */
|
|
27
|
-
isOpenRouter?: boolean;
|
|
28
|
-
/** 提供商名称(保留用于兼容,后续可能移除) */
|
|
29
|
-
provider?: string;
|
|
30
|
-
}
|
|
31
|
-
/** 会话记录 */
|
|
32
|
-
interface SessionRecord$1 {
|
|
33
|
-
id: string;
|
|
34
|
-
appId: string | null;
|
|
35
|
-
userId: string | null;
|
|
36
|
-
title: string;
|
|
37
|
-
model: string;
|
|
38
|
-
mode: 'agent' | 'plan' | 'ask';
|
|
39
|
-
webSearchEnabled: boolean;
|
|
40
|
-
thinkingEnabled: boolean;
|
|
41
|
-
/** 是否在 tab 栏隐藏(关闭但不删除) */
|
|
42
|
-
hidden: boolean;
|
|
43
|
-
createdAt: Date;
|
|
44
|
-
updatedAt: Date;
|
|
45
|
-
}
|
|
46
|
-
/** 消息记录 */
|
|
47
|
-
interface MessageRecord$1 {
|
|
48
|
-
id: string;
|
|
49
|
-
sessionId: string;
|
|
50
|
-
role: 'user' | 'assistant';
|
|
51
|
-
content: string;
|
|
52
|
-
/** 生成此消息时使用的模型 */
|
|
53
|
-
model?: string | null;
|
|
54
|
-
/** 生成此消息时使用的模式 (ask/agent) */
|
|
55
|
-
mode?: string | null;
|
|
56
|
-
/** 生成此消息时是否启用 web 搜索 */
|
|
57
|
-
webSearchEnabled?: boolean | null;
|
|
58
|
-
/** 生成此消息时是否启用深度思考 */
|
|
59
|
-
thinkingEnabled?: boolean | null;
|
|
60
|
-
/** 执行步骤列表 JSON */
|
|
61
|
-
steps?: string | null;
|
|
62
|
-
operationIds?: string | null;
|
|
63
|
-
timestamp: Date;
|
|
64
|
-
}
|
|
65
|
-
/** 操作记录 */
|
|
66
|
-
interface OperationRecord$1 {
|
|
67
|
-
id: string;
|
|
68
|
-
sessionId: string;
|
|
69
|
-
messageId?: string | null;
|
|
70
|
-
command: string;
|
|
71
|
-
operationType: string;
|
|
72
|
-
affectedFiles: string;
|
|
73
|
-
status: string;
|
|
74
|
-
timestamp: Date;
|
|
75
|
-
}
|
|
76
|
-
/** 回收站记录 */
|
|
77
|
-
interface TrashRecord$1 {
|
|
78
|
-
id: string;
|
|
79
|
-
sessionId: string;
|
|
80
|
-
originalPath: string;
|
|
81
|
-
trashPath: string;
|
|
82
|
-
deletedAt: Date;
|
|
83
|
-
autoDeleteAt: Date;
|
|
84
|
-
}
|
|
85
|
-
/** 文件信息 */
|
|
86
|
-
interface FileInfo$1 {
|
|
87
|
-
name: string;
|
|
88
|
-
path: string;
|
|
89
|
-
isDirectory: boolean;
|
|
90
|
-
size: number;
|
|
91
|
-
modifiedAt: Date;
|
|
92
|
-
extension: string;
|
|
93
|
-
}
|
|
94
|
-
interface AiChatBridge {
|
|
95
|
-
/** 获取可用模型 */
|
|
96
|
-
getModels(): Promise<ModelOption$1[]>;
|
|
97
|
-
/** 发送消息 */
|
|
98
|
-
send(params: SendMessageParams): Promise<void>;
|
|
99
|
-
/** 取消当前请求 */
|
|
100
|
-
cancel(): Promise<void>;
|
|
101
|
-
/** 设置当前工作目录 */
|
|
102
|
-
setCwd(dir: string): Promise<void>;
|
|
103
|
-
/** 获取配置 */
|
|
104
|
-
getConfig(): Promise<unknown>;
|
|
105
|
-
/** 监听进度事件 */
|
|
106
|
-
onProgress(callback: (progress: unknown) => void): () => void;
|
|
107
|
-
/** 获取会话列表 */
|
|
108
|
-
getSessions(): Promise<SessionRecord$1[]>;
|
|
109
|
-
/** 获取单个会话 */
|
|
110
|
-
getSession(id: string): Promise<SessionRecord$1 | null>;
|
|
111
|
-
/** 创建会话 */
|
|
112
|
-
createSession(params?: {
|
|
113
|
-
title?: string;
|
|
114
|
-
model?: string;
|
|
115
|
-
mode?: string;
|
|
116
|
-
webSearchEnabled?: boolean;
|
|
117
|
-
thinkingEnabled?: boolean;
|
|
118
|
-
hidden?: boolean;
|
|
119
|
-
}): Promise<SessionRecord$1>;
|
|
120
|
-
/** 更新会话 */
|
|
121
|
-
updateSession(id: string, data: {
|
|
122
|
-
title?: string;
|
|
123
|
-
model?: string;
|
|
124
|
-
mode?: string;
|
|
125
|
-
webSearchEnabled?: boolean;
|
|
126
|
-
thinkingEnabled?: boolean;
|
|
127
|
-
hidden?: boolean;
|
|
128
|
-
}): Promise<SessionRecord$1 | null>;
|
|
129
|
-
/** 删除会话 */
|
|
130
|
-
deleteSession(id: string): Promise<{
|
|
131
|
-
success: boolean;
|
|
132
|
-
}>;
|
|
133
|
-
/** 获取会话消息 */
|
|
134
|
-
getMessages(sessionId: string): Promise<MessageRecord$1[]>;
|
|
135
|
-
/** 保存消息 */
|
|
136
|
-
saveMessage(params: {
|
|
137
|
-
/** 消息 ID(可选,如果不传则自动生成) */
|
|
138
|
-
id?: string;
|
|
139
|
-
sessionId: string;
|
|
140
|
-
role: 'user' | 'assistant';
|
|
141
|
-
content: string;
|
|
142
|
-
/** 生成此消息时使用的模型 */
|
|
143
|
-
model?: string;
|
|
144
|
-
/** 生成此消息时使用的模式 (ask/agent) */
|
|
145
|
-
mode?: string;
|
|
146
|
-
/** 生成此消息时是否启用 web 搜索 */
|
|
147
|
-
webSearchEnabled?: boolean;
|
|
148
|
-
/** 生成此消息时是否启用深度思考 */
|
|
149
|
-
thinkingEnabled?: boolean;
|
|
150
|
-
/** 执行步骤列表 JSON */
|
|
151
|
-
steps?: string;
|
|
152
|
-
operationIds?: string;
|
|
153
|
-
}): Promise<MessageRecord$1>;
|
|
154
|
-
/** 更新消息(增量保存) */
|
|
155
|
-
updateMessage(params: {
|
|
156
|
-
id: string;
|
|
157
|
-
content?: string;
|
|
158
|
-
steps?: string;
|
|
159
|
-
}): Promise<{
|
|
160
|
-
success: boolean;
|
|
161
|
-
}>;
|
|
162
|
-
/** 删除指定时间之后的消息(用于分叉) */
|
|
163
|
-
deleteMessagesAfter(sessionId: string, timestamp: number): Promise<{
|
|
164
|
-
success: boolean;
|
|
165
|
-
}>;
|
|
166
|
-
/** 获取操作日志 */
|
|
167
|
-
getOperations(sessionId: string): Promise<OperationRecord$1[]>;
|
|
168
|
-
/** 获取回收站 */
|
|
169
|
-
getTrashItems(): Promise<TrashRecord$1[]>;
|
|
170
|
-
/** 恢复回收站项目 */
|
|
171
|
-
restoreFromTrash(id: string): Promise<TrashRecord$1 | undefined>;
|
|
172
|
-
/** 在系统默认浏览器中打开链接 */
|
|
173
|
-
openExternal(url: string): Promise<void>;
|
|
174
|
-
/** 列出目录内容 */
|
|
175
|
-
listDir(dirPath: string): Promise<FileInfo$1[]>;
|
|
176
|
-
/** 检查路径是否存在 */
|
|
177
|
-
exists(filePath: string): Promise<boolean>;
|
|
178
|
-
/** 获取文件信息 */
|
|
179
|
-
stat(filePath: string): Promise<FileInfo$1 | null>;
|
|
180
|
-
/** 读取文件内容(文本) */
|
|
181
|
-
readFile(filePath: string): Promise<string | null>;
|
|
182
|
-
/** 读取文件为 base64 */
|
|
183
|
-
readFileBase64(filePath: string): Promise<string | null>;
|
|
184
|
-
/** 获取用户主目录 */
|
|
185
|
-
homeDir(): Promise<string>;
|
|
186
|
-
/** 解析路径(处理 ~) */
|
|
187
|
-
resolvePath(inputPath: string): Promise<string>;
|
|
188
|
-
/** 获取父目录 */
|
|
189
|
-
parentDir(dirPath: string): Promise<string>;
|
|
190
|
-
/** 监听目录变化 */
|
|
191
|
-
watchDir(dirPath: string): Promise<boolean>;
|
|
192
|
-
/** 停止监听目录 */
|
|
193
|
-
unwatchDir(dirPath: string): Promise<void>;
|
|
194
|
-
/** 监听目录变化事件 */
|
|
195
|
-
onDirChange(callback: (data: {
|
|
196
|
-
dirPath: string;
|
|
197
|
-
eventType: string;
|
|
198
|
-
filename: string | null;
|
|
199
|
-
}) => void): () => void;
|
|
200
|
-
/** 获取用户设置 */
|
|
201
|
-
getSetting(key: string): Promise<string | null>;
|
|
202
|
-
/** 设置用户设置 */
|
|
203
|
-
setSetting(key: string, value: string): Promise<{
|
|
204
|
-
success: boolean;
|
|
205
|
-
}>;
|
|
206
|
-
/** 获取所有用户设置 */
|
|
207
|
-
getAllSettings(): Promise<Record<string, string>>;
|
|
208
|
-
/** 删除用户设置 */
|
|
209
|
-
deleteSetting(key: string): Promise<{
|
|
210
|
-
success: boolean;
|
|
211
|
-
}>;
|
|
212
|
-
/** 获取索引统计信息 */
|
|
213
|
-
getIndexStats(): Promise<{
|
|
214
|
-
totalDocuments: number;
|
|
215
|
-
indexSize: number;
|
|
216
|
-
lastUpdated: string | null;
|
|
217
|
-
}>;
|
|
218
|
-
/** 检查索引状态 */
|
|
219
|
-
getIndexStatus(): Promise<{
|
|
220
|
-
isIndexing: boolean;
|
|
221
|
-
lastProgress: {
|
|
222
|
-
indexed: number;
|
|
223
|
-
total: number;
|
|
224
|
-
currentFile?: string;
|
|
225
|
-
stage: string;
|
|
226
|
-
} | null;
|
|
227
|
-
}>;
|
|
228
|
-
/** 同步索引(重新索引工作空间) */
|
|
229
|
-
syncIndex(): Promise<{
|
|
230
|
-
success: boolean;
|
|
231
|
-
}>;
|
|
232
|
-
/** 取消索引 */
|
|
233
|
-
cancelIndex(): Promise<{
|
|
234
|
-
success: boolean;
|
|
235
|
-
}>;
|
|
236
|
-
/** 删除索引 */
|
|
237
|
-
deleteIndex(): Promise<{
|
|
238
|
-
success: boolean;
|
|
239
|
-
}>;
|
|
240
|
-
/** 注册索引进度监听器 */
|
|
241
|
-
registerIndexListener(): Promise<{
|
|
242
|
-
success: boolean;
|
|
243
|
-
}>;
|
|
244
|
-
/** 注销索引进度监听器 */
|
|
245
|
-
unregisterIndexListener(): Promise<{
|
|
246
|
-
success: boolean;
|
|
247
|
-
}>;
|
|
248
|
-
/** 监听索引进度 */
|
|
249
|
-
onIndexProgress(callback: (progress: {
|
|
250
|
-
indexed: number;
|
|
251
|
-
total: number;
|
|
252
|
-
currentFile?: string;
|
|
253
|
-
stage: string;
|
|
254
|
-
error?: string;
|
|
255
|
-
}) => void): () => void;
|
|
256
|
-
/** 监听工具批准请求(manual 模式) */
|
|
257
|
-
onToolApprovalRequest(callback: (request: {
|
|
258
|
-
id: string;
|
|
259
|
-
name: string;
|
|
260
|
-
args: Record<string, unknown>;
|
|
261
|
-
}) => void): () => void;
|
|
262
|
-
/** 响应工具批准请求 */
|
|
263
|
-
respondToolApproval(id: string, approved: boolean): Promise<void>;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Electron 渲染进程 Adapter
|
|
268
|
-
*
|
|
269
|
-
* 在渲染进程中使用,创建 ChatAdapter
|
|
270
|
-
*/
|
|
271
|
-
|
|
272
|
-
type ChatEventType = 'thinking_start' | 'thinking_delta' | 'thinking_end' | 'search_start' | 'search_result' | 'search_end' | 'tool_approval_request' | 'tool_call_start' | 'tool_call_output' | 'tool_call_result' | 'text_delta' | 'image' | 'video' | 'stream_start' | 'done' | 'error' | 'abort' | 'step_start' | 'step_end';
|
|
273
|
-
interface ChatEvent {
|
|
274
|
-
type: ChatEventType;
|
|
275
|
-
data: unknown;
|
|
276
|
-
}
|
|
277
|
-
type ChatMode = 'agent' | 'plan' | 'ask';
|
|
278
|
-
type ProviderType = 'ark' | 'qwen' | 'gemini' | 'openrouter';
|
|
279
|
-
type ThinkingMode = 'enabled' | 'disabled';
|
|
280
|
-
type AutoRunMode = 'run-everything' | 'manual';
|
|
281
|
-
interface AutoRunConfig {
|
|
282
|
-
/**
|
|
283
|
-
* 自动运行模式
|
|
284
|
-
* - 'run-everything': 运行所有内容(自动执行)
|
|
285
|
-
* - 'manual': 手动批准(每次执行前询问)
|
|
286
|
-
*/
|
|
287
|
-
mode?: AutoRunMode;
|
|
288
|
-
}
|
|
289
|
-
/** 聊天历史消息(无状态架构) */
|
|
290
|
-
interface ChatHistoryMessage {
|
|
291
|
-
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
292
|
-
content: string;
|
|
293
|
-
}
|
|
294
|
-
interface ChatOptions {
|
|
295
|
-
mode?: ChatMode;
|
|
296
|
-
model?: string;
|
|
297
|
-
provider?: ProviderType;
|
|
298
|
-
enableWebSearch?: boolean;
|
|
299
|
-
/** 深度思考开关(每个 provider 内部使用最优参数) */
|
|
300
|
-
thinkingMode?: ThinkingMode;
|
|
301
|
-
/** 自动运行配置 */
|
|
302
|
-
autoRunConfig?: AutoRunConfig;
|
|
303
|
-
/** 对话历史(无状态架构,历史从前端传入) */
|
|
304
|
-
history?: ChatHistoryMessage[];
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* 简化的模型配置
|
|
308
|
-
*/
|
|
309
|
-
interface ModelOption {
|
|
310
|
-
/** 模型 ID(发送给 API) */
|
|
311
|
-
modelId: string;
|
|
312
|
-
/** 显示名称 */
|
|
313
|
-
displayName: string;
|
|
314
|
-
/** 分组名称(由后端决定,前端只负责渲染,必填) */
|
|
315
|
-
group: string;
|
|
316
|
-
/** 是否来自 OpenRouter(保留用于兼容,后续可能移除) */
|
|
317
|
-
isOpenRouter?: boolean;
|
|
318
|
-
/** 提供商名称(保留用于兼容,后续可能移除) */
|
|
319
|
-
provider?: string;
|
|
320
|
-
}
|
|
321
|
-
interface SessionRecord {
|
|
322
|
-
id: string;
|
|
323
|
-
appId: string | null;
|
|
324
|
-
userId: string | null;
|
|
325
|
-
title: string;
|
|
326
|
-
model: string;
|
|
327
|
-
mode: ChatMode;
|
|
328
|
-
webSearchEnabled: boolean;
|
|
329
|
-
thinkingEnabled: boolean;
|
|
330
|
-
/** 是否在 tab 栏隐藏(关闭但不删除) */
|
|
331
|
-
hidden: boolean;
|
|
332
|
-
createdAt: Date;
|
|
333
|
-
updatedAt: Date;
|
|
334
|
-
}
|
|
335
|
-
interface MessageRecord {
|
|
336
|
-
id: string;
|
|
337
|
-
sessionId: string;
|
|
338
|
-
role: 'user' | 'assistant';
|
|
339
|
-
content: string;
|
|
340
|
-
/** 生成此消息时使用的模型 */
|
|
341
|
-
model?: string | null;
|
|
342
|
-
/** 生成此消息时使用的模式 (ask/agent) */
|
|
343
|
-
mode?: string | null;
|
|
344
|
-
/** 生成此消息时是否启用 web 搜索 */
|
|
345
|
-
webSearchEnabled?: boolean | null;
|
|
346
|
-
/** 生成此消息时是否启用深度思考 */
|
|
347
|
-
thinkingEnabled?: boolean | null;
|
|
348
|
-
/** 执行步骤列表 JSON */
|
|
349
|
-
steps?: string | null;
|
|
350
|
-
operationIds?: string | null;
|
|
351
|
-
timestamp: Date;
|
|
352
|
-
}
|
|
353
|
-
interface OperationRecord {
|
|
354
|
-
id: string;
|
|
355
|
-
sessionId: string;
|
|
356
|
-
messageId?: string | null;
|
|
357
|
-
command: string;
|
|
358
|
-
operationType: string;
|
|
359
|
-
affectedFiles: string;
|
|
360
|
-
status: string;
|
|
361
|
-
timestamp: Date;
|
|
362
|
-
}
|
|
363
|
-
interface TrashRecord {
|
|
364
|
-
id: string;
|
|
365
|
-
sessionId: string;
|
|
366
|
-
originalPath: string;
|
|
367
|
-
trashPath: string;
|
|
368
|
-
deletedAt: Date;
|
|
369
|
-
autoDeleteAt: Date;
|
|
370
|
-
}
|
|
371
|
-
interface FileInfo {
|
|
372
|
-
name: string;
|
|
373
|
-
path: string;
|
|
374
|
-
isDirectory: boolean;
|
|
375
|
-
size: number;
|
|
376
|
-
modifiedAt: Date;
|
|
377
|
-
extension: string;
|
|
378
|
-
}
|
|
379
|
-
interface ChatAdapter {
|
|
380
|
-
/** 获取可用模型 */
|
|
381
|
-
getModels(): Promise<ModelOption[]>;
|
|
382
|
-
/** 发送消息,返回异步迭代器 */
|
|
383
|
-
sendMessage(message: string, options?: ChatOptions, images?: string[], sessionId?: string): AsyncIterable<ChatEvent>;
|
|
384
|
-
/** 取消当前请求 */
|
|
385
|
-
cancel(): void;
|
|
386
|
-
/** 设置当前工作目录 */
|
|
387
|
-
setCwd?(dir: string): void;
|
|
388
|
-
/** 获取会话列表 */
|
|
389
|
-
getSessions(): Promise<SessionRecord[]>;
|
|
390
|
-
/** 获取单个会话 */
|
|
391
|
-
getSession(id: string): Promise<SessionRecord | null>;
|
|
392
|
-
/** 创建会话 */
|
|
393
|
-
createSession(params?: {
|
|
394
|
-
title?: string;
|
|
395
|
-
model?: string;
|
|
396
|
-
mode?: string;
|
|
397
|
-
webSearchEnabled?: boolean;
|
|
398
|
-
thinkingEnabled?: boolean;
|
|
399
|
-
hidden?: boolean;
|
|
400
|
-
}): Promise<SessionRecord>;
|
|
401
|
-
/** 更新会话 */
|
|
402
|
-
updateSession(id: string, data: {
|
|
403
|
-
title?: string;
|
|
404
|
-
model?: string;
|
|
405
|
-
mode?: string;
|
|
406
|
-
webSearchEnabled?: boolean;
|
|
407
|
-
thinkingEnabled?: boolean;
|
|
408
|
-
hidden?: boolean;
|
|
409
|
-
}): Promise<SessionRecord | null>;
|
|
410
|
-
/** 删除会话 */
|
|
411
|
-
deleteSession(id: string): Promise<void>;
|
|
412
|
-
/** 获取会话消息 */
|
|
413
|
-
getMessages(sessionId: string): Promise<MessageRecord[]>;
|
|
414
|
-
/** 保存消息 */
|
|
415
|
-
saveMessage(params: {
|
|
416
|
-
/** 消息 ID(可选,如果不传则自动生成) */
|
|
417
|
-
id?: string;
|
|
418
|
-
sessionId: string;
|
|
419
|
-
role: 'user' | 'assistant';
|
|
420
|
-
content: string;
|
|
421
|
-
/** 生成此消息时使用的模型 */
|
|
422
|
-
model?: string;
|
|
423
|
-
/** 生成此消息时使用的模式 (ask/agent) */
|
|
424
|
-
mode?: string;
|
|
425
|
-
/** 生成此消息时是否启用 web 搜索 */
|
|
426
|
-
webSearchEnabled?: boolean;
|
|
427
|
-
/** 生成此消息时是否启用深度思考 */
|
|
428
|
-
thinkingEnabled?: boolean;
|
|
429
|
-
/** 执行步骤列表 JSON */
|
|
430
|
-
steps?: string;
|
|
431
|
-
operationIds?: string;
|
|
432
|
-
}): Promise<MessageRecord>;
|
|
433
|
-
/** 更新消息(增量保存) */
|
|
434
|
-
updateMessage(params: {
|
|
435
|
-
id: string;
|
|
436
|
-
content?: string;
|
|
437
|
-
steps?: string;
|
|
438
|
-
}): Promise<void>;
|
|
439
|
-
/** 删除指定时间之后的消息(用于分叉) */
|
|
440
|
-
deleteMessagesAfter(sessionId: string, timestamp: number): Promise<void>;
|
|
441
|
-
/** 获取操作日志 */
|
|
442
|
-
getOperations(sessionId: string): Promise<OperationRecord[]>;
|
|
443
|
-
/** 获取回收站 */
|
|
444
|
-
getTrashItems(): Promise<TrashRecord[]>;
|
|
445
|
-
/** 恢复回收站项目 */
|
|
446
|
-
restoreFromTrash(id: string): Promise<TrashRecord | undefined>;
|
|
447
|
-
/** 列出目录内容 */
|
|
448
|
-
listDir?(dirPath: string): Promise<FileInfo[]>;
|
|
449
|
-
/** 检查路径是否存在 */
|
|
450
|
-
exists?(filePath: string): Promise<boolean>;
|
|
451
|
-
/** 获取文件信息 */
|
|
452
|
-
stat?(filePath: string): Promise<FileInfo | null>;
|
|
453
|
-
/** 读取文件内容(文本) */
|
|
454
|
-
readFile?(filePath: string): Promise<string | null>;
|
|
455
|
-
/** 读取文件为 base64 */
|
|
456
|
-
readFileBase64?(filePath: string): Promise<string | null>;
|
|
457
|
-
/** 获取用户主目录 */
|
|
458
|
-
homeDir?(): Promise<string>;
|
|
459
|
-
/** 解析路径(处理 ~) */
|
|
460
|
-
resolvePath?(inputPath: string): Promise<string>;
|
|
461
|
-
/** 获取父目录 */
|
|
462
|
-
parentDir?(dirPath: string): Promise<string>;
|
|
463
|
-
/** 监听目录变化 */
|
|
464
|
-
watchDir?(dirPath: string): Promise<boolean>;
|
|
465
|
-
/** 停止监听目录 */
|
|
466
|
-
unwatchDir?(dirPath: string): Promise<void>;
|
|
467
|
-
/** 监听目录变化事件 */
|
|
468
|
-
onDirChange?(callback: (data: {
|
|
469
|
-
dirPath: string;
|
|
470
|
-
eventType: string;
|
|
471
|
-
filename: string | null;
|
|
472
|
-
}) => void): () => void;
|
|
473
|
-
/** 获取用户设置 */
|
|
474
|
-
getSetting?(key: string): Promise<string | null>;
|
|
475
|
-
/** 设置用户设置 */
|
|
476
|
-
setSetting?(key: string, value: string): Promise<void>;
|
|
477
|
-
/** 获取所有用户设置 */
|
|
478
|
-
getAllSettings?(): Promise<Record<string, string>>;
|
|
479
|
-
/** 删除用户设置 */
|
|
480
|
-
deleteSetting?(key: string): Promise<void>;
|
|
481
|
-
/** 监听工具批准请求(manual 模式) */
|
|
482
|
-
onToolApprovalRequest?(callback: (request: {
|
|
483
|
-
id: string;
|
|
484
|
-
name: string;
|
|
485
|
-
args: Record<string, unknown>;
|
|
486
|
-
}) => void): () => void;
|
|
487
|
-
/** 响应工具批准请求 */
|
|
488
|
-
respondToolApproval?(id: string, approved: boolean): Promise<void>;
|
|
489
|
-
}
|
|
490
|
-
declare global {
|
|
491
|
-
interface Window {
|
|
492
|
-
aiChatBridge?: AiChatBridge;
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
interface CreateAdapterOptions {
|
|
496
|
-
/** 全局变量名 */
|
|
497
|
-
bridgeName?: string;
|
|
498
|
-
}
|
|
499
|
-
/**
|
|
500
|
-
* 创建 Electron Adapter
|
|
501
|
-
*/
|
|
502
|
-
declare function createElectronAdapter(options?: CreateAdapterOptions): ChatAdapter;
|
|
503
|
-
|
|
504
|
-
export { type AutoRunConfig, type AutoRunMode, type ChatAdapter, type ChatEvent, type ChatEventType, type ChatHistoryMessage, type ChatMode, type ChatOptions, type CreateAdapterOptions, type FileInfo, type MessageRecord, type ModelOption, type OperationRecord, type ProviderType, type SessionRecord, type ThinkingMode, type TrashRecord, createElectronAdapter };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/renderer/index.ts"],"sourcesContent":["/**\n * Electron 渲染进程 Adapter\n *\n * 在渲染进程中使用,创建 ChatAdapter\n *\n * 类型定义统一从 @huyooo/ai-chat-types 导入\n */\n\nimport type { AiChatBridge } from '../preload'\n\n// ==================== 重新导出所有类型 ====================\n// 统一从 @huyooo/ai-chat-types 导出,简化外部使用\n\nexport * from '@huyooo/ai-chat-types'\n\n// Electron 特有类型\nexport type { AiChatBridge } from '../preload'\n\n// ==================== Electron 特有类型 ====================\n\n// 声明 window 上的 bridge\ndeclare global {\n interface Window {\n aiChatBridge?: AiChatBridge\n }\n}\n\nexport interface CreateAdapterOptions {\n /** 全局变量名 */\n bridgeName?: string\n}\n\n// ==================== Electron Adapter 实现 ====================\n\nimport type {\n ChatAdapter,\n ChatEvent,\n ChatOptions,\n ModelOption,\n SessionRecord,\n MessageRecord,\n OperationRecord,\n TrashRecord,\n FileInfo,\n AsrSessionConfig,\n AsrResultData,\n ToolApprovalRequest,\n CreateSessionParams,\n UpdateSessionParams,\n SaveMessageParams,\n UpdateMessageParams,\n} from '@huyooo/ai-chat-types'\n\n/**\n * 创建 Electron Adapter\n */\nexport function createElectronAdapter(\n options: CreateAdapterOptions = {}\n): ChatAdapter {\n const { bridgeName = 'aiChatBridge' } = options\n\n const getBridge = (): AiChatBridge => {\n const bridge = (window as unknown as Record<string, unknown>)[\n bridgeName\n ] as AiChatBridge | undefined\n if (!bridge) {\n throw new Error(\n `AI Chat Bridge not found. Make sure to call exposeElectronBridge() in preload.`\n )\n }\n return bridge\n }\n\n return {\n // ============ Chat API ============\n async getModels(): Promise<ModelOption[]> {\n const bridge = getBridge()\n return bridge.getModels()\n },\n\n async getAllTools(): Promise<Array<{ name: string; description: string }>> {\n const bridge = getBridge()\n if (typeof bridge.getAllTools === 'function') {\n return bridge.getAllTools()\n }\n return []\n },\n\n async *sendMessage(\n message: string,\n options?: ChatOptions,\n images?: string[],\n sessionId?: string\n ): AsyncGenerator<ChatEvent> {\n const bridge = getBridge()\n\n const queue: ChatEvent[] = []\n let resolveNext: (() => void) | null = null\n let done = false\n\n const cleanup = bridge.onProgress((progress) => {\n const eventWithSession = progress as ChatEvent & { sessionId?: string }\n\n if (\n sessionId &&\n eventWithSession.sessionId &&\n eventWithSession.sessionId !== sessionId\n ) {\n return\n }\n\n queue.push(progress)\n resolveNext?.()\n\n if (progress.type === 'done' || progress.type === 'error') {\n done = true\n }\n })\n\n bridge.send({ message, images, options, sessionId })\n\n try {\n while (!done || queue.length > 0) {\n while (queue.length === 0 && !done) {\n await new Promise<void>((r) => (resolveNext = r))\n }\n\n if (queue.length > 0) {\n const progress = queue.shift()!\n yield progress\n\n if (progress.type === 'done' || progress.type === 'error') {\n break\n }\n }\n }\n } finally {\n cleanup()\n }\n },\n\n cancel() {\n getBridge().cancel()\n },\n\n setCwd(dir: string) {\n getBridge().setCwd(dir)\n },\n\n // ============ Sessions API ============\n async getSessions(): Promise<SessionRecord[]> {\n return getBridge().getSessions()\n },\n\n async getSession(id: string): Promise<SessionRecord | null> {\n return getBridge().getSession(id)\n },\n\n async createSession(params?: CreateSessionParams): Promise<SessionRecord> {\n return getBridge().createSession(params)\n },\n\n async updateSession(id: string, data: UpdateSessionParams): Promise<SessionRecord | null> {\n return getBridge().updateSession(id, data)\n },\n\n async deleteSession(id: string): Promise<void> {\n await getBridge().deleteSession(id)\n },\n\n // ============ Messages API ============\n async getMessages(sessionId: string): Promise<MessageRecord[]> {\n return getBridge().getMessages(sessionId)\n },\n\n async saveMessage(params: SaveMessageParams): Promise<MessageRecord> {\n return getBridge().saveMessage(params)\n },\n\n async updateMessage(params: UpdateMessageParams): Promise<void> {\n await getBridge().updateMessage(params)\n },\n\n async deleteMessagesAfter(\n sessionId: string,\n timestamp: number\n ): Promise<void> {\n await getBridge().deleteMessagesAfter(sessionId, timestamp)\n },\n\n async deleteMessagesAfterMessageId(\n sessionId: string,\n messageId: string\n ): Promise<void> {\n await getBridge().deleteMessagesAfterMessageId(sessionId, messageId)\n },\n\n // ============ Operations API ============\n async getOperations(sessionId: string): Promise<OperationRecord[]> {\n return getBridge().getOperations(sessionId)\n },\n\n // ============ Trash API ============\n async getTrashItems(): Promise<TrashRecord[]> {\n return getBridge().getTrashItems()\n },\n\n async restoreFromTrash(id: string): Promise<TrashRecord | undefined> {\n return getBridge().restoreFromTrash(id)\n },\n\n // ============ File System API ============\n async listDir(dirPath: string): Promise<FileInfo[]> {\n return getBridge().listDir(dirPath)\n },\n\n async exists(filePath: string): Promise<boolean> {\n return getBridge().exists(filePath)\n },\n\n async stat(filePath: string): Promise<FileInfo | null> {\n return getBridge().stat(filePath)\n },\n\n async readFile(filePath: string): Promise<string | null> {\n return getBridge().readFile(filePath)\n },\n\n async readFileBase64(filePath: string): Promise<string | null> {\n return getBridge().readFileBase64(filePath)\n },\n\n async homeDir(): Promise<string> {\n return getBridge().homeDir()\n },\n\n async resolvePath(inputPath: string): Promise<string> {\n return getBridge().resolvePath(inputPath)\n },\n\n async parentDir(dirPath: string): Promise<string> {\n return getBridge().parentDir(dirPath)\n },\n\n async watchDir(dirPath: string): Promise<boolean> {\n return getBridge().watchDir(dirPath)\n },\n\n async unwatchDir(dirPath: string): Promise<void> {\n return getBridge().unwatchDir(dirPath)\n },\n\n onDirChange(\n callback: (data: {\n dirPath: string\n eventType: string\n filename: string | null\n }) => void\n ): () => void {\n return getBridge().onDirChange(callback)\n },\n\n // ============ Settings API ============\n async getSetting(key: string): Promise<string | null> {\n const bridge = getBridge()\n if (bridge.getSetting) {\n return bridge.getSetting(key)\n }\n return null\n },\n\n async setSetting(key: string, value: string): Promise<void> {\n const bridge = getBridge()\n if (bridge.setSetting) {\n await bridge.setSetting(key, value)\n }\n },\n\n async getAllSettings(): Promise<Record<string, string>> {\n const bridge = getBridge()\n if (bridge.getAllSettings) {\n return bridge.getAllSettings()\n }\n return {}\n },\n\n async deleteSetting(key: string): Promise<void> {\n const bridge = getBridge()\n if (bridge.deleteSetting) {\n await bridge.deleteSetting(key)\n }\n },\n\n // ============ Index API ============\n async getIndexStats() {\n const bridge = getBridge()\n if (bridge.getIndexStats) {\n return bridge.getIndexStats()\n }\n return { totalDocuments: 0, indexSize: 0, lastUpdated: null }\n },\n\n async getIndexStatus() {\n const bridge = getBridge()\n if (bridge.getIndexStatus) {\n return bridge.getIndexStatus()\n }\n return { isIndexing: false, lastProgress: null }\n },\n\n async syncIndex() {\n const bridge = getBridge()\n if (bridge.syncIndex) {\n return bridge.syncIndex()\n }\n return { success: false }\n },\n\n async cancelIndex() {\n const bridge = getBridge()\n if (bridge.cancelIndex) {\n return bridge.cancelIndex()\n }\n return { success: false }\n },\n\n async deleteIndex() {\n const bridge = getBridge()\n if (bridge.deleteIndex) {\n return bridge.deleteIndex()\n }\n return { success: false }\n },\n\n async registerIndexListener() {\n const bridge = getBridge()\n if (bridge.registerIndexListener) {\n return bridge.registerIndexListener()\n }\n return { success: false }\n },\n\n async unregisterIndexListener() {\n const bridge = getBridge()\n if (bridge.unregisterIndexListener) {\n return bridge.unregisterIndexListener()\n }\n return { success: false }\n },\n\n onIndexProgress(callback) {\n const bridge = getBridge()\n if (bridge.onIndexProgress) {\n return bridge.onIndexProgress(callback)\n }\n return () => {}\n },\n\n // ============ Tool Approval API ============\n onToolApprovalRequest(callback: (request: ToolApprovalRequest) => void): () => void {\n const bridge = getBridge()\n if (bridge.onToolApprovalRequest) {\n return bridge.onToolApprovalRequest(callback)\n }\n return () => {}\n },\n\n async respondToolApproval(id: string, approved: boolean): Promise<void> {\n const bridge = getBridge()\n if (bridge.respondToolApproval) {\n return bridge.respondToolApproval(id, approved)\n }\n },\n\n // ============ ASR API ============\n async asrStart(\n config?: AsrSessionConfig\n ): Promise<{ success: boolean; error?: string }> {\n const bridge = getBridge()\n if (bridge.asrStart) {\n return bridge.asrStart(config)\n }\n return { success: false, error: 'ASR not supported' }\n },\n\n async asrSendAudio(\n audioData: ArrayBufferLike\n ): Promise<{ success: boolean; error?: string }> {\n const bridge = getBridge()\n if (bridge.asrSendAudio) {\n return bridge.asrSendAudio(audioData)\n }\n return { success: false, error: 'ASR not supported' }\n },\n\n async asrFinish(): Promise<{ success: boolean; error?: string }> {\n const bridge = getBridge()\n if (bridge.asrFinish) {\n return bridge.asrFinish()\n }\n return { success: false, error: 'ASR not supported' }\n },\n\n async asrStop(): Promise<{ success: boolean }> {\n const bridge = getBridge()\n if (bridge.asrStop) {\n return bridge.asrStop()\n }\n return { success: true }\n },\n\n async asrStatus(): Promise<{ connected: boolean }> {\n const bridge = getBridge()\n if (bridge.asrStatus) {\n return bridge.asrStatus()\n }\n return { connected: false }\n },\n\n async asrWarmup(\n config?: AsrSessionConfig\n ): Promise<{ success: boolean; error?: string }> {\n const bridge = getBridge()\n if (bridge.asrWarmup) {\n return bridge.asrWarmup(config)\n }\n return { success: false, error: 'ASR not supported' }\n },\n\n onAsrConnected(callback: () => void): () => void {\n const bridge = getBridge()\n if (bridge.onAsrConnected) {\n return bridge.onAsrConnected(callback)\n }\n return () => {}\n },\n\n onAsrResult(\n callback: (data: { result: AsrResultData; isLast: boolean }) => void\n ): () => void {\n const bridge = getBridge()\n if (bridge.onAsrResult) {\n return bridge.onAsrResult(callback)\n }\n return () => {}\n },\n\n onAsrError(callback: (error: { message: string }) => void): () => void {\n const bridge = getBridge()\n if (bridge.onAsrError) {\n return bridge.onAsrError(callback)\n }\n return () => {}\n },\n\n onAsrClosed(callback: () => void): () => void {\n const bridge = getBridge()\n if (bridge.onAsrClosed) {\n return bridge.onAsrClosed(callback)\n }\n return () => {}\n },\n\n // ============ System API ============\n async openExternal(url: string): Promise<void> {\n const bridge = getBridge()\n if (bridge.openExternal) {\n return bridge.openExternal(url)\n }\n },\n }\n}\n"],"mappings":"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","names":["options"]}
|