@solazah/solazah-runtime 0.2.27 → 0.2.30
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/package.json +1 -1
- package/types/Account.d.ts +8 -0
- package/types/Copilot.d.ts +27 -2
- package/types/CopilotModel.d.ts +2 -1
- package/types/SystemBrowser.d.ts +76 -9
- package/types/SystemScreen.d.ts +16 -7
package/package.json
CHANGED
package/types/Account.d.ts
CHANGED
|
@@ -34,4 +34,12 @@ export default class Account {
|
|
|
34
34
|
* 未登录或 HTTP 请求失败时返回 null。
|
|
35
35
|
*/
|
|
36
36
|
getUserInfo: () => Promise<any>;
|
|
37
|
+
/**
|
|
38
|
+
* 在系统浏览器里打开账号中心的某一页,进去就是当前登录的账号:点击这一刻向账号服务签一张
|
|
39
|
+
* 一次性登录票据,拼进链接的 # 段,网页拿它换成会话。本机没登录时打开登录页,登完回到这一页。
|
|
40
|
+
*
|
|
41
|
+
* @param page 账号中心的站内页面(hash 路由),如 `/account`、`/orders`。
|
|
42
|
+
* @returns 无返回。签发票据失败时抛出带原因的异常。
|
|
43
|
+
*/
|
|
44
|
+
openCenter: (page: string) => Promise<any>;
|
|
37
45
|
}
|
package/types/Copilot.d.ts
CHANGED
|
@@ -59,8 +59,8 @@ export interface CopilotChatOptions extends CopilotBaseOptions {
|
|
|
59
59
|
onRunFinished?: () => void;
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
|
-
* 随用户一句话附上的一张图:`url`
|
|
63
|
-
*
|
|
62
|
+
* 随用户一句话附上的一张图:`path` 是执行端这台机器上的图片文件(对话附件);`url` 是发起方内存里的图(base64 的 data URL)。
|
|
63
|
+
* 两种都由执行端认格式、缩到长边 1280、编码,再按这一轮的模型看不看得了图决定附不附(见 CopilotHumanContent)。
|
|
64
64
|
*/
|
|
65
65
|
export type CopilotInputImage = {
|
|
66
66
|
url: string;
|
|
@@ -156,6 +156,25 @@ export interface CopilotRoundRefusal {
|
|
|
156
156
|
code: string;
|
|
157
157
|
message: string;
|
|
158
158
|
}
|
|
159
|
+
/**
|
|
160
|
+
* 执行端能干什么。本机界面与远程对端问到的是同一份,界面据此隐藏用不了的入口、提示用不上的输入。
|
|
161
|
+
* 镜像在 solazah-plugin-copilot 的 `ExecutorCapabilities`(src/renderer/runtime/CopilotClient.ts),改字段两处一起改。
|
|
162
|
+
*/
|
|
163
|
+
export interface CopilotExecutorCapabilities {
|
|
164
|
+
kind: "local" | "remote" | "cloud";
|
|
165
|
+
/** 电脑控制类工具(鼠标、键盘、截屏) */
|
|
166
|
+
computerControl: boolean;
|
|
167
|
+
/** 本机文件读写 */
|
|
168
|
+
localFiles: boolean;
|
|
169
|
+
/** 浏览器扩展桥此刻连着 */
|
|
170
|
+
browserBridge: boolean;
|
|
171
|
+
/** 执行端当前可用的 AI 插件 name */
|
|
172
|
+
plugins: string[];
|
|
173
|
+
/** 单张附图的字节上限:超过的图执行端不读,模型看不到 */
|
|
174
|
+
maxImageBytes: number;
|
|
175
|
+
/** 远程协议版本 */
|
|
176
|
+
protocolVersion: number;
|
|
177
|
+
}
|
|
159
178
|
/** 一行 = 某个模型某一天的 token 统计。model_name 是模型 id,显示名要另去模型清单里换。 */
|
|
160
179
|
export interface CopilotUsageStat {
|
|
161
180
|
model_name: string;
|
|
@@ -214,6 +233,12 @@ export default class Copilot {
|
|
|
214
233
|
abort: (requestId: string) => Promise<any>;
|
|
215
234
|
/** 最近 days 天的 token 用量,按 (模型, 日期) 聚合,新到旧。用量看板用。 */
|
|
216
235
|
usage(days?: number): Promise<CopilotUsageStat[]>;
|
|
236
|
+
/**
|
|
237
|
+
* 这台执行端能干什么,与远程对端问到的是同一份。附图时按 maxImageBytes 判断模型看不看得到这张图。
|
|
238
|
+
*
|
|
239
|
+
* @returns 执行端能力,见 {@link CopilotExecutorCapabilities}。
|
|
240
|
+
*/
|
|
241
|
+
capabilities: () => Promise<CopilotExecutorCapabilities>;
|
|
217
242
|
/**
|
|
218
243
|
* 生成途中插一句话:排进待注入队列,模型下一个决策点领走,不中止当前回合。
|
|
219
244
|
*
|
package/types/CopilotModel.d.ts
CHANGED
|
@@ -29,7 +29,8 @@ export default class CopilotModel {
|
|
|
29
29
|
remove: (modelId: string) => Promise<any>;
|
|
30
30
|
/**
|
|
31
31
|
* 返回全部模型,并给每条附加计算属性:isEmbedded(是否内置、前端据此标记「不可移除」)、
|
|
32
|
-
* acceptedEfforts(模型接受的思考档位 none/low/medium/high,界面据此只放出这些档)
|
|
32
|
+
* acceptedEfforts(模型接受的思考档位 none/low/medium/high,界面据此只放出这些档)、
|
|
33
|
+
* vision(执行端判定的这个模型看不看得了图,附图交不交给它按的就是这一判定)。
|
|
33
34
|
*
|
|
34
35
|
* @returns 模型列表数组,每项包含 isEmbedded 等计算属性
|
|
35
36
|
*/
|
package/types/SystemBrowser.d.ts
CHANGED
|
@@ -17,6 +17,20 @@ export interface SystemBrowserTab {
|
|
|
17
17
|
incognito: boolean;
|
|
18
18
|
groupId?: number;
|
|
19
19
|
}
|
|
20
|
+
export type SystemBrowserWindowState = "normal" | "minimized" | "maximized" | "fullscreen" | "locked-fullscreen";
|
|
21
|
+
export interface SystemBrowserWindow {
|
|
22
|
+
id: number;
|
|
23
|
+
/** 是否是当前拿着焦点的窗口 */
|
|
24
|
+
focused: boolean;
|
|
25
|
+
state: SystemBrowserWindowState;
|
|
26
|
+
type: "normal" | "popup" | "panel" | "app" | "devtools";
|
|
27
|
+
incognito: boolean;
|
|
28
|
+
alwaysOnTop: boolean;
|
|
29
|
+
left?: number;
|
|
30
|
+
top?: number;
|
|
31
|
+
width?: number;
|
|
32
|
+
height?: number;
|
|
33
|
+
}
|
|
20
34
|
export interface SystemBrowserCookie {
|
|
21
35
|
name: string;
|
|
22
36
|
value: string;
|
|
@@ -50,6 +64,13 @@ export interface SystemBrowserHttpResponse {
|
|
|
50
64
|
body: string;
|
|
51
65
|
}
|
|
52
66
|
export type SystemBrowserKind = "chrome" | "edge" | "unknown";
|
|
67
|
+
/** call 的选项:交给哪个浏览器、等多久。主进程 BrowserBridgeProtocol 的 BridgeCallOptions 与它同形。 */
|
|
68
|
+
export interface SystemBrowserCallOptions {
|
|
69
|
+
/** 交给哪个已连接的浏览器;不传按 system.preferredBrowser 选,再退到最近连上的那个 */
|
|
70
|
+
browser?: SystemBrowserKind;
|
|
71
|
+
/** 宿主等扩展回包的上限(毫秒),不传为 30 秒 */
|
|
72
|
+
timeoutMs?: number;
|
|
73
|
+
}
|
|
53
74
|
export type SystemBrowserEventName = "browser.tab.created" | "browser.tab.updated" | "browser.tab.removed" | "browser.tab.activated" | "browser.bookmark.created" | "browser.bookmark.changed" | "browser.bookmark.removed" | "browser.bookmark.moved" | "browser.bridge.hello" | "browser.bridge.status";
|
|
54
75
|
export interface SystemBrowserEventEnvelope<T = any> {
|
|
55
76
|
event: SystemBrowserEventName | string;
|
|
@@ -59,14 +80,25 @@ export interface SystemBrowserEventEnvelope<T = any> {
|
|
|
59
80
|
/**
|
|
60
81
|
* 暴露给所有 renderer(含 plugin view)的浏览器桥接 API。
|
|
61
82
|
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
* 的 preload 都是同一份 contextBridge,每个 view 自己监听自己想要的事件
|
|
83
|
+
* 扩展的方法一律经 call 走宿主的 browser.call 通道,下面各组是它们的带类型包装;
|
|
84
|
+
* bridge.status 是宿主自己记的连接状态,不经扩展;tabs.activate 切完标签页再经宿主的 window.bringToFront 把浏览器提到前台。
|
|
85
|
+
* 事件监听走 ipcRenderer 直连,每个 view 自己监听自己想要的事件。
|
|
66
86
|
*/
|
|
67
87
|
export default class SystemBrowser {
|
|
68
88
|
private transport;
|
|
69
89
|
constructor(transport?: IpcRenderer);
|
|
90
|
+
/**
|
|
91
|
+
* 按方法名调用浏览器扩展:方法名与参数原样交给扩展,扩展的返回值原样交回。
|
|
92
|
+
* 下面各组带类型的方法都经这里;扩展新加的方法不必等宿主更新,直接用它调。
|
|
93
|
+
*
|
|
94
|
+
* @param method 扩展的方法名,如 "tabs.list"、"windows.update";扩展支持哪些,看 bridge.ping() 交回的 methods。
|
|
95
|
+
* @param params 交给该方法的参数,原样转发。
|
|
96
|
+
* @param options browser 指定浏览器(chrome/edge),timeoutMs 是宿主等回包的上限,见 SystemBrowserCallOptions。
|
|
97
|
+
* @returns 扩展该方法的返回值。
|
|
98
|
+
* @throws 扩展未连接、等回包超时、扩展执行失败或没有这个方法时抛错。页面拿到的 Error 只带 message;
|
|
99
|
+
* 要分支的情形先用结构化结果判断:扩展连没连上看 bridge.status() 的 connected,支不支持某方法看 bridge.ping() 的 methods。
|
|
100
|
+
*/
|
|
101
|
+
call: <T = any>(method: string, params?: object, options?: SystemBrowserCallOptions) => Promise<T>;
|
|
70
102
|
bridge: {
|
|
71
103
|
/**
|
|
72
104
|
* 返回浏览器桥接的连接状态。
|
|
@@ -85,12 +117,13 @@ export default class SystemBrowser {
|
|
|
85
117
|
/**
|
|
86
118
|
* 向扩展发一次 ping 探活。
|
|
87
119
|
*
|
|
88
|
-
* @returns {pong: true, ts}
|
|
120
|
+
* @returns {pong: true, ts, methods}:methods 是扩展支持的全部方法名,0.3.9 之前的扩展不带这个字段。
|
|
89
121
|
* @throws 未连接扩展时抛错。
|
|
90
122
|
*/
|
|
91
123
|
ping: () => Promise<{
|
|
92
124
|
pong: boolean;
|
|
93
125
|
ts: number;
|
|
126
|
+
methods?: string[];
|
|
94
127
|
}>;
|
|
95
128
|
};
|
|
96
129
|
tabs: {
|
|
@@ -169,7 +202,9 @@ export default class SystemBrowser {
|
|
|
169
202
|
removed: number[];
|
|
170
203
|
}>;
|
|
171
204
|
/**
|
|
172
|
-
*
|
|
205
|
+
* 在浏览器里切到指定标签页,并把浏览器窗口提到系统最前。
|
|
206
|
+
* 浏览器不在前台时它自己抢焦点会被 Windows 拦下,提前台走宿主的通用窗口能力 window.bringToFront。
|
|
207
|
+
* 只切标签页、不动系统窗口的,用 call("tabs.activate", {tabId})。
|
|
173
208
|
*
|
|
174
209
|
* @param tabId 标签页 ID。
|
|
175
210
|
* @returns {tab} 激活的标签页。
|
|
@@ -217,13 +252,43 @@ export default class SystemBrowser {
|
|
|
217
252
|
tab: SystemBrowserTab;
|
|
218
253
|
}>;
|
|
219
254
|
};
|
|
255
|
+
windows: {
|
|
256
|
+
/**
|
|
257
|
+
* 取浏览器窗口此刻的状态。0.3.9 之前的扩展没有这个方法,用前看 bridge.ping() 的 methods。
|
|
258
|
+
*
|
|
259
|
+
* @param params.windowId 浏览器窗口 ID(即标签页的 windowId)。
|
|
260
|
+
* @returns {window} 窗口状态,focused 为它是否正拿着焦点,state 为 normal / minimized / maximized / fullscreen。
|
|
261
|
+
* @throws 窗口不存在、浏览器扩展未连接或调用超时时抛错。
|
|
262
|
+
*/
|
|
263
|
+
get: (params: {
|
|
264
|
+
windowId: number;
|
|
265
|
+
}) => Promise<{
|
|
266
|
+
window: SystemBrowserWindow;
|
|
267
|
+
}>;
|
|
268
|
+
/**
|
|
269
|
+
* 改浏览器窗口的状态,如最小化、最大化、聚焦。0.3.9 之前的扩展没有这个方法,用前看 bridge.ping() 的 methods。
|
|
270
|
+
*
|
|
271
|
+
* @param params.windowId 浏览器窗口 ID。
|
|
272
|
+
* @param params.state 目标状态;minimized 不能与 focused: true 同时给。
|
|
273
|
+
* @param params.focused true 让浏览器把这个窗口提到最前并聚焦,false 让它让出焦点。
|
|
274
|
+
* @returns {window} 改完后的窗口状态。
|
|
275
|
+
* @throws 窗口不存在、参数组合不合法、浏览器扩展未连接或调用超时时抛错。
|
|
276
|
+
*/
|
|
277
|
+
update: (params: {
|
|
278
|
+
windowId: number;
|
|
279
|
+
state?: SystemBrowserWindowState;
|
|
280
|
+
focused?: boolean;
|
|
281
|
+
}) => Promise<{
|
|
282
|
+
window: SystemBrowserWindow;
|
|
283
|
+
}>;
|
|
284
|
+
};
|
|
220
285
|
scripting: {
|
|
221
286
|
/**
|
|
222
287
|
* 在指定标签页里对一段 JavaScript 表达式求值并返回结果。
|
|
223
288
|
*
|
|
224
289
|
* @param params.tabId 标签页 ID。
|
|
225
290
|
* @param params.expression 要执行的 JavaScript 表达式。
|
|
226
|
-
* @param params.world 执行世界:MAIN(页面主世界)或 ISOLATED(扩展隔离世界),默认
|
|
291
|
+
* @param params.world 执行世界:MAIN(页面主世界)或 ISOLATED(扩展隔离世界),默认 MAIN。
|
|
227
292
|
* @param params.allFrames 为 true 则在所有 iframe 里执行。
|
|
228
293
|
* @returns 表达式求值结果。
|
|
229
294
|
* @throws 浏览器扩展未连接或调用超时时抛错。
|
|
@@ -240,7 +305,7 @@ export default class SystemBrowser {
|
|
|
240
305
|
* @param params.tabId 标签页 ID。
|
|
241
306
|
* @param params.code 要执行的函数体代码。
|
|
242
307
|
* @param params.args 传入函数的参数数组。
|
|
243
|
-
* @param params.world 执行世界:MAIN 或 ISOLATED,默认
|
|
308
|
+
* @param params.world 执行世界:MAIN 或 ISOLATED,默认 MAIN。
|
|
244
309
|
* @param params.allFrames 为 true 则在所有 iframe 里执行。
|
|
245
310
|
* @returns 函数返回值。
|
|
246
311
|
* @throws 浏览器扩展未连接或调用超时时抛错。
|
|
@@ -368,7 +433,7 @@ export default class SystemBrowser {
|
|
|
368
433
|
* @param params.headers 自定义请求头。
|
|
369
434
|
* @param params.body 请求体。
|
|
370
435
|
* @param params.credentials Cookie 策略:include、same-origin 或 omit,默认 include。
|
|
371
|
-
* @param params.timeoutMs 超时毫秒,默认 30000
|
|
436
|
+
* @param params.timeoutMs 超时毫秒,默认 30000;宿主等回包也按它。
|
|
372
437
|
* @returns {status, statusText, ok, url, redirected, headers, body} HTTP 响应。
|
|
373
438
|
* @throws 浏览器扩展未连接或调用超时时抛错。
|
|
374
439
|
*/
|
|
@@ -500,6 +565,8 @@ export default class SystemBrowser {
|
|
|
500
565
|
*/
|
|
501
566
|
removeTree: (id: string) => Promise<void>;
|
|
502
567
|
};
|
|
568
|
+
/** 把连着的浏览器在系统里的窗口提到最前;没有认得出种类的浏览器连着时不动。 */
|
|
569
|
+
private bringBrowserToFront;
|
|
503
570
|
/**
|
|
504
571
|
* 订阅扩展事件(tab/bookmark 生命周期 + 桥接连接状态)。返回反订阅函数。
|
|
505
572
|
*
|
package/types/SystemScreen.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { default as IpcRenderer } from './IpcRenderer';
|
|
2
2
|
import { Point } from '@computer-use/nut-js';
|
|
3
|
+
/** 原始位图:BGRA、自顶向下、每像素 4 字节,与截图流 raw 帧同一格式。手里已经是像素时直接给它,省掉编码与解码。 */
|
|
4
|
+
export interface RawImage {
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
data: Uint8Array;
|
|
8
|
+
}
|
|
9
|
+
/** 一张图:Data URL、本机绝对路径,或原始位图。 */
|
|
10
|
+
export type ImageSource = string | RawImage;
|
|
3
11
|
/** 屏幕原生坐标系里的矩形。 */
|
|
4
12
|
export interface ScreenRect {
|
|
5
13
|
x: number;
|
|
@@ -364,12 +372,12 @@ export default class SystemScreen {
|
|
|
364
372
|
/**
|
|
365
373
|
* 在一张给定图片(而不是当前屏幕)里做模板匹配,给「用采集时的截图验证模板唯一性」用。
|
|
366
374
|
*
|
|
367
|
-
* @param haystack
|
|
368
|
-
* @param needle
|
|
375
|
+
* @param haystack 被搜索的图片:Data URL、本机绝对路径或原始位图。
|
|
376
|
+
* @param needle 模板图片:Data URL、本机绝对路径或原始位图。
|
|
369
377
|
* @param options `{maxResults?, scale?, minScore?, region?}`。
|
|
370
378
|
* @returns `[{x, y, width, height, score, scale}]`,按分数降序,第一个是全图最佳。
|
|
371
379
|
*/
|
|
372
|
-
matchTemplate: (haystack:
|
|
380
|
+
matchTemplate: (haystack: ImageSource, needle: ImageSource, options?: {
|
|
373
381
|
maxResults?: number;
|
|
374
382
|
scale?: number;
|
|
375
383
|
minScore?: number;
|
|
@@ -382,15 +390,16 @@ export default class SystemScreen {
|
|
|
382
390
|
* 对一帧给定图片做一批分析:若干模板各自匹配、若干区域各自 OCR,图片只解码一次,同一区域只 OCR 一次。
|
|
383
391
|
* 每一拍截一帧、拿这一帧判断全部条件的循环靠它把 IPC 压到每拍一次。
|
|
384
392
|
*
|
|
385
|
-
* @param frame
|
|
393
|
+
* @param frame 被分析的图片(通常是一帧截图)。
|
|
386
394
|
* @param request `{templates?: [{id, image, region?, scale?, minScore?, maxResults?}], texts?: [{id, region?, detRatio?, zoom?}]}`,region 相对图片左上角。
|
|
387
|
-
* frame 与 templates[].image 都可以给 Data URL
|
|
395
|
+
* frame 与 templates[].image 都可以给 Data URL、本机绝对路径或原始位图;反复分析同一批图时给路径,同一张只解码一次;
|
|
396
|
+
* 手里已经是像素的(截图流 raw 帧)给原始位图。
|
|
388
397
|
* @returns `{templates: {id: [{x, y, width, height, score, scale}]}, texts: {id: [{text, score, x, y, width, height}]}}`,坐标相对图片左上角。
|
|
389
398
|
*/
|
|
390
|
-
analyzeFrame: (frame:
|
|
399
|
+
analyzeFrame: (frame: ImageSource, request?: {
|
|
391
400
|
templates?: Array<{
|
|
392
401
|
id: string;
|
|
393
|
-
image:
|
|
402
|
+
image: ImageSource;
|
|
394
403
|
region?: ScreenRect;
|
|
395
404
|
scale?: number;
|
|
396
405
|
minScore?: number;
|