@zenalexa/unicli 0.222.3 → 0.223.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.
Files changed (108) hide show
  1. package/AGENTS.md +24 -1
  2. package/README.md +16 -5
  3. package/README.zh-CN.md +2 -2
  4. package/dist/browser/auth-sync.d.ts +32 -0
  5. package/dist/browser/auth-sync.d.ts.map +1 -0
  6. package/dist/browser/auth-sync.js +119 -0
  7. package/dist/browser/auth-sync.js.map +1 -0
  8. package/dist/browser/bridge.d.ts +2 -0
  9. package/dist/browser/bridge.d.ts.map +1 -1
  10. package/dist/browser/bridge.js +4 -3
  11. package/dist/browser/bridge.js.map +1 -1
  12. package/dist/browser/cdp-client.d.ts +5 -0
  13. package/dist/browser/cdp-client.d.ts.map +1 -1
  14. package/dist/browser/cdp-client.js +18 -3
  15. package/dist/browser/cdp-client.js.map +1 -1
  16. package/dist/browser/chrome-policy.d.ts +38 -0
  17. package/dist/browser/chrome-policy.d.ts.map +1 -0
  18. package/dist/browser/chrome-policy.js +261 -0
  19. package/dist/browser/chrome-policy.js.map +1 -0
  20. package/dist/browser/daemon-client.d.ts +3 -0
  21. package/dist/browser/daemon-client.d.ts.map +1 -1
  22. package/dist/browser/daemon-client.js +13 -15
  23. package/dist/browser/daemon-client.js.map +1 -1
  24. package/dist/browser/doctor.d.ts +147 -0
  25. package/dist/browser/doctor.d.ts.map +1 -0
  26. package/dist/browser/doctor.js +784 -0
  27. package/dist/browser/doctor.js.map +1 -0
  28. package/dist/browser/launcher.d.ts +17 -8
  29. package/dist/browser/launcher.d.ts.map +1 -1
  30. package/dist/browser/launcher.js +51 -11
  31. package/dist/browser/launcher.js.map +1 -1
  32. package/dist/browser/local-profiles.d.ts +55 -0
  33. package/dist/browser/local-profiles.d.ts.map +1 -0
  34. package/dist/browser/local-profiles.js +333 -0
  35. package/dist/browser/local-profiles.js.map +1 -0
  36. package/dist/cli.d.ts.map +1 -1
  37. package/dist/cli.js +14 -1
  38. package/dist/cli.js.map +1 -1
  39. package/dist/commands/browser/index.d.ts +2 -2
  40. package/dist/commands/browser/index.d.ts.map +1 -1
  41. package/dist/commands/browser/index.js +195 -14
  42. package/dist/commands/browser/index.js.map +1 -1
  43. package/dist/commands/compute.d.ts.map +1 -1
  44. package/dist/commands/compute.js +116 -11
  45. package/dist/commands/compute.js.map +1 -1
  46. package/dist/commands/doctor-compute.d.ts +3 -1
  47. package/dist/commands/doctor-compute.d.ts.map +1 -1
  48. package/dist/commands/doctor-compute.js +78 -2
  49. package/dist/commands/doctor-compute.js.map +1 -1
  50. package/dist/compute/capture-reference.d.ts +40 -0
  51. package/dist/compute/capture-reference.d.ts.map +1 -0
  52. package/dist/compute/capture-reference.js +285 -0
  53. package/dist/compute/capture-reference.js.map +1 -0
  54. package/dist/compute/capture.d.ts +67 -0
  55. package/dist/compute/capture.d.ts.map +1 -0
  56. package/dist/compute/capture.js +247 -0
  57. package/dist/compute/capture.js.map +1 -0
  58. package/dist/discovery/aliases.d.ts.map +1 -1
  59. package/dist/discovery/aliases.js +13 -0
  60. package/dist/discovery/aliases.js.map +1 -1
  61. package/dist/discovery/core-catalog.d.ts +37 -0
  62. package/dist/discovery/core-catalog.d.ts.map +1 -0
  63. package/dist/discovery/core-catalog.js +352 -0
  64. package/dist/discovery/core-catalog.js.map +1 -0
  65. package/dist/discovery/intents.d.ts.map +1 -1
  66. package/dist/discovery/intents.js +51 -0
  67. package/dist/discovery/intents.js.map +1 -1
  68. package/dist/discovery/search.d.ts +10 -6
  69. package/dist/discovery/search.d.ts.map +1 -1
  70. package/dist/discovery/search.js +21 -102
  71. package/dist/discovery/search.js.map +1 -1
  72. package/dist/engine/executor.d.ts +6 -1
  73. package/dist/engine/executor.d.ts.map +1 -1
  74. package/dist/engine/executor.js +2 -0
  75. package/dist/engine/executor.js.map +1 -1
  76. package/dist/engine/kernel/stages.d.ts.map +1 -1
  77. package/dist/engine/kernel/stages.js +4 -0
  78. package/dist/engine/kernel/stages.js.map +1 -1
  79. package/dist/engine/steps/browser-helpers.d.ts.map +1 -1
  80. package/dist/engine/steps/browser-helpers.js +29 -1
  81. package/dist/engine/steps/browser-helpers.js.map +1 -1
  82. package/dist/fast-path/handlers/discovery.d.ts.map +1 -1
  83. package/dist/fast-path/handlers/discovery.js +80 -1
  84. package/dist/fast-path/handlers/discovery.js.map +1 -1
  85. package/dist/manifest.json +1 -1
  86. package/dist/mcp/handler.d.ts.map +1 -1
  87. package/dist/mcp/handler.js +19 -4
  88. package/dist/mcp/handler.js.map +1 -1
  89. package/dist/mcp/profiles/computer-use.d.ts.map +1 -1
  90. package/dist/mcp/profiles/computer-use.js +106 -4
  91. package/dist/mcp/profiles/computer-use.js.map +1 -1
  92. package/docs/mcp/clients/claude-code.md +8 -7
  93. package/docs/mcp/clients/claude-desktop.md +1 -1
  94. package/docs/mcp/clients/codex.md +1 -1
  95. package/docs/mcp/clients/cursor.md +1 -1
  96. package/docs/mcp/clients/gemini-cli.md +1 -1
  97. package/docs/operate/compute.md +58 -0
  98. package/docs/operate/focus-behavior.md +25 -0
  99. package/package.json +1 -1
  100. package/server.json +2 -2
  101. package/skills/unicli/SKILL.md +54 -38
  102. package/skills/unicli-browser/SKILL.md +56 -10
  103. package/skills/unicli-claude-code/SKILL.md +1 -1
  104. package/skills/unicli-hermes/SKILL.md +1 -1
  105. package/skills/unicli-operate/SKILL.md +1 -1
  106. package/skills/unicli-smart-search/SKILL.md +7 -5
  107. package/skills/unicli-usage/SKILL.md +39 -1
  108. package/src/hub/external-clis.yaml +6 -0
