@petukhovart/agent-view 0.1.0 → 0.3.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 (101) hide show
  1. package/.claude-plugin/plugin.json +12 -1
  2. package/README.md +101 -2
  3. package/dist/adapters/browser.d.ts.map +1 -1
  4. package/dist/adapters/browser.js +11 -11
  5. package/dist/adapters/browser.js.map +1 -1
  6. package/dist/adapters/electron.d.ts.map +1 -1
  7. package/dist/adapters/electron.js +11 -11
  8. package/dist/adapters/electron.js.map +1 -1
  9. package/dist/adapters/tauri.d.ts.map +1 -1
  10. package/dist/adapters/tauri.js +11 -11
  11. package/dist/adapters/tauri.js.map +1 -1
  12. package/dist/adapters/types.d.ts +5 -2
  13. package/dist/adapters/types.d.ts.map +1 -1
  14. package/dist/cdp/_tests/console-stream.d.ts +35 -0
  15. package/dist/cdp/_tests/console-stream.d.ts.map +1 -0
  16. package/dist/cdp/_tests/console-stream.js +103 -0
  17. package/dist/cdp/_tests/console-stream.js.map +1 -0
  18. package/dist/cdp/ax-cache.d.ts +9 -0
  19. package/dist/cdp/ax-cache.d.ts.map +1 -0
  20. package/dist/cdp/ax-cache.js +24 -0
  21. package/dist/cdp/ax-cache.js.map +1 -0
  22. package/dist/cdp/console-stream.d.ts +35 -0
  23. package/dist/cdp/console-stream.d.ts.map +1 -0
  24. package/dist/cdp/console-stream.js +103 -0
  25. package/dist/cdp/console-stream.js.map +1 -0
  26. package/dist/cdp/transport.d.ts +5 -2
  27. package/dist/cdp/transport.d.ts.map +1 -1
  28. package/dist/cdp/transport.js +236 -24
  29. package/dist/cdp/transport.js.map +1 -1
  30. package/dist/cdp/types.d.ts +66 -8
  31. package/dist/cdp/types.d.ts.map +1 -1
  32. package/dist/cdp/types.js +29 -1
  33. package/dist/cdp/types.js.map +1 -1
  34. package/dist/cli/commands/console.d.ts +11 -0
  35. package/dist/cli/commands/console.d.ts.map +1 -0
  36. package/dist/cli/commands/console.js +31 -0
  37. package/dist/cli/commands/console.js.map +1 -0
  38. package/dist/cli/commands/dom.d.ts +1 -0
  39. package/dist/cli/commands/dom.d.ts.map +1 -1
  40. package/dist/cli/commands/dom.js +1 -0
  41. package/dist/cli/commands/dom.js.map +1 -1
  42. package/dist/cli/commands/eval.d.ts +9 -0
  43. package/dist/cli/commands/eval.d.ts.map +1 -0
  44. package/dist/cli/commands/eval.js +30 -0
  45. package/dist/cli/commands/eval.js.map +1 -0
  46. package/dist/cli/commands/screenshot.d.ts +1 -0
  47. package/dist/cli/commands/screenshot.d.ts.map +1 -1
  48. package/dist/cli/commands/screenshot.js +2 -0
  49. package/dist/cli/commands/screenshot.js.map +1 -1
  50. package/dist/cli/commands/targets.d.ts +7 -0
  51. package/dist/cli/commands/targets.d.ts.map +1 -0
  52. package/dist/cli/commands/targets.js +30 -0
  53. package/dist/cli/commands/targets.js.map +1 -0
  54. package/dist/cli/index.js +39 -1
  55. package/dist/cli/index.js.map +1 -1
  56. package/dist/config/manager.d.ts.map +1 -1
  57. package/dist/config/manager.js +10 -0
  58. package/dist/config/manager.js.map +1 -1
  59. package/dist/config/types.d.ts +11 -0
  60. package/dist/config/types.d.ts.map +1 -1
  61. package/dist/inspectors/dom/index.d.ts +17 -0
  62. package/dist/inspectors/dom/index.d.ts.map +1 -0
  63. package/dist/inspectors/dom/index.js +131 -0
  64. package/dist/inspectors/dom/index.js.map +1 -0
  65. package/dist/inspectors/scene/adapters/pixi/adapter.d.ts +3 -0
  66. package/dist/inspectors/scene/adapters/pixi/adapter.d.ts.map +1 -0
  67. package/dist/inspectors/scene/adapters/pixi/adapter.js +51 -0
  68. package/dist/inspectors/scene/adapters/pixi/adapter.js.map +1 -0
  69. package/dist/inspectors/scene/adapters/pixi/index.d.ts +2 -0
  70. package/dist/inspectors/scene/adapters/pixi/index.d.ts.map +1 -0
  71. package/dist/inspectors/scene/adapters/pixi/index.js +2 -0
  72. package/dist/inspectors/scene/adapters/pixi/index.js.map +1 -0
  73. package/dist/inspectors/scene/adapters/pixi/injection.d.ts +39 -0
  74. package/dist/inspectors/scene/adapters/pixi/injection.d.ts.map +1 -0
  75. package/dist/inspectors/scene/adapters/pixi/injection.js +41 -0
  76. package/dist/inspectors/scene/adapters/pixi/injection.js.map +1 -0
  77. package/dist/inspectors/scene/formatter.d.ts +0 -1
  78. package/dist/inspectors/scene/formatter.d.ts.map +1 -1
  79. package/dist/inspectors/scene/formatter.js +52 -43
  80. package/dist/inspectors/scene/formatter.js.map +1 -1
  81. package/dist/inspectors/scene/index.d.ts +4 -4
  82. package/dist/inspectors/scene/index.d.ts.map +1 -1
  83. package/dist/inspectors/scene/index.js +8 -5
  84. package/dist/inspectors/scene/index.js.map +1 -1
  85. package/dist/inspectors/scene/pixi.js.map +1 -1
  86. package/dist/inspectors/scene/registry.d.ts +2 -2
  87. package/dist/inspectors/scene/registry.d.ts.map +1 -1
  88. package/dist/inspectors/scene/registry.js +8 -8
  89. package/dist/inspectors/scene/registry.js.map +1 -1
  90. package/dist/inspectors/scene/types.d.ts +5 -10
  91. package/dist/inspectors/scene/types.d.ts.map +1 -1
  92. package/dist/server/server.d.ts +23 -1
  93. package/dist/server/server.d.ts.map +1 -1
  94. package/dist/server/server.js +384 -62
  95. package/dist/server/server.js.map +1 -1
  96. package/dist/types.d.ts +2 -1
  97. package/dist/types.d.ts.map +1 -1
  98. package/dist/types.js +1 -0
  99. package/dist/types.js.map +1 -1
  100. package/package.json +10 -9
  101. package/skills/verify/SKILL.md +99 -15
