agent-screenplay 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +141 -2
- package/assets/editor/index.html +536 -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 +16 -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 +37 -0
- package/dist/drivers/web.js +570 -0
- package/dist/drivers/web.js.map +1 -0
- package/dist/editor/server.d.ts +96 -0
- package/dist/editor/server.js +303 -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 +25 -0
- package/dist/render/render.js +257 -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 +37 -0
- package/dist/render/style.js +118 -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 +553 -0
- package/dist/scenario/schema.js +262 -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 +65 -4
- package/schema/scenario.schema.json +1098 -0
- package/skills/screenplay/SKILL.md +127 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { type Style as StyleT } from "../scenario/schema.js";
|
|
2
|
+
/**
|
|
3
|
+
* `screenplay style`: a local page to set the look of the videos (background,
|
|
4
|
+
* margin, corners, shadow) on a real frame of the recording, then save it to the
|
|
5
|
+
* scenario or to the whole project, and render.
|
|
6
|
+
*/
|
|
7
|
+
/** The settings the editor changes; a style's other settings are kept as they are. */
|
|
8
|
+
export declare const EDITED: readonly ["background", "padding", "radius", "shadow"];
|
|
9
|
+
export interface EditorOptions {
|
|
10
|
+
port?: number;
|
|
11
|
+
open?: boolean;
|
|
12
|
+
log?: (msg: string) => void;
|
|
13
|
+
}
|
|
14
|
+
export interface EditorHandle {
|
|
15
|
+
url: string;
|
|
16
|
+
close(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export declare function startStyleEditor(file: string, opts?: EditorOptions): Promise<EditorHandle>;
|
|
19
|
+
/** What the page needs: the styles as written, the video's size and the presets. */
|
|
20
|
+
export declare function state(scenarioFile: string): {
|
|
21
|
+
name: string;
|
|
22
|
+
scenarioFile: string;
|
|
23
|
+
configFile: string;
|
|
24
|
+
configExists: boolean;
|
|
25
|
+
scenarioStyle: Partial<{
|
|
26
|
+
background?: string | {
|
|
27
|
+
gradient: string[];
|
|
28
|
+
angle?: number | undefined;
|
|
29
|
+
} | undefined;
|
|
30
|
+
padding?: number | undefined;
|
|
31
|
+
radius?: number | undefined;
|
|
32
|
+
shadow?: boolean | undefined;
|
|
33
|
+
cursor?: "dot" | "macos" | "none" | undefined;
|
|
34
|
+
cursorSize?: number | undefined;
|
|
35
|
+
maxZoom?: number | undefined;
|
|
36
|
+
autoZoom?: boolean | undefined;
|
|
37
|
+
captions?: boolean | undefined;
|
|
38
|
+
accent?: string | undefined;
|
|
39
|
+
frame?: "browser" | "none" | undefined;
|
|
40
|
+
}>;
|
|
41
|
+
projectStyle: Partial<{
|
|
42
|
+
background?: string | {
|
|
43
|
+
gradient: string[];
|
|
44
|
+
angle?: number | undefined;
|
|
45
|
+
} | undefined;
|
|
46
|
+
padding?: number | undefined;
|
|
47
|
+
radius?: number | undefined;
|
|
48
|
+
shadow?: boolean | undefined;
|
|
49
|
+
cursor?: "dot" | "macos" | "none" | undefined;
|
|
50
|
+
cursorSize?: number | undefined;
|
|
51
|
+
maxZoom?: number | undefined;
|
|
52
|
+
autoZoom?: boolean | undefined;
|
|
53
|
+
captions?: boolean | undefined;
|
|
54
|
+
accent?: string | undefined;
|
|
55
|
+
frame?: "browser" | "none" | undefined;
|
|
56
|
+
}>;
|
|
57
|
+
/** Style settings that the editor does not change but that show in the preview. */
|
|
58
|
+
frame: "browser" | "none";
|
|
59
|
+
url: string | null;
|
|
60
|
+
output: {
|
|
61
|
+
width: number;
|
|
62
|
+
height: number;
|
|
63
|
+
};
|
|
64
|
+
capture: {
|
|
65
|
+
width: number;
|
|
66
|
+
height: number;
|
|
67
|
+
} | null;
|
|
68
|
+
hasTake: boolean;
|
|
69
|
+
hasVideo: boolean;
|
|
70
|
+
presets: {
|
|
71
|
+
[k: string]: {
|
|
72
|
+
stops: string[];
|
|
73
|
+
angle: number;
|
|
74
|
+
dark: boolean;
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
defaults: {
|
|
78
|
+
background: string;
|
|
79
|
+
padding: number;
|
|
80
|
+
radius: number;
|
|
81
|
+
shadow: boolean;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Write the edited settings (an image path in them is absolute, or relative to the scenario's
|
|
86
|
+
* folder). To the scenario: into its `style`. To the project: into
|
|
87
|
+
* screenplay.config.json, and out of this scenario's `style`, which would otherwise win
|
|
88
|
+
* over the project's and hide the change in this video.
|
|
89
|
+
*/
|
|
90
|
+
export declare function saveStyle(scenarioFile: string, target: "scenario" | "project", edited: StyleT): string;
|
|
91
|
+
/** An uploaded background goes next to the scenario, in screenplay-assets/. */
|
|
92
|
+
export declare function saveUpload(scenarioFile: string, name: string, body: Buffer): {
|
|
93
|
+
path: string;
|
|
94
|
+
};
|
|
95
|
+
/** A frame of the recording, as filmed (no background, no zoom), shortly after its first action. */
|
|
96
|
+
export declare function previewFrame(scenarioFile: string): Promise<Buffer | undefined>;
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import http from "node:http";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { spawn } from "node:child_process";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { createCanvas } from "@napi-rs/canvas";
|
|
8
|
+
import { render } from "../core.js";
|
|
9
|
+
import { CONFIG_FILE, findProjectConfig, isImagePath, readProjectConfig } from "../scenario/config.js";
|
|
10
|
+
import { loadScenario } from "../scenario/load.js";
|
|
11
|
+
import { BACKGROUNDS, Style } from "../scenario/schema.js";
|
|
12
|
+
import { readTake } from "../take.js";
|
|
13
|
+
import { openSource } from "../render/sources.js";
|
|
14
|
+
import { PRESETS } from "../render/style.js";
|
|
15
|
+
/**
|
|
16
|
+
* `screenplay style`: a local page to set the look of the videos (background,
|
|
17
|
+
* margin, corners, shadow) on a real frame of the recording, then save it to the
|
|
18
|
+
* scenario or to the whole project, and render.
|
|
19
|
+
*/
|
|
20
|
+
/** The settings the editor changes; a style's other settings are kept as they are. */
|
|
21
|
+
export const EDITED = ["background", "padding", "radius", "shadow"];
|
|
22
|
+
const IMAGE_EXT = /\.(png|jpe?g|webp)$/i;
|
|
23
|
+
export async function startStyleEditor(file, opts = {}) {
|
|
24
|
+
const log = opts.log ?? (() => { });
|
|
25
|
+
const scenarioFile = path.resolve(file);
|
|
26
|
+
const loaded = loadScenario(scenarioFile, { env: false });
|
|
27
|
+
const token = crypto.randomBytes(16).toString("hex");
|
|
28
|
+
const page = fs.readFileSync(editorPage(), "utf8");
|
|
29
|
+
let rendering;
|
|
30
|
+
const server = http.createServer(async (req, res) => {
|
|
31
|
+
try {
|
|
32
|
+
const url = new URL(req.url ?? "/", "http://localhost");
|
|
33
|
+
if (req.method === "GET" && url.pathname === "/") {
|
|
34
|
+
if (url.searchParams.get("t") !== token)
|
|
35
|
+
return send(res, 403, "text/plain", "Open the link printed by `screenplay style`.");
|
|
36
|
+
return send(res, 200, "text/html; charset=utf-8", page.replace("__TOKEN__", token));
|
|
37
|
+
}
|
|
38
|
+
// Every other route needs the token, so another site open in the browser cannot read or write files.
|
|
39
|
+
if (req.headers["x-token"] !== token && url.searchParams.get("t") !== token)
|
|
40
|
+
return send(res, 403, "text/plain", "forbidden");
|
|
41
|
+
if (req.method === "GET" && url.pathname === "/api/state")
|
|
42
|
+
return json(res, 200, state(scenarioFile));
|
|
43
|
+
if (req.method === "GET" && url.pathname === "/api/frame") {
|
|
44
|
+
const jpg = await previewFrame(scenarioFile);
|
|
45
|
+
return jpg ? send(res, 200, "image/jpeg", jpg) : send(res, 404, "text/plain", "no recording yet");
|
|
46
|
+
}
|
|
47
|
+
if (req.method === "GET" && url.pathname === "/api/image") {
|
|
48
|
+
const p = imagePathFor(scenarioFile, url.searchParams.get("path") ?? "", url.searchParams.get("from") ?? "scenario");
|
|
49
|
+
if (!p)
|
|
50
|
+
return send(res, 404, "text/plain", "not found");
|
|
51
|
+
return send(res, 200, mime(p), fs.readFileSync(p));
|
|
52
|
+
}
|
|
53
|
+
if (req.method === "POST" && url.pathname === "/api/upload") {
|
|
54
|
+
const name = String(req.headers["x-filename"] ?? "background.png");
|
|
55
|
+
const body = await readBody(req, 30 * 1024 * 1024);
|
|
56
|
+
return json(res, 200, saveUpload(scenarioFile, name, body));
|
|
57
|
+
}
|
|
58
|
+
if (req.method === "POST" && url.pathname === "/api/save") {
|
|
59
|
+
const body = JSON.parse((await readBody(req, 1024 * 1024)).toString("utf8"));
|
|
60
|
+
const saved = saveStyle(scenarioFile, body.target, body.style);
|
|
61
|
+
log(`Saved the style to ${saved}`);
|
|
62
|
+
return json(res, 200, { ok: true, file: saved, state: state(scenarioFile) });
|
|
63
|
+
}
|
|
64
|
+
if (req.method === "POST" && url.pathname === "/api/render") {
|
|
65
|
+
if (!readTakeSafe(scenarioFile))
|
|
66
|
+
return json(res, 409, { ok: false, error: "Record the scenario first: `screenplay record`." });
|
|
67
|
+
rendering ??= render(scenarioFile, { log }).finally(() => (rendering = undefined));
|
|
68
|
+
const r = (await rendering);
|
|
69
|
+
return json(res, 200, { ok: true, mp4: r.mp4, duration: r.duration, at: Date.now() });
|
|
70
|
+
}
|
|
71
|
+
if (req.method === "GET" && url.pathname === "/api/video") {
|
|
72
|
+
const mp4 = loadScenario(scenarioFile, { env: false }).outputs.mp4;
|
|
73
|
+
if (!fs.existsSync(mp4))
|
|
74
|
+
return send(res, 404, "text/plain", "no video yet");
|
|
75
|
+
return streamFile(req, res, mp4, "video/mp4");
|
|
76
|
+
}
|
|
77
|
+
send(res, 404, "text/plain", "not found");
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
json(res, 400, { ok: false, error: e.message });
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
await new Promise((resolve, reject) => {
|
|
84
|
+
server.once("error", reject);
|
|
85
|
+
server.listen(opts.port ?? 0, "127.0.0.1", () => resolve());
|
|
86
|
+
});
|
|
87
|
+
const port = server.address().port;
|
|
88
|
+
const url = `http://127.0.0.1:${port}/?t=${token}`;
|
|
89
|
+
log(`Style editor for ${loaded.name}: ${url}`);
|
|
90
|
+
if (opts.open !== false)
|
|
91
|
+
openBrowser(url);
|
|
92
|
+
return {
|
|
93
|
+
url,
|
|
94
|
+
close: () => new Promise((r) => server.close(() => r())),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** What the page needs: the styles as written, the video's size and the presets. */
|
|
98
|
+
export function state(scenarioFile) {
|
|
99
|
+
const loaded = loadScenario(scenarioFile, { env: false });
|
|
100
|
+
const raw = JSON.parse(fs.readFileSync(scenarioFile, "utf8"));
|
|
101
|
+
const configFile = findProjectConfig(path.dirname(scenarioFile));
|
|
102
|
+
const project = configFile ? (readProjectConfig(configFile).style ?? {}) : {};
|
|
103
|
+
const take = readTakeSafe(scenarioFile);
|
|
104
|
+
return {
|
|
105
|
+
name: loaded.name,
|
|
106
|
+
scenarioFile,
|
|
107
|
+
configFile: configFile ?? path.join(path.dirname(scenarioFile), CONFIG_FILE),
|
|
108
|
+
configExists: Boolean(configFile),
|
|
109
|
+
// Image backgrounds as absolute paths: each file's are relative to its own folder, and the
|
|
110
|
+
// page may save one to the other file.
|
|
111
|
+
scenarioStyle: absoluteImage(pick(raw.style ?? {}), path.dirname(scenarioFile)),
|
|
112
|
+
projectStyle: absoluteImage(pick(project), configFile ? path.dirname(configFile) : path.dirname(scenarioFile)),
|
|
113
|
+
/** Style settings that the editor does not change but that show in the preview. */
|
|
114
|
+
frame: loaded.scenario.style?.frame ?? "none",
|
|
115
|
+
url: loaded.scenario.url ?? null,
|
|
116
|
+
output: { width: raw.output?.width ?? 1920, height: raw.output?.height ?? 1080 },
|
|
117
|
+
capture: take ? { width: take.width, height: take.height } : loaded.scenario.url ? (loaded.scenario.viewport ?? { width: 1440, height: 900 }) : null,
|
|
118
|
+
hasTake: Boolean(take),
|
|
119
|
+
hasVideo: fs.existsSync(loaded.outputs.mp4),
|
|
120
|
+
presets: Object.fromEntries(BACKGROUNDS.map((b) => [b, PRESETS[b]])),
|
|
121
|
+
defaults: { background: "ocean", padding: 72, radius: 14, shadow: true },
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function pick(style) {
|
|
125
|
+
const out = {};
|
|
126
|
+
for (const k of EDITED)
|
|
127
|
+
if (style[k] !== undefined)
|
|
128
|
+
out[k] = style[k];
|
|
129
|
+
return out;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Write the edited settings (an image path in them is absolute, or relative to the scenario's
|
|
133
|
+
* folder). To the scenario: into its `style`. To the project: into
|
|
134
|
+
* screenplay.config.json, and out of this scenario's `style`, which would otherwise win
|
|
135
|
+
* over the project's and hide the change in this video.
|
|
136
|
+
*/
|
|
137
|
+
export function saveStyle(scenarioFile, target, edited) {
|
|
138
|
+
const values = pick(edited);
|
|
139
|
+
const check = Style.safeParse(values);
|
|
140
|
+
if (!check.success)
|
|
141
|
+
throw new Error(`Invalid style: ${check.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ")}`);
|
|
142
|
+
const raw = JSON.parse(fs.readFileSync(scenarioFile, "utf8"));
|
|
143
|
+
const scenarioDir = path.dirname(scenarioFile);
|
|
144
|
+
if (target === "scenario") {
|
|
145
|
+
raw.style = { ...(raw.style ?? {}), ...relativeImage(values, scenarioDir, scenarioDir) };
|
|
146
|
+
writeJson(scenarioFile, raw);
|
|
147
|
+
return scenarioFile;
|
|
148
|
+
}
|
|
149
|
+
const configFile = findProjectConfig(scenarioDir) ?? path.join(scenarioDir, CONFIG_FILE);
|
|
150
|
+
const config = fs.existsSync(configFile) ? JSON.parse(fs.readFileSync(configFile, "utf8")) : {};
|
|
151
|
+
config.style = { ...(config.style ?? {}), ...relativeImage(values, scenarioDir, path.dirname(configFile)) };
|
|
152
|
+
writeJson(configFile, config);
|
|
153
|
+
if (raw.style) {
|
|
154
|
+
for (const k of EDITED)
|
|
155
|
+
delete raw.style[k];
|
|
156
|
+
if (Object.keys(raw.style).length === 0)
|
|
157
|
+
delete raw.style;
|
|
158
|
+
writeJson(scenarioFile, raw);
|
|
159
|
+
}
|
|
160
|
+
return configFile;
|
|
161
|
+
}
|
|
162
|
+
function absoluteImage(style, dir) {
|
|
163
|
+
return isImagePath(style.background, BACKGROUNDS) ? { ...style, background: path.resolve(dir, style.background) } : style;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Image paths are stored relative to the file that holds them, so the project can move.
|
|
167
|
+
* `from` is the folder a relative path in `style` is relative to.
|
|
168
|
+
*/
|
|
169
|
+
function relativeImage(style, from, to) {
|
|
170
|
+
if (!isImagePath(style.background, BACKGROUNDS))
|
|
171
|
+
return style;
|
|
172
|
+
const abs = path.resolve(from, style.background);
|
|
173
|
+
return { ...style, background: path.relative(to, abs).split(path.sep).join("/") };
|
|
174
|
+
}
|
|
175
|
+
/** An uploaded background goes next to the scenario, in screenplay-assets/. */
|
|
176
|
+
export function saveUpload(scenarioFile, name, body) {
|
|
177
|
+
const ext = (path.extname(name).toLowerCase().match(IMAGE_EXT) ? path.extname(name).toLowerCase() : "") || sniffExt(body);
|
|
178
|
+
if (!ext)
|
|
179
|
+
throw new Error("Use a PNG, JPEG or WebP image.");
|
|
180
|
+
const base = path.basename(name, path.extname(name)).replace(/[^a-z0-9-_]+/gi, "-").replace(/^-+|-+$/g, "").slice(0, 40) || "background";
|
|
181
|
+
const dir = path.join(path.dirname(scenarioFile), "screenplay-assets");
|
|
182
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
183
|
+
const hash = crypto.createHash("sha1").update(body).digest("hex").slice(0, 6);
|
|
184
|
+
const out = path.join(dir, `${base}-${hash}${ext}`);
|
|
185
|
+
fs.writeFileSync(out, body);
|
|
186
|
+
return { path: out };
|
|
187
|
+
}
|
|
188
|
+
function sniffExt(b) {
|
|
189
|
+
if (b.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])))
|
|
190
|
+
return ".png";
|
|
191
|
+
if (b[0] === 0xff && b[1] === 0xd8)
|
|
192
|
+
return ".jpg";
|
|
193
|
+
if (b.subarray(0, 4).toString() === "RIFF" && b.subarray(8, 12).toString() === "WEBP")
|
|
194
|
+
return ".webp";
|
|
195
|
+
return "";
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* The image a background names: only an image file inside the scenario's or the project's
|
|
199
|
+
* folder, or the background the scenario or the project already sets. Never any other file.
|
|
200
|
+
*/
|
|
201
|
+
function imagePathFor(scenarioFile, p, from) {
|
|
202
|
+
if (!p || !IMAGE_EXT.test(p))
|
|
203
|
+
return undefined;
|
|
204
|
+
const scenarioDir = path.dirname(scenarioFile);
|
|
205
|
+
const configFile = findProjectConfig(scenarioDir);
|
|
206
|
+
const projectDir = configFile ? path.dirname(configFile) : scenarioDir;
|
|
207
|
+
const abs = path.resolve(from === "project" ? projectDir : scenarioDir, p);
|
|
208
|
+
const inside = (dir) => abs === dir || abs.startsWith(dir + path.sep);
|
|
209
|
+
const s = state(scenarioFile);
|
|
210
|
+
const named = [s.scenarioStyle.background, s.projectStyle.background];
|
|
211
|
+
if (!inside(scenarioDir) && !inside(projectDir) && !named.includes(abs))
|
|
212
|
+
return undefined;
|
|
213
|
+
return fs.existsSync(abs) && fs.statSync(abs).isFile() ? abs : undefined;
|
|
214
|
+
}
|
|
215
|
+
function readTakeSafe(scenarioFile) {
|
|
216
|
+
try {
|
|
217
|
+
return readTake(loadScenario(scenarioFile, { env: false }).takeDir);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/** A frame of the recording, as filmed (no background, no zoom), shortly after its first action. */
|
|
224
|
+
export async function previewFrame(scenarioFile) {
|
|
225
|
+
const loaded = loadScenario(scenarioFile, { env: false });
|
|
226
|
+
const take = readTakeSafe(scenarioFile);
|
|
227
|
+
if (!take)
|
|
228
|
+
return undefined;
|
|
229
|
+
const first = take.steps.find((s) => s.actionAt !== undefined && !s.card);
|
|
230
|
+
const t = Math.min(take.duration, (first?.actionEnd ?? first?.actionAt ?? take.duration / 2) + 0.6);
|
|
231
|
+
const src = openSource(take, loaded.takeDir);
|
|
232
|
+
try {
|
|
233
|
+
const f = await src.frameAt(t);
|
|
234
|
+
const c = createCanvas(f.sw, f.sh);
|
|
235
|
+
c.getContext("2d").drawImage(f.image, f.sx, f.sy, f.sw, f.sh, 0, 0, f.sw, f.sh);
|
|
236
|
+
return c.encode("jpeg", 88);
|
|
237
|
+
}
|
|
238
|
+
finally {
|
|
239
|
+
src.close();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function writeJson(file, value) {
|
|
243
|
+
fs.writeFileSync(file, `${JSON.stringify(value, null, 2)}\n`);
|
|
244
|
+
}
|
|
245
|
+
function editorPage() {
|
|
246
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
247
|
+
const p = [path.resolve(here, "../../assets/editor/index.html"), path.resolve(here, "../../../assets/editor/index.html")].find((f) => fs.existsSync(f));
|
|
248
|
+
if (!p)
|
|
249
|
+
throw new Error("The style editor page is missing from the package (assets/editor/index.html).");
|
|
250
|
+
return p;
|
|
251
|
+
}
|
|
252
|
+
function mime(p) {
|
|
253
|
+
return /\.png$/i.test(p) ? "image/png" : /\.webp$/i.test(p) ? "image/webp" : "image/jpeg";
|
|
254
|
+
}
|
|
255
|
+
function send(res, code, type, body) {
|
|
256
|
+
res.writeHead(code, { "content-type": type, "cache-control": "no-store" });
|
|
257
|
+
res.end(body);
|
|
258
|
+
}
|
|
259
|
+
function json(res, code, body) {
|
|
260
|
+
send(res, code, "application/json", JSON.stringify(body));
|
|
261
|
+
}
|
|
262
|
+
function readBody(req, max) {
|
|
263
|
+
return new Promise((resolve, reject) => {
|
|
264
|
+
const chunks = [];
|
|
265
|
+
let n = 0;
|
|
266
|
+
req.on("data", (c) => {
|
|
267
|
+
n += c.length;
|
|
268
|
+
if (n > max) {
|
|
269
|
+
reject(new Error("The file is too large."));
|
|
270
|
+
req.destroy();
|
|
271
|
+
}
|
|
272
|
+
else
|
|
273
|
+
chunks.push(c);
|
|
274
|
+
});
|
|
275
|
+
req.on("end", () => resolve(Buffer.concat(chunks)));
|
|
276
|
+
req.on("error", reject);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
/** Serve a file with Range support, so the browser can seek in the video. */
|
|
280
|
+
function streamFile(req, res, file, type) {
|
|
281
|
+
const size = fs.statSync(file).size;
|
|
282
|
+
const m = /bytes=(\d*)-(\d*)/.exec(req.headers.range ?? "");
|
|
283
|
+
if (m) {
|
|
284
|
+
const start = m[1] ? Number(m[1]) : 0;
|
|
285
|
+
const end = m[2] ? Math.min(Number(m[2]), size - 1) : size - 1;
|
|
286
|
+
res.writeHead(206, { "content-type": type, "content-range": `bytes ${start}-${end}/${size}`, "accept-ranges": "bytes", "content-length": end - start + 1, "cache-control": "no-store" });
|
|
287
|
+
fs.createReadStream(file, { start, end }).pipe(res);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
res.writeHead(200, { "content-type": type, "content-length": size, "accept-ranges": "bytes", "cache-control": "no-store" });
|
|
291
|
+
fs.createReadStream(file).pipe(res);
|
|
292
|
+
}
|
|
293
|
+
function openBrowser(url) {
|
|
294
|
+
const cmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "cmd" : "xdg-open";
|
|
295
|
+
const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
|
|
296
|
+
try {
|
|
297
|
+
spawn(cmd, args, { stdio: "ignore", detached: true }).on("error", () => { }).unref();
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
/* no browser: the link is printed */
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/editor/server.ts"],"names":[],"mappings":"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"}
|
package/dist/ffmpeg.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** ffmpeg to use: SCREENPLAY_FFMPEG, then the bundled ffmpeg-static, then ffmpeg on the PATH. */
|
|
2
|
+
export declare function ffmpegPath(): string;
|
|
3
|
+
/** ffmpeg for screen capture: the system one first, since static builds may lack capture devices. */
|
|
4
|
+
export declare function captureFfmpegPath(): string;
|
|
5
|
+
export declare function runFfmpeg(args: string[], bin?: string): Promise<void>;
|
package/dist/ffmpeg.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
let cached;
|
|
6
|
+
/** ffmpeg to use: SCREENPLAY_FFMPEG, then the bundled ffmpeg-static, then ffmpeg on the PATH. */
|
|
7
|
+
export function ffmpegPath() {
|
|
8
|
+
if (cached)
|
|
9
|
+
return cached;
|
|
10
|
+
const env = process.env.SCREENPLAY_FFMPEG;
|
|
11
|
+
if (env)
|
|
12
|
+
return (cached = env);
|
|
13
|
+
try {
|
|
14
|
+
const p = require("ffmpeg-static");
|
|
15
|
+
if (p && fs.existsSync(p))
|
|
16
|
+
return (cached = p);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
/* not installed */
|
|
20
|
+
}
|
|
21
|
+
const probe = spawnSync("ffmpeg", ["-version"], { stdio: "ignore" });
|
|
22
|
+
if (probe.status === 0)
|
|
23
|
+
return (cached = "ffmpeg");
|
|
24
|
+
throw new Error("ffmpeg not found. Reinstall screenplay, or set SCREENPLAY_FFMPEG to an ffmpeg executable.");
|
|
25
|
+
}
|
|
26
|
+
/** ffmpeg for screen capture: the system one first, since static builds may lack capture devices. */
|
|
27
|
+
export function captureFfmpegPath() {
|
|
28
|
+
if (process.env.SCREENPLAY_FFMPEG)
|
|
29
|
+
return process.env.SCREENPLAY_FFMPEG;
|
|
30
|
+
const probe = spawnSync("ffmpeg", ["-version"], { stdio: "ignore" });
|
|
31
|
+
if (probe.status === 0)
|
|
32
|
+
return "ffmpeg";
|
|
33
|
+
return ffmpegPath();
|
|
34
|
+
}
|
|
35
|
+
export function runFfmpeg(args, bin = ffmpegPath()) {
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
const p = spawn(bin, ["-hide_banner", "-loglevel", "error", "-y", ...args]);
|
|
38
|
+
let err = "";
|
|
39
|
+
p.stderr.on("data", (d) => (err += d.toString()));
|
|
40
|
+
p.on("error", reject);
|
|
41
|
+
p.on("close", (code) => (code === 0 ? resolve() : reject(new Error(`ffmpeg failed (${code}): ${err.slice(-2000)}`))));
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=ffmpeg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ffmpeg.js","sourceRoot":"","sources":["../src/ffmpeg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,IAAI,MAA0B,CAAC;AAE/B,iGAAiG;AACjG,MAAM,UAAU,UAAU;IACxB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC1C,IAAI,GAAG;QAAE,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,CAAkB,CAAC;QACpD,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,mBAAmB;IACrB,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;IACnD,MAAM,IAAI,KAAK,CAAC,2FAA2F,CAAC,CAAC;AAC/G,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,iBAAiB;IAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACxE,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACxC,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAc,EAAE,GAAG,GAAG,UAAU,EAAE;IAC1D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAC5E,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtB,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,IAAI,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/guide.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** The package root (works from src/ under tsx and from dist/). */
|
|
2
|
+
export declare function packageRoot(): string;
|
|
3
|
+
export declare function skillFile(): string;
|
|
4
|
+
/** The agent guide: the skill without its front matter. */
|
|
5
|
+
export declare function guideText(): string;
|
|
6
|
+
export declare function schemaText(): string;
|
package/dist/guide.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
/** The package root (works from src/ under tsx and from dist/). */
|
|
5
|
+
export function packageRoot() {
|
|
6
|
+
let dir = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
for (let i = 0; i < 4; i++) {
|
|
8
|
+
if (fs.existsSync(path.join(dir, "package.json")) && fs.existsSync(path.join(dir, "skills")))
|
|
9
|
+
return dir;
|
|
10
|
+
dir = path.dirname(dir);
|
|
11
|
+
}
|
|
12
|
+
throw new Error("Screenplay's package files are missing (skills/).");
|
|
13
|
+
}
|
|
14
|
+
export function skillFile() {
|
|
15
|
+
return path.join(packageRoot(), "skills", "screenplay", "SKILL.md");
|
|
16
|
+
}
|
|
17
|
+
/** The agent guide: the skill without its front matter. */
|
|
18
|
+
export function guideText() {
|
|
19
|
+
const raw = fs.readFileSync(skillFile(), "utf8");
|
|
20
|
+
return raw.replace(/^---[\s\S]*?---\s*/, "");
|
|
21
|
+
}
|
|
22
|
+
export function schemaText() {
|
|
23
|
+
return fs.readFileSync(path.join(packageRoot(), "schema", "scenario.schema.json"), "utf8");
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=guide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guide.js","sourceRoot":"","sources":["../src/guide.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,mEAAmE;AACnE,MAAM,UAAU,WAAW;IACzB,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QACzG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AACtE,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,sBAAsB,CAAC,EAAE,MAAM,CAAC,CAAC;AAC7F,CAAC"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface InitOptions {
|
|
2
|
+
browser?: boolean;
|
|
3
|
+
mcp?: boolean;
|
|
4
|
+
skill?: boolean;
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
home?: string;
|
|
7
|
+
log?: (msg: string) => void;
|
|
8
|
+
}
|
|
9
|
+
export interface InitReport {
|
|
10
|
+
done: string[];
|
|
11
|
+
skipped: string[];
|
|
12
|
+
warnings: string[];
|
|
13
|
+
}
|
|
14
|
+
/** How agents should start the MCP server: from npm, or from this checkout when not installed from npm. */
|
|
15
|
+
export declare function mcpCommand(): {
|
|
16
|
+
command: string;
|
|
17
|
+
args: string[];
|
|
18
|
+
};
|
|
19
|
+
export declare function init(opts?: InitOptions): Promise<InitReport>;
|