@yfwu2020/dsh-selection-explain 0.12.0 → 0.13.1
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/README.md +18 -5
- package/lib/chat-context.js +6 -4
- package/lib/chat-context.js.map +1 -1
- package/lib/client.js +11810 -10118
- package/lib/client.js.map +4 -4
- package/lib/config-values.js +5 -1
- package/lib/config-values.js.map +1 -1
- package/lib/host/analyze-conclusion.js +115 -0
- package/lib/host/analyze-conclusion.js.map +1 -0
- package/lib/host/analyze-execution-types.js +2 -0
- package/lib/host/analyze-execution-types.js.map +1 -0
- package/lib/host/analyze-execution.js +166 -0
- package/lib/host/analyze-execution.js.map +1 -0
- package/lib/host/analyze-history.js +110 -0
- package/lib/host/analyze-history.js.map +1 -0
- package/lib/host/analyze-messages.js +95 -0
- package/lib/host/analyze-messages.js.map +1 -0
- package/lib/host/analyze-output.js +69 -0
- package/lib/host/analyze-output.js.map +1 -0
- package/lib/host/analyze-prompt.js +110 -0
- package/lib/host/analyze-prompt.js.map +1 -0
- package/lib/host/analyze-request.js +129 -0
- package/lib/host/analyze-request.js.map +1 -0
- package/lib/host/analyze-round.js +121 -0
- package/lib/host/analyze-round.js.map +1 -0
- package/lib/host/analyze-tool-execution.js +98 -0
- package/lib/host/analyze-tool-execution.js.map +1 -0
- package/lib/host/analyze-tools.js +79 -0
- package/lib/host/analyze-tools.js.map +1 -0
- package/lib/host/analyze-types.js +2 -0
- package/lib/host/analyze-types.js.map +1 -0
- package/lib/host/analyze.js +30 -926
- package/lib/host/analyze.js.map +1 -1
- package/lib/host/chat-context.js +8 -3
- package/lib/host/chat-context.js.map +1 -1
- package/lib/host/config.js +6 -0
- package/lib/host/config.js.map +1 -1
- package/lib/host/history-store.js +18 -6
- package/lib/host/history-store.js.map +1 -1
- package/lib/host/native-probe.js +66 -0
- package/lib/host/native-probe.js.map +1 -0
- package/lib/host/plugin.js +30 -0
- package/lib/host/plugin.js.map +1 -1
- package/lib/host/shot-capture.js +322 -0
- package/lib/host/shot-capture.js.map +1 -0
- package/lib/host/shot-geometry.js +183 -0
- package/lib/host/shot-geometry.js.map +1 -0
- package/lib/host/shot-platform.js +208 -0
- package/lib/host/shot-platform.js.map +1 -0
- package/lib/host/shot-service.js +127 -0
- package/lib/host/shot-service.js.map +1 -0
- package/lib/host/shot-types.js +5 -0
- package/lib/host/shot-types.js.map +1 -0
- package/lib/host/shot.js +136 -0
- package/lib/host/shot.js.map +1 -0
- package/lib/prompts.js +54 -1
- package/lib/prompts.js.map +1 -1
- package/lib/settings.js +13 -2
- package/lib/settings.js.map +1 -1
- package/lib/types/chat-context.d.ts +2 -2
- package/lib/types/config-values.d.ts +24 -0
- package/lib/types/host/analyze-conclusion.d.ts +3 -0
- package/lib/types/host/analyze-execution-types.d.ts +54 -0
- package/lib/types/host/analyze-execution.d.ts +3 -0
- package/lib/types/host/analyze-history.d.ts +41 -0
- package/lib/types/host/analyze-messages.d.ts +15 -0
- package/lib/types/host/analyze-output.d.ts +8 -0
- package/lib/types/host/analyze-prompt.d.ts +15 -0
- package/lib/types/host/analyze-request.d.ts +28 -0
- package/lib/types/host/analyze-round.d.ts +7 -0
- package/lib/types/host/analyze-tool-execution.d.ts +4 -0
- package/lib/types/host/analyze-tools.d.ts +15 -0
- package/lib/types/host/analyze-types.d.ts +13 -0
- package/lib/types/host/analyze.d.ts +4 -4
- package/lib/types/host/config.d.ts +12 -0
- package/lib/types/host/native-probe.d.ts +10 -0
- package/lib/types/host/shot-capture.d.ts +11 -0
- package/lib/types/host/shot-geometry.d.ts +37 -0
- package/lib/types/host/shot-platform.d.ts +11 -0
- package/lib/types/host/shot-service.d.ts +17 -0
- package/lib/types/host/shot-types.d.ts +105 -0
- package/lib/types/host/shot.d.ts +16 -0
- package/lib/types/host/types.d.ts +13 -0
- package/lib/types/prompts.d.ts +21 -0
- package/native/window-list.c +139 -0
- package/package.json +5 -2
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/** One capture task's pipeline. Geometry is pure; all machine operations use a typed port. */
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { CAPTURE, MAX_MARGIN_PT, SELECT_TIMEOUT_MS } from './shot-types.js';
|
|
4
|
+
import { pickDisplay, pickWindow, clampRect, cropBox, friendlyCaptureError } from './shot-geometry.js';
|
|
5
|
+
export class ShotCaptureError extends Error {
|
|
6
|
+
code;
|
|
7
|
+
startup;
|
|
8
|
+
constructor(code, message, startup = false) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.startup = startup;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export async function captureShot(platform, options, dir, signal, knownRect) {
|
|
15
|
+
const active = () => signal.throwIfAborted();
|
|
16
|
+
async function checked(promise) { const value = await promise; active(); return value; }
|
|
17
|
+
const ensureTmpDir = async () => { active(); return dir; };
|
|
18
|
+
const run = async (command, args, timeout) => {
|
|
19
|
+
active();
|
|
20
|
+
const result = await checked(platform.run(command, args, signal, timeout));
|
|
21
|
+
return result.failed ? '' : result.stdout;
|
|
22
|
+
};
|
|
23
|
+
const listDisplays = () => checked(platform.listDisplays(signal));
|
|
24
|
+
const listWindows = () => checked(platform.listWindows(signal));
|
|
25
|
+
const probeAvailable = () => checked(platform.probeAvailable(signal));
|
|
26
|
+
const pngSize = (file) => checked(platform.pngSize(file));
|
|
27
|
+
const rectFromXattr = (file) => checked(platform.rectFromXattr(file, signal));
|
|
28
|
+
// Prefetch belongs to this task, so a late probe cannot contaminate another capture.
|
|
29
|
+
let prefetchedWindows = options.scope === 'window' ? listWindows() : undefined;
|
|
30
|
+
let prefetchedDisplays = options.scope !== 'selection' || knownRect ? listDisplays() : undefined;
|
|
31
|
+
// These may finish after an interactive cancellation; consume rejections immediately.
|
|
32
|
+
void prefetchedWindows?.catch(() => { });
|
|
33
|
+
void prefetchedDisplays?.catch(() => { });
|
|
34
|
+
/**
|
|
35
|
+
* 截一整块显示器(`screencapture -D`)。
|
|
36
|
+
*
|
|
37
|
+
* 为什么不用 `-R`:副屏在主屏左边时坐标是负的,`screencapture -R` 直接
|
|
38
|
+
* "could not create image from rect";屏幕锁定时 `-R` 也会失败,而 `-D` 仍然可用。
|
|
39
|
+
* 所以统一按显示器截,再用 sips 裁到需要的矩形。
|
|
40
|
+
*/
|
|
41
|
+
async function captureDisplay(display, options, fileName) {
|
|
42
|
+
const dir = await ensureTmpDir();
|
|
43
|
+
const path = join(dir, fileName);
|
|
44
|
+
const index = display.index > 0 ? display.index : display.main ? 1 : 2;
|
|
45
|
+
await run(CAPTURE, ['-x', '-D', String(index), path]);
|
|
46
|
+
const size = await pngSize(path);
|
|
47
|
+
if (!size || display.w <= 0 || display.h <= 0) {
|
|
48
|
+
await platform.remove(path);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
// 截错屏时宽高比通常对不上:宁可退回选区,也不要把红框画到一张不相干的图上
|
|
52
|
+
const expected = display.w / display.h;
|
|
53
|
+
const actual = size.w / size.h;
|
|
54
|
+
if (Math.abs(actual - expected) > expected * 0.02) {
|
|
55
|
+
await platform.remove(path);
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return { path, size, scale: size.w / display.w };
|
|
59
|
+
}
|
|
60
|
+
/** 把显示器图按像素矩形裁出来(sips 的 --cropOffset 是 top left)。 */
|
|
61
|
+
async function cropPng(source, box, size, out) {
|
|
62
|
+
const { left, top, width, height } = cropBox(box, size);
|
|
63
|
+
await run('/usr/bin/sips', ['-c', String(height), String(width), '--cropOffset', String(top), String(left), source, '--out', out], 20_000);
|
|
64
|
+
const cropped = await pngSize(out);
|
|
65
|
+
return cropped ? { left, top, width: cropped.w, height: cropped.h } : null;
|
|
66
|
+
}
|
|
67
|
+
/** 截一块选区本身(没有 region 文件时的兜底 / 自动化测试用)。 */
|
|
68
|
+
async function captureSelectionToFile(selection, options, fileName) {
|
|
69
|
+
const displays = await (prefetchedDisplays ?? listDisplays());
|
|
70
|
+
prefetchedDisplays = undefined;
|
|
71
|
+
const display = pickDisplay(displays, selection);
|
|
72
|
+
if (!display)
|
|
73
|
+
return null;
|
|
74
|
+
const dir = await ensureTmpDir();
|
|
75
|
+
const captured = await captureDisplay(display, options, `display-${options.seq}.png`);
|
|
76
|
+
if (!captured)
|
|
77
|
+
return null;
|
|
78
|
+
const box = {
|
|
79
|
+
left: (selection.x - display.x) * captured.scale,
|
|
80
|
+
top: (selection.y - display.y) * captured.scale,
|
|
81
|
+
width: selection.width * captured.scale,
|
|
82
|
+
height: selection.height * captured.scale,
|
|
83
|
+
};
|
|
84
|
+
const path = join(dir, fileName);
|
|
85
|
+
const crop = await cropPng(captured.path, box, captured.size, path);
|
|
86
|
+
await platform.remove(captured.path);
|
|
87
|
+
if (!crop)
|
|
88
|
+
return null;
|
|
89
|
+
return { path, size: { w: crop.width, h: crop.height }, scale: captured.scale };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 仅选区:框选落下的 region 文件**就是**最终图。
|
|
93
|
+
*
|
|
94
|
+
* 不需要窗口列表、不需要 xattr、不需要第二次截图;客户端也不用画布。
|
|
95
|
+
*/
|
|
96
|
+
async function finishSelection(regionFile, selection, options, note = '') {
|
|
97
|
+
const size = await pngSize(regionFile);
|
|
98
|
+
if (!size) {
|
|
99
|
+
throw new ShotCaptureError('image-missing', '截图已经拍下,但读不到图片文件,请重试');
|
|
100
|
+
}
|
|
101
|
+
const sel = selection || { x: 0, y: 0, width: size.w, height: size.h };
|
|
102
|
+
const scale = sel.width > 0 ? size.w / sel.width : 1;
|
|
103
|
+
const shot = {
|
|
104
|
+
id: `shot-${options.seq}`,
|
|
105
|
+
at: Date.now(),
|
|
106
|
+
scope: 'selection',
|
|
107
|
+
mode: options.mode,
|
|
108
|
+
frame: false,
|
|
109
|
+
imagePath: regionFile,
|
|
110
|
+
rect: { x: 0, y: 0, width: size.w, height: size.h },
|
|
111
|
+
windowRect: sel,
|
|
112
|
+
selectionRect: sel,
|
|
113
|
+
scale,
|
|
114
|
+
pad: { x: 0, y: 0 },
|
|
115
|
+
owner: '',
|
|
116
|
+
ready: true,
|
|
117
|
+
};
|
|
118
|
+
return { shot, note };
|
|
119
|
+
}
|
|
120
|
+
/** 回退到「仅选区」:有 region 就用它,没有就现截一块。 */
|
|
121
|
+
async function fallbackSelection(selection, options, regionFile, note) {
|
|
122
|
+
if (regionFile)
|
|
123
|
+
return finishSelection(regionFile, selection, options, note);
|
|
124
|
+
const captured = await captureSelectionToFile(selection, options, `region-${options.seq}.png`);
|
|
125
|
+
if (captured)
|
|
126
|
+
return finishSelection(captured.path, selection, options, note);
|
|
127
|
+
throw new ShotCaptureError(note || 'selection-failed', '截图已拍下,但读取图片失败,请重试');
|
|
128
|
+
}
|
|
129
|
+
/** 选区 + 留白:外扩后裁到选区中心所在的那块屏,再从整屏图里裁出来。 */
|
|
130
|
+
async function finishMargin(selection, options, regionFile, note = '') {
|
|
131
|
+
const margin = Math.max(0, Math.min(MAX_MARGIN_PT, Math.round(options.margin)));
|
|
132
|
+
if (margin <= 0)
|
|
133
|
+
return fallbackSelection(selection, options, regionFile, note);
|
|
134
|
+
let expanded = {
|
|
135
|
+
x: selection.x - margin,
|
|
136
|
+
y: selection.y - margin,
|
|
137
|
+
width: selection.width + margin * 2,
|
|
138
|
+
height: selection.height + margin * 2,
|
|
139
|
+
};
|
|
140
|
+
const displays = await (prefetchedDisplays ?? listDisplays());
|
|
141
|
+
prefetchedDisplays = undefined;
|
|
142
|
+
const display = pickDisplay(displays, selection);
|
|
143
|
+
if (!display)
|
|
144
|
+
return fallbackSelection(selection, options, regionFile, note || 'no-display');
|
|
145
|
+
expanded = clampRect(expanded, display);
|
|
146
|
+
if (expanded.width < 2 || expanded.height < 2) {
|
|
147
|
+
return fallbackSelection(selection, options, regionFile, note || 'margin-clipped');
|
|
148
|
+
}
|
|
149
|
+
const captured = await captureDisplay(display, options, `display-${options.seq}.png`);
|
|
150
|
+
if (!captured) {
|
|
151
|
+
return fallbackSelection(selection, options, regionFile, note || 'margin-capture-failed');
|
|
152
|
+
}
|
|
153
|
+
const scale = captured.scale;
|
|
154
|
+
const dir = await ensureTmpDir();
|
|
155
|
+
const imagePath = join(dir, `shot-${options.seq}.png`);
|
|
156
|
+
const crop = await cropPng(captured.path, {
|
|
157
|
+
left: (expanded.x - display.x) * scale,
|
|
158
|
+
top: (expanded.y - display.y) * scale,
|
|
159
|
+
width: expanded.width * scale,
|
|
160
|
+
height: expanded.height * scale,
|
|
161
|
+
}, captured.size, imagePath);
|
|
162
|
+
await platform.remove(captured.path);
|
|
163
|
+
if (!crop) {
|
|
164
|
+
return fallbackSelection(selection, options, regionFile, note || 'margin-crop-failed');
|
|
165
|
+
}
|
|
166
|
+
const shot = {
|
|
167
|
+
id: `shot-${options.seq}`,
|
|
168
|
+
at: Date.now(),
|
|
169
|
+
scope: 'margin',
|
|
170
|
+
mode: options.mode,
|
|
171
|
+
frame: true,
|
|
172
|
+
imagePath,
|
|
173
|
+
rect: {
|
|
174
|
+
// 用裁切后的实际像素原点,避免 sips 取整带来的 1px 偏移
|
|
175
|
+
x: Math.round((selection.x - display.x) * scale) - crop.left,
|
|
176
|
+
y: Math.round((selection.y - display.y) * scale) - crop.top,
|
|
177
|
+
width: Math.round(selection.width * scale),
|
|
178
|
+
height: Math.round(selection.height * scale),
|
|
179
|
+
},
|
|
180
|
+
windowRect: expanded,
|
|
181
|
+
selectionRect: selection,
|
|
182
|
+
scale,
|
|
183
|
+
pad: { x: 0, y: 0 },
|
|
184
|
+
owner: '',
|
|
185
|
+
ready: true,
|
|
186
|
+
};
|
|
187
|
+
return { shot, note };
|
|
188
|
+
}
|
|
189
|
+
/** 全屏:选区中心所在的那块显示器整屏截下来。 */
|
|
190
|
+
async function finishScreen(selection, options, regionFile) {
|
|
191
|
+
const displays = await (prefetchedDisplays ?? listDisplays());
|
|
192
|
+
prefetchedDisplays = undefined;
|
|
193
|
+
const display = pickDisplay(displays, selection);
|
|
194
|
+
if (!display) {
|
|
195
|
+
return finishMargin(selection, options, regionFile, 'no-display');
|
|
196
|
+
}
|
|
197
|
+
const captured = await captureDisplay(display, options, `shot-${options.seq}.png`);
|
|
198
|
+
if (!captured) {
|
|
199
|
+
return finishMargin(selection, options, regionFile, 'screen-capture-failed');
|
|
200
|
+
}
|
|
201
|
+
const scale = captured.scale;
|
|
202
|
+
const shot = {
|
|
203
|
+
id: `shot-${options.seq}`,
|
|
204
|
+
at: Date.now(),
|
|
205
|
+
scope: 'screen',
|
|
206
|
+
mode: options.mode,
|
|
207
|
+
frame: true,
|
|
208
|
+
imagePath: captured.path,
|
|
209
|
+
rect: {
|
|
210
|
+
x: Math.round((selection.x - display.x) * scale),
|
|
211
|
+
y: Math.round((selection.y - display.y) * scale),
|
|
212
|
+
width: Math.round(selection.width * scale),
|
|
213
|
+
height: Math.round(selection.height * scale),
|
|
214
|
+
},
|
|
215
|
+
windowRect: { x: display.x, y: display.y, width: display.w, height: display.h },
|
|
216
|
+
selectionRect: selection,
|
|
217
|
+
scale,
|
|
218
|
+
pad: { x: 0, y: 0 },
|
|
219
|
+
owner: '',
|
|
220
|
+
ready: true,
|
|
221
|
+
};
|
|
222
|
+
return { shot, note: '' };
|
|
223
|
+
}
|
|
224
|
+
/** 整窗:找窗口、整窗截图;找不到或探针缺失时退到「选区 + 留白」。 */
|
|
225
|
+
async function finishWindow(regionFile, selection, options) {
|
|
226
|
+
if (!(await probeAvailable())) {
|
|
227
|
+
return finishMargin(selection, options, regionFile, 'probe-missing');
|
|
228
|
+
}
|
|
229
|
+
const wins = await (prefetchedWindows ?? listWindows());
|
|
230
|
+
prefetchedWindows = undefined;
|
|
231
|
+
const win = pickWindow(wins, selection);
|
|
232
|
+
if (!win) {
|
|
233
|
+
return finishMargin(selection, options, regionFile, 'no-window');
|
|
234
|
+
}
|
|
235
|
+
const dir = await ensureTmpDir();
|
|
236
|
+
const imagePath = join(dir, `shot-${options.seq}.png`);
|
|
237
|
+
// ⚠️ 不要加 `-o`:文档说它"不截窗口阴影",实测**反过来** ——
|
|
238
|
+
// 加了是 3840×2224(多 64px 阴影),不加才是 3840×2160(正好窗口的 2 倍)。
|
|
239
|
+
// 阴影上下不对称,按对半分会让红框整体偏(用户实测:向上偏移)。
|
|
240
|
+
await run(CAPTURE, ['-l', String(win.id), '-x', imagePath]);
|
|
241
|
+
const size = await pngSize(imagePath);
|
|
242
|
+
if (!size) {
|
|
243
|
+
return finishMargin(selection, options, regionFile, 'window-capture-failed');
|
|
244
|
+
}
|
|
245
|
+
const scale = win.w > 0 ? size.w / win.w : 2;
|
|
246
|
+
const windowRect = { x: win.x, y: win.y, width: win.w, height: win.h };
|
|
247
|
+
// 正常情况 size 应当正好等于窗口的倍数(pad=0);万一系统还是带了阴影,
|
|
248
|
+
// 就按"多出来的两半分"兜底 —— 客户端的 alpha 内容区探测会再校正一次。
|
|
249
|
+
const pad = {
|
|
250
|
+
x: Math.max(0, Math.round((size.w - win.w * scale) / 2)),
|
|
251
|
+
y: Math.max(0, Math.round((size.h - win.h * scale) / 2)),
|
|
252
|
+
};
|
|
253
|
+
const shot = {
|
|
254
|
+
id: `shot-${options.seq}`,
|
|
255
|
+
at: Date.now(),
|
|
256
|
+
scope: 'window',
|
|
257
|
+
mode: options.mode,
|
|
258
|
+
frame: true,
|
|
259
|
+
imagePath,
|
|
260
|
+
rect: {
|
|
261
|
+
x: Math.round(pad.x + (selection.x - windowRect.x) * scale),
|
|
262
|
+
y: Math.round(pad.y + (selection.y - windowRect.y) * scale),
|
|
263
|
+
width: Math.round(selection.width * scale),
|
|
264
|
+
height: Math.round(selection.height * scale),
|
|
265
|
+
},
|
|
266
|
+
windowRect,
|
|
267
|
+
selectionRect: selection,
|
|
268
|
+
scale,
|
|
269
|
+
pad,
|
|
270
|
+
owner: win.owner,
|
|
271
|
+
ready: true,
|
|
272
|
+
};
|
|
273
|
+
return { shot, note: '' };
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* 用户松手后的分派。
|
|
277
|
+
*
|
|
278
|
+
* 顺序仍然刻意:**先出图,后发事件**。UI 一旦画出来,`screencapture` 就会把它截进去
|
|
279
|
+
* (框、卡片都算页面内容)。仅选区的图在框选时就已经落好了,没有这个顾虑。
|
|
280
|
+
*/
|
|
281
|
+
async function finishInteractive(regionFile, options, knownRect) {
|
|
282
|
+
let selection = knownRect || null;
|
|
283
|
+
if (!selection && options.scope !== 'selection') {
|
|
284
|
+
selection = await rectFromXattr(regionFile);
|
|
285
|
+
}
|
|
286
|
+
if (options.scope === 'selection') {
|
|
287
|
+
const rect = selection || (await rectFromXattr(regionFile));
|
|
288
|
+
return finishSelection(regionFile, rect, options);
|
|
289
|
+
}
|
|
290
|
+
if (!selection) {
|
|
291
|
+
return finishSelection(regionFile, null, options, 'no-rect');
|
|
292
|
+
}
|
|
293
|
+
switch (options.scope) {
|
|
294
|
+
case 'margin':
|
|
295
|
+
return finishMargin(selection, options, regionFile);
|
|
296
|
+
case 'screen':
|
|
297
|
+
return finishScreen(selection, options, regionFile);
|
|
298
|
+
case 'window':
|
|
299
|
+
default:
|
|
300
|
+
return finishWindow(regionFile, selection, options);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
active();
|
|
304
|
+
if (knownRect) {
|
|
305
|
+
const captured = await captureSelectionToFile(knownRect, options, `region-${options.seq}.png`);
|
|
306
|
+
if (!captured)
|
|
307
|
+
throw new ShotCaptureError('capture-failed', '截图已拍下,但读取图片失败,请重试', true);
|
|
308
|
+
return finishInteractive(captured.path, options, knownRect);
|
|
309
|
+
}
|
|
310
|
+
const regionFile = join(dir, `region-${options.seq}.png`);
|
|
311
|
+
const result = await checked(platform.run(CAPTURE, ['-i', '-x', regionFile], signal, SELECT_TIMEOUT_MS));
|
|
312
|
+
if (await checked(platform.fileExists(regionFile)))
|
|
313
|
+
return finishInteractive(regionFile, options);
|
|
314
|
+
if (result.timedOut || result.signal === 'SIGTERM')
|
|
315
|
+
throw new ShotCaptureError('timeout', '框选超时,已取消这次截图');
|
|
316
|
+
if (result.code === null && result.failed)
|
|
317
|
+
throw new ShotCaptureError('spawn-failed', '无法启动系统截图命令(screencapture)');
|
|
318
|
+
if (result.failed || result.stderr.trim())
|
|
319
|
+
throw new ShotCaptureError('capture-failed', friendlyCaptureError(result.stderr, result.code));
|
|
320
|
+
return null; // Exit 0 without a file is the user's Escape key, not an error.
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=shot-capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shot-capture.js","sourceRoot":"","sources":["../../src/host/shot-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { MAX_MARGIN_PT } from './shot-types.js';
|
|
2
|
+
const SHOT_SCOPES = ['screen', 'window', 'margin', 'selection'];
|
|
3
|
+
export function intersectArea(a, b) {
|
|
4
|
+
const left = Math.max(a.x, b.x);
|
|
5
|
+
const top = Math.max(a.y, b.y);
|
|
6
|
+
const right = Math.min(a.x + a.width, b.x + b.w);
|
|
7
|
+
const bottom = Math.min(a.y + a.height, b.y + b.h);
|
|
8
|
+
return Math.max(0, right - left) * Math.max(0, bottom - top);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 选区中心落在哪块屏。
|
|
12
|
+
*
|
|
13
|
+
* 用中心而不是"交集最大":选区跨屏时,按中心裁到一块屏才能保证**统一缩放**
|
|
14
|
+
* (混合 DPI 下 `screencapture -R` 跨屏的像素比例不是线性的)。
|
|
15
|
+
*/
|
|
16
|
+
export function pickDisplay(displays, rect) {
|
|
17
|
+
if (displays.length === 0)
|
|
18
|
+
return null;
|
|
19
|
+
const cx = rect.x + rect.width / 2;
|
|
20
|
+
const cy = rect.y + rect.height / 2;
|
|
21
|
+
const hits = displays.filter((d) => cx >= d.x && cx <= d.x + d.w && cy >= d.y && cy <= d.y + d.h);
|
|
22
|
+
if (hits.length > 0)
|
|
23
|
+
return hits[0];
|
|
24
|
+
const sorted = displays.slice().sort((a, b) => intersectArea(rect, b) - intersectArea(rect, a));
|
|
25
|
+
return sorted[0] || displays.find((d) => d.main) || null;
|
|
26
|
+
}
|
|
27
|
+
export function clampRect(rect, box) {
|
|
28
|
+
const left = Math.max(rect.x, box.x);
|
|
29
|
+
const top = Math.max(rect.y, box.y);
|
|
30
|
+
const right = Math.min(rect.x + rect.width, box.x + box.w);
|
|
31
|
+
const bottom = Math.min(rect.y + rect.height, box.y + box.h);
|
|
32
|
+
return { x: left, y: top, width: Math.max(0, right - left), height: Math.max(0, bottom - top) };
|
|
33
|
+
}
|
|
34
|
+
/** Binary plist arrays refer to objects: duplicate coordinate values share the same object. */
|
|
35
|
+
export function parseRectPlist(buf) {
|
|
36
|
+
if (buf.length < 40 || buf.toString('latin1', 0, 6) !== 'bplist')
|
|
37
|
+
return null;
|
|
38
|
+
const trailer = buf.subarray(buf.length - 32);
|
|
39
|
+
const offsetSize = trailer[6];
|
|
40
|
+
const refSize = trailer[7];
|
|
41
|
+
const numObjects = Number(trailer.readBigUInt64BE(8));
|
|
42
|
+
const topObject = Number(trailer.readBigUInt64BE(16));
|
|
43
|
+
const tableOffset = Number(trailer.readBigUInt64BE(24));
|
|
44
|
+
if (!numObjects || offsetSize < 1 || offsetSize > 8 || refSize < 1 || refSize > 8)
|
|
45
|
+
return null;
|
|
46
|
+
if (![numObjects, topObject, tableOffset].every(Number.isSafeInteger) || topObject >= numObjects || tableOffset < 8 || tableOffset + numObjects * offsetSize > buf.length - 32)
|
|
47
|
+
return null;
|
|
48
|
+
const readSized = (at, size) => {
|
|
49
|
+
let value = 0;
|
|
50
|
+
for (let i = 0; i < size; i += 1)
|
|
51
|
+
value = value * 256 + buf[at + i];
|
|
52
|
+
return value;
|
|
53
|
+
};
|
|
54
|
+
const objectAt = (index) => {
|
|
55
|
+
if (index < 0 || index >= numObjects)
|
|
56
|
+
return -1;
|
|
57
|
+
return readSized(tableOffset + index * offsetSize, offsetSize);
|
|
58
|
+
};
|
|
59
|
+
/** 把某个对象解成一个数字(int / real / double)。 */
|
|
60
|
+
const readNumber = (at) => {
|
|
61
|
+
if (at < 0 || at >= buf.length)
|
|
62
|
+
return null;
|
|
63
|
+
const marker = buf[at];
|
|
64
|
+
const kind = marker >> 4;
|
|
65
|
+
const sizeBits = marker & 0x0f;
|
|
66
|
+
if (kind === 0x1) {
|
|
67
|
+
// int
|
|
68
|
+
const size = 1 << sizeBits;
|
|
69
|
+
if (size > 8 || at + 1 + size > tableOffset)
|
|
70
|
+
return null;
|
|
71
|
+
let value = 0;
|
|
72
|
+
for (let i = 0; i < size; i += 1)
|
|
73
|
+
value = value * 256 + buf[at + 1 + i];
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
if (kind === 0x2) {
|
|
77
|
+
// real(0x22 float32 / 0x23 float64)
|
|
78
|
+
if (sizeBits === 2 && at + 5 <= tableOffset)
|
|
79
|
+
return buf.readFloatBE(at + 1);
|
|
80
|
+
if (sizeBits === 3 && at + 9 <= tableOffset)
|
|
81
|
+
return buf.readDoubleBE(at + 1);
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
};
|
|
85
|
+
const arrayAt = objectAt(topObject);
|
|
86
|
+
if (arrayAt < 8 || arrayAt >= tableOffset)
|
|
87
|
+
return null;
|
|
88
|
+
const marker = buf[arrayAt];
|
|
89
|
+
if (marker >> 4 !== 0xa)
|
|
90
|
+
return null;
|
|
91
|
+
let count = marker & 0x0f;
|
|
92
|
+
let refsAt = arrayAt + 1;
|
|
93
|
+
if (count === 0x0f) {
|
|
94
|
+
// 长数组:后面跟一个 int 表示数量
|
|
95
|
+
if (refsAt >= tableOffset)
|
|
96
|
+
return null;
|
|
97
|
+
const intMarker = buf[refsAt];
|
|
98
|
+
if (intMarker >> 4 !== 1)
|
|
99
|
+
return null;
|
|
100
|
+
const size = 1 << (intMarker & 0x0f);
|
|
101
|
+
if (size > 8 || refsAt + 1 + size > tableOffset)
|
|
102
|
+
return null;
|
|
103
|
+
let value = 0;
|
|
104
|
+
for (let i = 0; i < size; i += 1)
|
|
105
|
+
value = value * 256 + buf[refsAt + 1 + i];
|
|
106
|
+
count = value;
|
|
107
|
+
refsAt += 1 + size;
|
|
108
|
+
}
|
|
109
|
+
if (!Number.isSafeInteger(count) || refsAt + count * refSize > tableOffset)
|
|
110
|
+
return null;
|
|
111
|
+
const out = [];
|
|
112
|
+
for (let i = 0; i < count; i += 1) {
|
|
113
|
+
const ref = readSized(refsAt + i * refSize, refSize);
|
|
114
|
+
const value = readNumber(objectAt(ref));
|
|
115
|
+
if (value === null)
|
|
116
|
+
return null;
|
|
117
|
+
out.push(value);
|
|
118
|
+
}
|
|
119
|
+
return out;
|
|
120
|
+
}
|
|
121
|
+
export function contains(win, rect) {
|
|
122
|
+
const cx = rect.x + rect.width / 2;
|
|
123
|
+
const cy = rect.y + rect.height / 2;
|
|
124
|
+
return cx >= win.x && cx <= win.x + win.w && cy >= win.y && cy <= win.y + win.h;
|
|
125
|
+
}
|
|
126
|
+
export function area(win) {
|
|
127
|
+
return win.w * win.h;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 选"你框的那块属于哪个窗口"。
|
|
131
|
+
*
|
|
132
|
+
* 规则:layer 0(普通应用窗口)里,**包含选区中心**的那些,取面积最小的 ——
|
|
133
|
+
* 这样点在一个大窗口里的小对话框上,裁的是对话框而不是整个背景窗口。
|
|
134
|
+
*/
|
|
135
|
+
export function pickWindow(wins, rect) {
|
|
136
|
+
const candidates = wins
|
|
137
|
+
.filter((w) => w.layer === 0 && contains(w, rect))
|
|
138
|
+
.sort((a, b) => area(a) - area(b));
|
|
139
|
+
return candidates[0] || null;
|
|
140
|
+
}
|
|
141
|
+
export function friendlyCaptureError(stderr, code) {
|
|
142
|
+
const text = stderr.toLowerCase();
|
|
143
|
+
if (text.includes('not authorized') || text.includes('permission') || text.includes('could not create image')) {
|
|
144
|
+
return '没有屏幕录制权限:请在 系统设置 → 隐私与安全性 → 屏幕录制 中允许 DSH,然后重试';
|
|
145
|
+
}
|
|
146
|
+
const tail = stderr.trim().replace(/\s+/g, ' ').slice(0, 160);
|
|
147
|
+
return `系统截图失败(退出码 ${code ?? '未知'})${tail ? `:${tail}` : ''}`;
|
|
148
|
+
}
|
|
149
|
+
export function resolveOptions(config, mode, url) {
|
|
150
|
+
const override = url.searchParams.get('scope');
|
|
151
|
+
const stored = mode === 'panel' ? config.shotPanelScope : config.shotCardScope;
|
|
152
|
+
const raw = override && SHOT_SCOPES.includes(override) ? override : stored;
|
|
153
|
+
const scope = SHOT_SCOPES.includes(raw) ? raw : mode === 'panel' ? 'selection' : 'window';
|
|
154
|
+
const marginParam = url.searchParams.get('margin');
|
|
155
|
+
const marginValue = marginParam === null ? NaN : Number(marginParam);
|
|
156
|
+
const fallback = Number.isFinite(config.shotMargin) ? config.shotMargin : 48;
|
|
157
|
+
const margin = Number.isFinite(marginValue)
|
|
158
|
+
? Math.max(0, Math.min(MAX_MARGIN_PT, Math.round(marginValue)))
|
|
159
|
+
: Math.max(0, Math.min(MAX_MARGIN_PT, Math.round(fallback)));
|
|
160
|
+
return { mode, scope, margin };
|
|
161
|
+
}
|
|
162
|
+
export function parseRectXattr(hex) {
|
|
163
|
+
const raw = hex.replace(/\s+/g, '');
|
|
164
|
+
if (!raw || raw.length % 2 !== 0 || !/^[0-9a-f]+$/i.test(raw))
|
|
165
|
+
return null;
|
|
166
|
+
const nums = parseRectPlist(Buffer.from(raw, 'hex'));
|
|
167
|
+
if (!nums || nums.length < 4)
|
|
168
|
+
return null;
|
|
169
|
+
const [x, y, width, height] = nums;
|
|
170
|
+
return [x, y, width, height].every(Number.isFinite) && width > 0 && height > 0 ? { x, y, width, height } : null;
|
|
171
|
+
}
|
|
172
|
+
export function parsePngSize(buf) {
|
|
173
|
+
if (buf.length < 24 || buf[0] !== 0x89 || buf[1] !== 0x50 || buf[2] !== 0x4e || buf[3] !== 0x47)
|
|
174
|
+
return null;
|
|
175
|
+
const w = buf.readUInt32BE(16), h = buf.readUInt32BE(20);
|
|
176
|
+
return w > 0 && h > 0 ? { w, h } : null;
|
|
177
|
+
}
|
|
178
|
+
export function cropBox(box, size) {
|
|
179
|
+
const left = Math.max(0, Math.min(size.w - 1, Math.round(box.left)));
|
|
180
|
+
const top = Math.max(0, Math.min(size.h - 1, Math.round(box.top)));
|
|
181
|
+
return { left, top, width: Math.max(1, Math.min(size.w - left, Math.round(box.width))), height: Math.max(1, Math.min(size.h - top, Math.round(box.height))) };
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=shot-geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shot-geometry.js","sourceRoot":"","sources":["../../src/host/shot-geometry.ts"],"names":[],"mappings":"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"}
|