agent-screenplay 0.0.0-stage → 0.1.1
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/LICENSE +21 -0
- package/README.md +141 -2
- package/assets/editor/index.html +650 -0
- package/assets/fonts/Inter-Bold.ttf +0 -0
- package/assets/fonts/Inter-LICENSE.txt +92 -0
- package/assets/fonts/Inter-Medium.ttf +0 -0
- package/assets/fonts/Inter-Regular.ttf +0 -0
- package/assets/fonts/Inter-SemiBold.ttf +0 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +163 -0
- package/dist/cli.js.map +1 -0
- package/dist/core.d.ts +18 -0
- package/dist/core.js +73 -0
- package/dist/core.js.map +1 -0
- package/dist/direct/plan.d.ts +100 -0
- package/dist/direct/plan.js +274 -0
- package/dist/direct/plan.js.map +1 -0
- package/dist/drivers/browser.d.ts +9 -0
- package/dist/drivers/browser.js +44 -0
- package/dist/drivers/browser.js.map +1 -0
- package/dist/drivers/desktop.d.ts +53 -0
- package/dist/drivers/desktop.js +650 -0
- package/dist/drivers/desktop.js.map +1 -0
- package/dist/drivers/pace.d.ts +11 -0
- package/dist/drivers/pace.js +44 -0
- package/dist/drivers/pace.js.map +1 -0
- package/dist/drivers/web.d.ts +49 -0
- package/dist/drivers/web.js +580 -0
- package/dist/drivers/web.js.map +1 -0
- package/dist/editor/server.d.ts +111 -0
- package/dist/editor/server.js +312 -0
- package/dist/editor/server.js.map +1 -0
- package/dist/ffmpeg.d.ts +5 -0
- package/dist/ffmpeg.js +44 -0
- package/dist/ffmpeg.js.map +1 -0
- package/dist/guide.d.ts +6 -0
- package/dist/guide.js +25 -0
- package/dist/guide.js.map +1 -0
- package/dist/init.d.ts +19 -0
- package/dist/init.js +147 -0
- package/dist/init.js.map +1 -0
- package/dist/login.d.ts +2 -0
- package/dist/login.js +50 -0
- package/dist/login.js.map +1 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +132 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/render/compose.d.ts +68 -0
- package/dist/render/compose.js +361 -0
- package/dist/render/compose.js.map +1 -0
- package/dist/render/presets.d.ts +42 -0
- package/dist/render/presets.js +111 -0
- package/dist/render/presets.js.map +1 -0
- package/dist/render/render.d.ts +27 -0
- package/dist/render/render.js +259 -0
- package/dist/render/render.js.map +1 -0
- package/dist/render/sources.d.ts +15 -0
- package/dist/render/sources.js +146 -0
- package/dist/render/sources.js.map +1 -0
- package/dist/render/style.d.ts +41 -0
- package/dist/render/style.js +151 -0
- package/dist/render/style.js.map +1 -0
- package/dist/scenario/config.d.ts +43 -0
- package/dist/scenario/config.js +69 -0
- package/dist/scenario/config.js.map +1 -0
- package/dist/scenario/fingerprint.d.ts +10 -0
- package/dist/scenario/fingerprint.js +58 -0
- package/dist/scenario/fingerprint.js.map +1 -0
- package/dist/scenario/load.d.ts +36 -0
- package/dist/scenario/load.js +101 -0
- package/dist/scenario/load.js.map +1 -0
- package/dist/scenario/schema.d.ts +555 -0
- package/dist/scenario/schema.js +264 -0
- package/dist/scenario/schema.js.map +1 -0
- package/dist/scenario/target.d.ts +26 -0
- package/dist/scenario/target.js +40 -0
- package/dist/scenario/target.js.map +1 -0
- package/dist/take.d.ts +100 -0
- package/dist/take.js +15 -0
- package/dist/take.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/dist/voice/cartesia.d.ts +12 -0
- package/dist/voice/cartesia.js +103 -0
- package/dist/voice/cartesia.js.map +1 -0
- package/package.json +69 -4
- package/schema/scenario.schema.json +1098 -0
- package/skills/screenplay/SKILL.md +126 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { cardDuration } from "../drivers/pace.js";
|
|
2
|
+
const WAIT_KEEP = 0.9; // seconds of a wait shown at normal speed
|
|
3
|
+
const WAIT_RATE = 8; // the rest of the wait plays this many times faster
|
|
4
|
+
const WAIT_MAX = 2.4; // a wait never lasts longer than this in the video
|
|
5
|
+
export const OVERLAY_DELAY = 0.55; // callouts and highlights appear after the camera framed them
|
|
6
|
+
export function planTake(take, scenario, opts) {
|
|
7
|
+
const steps = take.steps;
|
|
8
|
+
const pieces = [];
|
|
9
|
+
let op = 0; // output pointer
|
|
10
|
+
let sp = 0; // source pointer
|
|
11
|
+
const emitCapture = (sEnd) => {
|
|
12
|
+
if (sEnd <= sp + 1e-6)
|
|
13
|
+
return;
|
|
14
|
+
const waits = mergeSpans(steps.flatMap((s) => s.waits)).filter(([a, b]) => b > sp && a < sEnd);
|
|
15
|
+
let cur = sp;
|
|
16
|
+
for (const [a0, b0] of waits) {
|
|
17
|
+
const a = Math.max(a0, cur);
|
|
18
|
+
const b = Math.min(b0, sEnd);
|
|
19
|
+
if (a > cur) {
|
|
20
|
+
pieces.push({ kind: "capture", o0: op, o1: op + (a - cur), s0: cur, s1: a });
|
|
21
|
+
op += a - cur;
|
|
22
|
+
}
|
|
23
|
+
if (b > a) {
|
|
24
|
+
const len = b - a;
|
|
25
|
+
const out = len <= WAIT_KEEP ? len : Math.min(WAIT_MAX, WAIT_KEEP + (len - WAIT_KEEP) / WAIT_RATE);
|
|
26
|
+
pieces.push({ kind: "capture", o0: op, o1: op + out, s0: a, s1: b });
|
|
27
|
+
op += out;
|
|
28
|
+
}
|
|
29
|
+
cur = Math.max(cur, b);
|
|
30
|
+
}
|
|
31
|
+
if (sEnd > cur) {
|
|
32
|
+
pieces.push({ kind: "capture", o0: op, o1: op + (sEnd - cur), s0: cur, s1: sEnd });
|
|
33
|
+
op += sEnd - cur;
|
|
34
|
+
}
|
|
35
|
+
sp = sEnd;
|
|
36
|
+
};
|
|
37
|
+
const srcToOut = (s) => {
|
|
38
|
+
for (const p of pieces) {
|
|
39
|
+
if (p.kind === "capture" && s >= p.s0 - 1e-9 && s <= p.s1 + 1e-9) {
|
|
40
|
+
if (p.s1 === p.s0)
|
|
41
|
+
return p.o0;
|
|
42
|
+
return p.o0 + ((s - p.s0) / (p.s1 - p.s0)) * (p.o1 - p.o0);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return op;
|
|
46
|
+
};
|
|
47
|
+
const stepTimes = [];
|
|
48
|
+
const voice = [];
|
|
49
|
+
for (const st of steps) {
|
|
50
|
+
const audio = opts.audio.get(st.index);
|
|
51
|
+
if (st.card) {
|
|
52
|
+
// An opening card starts the video: drop the still lead-in recorded before it.
|
|
53
|
+
if (pieces.length === 0)
|
|
54
|
+
sp = st.start;
|
|
55
|
+
emitCapture(st.start);
|
|
56
|
+
// Card text and length come from the scenario as it is now: they can change without filming again.
|
|
57
|
+
const sc = scenario.steps[st.index];
|
|
58
|
+
const title = (st.card.kind === "title" ? sc.title : sc.end) ?? st.card.title;
|
|
59
|
+
const base = sc.duration ?? cardDuration(title, sc.subtitle);
|
|
60
|
+
const dur = Math.max(base, audio ? audio.duration + 0.6 : 0);
|
|
61
|
+
pieces.push({ kind: "card", o0: op, o1: op + dur, step: st, card: { kind: st.card.kind, title, subtitle: sc.subtitle } });
|
|
62
|
+
stepTimes[st.index] = { o0: op, o1: op + dur };
|
|
63
|
+
if (audio)
|
|
64
|
+
voice.push({ file: audio.file, at: op + 0.25, duration: audio.duration });
|
|
65
|
+
op += dur;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
emitCapture(st.start);
|
|
69
|
+
const o0 = op;
|
|
70
|
+
emitCapture(st.end);
|
|
71
|
+
// Narration longer than the step: hold the last image until it ends.
|
|
72
|
+
if (audio && op - o0 < audio.duration + 0.35) {
|
|
73
|
+
const extra = audio.duration + 0.35 - (op - o0);
|
|
74
|
+
pieces.push({ kind: "capture", o0: op, o1: op + extra, s0: st.end, s1: st.end });
|
|
75
|
+
op += extra;
|
|
76
|
+
}
|
|
77
|
+
stepTimes[st.index] = { o0, o1: op, oAction: st.actionAt !== undefined ? srcToOut(st.actionAt) : undefined };
|
|
78
|
+
if (audio)
|
|
79
|
+
voice.push({ file: audio.file, at: o0 + 0.05, duration: audio.duration });
|
|
80
|
+
}
|
|
81
|
+
emitCapture(take.duration);
|
|
82
|
+
const duration = op;
|
|
83
|
+
const frameCount = Math.max(1, Math.ceil(duration * opts.fps));
|
|
84
|
+
// ---- cursor movements (recording time) ---------------------------------
|
|
85
|
+
const movements = [];
|
|
86
|
+
let prev = take.cursorStart;
|
|
87
|
+
let bend = 1;
|
|
88
|
+
for (const st of steps) {
|
|
89
|
+
if (!st.point)
|
|
90
|
+
continue;
|
|
91
|
+
const s0 = st.travelStart ?? st.actionAt ?? st.start;
|
|
92
|
+
const s1 = st.actionAt ?? s0 + 0.5;
|
|
93
|
+
if (Math.hypot(st.point.x - prev.x, st.point.y - prev.y) > 2) {
|
|
94
|
+
movements.push({ s0, s1: Math.max(s1, s0 + 0.05), from: prev, to: st.point, bend });
|
|
95
|
+
bend = -bend;
|
|
96
|
+
}
|
|
97
|
+
prev = st.point;
|
|
98
|
+
}
|
|
99
|
+
const clicks = steps
|
|
100
|
+
.filter((s) => s.actionAt !== undefined && (s.kind === "click" || s.kind === "select" || (s.kind === "type" && s.point)))
|
|
101
|
+
.map((s) => srcToOut(s.actionAt));
|
|
102
|
+
const typing = steps
|
|
103
|
+
.filter((s) => s.kind === "type" && s.actionAt !== undefined && s.actionEnd !== undefined)
|
|
104
|
+
.map((s) => [srcToOut(s.actionAt), srcToOut(s.actionEnd)]);
|
|
105
|
+
// ---- overlays -----------------------------------------------------------
|
|
106
|
+
const captions = [];
|
|
107
|
+
const annotations = [];
|
|
108
|
+
for (const st of steps) {
|
|
109
|
+
const sc = scenario.steps[st.index];
|
|
110
|
+
const t = stepTimes[st.index];
|
|
111
|
+
if (!t)
|
|
112
|
+
continue;
|
|
113
|
+
if (opts.captions && sc.say && !st.card) {
|
|
114
|
+
const audio = opts.audio.get(st.index);
|
|
115
|
+
captions.push({ o0: t.o0 + 0.05, o1: Math.max(t.o1, t.o0 + (audio?.duration ?? 0) + 0.2), text: sc.say });
|
|
116
|
+
}
|
|
117
|
+
if ((st.kind === "callout" || st.kind === "highlight") && st.box) {
|
|
118
|
+
// Appear once the camera has had time to frame the element.
|
|
119
|
+
annotations.push({ kind: st.kind, o0: Math.min(t.o0 + OVERLAY_DELAY, t.o1 - 0.5), o1: t.o1, box: st.box, text: sc.text });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// ---- camera -------------------------------------------------------------
|
|
123
|
+
const W = take.width;
|
|
124
|
+
const H = take.height;
|
|
125
|
+
const shots = buildShots(take, scenario, stepTimes, srcToOut, opts);
|
|
126
|
+
const cameras = simulateCamera(shots, frameCount, opts.fps, W, H);
|
|
127
|
+
return {
|
|
128
|
+
fps: opts.fps,
|
|
129
|
+
duration,
|
|
130
|
+
frameCount,
|
|
131
|
+
pieces,
|
|
132
|
+
cameras,
|
|
133
|
+
captions,
|
|
134
|
+
annotations,
|
|
135
|
+
clicks,
|
|
136
|
+
voice,
|
|
137
|
+
stepTimes,
|
|
138
|
+
movements,
|
|
139
|
+
typing,
|
|
140
|
+
width: W,
|
|
141
|
+
height: H,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function buildShots(take, scenario, stepTimes, srcToOut, opts) {
|
|
145
|
+
const W = take.width;
|
|
146
|
+
const H = take.height;
|
|
147
|
+
const shots = [];
|
|
148
|
+
for (const st of take.steps) {
|
|
149
|
+
if (!st.box || st.card)
|
|
150
|
+
continue;
|
|
151
|
+
const sc = scenario.steps[st.index];
|
|
152
|
+
if (sc.zoom === false)
|
|
153
|
+
continue;
|
|
154
|
+
const forced = typeof sc.zoom === "number" ? sc.zoom : undefined;
|
|
155
|
+
const isOverlay = st.kind === "callout" || st.kind === "highlight" || st.kind === "zoomTo";
|
|
156
|
+
if (forced === undefined && !opts.autoZoom && st.kind !== "zoomTo")
|
|
157
|
+
continue;
|
|
158
|
+
// Typing happens at the start of a field: frame that part rather than a very wide input.
|
|
159
|
+
const box = st.kind === "type" && st.typed !== undefined && st.box.width > W / 3
|
|
160
|
+
? { ...st.box, width: Math.min(st.box.width, Math.max(260, st.typed.length * 7.5 + 60)) }
|
|
161
|
+
: st.box;
|
|
162
|
+
let z = forced ?? autoZoom(box, W, H, isOverlay ? Math.min(opts.maxZoom, 1.6) : opts.maxZoom);
|
|
163
|
+
if (st.kind === "zoomTo" && forced === undefined)
|
|
164
|
+
z = autoZoom(box, W, H, opts.maxZoom);
|
|
165
|
+
if (z <= 1.02)
|
|
166
|
+
continue;
|
|
167
|
+
const t = stepTimes[st.index];
|
|
168
|
+
const begin = isOverlay ? t.o0 - 0.1 : srcToOut(st.travelStart ?? st.actionAt ?? st.start) - 0.12;
|
|
169
|
+
let end = t.o1;
|
|
170
|
+
if (st.navigated && st.actionAt !== undefined)
|
|
171
|
+
end = Math.min(end, srcToOut(st.actionAt) + 0.45);
|
|
172
|
+
shots.push({ o0: Math.max(0, begin), o1: end, z, cx: box.x + box.width / 2, cy: box.y + box.height / 2 });
|
|
173
|
+
}
|
|
174
|
+
// Stay zoomed between close shots instead of bouncing out and back in.
|
|
175
|
+
for (let i = 0; i + 1 < shots.length; i++) {
|
|
176
|
+
if (shots[i + 1].o0 - shots[i].o1 < 1.3)
|
|
177
|
+
shots[i].o1 = shots[i + 1].o0;
|
|
178
|
+
}
|
|
179
|
+
return shots;
|
|
180
|
+
}
|
|
181
|
+
/** Zoom that frames a box with comfortable context. */
|
|
182
|
+
export function autoZoom(box, W, H, maxZoom) {
|
|
183
|
+
const wantW = Math.max(box.width * 2.4, W / maxZoom);
|
|
184
|
+
const wantH = Math.max(box.height * 3.2, H / maxZoom);
|
|
185
|
+
return clampNum(Math.min(W / wantW, H / wantH), 1, maxZoom);
|
|
186
|
+
}
|
|
187
|
+
/** Critically damped spring on log(zoom) and the center: smooth starts, no overshoot. */
|
|
188
|
+
function simulateCamera(shots, frameCount, fps, W, H) {
|
|
189
|
+
const omega = 5.2;
|
|
190
|
+
const sub = 4;
|
|
191
|
+
const dt = 1 / fps / sub;
|
|
192
|
+
let lz = 0, vz = 0, cx = W / 2, vx = 0, cy = H / 2, vy = 0;
|
|
193
|
+
const out = [];
|
|
194
|
+
let si = 0;
|
|
195
|
+
for (let f = 0; f < frameCount; f++) {
|
|
196
|
+
const o = f / fps;
|
|
197
|
+
while (si < shots.length && shots[si].o1 < o)
|
|
198
|
+
si++;
|
|
199
|
+
const shot = si < shots.length && shots[si].o0 <= o ? shots[si] : undefined;
|
|
200
|
+
const tz = shot ? Math.log(shot.z) : 0;
|
|
201
|
+
const z = Math.exp(tz);
|
|
202
|
+
const tx = shot ? clampCenter(shot.cx, W, z) : W / 2;
|
|
203
|
+
const ty = shot ? clampCenter(shot.cy, H, z) : H / 2;
|
|
204
|
+
for (let k = 0; k < sub; k++) {
|
|
205
|
+
vz += (omega * omega * (tz - lz) - 2 * omega * vz) * dt;
|
|
206
|
+
lz += vz * dt;
|
|
207
|
+
vx += (omega * omega * (tx - cx) - 2 * omega * vx) * dt;
|
|
208
|
+
cx += vx * dt;
|
|
209
|
+
vy += (omega * omega * (ty - cy) - 2 * omega * vy) * dt;
|
|
210
|
+
cy += vy * dt;
|
|
211
|
+
}
|
|
212
|
+
const zz = Math.max(1, Math.exp(lz));
|
|
213
|
+
out.push({ z: zz, cx: clampCenter(cx, W, zz), cy: clampCenter(cy, H, zz) });
|
|
214
|
+
}
|
|
215
|
+
return out;
|
|
216
|
+
}
|
|
217
|
+
function clampCenter(c, size, z) {
|
|
218
|
+
const half = size / (2 * z);
|
|
219
|
+
return clampNum(c, half, size - half);
|
|
220
|
+
}
|
|
221
|
+
function clampNum(v, lo, hi) {
|
|
222
|
+
return Math.min(hi, Math.max(lo, v));
|
|
223
|
+
}
|
|
224
|
+
function mergeSpans(spans) {
|
|
225
|
+
const sorted = spans.filter(([a, b]) => b > a).sort((x, y) => x[0] - y[0]);
|
|
226
|
+
const out = [];
|
|
227
|
+
for (const [a, b] of sorted) {
|
|
228
|
+
const last = out[out.length - 1];
|
|
229
|
+
if (last && a <= last[1])
|
|
230
|
+
last[1] = Math.max(last[1], b);
|
|
231
|
+
else
|
|
232
|
+
out.push([a, b]);
|
|
233
|
+
}
|
|
234
|
+
return out;
|
|
235
|
+
}
|
|
236
|
+
/** Where the cursor is at recording time s (minimum-jerk motion along a gentle arc). */
|
|
237
|
+
export function cursorAt(movements, start, s) {
|
|
238
|
+
let pos = start;
|
|
239
|
+
for (const m of movements) {
|
|
240
|
+
if (s < m.s0)
|
|
241
|
+
break;
|
|
242
|
+
if (s >= m.s1) {
|
|
243
|
+
pos = m.to;
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
const u = (s - m.s0) / (m.s1 - m.s0);
|
|
247
|
+
const e = u * u * u * (10 - 15 * u + 6 * u * u);
|
|
248
|
+
const dx = m.to.x - m.from.x;
|
|
249
|
+
const dy = m.to.y - m.from.y;
|
|
250
|
+
const len = Math.hypot(dx, dy) || 1;
|
|
251
|
+
const arc = Math.min(80, len * 0.12) * m.bend;
|
|
252
|
+
const ctrl = { x: (m.from.x + m.to.x) / 2 - (dy / len) * arc, y: (m.from.y + m.to.y) / 2 + (dx / len) * arc };
|
|
253
|
+
const a = 1 - e;
|
|
254
|
+
return {
|
|
255
|
+
x: a * a * m.from.x + 2 * a * e * ctrl.x + e * e * m.to.x,
|
|
256
|
+
y: a * a * m.from.y + 2 * a * e * ctrl.y + e * e * m.to.y,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
return pos;
|
|
260
|
+
}
|
|
261
|
+
/** Locate output time o: the piece, and the recording time when it is a capture. */
|
|
262
|
+
export function locate(plan, o) {
|
|
263
|
+
const { pieces } = plan;
|
|
264
|
+
let i = pieces.findIndex((p) => o >= p.o0 && o < p.o1);
|
|
265
|
+
if (i < 0)
|
|
266
|
+
i = pieces.length - 1;
|
|
267
|
+
const piece = pieces[i];
|
|
268
|
+
if (piece.kind === "capture") {
|
|
269
|
+
const u = piece.o1 > piece.o0 ? (o - piece.o0) / (piece.o1 - piece.o0) : 0;
|
|
270
|
+
return { piece, index: i, s: piece.s0 + Math.min(1, Math.max(0, u)) * (piece.s1 - piece.s0) };
|
|
271
|
+
}
|
|
272
|
+
return { piece, index: i };
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/direct/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Browser } from "playwright-core";
|
|
2
|
+
export declare class BrowserNotFoundError extends Error {
|
|
3
|
+
constructor();
|
|
4
|
+
}
|
|
5
|
+
/** Launch Chromium: SCREENPLAY_CHROME, then Playwright's Chromium, then an installed Google Chrome. */
|
|
6
|
+
export declare function launchBrowser(opts?: {
|
|
7
|
+
headless?: boolean;
|
|
8
|
+
}): Promise<Browser>;
|
|
9
|
+
export declare function isChromiumInstalled(): boolean;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { chromium } from "playwright-core";
|
|
3
|
+
export class BrowserNotFoundError extends Error {
|
|
4
|
+
constructor() {
|
|
5
|
+
super("No Chromium found for Screenplay. Run `npx agent-screenplay init` (or `npx playwright install chromium`), or set SCREENPLAY_CHROME to a Chrome/Chromium executable.");
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
/** Launch Chromium: SCREENPLAY_CHROME, then Playwright's Chromium, then an installed Google Chrome. */
|
|
9
|
+
export async function launchBrowser(opts = {}) {
|
|
10
|
+
const headless = opts.headless ?? true;
|
|
11
|
+
const args = ["--hide-scrollbars", "--disable-features=Translate", "--force-color-profile=srgb"];
|
|
12
|
+
const explicit = process.env.SCREENPLAY_CHROME;
|
|
13
|
+
if (explicit) {
|
|
14
|
+
if (!fs.existsSync(explicit))
|
|
15
|
+
throw new Error(`SCREENPLAY_CHROME points to a missing file: ${explicit}`);
|
|
16
|
+
return chromium.launch({ headless, executablePath: explicit, args });
|
|
17
|
+
}
|
|
18
|
+
const attempts = [
|
|
19
|
+
// Full Chromium in new headless mode renders exactly like a headed browser.
|
|
20
|
+
() => chromium.launch({ headless, channel: "chromium", args }),
|
|
21
|
+
() => chromium.launch({ headless, args }),
|
|
22
|
+
() => chromium.launch({ headless, channel: "chrome", args }),
|
|
23
|
+
];
|
|
24
|
+
for (const attempt of attempts) {
|
|
25
|
+
try {
|
|
26
|
+
return await attempt();
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
const msg = String(e.message);
|
|
30
|
+
if (!/Executable doesn't exist|executable|not found|ENOENT|Chromium distribution/i.test(msg))
|
|
31
|
+
throw e;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
throw new BrowserNotFoundError();
|
|
35
|
+
}
|
|
36
|
+
export function isChromiumInstalled() {
|
|
37
|
+
try {
|
|
38
|
+
return fs.existsSync(chromium.executablePath());
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/drivers/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAgB,MAAM,iBAAiB,CAAC;AAEzD,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C;QACE,KAAK,CACH,qKAAqK,CACtK,CAAC;IACJ,CAAC;CACF;AAED,uGAAuG;AACvG,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAI,GAA2B,EAAE;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;IACvC,MAAM,IAAI,GAAG,CAAC,mBAAmB,EAAE,8BAA8B,EAAE,4BAA4B,CAAC,CAAC;IACjG,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC/C,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,QAAQ,EAAE,CAAC,CAAC;QACzG,OAAO,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,QAAQ,GAAkC;QAC9C,4EAA4E;QAC5E,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC9D,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACzC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KAC7D,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,MAAM,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,CAAC,6EAA6E,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;IACD,MAAM,IAAI,oBAAoB,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { LoadedScenario } from "../scenario/load.js";
|
|
2
|
+
import { SURFACES } from "../scenario/schema.js";
|
|
3
|
+
import type { Take } from "../take.js";
|
|
4
|
+
import { type CheckReport } from "./web.js";
|
|
5
|
+
/**
|
|
6
|
+
* Desktop apps: agent-desktop plays the steps through the OS accessibility
|
|
7
|
+
* APIs (no real pointer moves), ffmpeg films the window without the system
|
|
8
|
+
* cursor, and the shared editing step draws the cursor and zooms.
|
|
9
|
+
*/
|
|
10
|
+
export interface DesktopRunOptions {
|
|
11
|
+
mode: "record";
|
|
12
|
+
minDurations?: number[];
|
|
13
|
+
log?: (msg: string) => void;
|
|
14
|
+
}
|
|
15
|
+
interface Envelope<T = any> {
|
|
16
|
+
ok: boolean;
|
|
17
|
+
data?: T;
|
|
18
|
+
error?: {
|
|
19
|
+
code: string;
|
|
20
|
+
message: string;
|
|
21
|
+
details?: unknown;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export declare class AgentDesktop {
|
|
25
|
+
private bin;
|
|
26
|
+
private session?;
|
|
27
|
+
constructor();
|
|
28
|
+
static locate(): string;
|
|
29
|
+
call<T = any>(args: string[], opts?: {
|
|
30
|
+
allowFail?: boolean;
|
|
31
|
+
}): Promise<Envelope<T>>;
|
|
32
|
+
startSession(): Promise<void>;
|
|
33
|
+
endSession(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
/** The role/name part of an `agent-desktop find` query for a scenario target. */
|
|
36
|
+
export declare function findQuery(target: string): string[];
|
|
37
|
+
/**
|
|
38
|
+
* Translate a scenario target into `agent-desktop find` arguments. With a window id, the search
|
|
39
|
+
* stays in that window, so another window of the same app is never clicked or typed into.
|
|
40
|
+
*/
|
|
41
|
+
export declare function findArgs(app: string, target: string, windowId?: string): string[];
|
|
42
|
+
type Surface = (typeof SURFACES)[number];
|
|
43
|
+
/** Where a step acts: an app (default: the current one) and a surface (default: its front window). */
|
|
44
|
+
export interface Where {
|
|
45
|
+
app?: string;
|
|
46
|
+
surface?: Surface;
|
|
47
|
+
}
|
|
48
|
+
export declare function normalizeCombo(combo: string): string;
|
|
49
|
+
export declare function runDesktop(loaded: LoadedScenario, opts: DesktopRunOptions): Promise<Take>;
|
|
50
|
+
export declare function checkDesktop(loaded: LoadedScenario, opts: {
|
|
51
|
+
log?: (msg: string) => void;
|
|
52
|
+
}): Promise<CheckReport>;
|
|
53
|
+
export {};
|