@@ -1,10 +1,21 @@
1
1
  {
2
2
  "name": "agent-view",
3
- "description": "Multi-platform visual verification CLI for Frontend apps (Electron/Tauri/Browser) via Chrome DevTools Protocol. Inspect DOM, interact with UI, capture screenshots, WebGL libraries support. Use when verifying UI changes, checking visual regressions, testing user interactions, or when any workflow phase needs to inspect the running application.",
3
+ "description": "Visual verification CLI for desktop apps (Electron/Tauri/Browser) via Chrome DevTools Protocol. Inspect DOM, interact with UI, capture screenshots, and read WebGL scene graphs.",
4
4
  "version": "0.1.0",
5
+ "keywords": [
6
+ "cdp",
7
+ "electron",
8
+ "tauri",
9
+ "desktop",
10
+ "testing",
11
+ "accessibility",
12
+ "screenshot",
13
+ "automation"
14
+ ],
5
15
  "author": {
6
16
  "name": "PetukhovArt"
7
17
  },
8
18
  "homepage": "https://github.com/PetukhovArt/agent-view",
19
+ "repository": "https://github.com/PetukhovArt/agent-view",
9
20
  "license": "MIT"
10
21
  }
package/README.md CHANGED
@@ -26,6 +26,43 @@ Code → Launch → See → Verify → Fix → See again
26
26
 
27
27
  The agent writes code, then immediately checks what the user would see. If something's wrong, it fixes and re-checks — no human needed. This catches problems that builds and tests miss: CSS regressions, broken layouts, missing error messages, silent IPC failures.
28
28
 
