@rubytech/create-maxy-code 0.1.186 → 0.1.187
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/package.json +1 -1
- package/payload/platform/plugins/admin/skills/a4-print-documents/SKILL.md +14 -14
- package/payload/platform/plugins/admin/skills/deck-pages/SKILL.md +9 -23
- package/payload/platform/plugins/admin/skills/professional-document/SKILL.md +1 -1
- package/payload/platform/plugins/admin/skills/skill-builder/SKILL.md +1 -1
- package/payload/platform/plugins/admin/skills/skill-builder/references/pdf-generation.md +4 -4
- package/payload/platform/plugins/browser/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/browser/PLUGIN.md +78 -8
- package/payload/platform/plugins/browser/mcp/dist/index.js +111 -7
- package/payload/platform/plugins/browser/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/browser/mcp/dist/lib/cdp-actions.d.ts +98 -0
- package/payload/platform/plugins/browser/mcp/dist/lib/cdp-actions.d.ts.map +1 -0
- package/payload/platform/plugins/browser/mcp/dist/lib/cdp-actions.js +455 -0
- package/payload/platform/plugins/browser/mcp/dist/lib/cdp-actions.js.map +1 -0
- package/payload/platform/plugins/browser/mcp/dist/lib/cdp-render.d.ts +9 -31
- package/payload/platform/plugins/browser/mcp/dist/lib/cdp-render.d.ts.map +1 -1
- package/payload/platform/plugins/browser/mcp/dist/lib/cdp-render.js +6 -165
- package/payload/platform/plugins/browser/mcp/dist/lib/cdp-render.js.map +1 -1
- package/payload/platform/plugins/browser/mcp/dist/lib/cdp-session.d.ts +153 -0
- package/payload/platform/plugins/browser/mcp/dist/lib/cdp-session.d.ts.map +1 -0
- package/payload/platform/plugins/browser/mcp/dist/lib/cdp-session.js +401 -0
- package/payload/platform/plugins/browser/mcp/dist/lib/cdp-session.js.map +1 -0
- package/payload/platform/plugins/email/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/email/PLUGIN.md +6 -2
- package/payload/platform/plugins/email/mcp/dist/index.js +38 -0
- package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/providers.d.ts +28 -0
- package/payload/platform/plugins/email/mcp/dist/lib/providers.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/providers.js +106 -0
- package/payload/platform/plugins/email/mcp/dist/lib/providers.js.map +1 -1
- package/payload/platform/plugins/email/references/email-reference.md +19 -15
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.js +3 -2
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-compiled-truth-history.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-compiled-truth-history.js +2 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-compiled-truth-history.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-review-queue.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-review-queue.js +2 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-review-queue.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/session-retrospective-skip-rate.d.ts +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/session-retrospective-skip-rate.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/session-retrospective-skip-rate.js +3 -2
- package/payload/platform/plugins/memory/mcp/dist/tools/session-retrospective-skip-rate.js.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.js +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.js.map +1 -1
- package/payload/platform/scripts/check-cypher-int-params.mjs +277 -0
- package/payload/platform/templates/specialists/agents/content-producer.md +2 -2
- package/payload/platform/templates/specialists/agents/personal-assistant.md +6 -2
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-retrieve-conditioning.d.ts.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-retrieve-conditioning.js +33 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-retrieve-conditioning.js.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/src/tools/voice-retrieve-conditioning.ts +5 -2
- package/payload/server/{chunk-L2YK2VK3.js → chunk-EFJ2EXZK.js} +3 -1
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/server.js +1 -1
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive automation + output operations for the browser plugin.
|
|
3
|
+
*
|
|
4
|
+
* Every function here drives the one persistent page held by a BrowserSession
|
|
5
|
+
* (cdp-session.ts). They never throw to the MCP layer — each returns a
|
|
6
|
+
* structured ActionResult so the agent always sees a named outcome instead of a
|
|
7
|
+
* 500. Element targeting is by CSS selector run through Runtime.evaluate (raw
|
|
8
|
+
* CDP has no Playwright selector engine); the snapshot tool emits a unique CSS
|
|
9
|
+
* selector per interactive node so the agent clicks exactly what it read.
|
|
10
|
+
*
|
|
11
|
+
* ensure() live? ──no──▶ outcome "session-lost" ("call browser-navigate first")
|
|
12
|
+
* │yes (only navigate() re-attaches a dead page)
|
|
13
|
+
* ▼
|
|
14
|
+
* Runtime.evaluate / Input.* / Page.* ──▶ structured ActionResult
|
|
15
|
+
*/
|
|
16
|
+
import { closeTarget, listTargets, } from "./cdp-session.js";
|
|
17
|
+
const ok = (data) => ({ ok: true, outcome: "ok", data });
|
|
18
|
+
const fail = (outcome, detail) => ({ ok: false, outcome, detail });
|
|
19
|
+
const SESSION_LOST = fail("session-lost", "no live page — call browser-navigate first");
|
|
20
|
+
/** Resolve the live session or a session-lost result. */
|
|
21
|
+
function live(session) {
|
|
22
|
+
const s = session.ensure();
|
|
23
|
+
return s ?? SESSION_LOST;
|
|
24
|
+
}
|
|
25
|
+
function isResult(v) {
|
|
26
|
+
return v.outcome !== undefined && typeof v.ok === "boolean";
|
|
27
|
+
}
|
|
28
|
+
/** Run an expression in the page, returning its value or the thrown error text. */
|
|
29
|
+
async function evalValue(s, expression, timeoutMs, awaitPromise = false) {
|
|
30
|
+
let res;
|
|
31
|
+
try {
|
|
32
|
+
res = (await s.command("Runtime.evaluate", { expression, returnByValue: true, awaitPromise }, timeoutMs));
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
return { errorText: err instanceof Error ? err.message : String(err) };
|
|
36
|
+
}
|
|
37
|
+
if (res?.exceptionDetails) {
|
|
38
|
+
const ex = res.exceptionDetails;
|
|
39
|
+
return { errorText: ex.exception?.description ?? ex.text ?? "evaluate threw" };
|
|
40
|
+
}
|
|
41
|
+
return { value: res?.result?.value };
|
|
42
|
+
}
|
|
43
|
+
/** Wrap a body operating on `el` so the result distinguishes not-found from ok. */
|
|
44
|
+
function selectorScript(selector, body) {
|
|
45
|
+
return `(() => { const el = document.querySelector(${JSON.stringify(selector)}); if (!el) return { nf: true }; ${body} return { ok: true }; })()`;
|
|
46
|
+
}
|
|
47
|
+
/** Run a selector-scoped body; map the {nf} sentinel to selector-not-found. */
|
|
48
|
+
async function actOnSelector(s, selector, body, timeoutMs) {
|
|
49
|
+
const r = await evalValue(s, selectorScript(selector, body), timeoutMs);
|
|
50
|
+
if ("errorText" in r)
|
|
51
|
+
return fail("evaluate-failed", r.errorText);
|
|
52
|
+
const v = r.value;
|
|
53
|
+
if (v?.nf)
|
|
54
|
+
return fail("selector-not-found", `no element matches ${selector}`);
|
|
55
|
+
return ok();
|
|
56
|
+
}
|
|
57
|
+
// ── navigate ────────────────────────────────────────────────────────────────
|
|
58
|
+
export async function navigate(session, params, ctx) {
|
|
59
|
+
let s = session.ensure();
|
|
60
|
+
if (!s) {
|
|
61
|
+
const att = await session.attach(ctx.commandTimeoutMs);
|
|
62
|
+
if ("outcome" in att)
|
|
63
|
+
return fail(att.outcome, att.detail);
|
|
64
|
+
s = att.session;
|
|
65
|
+
}
|
|
66
|
+
const loadTimeoutMs = params.loadTimeoutMs ?? ctx.loadTimeoutMs;
|
|
67
|
+
const loadPromise = s.waitForEvent("Page.loadEventFired", loadTimeoutMs);
|
|
68
|
+
try {
|
|
69
|
+
await s.command("Page.navigate", { url: params.url }, ctx.commandTimeoutMs);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
return fail("navigate-failed", err instanceof Error ? err.message : String(err));
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
await loadPromise;
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
return fail("load-timeout", err instanceof Error ? err.message : String(err));
|
|
79
|
+
}
|
|
80
|
+
return ok({ url: params.url });
|
|
81
|
+
}
|
|
82
|
+
// ── snapshot ──────────────────────────────────────────────────────────────
|
|
83
|
+
const MAX_SNAPSHOT_NODES = 400;
|
|
84
|
+
/** In-page accessibility snapshot: role + accessible name + a unique CSS
|
|
85
|
+
* selector for each interactive/landmark element, computed in one evaluate. */
|
|
86
|
+
const SNAPSHOT_SCRIPT = `(() => {
|
|
87
|
+
function uniqueSelector(el) {
|
|
88
|
+
if (el.id) { const s = '#' + CSS.escape(el.id); try { if (document.querySelectorAll(s).length === 1) return s; } catch (e) {} }
|
|
89
|
+
const parts = [];
|
|
90
|
+
while (el && el.nodeType === 1 && el !== document.documentElement) {
|
|
91
|
+
let part = el.tagName.toLowerCase();
|
|
92
|
+
if (el.id) { try { const s = '#' + CSS.escape(el.id); if (document.querySelectorAll(s).length === 1) { parts.unshift(s); break; } } catch (e) {} }
|
|
93
|
+
const parent = el.parentElement;
|
|
94
|
+
if (parent) {
|
|
95
|
+
const same = Array.prototype.filter.call(parent.children, c => c.tagName === el.tagName);
|
|
96
|
+
if (same.length > 1) part += ':nth-of-type(' + (same.indexOf(el) + 1) + ')';
|
|
97
|
+
}
|
|
98
|
+
parts.unshift(part);
|
|
99
|
+
el = el.parentElement;
|
|
100
|
+
}
|
|
101
|
+
return parts.join(' > ');
|
|
102
|
+
}
|
|
103
|
+
function roleOf(el) {
|
|
104
|
+
const r = el.getAttribute('role'); if (r) return r;
|
|
105
|
+
const t = el.tagName.toLowerCase();
|
|
106
|
+
if (t === 'a' && el.hasAttribute('href')) return 'link';
|
|
107
|
+
if (t === 'button') return 'button';
|
|
108
|
+
if (t === 'input') { const ty = (el.getAttribute('type') || 'text').toLowerCase();
|
|
109
|
+
if (['button','submit','reset','image'].indexOf(ty) >= 0) return 'button';
|
|
110
|
+
if (ty === 'checkbox') return 'checkbox'; if (ty === 'radio') return 'radio';
|
|
111
|
+
return 'textbox'; }
|
|
112
|
+
if (t === 'select') return 'combobox';
|
|
113
|
+
if (t === 'textarea') return 'textbox';
|
|
114
|
+
if (/^h[1-6]$/.test(t)) return 'heading';
|
|
115
|
+
if (t === 'nav') return 'navigation'; if (t === 'main') return 'main';
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
function nameOf(el) {
|
|
119
|
+
const n = el.getAttribute('aria-label') || el.getAttribute('alt') || el.getAttribute('placeholder') || el.getAttribute('title') || (el.innerText || el.textContent || '');
|
|
120
|
+
return n.replace(/\\s+/g, ' ').trim().slice(0, 120);
|
|
121
|
+
}
|
|
122
|
+
const out = [];
|
|
123
|
+
const all = document.querySelectorAll('*');
|
|
124
|
+
for (let i = 0; i < all.length && out.length < ${MAX_SNAPSHOT_NODES}; i++) {
|
|
125
|
+
const el = all[i];
|
|
126
|
+
const role = roleOf(el);
|
|
127
|
+
if (!role) continue;
|
|
128
|
+
const rect = el.getBoundingClientRect();
|
|
129
|
+
if (rect.width === 0 && rect.height === 0) continue;
|
|
130
|
+
out.push({ role, name: nameOf(el), selector: uniqueSelector(el) });
|
|
131
|
+
}
|
|
132
|
+
return out;
|
|
133
|
+
})()`;
|
|
134
|
+
export async function snapshot(session, _params, ctx) {
|
|
135
|
+
const s = live(session);
|
|
136
|
+
if (isResult(s))
|
|
137
|
+
return s;
|
|
138
|
+
const r = await evalValue(s, SNAPSHOT_SCRIPT, ctx.commandTimeoutMs);
|
|
139
|
+
if ("errorText" in r)
|
|
140
|
+
return fail("evaluate-failed", r.errorText);
|
|
141
|
+
const nodes = r.value ?? [];
|
|
142
|
+
const lines = nodes.map((n) => `${n.role} ${JSON.stringify(n.name)} → ${n.selector}`);
|
|
143
|
+
const note = nodes.length >= MAX_SNAPSHOT_NODES ? ` (capped at ${MAX_SNAPSHOT_NODES} nodes)` : "";
|
|
144
|
+
return ok({ count: nodes.length, nodes, text: `${nodes.length} interactive/landmark nodes${note}:\n${lines.join("\n")}` });
|
|
145
|
+
}
|
|
146
|
+
// ── click / fill / fill-form / hover / select-option ────────────────────────
|
|
147
|
+
export async function click(session, params, ctx) {
|
|
148
|
+
const s = live(session);
|
|
149
|
+
if (isResult(s))
|
|
150
|
+
return s;
|
|
151
|
+
return actOnSelector(s, params.selector, "el.scrollIntoView({ block: 'center' }); if (typeof el.click === 'function') el.click(); else el.dispatchEvent(new MouseEvent('click', { bubbles: true }));", ctx.commandTimeoutMs);
|
|
152
|
+
}
|
|
153
|
+
function fillBody(value) {
|
|
154
|
+
const v = JSON.stringify(value);
|
|
155
|
+
return `if (el.isContentEditable) { el.focus(); el.textContent = ${v}; el.dispatchEvent(new Event('input', { bubbles: true })); }
|
|
156
|
+
else { el.focus(); el.value = ${v}; el.dispatchEvent(new Event('input', { bubbles: true })); el.dispatchEvent(new Event('change', { bubbles: true })); }`;
|
|
157
|
+
}
|
|
158
|
+
export async function fill(session, params, ctx) {
|
|
159
|
+
const s = live(session);
|
|
160
|
+
if (isResult(s))
|
|
161
|
+
return s;
|
|
162
|
+
return actOnSelector(s, params.selector, fillBody(params.value), ctx.commandTimeoutMs);
|
|
163
|
+
}
|
|
164
|
+
export async function fillForm(session, params, ctx) {
|
|
165
|
+
const s = live(session);
|
|
166
|
+
if (isResult(s))
|
|
167
|
+
return s;
|
|
168
|
+
const script = `(() => {
|
|
169
|
+
const fields = ${JSON.stringify(params.fields)};
|
|
170
|
+
const missing = [];
|
|
171
|
+
for (const f of fields) {
|
|
172
|
+
const el = document.querySelector(f.selector);
|
|
173
|
+
if (!el) { missing.push(f.selector); continue; }
|
|
174
|
+
if (el.isContentEditable) { el.focus(); el.textContent = f.value; el.dispatchEvent(new Event('input', { bubbles: true })); }
|
|
175
|
+
else { el.focus(); el.value = f.value; el.dispatchEvent(new Event('input', { bubbles: true })); el.dispatchEvent(new Event('change', { bubbles: true })); }
|
|
176
|
+
}
|
|
177
|
+
return { missing };
|
|
178
|
+
})()`;
|
|
179
|
+
const r = await evalValue(s, script, ctx.commandTimeoutMs);
|
|
180
|
+
if ("errorText" in r)
|
|
181
|
+
return fail("evaluate-failed", r.errorText);
|
|
182
|
+
const missing = r.value?.missing ?? [];
|
|
183
|
+
if (missing.length)
|
|
184
|
+
return fail("selector-not-found", `no element matches: ${missing.join(", ")}`);
|
|
185
|
+
return ok({ filled: params.fields.length });
|
|
186
|
+
}
|
|
187
|
+
export async function hover(session, params, ctx) {
|
|
188
|
+
const s = live(session);
|
|
189
|
+
if (isResult(s))
|
|
190
|
+
return s;
|
|
191
|
+
const body = `el.scrollIntoView({ block: 'center' });
|
|
192
|
+
for (const t of ['pointerover','mouseover','pointerenter','mouseenter','pointermove','mousemove']) el.dispatchEvent(new MouseEvent(t, { bubbles: true }));`;
|
|
193
|
+
return actOnSelector(s, params.selector, body, ctx.commandTimeoutMs);
|
|
194
|
+
}
|
|
195
|
+
export async function selectOption(session, params, ctx) {
|
|
196
|
+
const s = live(session);
|
|
197
|
+
if (isResult(s))
|
|
198
|
+
return s;
|
|
199
|
+
const script = `(() => {
|
|
200
|
+
const el = document.querySelector(${JSON.stringify(params.selector)});
|
|
201
|
+
if (!el) return { nf: true };
|
|
202
|
+
const wantValue = ${params.value !== undefined ? JSON.stringify(params.value) : "null"};
|
|
203
|
+
const wantLabel = ${params.label !== undefined ? JSON.stringify(params.label) : "null"};
|
|
204
|
+
let matched = null;
|
|
205
|
+
for (const opt of Array.from(el.options || [])) {
|
|
206
|
+
if (wantValue !== null && opt.value === wantValue) { matched = opt; break; }
|
|
207
|
+
if (wantLabel !== null && (opt.label === wantLabel || opt.textContent.trim() === wantLabel)) { matched = opt; break; }
|
|
208
|
+
}
|
|
209
|
+
if (!matched) return { noopt: true };
|
|
210
|
+
el.value = matched.value;
|
|
211
|
+
el.dispatchEvent(new Event('input', { bubbles: true }));
|
|
212
|
+
el.dispatchEvent(new Event('change', { bubbles: true }));
|
|
213
|
+
return { ok: true };
|
|
214
|
+
})()`;
|
|
215
|
+
const r = await evalValue(s, script, ctx.commandTimeoutMs);
|
|
216
|
+
if ("errorText" in r)
|
|
217
|
+
return fail("evaluate-failed", r.errorText);
|
|
218
|
+
const v = r.value;
|
|
219
|
+
if (v?.nf)
|
|
220
|
+
return fail("selector-not-found", `no element matches ${params.selector}`);
|
|
221
|
+
if (v?.noopt)
|
|
222
|
+
return fail("option-not-found", `no option matches value=${params.value ?? ""} label=${params.label ?? ""}`);
|
|
223
|
+
return ok();
|
|
224
|
+
}
|
|
225
|
+
// ── type / press-key ────────────────────────────────────────────────────────
|
|
226
|
+
export async function type(session, params, ctx) {
|
|
227
|
+
const s = live(session);
|
|
228
|
+
if (isResult(s))
|
|
229
|
+
return s;
|
|
230
|
+
if (params.selector) {
|
|
231
|
+
const focusRes = await actOnSelector(s, params.selector, "el.focus();", ctx.commandTimeoutMs);
|
|
232
|
+
if (!focusRes.ok)
|
|
233
|
+
return focusRes;
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
await s.command("Input.insertText", { text: params.text }, ctx.commandTimeoutMs);
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
return fail("error", err instanceof Error ? err.message : String(err));
|
|
240
|
+
}
|
|
241
|
+
return ok();
|
|
242
|
+
}
|
|
243
|
+
const KEY_MAP = {
|
|
244
|
+
Enter: { key: "Enter", code: "Enter", keyCode: 13, text: "\r" },
|
|
245
|
+
Tab: { key: "Tab", code: "Tab", keyCode: 9 },
|
|
246
|
+
Escape: { key: "Escape", code: "Escape", keyCode: 27 },
|
|
247
|
+
Backspace: { key: "Backspace", code: "Backspace", keyCode: 8 },
|
|
248
|
+
Delete: { key: "Delete", code: "Delete", keyCode: 46 },
|
|
249
|
+
ArrowUp: { key: "ArrowUp", code: "ArrowUp", keyCode: 38 },
|
|
250
|
+
ArrowDown: { key: "ArrowDown", code: "ArrowDown", keyCode: 40 },
|
|
251
|
+
ArrowLeft: { key: "ArrowLeft", code: "ArrowLeft", keyCode: 37 },
|
|
252
|
+
ArrowRight: { key: "ArrowRight", code: "ArrowRight", keyCode: 39 },
|
|
253
|
+
Home: { key: "Home", code: "Home", keyCode: 36 },
|
|
254
|
+
End: { key: "End", code: "End", keyCode: 35 },
|
|
255
|
+
PageUp: { key: "PageUp", code: "PageUp", keyCode: 33 },
|
|
256
|
+
PageDown: { key: "PageDown", code: "PageDown", keyCode: 34 },
|
|
257
|
+
Space: { key: " ", code: "Space", keyCode: 32, text: " " },
|
|
258
|
+
};
|
|
259
|
+
export async function pressKey(session, params, ctx) {
|
|
260
|
+
const s = live(session);
|
|
261
|
+
if (isResult(s))
|
|
262
|
+
return s;
|
|
263
|
+
let spec = KEY_MAP[params.key];
|
|
264
|
+
if (!spec) {
|
|
265
|
+
if (params.key.length === 1)
|
|
266
|
+
spec = { key: params.key, code: `Key${params.key.toUpperCase()}`, keyCode: params.key.toUpperCase().charCodeAt(0), text: params.key };
|
|
267
|
+
else
|
|
268
|
+
return fail("unsupported-key", `unknown key "${params.key}" (single chars and ${Object.keys(KEY_MAP).join(", ")} are supported)`);
|
|
269
|
+
}
|
|
270
|
+
const base = { key: spec.key, code: spec.code, windowsVirtualKeyCode: spec.keyCode, nativeVirtualKeyCode: spec.keyCode };
|
|
271
|
+
try {
|
|
272
|
+
await s.command("Input.dispatchKeyEvent", { type: spec.text ? "keyDown" : "rawKeyDown", ...base, ...(spec.text ? { text: spec.text } : {}) }, ctx.commandTimeoutMs);
|
|
273
|
+
await s.command("Input.dispatchKeyEvent", { type: "keyUp", ...base }, ctx.commandTimeoutMs);
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
return fail("error", err instanceof Error ? err.message : String(err));
|
|
277
|
+
}
|
|
278
|
+
return ok();
|
|
279
|
+
}
|
|
280
|
+
// ── wait-for ────────────────────────────────────────────────────────────────
|
|
281
|
+
export async function waitFor(session, params, ctx) {
|
|
282
|
+
const s = live(session);
|
|
283
|
+
if (isResult(s))
|
|
284
|
+
return s;
|
|
285
|
+
if (!params.selector && !params.text)
|
|
286
|
+
return fail("error", "wait-for requires selector or text");
|
|
287
|
+
const deadline = Date.now() + (params.timeoutMs ?? ctx.loadTimeoutMs);
|
|
288
|
+
const probe = params.selector
|
|
289
|
+
? `!!document.querySelector(${JSON.stringify(params.selector)})`
|
|
290
|
+
: `(document.body && document.body.innerText || '').indexOf(${JSON.stringify(params.text)}) >= 0`;
|
|
291
|
+
// eslint-disable-next-line no-constant-condition
|
|
292
|
+
while (true) {
|
|
293
|
+
if (!session.ensure())
|
|
294
|
+
return SESSION_LOST;
|
|
295
|
+
const r = await evalValue(s, probe, ctx.commandTimeoutMs);
|
|
296
|
+
if ("errorText" in r)
|
|
297
|
+
return fail("evaluate-failed", r.errorText);
|
|
298
|
+
if (r.value === true)
|
|
299
|
+
return ok();
|
|
300
|
+
if (Date.now() >= deadline)
|
|
301
|
+
return fail("wait-timeout", `condition not met within timeout (${params.selector ? `selector ${params.selector}` : `text ${JSON.stringify(params.text)}`})`);
|
|
302
|
+
await new Promise((res) => setTimeout(res, 250));
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// ── handle-dialog ───────────────────────────────────────────────────────────
|
|
306
|
+
export function handleDialog(session, params) {
|
|
307
|
+
session.setDialogPolicy({ accept: params.accept, promptText: params.promptText });
|
|
308
|
+
return ok({ armed: { accept: params.accept, promptText: params.promptText ?? null } });
|
|
309
|
+
}
|
|
310
|
+
// ── evaluate ────────────────────────────────────────────────────────────────
|
|
311
|
+
export async function evaluate(session, params, ctx) {
|
|
312
|
+
const s = live(session);
|
|
313
|
+
if (isResult(s))
|
|
314
|
+
return s;
|
|
315
|
+
const r = await evalValue(s, params.expression, ctx.commandTimeoutMs, true);
|
|
316
|
+
if ("errorText" in r)
|
|
317
|
+
return fail("evaluate-failed", r.errorText);
|
|
318
|
+
return ok({ value: r.value });
|
|
319
|
+
}
|
|
320
|
+
// ── console-messages ────────────────────────────────────────────────────────
|
|
321
|
+
export function consoleMessages(session) {
|
|
322
|
+
const messages = session.drainConsole();
|
|
323
|
+
const dialogWarn = session.takeUnhandledDialogFlag() ? " (a dialog opened with no policy armed and was dismissed)" : "";
|
|
324
|
+
return ok({ messages, text: messages.length ? messages.join("\n") + dialogWarn : `no buffered console messages${dialogWarn}` });
|
|
325
|
+
}
|
|
326
|
+
// ── tabs ────────────────────────────────────────────────────────────────────
|
|
327
|
+
export async function tabs(session, params, ctx) {
|
|
328
|
+
switch (params.action) {
|
|
329
|
+
case "list": {
|
|
330
|
+
const r = await listTargets(ctx.deps, ctx.commandTimeoutMs);
|
|
331
|
+
if ("outcome" in r)
|
|
332
|
+
return fail(r.outcome, r.detail);
|
|
333
|
+
session.ensure(); // drop a dead-page reference so `active` is not phantom
|
|
334
|
+
const active = session.currentTargetId();
|
|
335
|
+
const pages = r.targets.filter((t) => t.type === undefined || t.type === "page");
|
|
336
|
+
return ok({ tabs: pages.map((t) => ({ id: t.id, url: t.url ?? "", title: t.title ?? "", active: t.id === active })) });
|
|
337
|
+
}
|
|
338
|
+
case "new": {
|
|
339
|
+
const att = await session.attach(ctx.commandTimeoutMs);
|
|
340
|
+
if ("outcome" in att)
|
|
341
|
+
return fail(att.outcome, att.detail);
|
|
342
|
+
if (params.url) {
|
|
343
|
+
const nav = await navigate(session, { url: params.url }, ctx);
|
|
344
|
+
if (!nav.ok)
|
|
345
|
+
return nav;
|
|
346
|
+
}
|
|
347
|
+
return ok({ activeTargetId: session.currentTargetId() });
|
|
348
|
+
}
|
|
349
|
+
case "select": {
|
|
350
|
+
if (!params.id)
|
|
351
|
+
return fail("error", "tabs select requires id");
|
|
352
|
+
const r = await listTargets(ctx.deps, ctx.commandTimeoutMs);
|
|
353
|
+
if ("outcome" in r)
|
|
354
|
+
return fail(r.outcome, r.detail);
|
|
355
|
+
const target = r.targets.find((t) => t.id === params.id);
|
|
356
|
+
if (!target)
|
|
357
|
+
return fail("error", `no tab with id ${params.id}`);
|
|
358
|
+
const att = await session.attach(ctx.commandTimeoutMs, { id: target.id, webSocketDebuggerUrl: target.webSocketDebuggerUrl });
|
|
359
|
+
if ("outcome" in att)
|
|
360
|
+
return fail(att.outcome, att.detail);
|
|
361
|
+
return ok({ activeTargetId: session.currentTargetId() });
|
|
362
|
+
}
|
|
363
|
+
case "close": {
|
|
364
|
+
if (!params.id)
|
|
365
|
+
return fail("error", "tabs close requires id");
|
|
366
|
+
if (params.id === session.currentTargetId())
|
|
367
|
+
await session.close(ctx.commandTimeoutMs);
|
|
368
|
+
else
|
|
369
|
+
await closeTarget(ctx.deps, params.id);
|
|
370
|
+
return ok({ closed: params.id });
|
|
371
|
+
}
|
|
372
|
+
default:
|
|
373
|
+
return fail("error", `unknown tabs action ${String(params.action)}`);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
// ── pdf-save / screenshot / resize ──────────────────────────────────────────
|
|
377
|
+
export async function pdfSave(session, params, ctx) {
|
|
378
|
+
const s = live(session);
|
|
379
|
+
if (isResult(s))
|
|
380
|
+
return s;
|
|
381
|
+
let res;
|
|
382
|
+
try {
|
|
383
|
+
res = (await s.command("Page.printToPDF", {
|
|
384
|
+
printBackground: params.printBackground ?? true,
|
|
385
|
+
landscape: params.landscape ?? false,
|
|
386
|
+
scale: params.scale ?? 1,
|
|
387
|
+
preferCSSPageSize: true,
|
|
388
|
+
transferMode: "ReturnAsBase64",
|
|
389
|
+
}, Math.max(ctx.commandTimeoutMs, 60_000)));
|
|
390
|
+
}
|
|
391
|
+
catch (err) {
|
|
392
|
+
return fail("pdf-failed", err instanceof Error ? err.message : String(err));
|
|
393
|
+
}
|
|
394
|
+
if (!res?.data)
|
|
395
|
+
return fail("pdf-failed", "Page.printToPDF returned no data");
|
|
396
|
+
const buf = Buffer.from(res.data, "base64");
|
|
397
|
+
try {
|
|
398
|
+
await ctx.writeFile(params.path, buf);
|
|
399
|
+
}
|
|
400
|
+
catch (err) {
|
|
401
|
+
return fail("error", `write failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
402
|
+
}
|
|
403
|
+
return ok({ path: params.path, bytes: buf.length });
|
|
404
|
+
}
|
|
405
|
+
export async function screenshot(session, params, ctx) {
|
|
406
|
+
const s = live(session);
|
|
407
|
+
if (isResult(s))
|
|
408
|
+
return s;
|
|
409
|
+
let clip;
|
|
410
|
+
if (params.selector) {
|
|
411
|
+
const r = await evalValue(s, `(() => { const el = document.querySelector(${JSON.stringify(params.selector)}); if (!el) return { nf: true }; const r = el.getBoundingClientRect(); return { x: r.x + window.scrollX, y: r.y + window.scrollY, width: r.width, height: r.height }; })()`, ctx.commandTimeoutMs);
|
|
412
|
+
if ("errorText" in r)
|
|
413
|
+
return fail("evaluate-failed", r.errorText);
|
|
414
|
+
const v = r.value;
|
|
415
|
+
if (v?.nf)
|
|
416
|
+
return fail("selector-not-found", `no element matches ${params.selector}`);
|
|
417
|
+
if (!v?.width || !v?.height)
|
|
418
|
+
return fail("screenshot-failed", `element ${params.selector} has zero size`);
|
|
419
|
+
clip = { x: v.x ?? 0, y: v.y ?? 0, width: v.width, height: v.height, scale: 1 };
|
|
420
|
+
}
|
|
421
|
+
let res;
|
|
422
|
+
try {
|
|
423
|
+
res = (await s.command("Page.captureScreenshot", {
|
|
424
|
+
format: "png",
|
|
425
|
+
...(clip ? { clip } : {}),
|
|
426
|
+
...(params.fullPage ? { captureBeyondViewport: true } : {}),
|
|
427
|
+
}, Math.max(ctx.commandTimeoutMs, 30_000)));
|
|
428
|
+
}
|
|
429
|
+
catch (err) {
|
|
430
|
+
return fail("screenshot-failed", err instanceof Error ? err.message : String(err));
|
|
431
|
+
}
|
|
432
|
+
if (!res?.data)
|
|
433
|
+
return fail("screenshot-failed", "Page.captureScreenshot returned no data");
|
|
434
|
+
const buf = Buffer.from(res.data, "base64");
|
|
435
|
+
try {
|
|
436
|
+
await ctx.writeFile(params.path, buf);
|
|
437
|
+
}
|
|
438
|
+
catch (err) {
|
|
439
|
+
return fail("error", `write failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
440
|
+
}
|
|
441
|
+
return ok({ path: params.path, bytes: buf.length });
|
|
442
|
+
}
|
|
443
|
+
export async function resize(session, params, ctx) {
|
|
444
|
+
const s = live(session);
|
|
445
|
+
if (isResult(s))
|
|
446
|
+
return s;
|
|
447
|
+
try {
|
|
448
|
+
await s.command("Emulation.setDeviceMetricsOverride", { width: params.width, height: params.height, deviceScaleFactor: 1, mobile: false }, ctx.commandTimeoutMs);
|
|
449
|
+
}
|
|
450
|
+
catch (err) {
|
|
451
|
+
return fail("error", err instanceof Error ? err.message : String(err));
|
|
452
|
+
}
|
|
453
|
+
return ok({ width: params.width, height: params.height });
|
|
454
|
+
}
|
|
455
|
+
//# sourceMappingURL=cdp-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp-actions.js","sourceRoot":"","sources":["../../src/lib/cdp-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAGL,WAAW,EAEX,WAAW,GAGZ,MAAM,kBAAkB,CAAC;AA2B1B,MAAM,EAAE,GAAG,CAAC,IAAc,EAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACjF,MAAM,IAAI,GAAG,CAAC,OAAsB,EAAE,MAAc,EAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AACxG,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,4CAA4C,CAAC,CAAC;AAExF,yDAAyD;AACzD,SAAS,IAAI,CAAC,OAAuB;IACnC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,IAAI,YAAY,CAAC;AAC3B,CAAC;AACD,SAAS,QAAQ,CAAC,CAA4B;IAC5C,OAAQ,CAAkB,CAAC,OAAO,KAAK,SAAS,IAAI,OAAQ,CAAkB,CAAC,EAAE,KAAK,SAAS,CAAC;AAClG,CAAC;AAKD,mFAAmF;AACnF,KAAK,UAAU,SAAS,CACtB,CAAa,EACb,UAAkB,EAClB,SAAiB,EACjB,YAAY,GAAG,KAAK;IAEpB,IAAI,GAAiH,CAAC;IACtH,IAAI,CAAC;QACH,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,SAAS,CAAC,CAAe,CAAC;IAC1H,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,SAAS,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACzE,CAAC;IACD,IAAI,GAAG,EAAE,gBAAgB,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,GAAG,CAAC,gBAAgB,CAAC;QAChC,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,WAAW,IAAI,EAAE,CAAC,IAAI,IAAI,gBAAgB,EAAE,CAAC;IACjF,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC;AAED,mFAAmF;AACnF,SAAS,cAAc,CAAC,QAAgB,EAAE,IAAY;IACpD,OAAO,8CAA8C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,oCAAoC,IAAI,4BAA4B,CAAC;AACpJ,CAAC;AAED,+EAA+E;AAC/E,KAAK,UAAU,aAAa,CAC1B,CAAa,EACb,QAAgB,EAChB,IAAY,EACZ,SAAiB;IAEjB,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;IACxE,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IAClE,MAAM,CAAC,GAAG,CAAC,CAAC,KAA8C,CAAC;IAC3D,IAAI,CAAC,EAAE,EAAE;QAAE,OAAO,IAAI,CAAC,oBAAoB,EAAE,sBAAsB,QAAQ,EAAE,CAAC,CAAC;IAC/E,OAAO,EAAE,EAAE,CAAC;AACd,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAAuB,EACvB,MAA+C,EAC/C,GAAc;IAEd,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IACzB,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACvD,IAAI,SAAS,IAAI,GAAG;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3D,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC;IAClB,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,GAAG,CAAC,aAAa,CAAC;IAChE,MAAM,WAAW,GAAG,CAAC,CAAC,YAAY,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,iBAAiB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,CAAC;QACH,MAAM,WAAW,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,cAAc,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,6EAA6E;AAE7E,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B;gFACgF;AAChF,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mDAsC2B,kBAAkB;;;;;;;;;KAShE,CAAC;AAEN,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAuB,EAAE,OAA8B,EAAE,GAAc;IACpG,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACpE,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IAClE,MAAM,KAAK,GAAI,CAAC,CAAC,KAAiE,IAAI,EAAE,CAAC;IACzF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtF,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC,eAAe,kBAAkB,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAClG,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,8BAA8B,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7H,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAuB,EAAE,MAA4B,EAAE,GAAc;IAC/F,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,OAAO,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,4JAA4J,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC/N,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,4DAA4D,CAAC;oCAClC,CAAC,wHAAwH,CAAC;AAC9J,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAuB,EAAE,MAA2C,EAAE,GAAc;IAC7G,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,OAAO,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAAuB,EACvB,MAA8D,EAC9D,GAAc;IAEd,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG;qBACI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;;;;;;;;;OAS3C,CAAC;IACN,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC3D,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IAClE,MAAM,OAAO,GAAI,CAAC,CAAC,KAAgC,EAAE,OAAO,IAAI,EAAE,CAAC;IACnE,IAAI,OAAO,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,oBAAoB,EAAE,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnG,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAuB,EAAE,MAA4B,EAAE,GAAc;IAC/F,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG;+JACgJ,CAAC;IAC9J,OAAO,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAuB,EACvB,MAA4D,EAC5D,GAAc;IAEd,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG;wCACuB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;;wBAE/C,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;wBAClE,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;;;;;;;;;;;OAWnF,CAAC;IACN,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC3D,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IAClE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAiD,CAAC;IAC9D,IAAI,CAAC,EAAE,EAAE;QAAE,OAAO,IAAI,CAAC,oBAAoB,EAAE,sBAAsB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC,EAAE,KAAK;QAAE,OAAO,IAAI,CAAC,kBAAkB,EAAE,2BAA2B,MAAM,CAAC,KAAK,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;IAC3H,OAAO,EAAE,EAAE,CAAC;AACd,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAuB,EACvB,MAA2C,EAC3C,GAAc;IAEd,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9F,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,QAAQ,CAAC;IACpC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,EAAE,CAAC;AACd,CAAC;AAED,MAAM,OAAO,GAAkF;IAC7F,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;IAC/D,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IAC5C,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;IACtD,SAAS,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE;IAC9D,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;IACtD,OAAO,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;IACzD,SAAS,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;IAC/D,SAAS,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;IAC/D,UAAU,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE;IAClE,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;IAChD,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;IAC7C,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;IACtD,QAAQ,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;IAC5D,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE;CAC3D,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAuB,EAAE,MAAuB,EAAE,GAAc;IAC7F,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,IAAI,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;;YAC9J,OAAO,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,MAAM,CAAC,GAAG,uBAAuB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACzI,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,qBAAqB,EAAE,IAAI,CAAC,OAAO,EAAE,oBAAoB,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACzH,IAAI,CAAC;QACH,MAAM,CAAC,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACpK,MAAM,CAAC,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,EAAE,CAAC;AACd,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,OAAuB,EACvB,MAAgE,EAChE,GAAc;IAEd,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,oCAAoC,CAAC,CAAC;IACjG,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ;QAC3B,CAAC,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG;QAChE,CAAC,CAAC,4DAA4D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;IACpG,iDAAiD;IACjD,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAAE,OAAO,YAAY,CAAC;QAC3C,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC1D,IAAI,WAAW,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;QAClE,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI;YAAE,OAAO,EAAE,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;YAAE,OAAO,IAAI,CAAC,cAAc,EAAE,qCAAqC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACzL,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,YAAY,CAAC,OAAuB,EAAE,MAAgD;IACpG,OAAO,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAClF,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAuB,EAAE,MAA8B,EAAE,GAAc;IACpG,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAC5E,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IAClE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,eAAe,CAAC,OAAuB;IACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC,2DAA2D,CAAC,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,+BAA+B,UAAU,EAAE,EAAE,CAAC,CAAC;AAClI,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAuB,EACvB,MAAkF,EAClF,GAAc;IAEd,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC5D,IAAI,SAAS,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACrD,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,wDAAwD;YAC1E,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YACjF,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACzH,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACvD,IAAI,SAAS,IAAI,GAAG;gBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3D,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC9D,IAAI,CAAC,GAAG,CAAC,EAAE;oBAAE,OAAO,GAAG,CAAC;YAC1B,CAAC;YACD,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;YAChE,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC5D,IAAI,SAAS,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC,OAAO,EAAE,kBAAkB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YACjE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC;YAC7H,IAAI,SAAS,IAAI,GAAG;gBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3D,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;YAC/D,IAAI,MAAM,CAAC,EAAE,KAAK,OAAO,CAAC,eAAe,EAAE;gBAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;;gBAClF,MAAM,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;QACD;YACE,OAAO,IAAI,CAAC,OAAO,EAAE,uBAAuB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,OAAuB,EACvB,MAAwF,EACxF,GAAc;IAEd,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,IAAI,GAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CACpB,iBAAiB,EACjB;YACE,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,IAAI;YAC/C,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;YACpC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;YACxB,iBAAiB,EAAE,IAAI;YACvB,YAAY,EAAE,gBAAgB;SAC/B,EACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CACvC,CAAsB,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,IAAI;QAAE,OAAO,IAAI,CAAC,YAAY,EAAE,kCAAkC,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,OAAO,EAAE,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAuB,EACvB,MAA+D,EAC/D,GAAc;IAEd,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,IAAI,IAAwF,CAAC;IAC7F,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,MAAM,SAAS,CACvB,CAAC,EACD,8CAA8C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,4KAA4K,EACzP,GAAG,CAAC,gBAAgB,CACrB,CAAC;QACF,IAAI,WAAW,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;QAClE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAyF,CAAC;QACtG,IAAI,CAAC,EAAE,EAAE;YAAE,OAAO,IAAI,CAAC,oBAAoB,EAAE,sBAAsB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtF,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE,MAAM;YAAE,OAAO,IAAI,CAAC,mBAAmB,EAAE,WAAW,MAAM,CAAC,QAAQ,gBAAgB,CAAC,CAAC;QAC1G,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAClF,CAAC;IACD,IAAI,GAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CACpB,wBAAwB,EACxB;YACE,MAAM,EAAE,KAAK;YACb,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,EACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CACvC,CAAsB,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,mBAAmB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,IAAI;QAAE,OAAO,IAAI,CAAC,mBAAmB,EAAE,yCAAyC,CAAC,CAAC;IAC5F,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,OAAO,EAAE,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAuB,EAAE,MAAyC,EAAE,GAAc;IAC7G,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,CAAC,CAAC,OAAO,CACb,oCAAoC,EACpC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EACnF,GAAG,CAAC,gBAAgB,CACrB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Render a JS-heavy page in the device's existing Chromium and return its DOM.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* Lifecycle (HTTP for target create/close, WebSocket for page control):
|
|
4
|
+
* This is the stateless retrieval path: each call creates its own blank target,
|
|
5
|
+
* navigates, reads the rendered DOM, and closes the target. Interactive
|
|
6
|
+
* automation (which keeps a page alive across calls) lives in cdp-actions.ts on
|
|
7
|
+
* a persistent BrowserSession. Both share the transport primitives in
|
|
8
|
+
* cdp-session.ts.
|
|
10
9
|
*
|
|
11
10
|
* PUT /json/new create a blank target, get its WS URL
|
|
12
11
|
* │
|
|
@@ -18,11 +17,11 @@
|
|
|
18
17
|
* │
|
|
19
18
|
* ▼
|
|
20
19
|
* PUT /json/close/<id> always, even on the error paths above
|
|
21
|
-
*
|
|
22
|
-
* `fetch` and `WebSocket` are injected so the unit tests drive every branch
|
|
23
|
-
* without a real browser; production passes the Node 22 globals.
|
|
24
20
|
*/
|
|
25
|
-
|
|
21
|
+
import { type CdpDeps, type CdpOutcome } from "./cdp-session.js";
|
|
22
|
+
export type RenderDeps = CdpDeps;
|
|
23
|
+
export type { MinimalWebSocket, WebSocketCtor } from "./cdp-session.js";
|
|
24
|
+
export type RenderOutcome = CdpOutcome;
|
|
26
25
|
export interface RenderResult {
|
|
27
26
|
url: string;
|
|
28
27
|
rendered: boolean;
|
|
@@ -32,27 +31,6 @@ export interface RenderResult {
|
|
|
32
31
|
html: string;
|
|
33
32
|
detail?: string;
|
|
34
33
|
}
|
|
35
|
-
/** Minimal structural shape of the browser-style WebSocket this module uses.
|
|
36
|
-
* Both the Node 22 global and the test fake satisfy it. */
|
|
37
|
-
export interface MinimalWebSocket {
|
|
38
|
-
send(data: string): void;
|
|
39
|
-
close(): void;
|
|
40
|
-
addEventListener(type: "open", listener: () => void): void;
|
|
41
|
-
addEventListener(type: "message", listener: (ev: {
|
|
42
|
-
data: unknown;
|
|
43
|
-
}) => void): void;
|
|
44
|
-
addEventListener(type: "error", listener: (ev: unknown) => void): void;
|
|
45
|
-
addEventListener(type: "close", listener: () => void): void;
|
|
46
|
-
}
|
|
47
|
-
export type WebSocketCtor = new (url: string) => MinimalWebSocket;
|
|
48
|
-
export interface RenderDeps {
|
|
49
|
-
fetchImpl: typeof fetch;
|
|
50
|
-
/** The Node 22 global `WebSocket`, or undefined on a runtime that lacks it. */
|
|
51
|
-
WebSocketImpl: WebSocketCtor | undefined;
|
|
52
|
-
cdpHost: string;
|
|
53
|
-
cdpPort: number;
|
|
54
|
-
log: (line: string) => void;
|
|
55
|
-
}
|
|
56
34
|
export interface RenderOptions {
|
|
57
35
|
/** Cap on the whole navigate→load wait. */
|
|
58
36
|
loadTimeoutMs?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdp-render.d.ts","sourceRoot":"","sources":["../../src/lib/cdp-render.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cdp-render.d.ts","sourceRoot":"","sources":["../../src/lib/cdp-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAOL,KAAK,OAAO,EACZ,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC;AACjC,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAExE,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC;AAEvC,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;yBAEyB;AACzB,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,YAAY,CAAC,CAqEvB"}
|