@@ -0,0 +1,285 @@
1
+ /**
2
+ * @owner src/compute/capture-reference.ts
3
+ * @does Persist compute capture packets as reusable local app-shot references for agent handoff.
4
+ * @needs node:crypto, node:fs/promises, node:os, node:path, src/compute/capture.ts
5
+ * @feeds src/commands/compute.ts, src/mcp/profiles/computer-use.ts, tests/unit/compute-capture-reference.test.ts
6
+ * @breaks Throws filesystem errors when the reference root cannot be created or written.
7
+ * @invariants Reference markup always points at local files that were written before it is returned.
8
+ * @side-effects Writes metadata/content/image artifacts under ~/.unicli/app-shots or an explicit root.
9
+ * @perf Copies screenshot bytes once and does not duplicate image bytes into metadata JSON.
10
+ * @concurrency Each save receives a unique id so repeated captures do not overwrite prior handoff artifacts.
11
+ * @test tests/unit/compute-capture-reference.test.ts
12
+ * @stability beta
13
+ * @since 0.223.0
14
+ */
15
+ import { createHash, randomUUID } from "node:crypto";
16
+ import { spawn } from "node:child_process";
17
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
18
+ import { homedir } from "node:os";
19
+ import { join } from "node:path";
20
+ export async function saveComputeCaptureReference(packet, options = {}) {
21
+ const root = options.rootDir ?? defaultReferenceRoot();
22
+ const id = referenceId(packet);
23
+ const captureDir = join(root, id);
24
+ await mkdir(captureDir, { recursive: true, mode: 0o700 });
25
+ const imagePath = await writeImageEvidence(packet, captureDir);
26
+ const contentPath = join(captureDir, "content.txt");
27
+ await writeFile(contentPath, captureContent(packet, imagePath), {
28
+ encoding: "utf-8",
29
+ mode: 0o600,
30
+ });
31
+ const metadataPath = join(captureDir, "packet.json");
32
+ const reference = {
33
+ schema_version: 1,
34
+ id,
35
+ created_at: packet.captured_at,
36
+ ...(packet.app ? { app: packet.app } : {}),
37
+ root: captureDir,
38
+ files: {
39
+ metadata: metadataPath,
40
+ content: contentPath,
41
+ ...(imagePath ? { image: imagePath } : {}),
42
+ },
43
+ markup: "",
44
+ };
45
+ reference.markup = referenceMarkup(reference);
46
+ const envelope = {
47
+ schema_version: 1,
48
+ reference,
49
+ packet: packetForMetadata(packet, imagePath),
50
+ };
51
+ await writeFile(metadataPath, `${JSON.stringify(envelope, null, 2)}\n`, {
52
+ encoding: "utf-8",
53
+ mode: 0o600,
54
+ });
55
+ return reference;
56
+ }
57
+ export async function copyReferenceMarkupToClipboard(markup, options = {}) {
58
+ const commands = clipboardCommands(options.platform ?? process.platform);
59
+ const run = options.run ?? runClipboardCommand;
60
+ const failures = [];
61
+ for (const command of commands) {
62
+ try {
63
+ await run(command.command, command.args, markup);
64
+ return;
65
+ }
66
+ catch (error) {
67
+ failures.push(`${command.command}: ${errorMessage(error)}`);
68
+ }
69
+ }
70
+ throw new Error(`clipboard copy failed: ${failures.join("; ")}`);
71
+ }
72
+ export function defaultReferenceRoot() {
73
+ return (process.env.UNICLI_APP_SHOTS_ROOT?.trim() ||
74
+ join(homedir(), ".unicli", "app-shots"));
75
+ }
76
+ function clipboardCommands(platform) {
77
+ if (platform === "darwin")
78
+ return [{ command: "pbcopy", args: [] }];
79
+ if (platform === "win32") {
80
+ return [
81
+ {
82
+ command: "powershell.exe",
83
+ args: [
84
+ "-NoProfile",
85
+ "-Command",
86
+ "Set-Clipboard -Value ([Console]::In.ReadToEnd())",
87
+ ],
88
+ },
89
+ ];
90
+ }
91
+ return [
92
+ { command: "wl-copy", args: [] },
93
+ { command: "xclip", args: ["-selection", "clipboard"] },
94
+ { command: "xsel", args: ["--clipboard", "--input"] },
95
+ ];
96
+ }
97
+ function runClipboardCommand(command, args, input) {
98
+ return new Promise((resolve, reject) => {
99
+ const child = spawn(command, args, { stdio: ["pipe", "ignore", "pipe"] });
100
+ let stderr = "";
101
+ child.stderr?.on("data", (chunk) => {
102
+ stderr += String(chunk);
103
+ });
104
+ child.on("error", reject);
105
+ child.on("close", (code) => {
106
+ if (code === 0) {
107
+ resolve();
108
+ return;
109
+ }
110
+ reject(new Error(stderr.trim() || `exit ${code}`));
111
+ });
112
+ child.stdin.end(input);
113
+ });
114
+ }
115
+ function referenceMarkup(reference) {
116
+ const image = reference.files.image
117
+ ? ` image="${escapeAttribute(reference.files.image)}"`
118
+ : "";
119
+ return `[app-shots${image} content="${escapeAttribute(reference.files.content)}" metadata="${escapeAttribute(reference.files.metadata)}"]`;
120
+ }
121
+ function errorMessage(error) {
122
+ return error instanceof Error ? error.message : String(error);
123
+ }
124
+ function captureContent(packet, imagePath) {
125
+ const snapshotData = packet.snapshot?.ok ? packet.snapshot.data : undefined;
126
+ if (isRecord(snapshotData)) {
127
+ const data = snapshotData.data;
128
+ if (typeof data === "string")
129
+ return normalizeContentText(data);
130
+ }
131
+ if (typeof snapshotData === "string") {
132
+ return normalizeContentText(snapshotData);
133
+ }
134
+ return `${JSON.stringify(packetForMetadata(packet, imagePath), null, 2)}\n`;
135
+ }
136
+ function normalizeContentText(value) {
137
+ const stripped = value
138
+ .split("\n")
139
+ .map((line) => line
140
+ .replace(/\s+\d+(?:\.\d+)?x\d+(?:\.\d+)?@-?\d+(?:\.\d+)?,-?\d+(?:\.\d+)?/g, "")
141
+ .replace(/\s+value="<AXUIElement[^"]*"/g, "")
142
+ .replace(/\s+screen=-?\d+/g, ""))
143
+ .join("\n");
144
+ return stripped.endsWith("\n") ? stripped : `${stripped}\n`;
145
+ }
146
+ async function writeImageEvidence(packet, captureDir) {
147
+ const screenshotData = packet.screenshot?.ok
148
+ ? packet.screenshot.data
149
+ : undefined;
150
+ const bytes = await imageBytes(screenshotData);
151
+ if (!bytes)
152
+ return undefined;
153
+ const extension = imageExtension(screenshotData, bytes);
154
+ const imagePath = join(captureDir, `image.${extension}`);
155
+ await writeFile(imagePath, bytes, { mode: 0o600 });
156
+ return imagePath;
157
+ }
158
+ async function imageBytes(data) {
159
+ if (Buffer.isBuffer(data))
160
+ return data;
161
+ if (!isRecord(data))
162
+ return undefined;
163
+ if (typeof data.base64 === "string")
164
+ return Buffer.from(data.base64, "base64");
165
+ if (typeof data.path === "string") {
166
+ try {
167
+ return await readFile(data.path);
168
+ }
169
+ catch {
170
+ return undefined;
171
+ }
172
+ }
173
+ return undefined;
174
+ }
175
+ function imageExtension(data, bytes) {
176
+ const mime = isRecord(data) && typeof data.mime === "string" ? data.mime : "";
177
+ if (mime === "image/png" || isPng(bytes))
178
+ return "png";
179
+ if (mime === "image/jpeg" || isJpeg(bytes))
180
+ return "jpg";
181
+ return "bin";
182
+ }
183
+ function referenceId(packet) {
184
+ const slug = slugPart(packet.app ?? "capture");
185
+ const timestamp = packet.captured_at.replace(/[^0-9TZ]/g, "").toLowerCase();
186
+ const hash = createHash("sha256")
187
+ .update(JSON.stringify(packet))
188
+ .digest("hex")
189
+ .slice(0, 10);
190
+ const nonce = randomUUID().replace(/-/g, "").slice(0, 8);
191
+ return `${slug}-${timestamp}-${hash}-${nonce}`;
192
+ }
193
+ function packetForMetadata(packet, imagePath) {
194
+ return {
195
+ schema_version: packet.schema_version,
196
+ captured_at: packet.captured_at,
197
+ ...(packet.app ? { app: packet.app } : {}),
198
+ includes: [...packet.includes],
199
+ trajectory: {
200
+ replayable: true,
201
+ steps: packet.trajectory.steps.map((step) => ({
202
+ ...step,
203
+ params: { ...step.params },
204
+ })),
205
+ },
206
+ ...(packet.snapshot
207
+ ? { snapshot: snapshotPartForMetadata(packet.snapshot) }
208
+ : {}),
209
+ ...(packet.screenshot
210
+ ? { screenshot: screenshotPartForMetadata(packet.screenshot, imagePath) }
211
+ : {}),
212
+ };
213
+ }
214
+ function snapshotPartForMetadata(part) {
215
+ if (!part)
216
+ return part;
217
+ if (!part.ok)
218
+ return { ...part, error: cloneError(part.error) };
219
+ if (isRecord(part.data)) {
220
+ return {
221
+ ok: true,
222
+ data: {
223
+ ...part.data,
224
+ ...(typeof part.data.data === "string"
225
+ ? { data: normalizeContentText(part.data.data) }
226
+ : {}),
227
+ },
228
+ };
229
+ }
230
+ if (typeof part.data === "string") {
231
+ return { ok: true, data: normalizeContentText(part.data) };
232
+ }
233
+ return { ok: true, data: part.data };
234
+ }
235
+ function screenshotPartForMetadata(part, imagePath) {
236
+ if (!part)
237
+ return part;
238
+ if (!part.ok)
239
+ return { ...part, error: cloneError(part.error) };
240
+ if (isRecord(part.data)) {
241
+ const { base64: _base64, ...screenshotData } = part.data;
242
+ return {
243
+ ok: true,
244
+ data: {
245
+ ...screenshotData,
246
+ ...(imagePath ? { path: imagePath } : {}),
247
+ },
248
+ };
249
+ }
250
+ if (Buffer.isBuffer(part.data) && imagePath) {
251
+ return { ok: true, data: { path: imagePath } };
252
+ }
253
+ return { ok: true, data: part.data };
254
+ }
255
+ function cloneError(error) {
256
+ return error ? { ...error } : undefined;
257
+ }
258
+ function slugPart(value) {
259
+ const slug = value
260
+ .toLowerCase()
261
+ .replace(/[^a-z0-9]+/g, "-")
262
+ .replace(/^-+|-+$/g, "");
263
+ return slug || "capture";
264
+ }
265
+ function escapeAttribute(value) {
266
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;");
267
+ }
268
+ function isRecord(value) {
269
+ return typeof value === "object" && value !== null && !Array.isArray(value);
270
+ }
271
+ function isPng(buffer) {
272
+ return (buffer.length >= 8 &&
273
+ buffer[0] === 0x89 &&
274
+ buffer[1] === 0x50 &&
275
+ buffer[2] === 0x4e &&
276
+ buffer[3] === 0x47 &&
277
+ buffer[4] === 0x0d &&
278
+ buffer[5] === 0x0a &&
279
+ buffer[6] === 0x1a &&
280
+ buffer[7] === 0x0a);
281
+ }
282
+ function isJpeg(buffer) {
283
+ return buffer.length >= 4 && buffer[0] === 0xff && buffer[1] === 0xd8;
284
+ }
285
+ //# sourceMappingURL=capture-reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-reference.js","sourceRoot":"","sources":["../../src/compute/capture-reference.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @owner src/compute/capture.ts
3
+ * @does Build a reusable desktop context packet from existing compute snapshot and screenshot actions.
4
+ * @needs core/envelope, transport/cascade, transport/types
5
+ * @feeds src/commands/compute.ts, src/mcp/profiles/computer-use.ts
6
+ * @breaks Returns a structured transport envelope when every requested capture part fails.
7
+ * @invariants Capture reuses compute_* actions; it does not bypass transport policy or ref allocation.
8
+ * @side-effects May capture screenshots; may populate the transport ref store through compute_snapshot.
9
+ * @perf Screenshot payload size dominates packet size when no path is supplied.
10
+ * @concurrency Uses the caller-provided transport bus; callers own bus lifecycle.
11
+ * @test tests/unit/commands/compute.test.ts, tests/unit/mcp/tools.test.ts
12
+ * @stability beta
13
+ * @since 0.223.0
14
+ */
15
+ import type { ActionResult, TransportBus } from "../transport/types.js";
16
+ export type CaptureInclude = "snapshot" | "screenshot";
17
+ export type CaptureSnapshotFormat = "compact" | "tree" | "json";
18
+ export interface ComputeCaptureOptions {
19
+ app?: string;
20
+ include?: string | readonly CaptureInclude[];
21
+ format?: CaptureSnapshotFormat;
22
+ maxDepth?: number;
23
+ screenshotPath?: string;
24
+ }
25
+ export interface ComputeCaptureHooks {
26
+ onSnapshotSuccess?: () => void;
27
+ }
28
+ export interface ComputeCapturePart {
29
+ ok: boolean;
30
+ data?: unknown;
31
+ error?: {
32
+ reason: string;
33
+ suggestion: string;
34
+ minimum_capability?: string;
35
+ };
36
+ }
37
+ export interface ComputeCaptureImageMetadata {
38
+ mime?: string;
39
+ bytes: number;
40
+ sha256: string;
41
+ width?: number;
42
+ height?: number;
43
+ coordinate_space: {
44
+ kind: "image-pixels";
45
+ origin: "top-left";
46
+ };
47
+ }
48
+ export interface ComputeCaptureTrajectoryStep {
49
+ index: number;
50
+ action: "compute_snapshot" | "compute_screenshot";
51
+ params: Record<string, unknown>;
52
+ ok: boolean;
53
+ }
54
+ export interface ComputeCapturePacket {
55
+ schema_version: 1;
56
+ captured_at: string;
57
+ app?: string;
58
+ includes: CaptureInclude[];
59
+ snapshot?: ComputeCapturePart;
60
+ screenshot?: ComputeCapturePart;
61
+ trajectory: {
62
+ replayable: true;
63
+ steps: ComputeCaptureTrajectoryStep[];
64
+ };
65
+ }
66
+ export declare function captureComputeContext(bus: TransportBus, options: ComputeCaptureOptions, hooks?: ComputeCaptureHooks): Promise<ActionResult<ComputeCapturePacket>>;
67
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/compute/capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAIxE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC;AACvD,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE,CAAC;IAC7C,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE;QAChB,IAAI,EAAE,cAAc,CAAC;QACrB,MAAM,EAAE,UAAU,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,GAAG,oBAAoB,CAAC;IAClD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,CAAC,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,UAAU,EAAE;QACV,UAAU,EAAE,IAAI,CAAC;QACjB,KAAK,EAAE,4BAA4B,EAAE,CAAC;KACvC,CAAC;CACH;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,qBAAqB,EAC9B,KAAK,GAAE,mBAAwB,GAC9B,OAAO,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAiF7C"}
@@ -0,0 +1,247 @@
1
+ /**
2
+ * @owner src/compute/capture.ts
3
+ * @does Build a reusable desktop context packet from existing compute snapshot and screenshot actions.
4
+ * @needs core/envelope, transport/cascade, transport/types
5
+ * @feeds src/commands/compute.ts, src/mcp/profiles/computer-use.ts
6
+ * @breaks Returns a structured transport envelope when every requested capture part fails.
7
+ * @invariants Capture reuses compute_* actions; it does not bypass transport policy or ref allocation.
8
+ * @side-effects May capture screenshots; may populate the transport ref store through compute_snapshot.
9
+ * @perf Screenshot payload size dominates packet size when no path is supplied.
10
+ * @concurrency Uses the caller-provided transport bus; callers own bus lifecycle.
11
+ * @test tests/unit/commands/compute.test.ts, tests/unit/mcp/tools.test.ts
12
+ * @stability beta
13
+ * @since 0.223.0
14
+ */
15
+ import { err, exitCodeFor, ok } from "../core/envelope.js";
16
+ import { tryCascade } from "../transport/cascade.js";
17
+ import { createHash } from "node:crypto";
18
+ import { readFile } from "node:fs/promises";
19
+ export async function captureComputeContext(bus, options, hooks = {}) {
20
+ const parsedIncludes = readCaptureIncludes(options.include);
21
+ if (parsedIncludes.invalid.length > 0) {
22
+ const plural = parsedIncludes.invalid.length === 1 ? "" : "s";
23
+ return err({
24
+ transport: "subprocess",
25
+ step: 0,
26
+ action: "compute_capture",
27
+ reason: `invalid capture include part${plural}: ${parsedIncludes.invalid.join(", ")}`,
28
+ suggestion: "use --include snapshot,screenshot, snapshot, or screenshot",
29
+ minimum_capability: "compute.capture",
30
+ exit_code: exitCodeFor("usage_error"),
31
+ });
32
+ }
33
+ const includes = parsedIncludes.includes;
34
+ const parts = {};
35
+ const trajectory = [];
36
+ if (includes.includes("snapshot")) {
37
+ const params = {
38
+ ...(options.app ? { app: options.app } : {}),
39
+ format: options.format ?? "compact",
40
+ maxDepth: options.maxDepth ?? 64,
41
+ };
42
+ const snapshotResult = await tryCascade(bus, {
43
+ kind: "compute_snapshot",
44
+ params,
45
+ });
46
+ parts.snapshot = capturePart(snapshotResult);
47
+ trajectory.push({
48
+ index: trajectory.length,
49
+ action: "compute_snapshot",
50
+ params,
51
+ ok: snapshotResult.ok,
52
+ });
53
+ if (snapshotResult.ok)
54
+ hooks.onSnapshotSuccess?.();
55
+ }
56
+ if (includes.includes("screenshot")) {
57
+ const params = {
58
+ ...(options.app ? { app: options.app } : {}),
59
+ ...(options.screenshotPath ? { path: options.screenshotPath } : {}),
60
+ };
61
+ const screenshotResult = await tryCascade(bus, {
62
+ kind: "compute_screenshot",
63
+ params,
64
+ });
65
+ parts.screenshot = await captureScreenshotPart(screenshotResult);
66
+ trajectory.push({
67
+ index: trajectory.length,
68
+ action: "compute_screenshot",
69
+ params,
70
+ ok: screenshotResult.ok,
71
+ });
72
+ }
73
+ const successes = Object.values(parts).filter((part) => part?.ok).length;
74
+ if (successes === 0) {
75
+ return err({
76
+ transport: "visual",
77
+ step: 0,
78
+ action: "compute_capture",
79
+ reason: "all requested capture parts failed",
80
+ suggestion: "run `unicli doctor compute`, then retry capture",
81
+ minimum_capability: "compute.capture",
82
+ exit_code: exitCodeFor("service_unavailable"),
83
+ });
84
+ }
85
+ return ok({
86
+ schema_version: 1,
87
+ captured_at: new Date().toISOString(),
88
+ ...(options.app ? { app: options.app } : {}),
89
+ includes,
90
+ ...parts,
91
+ trajectory: {
92
+ replayable: true,
93
+ steps: trajectory,
94
+ },
95
+ });
96
+ }
97
+ function capturePart(result) {
98
+ if (result.ok)
99
+ return { ok: true, data: result.data };
100
+ return {
101
+ ok: false,
102
+ error: {
103
+ reason: result.error.reason,
104
+ suggestion: result.error.suggestion,
105
+ minimum_capability: result.error.minimum_capability,
106
+ },
107
+ };
108
+ }
109
+ async function captureScreenshotPart(result) {
110
+ if (!result.ok)
111
+ return capturePart(result);
112
+ return {
113
+ ok: true,
114
+ data: await enrichScreenshotData(result.data),
115
+ };
116
+ }
117
+ async function enrichScreenshotData(data) {
118
+ const buffer = await screenshotBuffer(data);
119
+ if (!buffer)
120
+ return data;
121
+ const image = readImageMetadata(buffer, readMime(data, buffer));
122
+ if (Buffer.isBuffer(data)) {
123
+ return {
124
+ base64: buffer.toString("base64"),
125
+ mime: image.mime,
126
+ image,
127
+ };
128
+ }
129
+ if (isRecord(data))
130
+ return { ...data, image };
131
+ return { data, image };
132
+ }
133
+ async function screenshotBuffer(data) {
134
+ if (Buffer.isBuffer(data))
135
+ return data;
136
+ if (!isRecord(data))
137
+ return undefined;
138
+ if (typeof data.base64 === "string") {
139
+ return Buffer.from(data.base64, "base64");
140
+ }
141
+ if (typeof data.path === "string") {
142
+ try {
143
+ return await readFile(data.path);
144
+ }
145
+ catch {
146
+ return undefined;
147
+ }
148
+ }
149
+ return undefined;
150
+ }
151
+ function readImageMetadata(buffer, mime) {
152
+ const size = readImageSize(buffer);
153
+ return {
154
+ ...(mime ? { mime } : {}),
155
+ bytes: buffer.length,
156
+ sha256: createHash("sha256").update(buffer).digest("hex"),
157
+ ...(size ? { width: size.width, height: size.height } : {}),
158
+ coordinate_space: {
159
+ kind: "image-pixels",
160
+ origin: "top-left",
161
+ },
162
+ };
163
+ }
164
+ function readMime(data, buffer) {
165
+ if (isRecord(data) && typeof data.mime === "string")
166
+ return data.mime;
167
+ if (isPng(buffer))
168
+ return "image/png";
169
+ if (isJpeg(buffer))
170
+ return "image/jpeg";
171
+ return undefined;
172
+ }
173
+ function readImageSize(buffer) {
174
+ if (isPng(buffer) && buffer.length >= 24) {
175
+ return {
176
+ width: buffer.readUInt32BE(16),
177
+ height: buffer.readUInt32BE(20),
178
+ };
179
+ }
180
+ return readJpegSize(buffer);
181
+ }
182
+ function isPng(buffer) {
183
+ return (buffer.length >= 8 &&
184
+ buffer[0] === 0x89 &&
185
+ buffer[1] === 0x50 &&
186
+ buffer[2] === 0x4e &&
187
+ buffer[3] === 0x47 &&
188
+ buffer[4] === 0x0d &&
189
+ buffer[5] === 0x0a &&
190
+ buffer[6] === 0x1a &&
191
+ buffer[7] === 0x0a);
192
+ }
193
+ function readJpegSize(buffer) {
194
+ if (!isJpeg(buffer))
195
+ return undefined;
196
+ let offset = 2;
197
+ while (offset + 9 < buffer.length) {
198
+ if (buffer[offset] !== 0xff) {
199
+ offset += 1;
200
+ continue;
201
+ }
202
+ const marker = buffer[offset + 1];
203
+ const length = buffer.readUInt16BE(offset + 2);
204
+ if (length < 2 || offset + 2 + length > buffer.length)
205
+ return undefined;
206
+ if (isJpegStartOfFrame(marker)) {
207
+ return {
208
+ height: buffer.readUInt16BE(offset + 5),
209
+ width: buffer.readUInt16BE(offset + 7),
210
+ };
211
+ }
212
+ offset += 2 + length;
213
+ }
214
+ return undefined;
215
+ }
216
+ function isJpeg(buffer) {
217
+ return buffer.length >= 4 && buffer[0] === 0xff && buffer[1] === 0xd8;
218
+ }
219
+ function isJpegStartOfFrame(marker) {
220
+ return (marker !== undefined &&
221
+ marker >= 0xc0 &&
222
+ marker <= 0xcf &&
223
+ marker !== 0xc4 &&
224
+ marker !== 0xc8 &&
225
+ marker !== 0xcc);
226
+ }
227
+ function isRecord(value) {
228
+ return typeof value === "object" && value !== null && !Array.isArray(value);
229
+ }
230
+ function readCaptureIncludes(value) {
231
+ const parts = Array.isArray(value)
232
+ ? value
233
+ : String(value ?? "snapshot,screenshot")
234
+ .split(",")
235
+ .map((part) => part.trim())
236
+ .filter(Boolean);
237
+ const includes = parts.filter(isCaptureInclude);
238
+ const invalid = parts.filter((part) => !isCaptureInclude(part));
239
+ return {
240
+ includes: includes.length > 0 ? includes : ["snapshot", "screenshot"],
241
+ invalid,
242
+ };
243
+ }
244
+ function isCaptureInclude(value) {
245
+ return value === "snapshot" || value === "screenshot";
246
+ }
247
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/compute/capture.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../src/discovery/aliases.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAiLnD,CAAC;AAKH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAuIhE,CAAC;AAKH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CA8gBhE,CAAC;AAKH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAoStD,CAAC;AAKH,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAiEvD,CAAC;AAIH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBnD;AASD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAiCD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiErD"}
1
+ {"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../src/discovery/aliases.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAiLnD,CAAC;AAKH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAuIhE,CAAC;AAKH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CA2hBhE,CAAC;AAKH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAoStD,CAAC;AAKH,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAiEvD,CAAC;AAIH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBnD;AASD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAiCD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiErD"}
@@ -826,6 +826,19 @@ export const DOMAIN_ALIASES = new Map([
826
826
  ["日历", ["calendar", "event", "schedule"]],
827
827
  ["定时", ["schedule", "timer", "cron"]],
828
828
  ["screenshot", ["screenshot", "capture"]],
829
+ [
830
+ "appshots",
831
+ [
832
+ "app",
833
+ "shots",
834
+ "capture",
835
+ "compute",
836
+ "desktop",
837
+ "accessibility",
838
+ "screenshot",
839
+ "reference",
840
+ ],
841
+ ],
829
842
  ["clipboard", ["clipboard", "copy", "paste"]],
830
843
  ]);
831
844
  // ── Category Mapping ────────────────────────────────────────────────────────