@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
package/dist/preload/index.cjs
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/preload/index.ts
|
|
21
|
-
var preload_exports = {};
|
|
22
|
-
__export(preload_exports, {
|
|
23
|
-
exposeElectronBridge: () => exposeElectronBridge
|
|
24
|
-
});
|
|
25
|
-
module.exports = __toCommonJS(preload_exports);
|
|
26
|
-
var import_electron = require("electron");
|
|
27
|
-
function exposeElectronBridge(options = {}) {
|
|
28
|
-
const { channelPrefix = "ai-chat", exposeName = "aiChatBridge" } = options;
|
|
29
|
-
const bridge = {
|
|
30
|
-
// ============ Chat API ============
|
|
31
|
-
getModels: () => import_electron.ipcRenderer.invoke(`${channelPrefix}:models`),
|
|
32
|
-
send: (params) => import_electron.ipcRenderer.invoke(`${channelPrefix}:send`, params),
|
|
33
|
-
cancel: () => import_electron.ipcRenderer.invoke(`${channelPrefix}:cancel`),
|
|
34
|
-
// 无状态架构:历史通过 ChatOptions.history 传入
|
|
35
|
-
setCwd: (dir) => import_electron.ipcRenderer.invoke(`${channelPrefix}:setCwd`, dir),
|
|
36
|
-
getConfig: () => import_electron.ipcRenderer.invoke(`${channelPrefix}:config`),
|
|
37
|
-
onProgress: (callback) => {
|
|
38
|
-
const handler = (_event, progress) => {
|
|
39
|
-
callback(progress);
|
|
40
|
-
};
|
|
41
|
-
import_electron.ipcRenderer.on(`${channelPrefix}:progress`, handler);
|
|
42
|
-
return () => {
|
|
43
|
-
import_electron.ipcRenderer.removeListener(`${channelPrefix}:progress`, handler);
|
|
44
|
-
};
|
|
45
|
-
},
|
|
46
|
-
onToolApprovalRequest: (callback) => {
|
|
47
|
-
const handler = (_event, request) => {
|
|
48
|
-
callback(request);
|
|
49
|
-
};
|
|
50
|
-
import_electron.ipcRenderer.on(`${channelPrefix}:toolApprovalRequest`, handler);
|
|
51
|
-
return () => {
|
|
52
|
-
import_electron.ipcRenderer.removeListener(`${channelPrefix}:toolApprovalRequest`, handler);
|
|
53
|
-
};
|
|
54
|
-
},
|
|
55
|
-
respondToolApproval: (id, approved) => import_electron.ipcRenderer.invoke(`${channelPrefix}:toolApprovalResponse`, { id, approved }),
|
|
56
|
-
// ============ Sessions API ============
|
|
57
|
-
getSessions: () => import_electron.ipcRenderer.invoke(`${channelPrefix}:sessions:list`),
|
|
58
|
-
getSession: (id) => import_electron.ipcRenderer.invoke(`${channelPrefix}:sessions:get`, id),
|
|
59
|
-
createSession: (params) => import_electron.ipcRenderer.invoke(`${channelPrefix}:sessions:create`, params || {}),
|
|
60
|
-
updateSession: (id, data) => import_electron.ipcRenderer.invoke(`${channelPrefix}:sessions:update`, id, data),
|
|
61
|
-
deleteSession: (id) => import_electron.ipcRenderer.invoke(`${channelPrefix}:sessions:delete`, id),
|
|
62
|
-
// ============ Messages API ============
|
|
63
|
-
getMessages: (sessionId) => import_electron.ipcRenderer.invoke(`${channelPrefix}:messages:list`, sessionId),
|
|
64
|
-
saveMessage: (params) => import_electron.ipcRenderer.invoke(`${channelPrefix}:messages:save`, params),
|
|
65
|
-
updateMessage: (params) => import_electron.ipcRenderer.invoke(`${channelPrefix}:messages:update`, params),
|
|
66
|
-
deleteMessagesAfter: (sessionId, timestamp) => import_electron.ipcRenderer.invoke(`${channelPrefix}:messages:deleteAfter`, sessionId, timestamp),
|
|
67
|
-
// ============ Operations API ============
|
|
68
|
-
getOperations: (sessionId) => import_electron.ipcRenderer.invoke(`${channelPrefix}:operations:list`, sessionId),
|
|
69
|
-
// ============ Trash API ============
|
|
70
|
-
getTrashItems: () => import_electron.ipcRenderer.invoke(`${channelPrefix}:trash:list`),
|
|
71
|
-
restoreFromTrash: (id) => import_electron.ipcRenderer.invoke(`${channelPrefix}:trash:restore`, id),
|
|
72
|
-
// ============ System API ============
|
|
73
|
-
openExternal: (url) => import_electron.ipcRenderer.invoke(`${channelPrefix}:openExternal`, url),
|
|
74
|
-
// ============ File System API ============
|
|
75
|
-
listDir: (dirPath) => import_electron.ipcRenderer.invoke(`${channelPrefix}:fs:listDir`, dirPath),
|
|
76
|
-
exists: (filePath) => import_electron.ipcRenderer.invoke(`${channelPrefix}:fs:exists`, filePath),
|
|
77
|
-
stat: (filePath) => import_electron.ipcRenderer.invoke(`${channelPrefix}:fs:stat`, filePath),
|
|
78
|
-
readFile: (filePath) => import_electron.ipcRenderer.invoke(`${channelPrefix}:fs:readFile`, filePath),
|
|
79
|
-
readFileBase64: (filePath) => import_electron.ipcRenderer.invoke(`${channelPrefix}:fs:readFileBase64`, filePath),
|
|
80
|
-
homeDir: () => import_electron.ipcRenderer.invoke(`${channelPrefix}:fs:homeDir`),
|
|
81
|
-
resolvePath: (inputPath) => import_electron.ipcRenderer.invoke(`${channelPrefix}:fs:resolvePath`, inputPath),
|
|
82
|
-
parentDir: (dirPath) => import_electron.ipcRenderer.invoke(`${channelPrefix}:fs:parentDir`, dirPath),
|
|
83
|
-
watchDir: (dirPath) => import_electron.ipcRenderer.invoke(`${channelPrefix}:fs:watchDir`, dirPath),
|
|
84
|
-
unwatchDir: (dirPath) => import_electron.ipcRenderer.invoke(`${channelPrefix}:fs:unwatchDir`, dirPath),
|
|
85
|
-
onDirChange: (callback) => {
|
|
86
|
-
const handler = (_event, data) => {
|
|
87
|
-
callback(data);
|
|
88
|
-
};
|
|
89
|
-
import_electron.ipcRenderer.on(`${channelPrefix}:fs:dirChange`, handler);
|
|
90
|
-
return () => {
|
|
91
|
-
import_electron.ipcRenderer.removeListener(`${channelPrefix}:fs:dirChange`, handler);
|
|
92
|
-
};
|
|
93
|
-
},
|
|
94
|
-
// ============ Settings API ============
|
|
95
|
-
getSetting: (key) => import_electron.ipcRenderer.invoke(`${channelPrefix}:settings:get`, key),
|
|
96
|
-
setSetting: (key, value) => import_electron.ipcRenderer.invoke(`${channelPrefix}:settings:set`, key, value),
|
|
97
|
-
getAllSettings: () => import_electron.ipcRenderer.invoke(`${channelPrefix}:settings:getAll`),
|
|
98
|
-
deleteSetting: (key) => import_electron.ipcRenderer.invoke(`${channelPrefix}:settings:delete`, key),
|
|
99
|
-
// ============ Index API ============
|
|
100
|
-
getIndexStats: () => import_electron.ipcRenderer.invoke(`${channelPrefix}:index:getStats`),
|
|
101
|
-
getIndexStatus: () => import_electron.ipcRenderer.invoke(`${channelPrefix}:index:status`),
|
|
102
|
-
syncIndex: () => import_electron.ipcRenderer.invoke(`${channelPrefix}:index:sync`),
|
|
103
|
-
cancelIndex: () => import_electron.ipcRenderer.invoke(`${channelPrefix}:index:cancel`),
|
|
104
|
-
deleteIndex: () => import_electron.ipcRenderer.invoke(`${channelPrefix}:index:delete`),
|
|
105
|
-
registerIndexListener: () => import_electron.ipcRenderer.invoke(`${channelPrefix}:index:registerListener`),
|
|
106
|
-
unregisterIndexListener: () => import_electron.ipcRenderer.invoke(`${channelPrefix}:index:unregisterListener`),
|
|
107
|
-
onIndexProgress: (callback) => {
|
|
108
|
-
const handler = (_event, progress) => {
|
|
109
|
-
callback(progress);
|
|
110
|
-
};
|
|
111
|
-
import_electron.ipcRenderer.on(`${channelPrefix}:index:progress`, handler);
|
|
112
|
-
return () => {
|
|
113
|
-
import_electron.ipcRenderer.removeListener(`${channelPrefix}:index:progress`, handler);
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
import_electron.contextBridge.exposeInMainWorld(exposeName, bridge);
|
|
118
|
-
}
|
|
119
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
120
|
-
0 && (module.exports = {
|
|
121
|
-
exposeElectronBridge
|
|
122
|
-
});
|
package/dist/preload/index.d.cts
DELETED
|
@@ -1,276 +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 {
|
|
22
|
-
modelId: string;
|
|
23
|
-
displayName: string;
|
|
24
|
-
/** 分组名称(由后端决定,前端只负责渲染,必填) */
|
|
25
|
-
group: string;
|
|
26
|
-
/** 是否来自 OpenRouter(保留用于兼容,后续可能移除) */
|
|
27
|
-
isOpenRouter?: boolean;
|
|
28
|
-
/** 提供商名称(保留用于兼容,后续可能移除) */
|
|
29
|
-
provider?: string;
|
|
30
|
-
}
|
|
31
|
-
/** 会话记录 */
|
|
32
|
-
interface SessionRecord {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
78
|
-
id: string;
|
|
79
|
-
sessionId: string;
|
|
80
|
-
originalPath: string;
|
|
81
|
-
trashPath: string;
|
|
82
|
-
deletedAt: Date;
|
|
83
|
-
autoDeleteAt: Date;
|
|
84
|
-
}
|
|
85
|
-
/** 文件信息 */
|
|
86
|
-
interface FileInfo {
|
|
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[]>;
|
|
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[]>;
|
|
109
|
-
/** 获取单个会话 */
|
|
110
|
-
getSession(id: string): Promise<SessionRecord | 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>;
|
|
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 | null>;
|
|
129
|
-
/** 删除会话 */
|
|
130
|
-
deleteSession(id: string): Promise<{
|
|
131
|
-
success: boolean;
|
|
132
|
-
}>;
|
|
133
|
-
/** 获取会话消息 */
|
|
134
|
-
getMessages(sessionId: string): Promise<MessageRecord[]>;
|
|
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>;
|
|
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[]>;
|
|
168
|
-
/** 获取回收站 */
|
|
169
|
-
getTrashItems(): Promise<TrashRecord[]>;
|
|
170
|
-
/** 恢复回收站项目 */
|
|
171
|
-
restoreFromTrash(id: string): Promise<TrashRecord | undefined>;
|
|
172
|
-
/** 在系统默认浏览器中打开链接 */
|
|
173
|
-
openExternal(url: string): Promise<void>;
|
|
174
|
-
/** 列出目录内容 */
|
|
175
|
-
listDir(dirPath: string): Promise<FileInfo[]>;
|
|
176
|
-
/** 检查路径是否存在 */
|
|
177
|
-
exists(filePath: string): Promise<boolean>;
|
|
178
|
-
/** 获取文件信息 */
|
|
179
|
-
stat(filePath: string): Promise<FileInfo | 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
|
-
interface ExposeOptions {
|
|
266
|
-
/** IPC channel 前缀 */
|
|
267
|
-
channelPrefix?: string;
|
|
268
|
-
/** 暴露的全局变量名 */
|
|
269
|
-
exposeName?: string;
|
|
270
|
-
}
|
|
271
|
-
/**
|
|
272
|
-
* 暴露 AI Chat API 给渲染进程
|
|
273
|
-
*/
|
|
274
|
-
declare function exposeElectronBridge(options?: ExposeOptions): void;
|
|
275
|
-
|
|
276
|
-
export { type AiChatBridge, type ExposeOptions, exposeElectronBridge };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/preload/index.ts"],"sourcesContent":["/**\n * Electron Preload 桥接\n * \n * 在 preload 脚本中调用,暴露 API 给渲染进程\n * \n * 类型定义统一从 @huyooo/ai-chat-types 导入\n */\n\nimport { contextBridge, ipcRenderer } from 'electron'\nimport type {\n ModelOption,\n SessionRecord,\n MessageRecord,\n OperationRecord,\n TrashRecord,\n FileInfo,\n AsrSessionConfig,\n AsrResultData,\n SendMessageParams,\n CreateSessionParams,\n UpdateSessionParams,\n SaveMessageParams,\n UpdateMessageParams,\n ToolApprovalRequest,\n ChatEvent,\n} from '@huyooo/ai-chat-types'\n\n/** Electron Bridge 接口(完整的 IPC 桥接) */\nexport interface AiChatBridge {\n // ============ Chat API ============\n /** 获取可用模型 */\n getModels(): Promise<ModelOption[]>\n /** 获取所有工具列表(用于设置面板) */\n getAllTools(): Promise<Array<{ name: string; description: string }>>\n /** 发送消息 */\n send(params: SendMessageParams): Promise<void>\n /** 取消当前请求 */\n cancel(): Promise<void>\n /** 设置当前工作目录 */\n setCwd(dir: string): Promise<void>\n /** 获取配置 */\n getConfig(): Promise<unknown>\n /** 监听进度事件 */\n onProgress(callback: (progress: ChatEvent) => void): () => void\n\n // ============ Sessions API ============\n getSessions(): Promise<SessionRecord[]>\n getSession(id: string): Promise<SessionRecord | null>\n createSession(params?: CreateSessionParams): Promise<SessionRecord>\n updateSession(id: string, data: UpdateSessionParams): Promise<SessionRecord | null>\n deleteSession(id: string): Promise<{ success: boolean }>\n\n // ============ Messages API ============\n getMessages(sessionId: string): Promise<MessageRecord[]>\n saveMessage(params: SaveMessageParams): Promise<MessageRecord>\n updateMessage(params: UpdateMessageParams): Promise<{ success: boolean }>\n deleteMessagesAfter(sessionId: string, timestamp: number): Promise<{ success: boolean }>\n deleteMessagesAfterMessageId(sessionId: string, messageId: string): Promise<{ success: boolean }>\n\n // ============ Operations API ============\n getOperations(sessionId: string): Promise<OperationRecord[]>\n\n // ============ Trash API ============\n getTrashItems(): Promise<TrashRecord[]>\n restoreFromTrash(id: string): Promise<TrashRecord | undefined>\n\n // ============ System API ============\n openExternal(url: string): Promise<void>\n\n // ============ File System API ============\n listDir(dirPath: string): Promise<FileInfo[]>\n exists(filePath: string): Promise<boolean>\n stat(filePath: string): Promise<FileInfo | null>\n readFile(filePath: string): Promise<string | null>\n readFileBase64(filePath: string): Promise<string | null>\n homeDir(): Promise<string>\n resolvePath(inputPath: string): Promise<string>\n parentDir(dirPath: string): Promise<string>\n watchDir(dirPath: string): Promise<boolean>\n unwatchDir(dirPath: string): Promise<void>\n onDirChange(callback: (data: { dirPath: string; eventType: string; filename: string | null }) => void): () => void\n\n // ============ Settings API ============\n getSetting(key: string): Promise<string | null>\n setSetting(key: string, value: string): Promise<{ success: boolean }>\n getAllSettings(): Promise<Record<string, string>>\n deleteSetting(key: string): Promise<{ success: boolean }>\n\n // ============ Index API ============\n getIndexStats(): Promise<{ totalDocuments: number; indexSize: number; lastUpdated: string | null }>\n getIndexStatus(): Promise<{ isIndexing: boolean; lastProgress: { indexed: number; total: number; currentFile?: string; stage: string } | null }>\n syncIndex(): Promise<{ success: boolean }>\n cancelIndex(): Promise<{ success: boolean }>\n deleteIndex(): Promise<{ success: boolean }>\n registerIndexListener(): Promise<{ success: boolean }>\n unregisterIndexListener(): Promise<{ success: boolean }>\n onIndexProgress(callback: (progress: { indexed: number; total: number; currentFile?: string; stage: string; error?: string }) => void): () => void\n\n // ============ Tool Approval API ============\n onToolApprovalRequest(callback: (request: ToolApprovalRequest) => void): () => void\n respondToolApproval(id: string, approved: boolean): Promise<void>\n\n // ============ ASR API ============\n asrStart(config?: AsrSessionConfig): Promise<{ success: boolean; error?: string }>\n asrSendAudio(audioData: ArrayBufferLike): Promise<{ success: boolean; error?: string }>\n asrFinish(): Promise<{ success: boolean; error?: string }>\n asrStop(): Promise<{ success: boolean }>\n asrStatus(): Promise<{ connected: boolean }>\n asrWarmup(config?: AsrSessionConfig): Promise<{ success: boolean; error?: string }>\n onAsrConnected(callback: () => void): () => void\n onAsrResult(callback: (data: { result: AsrResultData; isLast: boolean }) => void): () => void\n onAsrError(callback: (error: { message: string }) => void): () => void\n onAsrClosed(callback: () => void): () => void\n}\n\nexport interface ExposeOptions {\n /** IPC channel 前缀 */\n channelPrefix?: string\n /** 暴露的全局变量名 */\n exposeName?: string\n}\n\n/**\n * 暴露 AI Chat API 给渲染进程\n */\nexport function exposeElectronBridge(options: ExposeOptions = {}) {\n const { channelPrefix = 'ai-chat', exposeName = 'aiChatBridge' } = options\n\n const bridge: AiChatBridge = {\n // ============ Chat API ============\n getModels: () => \n ipcRenderer.invoke(`${channelPrefix}:models`),\n\n getAllTools: () =>\n ipcRenderer.invoke(`${channelPrefix}:getAllTools`),\n\n send: (params: SendMessageParams) => \n ipcRenderer.invoke(`${channelPrefix}:send`, params),\n\n cancel: () => \n ipcRenderer.invoke(`${channelPrefix}:cancel`),\n\n setCwd: (dir: string) => \n ipcRenderer.invoke(`${channelPrefix}:setCwd`, dir),\n\n getConfig: () => \n ipcRenderer.invoke(`${channelPrefix}:config`),\n\n onProgress: (callback: (progress: ChatEvent) => void) => {\n const handler = (_event: Electron.IpcRendererEvent, progress: ChatEvent) => {\n callback(progress)\n }\n ipcRenderer.on(`${channelPrefix}:progress`, handler)\n \n return () => {\n ipcRenderer.removeListener(`${channelPrefix}:progress`, handler)\n }\n },\n\n onToolApprovalRequest: (callback: (request: ToolApprovalRequest) => void) => {\n const handler = (_event: Electron.IpcRendererEvent, request: ToolApprovalRequest) => {\n callback(request)\n }\n ipcRenderer.on(`${channelPrefix}:toolApprovalRequest`, handler)\n \n return () => {\n ipcRenderer.removeListener(`${channelPrefix}:toolApprovalRequest`, handler)\n }\n },\n\n respondToolApproval: (id: string, approved: boolean) =>\n ipcRenderer.invoke(`${channelPrefix}:toolApprovalResponse`, { id, approved }),\n\n // ============ Sessions API ============\n getSessions: () =>\n ipcRenderer.invoke(`${channelPrefix}:sessions:list`),\n\n getSession: (id: string) =>\n ipcRenderer.invoke(`${channelPrefix}:sessions:get`, id),\n\n createSession: (params) =>\n ipcRenderer.invoke(`${channelPrefix}:sessions:create`, params || {}),\n\n updateSession: (id: string, data) =>\n ipcRenderer.invoke(`${channelPrefix}:sessions:update`, id, data),\n\n deleteSession: (id: string) =>\n ipcRenderer.invoke(`${channelPrefix}:sessions:delete`, id),\n\n // ============ Messages API ============\n getMessages: (sessionId: string) =>\n ipcRenderer.invoke(`${channelPrefix}:messages:list`, sessionId),\n\n saveMessage: (params) =>\n ipcRenderer.invoke(`${channelPrefix}:messages:save`, params),\n\n updateMessage: (params) =>\n ipcRenderer.invoke(`${channelPrefix}:messages:update`, params),\n\n deleteMessagesAfter: (sessionId: string, timestamp: number) =>\n ipcRenderer.invoke(`${channelPrefix}:messages:deleteAfter`, sessionId, timestamp),\n deleteMessagesAfterMessageId: (sessionId: string, messageId: string) =>\n ipcRenderer.invoke(`${channelPrefix}:messages:deleteAfterMessageId`, sessionId, messageId),\n\n // ============ Operations API ============\n getOperations: (sessionId: string) =>\n ipcRenderer.invoke(`${channelPrefix}:operations:list`, sessionId),\n\n // ============ Trash API ============\n getTrashItems: () =>\n ipcRenderer.invoke(`${channelPrefix}:trash:list`),\n\n restoreFromTrash: (id: string) =>\n ipcRenderer.invoke(`${channelPrefix}:trash:restore`, id),\n\n // ============ System API ============\n openExternal: (url: string) =>\n ipcRenderer.invoke(`${channelPrefix}:openExternal`, url),\n\n // ============ File System API ============\n listDir: (dirPath: string) =>\n ipcRenderer.invoke(`${channelPrefix}:fs:listDir`, dirPath),\n\n exists: (filePath: string) =>\n ipcRenderer.invoke(`${channelPrefix}:fs:exists`, filePath),\n\n stat: (filePath: string) =>\n ipcRenderer.invoke(`${channelPrefix}:fs:stat`, filePath),\n\n readFile: (filePath: string) =>\n ipcRenderer.invoke(`${channelPrefix}:fs:readFile`, filePath),\n\n readFileBase64: (filePath: string) =>\n ipcRenderer.invoke(`${channelPrefix}:fs:readFileBase64`, filePath),\n\n homeDir: () =>\n ipcRenderer.invoke(`${channelPrefix}:fs:homeDir`),\n\n resolvePath: (inputPath: string) =>\n ipcRenderer.invoke(`${channelPrefix}:fs:resolvePath`, inputPath),\n\n parentDir: (dirPath: string) =>\n ipcRenderer.invoke(`${channelPrefix}:fs:parentDir`, dirPath),\n\n watchDir: (dirPath: string) =>\n ipcRenderer.invoke(`${channelPrefix}:fs:watchDir`, dirPath),\n\n unwatchDir: (dirPath: string) =>\n ipcRenderer.invoke(`${channelPrefix}:fs:unwatchDir`, dirPath),\n\n onDirChange: (callback: (data: { dirPath: string; eventType: string; filename: string | null }) => void) => {\n const handler = (_event: Electron.IpcRendererEvent, data: { dirPath: string; eventType: string; filename: string | null }) => {\n callback(data)\n }\n ipcRenderer.on(`${channelPrefix}:fs:dirChange`, handler)\n \n return () => {\n ipcRenderer.removeListener(`${channelPrefix}:fs:dirChange`, handler)\n }\n },\n\n // ============ Settings API ============\n getSetting: (key: string) =>\n ipcRenderer.invoke(`${channelPrefix}:settings:get`, key),\n\n setSetting: (key: string, value: string) =>\n ipcRenderer.invoke(`${channelPrefix}:settings:set`, key, value),\n\n getAllSettings: () =>\n ipcRenderer.invoke(`${channelPrefix}:settings:getAll`),\n\n deleteSetting: (key: string) =>\n ipcRenderer.invoke(`${channelPrefix}:settings:delete`, key),\n\n // ============ Index API ============\n getIndexStats: () =>\n ipcRenderer.invoke(`${channelPrefix}:index:getStats`),\n \n getIndexStatus: () =>\n ipcRenderer.invoke(`${channelPrefix}:index:status`),\n \n syncIndex: () =>\n ipcRenderer.invoke(`${channelPrefix}:index:sync`),\n \n cancelIndex: () =>\n ipcRenderer.invoke(`${channelPrefix}:index:cancel`),\n \n deleteIndex: () =>\n ipcRenderer.invoke(`${channelPrefix}:index:delete`),\n \n registerIndexListener: () =>\n ipcRenderer.invoke(`${channelPrefix}:index:registerListener`),\n \n unregisterIndexListener: () =>\n ipcRenderer.invoke(`${channelPrefix}:index:unregisterListener`),\n \n onIndexProgress: (callback: (progress: {\n indexed: number\n total: number\n currentFile?: string\n stage: string\n error?: string\n }) => void) => {\n const handler = (_event: Electron.IpcRendererEvent, progress: {\n indexed: number\n total: number\n currentFile?: string\n stage: string\n error?: string\n }) => {\n callback(progress)\n }\n ipcRenderer.on(`${channelPrefix}:index:progress`, handler)\n \n return () => {\n ipcRenderer.removeListener(`${channelPrefix}:index:progress`, handler)\n }\n },\n\n // ============ ASR API ============\n asrStart: (config?: AsrSessionConfig) =>\n ipcRenderer.invoke(`${channelPrefix}:asr:start`, config),\n\n asrSendAudio: (audioData: ArrayBufferLike) =>\n ipcRenderer.invoke(`${channelPrefix}:asr:sendAudio`, audioData),\n\n asrFinish: () =>\n ipcRenderer.invoke(`${channelPrefix}:asr:finish`),\n\n asrStop: () =>\n ipcRenderer.invoke(`${channelPrefix}:asr:stop`),\n\n asrStatus: () =>\n ipcRenderer.invoke(`${channelPrefix}:asr:status`),\n\n asrWarmup: (config?: AsrSessionConfig) =>\n ipcRenderer.invoke(`${channelPrefix}:asr:warmup`, config),\n\n onAsrConnected: (callback: () => void) => {\n const handler = () => callback()\n ipcRenderer.on(`${channelPrefix}:asr:connected`, handler)\n return () => {\n ipcRenderer.removeListener(`${channelPrefix}:asr:connected`, handler)\n }\n },\n\n onAsrResult: (callback: (data: { result: AsrResultData; isLast: boolean }) => void) => {\n const handler = (_event: Electron.IpcRendererEvent, data: { result: AsrResultData; isLast: boolean }) => {\n callback(data)\n }\n ipcRenderer.on(`${channelPrefix}:asr:result`, handler)\n return () => {\n ipcRenderer.removeListener(`${channelPrefix}:asr:result`, handler)\n }\n },\n\n onAsrError: (callback: (error: { message: string }) => void) => {\n const handler = (_event: Electron.IpcRendererEvent, error: { message: string }) => {\n callback(error)\n }\n ipcRenderer.on(`${channelPrefix}:asr:error`, handler)\n return () => {\n ipcRenderer.removeListener(`${channelPrefix}:asr:error`, handler)\n }\n },\n\n onAsrClosed: (callback: () => void) => {\n const handler = () => callback()\n ipcRenderer.on(`${channelPrefix}:asr:closed`, handler)\n return () => {\n ipcRenderer.removeListener(`${channelPrefix}:asr:closed`, handler)\n }\n },\n }\n\n contextBridge.exposeInMainWorld(exposeName, bridge)\n}\n\n// 重新导出类型供外部使用\nexport type {\n ModelOption,\n SessionRecord,\n MessageRecord,\n OperationRecord,\n TrashRecord,\n FileInfo,\n AsrSessionConfig,\n AsrResultData,\n SendMessageParams,\n CreateSessionParams,\n UpdateSessionParams,\n SaveMessageParams,\n UpdateMessageParams,\n ToolApprovalRequest,\n ChatEvent,\n} from '@huyooo/ai-chat-types'\n"],"mappings":"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","names":[]}
|
package/dist/renderer/index.cjs
DELETED
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/renderer/index.ts
|
|
21
|
-
var renderer_exports = {};
|
|
22
|
-
__export(renderer_exports, {
|
|
23
|
-
createElectronAdapter: () => createElectronAdapter
|
|
24
|
-
});
|
|
25
|
-
module.exports = __toCommonJS(renderer_exports);
|
|
26
|
-
function createElectronAdapter(options = {}) {
|
|
27
|
-
const { bridgeName = "aiChatBridge" } = options;
|
|
28
|
-
const getBridge = () => {
|
|
29
|
-
const bridge = window[bridgeName];
|
|
30
|
-
if (!bridge) {
|
|
31
|
-
throw new Error(`AI Chat Bridge not found. Make sure to call exposeElectronBridge() in preload.`);
|
|
32
|
-
}
|
|
33
|
-
return bridge;
|
|
34
|
-
};
|
|
35
|
-
return {
|
|
36
|
-
// ============ Chat API ============
|
|
37
|
-
async getModels() {
|
|
38
|
-
const bridge = getBridge();
|
|
39
|
-
return bridge.getModels();
|
|
40
|
-
},
|
|
41
|
-
async *sendMessage(message, options2, images, sessionId) {
|
|
42
|
-
const bridge = getBridge();
|
|
43
|
-
const queue = [];
|
|
44
|
-
let resolveNext = null;
|
|
45
|
-
let done = false;
|
|
46
|
-
const cleanup = bridge.onProgress((progress) => {
|
|
47
|
-
const eventWithSession = progress;
|
|
48
|
-
if (sessionId && eventWithSession.sessionId && eventWithSession.sessionId !== sessionId) {
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
queue.push(progress);
|
|
52
|
-
resolveNext?.();
|
|
53
|
-
if (progress.type === "done" || progress.type === "error") {
|
|
54
|
-
done = true;
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
bridge.send({ message, images, options: options2, sessionId });
|
|
58
|
-
try {
|
|
59
|
-
while (!done || queue.length > 0) {
|
|
60
|
-
while (queue.length === 0 && !done) {
|
|
61
|
-
await new Promise((r) => resolveNext = r);
|
|
62
|
-
}
|
|
63
|
-
if (queue.length > 0) {
|
|
64
|
-
const progress = queue.shift();
|
|
65
|
-
yield progress;
|
|
66
|
-
if (progress.type === "done" || progress.type === "error") {
|
|
67
|
-
break;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
} finally {
|
|
72
|
-
cleanup();
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
cancel() {
|
|
76
|
-
getBridge().cancel();
|
|
77
|
-
},
|
|
78
|
-
// 无状态架构:历史通过 ChatOptions.history 传入
|
|
79
|
-
setCwd(dir) {
|
|
80
|
-
getBridge().setCwd(dir);
|
|
81
|
-
},
|
|
82
|
-
// ============ Sessions API ============
|
|
83
|
-
async getSessions() {
|
|
84
|
-
return getBridge().getSessions();
|
|
85
|
-
},
|
|
86
|
-
async getSession(id) {
|
|
87
|
-
return getBridge().getSession(id);
|
|
88
|
-
},
|
|
89
|
-
async createSession(params) {
|
|
90
|
-
return getBridge().createSession(params);
|
|
91
|
-
},
|
|
92
|
-
async updateSession(id, data) {
|
|
93
|
-
return getBridge().updateSession(id, data);
|
|
94
|
-
},
|
|
95
|
-
async deleteSession(id) {
|
|
96
|
-
await getBridge().deleteSession(id);
|
|
97
|
-
},
|
|
98
|
-
// ============ Messages API ============
|
|
99
|
-
async getMessages(sessionId) {
|
|
100
|
-
return getBridge().getMessages(sessionId);
|
|
101
|
-
},
|
|
102
|
-
async saveMessage(params) {
|
|
103
|
-
return getBridge().saveMessage(params);
|
|
104
|
-
},
|
|
105
|
-
async updateMessage(params) {
|
|
106
|
-
await getBridge().updateMessage(params);
|
|
107
|
-
},
|
|
108
|
-
async deleteMessagesAfter(sessionId, timestamp) {
|
|
109
|
-
await getBridge().deleteMessagesAfter(sessionId, timestamp);
|
|
110
|
-
},
|
|
111
|
-
// ============ Operations API ============
|
|
112
|
-
async getOperations(sessionId) {
|
|
113
|
-
return getBridge().getOperations(sessionId);
|
|
114
|
-
},
|
|
115
|
-
// ============ Trash API ============
|
|
116
|
-
async getTrashItems() {
|
|
117
|
-
return getBridge().getTrashItems();
|
|
118
|
-
},
|
|
119
|
-
async restoreFromTrash(id) {
|
|
120
|
-
return getBridge().restoreFromTrash(id);
|
|
121
|
-
},
|
|
122
|
-
// ============ File System API ============
|
|
123
|
-
async listDir(dirPath) {
|
|
124
|
-
return getBridge().listDir(dirPath);
|
|
125
|
-
},
|
|
126
|
-
async exists(filePath) {
|
|
127
|
-
return getBridge().exists(filePath);
|
|
128
|
-
},
|
|
129
|
-
async stat(filePath) {
|
|
130
|
-
return getBridge().stat(filePath);
|
|
131
|
-
},
|
|
132
|
-
async readFile(filePath) {
|
|
133
|
-
return getBridge().readFile(filePath);
|
|
134
|
-
},
|
|
135
|
-
async readFileBase64(filePath) {
|
|
136
|
-
return getBridge().readFileBase64(filePath);
|
|
137
|
-
},
|
|
138
|
-
async homeDir() {
|
|
139
|
-
return getBridge().homeDir();
|
|
140
|
-
},
|
|
141
|
-
async resolvePath(inputPath) {
|
|
142
|
-
return getBridge().resolvePath(inputPath);
|
|
143
|
-
},
|
|
144
|
-
async parentDir(dirPath) {
|
|
145
|
-
return getBridge().parentDir(dirPath);
|
|
146
|
-
},
|
|
147
|
-
async watchDir(dirPath) {
|
|
148
|
-
return getBridge().watchDir(dirPath);
|
|
149
|
-
},
|
|
150
|
-
async unwatchDir(dirPath) {
|
|
151
|
-
return getBridge().unwatchDir(dirPath);
|
|
152
|
-
},
|
|
153
|
-
onDirChange(callback) {
|
|
154
|
-
return getBridge().onDirChange(callback);
|
|
155
|
-
},
|
|
156
|
-
// ============ Settings API ============
|
|
157
|
-
async getSetting(key) {
|
|
158
|
-
const bridge = getBridge();
|
|
159
|
-
if (bridge.getSetting) {
|
|
160
|
-
return bridge.getSetting(key);
|
|
161
|
-
}
|
|
162
|
-
return null;
|
|
163
|
-
},
|
|
164
|
-
async setSetting(key, value) {
|
|
165
|
-
const bridge = getBridge();
|
|
166
|
-
if (bridge.setSetting) {
|
|
167
|
-
await bridge.setSetting(key, value);
|
|
168
|
-
}
|
|
169
|
-
},
|
|
170
|
-
async getAllSettings() {
|
|
171
|
-
const bridge = getBridge();
|
|
172
|
-
if (bridge.getAllSettings) {
|
|
173
|
-
return bridge.getAllSettings();
|
|
174
|
-
}
|
|
175
|
-
return {};
|
|
176
|
-
},
|
|
177
|
-
async deleteSetting(key) {
|
|
178
|
-
const bridge = getBridge();
|
|
179
|
-
if (bridge.deleteSetting) {
|
|
180
|
-
await bridge.deleteSetting(key);
|
|
181
|
-
}
|
|
182
|
-
},
|
|
183
|
-
// ============ Tool Approval API ============
|
|
184
|
-
onToolApprovalRequest(callback) {
|
|
185
|
-
const bridge = getBridge();
|
|
186
|
-
if (bridge.onToolApprovalRequest) {
|
|
187
|
-
return bridge.onToolApprovalRequest(callback);
|
|
188
|
-
}
|
|
189
|
-
return () => {
|
|
190
|
-
};
|
|
191
|
-
},
|
|
192
|
-
async respondToolApproval(id, approved) {
|
|
193
|
-
const bridge = getBridge();
|
|
194
|
-
if (bridge.respondToolApproval) {
|
|
195
|
-
return bridge.respondToolApproval(id, approved);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
};
|
|
199
|
-
}
|