@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,136 @@
1
+ #!/usr/bin/env node
2
+ const [nodeMajor] = process.versions.node.split('.').map(Number);
3
+ if (nodeMajor < 18) {
4
+ process.stderr.write(`agent-view requires Node.js 18 or higher. Current: ${process.versions.node}\n`);
5
+ process.exit(1);
6
+ }
7
+ import { Command } from 'commander';
8
+ import { readConfig } from '../config/manager.js';
9
+ import { runInit } from './commands/init.js';
10
+ import { runDiscover } from './commands/discover.js';
11
+ import { runLaunch } from './commands/launch.js';
12
+ import { runDom } from './commands/dom.js';
13
+ import { runClick } from './commands/click.js';
14
+ import { runFill } from './commands/fill.js';
15
+ import { runScreenshot } from './commands/screenshot.js';
16
+ import { runScene } from './commands/scene.js';
17
+ import { runSnap } from './commands/snap.js';
18
+ import { runStop } from './commands/stop.js';
19
+ import { runWait } from './commands/wait.js';
20
+ const program = new Command()
21
+ .name('agent-view')
22
+ .description('Visual verification CLI for desktop apps')
23
+ .version('0.1.0');
24
+ program
25
+ .command('init')
26
+ .description('Auto-generate agent-view.config.json')
27
+ .action(() => {
28
+ runInit(process.cwd());
29
+ });
30
+ program
31
+ .command('discover')
32
+ .description('Discover running application and its windows')
33
+ .action(async () => {
34
+ const config = requireConfig();
35
+ await runDiscover(config);
36
+ });
37
+ program
38
+ .command('launch')
39
+ .description('Launch application from config and wait for CDP readiness')
40
+ .action(async () => {
41
+ const config = requireConfig();
42
+ await runLaunch(config);
43
+ });
44
+ program
45
+ .command('dom')
46
+ .description('Get DOM accessibility tree')
47
+ .option('-w, --window <id>', 'Target window ID or name')
48
+ .option('-f, --filter <text>', 'Filter by text/name')
49
+ .option('-d, --depth <n>', 'Max tree depth', parseDepth)
50
+ .action(async (options) => {
51
+ const config = requireConfig();
52
+ await runDom(config, options);
53
+ });
54
+ program
55
+ .command('click [ref]')
56
+ .description('Click DOM element by ref, filter, or position')
57
+ .option('-f, --filter <text>', 'Find element by text and click')
58
+ .option('-p, --pos <x,y>', 'Click at coordinates (for canvas)')
59
+ .option('-w, --window <id>', 'Target window ID or name')
60
+ .action(async (ref, options) => {
61
+ const config = requireConfig();
62
+ await runClick(config, ref, options);
63
+ });
64
+ program
65
+ .command('fill <refOrValue> [value]')
66
+ .description('Type text into input by ref or filter')
67
+ .option('-f, --filter <text>', 'Find input by label/text and fill')
68
+ .option('-w, --window <id>', 'Target window ID or name')
69
+ .action(async (refOrValue, value, options) => {
70
+ const config = requireConfig();
71
+ await runFill(config, refOrValue, value, options);
72
+ });
73
+ program
74
+ .command('wait')
75
+ .description('Wait for element to appear in DOM')
76
+ .requiredOption('-f, --filter <text>', 'Text to wait for')
77
+ .option('-t, --timeout <seconds>', 'Max wait time (default: 10)')
78
+ .option('-w, --window <id>', 'Target window ID or name')
79
+ .action(async (options) => {
80
+ const config = requireConfig();
81
+ await runWait(config, options);
82
+ });
83
+ program
84
+ .command('screenshot')
85
+ .description('Capture screenshot and save to temp dir')
86
+ .option('-w, --window <id>', 'Target window ID or name')
87
+ .action(async (options) => {
88
+ const config = requireConfig();
89
+ await runScreenshot(config, options);
90
+ });
91
+ program
92
+ .command('scene')
93
+ .description('Get PixiJS scene graph')
94
+ .option('-w, --window <id>', 'Target window ID or name')
95
+ .option('-f, --filter <text>', 'Filter by name')
96
+ .option('-d, --depth <n>', 'Max tree depth', parseDepth)
97
+ .option('-v, --verbose', 'Show extended properties')
98
+ .option('--diff', 'Show only changes since last call')
99
+ .action(async (options) => {
100
+ const config = requireConfig();
101
+ await runScene(config, options);
102
+ });
103
+ program
104
+ .command('snap')
105
+ .description('Combined DOM + scene graph snapshot')
106
+ .option('-w, --window <id>', 'Target window ID or name')
107
+ .option('-f, --filter <text>', 'Filter by text/name')
108
+ .option('-d, --depth <n>', 'Max tree depth', parseDepth)
109
+ .action(async (options) => {
110
+ const config = requireConfig();
111
+ await runSnap(config, options);
112
+ });
113
+ program
114
+ .command('stop')
115
+ .description('Stop the lazy server')
116
+ .action(async () => {
117
+ await runStop();
118
+ });
119
+ function requireConfig() {
120
+ const config = readConfig(process.cwd());
121
+ if (!config) {
122
+ console.error('No agent-view.config.json found. Run `agent-view init` first.');
123
+ process.exit(1);
124
+ }
125
+ return config;
126
+ }
127
+ function parseDepth(value) {
128
+ const n = parseInt(value, 10);
129
+ if (isNaN(n)) {
130
+ console.error(`Invalid depth value: "${value}"`);
131
+ process.exit(1);
132
+ }
133
+ return n;
134
+ }
135
+ program.parse();
136
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AgentViewConfig } from './types.js';
2
+ export declare function readConfig(cwd: string): AgentViewConfig | null;
3
+ export declare function generateConfig(cwd: string): AgentViewConfig;
4
+ export declare function writeConfig(cwd: string, config: AgentViewConfig): void;
5
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAKjD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAS9D;AAyBD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAuB3D;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAGtE"}
@@ -0,0 +1,84 @@
1
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { RuntimeType, WebGLEngine } from '../types.js';
4
+ const CONFIG_FILENAME = 'agent-view.config.json';
5
+ export function readConfig(cwd) {
6
+ const configPath = join(cwd, CONFIG_FILENAME);
7
+ if (!existsSync(configPath))
8
+ return null;
9
+ const raw = readFileSync(configPath, 'utf-8');
10
+ const parsed = JSON.parse(raw);
11
+ if (!isValidConfig(parsed)) {
12
+ throw new Error(`Invalid agent-view.config.json: must have runtime, port (number), and launch (string)`);
13
+ }
14
+ return parsed;
15
+ }
16
+ function isValidConfig(obj) {
17
+ if (!obj || typeof obj !== 'object')
18
+ return false;
19
+ const c = obj;
20
+ const validRuntimes = Object.values(RuntimeType);
21
+ const validEngines = Object.values(WebGLEngine);
22
+ if (typeof c.runtime !== 'string' ||
23
+ !validRuntimes.includes(c.runtime) ||
24
+ typeof c.port !== 'number' ||
25
+ c.port < 1 || c.port > 65535 ||
26
+ typeof c.launch !== 'string')
27
+ return false;
28
+ // Validate optional webgl.engine
29
+ if (c.webgl !== undefined) {
30
+ if (!c.webgl || typeof c.webgl !== 'object')
31
+ return false;
32
+ const w = c.webgl;
33
+ if (typeof w.engine !== 'string' || !validEngines.includes(w.engine))
34
+ return false;
35
+ }
36
+ return true;
37
+ }
38
+ export function generateConfig(cwd) {
39
+ const pkgPath = join(cwd, 'package.json');
40
+ if (!existsSync(pkgPath)) {
41
+ throw new Error(`package.json not found in ${cwd}`);
42
+ }
43
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
44
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
45
+ const runtime = detectRuntime(allDeps);
46
+ const webglEngine = detectWebGL(allDeps);
47
+ const launch = detectLaunchCommand(cwd, pkg.scripts);
48
+ const config = {
49
+ runtime,
50
+ port: 9222,
51
+ launch,
52
+ };
53
+ if (webglEngine) {
54
+ config.webgl = { engine: webglEngine };
55
+ }
56
+ return config;
57
+ }
58
+ export function writeConfig(cwd, config) {
59
+ const configPath = join(cwd, CONFIG_FILENAME);
60
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
61
+ }
62
+ function detectRuntime(deps) {
63
+ if (deps['electron'] || deps['electron-vite'])
64
+ return RuntimeType.Electron;
65
+ if (deps['@tauri-apps/api'] || deps['@tauri-apps/cli'])
66
+ return RuntimeType.Tauri;
67
+ return RuntimeType.Browser;
68
+ }
69
+ function detectWebGL(deps) {
70
+ if (deps['pixi.js'] || deps['@pixi/app'])
71
+ return WebGLEngine.Pixi;
72
+ return undefined;
73
+ }
74
+ function detectLaunchCommand(cwd, scripts) {
75
+ const pm = existsSync(join(cwd, 'pnpm-lock.yaml')) ? 'pnpm' : 'npm';
76
+ if (!scripts)
77
+ return `${pm} run dev`;
78
+ if (scripts['dev'])
79
+ return `${pm} run dev`;
80
+ if (scripts['start'])
81
+ return `${pm} start`;
82
+ return `${pm} run dev`;
83
+ }
84
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { RuntimeType, WebGLEngine } from '../types.js';
2
+ export type AgentViewConfig = {
3
+ runtime: RuntimeType;
4
+ port: number;
5
+ launch: string;
6
+ webgl?: {
7
+ engine: WebGLEngine;
8
+ };
9
+ verify?: Record<string, {
10
+ steps: string[];
11
+ }>;
12
+ };
13
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE3D,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,WAAW,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,WAAW,CAAA;KACpB,CAAA;IACD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;CAC7C,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export type { RuntimeType, WebGLEngine, WindowInfo, RuntimeInfo } from './types.js';
2
+ export type { AgentViewConfig } from './config/types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACnF,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import type { AXNode } from '../cdp/types.js';
2
+ export type RefEntry = {
3
+ ref: number;
4
+ backendDOMNodeId: number;
5
+ };
6
+ export type DOMSnapshotOptions = {
7
+ filter?: string;
8
+ depth?: number;
9
+ startRef?: number;
10
+ };
11
+ export type DOMSnapshotResult = {
12
+ text: string;
13
+ refs: RefEntry[];
14
+ nextRef: number;
15
+ };
16
+ export declare function formatAccessibilityTree(nodes: AXNode[], options?: DOMSnapshotOptions): DOMSnapshotResult;
17
+ //# sourceMappingURL=dom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/inspectors/dom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,gBAAgB,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CAgInB"}
@@ -0,0 +1,131 @@
1
+ export function formatAccessibilityTree(nodes, options = {}) {
2
+ const { filter, depth: maxDepth } = options;
3
+ const refs = [];
4
+ let nextRef = options.startRef ?? 1;
5
+ const lines = [];
6
+ const nodeMap = new Map();
7
+ for (const node of nodes) {
8
+ nodeMap.set(node.nodeId, node);
9
+ }
10
+ const rootNodeId = nodes[0]?.nodeId;
11
+ if (!rootNodeId)
12
+ return { text: '(empty)', refs: [], nextRef };
13
+ const ALWAYS_SKIP_ROLES = new Set(['InlineTextBox']);
14
+ const SKIP_WHEN_EMPTY_ROLES = new Set(['none', 'generic', 'StaticText']);
15
+ // WAI-ARIA-like fallback: when a node has no accessible name,
16
+ // walk its children to find the first non-empty name, description, or title.
17
+ // This handles cases like v-list-item with title on a child v-icon.
18
+ function resolveNameFromChildren(node, depthLimit = 5) {
19
+ if (depthLimit <= 0 || !node.childIds)
20
+ return '';
21
+ for (const childId of node.childIds) {
22
+ const child = nodeMap.get(childId);
23
+ if (!child)
24
+ continue;
25
+ // Check child's own name
26
+ if (child.name?.value)
27
+ return child.name.value;
28
+ // Check description/title in AX properties
29
+ const desc = child.properties?.find(p => p.name === 'description');
30
+ if (desc?.value?.value && typeof desc.value.value === 'string')
31
+ return desc.value.value;
32
+ // Recurse into grandchildren
33
+ const deeper = resolveNameFromChildren(child, depthLimit - 1);
34
+ if (deeper)
35
+ return deeper;
36
+ }
37
+ return '';
38
+ }
39
+ // Collect all descendant text for heuristic filter matching.
40
+ // Searches name and description of all descendants, not just current node.
41
+ function getDescendantText(node, depthLimit = 10) {
42
+ const parts = [];
43
+ function collect(n, depth) {
44
+ if (depth > depthLimit || !n.childIds)
45
+ return;
46
+ for (const childId of n.childIds) {
47
+ const child = nodeMap.get(childId);
48
+ if (!child)
49
+ continue;
50
+ if (child.name?.value)
51
+ parts.push(child.name.value);
52
+ const desc = child.properties?.find(p => p.name === 'description');
53
+ if (desc?.value?.value && typeof desc.value.value === 'string')
54
+ parts.push(desc.value.value);
55
+ collect(child, depth + 1);
56
+ }
57
+ }
58
+ collect(node, 0);
59
+ return parts.join(' ').toLowerCase();
60
+ }
61
+ function hasMatchingDescendant(node, lowerFilter) {
62
+ if (!node.childIds)
63
+ return false;
64
+ for (const childId of node.childIds) {
65
+ const child = nodeMap.get(childId);
66
+ if (!child)
67
+ continue;
68
+ const childRole = child.role?.value ?? '';
69
+ if (ALWAYS_SKIP_ROLES.has(childRole))
70
+ continue;
71
+ const childName = child.name?.value?.toLowerCase() ?? '';
72
+ if (childName.includes(lowerFilter) || childRole.toLowerCase().includes(lowerFilter))
73
+ return true;
74
+ if (hasMatchingDescendant(child, lowerFilter))
75
+ return true;
76
+ }
77
+ return false;
78
+ }
79
+ const HARD_MAX_DEPTH = 100;
80
+ function walk(nodeId, depth, indent) {
81
+ if (indent > HARD_MAX_DEPTH)
82
+ return;
83
+ if (maxDepth !== undefined && indent > maxDepth)
84
+ return;
85
+ const node = nodeMap.get(nodeId);
86
+ if (!node)
87
+ return;
88
+ const role = node.role?.value ?? '';
89
+ const ownName = node.name?.value ?? '';
90
+ // Fallback: resolve name from children when node has no accessible name
91
+ const fallbackName = !ownName ? resolveNameFromChildren(node) : '';
92
+ const name = ownName || fallbackName;
93
+ if (ALWAYS_SKIP_ROLES.has(role))
94
+ return;
95
+ const skip = SKIP_WHEN_EMPTY_ROLES.has(role) && !name;
96
+ if (!skip) {
97
+ if (filter) {
98
+ const lowerFilter = filter.toLowerCase();
99
+ const matchesName = name.toLowerCase().includes(lowerFilter);
100
+ const matchesRole = role.toLowerCase().includes(lowerFilter);
101
+ // Heuristic: also search descendant names/descriptions
102
+ const matchesDescendants = !matchesName && !matchesRole
103
+ ? getDescendantText(node, 10).includes(lowerFilter)
104
+ : false;
105
+ if (!matchesName && !matchesRole && !matchesDescendants && !hasMatchingDescendant(node, lowerFilter)) {
106
+ return;
107
+ }
108
+ }
109
+ const ref = nextRef++;
110
+ if (node.backendDOMNodeId) {
111
+ refs.push({ ref, backendDOMNodeId: node.backendDOMNodeId });
112
+ }
113
+ const padding = ' '.repeat(indent);
114
+ const isFallback = !ownName && fallbackName;
115
+ const nameStr = name ? ` "${name}"${isFallback ? ' [fallback]' : ''}` : '';
116
+ lines.push(`${padding}${role}${nameStr} [ref=${ref}]`);
117
+ }
118
+ if (node.childIds) {
119
+ for (const childId of node.childIds) {
120
+ walk(childId, depth + 1, skip ? indent : indent + 1);
121
+ }
122
+ }
123
+ }
124
+ walk(rootNodeId, 0, 0);
125
+ return {
126
+ text: lines.join('\n') || '(no matching elements)',
127
+ refs,
128
+ nextRef,
129
+ };
130
+ }
131
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/inspectors/dom.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { SceneNode, SceneOptions } from './types.js';
2
+ export declare function formatNode(node: SceneNode, depth: number, lines: string[], options: SceneOptions): void;
3
+ export declare function diffScenes(prev: SceneNode, curr: SceneNode): string;
4
+ export declare function hasMatch(node: SceneNode, filter: string): boolean;
5
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../../src/inspectors/scene/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAIzD,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAqCvG;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAInE;AA0CD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAMjE"}
@@ -0,0 +1,91 @@
1
+ const HARD_MAX_DEPTH = 100;
2
+ export function formatNode(node, depth, lines, options) {
3
+ if (depth > HARD_MAX_DEPTH)
4
+ return;
5
+ if (options.depth !== undefined && depth > options.depth)
6
+ return;
7
+ const matchesFilter = !options.filter ||
8
+ node.name.toLowerCase().includes(options.filter.toLowerCase()) ||
9
+ node.type.toLowerCase().includes(options.filter.toLowerCase());
10
+ const hasMatchingChildren = options.filter
11
+ ? (node.children || []).some(c => hasMatch(c, options.filter))
12
+ : false;
13
+ if (matchesFilter || hasMatchingChildren) {
14
+ const indent = ' '.repeat(depth);
15
+ const vis = node.visible ? '' : ' [hidden]';
16
+ const nameStr = node.name ? ` "${node.name}"` : '';
17
+ let line = `${indent}${node.type}${nameStr} (${node.x},${node.y})${vis}`;
18
+ if (node.tint !== '0xffffff' && node.tint !== '#ffffff') {
19
+ line += ` tint=${node.tint}`;
20
+ }
21
+ if (options.verbose) {
22
+ const extras = [];
23
+ if (node.alpha !== undefined && node.alpha !== 1)
24
+ extras.push(`alpha=${node.alpha}`);
25
+ if (node.scaleX !== 1 || node.scaleY !== 1)
26
+ extras.push(`scale=(${node.scaleX},${node.scaleY})`);
27
+ if (node.rotation !== 0)
28
+ extras.push(`rot=${node.rotation}°`);
29
+ if (node.width || node.height)
30
+ extras.push(`size=${node.width}x${node.height}`);
31
+ if (extras.length > 0)
32
+ line += ` ${extras.join(' ')}`;
33
+ }
34
+ lines.push(line);
35
+ }
36
+ for (const child of node.children || []) {
37
+ formatNode(child, depth + 1, lines, options);
38
+ }
39
+ }
40
+ export function diffScenes(prev, curr) {
41
+ const changes = [];
42
+ diffNode(prev, curr, 0, changes);
43
+ return changes.length > 0 ? changes.join('\n') : 'No changes';
44
+ }
45
+ function diffNode(prev, curr, depth, changes) {
46
+ if (depth > HARD_MAX_DEPTH)
47
+ return;
48
+ const indent = ' '.repeat(depth);
49
+ const nameStr = curr.name ? ` "${curr.name}"` : '';
50
+ const diffs = [];
51
+ if (prev.x !== curr.x || prev.y !== curr.y)
52
+ diffs.push(`pos: (${prev.x},${prev.y})→(${curr.x},${curr.y})`);
53
+ if (prev.visible !== curr.visible)
54
+ diffs.push(`visible: ${prev.visible}→${curr.visible}`);
55
+ if (prev.tint !== curr.tint)
56
+ diffs.push(`tint: ${prev.tint}→${curr.tint}`);
57
+ if (prev.alpha !== curr.alpha)
58
+ diffs.push(`alpha: ${prev.alpha}→${curr.alpha}`);
59
+ if (diffs.length > 0) {
60
+ changes.push(`${indent}~ ${curr.type}${nameStr}: ${diffs.join(', ')}`);
61
+ }
62
+ const prevChildren = prev.children || [];
63
+ const currChildren = curr.children || [];
64
+ const prevByKey = new Map(prevChildren.map((c, i) => [childKey(c, i), c]));
65
+ const currByKey = new Map(currChildren.map((c, i) => [childKey(c, i), c]));
66
+ for (const [key, child] of currByKey) {
67
+ const prevChild = prevByKey.get(key);
68
+ if (!prevChild) {
69
+ changes.push(`${indent} + ${child.type}${child.name ? ` "${child.name}"` : ''} (${child.x},${child.y})`);
70
+ }
71
+ else {
72
+ diffNode(prevChild, child, depth + 1, changes);
73
+ }
74
+ }
75
+ for (const [key, child] of prevByKey) {
76
+ if (!currByKey.has(key)) {
77
+ changes.push(`${indent} - ${child.type}${child.name ? ` "${child.name}"` : ''} (${child.x},${child.y})`);
78
+ }
79
+ }
80
+ }
81
+ function childKey(node, index) {
82
+ return node.name ? `${node.type}:${node.name}` : `${node.type}:${index}`;
83
+ }
84
+ export function hasMatch(node, filter) {
85
+ const lower = filter.toLowerCase();
86
+ if (node.name.toLowerCase().includes(lower) || node.type.toLowerCase().includes(lower)) {
87
+ return true;
88
+ }
89
+ return (node.children || []).some(c => hasMatch(c, lower));
90
+ }
91
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../../src/inspectors/scene/formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CDPConnection } from '../../cdp/types.js';
2
+ import type { WebGLEngine } from '../../types.js';
3
+ import type { SceneOptions, SceneNode } from './types.js';
4
+ export declare function getSceneGraph(conn: CDPConnection, engine: WebGLEngine | undefined, options?: SceneOptions): Promise<string>;
5
+ export declare function getRawScene(conn: CDPConnection, engine: WebGLEngine | undefined): Promise<SceneNode | null>;
6
+ export { diffScenes } from './formatter.js';
7
+ export type { SceneNode, SceneOptions } from './types.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/inspectors/scene/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEzD,wBAAsB,aAAa,CACjC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,MAAM,CAAC,CAejB;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,WAAW,GAAG,SAAS,GAC9B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAI3B;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,26 @@
1
+ import { getExtractor } from './registry.js';
2
+ import { formatNode } from './formatter.js';
3
+ export async function getSceneGraph(conn, engine, options = {}) {
4
+ if (!engine) {
5
+ return 'No WebGL engine configured. Add "webgl": { "engine": "pixi" } to agent-view.config.json';
6
+ }
7
+ const extractor = getExtractor(engine);
8
+ const tree = await extractor.extract(conn);
9
+ if (!tree) {
10
+ return `No ${engine} scene found`;
11
+ }
12
+ const lines = [];
13
+ formatNode(tree, 0, lines, options);
14
+ if (lines.length === 0 && options.filter) {
15
+ return `No scene objects matching "${options.filter}"`;
16
+ }
17
+ return lines.join('\n');
18
+ }
19
+ export async function getRawScene(conn, engine) {
20
+ if (!engine)
21
+ return null;
22
+ const extractor = getExtractor(engine);
23
+ return extractor.extract(conn);
24
+ }
25
+ export { diffScenes } from './formatter.js';
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/inspectors/scene/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAc,MAAM,gBAAgB,CAAA;AAKvD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAmB,EACnB,MAA+B,EAC/B,UAAwB,EAAE;IAE1B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,yFAAyF,CAAA;IAClG,CAAC;IACD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,MAAM,MAAM,cAAc,CAAA;IACnC,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;IACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACzC,OAAO,8BAA8B,OAAO,CAAC,MAAM,GAAG,CAAA;IACxD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAmB,EACnB,MAA+B;IAE/B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACtC,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { SceneExtractor } from './types.js';
2
+ export declare const pixiExtractor: SceneExtractor;
3
+ //# sourceMappingURL=pixi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixi.d.ts","sourceRoot":"","sources":["../../../src/inspectors/scene/pixi.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,YAAY,CAAA;AA8C3D,eAAO,MAAM,aAAa,EAAE,cAM3B,CAAA"}