@petukhovart/agent-view 0.1.0

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 (141) hide show
  1. package/.claude-plugin/plugin.json +10 -0
  2. package/LICENSE +21 -0
  3. package/README.md +296 -0
  4. package/dist/adapters/browser.d.ts +3 -0
  5. package/dist/adapters/browser.d.ts.map +1 -0
  6. package/dist/adapters/browser.js +20 -0
  7. package/dist/adapters/browser.js.map +1 -0
  8. package/dist/adapters/electron.d.ts +3 -0
  9. package/dist/adapters/electron.d.ts.map +1 -0
  10. package/dist/adapters/electron.js +20 -0
  11. package/dist/adapters/electron.js.map +1 -0
  12. package/dist/adapters/registry.d.ts +4 -0
  13. package/dist/adapters/registry.d.ts.map +1 -0
  14. package/dist/adapters/registry.js +13 -0
  15. package/dist/adapters/registry.js.map +1 -0
  16. package/dist/adapters/tauri.d.ts +8 -0
  17. package/dist/adapters/tauri.d.ts.map +1 -0
  18. package/dist/adapters/tauri.js +32 -0
  19. package/dist/adapters/tauri.js.map +1 -0
  20. package/dist/adapters/types.d.ts +8 -0
  21. package/dist/adapters/types.d.ts.map +1 -0
  22. package/dist/adapters/types.js +2 -0
  23. package/dist/adapters/types.js.map +1 -0
  24. package/dist/cdp/transport.d.ts +4 -0
  25. package/dist/cdp/transport.d.ts.map +1 -0
  26. package/dist/cdp/transport.js +89 -0
  27. package/dist/cdp/transport.js.map +1 -0
  28. package/dist/cdp/types.d.ts +37 -0
  29. package/dist/cdp/types.d.ts.map +1 -0
  30. package/dist/cdp/types.js +2 -0
  31. package/dist/cdp/types.js.map +1 -0
  32. package/dist/cli/client.d.ts +3 -0
  33. package/dist/cli/client.d.ts.map +1 -0
  34. package/dist/cli/client.js +89 -0
  35. package/dist/cli/client.js.map +1 -0
  36. package/dist/cli/commands/click.d.ts +9 -0
  37. package/dist/cli/commands/click.d.ts.map +1 -0
  38. package/dist/cli/commands/click.js +43 -0
  39. package/dist/cli/commands/click.js.map +1 -0
  40. package/dist/cli/commands/discover.d.ts +3 -0
  41. package/dist/cli/commands/discover.d.ts.map +1 -0
  42. package/dist/cli/commands/discover.js +15 -0
  43. package/dist/cli/commands/discover.js.map +1 -0
  44. package/dist/cli/commands/dom.d.ts +9 -0
  45. package/dist/cli/commands/dom.d.ts.map +1 -0
  46. package/dist/cli/commands/dom.js +19 -0
  47. package/dist/cli/commands/dom.js.map +1 -0
  48. package/dist/cli/commands/fill.d.ts +8 -0
  49. package/dist/cli/commands/fill.d.ts.map +1 -0
  50. package/dist/cli/commands/fill.js +39 -0
  51. package/dist/cli/commands/fill.js.map +1 -0
  52. package/dist/cli/commands/init.d.ts +2 -0
  53. package/dist/cli/commands/init.d.ts.map +1 -0
  54. package/dist/cli/commands/init.js +14 -0
  55. package/dist/cli/commands/init.js.map +1 -0
  56. package/dist/cli/commands/launch.d.ts +3 -0
  57. package/dist/cli/commands/launch.d.ts.map +1 -0
  58. package/dist/cli/commands/launch.js +21 -0
  59. package/dist/cli/commands/launch.js.map +1 -0
  60. package/dist/cli/commands/scene.d.ts +11 -0
  61. package/dist/cli/commands/scene.d.ts.map +1 -0
  62. package/dist/cli/commands/scene.js +29 -0
  63. package/dist/cli/commands/scene.js.map +1 -0
  64. package/dist/cli/commands/screenshot.d.ts +7 -0
  65. package/dist/cli/commands/screenshot.d.ts.map +1 -0
  66. package/dist/cli/commands/screenshot.js +20 -0
  67. package/dist/cli/commands/screenshot.js.map +1 -0
  68. package/dist/cli/commands/snap.d.ts +9 -0
  69. package/dist/cli/commands/snap.d.ts.map +1 -0
  70. package/dist/cli/commands/snap.js +25 -0
  71. package/dist/cli/commands/snap.js.map +1 -0
  72. package/dist/cli/commands/stop.d.ts +2 -0
  73. package/dist/cli/commands/stop.d.ts.map +1 -0
  74. package/dist/cli/commands/stop.js +22 -0
  75. package/dist/cli/commands/stop.js.map +1 -0
  76. package/dist/cli/commands/wait.d.ts +9 -0
  77. package/dist/cli/commands/wait.d.ts.map +1 -0
  78. package/dist/cli/commands/wait.js +26 -0
  79. package/dist/cli/commands/wait.js.map +1 -0
  80. package/dist/cli/index.d.ts +3 -0
  81. package/dist/cli/index.d.ts.map +1 -0
  82. package/dist/cli/index.js +136 -0
  83. package/dist/cli/index.js.map +1 -0
  84. package/dist/config/manager.d.ts +5 -0
  85. package/dist/config/manager.d.ts.map +1 -0
  86. package/dist/config/manager.js +84 -0
  87. package/dist/config/manager.js.map +1 -0
  88. package/dist/config/types.d.ts +13 -0
  89. package/dist/config/types.d.ts.map +1 -0
  90. package/dist/config/types.js +2 -0
  91. package/dist/config/types.js.map +1 -0
  92. package/dist/index.d.ts +3 -0
  93. package/dist/index.d.ts.map +1 -0
  94. package/dist/index.js +2 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/inspectors/dom.d.ts +17 -0
  97. package/dist/inspectors/dom.d.ts.map +1 -0
  98. package/dist/inspectors/dom.js +131 -0
  99. package/dist/inspectors/dom.js.map +1 -0
  100. package/dist/inspectors/scene/formatter.d.ts +5 -0
  101. package/dist/inspectors/scene/formatter.d.ts.map +1 -0
  102. package/dist/inspectors/scene/formatter.js +91 -0
  103. package/dist/inspectors/scene/formatter.js.map +1 -0
  104. package/dist/inspectors/scene/index.d.ts +8 -0
  105. package/dist/inspectors/scene/index.d.ts.map +1 -0
  106. package/dist/inspectors/scene/index.js +26 -0
  107. package/dist/inspectors/scene/index.js.map +1 -0
  108. package/dist/inspectors/scene/pixi.d.ts +3 -0
  109. package/dist/inspectors/scene/pixi.d.ts.map +1 -0
  110. package/dist/inspectors/scene/pixi.js +52 -0
  111. package/dist/inspectors/scene/pixi.js.map +1 -0
  112. package/dist/inspectors/scene/registry.d.ts +4 -0
  113. package/dist/inspectors/scene/registry.d.ts.map +1 -0
  114. package/dist/inspectors/scene/registry.js +13 -0
  115. package/dist/inspectors/scene/registry.js.map +1 -0
  116. package/dist/inspectors/scene/types.d.ts +31 -0
  117. package/dist/inspectors/scene/types.d.ts.map +1 -0
  118. package/dist/inspectors/scene/types.js +2 -0
  119. package/dist/inspectors/scene/types.js.map +1 -0
  120. package/dist/server/index.d.ts +2 -0
  121. package/dist/server/index.d.ts.map +1 -0
  122. package/dist/server/index.js +11 -0
  123. package/dist/server/index.js.map +1 -0
  124. package/dist/server/launcher.d.ts +4 -0
  125. package/dist/server/launcher.d.ts.map +1 -0
  126. package/dist/server/launcher.js +43 -0
  127. package/dist/server/launcher.js.map +1 -0
  128. package/dist/server/ref-store.d.ts +20 -0
  129. package/dist/server/ref-store.d.ts.map +1 -0
  130. package/dist/server/ref-store.js +29 -0
  131. package/dist/server/ref-store.js.map +1 -0
  132. package/dist/server/server.d.ts +28 -0
  133. package/dist/server/server.d.ts.map +1 -0
  134. package/dist/server/server.js +444 -0
  135. package/dist/server/server.js.map +1 -0
  136. package/dist/types.d.ts +33 -0
  137. package/dist/types.d.ts.map +1 -0
  138. package/dist/types.js +11 -0
  139. package/dist/types.js.map +1 -0
  140. package/package.json +59 -0
  141. package/skills/verify/SKILL.md +100 -0
