@farmslot/recipe-harness 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/CHANGELOG.md +7 -0
- package/README.md +207 -0
- package/bin/farmslot-recipe.mjs +10 -0
- package/dist/adapters/core.d.ts +5 -0
- package/dist/adapters/core.d.ts.map +1 -0
- package/dist/adapters/core.js +438 -0
- package/dist/adapters/core.js.map +1 -0
- package/dist/adapters/ui.d.ts +23 -0
- package/dist/adapters/ui.d.ts.map +1 -0
- package/dist/adapters/ui.js +41 -0
- package/dist/adapters/ui.js.map +1 -0
- package/dist/cli/run-command.d.ts +3 -0
- package/dist/cli/run-command.d.ts.map +1 -0
- package/dist/cli/run-command.js +41 -0
- package/dist/cli/run-command.js.map +1 -0
- package/dist/cli/validate-command.d.ts +3 -0
- package/dist/cli/validate-command.d.ts.map +1 -0
- package/dist/cli/validate-command.js +31 -0
- package/dist/cli/validate-command.js.map +1 -0
- package/dist/cli-support.d.ts +14 -0
- package/dist/cli-support.d.ts.map +1 -0
- package/dist/cli-support.js +94 -0
- package/dist/cli-support.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +29 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +9 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +74 -0
- package/dist/json.js.map +1 -0
- package/dist/runner.d.ts +4 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +1172 -0
- package/dist/runner.js.map +1 -0
- package/dist/runtime/browser-extension.d.ts +17 -0
- package/dist/runtime/browser-extension.d.ts.map +1 -0
- package/dist/runtime/browser-extension.js +42 -0
- package/dist/runtime/browser-extension.js.map +1 -0
- package/dist/runtime/cdp.d.ts +86 -0
- package/dist/runtime/cdp.d.ts.map +1 -0
- package/dist/runtime/cdp.js +512 -0
- package/dist/runtime/cdp.js.map +1 -0
- package/dist/runtime/react-native-bridge.d.ts +17 -0
- package/dist/runtime/react-native-bridge.d.ts.map +1 -0
- package/dist/runtime/react-native-bridge.js +24 -0
- package/dist/runtime/react-native-bridge.js.map +1 -0
- package/dist/types.d.ts +143 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/writers.d.ts +23 -0
- package/dist/writers.d.ts.map +1 -0
- package/dist/writers.js +72 -0
- package/dist/writers.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import WebSocket from 'ws';
|
|
4
|
+
import { asNumber, asOptionalString, asString, isRecord } from '../json.js';
|
|
5
|
+
export function sleep(ms) {
|
|
6
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
7
|
+
}
|
|
8
|
+
export function dataTestId(testId) {
|
|
9
|
+
return `[data-testid="${escapeCssAttrValue(testId)}"]`;
|
|
10
|
+
}
|
|
11
|
+
export async function jsonGet(url) {
|
|
12
|
+
const response = await fetch(url);
|
|
13
|
+
if (!response.ok)
|
|
14
|
+
throw new Error(`GET ${url} failed with HTTP ${response.status}.`);
|
|
15
|
+
return (await response.json());
|
|
16
|
+
}
|
|
17
|
+
export async function retryJsonGet(url, options = {}) {
|
|
18
|
+
const timeoutMs = options.timeoutMs ?? 5_000;
|
|
19
|
+
const intervalMs = options.intervalMs ?? 100;
|
|
20
|
+
const deadline = Date.now() + timeoutMs;
|
|
21
|
+
let lastError;
|
|
22
|
+
while (Date.now() <= deadline) {
|
|
23
|
+
try {
|
|
24
|
+
return await jsonGet(url);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
// Expected while a browser/debug target is still starting; retry until the caller's deadline.
|
|
28
|
+
lastError = error;
|
|
29
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const message = lastError instanceof Error ? lastError.message : String(lastError);
|
|
33
|
+
throw new Error(`GET ${url} did not succeed within ${timeoutMs}ms: ${message}`);
|
|
34
|
+
}
|
|
35
|
+
export async function listCdpTargets(host, port) {
|
|
36
|
+
return retryJsonGet(`http://${host}:${port}/json`);
|
|
37
|
+
}
|
|
38
|
+
export async function selectCdpTarget(options) {
|
|
39
|
+
const host = options.host ?? '127.0.0.1';
|
|
40
|
+
const targets = await listCdpTargets(host, options.port);
|
|
41
|
+
const selected = targets.find((target) => {
|
|
42
|
+
if (options.type && target.type !== options.type)
|
|
43
|
+
return false;
|
|
44
|
+
if (options.urlIncludes && !target.url?.includes(options.urlIncludes))
|
|
45
|
+
return false;
|
|
46
|
+
if (options.titleIncludes && !target.title?.includes(options.titleIncludes))
|
|
47
|
+
return false;
|
|
48
|
+
if (options.predicate && !options.predicate(target))
|
|
49
|
+
return false;
|
|
50
|
+
return true;
|
|
51
|
+
});
|
|
52
|
+
if (!selected) {
|
|
53
|
+
throw new Error(`No CDP target matched ${JSON.stringify({
|
|
54
|
+
host,
|
|
55
|
+
port: options.port,
|
|
56
|
+
type: options.type,
|
|
57
|
+
urlIncludes: options.urlIncludes,
|
|
58
|
+
titleIncludes: options.titleIncludes,
|
|
59
|
+
})}.`);
|
|
60
|
+
}
|
|
61
|
+
return selected;
|
|
62
|
+
}
|
|
63
|
+
export class CdpSession {
|
|
64
|
+
#ws;
|
|
65
|
+
#pending = new Map();
|
|
66
|
+
#nextId = 0;
|
|
67
|
+
constructor(ws) {
|
|
68
|
+
this.#ws = ws;
|
|
69
|
+
ws.on('message', (buffer) => this.#handleMessage(buffer.toString()));
|
|
70
|
+
ws.on('error', (error) => this.#rejectAll(error));
|
|
71
|
+
ws.on('close', () => this.#rejectAll(new Error('CDP websocket closed.')));
|
|
72
|
+
}
|
|
73
|
+
static async connect(webSocketDebuggerUrl) {
|
|
74
|
+
const ws = new WebSocket(webSocketDebuggerUrl);
|
|
75
|
+
await new Promise((resolve, reject) => {
|
|
76
|
+
ws.once('open', resolve);
|
|
77
|
+
ws.once('error', reject);
|
|
78
|
+
});
|
|
79
|
+
return new CdpSession(ws);
|
|
80
|
+
}
|
|
81
|
+
async call(method, params = {}) {
|
|
82
|
+
const id = ++this.#nextId;
|
|
83
|
+
const response = new Promise((resolve, reject) => {
|
|
84
|
+
this.#pending.set(id, {
|
|
85
|
+
resolve(value) {
|
|
86
|
+
resolve(value);
|
|
87
|
+
},
|
|
88
|
+
reject,
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
this.#ws.send(JSON.stringify({ id, method, params }));
|
|
92
|
+
return response;
|
|
93
|
+
}
|
|
94
|
+
close() {
|
|
95
|
+
this.#ws.close();
|
|
96
|
+
}
|
|
97
|
+
#handleMessage(text) {
|
|
98
|
+
const message = JSON.parse(text);
|
|
99
|
+
if (message.id == null)
|
|
100
|
+
return;
|
|
101
|
+
const pending = this.#pending.get(message.id);
|
|
102
|
+
if (!pending)
|
|
103
|
+
return;
|
|
104
|
+
this.#pending.delete(message.id);
|
|
105
|
+
if (message.error) {
|
|
106
|
+
pending.reject(new Error(message.error.message ?? 'CDP call failed.'));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
pending.resolve(message.result);
|
|
110
|
+
}
|
|
111
|
+
#rejectAll(error) {
|
|
112
|
+
for (const pending of this.#pending.values())
|
|
113
|
+
pending.reject(error);
|
|
114
|
+
this.#pending.clear();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export class CdpWebPage {
|
|
118
|
+
constructor(session) {
|
|
119
|
+
this.session = session;
|
|
120
|
+
}
|
|
121
|
+
static async connectToTarget(target) {
|
|
122
|
+
if (!target.webSocketDebuggerUrl)
|
|
123
|
+
throw new Error(`CDP target ${target.id} has no websocket URL.`);
|
|
124
|
+
const session = await CdpSession.connect(target.webSocketDebuggerUrl);
|
|
125
|
+
await session.call('Runtime.enable');
|
|
126
|
+
await session.call('Page.enable');
|
|
127
|
+
return new CdpWebPage(session);
|
|
128
|
+
}
|
|
129
|
+
async navigate(url) {
|
|
130
|
+
return this.session.call('Page.navigate', { url });
|
|
131
|
+
}
|
|
132
|
+
async evaluate(expression) {
|
|
133
|
+
const result = await this.session.call('Runtime.evaluate', { expression, awaitPromise: true, returnByValue: true });
|
|
134
|
+
if (result.exceptionDetails) {
|
|
135
|
+
throw new Error(result.exceptionDetails.exception?.description ??
|
|
136
|
+
result.exceptionDetails.text ??
|
|
137
|
+
'CDP evaluation failed.');
|
|
138
|
+
}
|
|
139
|
+
return result.result?.value;
|
|
140
|
+
}
|
|
141
|
+
async click(selector) {
|
|
142
|
+
return this.evaluate(`(() => { const el = document.querySelector(${JSON.stringify(selector)}); if (!el) throw new Error('Selector not found: ${escapeForJsMessage(selector)}'); el.click(); return { clicked: true }; })()`);
|
|
143
|
+
}
|
|
144
|
+
async clickText(text) {
|
|
145
|
+
return this.evaluate(`(() => { const expected = ${JSON.stringify(text)}; const el = Array.from(document.querySelectorAll('button, [role=button], a, input, textarea, [tabindex], *')).find((candidate) => (candidate.innerText || candidate.textContent || candidate.getAttribute('aria-label') || '').trim().includes(expected)); if (!el) throw new Error('Text target not found: ${escapeForJsMessage(text)}'); el.click(); return { clicked: true, text: expected }; })()`);
|
|
146
|
+
}
|
|
147
|
+
async setInput(selector, value) {
|
|
148
|
+
return this.evaluate(`(() => { const el = document.querySelector(${JSON.stringify(selector)}); if (!el) throw new Error('Selector not found: ${escapeForJsMessage(selector)}'); el.focus(); el.value = ${JSON.stringify(value)}; el.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: ${JSON.stringify(value)} })); el.dispatchEvent(new Event('change', { bubbles: true })); return { set: true }; })()`);
|
|
149
|
+
}
|
|
150
|
+
async keyPress(key) {
|
|
151
|
+
await this.session.call('Input.dispatchKeyEvent', { type: 'keyDown', key });
|
|
152
|
+
await this.session.call('Input.dispatchKeyEvent', { type: 'keyUp', key });
|
|
153
|
+
return { key };
|
|
154
|
+
}
|
|
155
|
+
async scroll(options) {
|
|
156
|
+
const deltaX = options.deltaX ?? 0;
|
|
157
|
+
const deltaY = options.deltaY ?? 600;
|
|
158
|
+
if (options.selector) {
|
|
159
|
+
if (options.intoView) {
|
|
160
|
+
return this.evaluate(`(() => { const el = document.querySelector(${JSON.stringify(options.selector)}); if (!el) throw new Error('Selector not found: ${escapeForJsMessage(options.selector)}'); el.scrollIntoView({ block: 'center', inline: 'nearest' }); return { scrolled: true, selector: ${JSON.stringify(options.selector)}, intoView: true }; })()`);
|
|
161
|
+
}
|
|
162
|
+
return this.evaluate(`(() => { const el = document.querySelector(${JSON.stringify(options.selector)}); if (!el) throw new Error('Selector not found: ${escapeForJsMessage(options.selector)}'); el.scrollBy(${JSON.stringify(deltaX)}, ${JSON.stringify(deltaY)}); return { scrolled: true }; })()`);
|
|
163
|
+
}
|
|
164
|
+
return this.evaluate(`(() => { window.scrollBy(${JSON.stringify(deltaX)}, ${JSON.stringify(deltaY)}); return { scrolled: true }; })()`);
|
|
165
|
+
}
|
|
166
|
+
async waitFor(options) {
|
|
167
|
+
const timeoutMs = options.timeoutMs ?? 5_000;
|
|
168
|
+
return this.evaluate(`(async () => { const deadline = Date.now() + ${JSON.stringify(timeoutMs)}; while (Date.now() <= deadline) { const ok = ${waitForPredicateExpression(options)}; if (ok) return { matched: true }; await new Promise((resolve) => setTimeout(resolve, 100)); } throw new Error('ui.wait_for timed out'); })()`);
|
|
169
|
+
}
|
|
170
|
+
async waitForSelector(selector, options = {}) {
|
|
171
|
+
return this.waitFor({ selector, timeoutMs: options.timeoutMs });
|
|
172
|
+
}
|
|
173
|
+
async waitForExpression(expression, options = {}) {
|
|
174
|
+
const timeoutMs = options.timeoutMs ?? 5_000;
|
|
175
|
+
return this.evaluate(`(async () => { const deadline = Date.now() + ${JSON.stringify(timeoutMs)}; while (Date.now() <= deadline) { if (await (${expression})) return { matched: true }; await new Promise((resolve) => setTimeout(resolve, 100)); } throw new Error('waitForExpression timed out'); })()`);
|
|
176
|
+
}
|
|
177
|
+
async screenshot(context, relPath, metadata = {}) {
|
|
178
|
+
const timeoutMs = typeof metadata.timeoutMs === 'number' ? metadata.timeoutMs : 30_000;
|
|
179
|
+
const result = await withTimeout(this.session.call('Page.captureScreenshot', {
|
|
180
|
+
format: 'png',
|
|
181
|
+
}), timeoutMs, `Page.captureScreenshot timed out after ${timeoutMs}ms`);
|
|
182
|
+
if (!result.data)
|
|
183
|
+
throw new Error('CDP screenshot did not return data.');
|
|
184
|
+
if (!context)
|
|
185
|
+
return result.data;
|
|
186
|
+
const relativePath = relPath ?? `screenshots/${context.nodeId}.png`;
|
|
187
|
+
const outputPath = context.resolveArtifactPath(relativePath);
|
|
188
|
+
await mkdir(path.dirname(outputPath), { recursive: true });
|
|
189
|
+
await writeFile(outputPath, Buffer.from(result.data, 'base64'));
|
|
190
|
+
return {
|
|
191
|
+
path: relativePath,
|
|
192
|
+
type: 'screenshot',
|
|
193
|
+
nodeId: context.nodeId,
|
|
194
|
+
label: typeof metadata.label === 'string' ? metadata.label : undefined,
|
|
195
|
+
category: typeof metadata.category === 'string' ? metadata.category : 'evidence',
|
|
196
|
+
mimeType: 'image/png',
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
close() {
|
|
200
|
+
this.session.close();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function withTimeout(promise, timeoutMs, message) {
|
|
204
|
+
let timeout;
|
|
205
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
206
|
+
timeout = setTimeout(() => reject(new Error(message)), timeoutMs);
|
|
207
|
+
});
|
|
208
|
+
return Promise.race([promise, timeoutPromise]).finally(() => {
|
|
209
|
+
if (timeout)
|
|
210
|
+
clearTimeout(timeout);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
export function createCdpWebUiTransport(options) {
|
|
214
|
+
return {
|
|
215
|
+
async execute(action, node, context) {
|
|
216
|
+
const input = { action, node, context };
|
|
217
|
+
return withCdpWebPage(options, input, async (page) => {
|
|
218
|
+
switch (action) {
|
|
219
|
+
case 'ui.navigate': {
|
|
220
|
+
const url = asString(node.url ?? node.target, 'ui.navigate.url');
|
|
221
|
+
return page.navigate(url);
|
|
222
|
+
}
|
|
223
|
+
case 'ui.press': {
|
|
224
|
+
const selector = selectorForUiInput(node);
|
|
225
|
+
if (selector)
|
|
226
|
+
return page.click(selector);
|
|
227
|
+
return page.clickText(asString(node.text ?? node.label, 'ui.press.text'));
|
|
228
|
+
}
|
|
229
|
+
case 'ui.key_press':
|
|
230
|
+
return page.keyPress(asString(node.key, 'ui.key_press.key'));
|
|
231
|
+
case 'ui.set_input':
|
|
232
|
+
return page.setInput(asString(selectorForUiInput(node), 'ui.set_input.selector'), asString(node.value ?? node.text, 'ui.set_input.value'));
|
|
233
|
+
case 'ui.scroll':
|
|
234
|
+
return page.scroll({
|
|
235
|
+
selector: asOptionalString(selectorForUiInput(node), 'ui.scroll.selector'),
|
|
236
|
+
intoView: node.scroll_into_view === true || node.into_view === true,
|
|
237
|
+
deltaX: node.delta_x == null ? undefined : asNumber(node.delta_x, 'ui.scroll.delta_x'),
|
|
238
|
+
deltaY: node.delta_y == null ? undefined : asNumber(node.delta_y, 'ui.scroll.delta_y'),
|
|
239
|
+
});
|
|
240
|
+
case 'ui.wait_for':
|
|
241
|
+
return page.waitFor({
|
|
242
|
+
selector: asOptionalString(selectorForUiInput(node), 'ui.wait_for.selector'),
|
|
243
|
+
text: asOptionalString(node.text, 'ui.wait_for.text'),
|
|
244
|
+
expected: asOptionalString(node.expected, 'ui.wait_for.expected'),
|
|
245
|
+
timeoutMs: node.timeout_ms == null
|
|
246
|
+
? undefined
|
|
247
|
+
: asNumber(node.timeout_ms, 'ui.wait_for.timeout_ms'),
|
|
248
|
+
});
|
|
249
|
+
case 'ui.screenshot':
|
|
250
|
+
return captureCdpScreenshot(page, node, context);
|
|
251
|
+
case 'app.status':
|
|
252
|
+
return page.evaluate('(() => ({ url: location.href, title: document.title }))()');
|
|
253
|
+
case 'app.lifecycle':
|
|
254
|
+
return runCdpLifecycle(page, node);
|
|
255
|
+
case 'app.hud':
|
|
256
|
+
return renderCdpHud(page, node, context);
|
|
257
|
+
case 'app.trace':
|
|
258
|
+
return page.evaluate('(() => ({ entries: performance.getEntries().slice(-20).map((entry) => ({ name: entry.name, type: entry.entryType, startTime: entry.startTime, duration: entry.duration })) }))()');
|
|
259
|
+
case 'ui.gesture':
|
|
260
|
+
throw new Error('ui.gesture is not implemented by the CDP web transport yet.');
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
},
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
async function withCdpWebPage(options, input, callback) {
|
|
267
|
+
if (options.withPage)
|
|
268
|
+
return options.withPage(input, callback);
|
|
269
|
+
if (!options.getPage)
|
|
270
|
+
throw new Error('CDP web UI transport requires getPage or withPage.');
|
|
271
|
+
const page = await options.getPage(input);
|
|
272
|
+
try {
|
|
273
|
+
return await callback(page);
|
|
274
|
+
}
|
|
275
|
+
finally {
|
|
276
|
+
page.close();
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
export function selectorForUiInput(node) {
|
|
280
|
+
const selector = asOptionalString(node.selector, 'ui.selector');
|
|
281
|
+
if (selector)
|
|
282
|
+
return selector;
|
|
283
|
+
const testId = asOptionalString(node.test_id ?? node.testID, 'ui.test_id');
|
|
284
|
+
if (testId) {
|
|
285
|
+
const escaped = escapeCssAttrValue(testId);
|
|
286
|
+
return `[data-testid="${escaped}"], [data-test-id="${escaped}"], [data-test="${escaped}"]`;
|
|
287
|
+
}
|
|
288
|
+
return undefined;
|
|
289
|
+
}
|
|
290
|
+
async function captureCdpScreenshot(page, node, context) {
|
|
291
|
+
const artifactPath = asOptionalString(node.path, 'ui.screenshot.path') ?? `${context.nodeId}.png`;
|
|
292
|
+
const normalizedPath = artifactPath.split(path.sep).join('/');
|
|
293
|
+
const label = asOptionalString(node.label, 'ui.screenshot.label') ?? 'UI screenshot';
|
|
294
|
+
const captured = await page.screenshot(context, normalizedPath, {
|
|
295
|
+
label,
|
|
296
|
+
category: asOptionalString(node.category, 'ui.screenshot.category') ?? 'evidence',
|
|
297
|
+
timeoutMs: node.timeout_ms == null ? undefined : asNumber(node.timeout_ms, 'ui.screenshot.timeout_ms'),
|
|
298
|
+
});
|
|
299
|
+
const artifact = typeof captured === 'object' && captured !== null
|
|
300
|
+
? captured
|
|
301
|
+
: {
|
|
302
|
+
path: normalizedPath,
|
|
303
|
+
type: 'screenshot',
|
|
304
|
+
nodeId: context.nodeId,
|
|
305
|
+
mimeType: 'image/png',
|
|
306
|
+
label,
|
|
307
|
+
};
|
|
308
|
+
context.registerArtifact(artifact);
|
|
309
|
+
return {
|
|
310
|
+
output: { captured: true, path: normalizedPath, artifact },
|
|
311
|
+
control: { artifacts: [artifact] },
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
async function runCdpLifecycle(page, node) {
|
|
315
|
+
const command = asString(node.command ?? node.event, 'app.lifecycle.command');
|
|
316
|
+
if (command === 'reload') {
|
|
317
|
+
return page.evaluate('(() => { location.reload(); return { command: "reload" }; })()');
|
|
318
|
+
}
|
|
319
|
+
if (command === 'back') {
|
|
320
|
+
return page.evaluate('(() => { history.back(); return { command: "back" }; })()');
|
|
321
|
+
}
|
|
322
|
+
throw new Error(`Unsupported CDP lifecycle command: ${command}.`);
|
|
323
|
+
}
|
|
324
|
+
async function renderCdpHud(page, node, context) {
|
|
325
|
+
if (node.clear === true) {
|
|
326
|
+
return page.evaluate("(() => { document.getElementById('farmslot-recipe-hud')?.remove(); document.getElementById('farmslot-recipe-hud-reserved-space')?.remove(); document.documentElement.style.removeProperty('--farmslot-recipe-hud-height'); document.body?.style.removeProperty('padding-bottom'); return { hud: false, cleared: true }; })()");
|
|
327
|
+
}
|
|
328
|
+
const title = asOptionalString(node.title, 'app.hud.title') ?? 'Recipe run';
|
|
329
|
+
const status = asOptionalString(node.status, 'app.hud.status') ?? 'running';
|
|
330
|
+
const nodeId = asOptionalString(node.node_id ?? node.nodeId, 'app.hud.node_id') ?? context.nodeId;
|
|
331
|
+
const phase = asOptionalString(node.phase, 'app.hud.phase') ?? '';
|
|
332
|
+
const subIntent = asOptionalString(node.sub_intent ?? node.subIntent, 'app.hud.sub_intent') ?? '';
|
|
333
|
+
const flow = asOptionalString(node.flow, 'app.hud.flow') ?? '';
|
|
334
|
+
const action = asOptionalString(node.action_name ?? node.recipe_action, 'app.hud.action_name') ?? '';
|
|
335
|
+
const proofTarget = asOptionalString(node.proofTarget ?? node.proof_target, 'app.hud.proofTarget') ?? '';
|
|
336
|
+
const record = asOptionalString(node.record, 'app.hud.record') ?? '';
|
|
337
|
+
const text = asOptionalString(node.intent ?? node.text, 'app.hud.text') ?? context.nodeId;
|
|
338
|
+
const rawDetail = asOptionalString(node.detail, 'app.hud.detail') ?? '';
|
|
339
|
+
const detail = rawDetail && rawDetail !== text && rawDetail !== flow ? rawDetail : '';
|
|
340
|
+
const error = asOptionalString(node.error, 'app.hud.error');
|
|
341
|
+
const display = isRecord(node.display) ? node.display : {};
|
|
342
|
+
const layout = asOptionalString(display.layout, 'app.hud.display.layout') ?? 'bottom-bar';
|
|
343
|
+
const position = asOptionalString(display.position, 'app.hud.display.position') ?? 'bottom';
|
|
344
|
+
const showTitle = display.showTitle === true;
|
|
345
|
+
const showDebug = display.showDebug === true;
|
|
346
|
+
const showSubflow = display.showSubflow === true;
|
|
347
|
+
const showDetail = display.showDetail === true;
|
|
348
|
+
const width = asOptionalString(display.width, 'app.hud.display.width') ?? '360px';
|
|
349
|
+
const maxDetailLines = typeof display.maxDetailLines === 'number' ? display.maxDetailLines : 2;
|
|
350
|
+
const progress = isRecord(node.progress) ? node.progress : {};
|
|
351
|
+
const current = typeof progress.current === 'number' ? progress.current : undefined;
|
|
352
|
+
const total = typeof progress.total === 'number' ? progress.total : undefined;
|
|
353
|
+
return page.evaluate(`(() => {
|
|
354
|
+
const payload = ${JSON.stringify({ title, status, nodeId, phase, flow, subIntent, action, proofTarget, record, text, detail, error, current, total, layout, position, showTitle, showDebug, showSubflow, showDetail, width, maxDetailLines })};
|
|
355
|
+
const id = 'farmslot-recipe-hud';
|
|
356
|
+
let el = document.getElementById(id);
|
|
357
|
+
if (!el) {
|
|
358
|
+
el = document.createElement('div');
|
|
359
|
+
el.id = id;
|
|
360
|
+
Object.assign(el.style, {
|
|
361
|
+
position: 'fixed',
|
|
362
|
+
zIndex: '2147483647',
|
|
363
|
+
left: '8px',
|
|
364
|
+
right: '8px',
|
|
365
|
+
bottom: '8px',
|
|
366
|
+
minHeight: '30px',
|
|
367
|
+
padding: '5px 8px',
|
|
368
|
+
borderRadius: '8px',
|
|
369
|
+
background: 'rgba(8, 10, 14, 0.66)',
|
|
370
|
+
color: 'white',
|
|
371
|
+
font: '10px ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
|
|
372
|
+
pointerEvents: 'none',
|
|
373
|
+
boxShadow: '0 6px 22px rgba(0,0,0,0.30)',
|
|
374
|
+
border: '1px solid rgba(255,255,255,0.14)',
|
|
375
|
+
backdropFilter: 'blur(4px)',
|
|
376
|
+
});
|
|
377
|
+
document.body.appendChild(el);
|
|
378
|
+
}
|
|
379
|
+
const isCard = payload.layout === 'card';
|
|
380
|
+
const isDocked = payload.layout === 'docked-bottom';
|
|
381
|
+
Object.assign(el.style, {
|
|
382
|
+
left: '',
|
|
383
|
+
right: '',
|
|
384
|
+
top: '',
|
|
385
|
+
bottom: '',
|
|
386
|
+
width: '',
|
|
387
|
+
maxWidth: '',
|
|
388
|
+
borderRadius: isDocked ? '0' : '9px',
|
|
389
|
+
});
|
|
390
|
+
if (isCard) {
|
|
391
|
+
el.style.width = payload.width || '360px';
|
|
392
|
+
el.style.maxWidth = 'calc(100vw - 16px)';
|
|
393
|
+
if (payload.position.includes('top')) el.style.top = '8px';
|
|
394
|
+
else el.style.bottom = '8px';
|
|
395
|
+
if (payload.position.includes('left')) el.style.left = '8px';
|
|
396
|
+
else el.style.right = '8px';
|
|
397
|
+
} else {
|
|
398
|
+
if (payload.position === 'top') el.style.top = '8px';
|
|
399
|
+
else el.style.bottom = isDocked ? '0' : '8px';
|
|
400
|
+
el.style.left = isDocked ? '0' : '8px';
|
|
401
|
+
el.style.right = isDocked ? '0' : '8px';
|
|
402
|
+
}
|
|
403
|
+
const accent = payload.status === 'fail' ? '#ff5c5c' : payload.status === 'pass' ? '#48d17a' : '#8ab4ff';
|
|
404
|
+
const progressText = Number.isFinite(payload.current) && Number.isFinite(payload.total)
|
|
405
|
+
? payload.current + '/' + payload.total
|
|
406
|
+
: '';
|
|
407
|
+
el.innerHTML = '';
|
|
408
|
+
const row = document.createElement('div');
|
|
409
|
+
Object.assign(row.style, { display: 'flex', gap: '7px', alignItems: 'flex-start' });
|
|
410
|
+
const badge = document.createElement('div');
|
|
411
|
+
Object.assign(badge.style, {
|
|
412
|
+
color: accent,
|
|
413
|
+
border: '1px solid rgba(255,255,255,0.16)',
|
|
414
|
+
borderRadius: '7px',
|
|
415
|
+
padding: '1px 5px',
|
|
416
|
+
fontWeight: '800',
|
|
417
|
+
textTransform: 'uppercase',
|
|
418
|
+
fontSize: '9px',
|
|
419
|
+
lineHeight: '14px',
|
|
420
|
+
whiteSpace: 'nowrap',
|
|
421
|
+
});
|
|
422
|
+
badge.textContent = [payload.status === 'fail' ? 'FAIL' : payload.status === 'pass' ? 'OK' : 'RUN', progressText].filter(Boolean).join(' ');
|
|
423
|
+
const body = document.createElement('div');
|
|
424
|
+
Object.assign(body.style, { minWidth: '0', flex: '1' });
|
|
425
|
+
const line1 = document.createElement('div');
|
|
426
|
+
Object.assign(line1.style, { color: '#fff', fontWeight: '750', lineHeight: '1.25', whiteSpace: 'normal' });
|
|
427
|
+
line1.textContent = payload.text || payload.nodeId;
|
|
428
|
+
const line2 = document.createElement('div');
|
|
429
|
+
Object.assign(line2.style, {
|
|
430
|
+
color: '#d6d9df',
|
|
431
|
+
lineHeight: '1.25',
|
|
432
|
+
whiteSpace: 'normal',
|
|
433
|
+
});
|
|
434
|
+
const secondaryParts = [];
|
|
435
|
+
if (payload.showSubflow && payload.subIntent) secondaryParts.push(payload.subIntent);
|
|
436
|
+
if (payload.showDetail && payload.detail) secondaryParts.push(payload.detail);
|
|
437
|
+
const secondary = secondaryParts.filter((part, index) => part && secondaryParts.indexOf(part) === index).join(' · ');
|
|
438
|
+
line2.textContent = payload.error ? 'error: ' + payload.error : secondary;
|
|
439
|
+
const line3 = document.createElement('div');
|
|
440
|
+
Object.assign(line3.style, { color: '#8f98a8', fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace', fontSize: '9px', whiteSpace: 'normal' });
|
|
441
|
+
line3.textContent = [payload.nodeId, payload.action].filter(Boolean).join(' · ');
|
|
442
|
+
if (payload.showTitle) {
|
|
443
|
+
const title = document.createElement('div');
|
|
444
|
+
Object.assign(title.style, { color: '#d6d9df', fontWeight: '700', marginBottom: '2px', fontSize: '10px', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' });
|
|
445
|
+
title.textContent = payload.title;
|
|
446
|
+
body.append(title);
|
|
447
|
+
}
|
|
448
|
+
body.append(line1);
|
|
449
|
+
if (line2.textContent) body.append(line2);
|
|
450
|
+
if (payload.showDebug) body.append(line3);
|
|
451
|
+
row.append(badge, body);
|
|
452
|
+
el.append(row);
|
|
453
|
+
if (payload.error) {
|
|
454
|
+
line2.style.color = '#ffb3b3';
|
|
455
|
+
}
|
|
456
|
+
let reserve = document.getElementById('farmslot-recipe-hud-reserved-space');
|
|
457
|
+
if (isDocked) {
|
|
458
|
+
if (!reserve) {
|
|
459
|
+
reserve = document.createElement('div');
|
|
460
|
+
reserve.id = 'farmslot-recipe-hud-reserved-space';
|
|
461
|
+
reserve.setAttribute('aria-hidden', 'true');
|
|
462
|
+
document.body.appendChild(reserve);
|
|
463
|
+
}
|
|
464
|
+
const height = Math.ceil(el.getBoundingClientRect().height);
|
|
465
|
+
document.documentElement.style.setProperty('--farmslot-recipe-hud-height', height + 'px');
|
|
466
|
+
Object.assign(reserve.style, {
|
|
467
|
+
display: 'block',
|
|
468
|
+
height: 'var(--farmslot-recipe-hud-height)',
|
|
469
|
+
minHeight: 'var(--farmslot-recipe-hud-height)',
|
|
470
|
+
pointerEvents: 'none',
|
|
471
|
+
});
|
|
472
|
+
if (document.body) {
|
|
473
|
+
document.body.style.paddingBottom = 'var(--farmslot-recipe-hud-height)';
|
|
474
|
+
}
|
|
475
|
+
} else if (reserve) {
|
|
476
|
+
reserve.remove();
|
|
477
|
+
document.documentElement.style.removeProperty('--farmslot-recipe-hud-height');
|
|
478
|
+
document.body?.style.removeProperty('padding-bottom');
|
|
479
|
+
}
|
|
480
|
+
return { hud: true, status: payload.status, nodeId: payload.nodeId, flow: payload.flow };
|
|
481
|
+
})()`);
|
|
482
|
+
}
|
|
483
|
+
function waitForPredicateExpression(options) {
|
|
484
|
+
let presentExpression;
|
|
485
|
+
if (options.selector && options.text) {
|
|
486
|
+
presentExpression = `Boolean(document.querySelector(${JSON.stringify(options.selector)})) && document.body.innerText.includes(${JSON.stringify(options.text)})`;
|
|
487
|
+
}
|
|
488
|
+
else if (options.selector) {
|
|
489
|
+
presentExpression = `Boolean(document.querySelector(${JSON.stringify(options.selector)}))`;
|
|
490
|
+
}
|
|
491
|
+
else if (options.text) {
|
|
492
|
+
presentExpression = `document.body.innerText.includes(${JSON.stringify(options.text)})`;
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
throw new Error('ui.wait_for requires selector or text.');
|
|
496
|
+
}
|
|
497
|
+
const expected = String(options.expected ?? 'present').toLowerCase();
|
|
498
|
+
if (expected === 'absent' || expected === 'hidden' || expected === 'not_present') {
|
|
499
|
+
return `!(${presentExpression})`;
|
|
500
|
+
}
|
|
501
|
+
if (expected !== 'present' && expected !== 'visible') {
|
|
502
|
+
throw new Error(`ui.wait_for expected must be present or absent, got ${expected}.`);
|
|
503
|
+
}
|
|
504
|
+
return presentExpression;
|
|
505
|
+
}
|
|
506
|
+
function escapeForJsMessage(value) {
|
|
507
|
+
return value.replaceAll('\\', '\\\\').replaceAll("'", "\\'");
|
|
508
|
+
}
|
|
509
|
+
function escapeCssAttrValue(value) {
|
|
510
|
+
return value.replaceAll('\\', '\\\\').replaceAll('"', '\\"');
|
|
511
|
+
}
|
|
512
|
+
//# sourceMappingURL=cdp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp.js","sourceRoot":"","sources":["../../src/runtime/cdp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { UiActionTransport } from '../adapters/ui.js';
|
|
2
|
+
import type { ActionExecutionContext } from '../types.js';
|
|
3
|
+
export type ReactNativeBridgeCommandName = 'navigate' | 'press' | 'keyPress' | 'setInput' | 'scroll' | 'gesture' | 'waitFor' | 'screenshot' | 'status' | 'lifecycle' | 'hud' | 'trace';
|
|
4
|
+
export interface ReactNativeBridgeCommand {
|
|
5
|
+
command: ReactNativeBridgeCommandName;
|
|
6
|
+
nodeId: string;
|
|
7
|
+
payload: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
export interface ReactNativeBridge {
|
|
10
|
+
send(command: ReactNativeBridgeCommand, context: ActionExecutionContext): Promise<unknown>;
|
|
11
|
+
}
|
|
12
|
+
export interface CreateReactNativeBridgeUiTransportOptions {
|
|
13
|
+
bridge: ReactNativeBridge;
|
|
14
|
+
}
|
|
15
|
+
export declare function createReactNativeBridgeUiTransport(options: CreateReactNativeBridgeUiTransportOptions): UiActionTransport;
|
|
16
|
+
export declare const createReactNativeCdpBridgeUiTransport: typeof createReactNativeBridgeUiTransport;
|
|
17
|
+
//# sourceMappingURL=react-native-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-native-bridge.d.ts","sourceRoot":"","sources":["../../src/runtime/react-native-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,MAAM,4BAA4B,GACpC,UAAU,GACV,OAAO,GACP,UAAU,GACV,UAAU,GACV,QAAQ,GACR,SAAS,GACT,SAAS,GACT,YAAY,GACZ,QAAQ,GACR,WAAW,GACX,KAAK,GACL,OAAO,CAAC;AAEZ,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,4BAA4B,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,OAAO,EAAE,wBAAwB,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5F;AAED,MAAM,WAAW,yCAAyC;IACxD,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAiBD,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,yCAAyC,GACjD,iBAAiB,CAUnB;AAED,eAAO,MAAM,qCAAqC,2CAAqC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const RN_COMMANDS = {
|
|
2
|
+
'ui.navigate': 'navigate',
|
|
3
|
+
'ui.press': 'press',
|
|
4
|
+
'ui.key_press': 'keyPress',
|
|
5
|
+
'ui.set_input': 'setInput',
|
|
6
|
+
'ui.scroll': 'scroll',
|
|
7
|
+
'ui.gesture': 'gesture',
|
|
8
|
+
'ui.wait_for': 'waitFor',
|
|
9
|
+
'ui.screenshot': 'screenshot',
|
|
10
|
+
'app.status': 'status',
|
|
11
|
+
'app.lifecycle': 'lifecycle',
|
|
12
|
+
'app.hud': 'hud',
|
|
13
|
+
'app.trace': 'trace',
|
|
14
|
+
};
|
|
15
|
+
export function createReactNativeBridgeUiTransport(options) {
|
|
16
|
+
return {
|
|
17
|
+
async execute(action, node, context) {
|
|
18
|
+
const { action: _action, ...payload } = node;
|
|
19
|
+
return options.bridge.send({ command: RN_COMMANDS[action], nodeId: context.nodeId, payload }, context);
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export const createReactNativeCdpBridgeUiTransport = createReactNativeBridgeUiTransport;
|
|
24
|
+
//# sourceMappingURL=react-native-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-native-bridge.js","sourceRoot":"","sources":["../../src/runtime/react-native-bridge.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,GAA2D;IAC1E,aAAa,EAAE,UAAU;IACzB,UAAU,EAAE,OAAO;IACnB,cAAc,EAAE,UAAU;IAC1B,cAAc,EAAE,UAAU;IAC1B,WAAW,EAAE,QAAQ;IACrB,YAAY,EAAE,SAAS;IACvB,aAAa,EAAE,SAAS;IACxB,eAAe,EAAE,YAAY;IAC7B,YAAY,EAAE,QAAQ;IACtB,eAAe,EAAE,WAAW;IAC5B,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,OAAO;CACrB,CAAC;AAEF,MAAM,UAAU,kCAAkC,CAChD,OAAkD;IAElD,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO;YACjC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;YAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CACxB,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EACjE,OAAO,CACR,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,qCAAqC,GAAG,kCAAkC,CAAC"}
|