@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.
- package/.claude-plugin/plugin.json +12 -1
- package/README.md +101 -2
- package/dist/adapters/browser.d.ts.map +1 -1
- package/dist/adapters/browser.js +11 -11
- package/dist/adapters/browser.js.map +1 -1
- package/dist/adapters/electron.d.ts.map +1 -1
- package/dist/adapters/electron.js +11 -11
- package/dist/adapters/electron.js.map +1 -1
- package/dist/adapters/tauri.d.ts.map +1 -1
- package/dist/adapters/tauri.js +11 -11
- package/dist/adapters/tauri.js.map +1 -1
- package/dist/adapters/types.d.ts +5 -2
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/cdp/_tests/console-stream.d.ts +35 -0
- package/dist/cdp/_tests/console-stream.d.ts.map +1 -0
- package/dist/cdp/_tests/console-stream.js +103 -0
- package/dist/cdp/_tests/console-stream.js.map +1 -0
- package/dist/cdp/ax-cache.d.ts +9 -0
- package/dist/cdp/ax-cache.d.ts.map +1 -0
- package/dist/cdp/ax-cache.js +24 -0
- package/dist/cdp/ax-cache.js.map +1 -0
- package/dist/cdp/console-stream.d.ts +35 -0
- package/dist/cdp/console-stream.d.ts.map +1 -0
- package/dist/cdp/console-stream.js +103 -0
- package/dist/cdp/console-stream.js.map +1 -0
- package/dist/cdp/transport.d.ts +5 -2
- package/dist/cdp/transport.d.ts.map +1 -1
- package/dist/cdp/transport.js +236 -24
- package/dist/cdp/transport.js.map +1 -1
- package/dist/cdp/types.d.ts +66 -8
- package/dist/cdp/types.d.ts.map +1 -1
- package/dist/cdp/types.js +29 -1
- package/dist/cdp/types.js.map +1 -1
- package/dist/cli/commands/console.d.ts +11 -0
- package/dist/cli/commands/console.d.ts.map +1 -0
- package/dist/cli/commands/console.js +31 -0
- package/dist/cli/commands/console.js.map +1 -0
- package/dist/cli/commands/dom.d.ts +1 -0
- package/dist/cli/commands/dom.d.ts.map +1 -1
- package/dist/cli/commands/dom.js +1 -0
- package/dist/cli/commands/dom.js.map +1 -1
- package/dist/cli/commands/eval.d.ts +9 -0
- package/dist/cli/commands/eval.d.ts.map +1 -0
- package/dist/cli/commands/eval.js +30 -0
- package/dist/cli/commands/eval.js.map +1 -0
- package/dist/cli/commands/screenshot.d.ts +1 -0
- package/dist/cli/commands/screenshot.d.ts.map +1 -1
- package/dist/cli/commands/screenshot.js +2 -0
- package/dist/cli/commands/screenshot.js.map +1 -1
- package/dist/cli/commands/targets.d.ts +7 -0
- package/dist/cli/commands/targets.d.ts.map +1 -0
- package/dist/cli/commands/targets.js +30 -0
- package/dist/cli/commands/targets.js.map +1 -0
- package/dist/cli/index.js +39 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +10 -0
- package/dist/config/manager.js.map +1 -1
- package/dist/config/types.d.ts +11 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/inspectors/dom/index.d.ts +17 -0
- package/dist/inspectors/dom/index.d.ts.map +1 -0
- package/dist/inspectors/dom/index.js +131 -0
- package/dist/inspectors/dom/index.js.map +1 -0
- package/dist/inspectors/scene/adapters/pixi/adapter.d.ts +3 -0
- package/dist/inspectors/scene/adapters/pixi/adapter.d.ts.map +1 -0
- package/dist/inspectors/scene/adapters/pixi/adapter.js +51 -0
- package/dist/inspectors/scene/adapters/pixi/adapter.js.map +1 -0
- package/dist/inspectors/scene/adapters/pixi/index.d.ts +2 -0
- package/dist/inspectors/scene/adapters/pixi/index.d.ts.map +1 -0
- package/dist/inspectors/scene/adapters/pixi/index.js +2 -0
- package/dist/inspectors/scene/adapters/pixi/index.js.map +1 -0
- package/dist/inspectors/scene/adapters/pixi/injection.d.ts +39 -0
- package/dist/inspectors/scene/adapters/pixi/injection.d.ts.map +1 -0
- package/dist/inspectors/scene/adapters/pixi/injection.js +41 -0
- package/dist/inspectors/scene/adapters/pixi/injection.js.map +1 -0
- package/dist/inspectors/scene/formatter.d.ts +0 -1
- package/dist/inspectors/scene/formatter.d.ts.map +1 -1
- package/dist/inspectors/scene/formatter.js +52 -43
- package/dist/inspectors/scene/formatter.js.map +1 -1
- package/dist/inspectors/scene/index.d.ts +4 -4
- package/dist/inspectors/scene/index.d.ts.map +1 -1
- package/dist/inspectors/scene/index.js +8 -5
- package/dist/inspectors/scene/index.js.map +1 -1
- package/dist/inspectors/scene/pixi.js.map +1 -1
- package/dist/inspectors/scene/registry.d.ts +2 -2
- package/dist/inspectors/scene/registry.d.ts.map +1 -1
- package/dist/inspectors/scene/registry.js +8 -8
- package/dist/inspectors/scene/registry.js.map +1 -1
- package/dist/inspectors/scene/types.d.ts +5 -10
- package/dist/inspectors/scene/types.d.ts.map +1 -1
- package/dist/server/server.d.ts +23 -1
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +384 -62
- package/dist/server/server.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/package.json +10 -9
- package/skills/verify/SKILL.md +99 -15
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-view",
|
|
3
|
-
"description": "
|
|
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
|
|
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;
|
|
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"}
|
package/dist/adapters/browser.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import {
|
|
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
|
|
7
|
+
const targets = await listSupportedTargets(port);
|
|
7
8
|
return targets
|
|
8
|
-
.filter(t => t.type ===
|
|
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
|
-
|
|
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,
|
|
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;
|
|
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 {
|
|
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
|
|
7
|
+
const targets = await listSupportedTargets(port);
|
|
7
8
|
return targets
|
|
8
|
-
.filter(t => t.type ===
|
|
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
|
-
|
|
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,
|
|
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;
|
|
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"}
|
package/dist/adapters/tauri.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
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 !==
|
|
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
|
|
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
|
-
|
|
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,
|
|
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"}
|
package/dist/adapters/types.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { WindowInfo, RuntimeType } from '../types.js';
|
|
2
|
-
import type {
|
|
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
|
-
|
|
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,
|
|
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"}
|