@@ -0,0 +1,444 @@
1
+ import { createServer } from 'node:net';
2
+ import { writeFile, unlink } from 'node:fs/promises';
3
+ import { randomBytes } from 'node:crypto';
4
+ import { homedir, tmpdir } from 'node:os';
5
+ import { join, resolve } from 'node:path';
6
+ import { mkdirSync } from 'node:fs';
7
+ import { getAdapter } from '../adapters/registry.js';
8
+ import { formatAccessibilityTree } from '../inspectors/dom.js';
9
+ import { getSceneGraph, getRawScene, diffScenes } from '../inspectors/scene/index.js';
10
+ import { RefStore } from './ref-store.js';
11
+ import { launch, isRunning } from './launcher.js';
12
+ import { readConfig } from '../config/manager.js';
13
+ import { RuntimeType, WebGLEngine } from '../types.js';
14
+ const SERVER_PORT = 47922;
15
+ const VALID_COMMANDS = new Set(['discover', 'launch', 'dom', 'click', 'fill', 'screenshot', 'scene', 'snap', 'wait', 'stop']);
16
+ const VALID_RUNTIMES = new Set(Object.values(RuntimeType));
17
+ const VALID_ENGINES = new Set(Object.values(WebGLEngine));
18
+ const IDLE_TIMEOUT_MS = 5 * 60 * 1000;
19
+ const DELIMITER = '\n';
20
+ const MAX_BUFFER_SIZE = 1_048_576; // 1 MB
21
+ const TOKEN_DIR = join(homedir(), '.agent-view');
22
+ const TOKEN_PATH = join(TOKEN_DIR, 'token');
23
+ function argStr(args, key) {
24
+ const v = args[key];
25
+ return typeof v === 'string' ? v : undefined;
26
+ }
27
+ function argNum(args, key) {
28
+ const v = args[key];
29
+ return typeof v === 'number' ? v : undefined;
30
+ }
31
+ function argBool(args, key) {
32
+ const v = args[key];
33
+ return typeof v === 'boolean' ? v : undefined;
34
+ }
35
+ export class AgentViewServer {
36
+ server = null;
37
+ connections = new Map();
38
+ refStore = new RefStore();
39
+ idleTimer = null;
40
+ sceneCache = new Map();
41
+ token = '';
42
+ async start() {
43
+ mkdirSync(TOKEN_DIR, { recursive: true });
44
+ this.token = randomBytes(32).toString('hex');
45
+ await writeFile(TOKEN_PATH, this.token, { mode: 0o600 });
46
+ return new Promise((resolve, reject) => {
47
+ this.server = createServer((socket) => this.handleSocket(socket));
48
+ this.server.on('error', reject);
49
+ this.server.listen(SERVER_PORT, '127.0.0.1', () => {
50
+ this.resetIdleTimer();
51
+ resolve();
52
+ });
53
+ });
54
+ }
55
+ resetIdleTimer() {
56
+ if (this.idleTimer)
57
+ clearTimeout(this.idleTimer);
58
+ this.idleTimer = setTimeout(() => this.shutdown(), IDLE_TIMEOUT_MS);
59
+ }
60
+ handleSocket(socket) {
61
+ this.resetIdleTimer();
62
+ let buffer = '';
63
+ socket.on('data', (chunk) => {
64
+ buffer += chunk.toString();
65
+ if (buffer.length > MAX_BUFFER_SIZE) {
66
+ socket.destroy(new Error('Request too large'));
67
+ return;
68
+ }
69
+ const delimIndex = buffer.indexOf(DELIMITER);
70
+ if (delimIndex !== -1) {
71
+ const message = buffer.slice(0, delimIndex);
72
+ buffer = '';
73
+ this.processRequest(message, socket);
74
+ }
75
+ });
76
+ }
77
+ async processRequest(data, socket) {
78
+ try {
79
+ const request = JSON.parse(data);
80
+ if (request.token !== this.token) {
81
+ socket.end(JSON.stringify({ ok: false, error: 'Unauthorized' }) + DELIMITER);
82
+ return;
83
+ }
84
+ if (typeof request.command !== 'string' || !VALID_COMMANDS.has(request.command) ||
85
+ (request.command !== 'stop' && (!VALID_RUNTIMES.has(request.runtime) ||
86
+ typeof request.port !== 'number' || request.port < 1 || request.port > 65535))) {
87
+ socket.end(JSON.stringify({ ok: false, error: 'Invalid request' }) + DELIMITER);
88
+ return;
89
+ }
90
+ if (request.engine !== undefined && !VALID_ENGINES.has(request.engine)) {
91
+ socket.end(JSON.stringify({ ok: false, error: 'Invalid engine' }) + DELIMITER);
92
+ return;
93
+ }
94
+ if (!request.args || typeof request.args !== 'object' || Array.isArray(request.args)) {
95
+ socket.end(JSON.stringify({ ok: false, error: 'Invalid args' }) + DELIMITER);
96
+ return;
97
+ }
98
+ const response = await this.handleCommand(request);
99
+ socket.end(JSON.stringify(response) + DELIMITER);
100
+ }
101
+ catch (err) {
102
+ const response = {
103
+ ok: false,
104
+ error: err instanceof Error ? err.message : String(err),
105
+ };
106
+ socket.end(JSON.stringify(response) + DELIMITER);
107
+ }
108
+ }
109
+ async handleCommand(req) {
110
+ switch (req.command) {
111
+ case 'discover':
112
+ return this.handleDiscover(req);
113
+ case 'launch':
114
+ return this.handleLaunch(req);
115
+ case 'dom':
116
+ return this.handleDom(req);
117
+ case 'click':
118
+ return this.handleClick(req);
119
+ case 'fill':
120
+ return this.handleFill(req);
121
+ case 'screenshot':
122
+ return this.handleScreenshot(req);
123
+ case 'scene':
124
+ return this.handleScene(req);
125
+ case 'snap':
126
+ return this.handleSnap(req);
127
+ case 'wait':
128
+ return this.handleWait(req);
129
+ case 'stop':
130
+ return this.handleStop();
131
+ default:
132
+ return { ok: false, error: `Unknown command: ${req.command}` };
133
+ }
134
+ }
135
+ async resolveWindow(req) {
136
+ const adapter = getAdapter(req.runtime);
137
+ const windowArg = req.args.window || undefined;
138
+ const windows = await adapter.discover(req.port);
139
+ if (windows.length === 0) {
140
+ throw new Error('No windows found. Is the application running?');
141
+ }
142
+ let targetId;
143
+ if (windowArg) {
144
+ const byId = windows.find(w => w.id === windowArg);
145
+ const byTitle = windows.find(w => w.title.toLowerCase().includes(windowArg.toLowerCase()));
146
+ const found = byId ?? byTitle;
147
+ if (!found) {
148
+ throw new Error(`Window not found: "${windowArg}". Available: ${windows.map(w => `"${w.title}" (${w.id})`).join(', ')}`);
149
+ }
150
+ targetId = found.id;
151
+ }
152
+ else {
153
+ targetId = windows[0].id;
154
+ }
155
+ return { targetId, windows };
156
+ }
157
+ async getConnection(req, targetId) {
158
+ const connKey = `${req.port}:${targetId}`;
159
+ let conn = this.connections.get(connKey);
160
+ if (!conn) {
161
+ const adapter = getAdapter(req.runtime);
162
+ conn = await adapter.connect(req.port, targetId);
163
+ this.connections.set(connKey, conn);
164
+ }
165
+ return conn;
166
+ }
167
+ async handleDiscover(req) {
168
+ const adapter = getAdapter(req.runtime);
169
+ const windows = await adapter.discover(req.port);
170
+ return {
171
+ ok: true,
172
+ data: {
173
+ runtime: req.runtime,
174
+ port: req.port,
175
+ windows,
176
+ },
177
+ };
178
+ }
179
+ async handleLaunch(req) {
180
+ const launchCmd = argStr(req.args, 'launch');
181
+ const cwd = argStr(req.args, 'cwd');
182
+ if (!launchCmd) {
183
+ return { ok: false, error: 'No launch command provided' };
184
+ }
185
+ if (!cwd) {
186
+ return { ok: false, error: 'launch requires cwd to validate config' };
187
+ }
188
+ // Validate launch command against on-disk config to prevent injection
189
+ const config = readConfig(resolve(cwd));
190
+ if (!config || config.launch !== launchCmd) {
191
+ return { ok: false, error: 'Launch command does not match project config' };
192
+ }
193
+ if (await isRunning(req.port)) {
194
+ return { ok: true, data: 'Application already running' };
195
+ }
196
+ await launch(launchCmd, req.port, cwd);
197
+ return { ok: true, data: 'Application launched and ready' };
198
+ }
199
+ async handleDom(req) {
200
+ const { targetId } = await this.resolveWindow(req);
201
+ const conn = await this.getConnection(req, targetId);
202
+ const nodes = await conn.getAccessibilityTree();
203
+ const { text, refs, nextRef } = formatAccessibilityTree(nodes, {
204
+ filter: argStr(req.args, 'filter'),
205
+ depth: argNum(req.args, 'depth'),
206
+ startRef: this.refStore.getNextRef(),
207
+ });
208
+ this.refStore.store(refs, req.port, targetId, nextRef);
209
+ return { ok: true, data: text };
210
+ }
211
+ async findByFilter(conn, filter, req, targetId, preferRoles) {
212
+ const nodes = await conn.getAccessibilityTree();
213
+ const { refs, nextRef } = formatAccessibilityTree(nodes, {
214
+ filter,
215
+ startRef: this.refStore.getNextRef(),
216
+ });
217
+ this.refStore.store(refs, req.port, targetId, nextRef);
218
+ if (refs.length === 0)
219
+ return null;
220
+ // Build map with fallback name resolution (same logic as dom.ts)
221
+ const nodeById = new Map();
222
+ for (const node of nodes)
223
+ nodeById.set(node.nodeId, node);
224
+ function resolveChildName(node, depth = 5) {
225
+ if (depth <= 0 || !node.childIds)
226
+ return '';
227
+ for (const childId of node.childIds) {
228
+ const child = nodeById.get(childId);
229
+ if (!child)
230
+ continue;
231
+ if (child.name?.value)
232
+ return child.name.value;
233
+ const desc = child.properties?.find(p => p.name === 'description');
234
+ if (desc?.value?.value && typeof desc.value.value === 'string')
235
+ return desc.value.value;
236
+ const deeper = resolveChildName(child, depth - 1);
237
+ if (deeper)
238
+ return deeper;
239
+ }
240
+ return '';
241
+ }
242
+ const nodeByDOMId = new Map();
243
+ for (const node of nodes) {
244
+ if (node.backendDOMNodeId) {
245
+ const name = node.name?.value || resolveChildName(node);
246
+ nodeByDOMId.set(node.backendDOMNodeId, {
247
+ name,
248
+ role: node.role?.value ?? '',
249
+ });
250
+ }
251
+ }
252
+ const lowerFilter = filter.toLowerCase();
253
+ // If preferred roles specified, try those first
254
+ if (preferRoles) {
255
+ for (const entry of refs) {
256
+ const info = nodeByDOMId.get(entry.backendDOMNodeId);
257
+ if (info && preferRoles.has(info.role) && info.name.toLowerCase().includes(lowerFilter)) {
258
+ return { backendDOMNodeId: entry.backendDOMNodeId, name: info.name };
259
+ }
260
+ }
261
+ }
262
+ // Pick the deepest match whose name contains the filter text (leaf-first)
263
+ for (let i = refs.length - 1; i >= 0; i--) {
264
+ const info = nodeByDOMId.get(refs[i].backendDOMNodeId);
265
+ if (info && info.name.toLowerCase().includes(lowerFilter)) {
266
+ return { backendDOMNodeId: refs[i].backendDOMNodeId, name: info.name };
267
+ }
268
+ }
269
+ // Fallback: last ref (deepest element in filtered tree)
270
+ const last = refs[refs.length - 1];
271
+ const lastInfo = nodeByDOMId.get(last.backendDOMNodeId);
272
+ return { backendDOMNodeId: last.backendDOMNodeId, name: lastInfo?.name ?? filter };
273
+ }
274
+ async handleClick(req) {
275
+ const { targetId } = await this.resolveWindow(req);
276
+ const conn = await this.getConnection(req, targetId);
277
+ if (req.args.pos && typeof req.args.pos === 'object') {
278
+ const pos = req.args.pos;
279
+ const x = typeof pos.x === 'number' ? pos.x : 0;
280
+ const y = typeof pos.y === 'number' ? pos.y : 0;
281
+ await conn.clickAtPosition(x, y);
282
+ return { ok: true, data: `Clicked at (${x}, ${y})` };
283
+ }
284
+ const clickFilter = argStr(req.args, 'filter');
285
+ if (clickFilter) {
286
+ const filter = clickFilter;
287
+ const CLICK_ROLES = new Set(['button', 'link', 'menuitem', 'tab', 'checkbox', 'radio']);
288
+ const found = await this.findByFilter(conn, filter, req, targetId, CLICK_ROLES);
289
+ if (!found) {
290
+ return { ok: false, error: `No element found matching "${filter}"` };
291
+ }
292
+ await conn.clickByNodeId(found.backendDOMNodeId);
293
+ return { ok: true, data: `Clicked "${found.name}"` };
294
+ }
295
+ const ref = argNum(req.args, 'ref');
296
+ if (ref === undefined) {
297
+ return { ok: false, error: 'click requires --ref, --filter, or --pos' };
298
+ }
299
+ const entry = this.refStore.get(ref);
300
+ if (!entry) {
301
+ return { ok: false, error: `Invalid ref: ${ref}. Run \`agent-view dom\` to get fresh refs.` };
302
+ }
303
+ await conn.clickByNodeId(entry.backendDOMNodeId);
304
+ return { ok: true, data: `Clicked ref ${ref}` };
305
+ }
306
+ async handleFill(req) {
307
+ const { targetId } = await this.resolveWindow(req);
308
+ const conn = await this.getConnection(req, targetId);
309
+ const value = argStr(req.args, 'value');
310
+ if (value === undefined) {
311
+ return { ok: false, error: 'fill requires --value' };
312
+ }
313
+ const fillFilter = argStr(req.args, 'filter');
314
+ if (fillFilter) {
315
+ const filter = fillFilter;
316
+ const FILL_ROLES = new Set(['textbox', 'searchbox', 'combobox', 'spinbutton', 'textarea']);
317
+ const found = await this.findByFilter(conn, filter, req, targetId, FILL_ROLES);
318
+ if (!found) {
319
+ return { ok: false, error: `No element found matching "${filter}"` };
320
+ }
321
+ await conn.fillByNodeId(found.backendDOMNodeId, value);
322
+ return { ok: true, data: `Filled "${found.name}" with "${value}"` };
323
+ }
324
+ const fillRef = argNum(req.args, 'ref');
325
+ if (fillRef === undefined) {
326
+ return { ok: false, error: 'fill requires --ref or --filter' };
327
+ }
328
+ const entry = this.refStore.get(fillRef);
329
+ if (!entry) {
330
+ return { ok: false, error: `Invalid ref: ${fillRef}. Run \`agent-view dom\` to get fresh refs.` };
331
+ }
332
+ await conn.fillByNodeId(entry.backendDOMNodeId, value);
333
+ return { ok: true, data: `Filled ref ${fillRef} with "${value}"` };
334
+ }
335
+ async handleWait(req) {
336
+ const filter = argStr(req.args, 'filter');
337
+ if (!filter) {
338
+ return { ok: false, error: 'wait requires --filter' };
339
+ }
340
+ const timeout = argNum(req.args, 'timeout') ?? 10;
341
+ const interval = 500;
342
+ const maxAttempts = Math.ceil((timeout * 1000) / interval);
343
+ const { targetId } = await this.resolveWindow(req);
344
+ const conn = await this.getConnection(req, targetId);
345
+ for (let i = 0; i < maxAttempts; i++) {
346
+ const nodes = await conn.getAccessibilityTree();
347
+ const { refs, text, nextRef } = formatAccessibilityTree(nodes, {
348
+ filter,
349
+ startRef: this.refStore.getNextRef(),
350
+ });
351
+ if (refs.length > 0) {
352
+ this.refStore.store(refs, req.port, targetId, nextRef);
353
+ return { ok: true, data: text };
354
+ }
355
+ await new Promise(resolve => setTimeout(resolve, interval));
356
+ }
357
+ return { ok: false, error: `Timeout: "${filter}" not found after ${timeout}s` };
358
+ }
359
+ async handleScreenshot(req) {
360
+ const { targetId } = await this.resolveWindow(req);
361
+ const conn = await this.getConnection(req, targetId);
362
+ const buffer = await conn.captureScreenshot();
363
+ const filename = `agent-view-screenshot-${Date.now()}.png`;
364
+ const filepath = join(tmpdir(), filename);
365
+ await writeFile(filepath, buffer);
366
+ return { ok: true, data: filepath };
367
+ }
368
+ async handleScene(req) {
369
+ const { targetId } = await this.resolveWindow(req);
370
+ const conn = await this.getConnection(req, targetId);
371
+ const isDiff = argBool(req.args, 'diff') ?? false;
372
+ const cacheKey = `${req.port}:${targetId}`;
373
+ const sceneFilter = argStr(req.args, 'filter');
374
+ const sceneDepth = argNum(req.args, 'depth');
375
+ const sceneVerbose = argBool(req.args, 'verbose');
376
+ if (isDiff) {
377
+ const curr = await getRawScene(conn, req.engine);
378
+ if (!curr) {
379
+ return { ok: true, data: req.engine ? `No ${req.engine} scene found` : 'No WebGL engine configured' };
380
+ }
381
+ const prev = this.sceneCache.get(cacheKey);
382
+ this.sceneCache.set(cacheKey, curr);
383
+ if (!prev) {
384
+ const text = await getSceneGraph(conn, req.engine, {
385
+ filter: sceneFilter,
386
+ depth: sceneDepth,
387
+ verbose: sceneVerbose,
388
+ });
389
+ return { ok: true, data: text };
390
+ }
391
+ return { ok: true, data: diffScenes(prev, curr) };
392
+ }
393
+ const text = await getSceneGraph(conn, req.engine, {
394
+ filter: sceneFilter,
395
+ depth: sceneDepth,
396
+ verbose: sceneVerbose,
397
+ });
398
+ return { ok: true, data: text };
399
+ }
400
+ async handleSnap(req) {
401
+ const { targetId } = await this.resolveWindow(req);
402
+ const conn = await this.getConnection(req, targetId);
403
+ const snapFilter = argStr(req.args, 'filter');
404
+ const snapDepth = argNum(req.args, 'depth');
405
+ // DOM section
406
+ const nodes = await conn.getAccessibilityTree();
407
+ const { text: domText, refs, nextRef } = formatAccessibilityTree(nodes, {
408
+ filter: snapFilter,
409
+ depth: snapDepth,
410
+ startRef: this.refStore.getNextRef(),
411
+ });
412
+ this.refStore.store(refs, req.port, targetId, nextRef);
413
+ const sections = [`=== DOM ===\n${domText}`];
414
+ if (req.engine) {
415
+ const sceneText = await getSceneGraph(conn, req.engine, {
416
+ filter: snapFilter,
417
+ depth: snapDepth,
418
+ });
419
+ if (!sceneText.startsWith('No ')) {
420
+ sections.push(`=== Scene ===\n${sceneText}`);
421
+ }
422
+ }
423
+ return { ok: true, data: sections.join('\n\n') };
424
+ }
425
+ async handleStop() {
426
+ setTimeout(() => this.shutdown(), 100);
427
+ return { ok: true, data: 'Server stopping' };
428
+ }
429
+ async shutdown() {
430
+ if (this.idleTimer)
431
+ clearTimeout(this.idleTimer);
432
+ await unlink(TOKEN_PATH).catch(() => { });
433
+ for (const conn of this.connections.values()) {
434
+ try {
435
+ await conn.close();
436
+ }
437
+ catch { /* ignore */ }
438
+ }
439
+ this.connections.clear();
440
+ this.server?.close();
441
+ process.exit(0);
442
+ }
443
+ }
444
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export declare enum RuntimeType {
2
+ Electron = "electron",
3
+ Tauri = "tauri",
4
+ Browser = "browser"
5
+ }
6
+ export declare enum WebGLEngine {
7
+ Pixi = "pixi"
8
+ }
9
+ export type WindowInfo = {
10
+ id: string;
11
+ title: string;
12
+ url: string;
13
+ type: string;
14
+ };
15
+ export type RuntimeInfo = {
16
+ runtime: RuntimeType;
17
+ port: number;
18
+ windows: WindowInfo[];
19
+ };
20
+ export type ServerRequest = {
21
+ command: string;
22
+ port: number;
23
+ runtime: RuntimeType;
24
+ engine?: WebGLEngine;
25
+ args: Record<string, unknown>;
26
+ token?: string;
27
+ };
28
+ export type ServerResponse = {
29
+ ok: boolean;
30
+ data?: unknown;
31
+ error?: string;
32
+ };
33
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,QAAQ,aAAa;IACrB,KAAK,UAAU;IACf,OAAO,YAAY;CACpB;AAED,oBAAY,WAAW;IACrB,IAAI,SAAS;CACd;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,WAAW,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,UAAU,EAAE,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,WAAW,CAAA;IACpB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA"}
package/dist/types.js ADDED
@@ -0,0 +1,11 @@
1
+ export var RuntimeType;
2
+ (function (RuntimeType) {
3
+ RuntimeType["Electron"] = "electron";
4
+ RuntimeType["Tauri"] = "tauri";
5
+ RuntimeType["Browser"] = "browser";
6
+ })(RuntimeType || (RuntimeType = {}));
7
+ export var WebGLEngine;
8
+ (function (WebGLEngine) {
9
+ WebGLEngine["Pixi"] = "pixi";
10
+ })(WebGLEngine || (WebGLEngine = {}));
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,oCAAqB,CAAA;IACrB,8BAAe,CAAA;IACf,kCAAmB,CAAA;AACrB,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAED,MAAM,CAAN,IAAY,WAEX;AAFD,WAAY,WAAW;IACrB,4BAAa,CAAA;AACf,CAAC,EAFW,WAAW,KAAX,WAAW,QAEtB"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@petukhovart/agent-view",
3
+ "version": "0.1.0",
4
+ "description": "CLI tool for visual verification of desktop apps (Electron/Tauri) via Chrome DevTools Protocol",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "agent-view": "dist/cli/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ ".claude-plugin",
13
+ "skills",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "keywords": [
18
+ "cdp",
19
+ "chrome-devtools-protocol",
20
+ "electron",
21
+ "tauri",
22
+ "desktop",
23
+ "testing",
24
+ "accessibility",
25
+ "screenshot",
26
+ "automation",
27
+ "ai-agent",
28
+ "cli"
29
+ ],
30
+ "author": "Artem Petukhov",
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/PetukhovArt/agent-view.git"
35
+ },
36
+ "bugs": {
37
+ "url": "https://github.com/PetukhovArt/agent-view/issues"
38
+ },
39
+ "homepage": "https://github.com/PetukhovArt/agent-view#readme",
40
+ "engines": {
41
+ "node": ">=18"
42
+ },
43
+ "dependencies": {
44
+ "chrome-remote-interface": "^0.34.0",
45
+ "commander": "^14.0.3"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "^25.5.0",
49
+ "tsx": "^4.21.0",
50
+ "typescript": "^6.0.2",
51
+ "vitest": "^4.1.2"
52
+ },
53
+ "scripts": {
54
+ "build": "tsc",
55
+ "dev": "tsx src/cli/index.ts",
56
+ "test": "vitest run",
57
+ "test:watch": "vitest"
58
+ }
59
+ }