tauri-agent-tools 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.
- package/.agents/skills/tauri-agent-tools/SKILL.md +104 -0
- package/.agents/skills/tauri-bridge-setup/SKILL.md +95 -0
- package/AGENTS.md +30 -0
- package/LICENSE +21 -0
- package/README.md +338 -0
- package/dist/bridge/client.d.ts +15 -0
- package/dist/bridge/client.js +119 -0
- package/dist/bridge/client.js.map +1 -0
- package/dist/bridge/tokenDiscovery.d.ts +3 -0
- package/dist/bridge/tokenDiscovery.js +77 -0
- package/dist/bridge/tokenDiscovery.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +49 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/consoleMonitor.d.ts +2 -0
- package/dist/commands/consoleMonitor.js +133 -0
- package/dist/commands/consoleMonitor.js.map +1 -0
- package/dist/commands/dom.d.ts +2 -0
- package/dist/commands/dom.js +186 -0
- package/dist/commands/dom.js.map +1 -0
- package/dist/commands/eval.d.ts +2 -0
- package/dist/commands/eval.js +27 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/info.d.ts +3 -0
- package/dist/commands/info.js +28 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/ipcMonitor.d.ts +2 -0
- package/dist/commands/ipcMonitor.js +122 -0
- package/dist/commands/ipcMonitor.js.map +1 -0
- package/dist/commands/listWindows.d.ts +3 -0
- package/dist/commands/listWindows.js +58 -0
- package/dist/commands/listWindows.js.map +1 -0
- package/dist/commands/pageState.d.ts +2 -0
- package/dist/commands/pageState.js +43 -0
- package/dist/commands/pageState.js.map +1 -0
- package/dist/commands/screenshot.d.ts +3 -0
- package/dist/commands/screenshot.js +81 -0
- package/dist/commands/screenshot.js.map +1 -0
- package/dist/commands/shared.d.ts +7 -0
- package/dist/commands/shared.js +27 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/storage.d.ts +2 -0
- package/dist/commands/storage.js +110 -0
- package/dist/commands/storage.js.map +1 -0
- package/dist/commands/wait.d.ts +3 -0
- package/dist/commands/wait.js +63 -0
- package/dist/commands/wait.js.map +1 -0
- package/dist/platform/detect.d.ts +11 -0
- package/dist/platform/detect.js +73 -0
- package/dist/platform/detect.js.map +1 -0
- package/dist/platform/macos.d.ts +8 -0
- package/dist/platform/macos.js +111 -0
- package/dist/platform/macos.js.map +1 -0
- package/dist/platform/wayland.d.ts +10 -0
- package/dist/platform/wayland.js +98 -0
- package/dist/platform/wayland.js.map +1 -0
- package/dist/platform/x11.d.ts +8 -0
- package/dist/platform/x11.js +78 -0
- package/dist/platform/x11.js.map +1 -0
- package/dist/types.d.ts +32 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util/exec.d.ts +9 -0
- package/dist/util/exec.js +31 -0
- package/dist/util/exec.js.map +1 -0
- package/dist/util/image.d.ts +10 -0
- package/dist/util/image.js +23 -0
- package/dist/util/image.js.map +1 -0
- package/examples/tauri-bridge/Cargo.toml +13 -0
- package/examples/tauri-bridge/src/dev_bridge.rs +146 -0
- package/examples/tauri-bridge/src/main.rs +16 -0
- package/package.json +70 -0
- package/rust-bridge/README.md +80 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { detectDisplayServer } from '../platform/detect.js';
|
|
3
|
+
export function registerInfo(program, getAdapter) {
|
|
4
|
+
const cmd = new Command('info')
|
|
5
|
+
.description('Show window geometry and display server info')
|
|
6
|
+
.requiredOption('-t, --title <regex>', 'Window title to match')
|
|
7
|
+
.option('--json', 'Output as JSON')
|
|
8
|
+
.action(async (opts) => {
|
|
9
|
+
const adapter = await getAdapter();
|
|
10
|
+
const windowId = await adapter.findWindow(opts.title);
|
|
11
|
+
const geom = await adapter.getWindowGeometry(windowId);
|
|
12
|
+
const name = await adapter.getWindowName(windowId);
|
|
13
|
+
const displayServer = detectDisplayServer();
|
|
14
|
+
const info = { ...geom, name, displayServer };
|
|
15
|
+
if (opts.json) {
|
|
16
|
+
console.log(JSON.stringify(info, null, 2));
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
console.log(`Window ID: ${info.windowId}`);
|
|
20
|
+
console.log(`Name: ${info.name}`);
|
|
21
|
+
console.log(`Position: ${info.x}, ${info.y}`);
|
|
22
|
+
console.log(`Size: ${info.width}x${info.height}`);
|
|
23
|
+
console.log(`Display Server: ${info.displayServer}`);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
program.addCommand(cmd);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,YAAY,CAC1B,OAAgB,EAChB,UAA4D;IAE5D,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;SAC5B,WAAW,CAAC,8CAA8C,CAAC;SAC3D,cAAc,CAAC,qBAAqB,EAAE,uBAAuB,CAAC;SAC9D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAuC,EAAE,EAAE;QACxD,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;QAE5C,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QAE9C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { addBridgeOptions, resolveBridge } from './shared.js';
|
|
3
|
+
const PATCH_SCRIPT = `(() => {
|
|
4
|
+
if (window.__tauriDevToolsPatched) return 'already_patched';
|
|
5
|
+
if (!window.__TAURI__ || !window.__TAURI__.core || !window.__TAURI__.core.invoke) {
|
|
6
|
+
return 'no_tauri';
|
|
7
|
+
}
|
|
8
|
+
window.__tauriDevToolsOriginalInvoke = window.__TAURI__.core.invoke;
|
|
9
|
+
window.__tauriDevToolsIpcLog = [];
|
|
10
|
+
window.__TAURI__.core.invoke = function(cmd, args) {
|
|
11
|
+
var entry = { command: cmd, args: args || {}, timestamp: Date.now() };
|
|
12
|
+
var start = performance.now();
|
|
13
|
+
return window.__tauriDevToolsOriginalInvoke.call(this, cmd, args).then(function(result) {
|
|
14
|
+
entry.duration = Math.round(performance.now() - start);
|
|
15
|
+
entry.result = result;
|
|
16
|
+
window.__tauriDevToolsIpcLog.push(entry);
|
|
17
|
+
return result;
|
|
18
|
+
}).catch(function(err) {
|
|
19
|
+
entry.duration = Math.round(performance.now() - start);
|
|
20
|
+
entry.error = err && err.message ? err.message : String(err);
|
|
21
|
+
window.__tauriDevToolsIpcLog.push(entry);
|
|
22
|
+
throw err;
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
window.__tauriDevToolsPatched = true;
|
|
26
|
+
return 'patched';
|
|
27
|
+
})()`;
|
|
28
|
+
const DRAIN_SCRIPT = `(() => {
|
|
29
|
+
var log = window.__tauriDevToolsIpcLog || [];
|
|
30
|
+
window.__tauriDevToolsIpcLog = [];
|
|
31
|
+
return JSON.stringify(log);
|
|
32
|
+
})()`;
|
|
33
|
+
const CLEANUP_SCRIPT = `(() => {
|
|
34
|
+
if (window.__tauriDevToolsOriginalInvoke) {
|
|
35
|
+
window.__TAURI__.core.invoke = window.__tauriDevToolsOriginalInvoke;
|
|
36
|
+
delete window.__tauriDevToolsOriginalInvoke;
|
|
37
|
+
delete window.__tauriDevToolsIpcLog;
|
|
38
|
+
delete window.__tauriDevToolsPatched;
|
|
39
|
+
}
|
|
40
|
+
return 'cleaned';
|
|
41
|
+
})()`;
|
|
42
|
+
function matchesFilter(command, filter) {
|
|
43
|
+
if (filter.includes('*')) {
|
|
44
|
+
const regex = new RegExp('^' + filter.replace(/\*/g, '.*') + '$');
|
|
45
|
+
return regex.test(command);
|
|
46
|
+
}
|
|
47
|
+
return command === filter;
|
|
48
|
+
}
|
|
49
|
+
function formatEntry(entry) {
|
|
50
|
+
const time = new Date(entry.timestamp).toISOString().slice(11, 23);
|
|
51
|
+
const dur = entry.duration !== undefined ? ` ${entry.duration}ms` : '';
|
|
52
|
+
const status = entry.error ? `ERR: ${entry.error}` : 'OK';
|
|
53
|
+
return `[${time}]${dur} ${entry.command} ${status}`;
|
|
54
|
+
}
|
|
55
|
+
async function cleanup(bridge) {
|
|
56
|
+
try {
|
|
57
|
+
await bridge.eval(CLEANUP_SCRIPT);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Best-effort cleanup
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function registerIpcMonitor(program) {
|
|
64
|
+
const cmd = new Command('ipc-monitor')
|
|
65
|
+
.description('Monitor Tauri IPC calls in real-time (read-only)')
|
|
66
|
+
.option('--filter <command>', 'Only show specific IPC commands (supports * wildcards)')
|
|
67
|
+
.option('--interval <ms>', 'Poll interval in milliseconds', parseInt, 500)
|
|
68
|
+
.option('--duration <ms>', 'Auto-stop after N milliseconds', parseInt)
|
|
69
|
+
.option('--json', 'Output one JSON object per line');
|
|
70
|
+
addBridgeOptions(cmd);
|
|
71
|
+
cmd.action(async (opts) => {
|
|
72
|
+
const bridge = await resolveBridge(opts);
|
|
73
|
+
// Inject the monkey-patch
|
|
74
|
+
const patchResult = await bridge.eval(PATCH_SCRIPT);
|
|
75
|
+
if (patchResult === 'no_tauri') {
|
|
76
|
+
throw new Error('window.__TAURI__.core.invoke not found. Is this a Tauri app with IPC enabled?');
|
|
77
|
+
}
|
|
78
|
+
let stopped = false;
|
|
79
|
+
const onSignal = () => {
|
|
80
|
+
stopped = true;
|
|
81
|
+
};
|
|
82
|
+
process.on('SIGINT', onSignal);
|
|
83
|
+
process.on('SIGTERM', onSignal);
|
|
84
|
+
let timer;
|
|
85
|
+
if (opts.duration) {
|
|
86
|
+
timer = setTimeout(() => {
|
|
87
|
+
stopped = true;
|
|
88
|
+
}, opts.duration);
|
|
89
|
+
}
|
|
90
|
+
if (!opts.json) {
|
|
91
|
+
console.error('Monitoring IPC calls... (Ctrl+C to stop)');
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
while (!stopped) {
|
|
95
|
+
await new Promise((resolve) => setTimeout(resolve, opts.interval));
|
|
96
|
+
if (stopped)
|
|
97
|
+
break;
|
|
98
|
+
const raw = await bridge.eval(DRAIN_SCRIPT);
|
|
99
|
+
const entries = JSON.parse(String(raw));
|
|
100
|
+
for (const entry of entries) {
|
|
101
|
+
if (opts.filter && !matchesFilter(entry.command, opts.filter))
|
|
102
|
+
continue;
|
|
103
|
+
if (opts.json) {
|
|
104
|
+
console.log(JSON.stringify(entry));
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
console.log(formatEntry(entry));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
if (timer)
|
|
114
|
+
clearTimeout(timer);
|
|
115
|
+
process.off('SIGINT', onSignal);
|
|
116
|
+
process.off('SIGTERM', onSignal);
|
|
117
|
+
await cleanup(bridge);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
program.addCommand(cmd);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=ipcMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipcMonitor.js","sourceRoot":"","sources":["../../src/commands/ipcMonitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { discoverBridgesByPid } from '../bridge/tokenDiscovery.js';
|
|
3
|
+
export function registerListWindows(program, getAdapter) {
|
|
4
|
+
const cmd = new Command('list-windows')
|
|
5
|
+
.description('List all visible windows, marking Tauri apps')
|
|
6
|
+
.option('--json', 'Output as JSON')
|
|
7
|
+
.option('--tauri', 'Only show Tauri app windows');
|
|
8
|
+
cmd.action(async (opts) => {
|
|
9
|
+
const adapter = await getAdapter();
|
|
10
|
+
const [windows, bridgesByPid] = await Promise.all([
|
|
11
|
+
adapter.listWindows(),
|
|
12
|
+
discoverBridgesByPid(),
|
|
13
|
+
]);
|
|
14
|
+
let entries = windows.map((w) => {
|
|
15
|
+
const bridge = w.pid ? bridgesByPid.get(w.pid) : undefined;
|
|
16
|
+
return {
|
|
17
|
+
...w,
|
|
18
|
+
tauri: !!bridge,
|
|
19
|
+
bridge: bridge ?? undefined,
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
if (opts.tauri) {
|
|
23
|
+
entries = entries.filter((e) => e.tauri);
|
|
24
|
+
}
|
|
25
|
+
if (opts.json) {
|
|
26
|
+
console.log(JSON.stringify(entries, null, 2));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (entries.length === 0) {
|
|
30
|
+
console.log(opts.tauri ? 'No Tauri windows found.' : 'No windows found.');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Table output
|
|
34
|
+
const idWidth = Math.max(2, ...entries.map((e) => e.windowId.length));
|
|
35
|
+
const pidWidth = Math.max(3, ...entries.map((e) => e.pid ? String(e.pid).length : 1));
|
|
36
|
+
const nameWidth = Math.max(4, ...entries.map((e) => (e.name ?? '').length));
|
|
37
|
+
const header = [
|
|
38
|
+
'ID'.padEnd(idWidth),
|
|
39
|
+
'PID'.padEnd(pidWidth),
|
|
40
|
+
'NAME'.padEnd(nameWidth),
|
|
41
|
+
'SIZE',
|
|
42
|
+
'TAURI',
|
|
43
|
+
].join(' ');
|
|
44
|
+
console.log(header);
|
|
45
|
+
for (const e of entries) {
|
|
46
|
+
const line = [
|
|
47
|
+
e.windowId.padEnd(idWidth),
|
|
48
|
+
(e.pid ? String(e.pid) : '-').padEnd(pidWidth),
|
|
49
|
+
(e.name ?? '').padEnd(nameWidth),
|
|
50
|
+
`${e.width}x${e.height}`,
|
|
51
|
+
e.tauri ? `yes (port ${e.bridge.port})` : 'no',
|
|
52
|
+
].join(' ');
|
|
53
|
+
console.log(line);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
program.addCommand(cmd);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=listWindows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listWindows.js","sourceRoot":"","sources":["../../src/commands/listWindows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { addBridgeOptions, resolveBridge } from './shared.js';
|
|
3
|
+
const PAGE_STATE_SCRIPT = `(() => {
|
|
4
|
+
var state = {
|
|
5
|
+
url: window.location.href,
|
|
6
|
+
title: document.title,
|
|
7
|
+
viewport: { width: window.innerWidth, height: window.innerHeight },
|
|
8
|
+
scroll: { x: Math.round(window.scrollX), y: Math.round(window.scrollY) },
|
|
9
|
+
document: { width: document.documentElement.scrollWidth, height: document.documentElement.scrollHeight },
|
|
10
|
+
hasTauri: !!(window.__TAURI__)
|
|
11
|
+
};
|
|
12
|
+
return JSON.stringify(state);
|
|
13
|
+
})()`;
|
|
14
|
+
function formatPageState(state) {
|
|
15
|
+
const lines = [
|
|
16
|
+
`URL: ${state.url}`,
|
|
17
|
+
`Title: ${state.title}`,
|
|
18
|
+
`Viewport: ${state.viewport.width}x${state.viewport.height}`,
|
|
19
|
+
`Scroll Position: ${state.scroll.x}, ${state.scroll.y}`,
|
|
20
|
+
`Document Size: ${state.document.width}x${state.document.height}`,
|
|
21
|
+
`Tauri: ${state.hasTauri ? 'yes' : 'no'}`,
|
|
22
|
+
];
|
|
23
|
+
return lines.join('\n');
|
|
24
|
+
}
|
|
25
|
+
export function registerPageState(program) {
|
|
26
|
+
const cmd = new Command('page-state')
|
|
27
|
+
.description('Query webview page state (URL, title, viewport, scroll, document size)')
|
|
28
|
+
.option('--json', 'Output as JSON');
|
|
29
|
+
addBridgeOptions(cmd);
|
|
30
|
+
cmd.action(async (opts) => {
|
|
31
|
+
const bridge = await resolveBridge(opts);
|
|
32
|
+
const raw = await bridge.eval(PAGE_STATE_SCRIPT);
|
|
33
|
+
const state = JSON.parse(String(raw));
|
|
34
|
+
if (opts.json) {
|
|
35
|
+
console.log(JSON.stringify(state, null, 2));
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.log(formatPageState(state));
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
program.addCommand(cmd);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=pageState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageState.js","sourceRoot":"","sources":["../../src/commands/pageState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,iBAAiB,GAAG;;;;;;;;;;KAUrB,CAAC;AAWN,SAAS,eAAe,CAAC,KAAgB;IACvC,MAAM,KAAK,GAAG;QACZ,oBAAoB,KAAK,CAAC,GAAG,EAAE;QAC/B,oBAAoB,KAAK,CAAC,KAAK,EAAE;QACjC,oBAAoB,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE;QACnE,oBAAoB,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE;QACvD,oBAAoB,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE;QACnE,oBAAoB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;KACpD,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC;SAClC,WAAW,CAAC,wEAAwE,CAAC;SACrF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAEtC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAEtB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAuD,EAAE,EAAE;QAC3E,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjD,MAAM,KAAK,GAAc,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAEjD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { addBridgeOptions, resolveBridge } from './shared.js';
|
|
4
|
+
import { computeCropRect, cropImage, resizeImage } from '../util/image.js';
|
|
5
|
+
function autoOutputPath(format) {
|
|
6
|
+
const ts = new Date().toISOString().replace(/[:.]/g, '-');
|
|
7
|
+
return `screenshot-${ts}.${format}`;
|
|
8
|
+
}
|
|
9
|
+
export function registerScreenshot(program, getAdapter) {
|
|
10
|
+
const cmd = new Command('screenshot')
|
|
11
|
+
.description('Capture a screenshot of a window or DOM element')
|
|
12
|
+
.option('-s, --selector <css>', 'CSS selector — screenshot just this element (requires bridge)')
|
|
13
|
+
.option('-t, --title <regex>', 'Window title to match (default: auto-discover from bridge)')
|
|
14
|
+
.option('-o, --output <path>', 'Output file path (default: auto-named)')
|
|
15
|
+
.option('--format <fmt>', 'Output format: png or jpg', 'png')
|
|
16
|
+
.option('--max-width <number>', 'Resize to max width', parseInt)
|
|
17
|
+
.option('--json', 'Output structured JSON metadata');
|
|
18
|
+
addBridgeOptions(cmd);
|
|
19
|
+
cmd.action(async (opts) => {
|
|
20
|
+
const format = (opts.format === 'jpg' ? 'jpg' : 'png');
|
|
21
|
+
const adapter = await getAdapter();
|
|
22
|
+
let buffer;
|
|
23
|
+
if (opts.selector) {
|
|
24
|
+
// DOM-targeted pixel capture — the core feature
|
|
25
|
+
const bridge = await resolveBridge(opts);
|
|
26
|
+
const elementRect = await bridge.getElementRect(opts.selector);
|
|
27
|
+
if (!elementRect) {
|
|
28
|
+
throw new Error(`Element not found: ${opts.selector}`);
|
|
29
|
+
}
|
|
30
|
+
const viewport = await bridge.getViewportSize();
|
|
31
|
+
// Find window
|
|
32
|
+
let windowId;
|
|
33
|
+
if (opts.title) {
|
|
34
|
+
windowId = await adapter.findWindow(opts.title);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const title = await bridge.getDocumentTitle();
|
|
38
|
+
if (!title) {
|
|
39
|
+
throw new Error('Could not get window title from bridge. Use --title to specify.');
|
|
40
|
+
}
|
|
41
|
+
windowId = await adapter.findWindow(title);
|
|
42
|
+
}
|
|
43
|
+
const windowGeom = await adapter.getWindowGeometry(windowId);
|
|
44
|
+
// Capture full window
|
|
45
|
+
buffer = await adapter.captureWindow(windowId, format);
|
|
46
|
+
// Crop to element
|
|
47
|
+
const cropRect = computeCropRect(elementRect, viewport, {
|
|
48
|
+
width: windowGeom.width,
|
|
49
|
+
height: windowGeom.height,
|
|
50
|
+
});
|
|
51
|
+
buffer = await cropImage(buffer, cropRect, format);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// Full window fallback — no bridge needed
|
|
55
|
+
if (!opts.title) {
|
|
56
|
+
throw new Error('Either --selector (with bridge) or --title is required');
|
|
57
|
+
}
|
|
58
|
+
const windowId = await adapter.findWindow(opts.title);
|
|
59
|
+
buffer = await adapter.captureWindow(windowId, format);
|
|
60
|
+
}
|
|
61
|
+
if (opts.maxWidth) {
|
|
62
|
+
buffer = await resizeImage(buffer, opts.maxWidth, format);
|
|
63
|
+
}
|
|
64
|
+
const output = opts.output ?? autoOutputPath(format);
|
|
65
|
+
await writeFile(output, buffer);
|
|
66
|
+
if (opts.json) {
|
|
67
|
+
console.log(JSON.stringify({
|
|
68
|
+
path: output,
|
|
69
|
+
format,
|
|
70
|
+
size: buffer.length,
|
|
71
|
+
selector: opts.selector ?? null,
|
|
72
|
+
windowTitle: opts.title ?? null,
|
|
73
|
+
}, null, 2));
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.log(output);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
program.addCommand(cmd);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=screenshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/commands/screenshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import { BridgeClient } from '../bridge/client.js';
|
|
3
|
+
export declare function addBridgeOptions(cmd: Command): Command;
|
|
4
|
+
export declare function resolveBridge(opts: {
|
|
5
|
+
port?: number;
|
|
6
|
+
token?: string;
|
|
7
|
+
}): Promise<BridgeClient>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { BridgeClient } from '../bridge/client.js';
|
|
2
|
+
import { discoverBridge } from '../bridge/tokenDiscovery.js';
|
|
3
|
+
export function addBridgeOptions(cmd) {
|
|
4
|
+
return cmd
|
|
5
|
+
.option('--port <number>', 'Bridge port (auto-discover if omitted)', parseInt)
|
|
6
|
+
.option('--token <string>', 'Bridge token (auto-discover if omitted)');
|
|
7
|
+
}
|
|
8
|
+
export async function resolveBridge(opts) {
|
|
9
|
+
let config;
|
|
10
|
+
if (opts.port && opts.token) {
|
|
11
|
+
config = { port: opts.port, token: opts.token };
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
const discovered = await discoverBridge();
|
|
15
|
+
if (!discovered) {
|
|
16
|
+
throw new Error('No bridge found. Either:\n' +
|
|
17
|
+
' 1. Start the Tauri dev bridge in your app, or\n' +
|
|
18
|
+
' 2. Specify --port and --token manually');
|
|
19
|
+
}
|
|
20
|
+
config = {
|
|
21
|
+
port: opts.port ?? discovered.port,
|
|
22
|
+
token: opts.token ?? discovered.token,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return new BridgeClient(config);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,GAAG;SACP,MAAM,CAAC,iBAAiB,EAAE,wCAAwC,EAAE,QAAQ,CAAC;SAC7E,MAAM,CAAC,kBAAkB,EAAE,yCAAyC,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAGnC;IACC,IAAI,MAAoB,CAAC;IAEzB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,4BAA4B;gBAC1B,mDAAmD;gBACnD,0CAA0C,CAC7C,CAAC;QACJ,CAAC;QACD,MAAM,GAAG;YACP,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI;YAClC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK;SACtC,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { addBridgeOptions, resolveBridge } from './shared.js';
|
|
3
|
+
function escapeQuotes(s) {
|
|
4
|
+
return s.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
5
|
+
}
|
|
6
|
+
function buildLocalStorageScript(key) {
|
|
7
|
+
if (key) {
|
|
8
|
+
return `localStorage.getItem('${escapeQuotes(key)}')`;
|
|
9
|
+
}
|
|
10
|
+
return `JSON.stringify(Object.keys(localStorage).map(function(k) { return { key: k, value: localStorage.getItem(k) }; }))`;
|
|
11
|
+
}
|
|
12
|
+
function buildSessionStorageScript(key) {
|
|
13
|
+
if (key) {
|
|
14
|
+
return `sessionStorage.getItem('${escapeQuotes(key)}')`;
|
|
15
|
+
}
|
|
16
|
+
return `JSON.stringify(Object.keys(sessionStorage).map(function(k) { return { key: k, value: sessionStorage.getItem(k) }; }))`;
|
|
17
|
+
}
|
|
18
|
+
function buildCookiesScript() {
|
|
19
|
+
return `document.cookie`;
|
|
20
|
+
}
|
|
21
|
+
function parseCookies(cookieString) {
|
|
22
|
+
if (!cookieString || !cookieString.trim())
|
|
23
|
+
return [];
|
|
24
|
+
return cookieString.split('; ').map((pair) => {
|
|
25
|
+
const eqIdx = pair.indexOf('=');
|
|
26
|
+
if (eqIdx === -1)
|
|
27
|
+
return { key: pair, value: null };
|
|
28
|
+
return { key: pair.slice(0, eqIdx), value: pair.slice(eqIdx + 1) };
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function formatSection(name, entries) {
|
|
32
|
+
const count = entries.length;
|
|
33
|
+
const label = count === 1 ? 'entry' : 'entries';
|
|
34
|
+
const lines = [`${name} (${count} ${label})`];
|
|
35
|
+
for (const e of entries) {
|
|
36
|
+
lines.push(` ${e.key} = ${e.value === null ? '(no value)' : JSON.stringify(e.value)}`);
|
|
37
|
+
}
|
|
38
|
+
return lines.join('\n');
|
|
39
|
+
}
|
|
40
|
+
export function registerStorage(program) {
|
|
41
|
+
const cmd = new Command('storage')
|
|
42
|
+
.description('Inspect localStorage, sessionStorage, and cookies')
|
|
43
|
+
.option('--type <type>', 'Storage type: local, session, cookies, all', 'all')
|
|
44
|
+
.option('--key <name>', 'Get a specific key value')
|
|
45
|
+
.option('--json', 'Output as JSON');
|
|
46
|
+
addBridgeOptions(cmd);
|
|
47
|
+
cmd.action(async (opts) => {
|
|
48
|
+
const validTypes = ['local', 'session', 'cookies', 'all'];
|
|
49
|
+
if (!validTypes.includes(opts.type)) {
|
|
50
|
+
throw new Error(`Invalid storage type: ${opts.type}. Must be one of: ${validTypes.join(', ')}`);
|
|
51
|
+
}
|
|
52
|
+
const bridge = await resolveBridge(opts);
|
|
53
|
+
const result = {};
|
|
54
|
+
if (opts.type === 'local' || opts.type === 'all') {
|
|
55
|
+
const raw = await bridge.eval(buildLocalStorageScript(opts.key));
|
|
56
|
+
if (opts.key) {
|
|
57
|
+
result.localStorage = raw;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
result.localStorage = JSON.parse(String(raw));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (opts.type === 'session' || opts.type === 'all') {
|
|
64
|
+
const raw = await bridge.eval(buildSessionStorageScript(opts.key));
|
|
65
|
+
if (opts.key) {
|
|
66
|
+
result.sessionStorage = raw;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
result.sessionStorage = JSON.parse(String(raw));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (opts.type === 'cookies' || opts.type === 'all') {
|
|
73
|
+
if (opts.key) {
|
|
74
|
+
const raw = await bridge.eval(buildCookiesScript());
|
|
75
|
+
const cookies = parseCookies(String(raw));
|
|
76
|
+
const match = cookies.find((c) => c.key === opts.key);
|
|
77
|
+
result.cookies = match ? match.value : null;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const raw = await bridge.eval(buildCookiesScript());
|
|
81
|
+
result.cookies = parseCookies(String(raw));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (opts.json) {
|
|
85
|
+
console.log(JSON.stringify(result, null, 2));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
if (opts.key) {
|
|
89
|
+
for (const [store, value] of Object.entries(result)) {
|
|
90
|
+
console.log(`${store}: ${value === null ? '(not found)' : String(value)}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const sections = [];
|
|
95
|
+
if (result.localStorage) {
|
|
96
|
+
sections.push(formatSection('localStorage', result.localStorage));
|
|
97
|
+
}
|
|
98
|
+
if (result.sessionStorage) {
|
|
99
|
+
sections.push(formatSection('sessionStorage', result.sessionStorage));
|
|
100
|
+
}
|
|
101
|
+
if (result.cookies) {
|
|
102
|
+
sections.push(formatSection('cookies', result.cookies));
|
|
103
|
+
}
|
|
104
|
+
console.log(sections.join('\n\n'));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
program.addCommand(cmd);
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/commands/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { addBridgeOptions, resolveBridge } from './shared.js';
|
|
3
|
+
function sleep(ms) {
|
|
4
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
5
|
+
}
|
|
6
|
+
export function registerWait(program, getAdapter) {
|
|
7
|
+
const cmd = new Command('wait')
|
|
8
|
+
.description('Wait for a condition to be met')
|
|
9
|
+
.option('-s, --selector <css>', 'Wait for CSS selector to match an element')
|
|
10
|
+
.option('-e, --eval <js>', 'Wait for JS expression to be truthy')
|
|
11
|
+
.option('-t, --title <regex>', 'Wait for window with title (no bridge needed)')
|
|
12
|
+
.option('--timeout <ms>', 'Maximum wait time in milliseconds', parseInt, 10000)
|
|
13
|
+
.option('--interval <ms>', 'Polling interval in milliseconds', parseInt, 500);
|
|
14
|
+
addBridgeOptions(cmd);
|
|
15
|
+
cmd.action(async (opts) => {
|
|
16
|
+
if (!opts.selector && !opts.eval && !opts.title) {
|
|
17
|
+
throw new Error('One of --selector, --eval, or --title is required');
|
|
18
|
+
}
|
|
19
|
+
const deadline = Date.now() + opts.timeout;
|
|
20
|
+
if (opts.title) {
|
|
21
|
+
// No bridge needed — poll platform adapter
|
|
22
|
+
const adapter = await getAdapter();
|
|
23
|
+
while (Date.now() < deadline) {
|
|
24
|
+
try {
|
|
25
|
+
const windowId = await adapter.findWindow(opts.title);
|
|
26
|
+
console.log(windowId);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
await sleep(opts.interval);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
throw new Error(`Timed out waiting for window: ${opts.title}`);
|
|
34
|
+
}
|
|
35
|
+
// Bridge-dependent modes
|
|
36
|
+
const bridge = await resolveBridge(opts);
|
|
37
|
+
if (opts.selector) {
|
|
38
|
+
const escaped = opts.selector.replace(/'/g, "\\'");
|
|
39
|
+
while (Date.now() < deadline) {
|
|
40
|
+
const result = await bridge.eval(`document.querySelector('${escaped}') !== null`);
|
|
41
|
+
if (result === true) {
|
|
42
|
+
console.log('found');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
await sleep(opts.interval);
|
|
46
|
+
}
|
|
47
|
+
throw new Error(`Timed out waiting for selector: ${opts.selector}`);
|
|
48
|
+
}
|
|
49
|
+
if (opts.eval) {
|
|
50
|
+
while (Date.now() < deadline) {
|
|
51
|
+
const result = await bridge.eval(opts.eval);
|
|
52
|
+
if (result) {
|
|
53
|
+
console.log(JSON.stringify(result));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
await sleep(opts.interval);
|
|
57
|
+
}
|
|
58
|
+
throw new Error(`Timed out waiting for expression to be truthy`);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
program.addCommand(cmd);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=wait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/commands/wait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,OAAgB,EAChB,UAA4D;IAE5D,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;SAC5B,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,sBAAsB,EAAE,2CAA2C,CAAC;SAC3E,MAAM,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;SAChE,MAAM,CAAC,qBAAqB,EAAE,+CAA+C,CAAC;SAC9E,MAAM,CAAC,gBAAgB,EAAE,mCAAmC,EAAE,QAAQ,EAAE,KAAK,CAAC;SAC9E,MAAM,CAAC,iBAAiB,EAAE,kCAAkC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAEhF,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAEtB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAQjB,EAAE,EAAE;QACH,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAE3C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,2CAA2C;YAC3C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACtD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACtB,OAAO;gBACT,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,yBAAyB;QACzB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QAEzC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAC9B,2BAA2B,OAAO,aAAa,CAChD,CAAC;gBACF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;gBACD,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;oBACpC,OAAO;gBACT,CAAC;gBACD,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC"}
|