29
+ ## v0.3.0 — DevTools access (eval, console, workers)
30
+
31
+ Beyond DOM and screenshots, v0.3.0 adds direct access to JS state and console — including SharedWorker / ServiceWorker. Useful when «what's rendered» isn't enough and you need to check what's actually in the store, in a worker, or in the console.
32
+
33
+ - `eval <expr>` — read state directly (`store.user.role`, computed values, async getters). Gated by `"allowEval": true` in config.
34
+ - `eval --target <worker>` — same, but inside a SharedWorker / ServiceWorker / dedicated Worker.
35
+ - `console` — capture `console.log/warn/error` per page or per worker. `--clear` for baselines, `--level` to filter.
36
+ - `targets` — list every connectable CDP target.
37
+
38
+ See [Commands](#commands) for flags. Full notes in [CHANGELOG](CHANGELOG.md).
39
+
40
+ ## Performance
41
+
42
+ AI agents run dozens of `dom → click → dom` verification cycles per session. Every millisecond compounds. agent-view v0.2.0 is built specifically for this pattern.
43
+
44
+ ### Benchmark results (Electron app, ~200 AX nodes)
45
+
46
+ | Scenario | v0.1.0 | v0.2.0 | vs Playwright* |
47
+ |---|---|---|---|
48
+ | `dom` cold fetch | 10ms | 2ms | ~30–80ms |
49
+ | `dom` warm (cache hit) | 10ms | 1ms | ~30–80ms |
50
+ | Full cycle `dom → click → dom` | 27ms | 17ms | ~75ms |
51
+ | `click --filter "Save"` | 12ms | 17ms† | ~15–30ms |
52
+
53
+ \* *Playwright estimate based on architectural analysis — no published Electron-specific benchmarks exist*
54
+ † *queryAXTree has CDP overhead that exceeds the benefit on small DOMs; improves on large production DOMs (1000+ nodes)*
55
+
56
+ ### What makes it fast
57
+
58
+ **AX tree cache (300ms TTL).** The single biggest win. When an agent calls `dom`, then immediately `click --filter`, the second fetch hits the in-process cache instead of making a CDP round-trip. Cache is invalidated aggressively — busted on every `click`, `fill`, or page navigation.
59
+
60
+ **Parallel CDP calls in click.** Previously 5 serial round-trips; now 3 parallel batches. `DOM.resolveNode` and `DOM.getBoxModel` run concurrently, then mouse events fire back-to-back without waiting for each response (the same approach Playwright uses internally).
61
+
62
+ **`Accessibility.queryAXTree` for targeted lookups.** Plain string filters (`click --filter "Save"`) and `role:name` filters (`click --filter "button:Save"`) query the browser directly instead of fetching the full tree. Falls back gracefully on older Electron versions.
63
+
64
+ **Raw CDP, no relay.** No Playwright client-server relay between your agent and the browser. The server process holds the CDP WebSocket connection and reuses it across commands.
65
+
29
66
  ## Enabling CDP
30
67
 
31
68
  ### Recommended: in code (reliable, works with any build tool)
@@ -71,10 +108,24 @@ If you see a JSON response with browser info — you're good.
71
108
 
72
109
  ## Install
73
110
 
111
+ ### As CLI tool
112
+
74
113
  ```bash
75
- npm install -g agent-view
114
+ npm install -g @petukhovart/agent-view
115
+ ```
116
+
117
+ ### As Claude Code plugin
118
+
119
+ ```bash
120
+ # Add marketplace (once)
121
+ /plugin marketplace add PetukhovArt/agent-view
122
+
123
+ # Install plugin
124
+ /plugin install agent-view@agent-view
76
125
  ```
77
126
 
127
+ This gives Claude the `/agent-view:verify` skill — it knows when and how to use agent-view for visual verification during development workflows.
128
+
78
129
  ## Quick start
79
130
 
80
131
  ```bash
@@ -126,6 +177,9 @@ Running `agent-view init` in your project root generates `agent-view.config.json
126
177
  | `port` | yes | CDP debugging port |
127
178
  | `launch` | no | Command to start the app |
128
179
  | `webgl.engine` | no | `"pixi"` (scene extractor architecture supports adding more engines) |
180
+ | `allowEval` | no | `true` to enable `agent-view eval`. Off by default — opt-in for arbitrary JS execution |
181
+ | `consoleBufferSize` | no | Per-target console ring capacity. Default `500` |
182
+ | `consoleTargets` | no | Target types `agent-view console` auto-attaches to. Default `["page", "shared_worker", "service_worker"]` |
129
183
 
130
184
  ## Commands
131
185
 
@@ -150,8 +204,11 @@ agent-view dom
150
204
  agent-view dom --filter "Submit" # Filter by text/role
151
205
  agent-view dom --depth 3 # Limit tree depth
152
206
  agent-view dom --window "Settings" # Target specific window
207
+ agent-view dom --text # Fall back to DOM textContent search when AX returns no match
153
208
  ```
154
209
 
210
+ When `--filter` is set, depth defaults to unlimited so deep matches aren't truncated.
211
+
155
212
  ### `click`
156
213
 
157
214
  Clicks a DOM element by ref ID or coordinates.
@@ -171,13 +228,17 @@ agent-view fill 3 "hello@example.com"
171
228
 
172
229
  ### `screenshot`
173
230
 
174
- Captures a PNG screenshot, saves to temp dir, prints the file path.
231
+ Captures a screenshot, saves to temp dir, prints the file path. PNG by default; JPEG when `--scale` is set.
175
232
 
176
233
  ```bash
177
234
  agent-view screenshot
178
235
  agent-view screenshot --window "Settings"
236
+ agent-view screenshot --scale 0.5 # Half-res JPEG (~3× fewer vision tokens)
237
+ agent-view screenshot --scale 0.25 # Quarter-res JPEG (~12× fewer, 1 tile)
179
238
  ```
180
239
 
240
+ `--scale` accepts a factor in `(0, 1]`. CDP-side clip + JPEG encode — recommended for agent loops where vision tokens dominate cost.
241
+
181
242
  ### `scene`
182
243
 
183
244
  Reads the WebGL scene graph for canvas-based apps. Currently supports PixiJS via `window.__PIXI_DEVTOOLS__`.
@@ -210,6 +271,44 @@ agent-view wait --filter "Dashboard" --timeout 30 # Custom timeout in seconds
210
271
 
211
272
  Starts the app using the `launch` command from config. Polls CDP until ready (60s timeout). Idempotent — skips if already running.
212
273
 
274
+ ### `targets`
275
+
276
+ Lists every CDP target — pages, iframes, shared/service/dedicated workers. Use this when you need access to non-page targets (e.g. an Electron app with a `SharedWorker`).
277
+
278
+ ```bash
279
+ agent-view targets # all supported types
280
+ agent-view targets --type shared_worker,service_worker # filter
281
+ agent-view targets --json # machine-readable
282
+ ```
283
+
284
+ ### `eval`
285
+
286
+ Runs `Runtime.evaluate` in any connectable target. **Requires `"allowEval": true` in `agent-view.config.json`** — the local socket is shared and this is the project-owner opt-in.
287
+
288
+ ```bash
289
+ agent-view eval "document.title"
290
+ agent-view eval --target IJ56KL "self.constructor.name" # by id (or title/url substring)
291
+ agent-view eval --window "Monitor 1" --await "fetch('/api/health').then(r => r.status)"
292
+ agent-view eval --json "({ buttons: document.querySelectorAll('button').length })"
293
+ ```
294
+
295
+ Output is capped at 64 KB. Thrown exceptions and syntax errors propagate as non-zero exit with the CDP error message.
296
+
297
+ ### `console`
298
+
299
+ Streams or dumps console output (`Runtime.consoleAPICalled` + `Log.entryAdded`) from auto-attached targets. Lazy: first call attaches matching targets, subsequent calls reuse them.
300
+
301
+ ```bash
302
+ agent-view console # buffered messages since attach
303
+ agent-view console --follow --timeout 10 # stream for 10s
304
+ agent-view console --target IJ56KL # restrict to one target
305
+ agent-view console --level error,warn # level filter
306
+ agent-view console --since "2026-04-26T10:00:00Z"
307
+ agent-view console --clear # drop in-memory ring
308
+ ```
309
+
310
+ Default attached target types: `page`, `shared_worker`, `service_worker`. Override with `consoleTargets` in config.
311
+
213
312
  ### `stop`
214
313
 
215
314
  Stops the background lazy server.
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/adapters/browser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAIhD,eAAO,MAAM,cAAc,EAAE,cAkB5B,CAAA"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/adapters/browser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAKhD,eAAO,MAAM,cAAc,EAAE,cAgB5B,CAAA"}
@@ -1,20 +1,20 @@
1
- import { listTargets, connectToTarget } from '../cdp/transport.js';
1
+ import { listSupportedTargets, connectToPage } from '../cdp/transport.js';
2
2
  import { RuntimeType } from '../types.js';
3
+ import { TargetType } from '../cdp/types.js';
3
4
  export const browserAdapter = {
4
5
  runtime: RuntimeType.Browser,
5
6
  async discover(port) {
6
- const targets = await listTargets(port);
7
+ const targets = await listSupportedTargets(port);
7
8
  return targets
8
- .filter(t => t.type === 'page')
9
- .map(t => ({
10
- id: t.id,
11
- title: t.title,
12
- url: t.url,
13
- type: t.type,
14
- }));
9
+ .filter(t => t.type === TargetType.Page)
10
+ .map(t => ({ id: t.id, title: t.title, url: t.url, type: t.type }));
15
11
  },
16
- async connect(port, windowId) {
17
- return connectToTarget(port, windowId);
12
+ async connect(port, windowId, cache) {
13
+ const targets = await listSupportedTargets(port);
14
+ const target = targets.find(t => t.id === windowId);
15
+ if (!target)
16
+ throw new Error(`Target not found: ${windowId}`);
17
+ return connectToPage(port, target, cache);
18
18
  },
19
19
  };
20
20
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/adapters/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAElE,OAAO,EAAE,WAAW,EAAmB,MAAM,aAAa,CAAA;AAG1D,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,OAAO,EAAE,WAAW,CAAC,OAAO;IAE5B,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAA;QACvC,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACT,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC,CAAA;IACP,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,QAAgB;QAC1C,OAAO,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACxC,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/adapters/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEzE,OAAO,EAAE,WAAW,EAAmB,MAAM,aAAa,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAoB,MAAM,iBAAiB,CAAA;AAG9D,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,OAAO,EAAE,WAAW,CAAC,OAAO;IAE5B,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAChD,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC;aACvC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACvE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,QAAgB,EAAE,KAAkB;QAC9D,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;QACnD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAA;QAC7D,OAAO,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAC3C,CAAC;CACF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"electron.d.ts","sourceRoot":"","sources":["../../src/adapters/electron.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAIhD,eAAO,MAAM,eAAe,EAAE,cAkB7B,CAAA"}
1
+ {"version":3,"file":"electron.d.ts","sourceRoot":"","sources":["../../src/adapters/electron.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAKhD,eAAO,MAAM,eAAe,EAAE,cAgB7B,CAAA"}
@@ -1,20 +1,20 @@
1
- import { listTargets, connectToTarget } from '../cdp/transport.js';
1
+ import { listSupportedTargets, connectToPage } from '../cdp/transport.js';
2
2
  import { RuntimeType } from '../types.js';
3
+ import { TargetType } from '../cdp/types.js';
3
4
  export const electronAdapter = {
4
5
  runtime: RuntimeType.Electron,
5
6
  async discover(port) {
6
- const targets = await listTargets(port);
7
+ const targets = await listSupportedTargets(port);
7
8
  return targets
8
- .filter(t => t.type === 'page')
9
- .map(t => ({
10
- id: t.id,
11
- title: t.title,
12
- url: t.url,
13
- type: t.type,
14
- }));
9
+ .filter(t => t.type === TargetType.Page)
10
+ .map(t => ({ id: t.id, title: t.title, url: t.url, type: t.type }));
15
11
  },
16
- async connect(port, windowId) {
17
- return connectToTarget(port, windowId);
12
+ async connect(port, windowId, cache) {
13
+ const targets = await listSupportedTargets(port);
14
+ const target = targets.find(t => t.id === windowId);
15
+ if (!target)
16
+ throw new Error(`Target not found: ${windowId}`);
17
+ return connectToPage(port, target, cache);
18
18
  },
19
19
  };
20
20
  //# sourceMappingURL=electron.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"electron.js","sourceRoot":"","sources":["../../src/adapters/electron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAElE,OAAO,EAAE,WAAW,EAAmB,MAAM,aAAa,CAAA;AAG1D,MAAM,CAAC,MAAM,eAAe,GAAmB;IAC7C,OAAO,EAAE,WAAW,CAAC,QAAQ;IAE7B,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAA;QACvC,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACT,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC,CAAA;IACP,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,QAAgB;QAC1C,OAAO,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACxC,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"electron.js","sourceRoot":"","sources":["../../src/adapters/electron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEzE,OAAO,EAAE,WAAW,EAAmB,MAAM,aAAa,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAoB,MAAM,iBAAiB,CAAA;AAG9D,MAAM,CAAC,MAAM,eAAe,GAAmB;IAC7C,OAAO,EAAE,WAAW,CAAC,QAAQ;IAE7B,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAChD,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC;aACvC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACvE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,QAAgB,EAAE,KAAkB;QAC9D,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;QACnD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAA;QAC7D,OAAO,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAC3C,CAAC;CACF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"tauri.d.ts","sourceRoot":"","sources":["../../src/adapters/tauri.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAWhD,wBAAgB,WAAW,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAIzF;AAED,eAAO,MAAM,YAAY,EAAE,cAkB1B,CAAA"}
1
+ {"version":3,"file":"tauri.d.ts","sourceRoot":"","sources":["../../src/adapters/tauri.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAYhD,wBAAgB,WAAW,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAIzF;AAED,eAAO,MAAM,YAAY,EAAE,cAgB1B,CAAA"}
@@ -1,5 +1,6 @@
1
- import { listTargets, connectToTarget } from '../cdp/transport.js';
1
+ import { listSupportedTargets, connectToPage } from '../cdp/transport.js';
2
2
  import { RuntimeType } from '../types.js';
3
+ import { TargetType } from '../cdp/types.js';
3
4
  /** URLs that Tauri/WebView2 exposes as CDP targets but aren't app windows */
4
5
  const INTERNAL_URL_PATTERNS = [
5
6
  'about:blank',
@@ -7,7 +8,7 @@ const INTERNAL_URL_PATTERNS = [
7
8
  'chrome-extension://',
8
9
  ];
9
10
  export function isAppTarget(target) {
10
- if (target.type !== 'page')
11
+ if (target.type !== TargetType.Page)
11
12
  return false;
12
13
  const url = target.url.toLowerCase();
13
14
  return !INTERNAL_URL_PATTERNS.some(pattern => url.startsWith(pattern));
@@ -15,18 +16,17 @@ export function isAppTarget(target) {
15
16
  export const tauriAdapter = {
16
17
  runtime: RuntimeType.Tauri,
17
18
  async discover(port) {
18
- const targets = await listTargets(port);
19
+ const targets = await listSupportedTargets(port);
19
20
  return targets
20
21
  .filter(isAppTarget)
21
- .map(t => ({
22
- id: t.id,
23
- title: t.title,
24
- url: t.url,
25
- type: t.type,
26
- }));
22
+ .map(t => ({ id: t.id, title: t.title, url: t.url, type: t.type }));
27
23
  },
28
- async connect(port, windowId) {
29
- return connectToTarget(port, windowId);
24
+ async connect(port, windowId, cache) {
25
+ const targets = await listSupportedTargets(port);
26
+ const target = targets.find(t => t.id === windowId);
27
+ if (!target)
28
+ throw new Error(`Target not found: ${windowId}`);
29
+ return connectToPage(port, target, cache);
30
30
  },
31
31
  };
32
32
  //# sourceMappingURL=tauri.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tauri.js","sourceRoot":"","sources":["../../src/adapters/tauri.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAElE,OAAO,EAAE,WAAW,EAAmB,MAAM,aAAa,CAAA;AAG1D,6EAA6E;AAC7E,MAAM,qBAAqB,GAAG;IAC5B,aAAa;IACb,aAAa;IACb,qBAAqB;CACtB,CAAA;AAED,MAAM,UAAU,WAAW,CAAC,MAAoD;IAC9E,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAA;IACxC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAA;IACpC,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,OAAO,EAAE,WAAW,CAAC,KAAK;IAE1B,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAA;QACvC,OAAO,OAAO;aACX,MAAM,CAAC,WAAW,CAAC;aACnB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACT,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC,CAAA;IACP,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,QAAgB;QAC1C,OAAO,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACxC,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"tauri.js","sourceRoot":"","sources":["../../src/adapters/tauri.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEzE,OAAO,EAAE,WAAW,EAAmB,MAAM,aAAa,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAoB,MAAM,iBAAiB,CAAA;AAG9D,6EAA6E;AAC7E,MAAM,qBAAqB,GAAG;IAC5B,aAAa;IACb,aAAa;IACb,qBAAqB;CACtB,CAAA;AAED,MAAM,UAAU,WAAW,CAAC,MAAoD;IAC9E,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IACjD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAA;IACpC,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,OAAO,EAAE,WAAW,CAAC,KAAK;IAE1B,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAChD,OAAO,OAAO;aACX,MAAM,CAAC,WAAW,CAAC;aACnB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACvE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,QAAgB,EAAE,KAAkB;QAC9D,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;QACnD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAA;QAC7D,OAAO,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAC3C,CAAC;CACF,CAAA"}
@@ -1,8 +1,11 @@
1
1
  import type { WindowInfo, RuntimeType } from '../types.js';
2
- import type { CDPConnection } from '../cdp/types.js';
2
+ import type { PageSession } from '../cdp/types.js';
3
+ import type { AxTreeCache } from '../cdp/ax-cache.js';
3
4
  export type RuntimeAdapter = {
4
5
  readonly runtime: RuntimeType;
6
+ /** Discover page-targets only — kept for back-compat. Use `listSupportedTargets` for all targets. */
5
7
  discover(port: number): Promise<WindowInfo[]>;
6
- connect(port: number, windowId: string): Promise<CDPConnection>;
8
+ /** Connect to a page-target. Worker targets go through `connectToRuntime` directly. */
9
+ connect(port: number, windowId: string, cache: AxTreeCache): Promise<PageSession>;
7
10
  };
8
11
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IAC7C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;CAChE,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAC7B,qGAAqG;IACrG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IAC7C,uFAAuF;IACvF,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;CAClF,CAAA"}
@@ -0,0 +1,35 @@
1
+ import type { RuntimeSession, ConsoleMessage, ConsoleLevel, TargetType } from '../types.js';
2
+ export type ConsoleStreamOptions = {
3
+ /** Per-target ring size. Default 500. */
4
+ capacity?: number;
5
+ };
6
+ export type ConsoleFilter = {
7
+ since?: number;
8
+ level?: ReadonlySet<ConsoleLevel>;
9
+ targetId?: string;
10
+ };
11
+ export type StampedConsoleMessage = ConsoleMessage & {
12
+ targetId: string;
13
+ targetType: TargetType;
14
+ };
15
+ /**
16
+ * Multi-target console subscription with per-target ring buffer.
17
+ * Server owns one instance for its lifetime; commands attach/drain.
18
+ */
19
+ export declare class ConsoleStream {
20
+ private readonly capacity;
21
+ private readonly targets;
22
+ private readonly extraSubscribers;
23
+ constructor(opts?: ConsoleStreamOptions);
24
+ get attachedCount(): number;
25
+ /** Idempotent per target id — second attach for same id is a no-op. */
26
+ attach(session: RuntimeSession): void;
27
+ detach(targetId?: string): void;
28
+ clear(targetId?: string): void;
29
+ /** Snapshot of buffered messages, sorted by timestamp (oldest first). */
30
+ drain(filter?: ConsoleFilter): StampedConsoleMessage[];
31
+ /** Subscribe to live messages. Returns disposer. Used by --follow streaming. */
32
+ subscribe(handler: (msg: StampedConsoleMessage) => void): () => void;
33
+ private snapshot;
34
+ }
35
+ //# sourceMappingURL=console-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-stream.d.ts","sourceRoot":"","sources":["../../../src/cdp/_tests/console-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI3F,MAAM,MAAM,oBAAoB,GAAG;IACjC,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,CAAA;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG;IACnD,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAUD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkD;gBAEvE,IAAI,GAAE,oBAAyB;IAI3C,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,uEAAuE;IACvE,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IA6BrC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAY/B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAc9B,yEAAyE;IACzE,KAAK,CAAC,MAAM,GAAE,aAAkB,GAAG,qBAAqB,EAAE;IAe1D,gFAAgF;IAChF,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,IAAI,GAAG,MAAM,IAAI;IAKpE,OAAO,CAAC,QAAQ;CAIjB"}
@@ -0,0 +1,103 @@
1
+ const DEFAULT_CAPACITY = 500;
2
+ /**
3
+ * Multi-target console subscription with per-target ring buffer.
4
+ * Server owns one instance for its lifetime; commands attach/drain.
5
+ */
6
+ export class ConsoleStream {
7
+ capacity;
8
+ targets = new Map();
9
+ extraSubscribers = new Set();
10
+ constructor(opts = {}) {
11
+ this.capacity = opts.capacity ?? DEFAULT_CAPACITY;
12
+ }
13
+ get attachedCount() {
14
+ return this.targets.size;
15
+ }
16
+ /** Idempotent per target id — second attach for same id is a no-op. */
17
+ attach(session) {
18
+ const id = session.target.id;
19
+ if (this.targets.has(id))
20
+ return;
21
+ const entry = {
22
+ session,
23
+ ring: new Array(this.capacity),
24
+ cursor: 0,
25
+ full: false,
26
+ dispose: () => { },
27
+ };
28
+ entry.dispose = session.onConsole((msg) => {
29
+ const stamped = {
30
+ ...msg,
31
+ targetId: id,
32
+ targetType: session.target.type,
33
+ };
34
+ entry.ring[entry.cursor] = stamped;
35
+ entry.cursor = (entry.cursor + 1) % this.capacity;
36
+ if (entry.cursor === 0)
37
+ entry.full = true;
38
+ for (const sub of this.extraSubscribers) {
39
+ try {
40
+ sub(stamped);
41
+ }
42
+ catch { /* ignore */ }
43
+ }
44
+ });
45
+ this.targets.set(id, entry);
46
+ }
47
+ detach(targetId) {
48
+ if (targetId === undefined) {
49
+ for (const t of this.targets.values())
50
+ t.dispose();
51
+ this.targets.clear();
52
+ return;
53
+ }
54
+ const t = this.targets.get(targetId);
55
+ if (!t)
56
+ return;
57
+ t.dispose();
58
+ this.targets.delete(targetId);
59
+ }
60
+ clear(targetId) {
61
+ if (targetId === undefined) {
62
+ for (const t of this.targets.values()) {
63
+ t.cursor = 0;
64
+ t.full = false;
65
+ }
66
+ return;
67
+ }
68
+ const t = this.targets.get(targetId);
69
+ if (!t)
70
+ return;
71
+ t.cursor = 0;
72
+ t.full = false;
73
+ }
74
+ /** Snapshot of buffered messages, sorted by timestamp (oldest first). */
75
+ drain(filter = {}) {
76
+ const result = [];
77
+ for (const [id, entry] of this.targets) {
78
+ if (filter.targetId && filter.targetId !== id)
79
+ continue;
80
+ const msgs = this.snapshot(entry);
81
+ for (const m of msgs) {
82
+ if (filter.since !== undefined && m.ts < filter.since)
83
+ continue;
84
+ if (filter.level && !filter.level.has(m.level))
85
+ continue;
86
+ result.push(m);
87
+ }
88
+ }
89
+ result.sort((a, b) => a.ts - b.ts);
90
+ return result;
91
+ }
92
+ /** Subscribe to live messages. Returns disposer. Used by --follow streaming. */
93
+ subscribe(handler) {
94
+ this.extraSubscribers.add(handler);
95
+ return () => this.extraSubscribers.delete(handler);
96
+ }
97
+ snapshot(entry) {
98
+ if (!entry.full)
99
+ return entry.ring.slice(0, entry.cursor);
100
+ return [...entry.ring.slice(entry.cursor), ...entry.ring.slice(0, entry.cursor)];
101
+ }
102
+ }
103
+ //# sourceMappingURL=console-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-stream.js","sourceRoot":"","sources":["../../../src/cdp/_tests/console-stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AXNode } from './types.js';
2
+ export declare class AxTreeCache {
3
+ private entries;
4
+ get(key: string): AXNode[] | null;
5
+ set(key: string, nodes: AXNode[]): void;
6
+ invalidate(key: string): void;
7
+ invalidateAll(): void;
8
+ }
9
+ //# sourceMappingURL=ax-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ax-cache.d.ts","sourceRoot":"","sources":["../../src/cdp/ax-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AASxC,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAgC;IAE/C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAUjC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAIvC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B,aAAa,IAAI,IAAI;CAGtB"}
@@ -0,0 +1,24 @@
1
+ const AX_CACHE_TTL_MS = 300;
2
+ export class AxTreeCache {
3
+ entries = new Map();
4
+ get(key) {
5
+ const entry = this.entries.get(key);
6
+ if (!entry)
7
+ return null;
8
+ if (Date.now() - entry.timestamp > AX_CACHE_TTL_MS) {
9
+ this.entries.delete(key);
10
+ return null;
11
+ }
12
+ return entry.nodes;
13
+ }
14
+ set(key, nodes) {
15
+ this.entries.set(key, { nodes, timestamp: Date.now() });
16
+ }
17
+ invalidate(key) {
18
+ this.entries.delete(key);
19
+ }
20
+ invalidateAll() {
21
+ this.entries.clear();
22
+ }
23
+ }
24
+ //# sourceMappingURL=ax-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ax-cache.js","sourceRoot":"","sources":["../../src/cdp/ax-cache.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,GAAG,CAAA;AAO3B,MAAM,OAAO,WAAW;IACd,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAA;IAE/C,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACnC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QACvB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,eAAe,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACxB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAA;IACpB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAe;QAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IACzD,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;IAED,aAAa;QACX,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ import type { RuntimeSession, ConsoleMessage, ConsoleLevel, TargetType } from './types.js';
2
+ export type ConsoleStreamOptions = {
3
+ /** Per-target ring size. Default 500. */
4
+ capacity?: number;
5
+ };
6
+ export type ConsoleFilter = {
7
+ since?: number;
8
+ level?: ReadonlySet<ConsoleLevel>;
9
+ targetId?: string;
10
+ };
11
+ export type StampedConsoleMessage = ConsoleMessage & {
12
+ targetId: string;
13
+ targetType: TargetType;
14
+ };
15
+ /**
16
+ * Multi-target console subscription with per-target ring buffer.
17
+ * Server owns one instance for its lifetime; commands attach/drain.
18
+ */
19
+ export declare class ConsoleStream {
20
+ private readonly capacity;
21
+ private readonly targets;
22
+ private readonly extraSubscribers;
23
+ constructor(opts?: ConsoleStreamOptions);
24
+ get attachedCount(): number;
25
+ /** Idempotent per target id — second attach for same id is a no-op. */
26
+ attach(session: RuntimeSession): void;
27
+ detach(targetId?: string): void;
28
+ clear(targetId?: string): void;
29
+ /** Snapshot of buffered messages, sorted by timestamp (oldest first). */
30
+ drain(filter?: ConsoleFilter): StampedConsoleMessage[];
31
+ /** Subscribe to live messages. Returns disposer. Used by --follow streaming. */
32
+ subscribe(handler: (msg: StampedConsoleMessage) => void): () => void;
33
+ private snapshot;
34
+ }
35
+ //# sourceMappingURL=console-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-stream.d.ts","sourceRoot":"","sources":["../../src/cdp/console-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAI1F,MAAM,MAAM,oBAAoB,GAAG;IACjC,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,CAAA;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG;IACnD,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAUD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkD;gBAEvE,IAAI,GAAE,oBAAyB;IAI3C,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,uEAAuE;IACvE,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IA6BrC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAY/B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAc9B,yEAAyE;IACzE,KAAK,CAAC,MAAM,GAAE,aAAkB,GAAG,qBAAqB,EAAE;IAe1D,gFAAgF;IAChF,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,IAAI,GAAG,MAAM,IAAI;IAKpE,OAAO,CAAC,QAAQ;CAIjB"}