pup-recorder 0.0.13 → 0.0.15
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/dist/cjs/index.cjs +5 -2
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/mcp_server.cjs +5 -2
- package/dist/cjs/mcp_server.cjs.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp_server.js +5 -2
- package/dist/mcp_server.js.map +1 -1
- package/package.json +5 -2
package/dist/cjs/index.cjs
CHANGED
|
@@ -75,9 +75,12 @@ var import_zod2 = __toESM(require("zod"), 1);
|
|
|
75
75
|
// package.json
|
|
76
76
|
var package_default = {
|
|
77
77
|
name: "pup-recorder",
|
|
78
|
-
version: "0.0.
|
|
78
|
+
version: "0.0.15",
|
|
79
79
|
description: "A nice webview recording tool.",
|
|
80
|
-
|
|
80
|
+
repository: {
|
|
81
|
+
type: "git",
|
|
82
|
+
url: "https://github.com/Autokaka/pup-recorder.git"
|
|
83
|
+
},
|
|
81
84
|
license: "MIT",
|
|
82
85
|
author: "autokaka",
|
|
83
86
|
type: "module",
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../../../node_modules/.bun/tsup@8.5.1+3f29b90437d001ad/node_modules/tsup/assets/cjs_shims.js","../../src/ai/mcp.ts","../../package.json","../../src/base/schema.ts","../../src/pup.ts","../../src/base/abort.ts","../../src/base/constants.ts","../../src/base/basedir.ts","../../src/base/env.ts","../../src/base/parser.ts","../../src/base/electron.ts","../../src/base/process.ts","../../src/base/logging.ts","../../src/base/ffmpeg.ts","../../src/base/encoder.ts","../../src/base/limiter.ts","../../src/base/stream.ts","../../src/ai/opencode.ts","../../src/base/lazy.ts","../../src/base/noerr.ts","../../src/base/retry.ts","../../src/base/timing.ts"],"sourcesContent":["// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport * from \"./ai/mcp\";\nexport * from \"./ai/opencode\";\n\nexport * from \"./base/constants\";\nexport * from \"./base/env\";\nexport * from \"./base/lazy\";\nexport * from \"./base/limiter\";\nexport * from \"./base/logging\";\nexport * from \"./base/noerr\";\nexport * from \"./base/parser\";\nexport * from \"./base/process\";\nexport * from \"./base/retry\";\nexport * from \"./base/schema\";\nexport * from \"./base/timing\";\n\nexport * from \"./pup\";\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport z from \"zod\";\nimport packageJSON from \"../../package.json\";\nimport { RecordSchema } from \"../base/schema\";\nimport { pup } from \"../pup\";\n\nexport const PupMCPSchema = z\n .object({ source: z.string().describe(\"file://, http(s)://, or data: URI\") })\n .extend(RecordSchema.shape);\n\nexport const MCP_TOOL_NAME = packageJSON.name;\nexport const MCP_TOOL_TITLE = \"Record Webpage\";\nexport const MCP_TOOL_DESC = \"Record a webpage to video\";\n\nexport function mcpAddPup(server: McpServer) {\n server.registerTool(\n MCP_TOOL_NAME,\n {\n title: MCP_TOOL_TITLE,\n description: MCP_TOOL_DESC,\n inputSchema: PupMCPSchema,\n },\n async (args) => {\n try {\n const result = await pup(args.source, args);\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n { type: \"text\", text: JSON.stringify({ error: String(error) }) },\n ],\n };\n }\n },\n );\n}\n\nexport async function startMCPServer() {\n const server = new McpServer(packageJSON);\n mcpAddPup(server);\n await server.connect(new StdioServerTransport());\n}\n","{\n \"name\": \"pup-recorder\",\n \"version\": \"0.0.12\",\n \"description\": \"A nice webview recording tool.\",\n \"homepage\": \"https://github.com/Autokaka/pup-recorder\",\n \"license\": \"MIT\",\n \"author\": \"autokaka\",\n \"type\": \"module\",\n \"bin\": {\n \"pup\": \"dist/cli.js\",\n \"pup-cjs\": \"dist/cjs/cli.cjs\",\n \"pup-mcp-server\": \"dist/mcp_server.js\",\n \"pup-mcp-server-cjs\": \"dist/cjs/mcp_server.cjs\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n }\n },\n \"engines\": {\n \"bun\": \">= 1\",\n \"node\": \">= 20\"\n },\n \"engineStrict\": true,\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/node\": \"^20.0.0\",\n \"@typescript/native-preview\": \"latest\",\n \"tsup\": \"latest\",\n \"typescript\": \"latest\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"latest\",\n \"@opencode-ai/plugin\": \"latest\",\n \"commander\": \"latest\",\n \"electron\": \"latest\",\n \"zod\": \"latest\"\n },\n \"scripts\": {\n \"build\": \"bun build.ts && bun build_rust.ts\"\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport type { Size } from \"electron\";\nimport z from \"zod\";\n\nexport interface VideoSpec {\n fps: number;\n frames: number;\n size: Size;\n}\n\nexport interface VideoFiles {\n mp4?: string;\n webm?: string;\n mov?: string;\n}\n\nexport interface VideoFilesWithCover extends VideoFiles {\n cover: string;\n}\n\nexport const DEFAULT_WIDTH = 1920;\nexport const DEFAULT_HEIGHT = 1080;\nexport const DEFAULT_FPS = 30;\nexport const DEFAULT_DURATION = 5;\nexport const DEFAULT_OUT_DIR = \"out\";\n\nexport const RecordSchema = z.object({\n duration: z\n .number()\n .optional()\n .default(DEFAULT_DURATION)\n .describe(\"Recording duration in seconds\"),\n width: z.number().optional().default(DEFAULT_WIDTH).describe(\"Video width\"),\n height: z\n .number()\n .optional()\n .default(DEFAULT_HEIGHT)\n .describe(\"Video height\"),\n fps: z.number().optional().default(DEFAULT_FPS).describe(\"Frames per second\"),\n withAlphaChannel: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Output with alpha channel\"),\n outDir: z\n .string()\n .optional()\n .default(DEFAULT_OUT_DIR)\n .describe(\"Output directory\"),\n useInnerProxy: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Use bilibili inner proxy for resource access\"),\n});\n\nexport interface RecordOptions {\n duration: number;\n width: number;\n height: number;\n fps: number;\n withAlphaChannel: boolean;\n outDir: string;\n useInnerProxy: boolean;\n}\n\nexport interface RecordResult {\n options: RecordOptions;\n written: number;\n bgraPath: string;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { spawn } from \"child_process\";\nimport type { Size } from \"electron\";\nimport { readFile, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { AbortLink, type AbortQuery } from \"./base/abort\";\nimport { pupAppPath } from \"./base/constants\";\nimport { runElectronApp } from \"./base/electron\";\nimport { encodeBgraFile, encodeBgraToMov } from \"./base/encoder\";\nimport { createCoverCommand } from \"./base/ffmpeg\";\nimport { ConcurrencyLimiter } from \"./base/limiter\";\nimport { logger } from \"./base/logging\";\nimport { parseNumber } from \"./base/parser\";\nimport { type ProcessHandle } from \"./base/process\";\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n type RecordOptions,\n type RecordResult,\n type VideoFilesWithCover,\n type VideoSpec,\n} from \"./base/schema\";\nimport { waitAll } from \"./base/stream\";\n\nconst TAG = \"[pup]\";\nconst PROGRESS_TAG = \" progress: \";\n\nexport type PupProgressCallback = (progress: number) => Promise<void> | void;\n\nexport interface PupOptions extends Partial<RecordOptions> {\n cancelQuery?: AbortQuery;\n onProgress?: PupProgressCallback;\n}\n\nfunction runPupApp(source: string, options: PupOptions) {\n logger.debug(TAG, `runPupApp`, source, options);\n\n const args: string[] = [source];\n if (options.width) args.push(\"--width\", `${options.width}`);\n if (options.height) args.push(\"--height\", `${options.height}`);\n if (options.fps) args.push(\"--fps\", `${options.fps}`);\n if (options.duration) args.push(\"--duration\", `${options.duration}`);\n if (options.outDir) args.push(\"--out-dir\", options.outDir);\n if (options.withAlphaChannel) args.push(\"--with-alpha-channel\");\n if (options.useInnerProxy) args.push(\"--use-inner-proxy\");\n\n const w = options.width ?? DEFAULT_WIDTH;\n const h = options.height ?? DEFAULT_HEIGHT;\n const handle = runElectronApp({ width: w, height: h }, pupAppPath, args);\n const counter = new ConcurrencyLimiter(1);\n handle.process.stdout?.on(\"data\", (data: Buffer) => {\n let message = data.toString().trim();\n let start = message.indexOf(PROGRESS_TAG);\n if (start < 0) {\n return;\n }\n message = message.slice(start + PROGRESS_TAG.length);\n const end = message.indexOf(\"%\");\n if (end < 0) {\n return;\n }\n const progressStr = message.slice(0, end);\n const progress = parseNumber(progressStr);\n counter.schedule(async () => {\n await options.onProgress?.(progress);\n });\n });\n return { handle, counter };\n}\n\nexport async function pup(source: string, options: PupOptions) {\n logger.debug(TAG, `pup`, source, options);\n\n const link = AbortLink.start(options.cancelQuery);\n const outDir = options.outDir ?? \"out\";\n\n const t0 = performance.now();\n const { handle, counter } = runPupApp(source, { ...options, outDir });\n\n await link.wait(handle);\n await counter.end();\n logger.info(TAG, `capture cost ${Math.round(performance.now() - t0)}ms`);\n\n const metaPath = join(outDir, \"record.json\");\n const meta = JSON.parse(await readFile(metaPath, \"utf-8\")) as RecordResult;\n\n const { bgraPath, written, options: recordOptions } = meta;\n const { fps, width, height, withAlphaChannel } = recordOptions;\n const size: Size = { width, height };\n\n const outputs: VideoFilesWithCover = {\n mp4: withAlphaChannel ? undefined : join(outDir, \"output.mp4\"),\n webm: withAlphaChannel ? join(outDir, \"output.webm\") : undefined,\n mov: withAlphaChannel ? join(outDir, \"output.mov\") : undefined,\n cover: join(outDir, \"cover.png\"),\n };\n\n try {\n const t1 = performance.now();\n\n const spec: VideoSpec = { fps, frames: written, size };\n const handles: ProcessHandle[] = [];\n if (outputs.mp4) {\n handles.push(encodeBgraFile(bgraPath, outputs.mp4, spec, \"mp4\"));\n }\n if (outputs.webm) {\n handles.push(encodeBgraFile(bgraPath, outputs.webm, spec, \"webm\"));\n }\n if (outputs.mov) {\n handles.push(encodeBgraToMov(bgraPath, outputs.mov, spec));\n }\n await link.wait(...handles);\n\n const coverSrc = outputs.mov ?? outputs.webm ?? outputs.mp4;\n if (coverSrc) {\n const coverCmd = createCoverCommand(coverSrc, outputs.cover);\n await waitAll(\n spawn(coverCmd.command, coverCmd.args, { stdio: \"inherit\" }),\n );\n }\n\n link.stop();\n logger.info(TAG, `encoding cost ${Math.round(performance.now() - t1)}ms`);\n\n await Promise.all([\n rm(bgraPath, { force: true }),\n rm(metaPath, { force: true }),\n ]);\n return {\n ...outputs,\n width,\n height,\n fps,\n duration: Math.ceil(written / fps),\n };\n } catch (error) {\n await rm(outDir, { recursive: true, force: true });\n throw error;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/11.\n\nimport type { ProcessHandle } from \"./process\";\n\nexport type AsyncTask = () => Promise<void> | void;\nexport type AbortQuery = () => Promise<boolean> | boolean;\n\nexport class AbortLink {\n private _callback?: AsyncTask;\n private _aborted?: boolean;\n private _stopped = false;\n\n private constructor(\n readonly query?: AbortQuery,\n readonly interval: number = 1000,\n ) {\n if (query) {\n this.tick();\n }\n }\n\n static start(query?: AbortQuery, interval?: number) {\n return new AbortLink(query, interval);\n }\n\n get aborted() {\n return !this._stopped && this._aborted;\n }\n\n get stopped() {\n return this._stopped;\n }\n\n async onAbort(callback: AsyncTask) {\n if (this._aborted) {\n await callback();\n } else {\n this._callback = callback;\n }\n }\n\n wait(...handles: ProcessHandle[]) {\n const abort = new Promise((_, reject) => {\n this.onAbort(async () => {\n handles.forEach((h) => h.process.kill());\n reject(new Error(\"aborted\"));\n });\n });\n return Promise.race([\n abort,\n Promise.all(handles.map((h) => h.wait)), //\n ]);\n }\n\n stop() {\n this._stopped = true;\n }\n\n private tick() {\n setTimeout(async () => {\n if (this._stopped) {\n return;\n }\n this._aborted = await this.query?.();\n if (this._stopped) {\n return;\n }\n if (this._aborted) {\n await this._callback?.();\n } else {\n this.tick();\n }\n }, this.interval);\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { basedir } from \"./basedir\";\nimport { penv } from \"./env\";\nimport { parseNumber } from \"./parser\";\n\nconst pupAppSearchPaths = [\n join(basedir, \"cjs/app.cjs\"), // process from dist\n join(basedir, \"app.cjs\"), // process from dist/cjs\n join(basedir, \"../../cjs/app.cjs\"), // process from src\n];\nexport const pupAppPath = pupAppSearchPaths.find(existsSync)!;\n\nconst env = process.env;\nexport const pupLogLevel = penv(\"PUP_LOG_LEVEL\", parseNumber, 2);\nexport const pupUseInnerProxy = env[\"PUP_USE_INNER_PROXY\"] === \"1\";\nexport const pupFFmpegPath = env[\"FFMPEG_BIN\"] ?? `ffmpeg`;\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport { dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nexport const basedir = dirname(fileURLToPath(import.meta.url));\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nexport type EnvParser<T> = (value: unknown) => T;\n\nexport function penv<T>(name: string, parser: EnvParser<T>, defaultValue: T): T;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined {\n try {\n return parser(process.env[name]);\n } catch {\n return defaultValue;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport function parseNumber(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new Error(`Value ${value} is not a valid number`);\n }\n return num;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport electron, { type Size } from \"electron\";\nimport { exec } from \"./process\";\n\nexport const ELECTRON_OPTS = [\n \"no-sandbox\",\n \"disable-setuid-sandbox\",\n \"disable-gpu\",\n \"disable-dev-shm-usage\",\n \"disable-software-rasterizer\",\n \"disable-web-security\",\n \"disable-site-isolation-trials\",\n \"disable-features=IsolateOrigins,site-per-process\",\n \"allow-insecure-localhost\",\n \"ignore-certificate-errors\",\n \"disable-blink-features=AutomationControlled\",\n \"mute-audio\",\n \"disable-extensions\",\n \"disable-background-networking\",\n \"address-family=ipv4\",\n \"disable-async-dns\",\n \"force-device-scale-factor=1\",\n \"trace-warnings\",\n \"force-color-profile=srgb\",\n \"disable-color-correct-rendering\",\n \"log-level=3\",\n];\n\nexport function runElectronApp(size: Size, app: unknown, args: unknown[]) {\n const electronArgs = ELECTRON_OPTS.map((a) => `--${a}`);\n const cmdParts = [];\n if (process.platform === \"linux\") {\n cmdParts.push(\n \"xvfb-run\",\n \"--auto-servernum\",\n `--server-args='-screen 0 ${size.width}x${size.height}x24'`,\n );\n }\n cmdParts.push(electron, ...electronArgs, app);\n return exec(cmdParts.join(\" \"), {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: true,\n env: {\n ...process.env,\n ELECTRON_DISABLE_DBUS: \"1\",\n RUST_BACKTRACE: \"full\",\n __PUP_ARGS__: JSON.stringify(args),\n },\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nimport { spawn, type ChildProcess, type SpawnOptions } from \"child_process\";\nimport { logger } from \"./logging\";\n\nexport const PUP_ARGS_ENV_KEY = \"__PUP_ARGS__\";\n\nexport function pargs() {\n const pupArgs = process.env[PUP_ARGS_ENV_KEY];\n if (pupArgs) {\n const args = [\"exec\", ...process.argv.slice(-1)];\n args.push(...JSON.parse(pupArgs));\n logger.debug(\"pupargs\", args);\n return args;\n }\n\n logger.debug(\"procargv\", process.argv);\n return process.argv;\n}\n\nexport interface ProcessHandle {\n process: ChildProcess;\n wait: Promise<void>;\n}\n\nexport function exec(cmd: string, options?: SpawnOptions): ProcessHandle {\n const parts = cmd.split(\" \").filter((s) => s.length);\n const [command, ...args] = parts;\n if (!command) throw new Error(\"empty command\");\n const proc = spawn(command, args, {\n stdio: \"inherit\",\n ...options,\n });\n return { process: proc, wait: logger.attach(proc, command) };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport { ChildProcess, type Serializable } from \"child_process\";\nimport { pupLogLevel } from \"./constants\";\n\nexport interface LoggerLike {\n debug?(this: void, ...messages: unknown[]): void;\n\n info?(this: void, ...messages: unknown[]): void;\n\n warn?(this: void, ...messages: unknown[]): void;\n\n error?(this: void, ...messages: unknown[]): void;\n}\n\nconst DEBUG = \"<pup@debug>\";\nconst INFO = \"<pup@info>\";\nconst WARN = \"<pup@warn>\";\nconst ERROR = \"<pup@error>\";\nconst FATAL = \"<pup@fatal>\";\n\nclass Logger implements LoggerLike {\n private _impl?: LoggerLike;\n\n get impl(): LoggerLike | undefined {\n return this._impl;\n }\n\n set impl(value: LoggerLike) {\n const debug = value.debug ?? console.debug;\n const info = value.info ?? console.info;\n const warn = value.warn ?? console.warn;\n const error = value.error ?? console.error;\n this._impl = {\n debug: pupLogLevel >= 3 ? debug : undefined,\n info: pupLogLevel >= 2 ? info : undefined,\n warn: pupLogLevel >= 1 ? warn : undefined,\n error: pupLogLevel >= 0 ? error : undefined,\n };\n }\n\n constructor() {\n this.impl = console;\n }\n\n debug(...messages: unknown[]): void {\n this.impl?.debug?.(DEBUG, ...messages);\n }\n\n info(...messages: unknown[]): void {\n this.impl?.info?.(INFO, ...messages);\n }\n\n warn(...messages: unknown[]): void {\n this.impl?.warn?.(WARN, ...messages);\n }\n\n error(...messages: unknown[]): void {\n this.impl?.error?.(ERROR, ...messages);\n }\n\n fatal(...messages: unknown[]): never {\n this.impl?.error?.(FATAL, ...messages);\n process.exit(1);\n }\n\n private dispatch(message: string) {\n if (message.startsWith(DEBUG)) {\n this.debug(message.slice(DEBUG.length + 1));\n } else if (message.startsWith(INFO)) {\n this.info(message.slice(INFO.length + 1));\n } else if (message.startsWith(WARN)) {\n this.warn(message.slice(WARN.length + 1));\n } else if (message.startsWith(ERROR)) {\n this.error(message.slice(ERROR.length + 1));\n } else {\n this.info(message);\n }\n }\n\n attach(proc: ChildProcess, name: string) {\n return new Promise<void>((resolve, reject) => {\n this.debug(`${name}.attach`);\n let fatal: string = \"\";\n const dispatch = (data: Buffer | Serializable) => {\n const message = data.toString();\n if (message.startsWith(FATAL)) {\n fatal += message.slice(FATAL.length + 1);\n } else {\n this.dispatch(message);\n }\n };\n proc.stderr?.on(\"data\", dispatch);\n proc.stdout?.on(\"data\", dispatch);\n proc\n .on(\"message\", dispatch)\n .on(\"error\", (err) => {\n fatal += err.message;\n proc.kill();\n })\n .once(\"close\", (code, signal) => {\n if (code || signal || fatal) {\n fatal ||= `command failed: ${proc.spawnargs.join(\" \")}`;\n this.error(`${name}.close`, { code, signal, fatal });\n reject(new Error(fatal));\n } else {\n this.debug(`${name}.close`);\n resolve();\n }\n })\n .on(\"unhandledRejection\", (reason) => {\n this.error(`${name}.unhandled`, reason);\n })\n .on(\"uncaughtExceptionMonitor\", (err) => {\n this.error(`${name}.unhandled`, err);\n });\n });\n }\n}\n\nconst logger = new Logger();\n\nexport { logger };\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { arch, platform } from \"process\";\nimport { basedir } from \"./basedir\";\nimport { pupFFmpegPath } from \"./constants\";\nimport type { VideoFiles, VideoSpec } from \"./schema\";\n\ninterface Command {\n command: string;\n args: string[];\n}\n\nconst quiet = [\"-hide_banner\", \"-loglevel\", \"error\", \"-nostats\"];\n\nfunction resolveX265() {\n const path = `x265/${platform}-${arch}`;\n const dirs = [\n join(basedir, `../../${path}`), // process from src\n join(basedir, `../${path}`), // process from dist\n ];\n const found = dirs.find(existsSync);\n if (!found) {\n throw new Error(\"x265 not found\");\n }\n return found;\n}\n\nexport function createBgraFileCommand(\n bgraPath: string,\n spec: VideoSpec,\n files: VideoFiles,\n): Command {\n const { fps, frames } = spec;\n const args = [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${spec.size.width}x${spec.size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-frames:v\",\n `${Math.floor(frames)}`,\n ];\n if (files.mp4) {\n args.push(\n \"-colorspace\",\n \"bt709\",\n \"-color_primaries\",\n \"bt709\",\n \"-color_trc\",\n \"bt709\",\n \"-c:v\",\n \"libx264\",\n \"-preset\",\n \"fast\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuv420p\",\n \"-movflags\",\n \"+faststart\",\n files.mp4,\n );\n }\n if (files.webm) {\n args.push(\n \"-c:v\",\n \"libvpx-vp9\",\n \"-row-mt\",\n \"1\",\n \"-cpu-used\",\n \"1\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuva420p\",\n \"-auto-alt-ref\",\n \"0\",\n files.webm,\n );\n }\n return { command: pupFFmpegPath, args };\n}\n\ninterface X265Pipeline {\n raw: Command;\n x265: Command;\n mux: Command;\n}\n\nexport function createBgraToMovPipeline(\n bgraPath: string,\n spec: VideoSpec,\n mov: string,\n): X265Pipeline {\n const { fps, size } = spec;\n return {\n raw: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${size.width}x${size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"yuva420p10le\",\n \"pipe:1\",\n ],\n },\n x265: {\n command: resolveX265(),\n args: [\n \"--no-progress\",\n \"--log-level\",\n \"error\",\n \"--input\",\n \"-\",\n \"--input-res\",\n `${size.width}x${size.height}`,\n \"--input-csp\",\n \"i420\",\n \"--input-depth\",\n \"10\",\n \"--output-depth\",\n \"10\",\n \"--fps\",\n `${fps}`,\n \"--alpha\",\n \"--bframes\",\n \"0\",\n \"--colorprim\",\n \"bt709\",\n \"--transfer\",\n \"bt709\",\n \"--colormatrix\",\n \"bt709\",\n \"--crf\",\n \"18\",\n \"--output\",\n \"-\",\n ],\n },\n mux: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"hevc\",\n \"-r\",\n `${fps}`,\n \"-i\",\n \"pipe:0\",\n \"-c:v\",\n \"copy\",\n \"-tag:v\",\n \"hvc1\",\n \"-movflags\",\n \"+faststart\",\n mov,\n ],\n },\n };\n}\n\nexport function createCoverCommand(src: string, dst: string): Command {\n return {\n command: pupFFmpegPath,\n args: [\"-y\", ...quiet, \"-i\", src, \"-frames:v\", \"1\", \"-q:v\", \"2\", dst],\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { createBgraFileCommand, createBgraToMovPipeline } from \"./ffmpeg\";\nimport { exec, type ProcessHandle } from \"./process\";\nimport type { VideoSpec } from \"./schema\";\n\nexport function encodeBgraFile(\n bgraPath: string,\n outputPath: string,\n spec: VideoSpec,\n format: \"mp4\" | \"webm\",\n): ProcessHandle {\n const files = format === \"mp4\" ? { mp4: outputPath } : { webm: outputPath };\n const cmd = createBgraFileCommand(bgraPath, spec, files);\n return exec(`${cmd.command} ${cmd.args.join(\" \")}`, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n });\n}\n\nexport function encodeBgraToMov(\n bgraPath: string,\n movPath: string,\n spec: VideoSpec,\n): ProcessHandle {\n const x265 = createBgraToMovPipeline(bgraPath, spec, movPath);\n const shellCmd = [\n `${x265.raw.command} ${x265.raw.args.join(\" \")}`,\n `${x265.x265.command} ${x265.x265.args.join(\" \")}`,\n `${x265.mux.command} ${x265.mux.args.join(\" \")}`,\n ].join(\" | \");\n return exec(shellCmd, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n shell: true,\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport class ConcurrencyLimiter {\n private _active = 0;\n private _queue: VoidFunction[] = [];\n private _pending = 0;\n private _ended = false;\n\n constructor(readonly maxConcurrency: number) {}\n\n get active(): number {\n return this._active;\n }\n\n get pending(): number {\n return this._pending;\n }\n\n async schedule<T>(fn: () => Promise<T>): Promise<T> {\n if (this._ended) {\n throw new Error(\"ended\");\n }\n return new Promise<T>((resolve, reject) => {\n const run = () => {\n this._active++;\n this._pending--;\n fn()\n .then(resolve)\n .catch(reject)\n .finally(() => {\n this._active--;\n this.next();\n });\n };\n this._pending++;\n if (this._active < this.maxConcurrency) {\n run();\n } else {\n this._queue.push(run);\n }\n });\n }\n\n async end() {\n if (!this._ended) {\n this._ended = true;\n while (this._active > 0 || this._pending > 0) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n }\n }\n\n private next() {\n if (this._active < this.maxConcurrency && this._queue.length > 0) {\n this._queue.shift()?.();\n }\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport type { ChildProcess } from \"child_process\";\n\nexport interface StreamWriter {\n write(buffer: Buffer): Promise<void>;\n end(): void;\n}\n\nexport function createWriter(stdin: NodeJS.WritableStream): StreamWriter {\n const drainPromise = new Map<NodeJS.WritableStream, Promise<void>>();\n\n const waitDrain = (stream: NodeJS.WritableStream) => {\n const existing = drainPromise.get(stream);\n if (existing) return existing;\n const promise = new Promise<void>((resolve, reject) => {\n const cleanup = (fn: () => void) => {\n stream.off(\"drain\", onDrain);\n stream.off(\"error\", onError);\n stream.off(\"close\", onClose);\n drainPromise.delete(stream);\n fn();\n };\n const onDrain = () => cleanup(resolve);\n const onError = (err: Error) => cleanup(() => reject(err));\n const onClose = () => cleanup(() => reject(new Error(\"stream closed\")));\n stream.on(\"drain\", onDrain);\n stream.on(\"error\", onError);\n stream.on(\"close\", onClose);\n });\n drainPromise.set(stream, promise);\n return promise;\n };\n\n const destroyed = () => Reflect.get(stdin, \"destroyed\");\n return {\n async write(buffer: Buffer) {\n if (destroyed()) {\n throw new Error(\"stdin destroyed\");\n }\n if (!stdin.write(buffer)) {\n await waitDrain(stdin);\n }\n },\n end: () => {\n if (!destroyed()) stdin.end();\n },\n };\n}\n\nexport function pipeline(...procs: ChildProcess[]) {\n for (let i = 0; i < procs.length - 1; i++) {\n const src = procs[i];\n const dst = procs[i + 1];\n if (!src?.stdout || !dst?.stdin) throw new Error(\"pipeline broken\");\n src.stdout.pipe(dst.stdin);\n }\n}\n\nexport function waitAll(...procs: ChildProcess[]) {\n return Promise.all(\n procs.map(\n (proc) =>\n new Promise<void>((resolve, reject) => {\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) =>\n code === 0\n ? resolve()\n : reject(new Error(`exit ${code ?? \"null\"}`)),\n );\n }),\n ),\n );\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport type { Plugin } from \"@opencode-ai/plugin\";\nimport { tool } from \"@opencode-ai/plugin\";\nimport {\n DEFAULT_DURATION,\n DEFAULT_FPS,\n DEFAULT_HEIGHT,\n DEFAULT_OUT_DIR,\n DEFAULT_WIDTH,\n} from \"../base/schema\";\nimport { pup } from \"../pup\";\nimport { MCP_TOOL_DESC, MCP_TOOL_NAME, PupMCPSchema } from \"./mcp\";\n\nconst z = tool.schema;\n\nconst PupPluginSchema = z.object({\n source: z.string().describe(PupMCPSchema.shape.source.description!),\n duration: z\n .number()\n .optional()\n .default(DEFAULT_DURATION)\n .describe(PupMCPSchema.shape.duration.description!),\n width: z\n .number()\n .optional()\n .default(DEFAULT_WIDTH)\n .describe(PupMCPSchema.shape.width.description!),\n height: z\n .number()\n .optional()\n .default(DEFAULT_HEIGHT)\n .describe(PupMCPSchema.shape.height.description!),\n fps: z\n .number()\n .optional()\n .default(DEFAULT_FPS)\n .describe(PupMCPSchema.shape.fps.description!),\n withAlphaChannel: z\n .boolean()\n .optional()\n .default(false)\n .describe(PupMCPSchema.shape.withAlphaChannel.description!),\n outDir: z\n .string()\n .optional()\n .default(DEFAULT_OUT_DIR)\n .describe(PupMCPSchema.shape.outDir.description!),\n useInnerProxy: z\n .boolean()\n .optional()\n .default(false)\n .describe(PupMCPSchema.shape.useInnerProxy.description!),\n});\n\nexport const PupOpenCodePlugin: Plugin = async () => {\n return {\n tool: {\n [MCP_TOOL_NAME]: tool({\n description: MCP_TOOL_DESC,\n args: PupPluginSchema.shape,\n async execute(args) {\n try {\n const result = await pup(args.source, args);\n return JSON.stringify(result, null, 2);\n } catch (error) {\n return JSON.stringify({ error: String(error) });\n }\n },\n }),\n },\n };\n};\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport class Lazy<T> {\n constructor(readonly makeValue: () => T) {}\n\n get value(): T {\n if (!this._initialized) {\n this._value = this.makeValue();\n this._initialized = true;\n }\n return this._value!;\n }\n\n get initialized(): boolean {\n return this._initialized;\n }\n\n private _initialized = false;\n private _value: T | undefined;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/24.\n\nexport function noerr<Fn extends (...args: any[]) => any, D>(\n fn: Fn,\n defaultValue: D,\n): (...args: Parameters<Fn>) => ReturnType<Fn> | D {\n return (...args) => {\n try {\n const ret = fn(...args);\n if (ret instanceof Promise) {\n return ret.catch(() => defaultValue);\n }\n return ret;\n } catch {\n return defaultValue;\n }\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/05.\n\nimport { setTimeout } from \"timers/promises\";\nimport { sleep } from \"./timing\";\n\nexport interface RetryOptions<Args extends any[], Ret> {\n fn: (...args: Args) => Promise<Ret>;\n maxAttempts?: number;\n timeout?: number;\n}\n\nexport function useRetry<Args extends any[], Ret>({\n fn,\n maxAttempts = 3,\n timeout,\n}: RetryOptions<Args, Ret>) {\n const timeoutError = new Error(`timeout over ${timeout}ms`);\n return async function (...args: Args) {\n let attempt = 0;\n while (true) {\n try {\n const promises = [fn(...args)];\n if (timeout) {\n promises.push(\n setTimeout(timeout).then(() => {\n throw timeoutError;\n }),\n );\n }\n return await Promise.race(promises);\n } catch (e) {\n attempt++;\n if (attempt >= maxAttempts) {\n throw e;\n }\n await sleep(Math.pow(2, attempt) * 100 + Math.random() * 100);\n }\n }\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nexport function sleep(ms: number) {\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\nexport function periodical(\n callback: (count: number) => Promise<void> | void,\n ms: number,\n) {\n let token: NodeJS.Timeout;\n let closed = false;\n async function tick(count: number) {\n await callback(count);\n if (closed) return;\n token = setTimeout(() => tick(count + 1), ms);\n }\n token = setTimeout(() => tick(0), ms);\n return () => {\n closed = true;\n clearTimeout(token);\n };\n}\n"],"mappings":"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","names":["import_zod","z","import_child_process","import_path","import_path","electron","import_fs","import_path","import_process","z","z","import_promises"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../../../node_modules/.bun/tsup@8.5.1+3f29b90437d001ad/node_modules/tsup/assets/cjs_shims.js","../../src/ai/mcp.ts","../../package.json","../../src/base/schema.ts","../../src/pup.ts","../../src/base/abort.ts","../../src/base/constants.ts","../../src/base/basedir.ts","../../src/base/env.ts","../../src/base/parser.ts","../../src/base/electron.ts","../../src/base/process.ts","../../src/base/logging.ts","../../src/base/ffmpeg.ts","../../src/base/encoder.ts","../../src/base/limiter.ts","../../src/base/stream.ts","../../src/ai/opencode.ts","../../src/base/lazy.ts","../../src/base/noerr.ts","../../src/base/retry.ts","../../src/base/timing.ts"],"sourcesContent":["// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport * from \"./ai/mcp\";\nexport * from \"./ai/opencode\";\n\nexport * from \"./base/constants\";\nexport * from \"./base/env\";\nexport * from \"./base/lazy\";\nexport * from \"./base/limiter\";\nexport * from \"./base/logging\";\nexport * from \"./base/noerr\";\nexport * from \"./base/parser\";\nexport * from \"./base/process\";\nexport * from \"./base/retry\";\nexport * from \"./base/schema\";\nexport * from \"./base/timing\";\n\nexport * from \"./pup\";\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport z from \"zod\";\nimport packageJSON from \"../../package.json\";\nimport { RecordSchema } from \"../base/schema\";\nimport { pup } from \"../pup\";\n\nexport const PupMCPSchema = z\n .object({ source: z.string().describe(\"file://, http(s)://, or data: URI\") })\n .extend(RecordSchema.shape);\n\nexport const MCP_TOOL_NAME = packageJSON.name;\nexport const MCP_TOOL_TITLE = \"Record Webpage\";\nexport const MCP_TOOL_DESC = \"Record a webpage to video\";\n\nexport function mcpAddPup(server: McpServer) {\n server.registerTool(\n MCP_TOOL_NAME,\n {\n title: MCP_TOOL_TITLE,\n description: MCP_TOOL_DESC,\n inputSchema: PupMCPSchema,\n },\n async (args) => {\n try {\n const result = await pup(args.source, args);\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n { type: \"text\", text: JSON.stringify({ error: String(error) }) },\n ],\n };\n }\n },\n );\n}\n\nexport async function startMCPServer() {\n const server = new McpServer(packageJSON);\n mcpAddPup(server);\n await server.connect(new StdioServerTransport());\n}\n","{\n \"name\": \"pup-recorder\",\n \"version\": \"0.0.15\",\n \"description\": \"A nice webview recording tool.\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Autokaka/pup-recorder.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"autokaka\",\n \"type\": \"module\",\n \"bin\": {\n \"pup\": \"dist/cli.js\",\n \"pup-cjs\": \"dist/cjs/cli.cjs\",\n \"pup-mcp-server\": \"dist/mcp_server.js\",\n \"pup-mcp-server-cjs\": \"dist/cjs/mcp_server.cjs\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n }\n },\n \"engines\": {\n \"bun\": \">= 1\",\n \"node\": \">= 20\"\n },\n \"engineStrict\": true,\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/node\": \"^20.0.0\",\n \"@typescript/native-preview\": \"latest\",\n \"tsup\": \"latest\",\n \"typescript\": \"latest\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"latest\",\n \"@opencode-ai/plugin\": \"latest\",\n \"commander\": \"latest\",\n \"electron\": \"latest\",\n \"zod\": \"latest\"\n },\n \"scripts\": {\n \"build\": \"bun build.ts && bun build_rust.ts\"\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport type { Size } from \"electron\";\nimport z from \"zod\";\n\nexport interface VideoSpec {\n fps: number;\n frames: number;\n size: Size;\n}\n\nexport interface VideoFiles {\n mp4?: string;\n webm?: string;\n mov?: string;\n}\n\nexport interface VideoFilesWithCover extends VideoFiles {\n cover: string;\n}\n\nexport const DEFAULT_WIDTH = 1920;\nexport const DEFAULT_HEIGHT = 1080;\nexport const DEFAULT_FPS = 30;\nexport const DEFAULT_DURATION = 5;\nexport const DEFAULT_OUT_DIR = \"out\";\n\nexport const RecordSchema = z.object({\n duration: z\n .number()\n .optional()\n .default(DEFAULT_DURATION)\n .describe(\"Recording duration in seconds\"),\n width: z.number().optional().default(DEFAULT_WIDTH).describe(\"Video width\"),\n height: z\n .number()\n .optional()\n .default(DEFAULT_HEIGHT)\n .describe(\"Video height\"),\n fps: z.number().optional().default(DEFAULT_FPS).describe(\"Frames per second\"),\n withAlphaChannel: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Output with alpha channel\"),\n outDir: z\n .string()\n .optional()\n .default(DEFAULT_OUT_DIR)\n .describe(\"Output directory\"),\n useInnerProxy: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Use bilibili inner proxy for resource access\"),\n});\n\nexport interface RecordOptions {\n duration: number;\n width: number;\n height: number;\n fps: number;\n withAlphaChannel: boolean;\n outDir: string;\n useInnerProxy: boolean;\n}\n\nexport interface RecordResult {\n options: RecordOptions;\n written: number;\n bgraPath: string;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { spawn } from \"child_process\";\nimport type { Size } from \"electron\";\nimport { readFile, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { AbortLink, type AbortQuery } from \"./base/abort\";\nimport { pupAppPath } from \"./base/constants\";\nimport { runElectronApp } from \"./base/electron\";\nimport { encodeBgraFile, encodeBgraToMov } from \"./base/encoder\";\nimport { createCoverCommand } from \"./base/ffmpeg\";\nimport { ConcurrencyLimiter } from \"./base/limiter\";\nimport { logger } from \"./base/logging\";\nimport { parseNumber } from \"./base/parser\";\nimport { type ProcessHandle } from \"./base/process\";\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n type RecordOptions,\n type RecordResult,\n type VideoFilesWithCover,\n type VideoSpec,\n} from \"./base/schema\";\nimport { waitAll } from \"./base/stream\";\n\nconst TAG = \"[pup]\";\nconst PROGRESS_TAG = \" progress: \";\n\nexport type PupProgressCallback = (progress: number) => Promise<void> | void;\n\nexport interface PupOptions extends Partial<RecordOptions> {\n cancelQuery?: AbortQuery;\n onProgress?: PupProgressCallback;\n}\n\nfunction runPupApp(source: string, options: PupOptions) {\n logger.debug(TAG, `runPupApp`, source, options);\n\n const args: string[] = [source];\n if (options.width) args.push(\"--width\", `${options.width}`);\n if (options.height) args.push(\"--height\", `${options.height}`);\n if (options.fps) args.push(\"--fps\", `${options.fps}`);\n if (options.duration) args.push(\"--duration\", `${options.duration}`);\n if (options.outDir) args.push(\"--out-dir\", options.outDir);\n if (options.withAlphaChannel) args.push(\"--with-alpha-channel\");\n if (options.useInnerProxy) args.push(\"--use-inner-proxy\");\n\n const w = options.width ?? DEFAULT_WIDTH;\n const h = options.height ?? DEFAULT_HEIGHT;\n const handle = runElectronApp({ width: w, height: h }, pupAppPath, args);\n const counter = new ConcurrencyLimiter(1);\n handle.process.stdout?.on(\"data\", (data: Buffer) => {\n let message = data.toString().trim();\n let start = message.indexOf(PROGRESS_TAG);\n if (start < 0) {\n return;\n }\n message = message.slice(start + PROGRESS_TAG.length);\n const end = message.indexOf(\"%\");\n if (end < 0) {\n return;\n }\n const progressStr = message.slice(0, end);\n const progress = parseNumber(progressStr);\n counter.schedule(async () => {\n await options.onProgress?.(progress);\n });\n });\n return { handle, counter };\n}\n\nexport async function pup(source: string, options: PupOptions) {\n logger.debug(TAG, `pup`, source, options);\n\n const link = AbortLink.start(options.cancelQuery);\n const outDir = options.outDir ?? \"out\";\n\n const t0 = performance.now();\n const { handle, counter } = runPupApp(source, { ...options, outDir });\n\n await link.wait(handle);\n await counter.end();\n logger.info(TAG, `capture cost ${Math.round(performance.now() - t0)}ms`);\n\n const metaPath = join(outDir, \"record.json\");\n const meta = JSON.parse(await readFile(metaPath, \"utf-8\")) as RecordResult;\n\n const { bgraPath, written, options: recordOptions } = meta;\n const { fps, width, height, withAlphaChannel } = recordOptions;\n const size: Size = { width, height };\n\n const outputs: VideoFilesWithCover = {\n mp4: withAlphaChannel ? undefined : join(outDir, \"output.mp4\"),\n webm: withAlphaChannel ? join(outDir, \"output.webm\") : undefined,\n mov: withAlphaChannel ? join(outDir, \"output.mov\") : undefined,\n cover: join(outDir, \"cover.png\"),\n };\n\n try {\n const t1 = performance.now();\n\n const spec: VideoSpec = { fps, frames: written, size };\n const handles: ProcessHandle[] = [];\n if (outputs.mp4) {\n handles.push(encodeBgraFile(bgraPath, outputs.mp4, spec, \"mp4\"));\n }\n if (outputs.webm) {\n handles.push(encodeBgraFile(bgraPath, outputs.webm, spec, \"webm\"));\n }\n if (outputs.mov) {\n handles.push(encodeBgraToMov(bgraPath, outputs.mov, spec));\n }\n await link.wait(...handles);\n\n const coverSrc = outputs.mov ?? outputs.webm ?? outputs.mp4;\n if (coverSrc) {\n const coverCmd = createCoverCommand(coverSrc, outputs.cover);\n await waitAll(\n spawn(coverCmd.command, coverCmd.args, { stdio: \"inherit\" }),\n );\n }\n\n link.stop();\n logger.info(TAG, `encoding cost ${Math.round(performance.now() - t1)}ms`);\n\n await Promise.all([\n rm(bgraPath, { force: true }),\n rm(metaPath, { force: true }),\n ]);\n return {\n ...outputs,\n width,\n height,\n fps,\n duration: Math.ceil(written / fps),\n };\n } catch (error) {\n await rm(outDir, { recursive: true, force: true });\n throw error;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/11.\n\nimport type { ProcessHandle } from \"./process\";\n\nexport type AsyncTask = () => Promise<void> | void;\nexport type AbortQuery = () => Promise<boolean> | boolean;\n\nexport class AbortLink {\n private _callback?: AsyncTask;\n private _aborted?: boolean;\n private _stopped = false;\n\n private constructor(\n readonly query?: AbortQuery,\n readonly interval: number = 1000,\n ) {\n if (query) {\n this.tick();\n }\n }\n\n static start(query?: AbortQuery, interval?: number) {\n return new AbortLink(query, interval);\n }\n\n get aborted() {\n return !this._stopped && this._aborted;\n }\n\n get stopped() {\n return this._stopped;\n }\n\n async onAbort(callback: AsyncTask) {\n if (this._aborted) {\n await callback();\n } else {\n this._callback = callback;\n }\n }\n\n wait(...handles: ProcessHandle[]) {\n const abort = new Promise((_, reject) => {\n this.onAbort(async () => {\n handles.forEach((h) => h.process.kill());\n reject(new Error(\"aborted\"));\n });\n });\n return Promise.race([\n abort,\n Promise.all(handles.map((h) => h.wait)), //\n ]);\n }\n\n stop() {\n this._stopped = true;\n }\n\n private tick() {\n setTimeout(async () => {\n if (this._stopped) {\n return;\n }\n this._aborted = await this.query?.();\n if (this._stopped) {\n return;\n }\n if (this._aborted) {\n await this._callback?.();\n } else {\n this.tick();\n }\n }, this.interval);\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { basedir } from \"./basedir\";\nimport { penv } from \"./env\";\nimport { parseNumber } from \"./parser\";\n\nconst pupAppSearchPaths = [\n join(basedir, \"cjs/app.cjs\"), // process from dist\n join(basedir, \"app.cjs\"), // process from dist/cjs\n join(basedir, \"../../cjs/app.cjs\"), // process from src\n];\nexport const pupAppPath = pupAppSearchPaths.find(existsSync)!;\n\nconst env = process.env;\nexport const pupLogLevel = penv(\"PUP_LOG_LEVEL\", parseNumber, 2);\nexport const pupUseInnerProxy = env[\"PUP_USE_INNER_PROXY\"] === \"1\";\nexport const pupFFmpegPath = env[\"FFMPEG_BIN\"] ?? `ffmpeg`;\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport { dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nexport const basedir = dirname(fileURLToPath(import.meta.url));\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nexport type EnvParser<T> = (value: unknown) => T;\n\nexport function penv<T>(name: string, parser: EnvParser<T>, defaultValue: T): T;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined {\n try {\n return parser(process.env[name]);\n } catch {\n return defaultValue;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport function parseNumber(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new Error(`Value ${value} is not a valid number`);\n }\n return num;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport electron, { type Size } from \"electron\";\nimport { exec } from \"./process\";\n\nexport const ELECTRON_OPTS = [\n \"no-sandbox\",\n \"disable-setuid-sandbox\",\n \"disable-gpu\",\n \"disable-dev-shm-usage\",\n \"disable-software-rasterizer\",\n \"disable-web-security\",\n \"disable-site-isolation-trials\",\n \"disable-features=IsolateOrigins,site-per-process\",\n \"allow-insecure-localhost\",\n \"ignore-certificate-errors\",\n \"disable-blink-features=AutomationControlled\",\n \"mute-audio\",\n \"disable-extensions\",\n \"disable-background-networking\",\n \"address-family=ipv4\",\n \"disable-async-dns\",\n \"force-device-scale-factor=1\",\n \"trace-warnings\",\n \"force-color-profile=srgb\",\n \"disable-color-correct-rendering\",\n \"log-level=3\",\n];\n\nexport function runElectronApp(size: Size, app: unknown, args: unknown[]) {\n const electronArgs = ELECTRON_OPTS.map((a) => `--${a}`);\n const cmdParts = [];\n if (process.platform === \"linux\") {\n cmdParts.push(\n \"xvfb-run\",\n \"--auto-servernum\",\n `--server-args='-screen 0 ${size.width}x${size.height}x24'`,\n );\n }\n cmdParts.push(electron, ...electronArgs, app);\n return exec(cmdParts.join(\" \"), {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: true,\n env: {\n ...process.env,\n ELECTRON_DISABLE_DBUS: \"1\",\n RUST_BACKTRACE: \"full\",\n __PUP_ARGS__: JSON.stringify(args),\n },\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nimport { spawn, type ChildProcess, type SpawnOptions } from \"child_process\";\nimport { logger } from \"./logging\";\n\nexport const PUP_ARGS_ENV_KEY = \"__PUP_ARGS__\";\n\nexport function pargs() {\n const pupArgs = process.env[PUP_ARGS_ENV_KEY];\n if (pupArgs) {\n const args = [\"exec\", ...process.argv.slice(-1)];\n args.push(...JSON.parse(pupArgs));\n logger.debug(\"pupargs\", args);\n return args;\n }\n\n logger.debug(\"procargv\", process.argv);\n return process.argv;\n}\n\nexport interface ProcessHandle {\n process: ChildProcess;\n wait: Promise<void>;\n}\n\nexport function exec(cmd: string, options?: SpawnOptions): ProcessHandle {\n const parts = cmd.split(\" \").filter((s) => s.length);\n const [command, ...args] = parts;\n if (!command) throw new Error(\"empty command\");\n const proc = spawn(command, args, {\n stdio: \"inherit\",\n ...options,\n });\n return { process: proc, wait: logger.attach(proc, command) };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport { ChildProcess, type Serializable } from \"child_process\";\nimport { pupLogLevel } from \"./constants\";\n\nexport interface LoggerLike {\n debug?(this: void, ...messages: unknown[]): void;\n\n info?(this: void, ...messages: unknown[]): void;\n\n warn?(this: void, ...messages: unknown[]): void;\n\n error?(this: void, ...messages: unknown[]): void;\n}\n\nconst DEBUG = \"<pup@debug>\";\nconst INFO = \"<pup@info>\";\nconst WARN = \"<pup@warn>\";\nconst ERROR = \"<pup@error>\";\nconst FATAL = \"<pup@fatal>\";\n\nclass Logger implements LoggerLike {\n private _impl?: LoggerLike;\n\n get impl(): LoggerLike | undefined {\n return this._impl;\n }\n\n set impl(value: LoggerLike) {\n const debug = value.debug ?? console.debug;\n const info = value.info ?? console.info;\n const warn = value.warn ?? console.warn;\n const error = value.error ?? console.error;\n this._impl = {\n debug: pupLogLevel >= 3 ? debug : undefined,\n info: pupLogLevel >= 2 ? info : undefined,\n warn: pupLogLevel >= 1 ? warn : undefined,\n error: pupLogLevel >= 0 ? error : undefined,\n };\n }\n\n constructor() {\n this.impl = console;\n }\n\n debug(...messages: unknown[]): void {\n this.impl?.debug?.(DEBUG, ...messages);\n }\n\n info(...messages: unknown[]): void {\n this.impl?.info?.(INFO, ...messages);\n }\n\n warn(...messages: unknown[]): void {\n this.impl?.warn?.(WARN, ...messages);\n }\n\n error(...messages: unknown[]): void {\n this.impl?.error?.(ERROR, ...messages);\n }\n\n fatal(...messages: unknown[]): never {\n this.impl?.error?.(FATAL, ...messages);\n process.exit(1);\n }\n\n private dispatch(message: string) {\n if (message.startsWith(DEBUG)) {\n this.debug(message.slice(DEBUG.length + 1));\n } else if (message.startsWith(INFO)) {\n this.info(message.slice(INFO.length + 1));\n } else if (message.startsWith(WARN)) {\n this.warn(message.slice(WARN.length + 1));\n } else if (message.startsWith(ERROR)) {\n this.error(message.slice(ERROR.length + 1));\n } else {\n this.info(message);\n }\n }\n\n attach(proc: ChildProcess, name: string) {\n return new Promise<void>((resolve, reject) => {\n this.debug(`${name}.attach`);\n let fatal: string = \"\";\n const dispatch = (data: Buffer | Serializable) => {\n const message = data.toString();\n if (message.startsWith(FATAL)) {\n fatal += message.slice(FATAL.length + 1);\n } else {\n this.dispatch(message);\n }\n };\n proc.stderr?.on(\"data\", dispatch);\n proc.stdout?.on(\"data\", dispatch);\n proc\n .on(\"message\", dispatch)\n .on(\"error\", (err) => {\n fatal += err.message;\n proc.kill();\n })\n .once(\"close\", (code, signal) => {\n if (code || signal || fatal) {\n fatal ||= `command failed: ${proc.spawnargs.join(\" \")}`;\n this.error(`${name}.close`, { code, signal, fatal });\n reject(new Error(fatal));\n } else {\n this.debug(`${name}.close`);\n resolve();\n }\n })\n .on(\"unhandledRejection\", (reason) => {\n this.error(`${name}.unhandled`, reason);\n })\n .on(\"uncaughtExceptionMonitor\", (err) => {\n this.error(`${name}.unhandled`, err);\n });\n });\n }\n}\n\nconst logger = new Logger();\n\nexport { logger };\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { arch, platform } from \"process\";\nimport { basedir } from \"./basedir\";\nimport { pupFFmpegPath } from \"./constants\";\nimport type { VideoFiles, VideoSpec } from \"./schema\";\n\ninterface Command {\n command: string;\n args: string[];\n}\n\nconst quiet = [\"-hide_banner\", \"-loglevel\", \"error\", \"-nostats\"];\n\nfunction resolveX265() {\n const path = `x265/${platform}-${arch}`;\n const dirs = [\n join(basedir, `../../${path}`), // process from src\n join(basedir, `../${path}`), // process from dist\n ];\n const found = dirs.find(existsSync);\n if (!found) {\n throw new Error(\"x265 not found\");\n }\n return found;\n}\n\nexport function createBgraFileCommand(\n bgraPath: string,\n spec: VideoSpec,\n files: VideoFiles,\n): Command {\n const { fps, frames } = spec;\n const args = [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${spec.size.width}x${spec.size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-frames:v\",\n `${Math.floor(frames)}`,\n ];\n if (files.mp4) {\n args.push(\n \"-colorspace\",\n \"bt709\",\n \"-color_primaries\",\n \"bt709\",\n \"-color_trc\",\n \"bt709\",\n \"-c:v\",\n \"libx264\",\n \"-preset\",\n \"fast\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuv420p\",\n \"-movflags\",\n \"+faststart\",\n files.mp4,\n );\n }\n if (files.webm) {\n args.push(\n \"-c:v\",\n \"libvpx-vp9\",\n \"-row-mt\",\n \"1\",\n \"-cpu-used\",\n \"1\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuva420p\",\n \"-auto-alt-ref\",\n \"0\",\n files.webm,\n );\n }\n return { command: pupFFmpegPath, args };\n}\n\ninterface X265Pipeline {\n raw: Command;\n x265: Command;\n mux: Command;\n}\n\nexport function createBgraToMovPipeline(\n bgraPath: string,\n spec: VideoSpec,\n mov: string,\n): X265Pipeline {\n const { fps, size } = spec;\n return {\n raw: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${size.width}x${size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"yuva420p10le\",\n \"pipe:1\",\n ],\n },\n x265: {\n command: resolveX265(),\n args: [\n \"--no-progress\",\n \"--log-level\",\n \"error\",\n \"--input\",\n \"-\",\n \"--input-res\",\n `${size.width}x${size.height}`,\n \"--input-csp\",\n \"i420\",\n \"--input-depth\",\n \"10\",\n \"--output-depth\",\n \"10\",\n \"--fps\",\n `${fps}`,\n \"--alpha\",\n \"--bframes\",\n \"0\",\n \"--colorprim\",\n \"bt709\",\n \"--transfer\",\n \"bt709\",\n \"--colormatrix\",\n \"bt709\",\n \"--crf\",\n \"18\",\n \"--output\",\n \"-\",\n ],\n },\n mux: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"hevc\",\n \"-r\",\n `${fps}`,\n \"-i\",\n \"pipe:0\",\n \"-c:v\",\n \"copy\",\n \"-tag:v\",\n \"hvc1\",\n \"-movflags\",\n \"+faststart\",\n mov,\n ],\n },\n };\n}\n\nexport function createCoverCommand(src: string, dst: string): Command {\n return {\n command: pupFFmpegPath,\n args: [\"-y\", ...quiet, \"-i\", src, \"-frames:v\", \"1\", \"-q:v\", \"2\", dst],\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { createBgraFileCommand, createBgraToMovPipeline } from \"./ffmpeg\";\nimport { exec, type ProcessHandle } from \"./process\";\nimport type { VideoSpec } from \"./schema\";\n\nexport function encodeBgraFile(\n bgraPath: string,\n outputPath: string,\n spec: VideoSpec,\n format: \"mp4\" | \"webm\",\n): ProcessHandle {\n const files = format === \"mp4\" ? { mp4: outputPath } : { webm: outputPath };\n const cmd = createBgraFileCommand(bgraPath, spec, files);\n return exec(`${cmd.command} ${cmd.args.join(\" \")}`, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n });\n}\n\nexport function encodeBgraToMov(\n bgraPath: string,\n movPath: string,\n spec: VideoSpec,\n): ProcessHandle {\n const x265 = createBgraToMovPipeline(bgraPath, spec, movPath);\n const shellCmd = [\n `${x265.raw.command} ${x265.raw.args.join(\" \")}`,\n `${x265.x265.command} ${x265.x265.args.join(\" \")}`,\n `${x265.mux.command} ${x265.mux.args.join(\" \")}`,\n ].join(\" | \");\n return exec(shellCmd, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n shell: true,\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport class ConcurrencyLimiter {\n private _active = 0;\n private _queue: VoidFunction[] = [];\n private _pending = 0;\n private _ended = false;\n\n constructor(readonly maxConcurrency: number) {}\n\n get active(): number {\n return this._active;\n }\n\n get pending(): number {\n return this._pending;\n }\n\n async schedule<T>(fn: () => Promise<T>): Promise<T> {\n if (this._ended) {\n throw new Error(\"ended\");\n }\n return new Promise<T>((resolve, reject) => {\n const run = () => {\n this._active++;\n this._pending--;\n fn()\n .then(resolve)\n .catch(reject)\n .finally(() => {\n this._active--;\n this.next();\n });\n };\n this._pending++;\n if (this._active < this.maxConcurrency) {\n run();\n } else {\n this._queue.push(run);\n }\n });\n }\n\n async end() {\n if (!this._ended) {\n this._ended = true;\n while (this._active > 0 || this._pending > 0) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n }\n }\n\n private next() {\n if (this._active < this.maxConcurrency && this._queue.length > 0) {\n this._queue.shift()?.();\n }\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport type { ChildProcess } from \"child_process\";\n\nexport interface StreamWriter {\n write(buffer: Buffer): Promise<void>;\n end(): void;\n}\n\nexport function createWriter(stdin: NodeJS.WritableStream): StreamWriter {\n const drainPromise = new Map<NodeJS.WritableStream, Promise<void>>();\n\n const waitDrain = (stream: NodeJS.WritableStream) => {\n const existing = drainPromise.get(stream);\n if (existing) return existing;\n const promise = new Promise<void>((resolve, reject) => {\n const cleanup = (fn: () => void) => {\n stream.off(\"drain\", onDrain);\n stream.off(\"error\", onError);\n stream.off(\"close\", onClose);\n drainPromise.delete(stream);\n fn();\n };\n const onDrain = () => cleanup(resolve);\n const onError = (err: Error) => cleanup(() => reject(err));\n const onClose = () => cleanup(() => reject(new Error(\"stream closed\")));\n stream.on(\"drain\", onDrain);\n stream.on(\"error\", onError);\n stream.on(\"close\", onClose);\n });\n drainPromise.set(stream, promise);\n return promise;\n };\n\n const destroyed = () => Reflect.get(stdin, \"destroyed\");\n return {\n async write(buffer: Buffer) {\n if (destroyed()) {\n throw new Error(\"stdin destroyed\");\n }\n if (!stdin.write(buffer)) {\n await waitDrain(stdin);\n }\n },\n end: () => {\n if (!destroyed()) stdin.end();\n },\n };\n}\n\nexport function pipeline(...procs: ChildProcess[]) {\n for (let i = 0; i < procs.length - 1; i++) {\n const src = procs[i];\n const dst = procs[i + 1];\n if (!src?.stdout || !dst?.stdin) throw new Error(\"pipeline broken\");\n src.stdout.pipe(dst.stdin);\n }\n}\n\nexport function waitAll(...procs: ChildProcess[]) {\n return Promise.all(\n procs.map(\n (proc) =>\n new Promise<void>((resolve, reject) => {\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) =>\n code === 0\n ? resolve()\n : reject(new Error(`exit ${code ?? \"null\"}`)),\n );\n }),\n ),\n );\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport type { Plugin } from \"@opencode-ai/plugin\";\nimport { tool } from \"@opencode-ai/plugin\";\nimport {\n DEFAULT_DURATION,\n DEFAULT_FPS,\n DEFAULT_HEIGHT,\n DEFAULT_OUT_DIR,\n DEFAULT_WIDTH,\n} from \"../base/schema\";\nimport { pup } from \"../pup\";\nimport { MCP_TOOL_DESC, MCP_TOOL_NAME, PupMCPSchema } from \"./mcp\";\n\nconst z = tool.schema;\n\nconst PupPluginSchema = z.object({\n source: z.string().describe(PupMCPSchema.shape.source.description!),\n duration: z\n .number()\n .optional()\n .default(DEFAULT_DURATION)\n .describe(PupMCPSchema.shape.duration.description!),\n width: z\n .number()\n .optional()\n .default(DEFAULT_WIDTH)\n .describe(PupMCPSchema.shape.width.description!),\n height: z\n .number()\n .optional()\n .default(DEFAULT_HEIGHT)\n .describe(PupMCPSchema.shape.height.description!),\n fps: z\n .number()\n .optional()\n .default(DEFAULT_FPS)\n .describe(PupMCPSchema.shape.fps.description!),\n withAlphaChannel: z\n .boolean()\n .optional()\n .default(false)\n .describe(PupMCPSchema.shape.withAlphaChannel.description!),\n outDir: z\n .string()\n .optional()\n .default(DEFAULT_OUT_DIR)\n .describe(PupMCPSchema.shape.outDir.description!),\n useInnerProxy: z\n .boolean()\n .optional()\n .default(false)\n .describe(PupMCPSchema.shape.useInnerProxy.description!),\n});\n\nexport const PupOpenCodePlugin: Plugin = async () => {\n return {\n tool: {\n [MCP_TOOL_NAME]: tool({\n description: MCP_TOOL_DESC,\n args: PupPluginSchema.shape,\n async execute(args) {\n try {\n const result = await pup(args.source, args);\n return JSON.stringify(result, null, 2);\n } catch (error) {\n return JSON.stringify({ error: String(error) });\n }\n },\n }),\n },\n };\n};\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport class Lazy<T> {\n constructor(readonly makeValue: () => T) {}\n\n get value(): T {\n if (!this._initialized) {\n this._value = this.makeValue();\n this._initialized = true;\n }\n return this._value!;\n }\n\n get initialized(): boolean {\n return this._initialized;\n }\n\n private _initialized = false;\n private _value: T | undefined;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/24.\n\nexport function noerr<Fn extends (...args: any[]) => any, D>(\n fn: Fn,\n defaultValue: D,\n): (...args: Parameters<Fn>) => ReturnType<Fn> | D {\n return (...args) => {\n try {\n const ret = fn(...args);\n if (ret instanceof Promise) {\n return ret.catch(() => defaultValue);\n }\n return ret;\n } catch {\n return defaultValue;\n }\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/05.\n\nimport { setTimeout } from \"timers/promises\";\nimport { sleep } from \"./timing\";\n\nexport interface RetryOptions<Args extends any[], Ret> {\n fn: (...args: Args) => Promise<Ret>;\n maxAttempts?: number;\n timeout?: number;\n}\n\nexport function useRetry<Args extends any[], Ret>({\n fn,\n maxAttempts = 3,\n timeout,\n}: RetryOptions<Args, Ret>) {\n const timeoutError = new Error(`timeout over ${timeout}ms`);\n return async function (...args: Args) {\n let attempt = 0;\n while (true) {\n try {\n const promises = [fn(...args)];\n if (timeout) {\n promises.push(\n setTimeout(timeout).then(() => {\n throw timeoutError;\n }),\n );\n }\n return await Promise.race(promises);\n } catch (e) {\n attempt++;\n if (attempt >= maxAttempts) {\n throw e;\n }\n await sleep(Math.pow(2, attempt) * 100 + Math.random() * 100);\n }\n }\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nexport function sleep(ms: number) {\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\nexport function periodical(\n callback: (count: number) => Promise<void> | void,\n ms: number,\n) {\n let token: NodeJS.Timeout;\n let closed = false;\n async function tick(count: number) {\n await callback(count);\n if (closed) return;\n token = setTimeout(() => tick(count + 1), ms);\n }\n token = setTimeout(() => tick(0), ms);\n return () => {\n closed = true;\n clearTimeout(token);\n };\n}\n"],"mappings":"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","names":["import_zod","z","import_child_process","import_path","import_path","electron","import_fs","import_path","import_process","z","z","import_promises"]}
|
package/dist/cjs/mcp_server.cjs
CHANGED
|
@@ -34,9 +34,12 @@ var import_zod2 = __toESM(require("zod"), 1);
|
|
|
34
34
|
// package.json
|
|
35
35
|
var package_default = {
|
|
36
36
|
name: "pup-recorder",
|
|
37
|
-
version: "0.0.
|
|
37
|
+
version: "0.0.15",
|
|
38
38
|
description: "A nice webview recording tool.",
|
|
39
|
-
|
|
39
|
+
repository: {
|
|
40
|
+
type: "git",
|
|
41
|
+
url: "https://github.com/Autokaka/pup-recorder.git"
|
|
42
|
+
},
|
|
40
43
|
license: "MIT",
|
|
41
44
|
author: "autokaka",
|
|
42
45
|
type: "module",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../node_modules/.bun/tsup@8.5.1+3f29b90437d001ad/node_modules/tsup/assets/cjs_shims.js","../../src/ai/mcp.ts","../../package.json","../../src/base/schema.ts","../../src/pup.ts","../../src/base/abort.ts","../../src/base/constants.ts","../../src/base/basedir.ts","../../src/base/env.ts","../../src/base/parser.ts","../../src/base/electron.ts","../../src/base/process.ts","../../src/base/logging.ts","../../src/base/ffmpeg.ts","../../src/base/encoder.ts","../../src/base/limiter.ts","../../src/base/stream.ts","../../src/mcp_server.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport z from \"zod\";\nimport packageJSON from \"../../package.json\";\nimport { RecordSchema } from \"../base/schema\";\nimport { pup } from \"../pup\";\n\nexport const PupMCPSchema = z\n .object({ source: z.string().describe(\"file://, http(s)://, or data: URI\") })\n .extend(RecordSchema.shape);\n\nexport const MCP_TOOL_NAME = packageJSON.name;\nexport const MCP_TOOL_TITLE = \"Record Webpage\";\nexport const MCP_TOOL_DESC = \"Record a webpage to video\";\n\nexport function mcpAddPup(server: McpServer) {\n server.registerTool(\n MCP_TOOL_NAME,\n {\n title: MCP_TOOL_TITLE,\n description: MCP_TOOL_DESC,\n inputSchema: PupMCPSchema,\n },\n async (args) => {\n try {\n const result = await pup(args.source, args);\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n { type: \"text\", text: JSON.stringify({ error: String(error) }) },\n ],\n };\n }\n },\n );\n}\n\nexport async function startMCPServer() {\n const server = new McpServer(packageJSON);\n mcpAddPup(server);\n await server.connect(new StdioServerTransport());\n}\n","{\n \"name\": \"pup-recorder\",\n \"version\": \"0.0.12\",\n \"description\": \"A nice webview recording tool.\",\n \"homepage\": \"https://github.com/Autokaka/pup-recorder\",\n \"license\": \"MIT\",\n \"author\": \"autokaka\",\n \"type\": \"module\",\n \"bin\": {\n \"pup\": \"dist/cli.js\",\n \"pup-cjs\": \"dist/cjs/cli.cjs\",\n \"pup-mcp-server\": \"dist/mcp_server.js\",\n \"pup-mcp-server-cjs\": \"dist/cjs/mcp_server.cjs\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n }\n },\n \"engines\": {\n \"bun\": \">= 1\",\n \"node\": \">= 20\"\n },\n \"engineStrict\": true,\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/node\": \"^20.0.0\",\n \"@typescript/native-preview\": \"latest\",\n \"tsup\": \"latest\",\n \"typescript\": \"latest\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"latest\",\n \"@opencode-ai/plugin\": \"latest\",\n \"commander\": \"latest\",\n \"electron\": \"latest\",\n \"zod\": \"latest\"\n },\n \"scripts\": {\n \"build\": \"bun build.ts && bun build_rust.ts\"\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport type { Size } from \"electron\";\nimport z from \"zod\";\n\nexport interface VideoSpec {\n fps: number;\n frames: number;\n size: Size;\n}\n\nexport interface VideoFiles {\n mp4?: string;\n webm?: string;\n mov?: string;\n}\n\nexport interface VideoFilesWithCover extends VideoFiles {\n cover: string;\n}\n\nexport const DEFAULT_WIDTH = 1920;\nexport const DEFAULT_HEIGHT = 1080;\nexport const DEFAULT_FPS = 30;\nexport const DEFAULT_DURATION = 5;\nexport const DEFAULT_OUT_DIR = \"out\";\n\nexport const RecordSchema = z.object({\n duration: z\n .number()\n .optional()\n .default(DEFAULT_DURATION)\n .describe(\"Recording duration in seconds\"),\n width: z.number().optional().default(DEFAULT_WIDTH).describe(\"Video width\"),\n height: z\n .number()\n .optional()\n .default(DEFAULT_HEIGHT)\n .describe(\"Video height\"),\n fps: z.number().optional().default(DEFAULT_FPS).describe(\"Frames per second\"),\n withAlphaChannel: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Output with alpha channel\"),\n outDir: z\n .string()\n .optional()\n .default(DEFAULT_OUT_DIR)\n .describe(\"Output directory\"),\n useInnerProxy: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Use bilibili inner proxy for resource access\"),\n});\n\nexport interface RecordOptions {\n duration: number;\n width: number;\n height: number;\n fps: number;\n withAlphaChannel: boolean;\n outDir: string;\n useInnerProxy: boolean;\n}\n\nexport interface RecordResult {\n options: RecordOptions;\n written: number;\n bgraPath: string;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { spawn } from \"child_process\";\nimport type { Size } from \"electron\";\nimport { readFile, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { AbortLink, type AbortQuery } from \"./base/abort\";\nimport { pupAppPath } from \"./base/constants\";\nimport { runElectronApp } from \"./base/electron\";\nimport { encodeBgraFile, encodeBgraToMov } from \"./base/encoder\";\nimport { createCoverCommand } from \"./base/ffmpeg\";\nimport { ConcurrencyLimiter } from \"./base/limiter\";\nimport { logger } from \"./base/logging\";\nimport { parseNumber } from \"./base/parser\";\nimport { type ProcessHandle } from \"./base/process\";\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n type RecordOptions,\n type RecordResult,\n type VideoFilesWithCover,\n type VideoSpec,\n} from \"./base/schema\";\nimport { waitAll } from \"./base/stream\";\n\nconst TAG = \"[pup]\";\nconst PROGRESS_TAG = \" progress: \";\n\nexport type PupProgressCallback = (progress: number) => Promise<void> | void;\n\nexport interface PupOptions extends Partial<RecordOptions> {\n cancelQuery?: AbortQuery;\n onProgress?: PupProgressCallback;\n}\n\nfunction runPupApp(source: string, options: PupOptions) {\n logger.debug(TAG, `runPupApp`, source, options);\n\n const args: string[] = [source];\n if (options.width) args.push(\"--width\", `${options.width}`);\n if (options.height) args.push(\"--height\", `${options.height}`);\n if (options.fps) args.push(\"--fps\", `${options.fps}`);\n if (options.duration) args.push(\"--duration\", `${options.duration}`);\n if (options.outDir) args.push(\"--out-dir\", options.outDir);\n if (options.withAlphaChannel) args.push(\"--with-alpha-channel\");\n if (options.useInnerProxy) args.push(\"--use-inner-proxy\");\n\n const w = options.width ?? DEFAULT_WIDTH;\n const h = options.height ?? DEFAULT_HEIGHT;\n const handle = runElectronApp({ width: w, height: h }, pupAppPath, args);\n const counter = new ConcurrencyLimiter(1);\n handle.process.stdout?.on(\"data\", (data: Buffer) => {\n let message = data.toString().trim();\n let start = message.indexOf(PROGRESS_TAG);\n if (start < 0) {\n return;\n }\n message = message.slice(start + PROGRESS_TAG.length);\n const end = message.indexOf(\"%\");\n if (end < 0) {\n return;\n }\n const progressStr = message.slice(0, end);\n const progress = parseNumber(progressStr);\n counter.schedule(async () => {\n await options.onProgress?.(progress);\n });\n });\n return { handle, counter };\n}\n\nexport async function pup(source: string, options: PupOptions) {\n logger.debug(TAG, `pup`, source, options);\n\n const link = AbortLink.start(options.cancelQuery);\n const outDir = options.outDir ?? \"out\";\n\n const t0 = performance.now();\n const { handle, counter } = runPupApp(source, { ...options, outDir });\n\n await link.wait(handle);\n await counter.end();\n logger.info(TAG, `capture cost ${Math.round(performance.now() - t0)}ms`);\n\n const metaPath = join(outDir, \"record.json\");\n const meta = JSON.parse(await readFile(metaPath, \"utf-8\")) as RecordResult;\n\n const { bgraPath, written, options: recordOptions } = meta;\n const { fps, width, height, withAlphaChannel } = recordOptions;\n const size: Size = { width, height };\n\n const outputs: VideoFilesWithCover = {\n mp4: withAlphaChannel ? undefined : join(outDir, \"output.mp4\"),\n webm: withAlphaChannel ? join(outDir, \"output.webm\") : undefined,\n mov: withAlphaChannel ? join(outDir, \"output.mov\") : undefined,\n cover: join(outDir, \"cover.png\"),\n };\n\n try {\n const t1 = performance.now();\n\n const spec: VideoSpec = { fps, frames: written, size };\n const handles: ProcessHandle[] = [];\n if (outputs.mp4) {\n handles.push(encodeBgraFile(bgraPath, outputs.mp4, spec, \"mp4\"));\n }\n if (outputs.webm) {\n handles.push(encodeBgraFile(bgraPath, outputs.webm, spec, \"webm\"));\n }\n if (outputs.mov) {\n handles.push(encodeBgraToMov(bgraPath, outputs.mov, spec));\n }\n await link.wait(...handles);\n\n const coverSrc = outputs.mov ?? outputs.webm ?? outputs.mp4;\n if (coverSrc) {\n const coverCmd = createCoverCommand(coverSrc, outputs.cover);\n await waitAll(\n spawn(coverCmd.command, coverCmd.args, { stdio: \"inherit\" }),\n );\n }\n\n link.stop();\n logger.info(TAG, `encoding cost ${Math.round(performance.now() - t1)}ms`);\n\n await Promise.all([\n rm(bgraPath, { force: true }),\n rm(metaPath, { force: true }),\n ]);\n return {\n ...outputs,\n width,\n height,\n fps,\n duration: Math.ceil(written / fps),\n };\n } catch (error) {\n await rm(outDir, { recursive: true, force: true });\n throw error;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/11.\n\nimport type { ProcessHandle } from \"./process\";\n\nexport type AsyncTask = () => Promise<void> | void;\nexport type AbortQuery = () => Promise<boolean> | boolean;\n\nexport class AbortLink {\n private _callback?: AsyncTask;\n private _aborted?: boolean;\n private _stopped = false;\n\n private constructor(\n readonly query?: AbortQuery,\n readonly interval: number = 1000,\n ) {\n if (query) {\n this.tick();\n }\n }\n\n static start(query?: AbortQuery, interval?: number) {\n return new AbortLink(query, interval);\n }\n\n get aborted() {\n return !this._stopped && this._aborted;\n }\n\n get stopped() {\n return this._stopped;\n }\n\n async onAbort(callback: AsyncTask) {\n if (this._aborted) {\n await callback();\n } else {\n this._callback = callback;\n }\n }\n\n wait(...handles: ProcessHandle[]) {\n const abort = new Promise((_, reject) => {\n this.onAbort(async () => {\n handles.forEach((h) => h.process.kill());\n reject(new Error(\"aborted\"));\n });\n });\n return Promise.race([\n abort,\n Promise.all(handles.map((h) => h.wait)), //\n ]);\n }\n\n stop() {\n this._stopped = true;\n }\n\n private tick() {\n setTimeout(async () => {\n if (this._stopped) {\n return;\n }\n this._aborted = await this.query?.();\n if (this._stopped) {\n return;\n }\n if (this._aborted) {\n await this._callback?.();\n } else {\n this.tick();\n }\n }, this.interval);\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { basedir } from \"./basedir\";\nimport { penv } from \"./env\";\nimport { parseNumber } from \"./parser\";\n\nconst pupAppSearchPaths = [\n join(basedir, \"cjs/app.cjs\"), // process from dist\n join(basedir, \"app.cjs\"), // process from dist/cjs\n join(basedir, \"../../cjs/app.cjs\"), // process from src\n];\nexport const pupAppPath = pupAppSearchPaths.find(existsSync)!;\n\nconst env = process.env;\nexport const pupLogLevel = penv(\"PUP_LOG_LEVEL\", parseNumber, 2);\nexport const pupUseInnerProxy = env[\"PUP_USE_INNER_PROXY\"] === \"1\";\nexport const pupFFmpegPath = env[\"FFMPEG_BIN\"] ?? `ffmpeg`;\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport { dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nexport const basedir = dirname(fileURLToPath(import.meta.url));\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nexport type EnvParser<T> = (value: unknown) => T;\n\nexport function penv<T>(name: string, parser: EnvParser<T>, defaultValue: T): T;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined {\n try {\n return parser(process.env[name]);\n } catch {\n return defaultValue;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport function parseNumber(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new Error(`Value ${value} is not a valid number`);\n }\n return num;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport electron, { type Size } from \"electron\";\nimport { exec } from \"./process\";\n\nexport const ELECTRON_OPTS = [\n \"no-sandbox\",\n \"disable-setuid-sandbox\",\n \"disable-gpu\",\n \"disable-dev-shm-usage\",\n \"disable-software-rasterizer\",\n \"disable-web-security\",\n \"disable-site-isolation-trials\",\n \"disable-features=IsolateOrigins,site-per-process\",\n \"allow-insecure-localhost\",\n \"ignore-certificate-errors\",\n \"disable-blink-features=AutomationControlled\",\n \"mute-audio\",\n \"disable-extensions\",\n \"disable-background-networking\",\n \"address-family=ipv4\",\n \"disable-async-dns\",\n \"force-device-scale-factor=1\",\n \"trace-warnings\",\n \"force-color-profile=srgb\",\n \"disable-color-correct-rendering\",\n \"log-level=3\",\n];\n\nexport function runElectronApp(size: Size, app: unknown, args: unknown[]) {\n const electronArgs = ELECTRON_OPTS.map((a) => `--${a}`);\n const cmdParts = [];\n if (process.platform === \"linux\") {\n cmdParts.push(\n \"xvfb-run\",\n \"--auto-servernum\",\n `--server-args='-screen 0 ${size.width}x${size.height}x24'`,\n );\n }\n cmdParts.push(electron, ...electronArgs, app);\n return exec(cmdParts.join(\" \"), {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: true,\n env: {\n ...process.env,\n ELECTRON_DISABLE_DBUS: \"1\",\n RUST_BACKTRACE: \"full\",\n __PUP_ARGS__: JSON.stringify(args),\n },\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nimport { spawn, type ChildProcess, type SpawnOptions } from \"child_process\";\nimport { logger } from \"./logging\";\n\nexport const PUP_ARGS_ENV_KEY = \"__PUP_ARGS__\";\n\nexport function pargs() {\n const pupArgs = process.env[PUP_ARGS_ENV_KEY];\n if (pupArgs) {\n const args = [\"exec\", ...process.argv.slice(-1)];\n args.push(...JSON.parse(pupArgs));\n logger.debug(\"pupargs\", args);\n return args;\n }\n\n logger.debug(\"procargv\", process.argv);\n return process.argv;\n}\n\nexport interface ProcessHandle {\n process: ChildProcess;\n wait: Promise<void>;\n}\n\nexport function exec(cmd: string, options?: SpawnOptions): ProcessHandle {\n const parts = cmd.split(\" \").filter((s) => s.length);\n const [command, ...args] = parts;\n if (!command) throw new Error(\"empty command\");\n const proc = spawn(command, args, {\n stdio: \"inherit\",\n ...options,\n });\n return { process: proc, wait: logger.attach(proc, command) };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport { ChildProcess, type Serializable } from \"child_process\";\nimport { pupLogLevel } from \"./constants\";\n\nexport interface LoggerLike {\n debug?(this: void, ...messages: unknown[]): void;\n\n info?(this: void, ...messages: unknown[]): void;\n\n warn?(this: void, ...messages: unknown[]): void;\n\n error?(this: void, ...messages: unknown[]): void;\n}\n\nconst DEBUG = \"<pup@debug>\";\nconst INFO = \"<pup@info>\";\nconst WARN = \"<pup@warn>\";\nconst ERROR = \"<pup@error>\";\nconst FATAL = \"<pup@fatal>\";\n\nclass Logger implements LoggerLike {\n private _impl?: LoggerLike;\n\n get impl(): LoggerLike | undefined {\n return this._impl;\n }\n\n set impl(value: LoggerLike) {\n const debug = value.debug ?? console.debug;\n const info = value.info ?? console.info;\n const warn = value.warn ?? console.warn;\n const error = value.error ?? console.error;\n this._impl = {\n debug: pupLogLevel >= 3 ? debug : undefined,\n info: pupLogLevel >= 2 ? info : undefined,\n warn: pupLogLevel >= 1 ? warn : undefined,\n error: pupLogLevel >= 0 ? error : undefined,\n };\n }\n\n constructor() {\n this.impl = console;\n }\n\n debug(...messages: unknown[]): void {\n this.impl?.debug?.(DEBUG, ...messages);\n }\n\n info(...messages: unknown[]): void {\n this.impl?.info?.(INFO, ...messages);\n }\n\n warn(...messages: unknown[]): void {\n this.impl?.warn?.(WARN, ...messages);\n }\n\n error(...messages: unknown[]): void {\n this.impl?.error?.(ERROR, ...messages);\n }\n\n fatal(...messages: unknown[]): never {\n this.impl?.error?.(FATAL, ...messages);\n process.exit(1);\n }\n\n private dispatch(message: string) {\n if (message.startsWith(DEBUG)) {\n this.debug(message.slice(DEBUG.length + 1));\n } else if (message.startsWith(INFO)) {\n this.info(message.slice(INFO.length + 1));\n } else if (message.startsWith(WARN)) {\n this.warn(message.slice(WARN.length + 1));\n } else if (message.startsWith(ERROR)) {\n this.error(message.slice(ERROR.length + 1));\n } else {\n this.info(message);\n }\n }\n\n attach(proc: ChildProcess, name: string) {\n return new Promise<void>((resolve, reject) => {\n this.debug(`${name}.attach`);\n let fatal: string = \"\";\n const dispatch = (data: Buffer | Serializable) => {\n const message = data.toString();\n if (message.startsWith(FATAL)) {\n fatal += message.slice(FATAL.length + 1);\n } else {\n this.dispatch(message);\n }\n };\n proc.stderr?.on(\"data\", dispatch);\n proc.stdout?.on(\"data\", dispatch);\n proc\n .on(\"message\", dispatch)\n .on(\"error\", (err) => {\n fatal += err.message;\n proc.kill();\n })\n .once(\"close\", (code, signal) => {\n if (code || signal || fatal) {\n fatal ||= `command failed: ${proc.spawnargs.join(\" \")}`;\n this.error(`${name}.close`, { code, signal, fatal });\n reject(new Error(fatal));\n } else {\n this.debug(`${name}.close`);\n resolve();\n }\n })\n .on(\"unhandledRejection\", (reason) => {\n this.error(`${name}.unhandled`, reason);\n })\n .on(\"uncaughtExceptionMonitor\", (err) => {\n this.error(`${name}.unhandled`, err);\n });\n });\n }\n}\n\nconst logger = new Logger();\n\nexport { logger };\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { arch, platform } from \"process\";\nimport { basedir } from \"./basedir\";\nimport { pupFFmpegPath } from \"./constants\";\nimport type { VideoFiles, VideoSpec } from \"./schema\";\n\ninterface Command {\n command: string;\n args: string[];\n}\n\nconst quiet = [\"-hide_banner\", \"-loglevel\", \"error\", \"-nostats\"];\n\nfunction resolveX265() {\n const path = `x265/${platform}-${arch}`;\n const dirs = [\n join(basedir, `../../${path}`), // process from src\n join(basedir, `../${path}`), // process from dist\n ];\n const found = dirs.find(existsSync);\n if (!found) {\n throw new Error(\"x265 not found\");\n }\n return found;\n}\n\nexport function createBgraFileCommand(\n bgraPath: string,\n spec: VideoSpec,\n files: VideoFiles,\n): Command {\n const { fps, frames } = spec;\n const args = [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${spec.size.width}x${spec.size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-frames:v\",\n `${Math.floor(frames)}`,\n ];\n if (files.mp4) {\n args.push(\n \"-colorspace\",\n \"bt709\",\n \"-color_primaries\",\n \"bt709\",\n \"-color_trc\",\n \"bt709\",\n \"-c:v\",\n \"libx264\",\n \"-preset\",\n \"fast\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuv420p\",\n \"-movflags\",\n \"+faststart\",\n files.mp4,\n );\n }\n if (files.webm) {\n args.push(\n \"-c:v\",\n \"libvpx-vp9\",\n \"-row-mt\",\n \"1\",\n \"-cpu-used\",\n \"1\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuva420p\",\n \"-auto-alt-ref\",\n \"0\",\n files.webm,\n );\n }\n return { command: pupFFmpegPath, args };\n}\n\ninterface X265Pipeline {\n raw: Command;\n x265: Command;\n mux: Command;\n}\n\nexport function createBgraToMovPipeline(\n bgraPath: string,\n spec: VideoSpec,\n mov: string,\n): X265Pipeline {\n const { fps, size } = spec;\n return {\n raw: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${size.width}x${size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"yuva420p10le\",\n \"pipe:1\",\n ],\n },\n x265: {\n command: resolveX265(),\n args: [\n \"--no-progress\",\n \"--log-level\",\n \"error\",\n \"--input\",\n \"-\",\n \"--input-res\",\n `${size.width}x${size.height}`,\n \"--input-csp\",\n \"i420\",\n \"--input-depth\",\n \"10\",\n \"--output-depth\",\n \"10\",\n \"--fps\",\n `${fps}`,\n \"--alpha\",\n \"--bframes\",\n \"0\",\n \"--colorprim\",\n \"bt709\",\n \"--transfer\",\n \"bt709\",\n \"--colormatrix\",\n \"bt709\",\n \"--crf\",\n \"18\",\n \"--output\",\n \"-\",\n ],\n },\n mux: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"hevc\",\n \"-r\",\n `${fps}`,\n \"-i\",\n \"pipe:0\",\n \"-c:v\",\n \"copy\",\n \"-tag:v\",\n \"hvc1\",\n \"-movflags\",\n \"+faststart\",\n mov,\n ],\n },\n };\n}\n\nexport function createCoverCommand(src: string, dst: string): Command {\n return {\n command: pupFFmpegPath,\n args: [\"-y\", ...quiet, \"-i\", src, \"-frames:v\", \"1\", \"-q:v\", \"2\", dst],\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { createBgraFileCommand, createBgraToMovPipeline } from \"./ffmpeg\";\nimport { exec, type ProcessHandle } from \"./process\";\nimport type { VideoSpec } from \"./schema\";\n\nexport function encodeBgraFile(\n bgraPath: string,\n outputPath: string,\n spec: VideoSpec,\n format: \"mp4\" | \"webm\",\n): ProcessHandle {\n const files = format === \"mp4\" ? { mp4: outputPath } : { webm: outputPath };\n const cmd = createBgraFileCommand(bgraPath, spec, files);\n return exec(`${cmd.command} ${cmd.args.join(\" \")}`, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n });\n}\n\nexport function encodeBgraToMov(\n bgraPath: string,\n movPath: string,\n spec: VideoSpec,\n): ProcessHandle {\n const x265 = createBgraToMovPipeline(bgraPath, spec, movPath);\n const shellCmd = [\n `${x265.raw.command} ${x265.raw.args.join(\" \")}`,\n `${x265.x265.command} ${x265.x265.args.join(\" \")}`,\n `${x265.mux.command} ${x265.mux.args.join(\" \")}`,\n ].join(\" | \");\n return exec(shellCmd, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n shell: true,\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport class ConcurrencyLimiter {\n private _active = 0;\n private _queue: VoidFunction[] = [];\n private _pending = 0;\n private _ended = false;\n\n constructor(readonly maxConcurrency: number) {}\n\n get active(): number {\n return this._active;\n }\n\n get pending(): number {\n return this._pending;\n }\n\n async schedule<T>(fn: () => Promise<T>): Promise<T> {\n if (this._ended) {\n throw new Error(\"ended\");\n }\n return new Promise<T>((resolve, reject) => {\n const run = () => {\n this._active++;\n this._pending--;\n fn()\n .then(resolve)\n .catch(reject)\n .finally(() => {\n this._active--;\n this.next();\n });\n };\n this._pending++;\n if (this._active < this.maxConcurrency) {\n run();\n } else {\n this._queue.push(run);\n }\n });\n }\n\n async end() {\n if (!this._ended) {\n this._ended = true;\n while (this._active > 0 || this._pending > 0) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n }\n }\n\n private next() {\n if (this._active < this.maxConcurrency && this._queue.length > 0) {\n this._queue.shift()?.();\n }\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport type { ChildProcess } from \"child_process\";\n\nexport interface StreamWriter {\n write(buffer: Buffer): Promise<void>;\n end(): void;\n}\n\nexport function createWriter(stdin: NodeJS.WritableStream): StreamWriter {\n const drainPromise = new Map<NodeJS.WritableStream, Promise<void>>();\n\n const waitDrain = (stream: NodeJS.WritableStream) => {\n const existing = drainPromise.get(stream);\n if (existing) return existing;\n const promise = new Promise<void>((resolve, reject) => {\n const cleanup = (fn: () => void) => {\n stream.off(\"drain\", onDrain);\n stream.off(\"error\", onError);\n stream.off(\"close\", onClose);\n drainPromise.delete(stream);\n fn();\n };\n const onDrain = () => cleanup(resolve);\n const onError = (err: Error) => cleanup(() => reject(err));\n const onClose = () => cleanup(() => reject(new Error(\"stream closed\")));\n stream.on(\"drain\", onDrain);\n stream.on(\"error\", onError);\n stream.on(\"close\", onClose);\n });\n drainPromise.set(stream, promise);\n return promise;\n };\n\n const destroyed = () => Reflect.get(stdin, \"destroyed\");\n return {\n async write(buffer: Buffer) {\n if (destroyed()) {\n throw new Error(\"stdin destroyed\");\n }\n if (!stdin.write(buffer)) {\n await waitDrain(stdin);\n }\n },\n end: () => {\n if (!destroyed()) stdin.end();\n },\n };\n}\n\nexport function pipeline(...procs: ChildProcess[]) {\n for (let i = 0; i < procs.length - 1; i++) {\n const src = procs[i];\n const dst = procs[i + 1];\n if (!src?.stdout || !dst?.stdin) throw new Error(\"pipeline broken\");\n src.stdout.pipe(dst.stdin);\n }\n}\n\nexport function waitAll(...procs: ChildProcess[]) {\n return Promise.all(\n procs.map(\n (proc) =>\n new Promise<void>((resolve, reject) => {\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) =>\n code === 0\n ? resolve()\n : reject(new Error(`exit ${code ?? \"null\"}`)),\n );\n }),\n ),\n );\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport { startMCPServer } from \"./ai/mcp\";\n\nstartMCPServer();\n"],"mappings":"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","names":["import_zod","z","import_child_process","import_path","import_path","electron","import_fs","import_path","import_process","z"]}
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/.bun/tsup@8.5.1+3f29b90437d001ad/node_modules/tsup/assets/cjs_shims.js","../../src/ai/mcp.ts","../../package.json","../../src/base/schema.ts","../../src/pup.ts","../../src/base/abort.ts","../../src/base/constants.ts","../../src/base/basedir.ts","../../src/base/env.ts","../../src/base/parser.ts","../../src/base/electron.ts","../../src/base/process.ts","../../src/base/logging.ts","../../src/base/ffmpeg.ts","../../src/base/encoder.ts","../../src/base/limiter.ts","../../src/base/stream.ts","../../src/mcp_server.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport z from \"zod\";\nimport packageJSON from \"../../package.json\";\nimport { RecordSchema } from \"../base/schema\";\nimport { pup } from \"../pup\";\n\nexport const PupMCPSchema = z\n .object({ source: z.string().describe(\"file://, http(s)://, or data: URI\") })\n .extend(RecordSchema.shape);\n\nexport const MCP_TOOL_NAME = packageJSON.name;\nexport const MCP_TOOL_TITLE = \"Record Webpage\";\nexport const MCP_TOOL_DESC = \"Record a webpage to video\";\n\nexport function mcpAddPup(server: McpServer) {\n server.registerTool(\n MCP_TOOL_NAME,\n {\n title: MCP_TOOL_TITLE,\n description: MCP_TOOL_DESC,\n inputSchema: PupMCPSchema,\n },\n async (args) => {\n try {\n const result = await pup(args.source, args);\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n { type: \"text\", text: JSON.stringify({ error: String(error) }) },\n ],\n };\n }\n },\n );\n}\n\nexport async function startMCPServer() {\n const server = new McpServer(packageJSON);\n mcpAddPup(server);\n await server.connect(new StdioServerTransport());\n}\n","{\n \"name\": \"pup-recorder\",\n \"version\": \"0.0.15\",\n \"description\": \"A nice webview recording tool.\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Autokaka/pup-recorder.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"autokaka\",\n \"type\": \"module\",\n \"bin\": {\n \"pup\": \"dist/cli.js\",\n \"pup-cjs\": \"dist/cjs/cli.cjs\",\n \"pup-mcp-server\": \"dist/mcp_server.js\",\n \"pup-mcp-server-cjs\": \"dist/cjs/mcp_server.cjs\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n }\n },\n \"engines\": {\n \"bun\": \">= 1\",\n \"node\": \">= 20\"\n },\n \"engineStrict\": true,\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/node\": \"^20.0.0\",\n \"@typescript/native-preview\": \"latest\",\n \"tsup\": \"latest\",\n \"typescript\": \"latest\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"latest\",\n \"@opencode-ai/plugin\": \"latest\",\n \"commander\": \"latest\",\n \"electron\": \"latest\",\n \"zod\": \"latest\"\n },\n \"scripts\": {\n \"build\": \"bun build.ts && bun build_rust.ts\"\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport type { Size } from \"electron\";\nimport z from \"zod\";\n\nexport interface VideoSpec {\n fps: number;\n frames: number;\n size: Size;\n}\n\nexport interface VideoFiles {\n mp4?: string;\n webm?: string;\n mov?: string;\n}\n\nexport interface VideoFilesWithCover extends VideoFiles {\n cover: string;\n}\n\nexport const DEFAULT_WIDTH = 1920;\nexport const DEFAULT_HEIGHT = 1080;\nexport const DEFAULT_FPS = 30;\nexport const DEFAULT_DURATION = 5;\nexport const DEFAULT_OUT_DIR = \"out\";\n\nexport const RecordSchema = z.object({\n duration: z\n .number()\n .optional()\n .default(DEFAULT_DURATION)\n .describe(\"Recording duration in seconds\"),\n width: z.number().optional().default(DEFAULT_WIDTH).describe(\"Video width\"),\n height: z\n .number()\n .optional()\n .default(DEFAULT_HEIGHT)\n .describe(\"Video height\"),\n fps: z.number().optional().default(DEFAULT_FPS).describe(\"Frames per second\"),\n withAlphaChannel: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Output with alpha channel\"),\n outDir: z\n .string()\n .optional()\n .default(DEFAULT_OUT_DIR)\n .describe(\"Output directory\"),\n useInnerProxy: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Use bilibili inner proxy for resource access\"),\n});\n\nexport interface RecordOptions {\n duration: number;\n width: number;\n height: number;\n fps: number;\n withAlphaChannel: boolean;\n outDir: string;\n useInnerProxy: boolean;\n}\n\nexport interface RecordResult {\n options: RecordOptions;\n written: number;\n bgraPath: string;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { spawn } from \"child_process\";\nimport type { Size } from \"electron\";\nimport { readFile, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { AbortLink, type AbortQuery } from \"./base/abort\";\nimport { pupAppPath } from \"./base/constants\";\nimport { runElectronApp } from \"./base/electron\";\nimport { encodeBgraFile, encodeBgraToMov } from \"./base/encoder\";\nimport { createCoverCommand } from \"./base/ffmpeg\";\nimport { ConcurrencyLimiter } from \"./base/limiter\";\nimport { logger } from \"./base/logging\";\nimport { parseNumber } from \"./base/parser\";\nimport { type ProcessHandle } from \"./base/process\";\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n type RecordOptions,\n type RecordResult,\n type VideoFilesWithCover,\n type VideoSpec,\n} from \"./base/schema\";\nimport { waitAll } from \"./base/stream\";\n\nconst TAG = \"[pup]\";\nconst PROGRESS_TAG = \" progress: \";\n\nexport type PupProgressCallback = (progress: number) => Promise<void> | void;\n\nexport interface PupOptions extends Partial<RecordOptions> {\n cancelQuery?: AbortQuery;\n onProgress?: PupProgressCallback;\n}\n\nfunction runPupApp(source: string, options: PupOptions) {\n logger.debug(TAG, `runPupApp`, source, options);\n\n const args: string[] = [source];\n if (options.width) args.push(\"--width\", `${options.width}`);\n if (options.height) args.push(\"--height\", `${options.height}`);\n if (options.fps) args.push(\"--fps\", `${options.fps}`);\n if (options.duration) args.push(\"--duration\", `${options.duration}`);\n if (options.outDir) args.push(\"--out-dir\", options.outDir);\n if (options.withAlphaChannel) args.push(\"--with-alpha-channel\");\n if (options.useInnerProxy) args.push(\"--use-inner-proxy\");\n\n const w = options.width ?? DEFAULT_WIDTH;\n const h = options.height ?? DEFAULT_HEIGHT;\n const handle = runElectronApp({ width: w, height: h }, pupAppPath, args);\n const counter = new ConcurrencyLimiter(1);\n handle.process.stdout?.on(\"data\", (data: Buffer) => {\n let message = data.toString().trim();\n let start = message.indexOf(PROGRESS_TAG);\n if (start < 0) {\n return;\n }\n message = message.slice(start + PROGRESS_TAG.length);\n const end = message.indexOf(\"%\");\n if (end < 0) {\n return;\n }\n const progressStr = message.slice(0, end);\n const progress = parseNumber(progressStr);\n counter.schedule(async () => {\n await options.onProgress?.(progress);\n });\n });\n return { handle, counter };\n}\n\nexport async function pup(source: string, options: PupOptions) {\n logger.debug(TAG, `pup`, source, options);\n\n const link = AbortLink.start(options.cancelQuery);\n const outDir = options.outDir ?? \"out\";\n\n const t0 = performance.now();\n const { handle, counter } = runPupApp(source, { ...options, outDir });\n\n await link.wait(handle);\n await counter.end();\n logger.info(TAG, `capture cost ${Math.round(performance.now() - t0)}ms`);\n\n const metaPath = join(outDir, \"record.json\");\n const meta = JSON.parse(await readFile(metaPath, \"utf-8\")) as RecordResult;\n\n const { bgraPath, written, options: recordOptions } = meta;\n const { fps, width, height, withAlphaChannel } = recordOptions;\n const size: Size = { width, height };\n\n const outputs: VideoFilesWithCover = {\n mp4: withAlphaChannel ? undefined : join(outDir, \"output.mp4\"),\n webm: withAlphaChannel ? join(outDir, \"output.webm\") : undefined,\n mov: withAlphaChannel ? join(outDir, \"output.mov\") : undefined,\n cover: join(outDir, \"cover.png\"),\n };\n\n try {\n const t1 = performance.now();\n\n const spec: VideoSpec = { fps, frames: written, size };\n const handles: ProcessHandle[] = [];\n if (outputs.mp4) {\n handles.push(encodeBgraFile(bgraPath, outputs.mp4, spec, \"mp4\"));\n }\n if (outputs.webm) {\n handles.push(encodeBgraFile(bgraPath, outputs.webm, spec, \"webm\"));\n }\n if (outputs.mov) {\n handles.push(encodeBgraToMov(bgraPath, outputs.mov, spec));\n }\n await link.wait(...handles);\n\n const coverSrc = outputs.mov ?? outputs.webm ?? outputs.mp4;\n if (coverSrc) {\n const coverCmd = createCoverCommand(coverSrc, outputs.cover);\n await waitAll(\n spawn(coverCmd.command, coverCmd.args, { stdio: \"inherit\" }),\n );\n }\n\n link.stop();\n logger.info(TAG, `encoding cost ${Math.round(performance.now() - t1)}ms`);\n\n await Promise.all([\n rm(bgraPath, { force: true }),\n rm(metaPath, { force: true }),\n ]);\n return {\n ...outputs,\n width,\n height,\n fps,\n duration: Math.ceil(written / fps),\n };\n } catch (error) {\n await rm(outDir, { recursive: true, force: true });\n throw error;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/11.\n\nimport type { ProcessHandle } from \"./process\";\n\nexport type AsyncTask = () => Promise<void> | void;\nexport type AbortQuery = () => Promise<boolean> | boolean;\n\nexport class AbortLink {\n private _callback?: AsyncTask;\n private _aborted?: boolean;\n private _stopped = false;\n\n private constructor(\n readonly query?: AbortQuery,\n readonly interval: number = 1000,\n ) {\n if (query) {\n this.tick();\n }\n }\n\n static start(query?: AbortQuery, interval?: number) {\n return new AbortLink(query, interval);\n }\n\n get aborted() {\n return !this._stopped && this._aborted;\n }\n\n get stopped() {\n return this._stopped;\n }\n\n async onAbort(callback: AsyncTask) {\n if (this._aborted) {\n await callback();\n } else {\n this._callback = callback;\n }\n }\n\n wait(...handles: ProcessHandle[]) {\n const abort = new Promise((_, reject) => {\n this.onAbort(async () => {\n handles.forEach((h) => h.process.kill());\n reject(new Error(\"aborted\"));\n });\n });\n return Promise.race([\n abort,\n Promise.all(handles.map((h) => h.wait)), //\n ]);\n }\n\n stop() {\n this._stopped = true;\n }\n\n private tick() {\n setTimeout(async () => {\n if (this._stopped) {\n return;\n }\n this._aborted = await this.query?.();\n if (this._stopped) {\n return;\n }\n if (this._aborted) {\n await this._callback?.();\n } else {\n this.tick();\n }\n }, this.interval);\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { basedir } from \"./basedir\";\nimport { penv } from \"./env\";\nimport { parseNumber } from \"./parser\";\n\nconst pupAppSearchPaths = [\n join(basedir, \"cjs/app.cjs\"), // process from dist\n join(basedir, \"app.cjs\"), // process from dist/cjs\n join(basedir, \"../../cjs/app.cjs\"), // process from src\n];\nexport const pupAppPath = pupAppSearchPaths.find(existsSync)!;\n\nconst env = process.env;\nexport const pupLogLevel = penv(\"PUP_LOG_LEVEL\", parseNumber, 2);\nexport const pupUseInnerProxy = env[\"PUP_USE_INNER_PROXY\"] === \"1\";\nexport const pupFFmpegPath = env[\"FFMPEG_BIN\"] ?? `ffmpeg`;\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport { dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nexport const basedir = dirname(fileURLToPath(import.meta.url));\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nexport type EnvParser<T> = (value: unknown) => T;\n\nexport function penv<T>(name: string, parser: EnvParser<T>, defaultValue: T): T;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined {\n try {\n return parser(process.env[name]);\n } catch {\n return defaultValue;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport function parseNumber(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new Error(`Value ${value} is not a valid number`);\n }\n return num;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport electron, { type Size } from \"electron\";\nimport { exec } from \"./process\";\n\nexport const ELECTRON_OPTS = [\n \"no-sandbox\",\n \"disable-setuid-sandbox\",\n \"disable-gpu\",\n \"disable-dev-shm-usage\",\n \"disable-software-rasterizer\",\n \"disable-web-security\",\n \"disable-site-isolation-trials\",\n \"disable-features=IsolateOrigins,site-per-process\",\n \"allow-insecure-localhost\",\n \"ignore-certificate-errors\",\n \"disable-blink-features=AutomationControlled\",\n \"mute-audio\",\n \"disable-extensions\",\n \"disable-background-networking\",\n \"address-family=ipv4\",\n \"disable-async-dns\",\n \"force-device-scale-factor=1\",\n \"trace-warnings\",\n \"force-color-profile=srgb\",\n \"disable-color-correct-rendering\",\n \"log-level=3\",\n];\n\nexport function runElectronApp(size: Size, app: unknown, args: unknown[]) {\n const electronArgs = ELECTRON_OPTS.map((a) => `--${a}`);\n const cmdParts = [];\n if (process.platform === \"linux\") {\n cmdParts.push(\n \"xvfb-run\",\n \"--auto-servernum\",\n `--server-args='-screen 0 ${size.width}x${size.height}x24'`,\n );\n }\n cmdParts.push(electron, ...electronArgs, app);\n return exec(cmdParts.join(\" \"), {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: true,\n env: {\n ...process.env,\n ELECTRON_DISABLE_DBUS: \"1\",\n RUST_BACKTRACE: \"full\",\n __PUP_ARGS__: JSON.stringify(args),\n },\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nimport { spawn, type ChildProcess, type SpawnOptions } from \"child_process\";\nimport { logger } from \"./logging\";\n\nexport const PUP_ARGS_ENV_KEY = \"__PUP_ARGS__\";\n\nexport function pargs() {\n const pupArgs = process.env[PUP_ARGS_ENV_KEY];\n if (pupArgs) {\n const args = [\"exec\", ...process.argv.slice(-1)];\n args.push(...JSON.parse(pupArgs));\n logger.debug(\"pupargs\", args);\n return args;\n }\n\n logger.debug(\"procargv\", process.argv);\n return process.argv;\n}\n\nexport interface ProcessHandle {\n process: ChildProcess;\n wait: Promise<void>;\n}\n\nexport function exec(cmd: string, options?: SpawnOptions): ProcessHandle {\n const parts = cmd.split(\" \").filter((s) => s.length);\n const [command, ...args] = parts;\n if (!command) throw new Error(\"empty command\");\n const proc = spawn(command, args, {\n stdio: \"inherit\",\n ...options,\n });\n return { process: proc, wait: logger.attach(proc, command) };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport { ChildProcess, type Serializable } from \"child_process\";\nimport { pupLogLevel } from \"./constants\";\n\nexport interface LoggerLike {\n debug?(this: void, ...messages: unknown[]): void;\n\n info?(this: void, ...messages: unknown[]): void;\n\n warn?(this: void, ...messages: unknown[]): void;\n\n error?(this: void, ...messages: unknown[]): void;\n}\n\nconst DEBUG = \"<pup@debug>\";\nconst INFO = \"<pup@info>\";\nconst WARN = \"<pup@warn>\";\nconst ERROR = \"<pup@error>\";\nconst FATAL = \"<pup@fatal>\";\n\nclass Logger implements LoggerLike {\n private _impl?: LoggerLike;\n\n get impl(): LoggerLike | undefined {\n return this._impl;\n }\n\n set impl(value: LoggerLike) {\n const debug = value.debug ?? console.debug;\n const info = value.info ?? console.info;\n const warn = value.warn ?? console.warn;\n const error = value.error ?? console.error;\n this._impl = {\n debug: pupLogLevel >= 3 ? debug : undefined,\n info: pupLogLevel >= 2 ? info : undefined,\n warn: pupLogLevel >= 1 ? warn : undefined,\n error: pupLogLevel >= 0 ? error : undefined,\n };\n }\n\n constructor() {\n this.impl = console;\n }\n\n debug(...messages: unknown[]): void {\n this.impl?.debug?.(DEBUG, ...messages);\n }\n\n info(...messages: unknown[]): void {\n this.impl?.info?.(INFO, ...messages);\n }\n\n warn(...messages: unknown[]): void {\n this.impl?.warn?.(WARN, ...messages);\n }\n\n error(...messages: unknown[]): void {\n this.impl?.error?.(ERROR, ...messages);\n }\n\n fatal(...messages: unknown[]): never {\n this.impl?.error?.(FATAL, ...messages);\n process.exit(1);\n }\n\n private dispatch(message: string) {\n if (message.startsWith(DEBUG)) {\n this.debug(message.slice(DEBUG.length + 1));\n } else if (message.startsWith(INFO)) {\n this.info(message.slice(INFO.length + 1));\n } else if (message.startsWith(WARN)) {\n this.warn(message.slice(WARN.length + 1));\n } else if (message.startsWith(ERROR)) {\n this.error(message.slice(ERROR.length + 1));\n } else {\n this.info(message);\n }\n }\n\n attach(proc: ChildProcess, name: string) {\n return new Promise<void>((resolve, reject) => {\n this.debug(`${name}.attach`);\n let fatal: string = \"\";\n const dispatch = (data: Buffer | Serializable) => {\n const message = data.toString();\n if (message.startsWith(FATAL)) {\n fatal += message.slice(FATAL.length + 1);\n } else {\n this.dispatch(message);\n }\n };\n proc.stderr?.on(\"data\", dispatch);\n proc.stdout?.on(\"data\", dispatch);\n proc\n .on(\"message\", dispatch)\n .on(\"error\", (err) => {\n fatal += err.message;\n proc.kill();\n })\n .once(\"close\", (code, signal) => {\n if (code || signal || fatal) {\n fatal ||= `command failed: ${proc.spawnargs.join(\" \")}`;\n this.error(`${name}.close`, { code, signal, fatal });\n reject(new Error(fatal));\n } else {\n this.debug(`${name}.close`);\n resolve();\n }\n })\n .on(\"unhandledRejection\", (reason) => {\n this.error(`${name}.unhandled`, reason);\n })\n .on(\"uncaughtExceptionMonitor\", (err) => {\n this.error(`${name}.unhandled`, err);\n });\n });\n }\n}\n\nconst logger = new Logger();\n\nexport { logger };\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { arch, platform } from \"process\";\nimport { basedir } from \"./basedir\";\nimport { pupFFmpegPath } from \"./constants\";\nimport type { VideoFiles, VideoSpec } from \"./schema\";\n\ninterface Command {\n command: string;\n args: string[];\n}\n\nconst quiet = [\"-hide_banner\", \"-loglevel\", \"error\", \"-nostats\"];\n\nfunction resolveX265() {\n const path = `x265/${platform}-${arch}`;\n const dirs = [\n join(basedir, `../../${path}`), // process from src\n join(basedir, `../${path}`), // process from dist\n ];\n const found = dirs.find(existsSync);\n if (!found) {\n throw new Error(\"x265 not found\");\n }\n return found;\n}\n\nexport function createBgraFileCommand(\n bgraPath: string,\n spec: VideoSpec,\n files: VideoFiles,\n): Command {\n const { fps, frames } = spec;\n const args = [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${spec.size.width}x${spec.size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-frames:v\",\n `${Math.floor(frames)}`,\n ];\n if (files.mp4) {\n args.push(\n \"-colorspace\",\n \"bt709\",\n \"-color_primaries\",\n \"bt709\",\n \"-color_trc\",\n \"bt709\",\n \"-c:v\",\n \"libx264\",\n \"-preset\",\n \"fast\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuv420p\",\n \"-movflags\",\n \"+faststart\",\n files.mp4,\n );\n }\n if (files.webm) {\n args.push(\n \"-c:v\",\n \"libvpx-vp9\",\n \"-row-mt\",\n \"1\",\n \"-cpu-used\",\n \"1\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuva420p\",\n \"-auto-alt-ref\",\n \"0\",\n files.webm,\n );\n }\n return { command: pupFFmpegPath, args };\n}\n\ninterface X265Pipeline {\n raw: Command;\n x265: Command;\n mux: Command;\n}\n\nexport function createBgraToMovPipeline(\n bgraPath: string,\n spec: VideoSpec,\n mov: string,\n): X265Pipeline {\n const { fps, size } = spec;\n return {\n raw: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${size.width}x${size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"yuva420p10le\",\n \"pipe:1\",\n ],\n },\n x265: {\n command: resolveX265(),\n args: [\n \"--no-progress\",\n \"--log-level\",\n \"error\",\n \"--input\",\n \"-\",\n \"--input-res\",\n `${size.width}x${size.height}`,\n \"--input-csp\",\n \"i420\",\n \"--input-depth\",\n \"10\",\n \"--output-depth\",\n \"10\",\n \"--fps\",\n `${fps}`,\n \"--alpha\",\n \"--bframes\",\n \"0\",\n \"--colorprim\",\n \"bt709\",\n \"--transfer\",\n \"bt709\",\n \"--colormatrix\",\n \"bt709\",\n \"--crf\",\n \"18\",\n \"--output\",\n \"-\",\n ],\n },\n mux: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"hevc\",\n \"-r\",\n `${fps}`,\n \"-i\",\n \"pipe:0\",\n \"-c:v\",\n \"copy\",\n \"-tag:v\",\n \"hvc1\",\n \"-movflags\",\n \"+faststart\",\n mov,\n ],\n },\n };\n}\n\nexport function createCoverCommand(src: string, dst: string): Command {\n return {\n command: pupFFmpegPath,\n args: [\"-y\", ...quiet, \"-i\", src, \"-frames:v\", \"1\", \"-q:v\", \"2\", dst],\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { createBgraFileCommand, createBgraToMovPipeline } from \"./ffmpeg\";\nimport { exec, type ProcessHandle } from \"./process\";\nimport type { VideoSpec } from \"./schema\";\n\nexport function encodeBgraFile(\n bgraPath: string,\n outputPath: string,\n spec: VideoSpec,\n format: \"mp4\" | \"webm\",\n): ProcessHandle {\n const files = format === \"mp4\" ? { mp4: outputPath } : { webm: outputPath };\n const cmd = createBgraFileCommand(bgraPath, spec, files);\n return exec(`${cmd.command} ${cmd.args.join(\" \")}`, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n });\n}\n\nexport function encodeBgraToMov(\n bgraPath: string,\n movPath: string,\n spec: VideoSpec,\n): ProcessHandle {\n const x265 = createBgraToMovPipeline(bgraPath, spec, movPath);\n const shellCmd = [\n `${x265.raw.command} ${x265.raw.args.join(\" \")}`,\n `${x265.x265.command} ${x265.x265.args.join(\" \")}`,\n `${x265.mux.command} ${x265.mux.args.join(\" \")}`,\n ].join(\" | \");\n return exec(shellCmd, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n shell: true,\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport class ConcurrencyLimiter {\n private _active = 0;\n private _queue: VoidFunction[] = [];\n private _pending = 0;\n private _ended = false;\n\n constructor(readonly maxConcurrency: number) {}\n\n get active(): number {\n return this._active;\n }\n\n get pending(): number {\n return this._pending;\n }\n\n async schedule<T>(fn: () => Promise<T>): Promise<T> {\n if (this._ended) {\n throw new Error(\"ended\");\n }\n return new Promise<T>((resolve, reject) => {\n const run = () => {\n this._active++;\n this._pending--;\n fn()\n .then(resolve)\n .catch(reject)\n .finally(() => {\n this._active--;\n this.next();\n });\n };\n this._pending++;\n if (this._active < this.maxConcurrency) {\n run();\n } else {\n this._queue.push(run);\n }\n });\n }\n\n async end() {\n if (!this._ended) {\n this._ended = true;\n while (this._active > 0 || this._pending > 0) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n }\n }\n\n private next() {\n if (this._active < this.maxConcurrency && this._queue.length > 0) {\n this._queue.shift()?.();\n }\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport type { ChildProcess } from \"child_process\";\n\nexport interface StreamWriter {\n write(buffer: Buffer): Promise<void>;\n end(): void;\n}\n\nexport function createWriter(stdin: NodeJS.WritableStream): StreamWriter {\n const drainPromise = new Map<NodeJS.WritableStream, Promise<void>>();\n\n const waitDrain = (stream: NodeJS.WritableStream) => {\n const existing = drainPromise.get(stream);\n if (existing) return existing;\n const promise = new Promise<void>((resolve, reject) => {\n const cleanup = (fn: () => void) => {\n stream.off(\"drain\", onDrain);\n stream.off(\"error\", onError);\n stream.off(\"close\", onClose);\n drainPromise.delete(stream);\n fn();\n };\n const onDrain = () => cleanup(resolve);\n const onError = (err: Error) => cleanup(() => reject(err));\n const onClose = () => cleanup(() => reject(new Error(\"stream closed\")));\n stream.on(\"drain\", onDrain);\n stream.on(\"error\", onError);\n stream.on(\"close\", onClose);\n });\n drainPromise.set(stream, promise);\n return promise;\n };\n\n const destroyed = () => Reflect.get(stdin, \"destroyed\");\n return {\n async write(buffer: Buffer) {\n if (destroyed()) {\n throw new Error(\"stdin destroyed\");\n }\n if (!stdin.write(buffer)) {\n await waitDrain(stdin);\n }\n },\n end: () => {\n if (!destroyed()) stdin.end();\n },\n };\n}\n\nexport function pipeline(...procs: ChildProcess[]) {\n for (let i = 0; i < procs.length - 1; i++) {\n const src = procs[i];\n const dst = procs[i + 1];\n if (!src?.stdout || !dst?.stdin) throw new Error(\"pipeline broken\");\n src.stdout.pipe(dst.stdin);\n }\n}\n\nexport function waitAll(...procs: ChildProcess[]) {\n return Promise.all(\n procs.map(\n (proc) =>\n new Promise<void>((resolve, reject) => {\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) =>\n code === 0\n ? resolve()\n : reject(new Error(`exit ${code ?? \"null\"}`)),\n );\n }),\n ),\n );\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport { startMCPServer } from \"./ai/mcp\";\n\nstartMCPServer();\n"],"mappings":"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","names":["import_zod","z","import_child_process","import_path","import_path","electron","import_fs","import_path","import_process","z"]}
|
package/dist/index.js
CHANGED
|
@@ -6,9 +6,12 @@ import z2 from "zod";
|
|
|
6
6
|
// package.json
|
|
7
7
|
var package_default = {
|
|
8
8
|
name: "pup-recorder",
|
|
9
|
-
version: "0.0.
|
|
9
|
+
version: "0.0.15",
|
|
10
10
|
description: "A nice webview recording tool.",
|
|
11
|
-
|
|
11
|
+
repository: {
|
|
12
|
+
type: "git",
|
|
13
|
+
url: "https://github.com/Autokaka/pup-recorder.git"
|
|
14
|
+
},
|
|
12
15
|
license: "MIT",
|
|
13
16
|
author: "autokaka",
|
|
14
17
|
type: "module",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ai/mcp.ts","../package.json","../src/base/schema.ts","../src/pup.ts","../src/base/abort.ts","../src/base/constants.ts","../src/base/basedir.ts","../src/base/env.ts","../src/base/parser.ts","../src/base/electron.ts","../src/base/process.ts","../src/base/logging.ts","../src/base/ffmpeg.ts","../src/base/encoder.ts","../src/base/limiter.ts","../src/base/stream.ts","../src/ai/opencode.ts","../src/base/lazy.ts","../src/base/noerr.ts","../src/base/retry.ts","../src/base/timing.ts"],"sourcesContent":["// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport z from \"zod\";\nimport packageJSON from \"../../package.json\";\nimport { RecordSchema } from \"../base/schema\";\nimport { pup } from \"../pup\";\n\nexport const PupMCPSchema = z\n .object({ source: z.string().describe(\"file://, http(s)://, or data: URI\") })\n .extend(RecordSchema.shape);\n\nexport const MCP_TOOL_NAME = packageJSON.name;\nexport const MCP_TOOL_TITLE = \"Record Webpage\";\nexport const MCP_TOOL_DESC = \"Record a webpage to video\";\n\nexport function mcpAddPup(server: McpServer) {\n server.registerTool(\n MCP_TOOL_NAME,\n {\n title: MCP_TOOL_TITLE,\n description: MCP_TOOL_DESC,\n inputSchema: PupMCPSchema,\n },\n async (args) => {\n try {\n const result = await pup(args.source, args);\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n { type: \"text\", text: JSON.stringify({ error: String(error) }) },\n ],\n };\n }\n },\n );\n}\n\nexport async function startMCPServer() {\n const server = new McpServer(packageJSON);\n mcpAddPup(server);\n await server.connect(new StdioServerTransport());\n}\n","{\n \"name\": \"pup-recorder\",\n \"version\": \"0.0.12\",\n \"description\": \"A nice webview recording tool.\",\n \"homepage\": \"https://github.com/Autokaka/pup-recorder\",\n \"license\": \"MIT\",\n \"author\": \"autokaka\",\n \"type\": \"module\",\n \"bin\": {\n \"pup\": \"dist/cli.js\",\n \"pup-cjs\": \"dist/cjs/cli.cjs\",\n \"pup-mcp-server\": \"dist/mcp_server.js\",\n \"pup-mcp-server-cjs\": \"dist/cjs/mcp_server.cjs\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n }\n },\n \"engines\": {\n \"bun\": \">= 1\",\n \"node\": \">= 20\"\n },\n \"engineStrict\": true,\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/node\": \"^20.0.0\",\n \"@typescript/native-preview\": \"latest\",\n \"tsup\": \"latest\",\n \"typescript\": \"latest\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"latest\",\n \"@opencode-ai/plugin\": \"latest\",\n \"commander\": \"latest\",\n \"electron\": \"latest\",\n \"zod\": \"latest\"\n },\n \"scripts\": {\n \"build\": \"bun build.ts && bun build_rust.ts\"\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport type { Size } from \"electron\";\nimport z from \"zod\";\n\nexport interface VideoSpec {\n fps: number;\n frames: number;\n size: Size;\n}\n\nexport interface VideoFiles {\n mp4?: string;\n webm?: string;\n mov?: string;\n}\n\nexport interface VideoFilesWithCover extends VideoFiles {\n cover: string;\n}\n\nexport const DEFAULT_WIDTH = 1920;\nexport const DEFAULT_HEIGHT = 1080;\nexport const DEFAULT_FPS = 30;\nexport const DEFAULT_DURATION = 5;\nexport const DEFAULT_OUT_DIR = \"out\";\n\nexport const RecordSchema = z.object({\n duration: z\n .number()\n .optional()\n .default(DEFAULT_DURATION)\n .describe(\"Recording duration in seconds\"),\n width: z.number().optional().default(DEFAULT_WIDTH).describe(\"Video width\"),\n height: z\n .number()\n .optional()\n .default(DEFAULT_HEIGHT)\n .describe(\"Video height\"),\n fps: z.number().optional().default(DEFAULT_FPS).describe(\"Frames per second\"),\n withAlphaChannel: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Output with alpha channel\"),\n outDir: z\n .string()\n .optional()\n .default(DEFAULT_OUT_DIR)\n .describe(\"Output directory\"),\n useInnerProxy: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Use bilibili inner proxy for resource access\"),\n});\n\nexport interface RecordOptions {\n duration: number;\n width: number;\n height: number;\n fps: number;\n withAlphaChannel: boolean;\n outDir: string;\n useInnerProxy: boolean;\n}\n\nexport interface RecordResult {\n options: RecordOptions;\n written: number;\n bgraPath: string;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { spawn } from \"child_process\";\nimport type { Size } from \"electron\";\nimport { readFile, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { AbortLink, type AbortQuery } from \"./base/abort\";\nimport { pupAppPath } from \"./base/constants\";\nimport { runElectronApp } from \"./base/electron\";\nimport { encodeBgraFile, encodeBgraToMov } from \"./base/encoder\";\nimport { createCoverCommand } from \"./base/ffmpeg\";\nimport { ConcurrencyLimiter } from \"./base/limiter\";\nimport { logger } from \"./base/logging\";\nimport { parseNumber } from \"./base/parser\";\nimport { type ProcessHandle } from \"./base/process\";\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n type RecordOptions,\n type RecordResult,\n type VideoFilesWithCover,\n type VideoSpec,\n} from \"./base/schema\";\nimport { waitAll } from \"./base/stream\";\n\nconst TAG = \"[pup]\";\nconst PROGRESS_TAG = \" progress: \";\n\nexport type PupProgressCallback = (progress: number) => Promise<void> | void;\n\nexport interface PupOptions extends Partial<RecordOptions> {\n cancelQuery?: AbortQuery;\n onProgress?: PupProgressCallback;\n}\n\nfunction runPupApp(source: string, options: PupOptions) {\n logger.debug(TAG, `runPupApp`, source, options);\n\n const args: string[] = [source];\n if (options.width) args.push(\"--width\", `${options.width}`);\n if (options.height) args.push(\"--height\", `${options.height}`);\n if (options.fps) args.push(\"--fps\", `${options.fps}`);\n if (options.duration) args.push(\"--duration\", `${options.duration}`);\n if (options.outDir) args.push(\"--out-dir\", options.outDir);\n if (options.withAlphaChannel) args.push(\"--with-alpha-channel\");\n if (options.useInnerProxy) args.push(\"--use-inner-proxy\");\n\n const w = options.width ?? DEFAULT_WIDTH;\n const h = options.height ?? DEFAULT_HEIGHT;\n const handle = runElectronApp({ width: w, height: h }, pupAppPath, args);\n const counter = new ConcurrencyLimiter(1);\n handle.process.stdout?.on(\"data\", (data: Buffer) => {\n let message = data.toString().trim();\n let start = message.indexOf(PROGRESS_TAG);\n if (start < 0) {\n return;\n }\n message = message.slice(start + PROGRESS_TAG.length);\n const end = message.indexOf(\"%\");\n if (end < 0) {\n return;\n }\n const progressStr = message.slice(0, end);\n const progress = parseNumber(progressStr);\n counter.schedule(async () => {\n await options.onProgress?.(progress);\n });\n });\n return { handle, counter };\n}\n\nexport async function pup(source: string, options: PupOptions) {\n logger.debug(TAG, `pup`, source, options);\n\n const link = AbortLink.start(options.cancelQuery);\n const outDir = options.outDir ?? \"out\";\n\n const t0 = performance.now();\n const { handle, counter } = runPupApp(source, { ...options, outDir });\n\n await link.wait(handle);\n await counter.end();\n logger.info(TAG, `capture cost ${Math.round(performance.now() - t0)}ms`);\n\n const metaPath = join(outDir, \"record.json\");\n const meta = JSON.parse(await readFile(metaPath, \"utf-8\")) as RecordResult;\n\n const { bgraPath, written, options: recordOptions } = meta;\n const { fps, width, height, withAlphaChannel } = recordOptions;\n const size: Size = { width, height };\n\n const outputs: VideoFilesWithCover = {\n mp4: withAlphaChannel ? undefined : join(outDir, \"output.mp4\"),\n webm: withAlphaChannel ? join(outDir, \"output.webm\") : undefined,\n mov: withAlphaChannel ? join(outDir, \"output.mov\") : undefined,\n cover: join(outDir, \"cover.png\"),\n };\n\n try {\n const t1 = performance.now();\n\n const spec: VideoSpec = { fps, frames: written, size };\n const handles: ProcessHandle[] = [];\n if (outputs.mp4) {\n handles.push(encodeBgraFile(bgraPath, outputs.mp4, spec, \"mp4\"));\n }\n if (outputs.webm) {\n handles.push(encodeBgraFile(bgraPath, outputs.webm, spec, \"webm\"));\n }\n if (outputs.mov) {\n handles.push(encodeBgraToMov(bgraPath, outputs.mov, spec));\n }\n await link.wait(...handles);\n\n const coverSrc = outputs.mov ?? outputs.webm ?? outputs.mp4;\n if (coverSrc) {\n const coverCmd = createCoverCommand(coverSrc, outputs.cover);\n await waitAll(\n spawn(coverCmd.command, coverCmd.args, { stdio: \"inherit\" }),\n );\n }\n\n link.stop();\n logger.info(TAG, `encoding cost ${Math.round(performance.now() - t1)}ms`);\n\n await Promise.all([\n rm(bgraPath, { force: true }),\n rm(metaPath, { force: true }),\n ]);\n return {\n ...outputs,\n width,\n height,\n fps,\n duration: Math.ceil(written / fps),\n };\n } catch (error) {\n await rm(outDir, { recursive: true, force: true });\n throw error;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/11.\n\nimport type { ProcessHandle } from \"./process\";\n\nexport type AsyncTask = () => Promise<void> | void;\nexport type AbortQuery = () => Promise<boolean> | boolean;\n\nexport class AbortLink {\n private _callback?: AsyncTask;\n private _aborted?: boolean;\n private _stopped = false;\n\n private constructor(\n readonly query?: AbortQuery,\n readonly interval: number = 1000,\n ) {\n if (query) {\n this.tick();\n }\n }\n\n static start(query?: AbortQuery, interval?: number) {\n return new AbortLink(query, interval);\n }\n\n get aborted() {\n return !this._stopped && this._aborted;\n }\n\n get stopped() {\n return this._stopped;\n }\n\n async onAbort(callback: AsyncTask) {\n if (this._aborted) {\n await callback();\n } else {\n this._callback = callback;\n }\n }\n\n wait(...handles: ProcessHandle[]) {\n const abort = new Promise((_, reject) => {\n this.onAbort(async () => {\n handles.forEach((h) => h.process.kill());\n reject(new Error(\"aborted\"));\n });\n });\n return Promise.race([\n abort,\n Promise.all(handles.map((h) => h.wait)), //\n ]);\n }\n\n stop() {\n this._stopped = true;\n }\n\n private tick() {\n setTimeout(async () => {\n if (this._stopped) {\n return;\n }\n this._aborted = await this.query?.();\n if (this._stopped) {\n return;\n }\n if (this._aborted) {\n await this._callback?.();\n } else {\n this.tick();\n }\n }, this.interval);\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { basedir } from \"./basedir\";\nimport { penv } from \"./env\";\nimport { parseNumber } from \"./parser\";\n\nconst pupAppSearchPaths = [\n join(basedir, \"cjs/app.cjs\"), // process from dist\n join(basedir, \"app.cjs\"), // process from dist/cjs\n join(basedir, \"../../cjs/app.cjs\"), // process from src\n];\nexport const pupAppPath = pupAppSearchPaths.find(existsSync)!;\n\nconst env = process.env;\nexport const pupLogLevel = penv(\"PUP_LOG_LEVEL\", parseNumber, 2);\nexport const pupUseInnerProxy = env[\"PUP_USE_INNER_PROXY\"] === \"1\";\nexport const pupFFmpegPath = env[\"FFMPEG_BIN\"] ?? `ffmpeg`;\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport { dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nexport const basedir = dirname(fileURLToPath(import.meta.url));\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nexport type EnvParser<T> = (value: unknown) => T;\n\nexport function penv<T>(name: string, parser: EnvParser<T>, defaultValue: T): T;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined {\n try {\n return parser(process.env[name]);\n } catch {\n return defaultValue;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport function parseNumber(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new Error(`Value ${value} is not a valid number`);\n }\n return num;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport electron, { type Size } from \"electron\";\nimport { exec } from \"./process\";\n\nexport const ELECTRON_OPTS = [\n \"no-sandbox\",\n \"disable-setuid-sandbox\",\n \"disable-gpu\",\n \"disable-dev-shm-usage\",\n \"disable-software-rasterizer\",\n \"disable-web-security\",\n \"disable-site-isolation-trials\",\n \"disable-features=IsolateOrigins,site-per-process\",\n \"allow-insecure-localhost\",\n \"ignore-certificate-errors\",\n \"disable-blink-features=AutomationControlled\",\n \"mute-audio\",\n \"disable-extensions\",\n \"disable-background-networking\",\n \"address-family=ipv4\",\n \"disable-async-dns\",\n \"force-device-scale-factor=1\",\n \"trace-warnings\",\n \"force-color-profile=srgb\",\n \"disable-color-correct-rendering\",\n \"log-level=3\",\n];\n\nexport function runElectronApp(size: Size, app: unknown, args: unknown[]) {\n const electronArgs = ELECTRON_OPTS.map((a) => `--${a}`);\n const cmdParts = [];\n if (process.platform === \"linux\") {\n cmdParts.push(\n \"xvfb-run\",\n \"--auto-servernum\",\n `--server-args='-screen 0 ${size.width}x${size.height}x24'`,\n );\n }\n cmdParts.push(electron, ...electronArgs, app);\n return exec(cmdParts.join(\" \"), {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: true,\n env: {\n ...process.env,\n ELECTRON_DISABLE_DBUS: \"1\",\n RUST_BACKTRACE: \"full\",\n __PUP_ARGS__: JSON.stringify(args),\n },\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nimport { spawn, type ChildProcess, type SpawnOptions } from \"child_process\";\nimport { logger } from \"./logging\";\n\nexport const PUP_ARGS_ENV_KEY = \"__PUP_ARGS__\";\n\nexport function pargs() {\n const pupArgs = process.env[PUP_ARGS_ENV_KEY];\n if (pupArgs) {\n const args = [\"exec\", ...process.argv.slice(-1)];\n args.push(...JSON.parse(pupArgs));\n logger.debug(\"pupargs\", args);\n return args;\n }\n\n logger.debug(\"procargv\", process.argv);\n return process.argv;\n}\n\nexport interface ProcessHandle {\n process: ChildProcess;\n wait: Promise<void>;\n}\n\nexport function exec(cmd: string, options?: SpawnOptions): ProcessHandle {\n const parts = cmd.split(\" \").filter((s) => s.length);\n const [command, ...args] = parts;\n if (!command) throw new Error(\"empty command\");\n const proc = spawn(command, args, {\n stdio: \"inherit\",\n ...options,\n });\n return { process: proc, wait: logger.attach(proc, command) };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport { ChildProcess, type Serializable } from \"child_process\";\nimport { pupLogLevel } from \"./constants\";\n\nexport interface LoggerLike {\n debug?(this: void, ...messages: unknown[]): void;\n\n info?(this: void, ...messages: unknown[]): void;\n\n warn?(this: void, ...messages: unknown[]): void;\n\n error?(this: void, ...messages: unknown[]): void;\n}\n\nconst DEBUG = \"<pup@debug>\";\nconst INFO = \"<pup@info>\";\nconst WARN = \"<pup@warn>\";\nconst ERROR = \"<pup@error>\";\nconst FATAL = \"<pup@fatal>\";\n\nclass Logger implements LoggerLike {\n private _impl?: LoggerLike;\n\n get impl(): LoggerLike | undefined {\n return this._impl;\n }\n\n set impl(value: LoggerLike) {\n const debug = value.debug ?? console.debug;\n const info = value.info ?? console.info;\n const warn = value.warn ?? console.warn;\n const error = value.error ?? console.error;\n this._impl = {\n debug: pupLogLevel >= 3 ? debug : undefined,\n info: pupLogLevel >= 2 ? info : undefined,\n warn: pupLogLevel >= 1 ? warn : undefined,\n error: pupLogLevel >= 0 ? error : undefined,\n };\n }\n\n constructor() {\n this.impl = console;\n }\n\n debug(...messages: unknown[]): void {\n this.impl?.debug?.(DEBUG, ...messages);\n }\n\n info(...messages: unknown[]): void {\n this.impl?.info?.(INFO, ...messages);\n }\n\n warn(...messages: unknown[]): void {\n this.impl?.warn?.(WARN, ...messages);\n }\n\n error(...messages: unknown[]): void {\n this.impl?.error?.(ERROR, ...messages);\n }\n\n fatal(...messages: unknown[]): never {\n this.impl?.error?.(FATAL, ...messages);\n process.exit(1);\n }\n\n private dispatch(message: string) {\n if (message.startsWith(DEBUG)) {\n this.debug(message.slice(DEBUG.length + 1));\n } else if (message.startsWith(INFO)) {\n this.info(message.slice(INFO.length + 1));\n } else if (message.startsWith(WARN)) {\n this.warn(message.slice(WARN.length + 1));\n } else if (message.startsWith(ERROR)) {\n this.error(message.slice(ERROR.length + 1));\n } else {\n this.info(message);\n }\n }\n\n attach(proc: ChildProcess, name: string) {\n return new Promise<void>((resolve, reject) => {\n this.debug(`${name}.attach`);\n let fatal: string = \"\";\n const dispatch = (data: Buffer | Serializable) => {\n const message = data.toString();\n if (message.startsWith(FATAL)) {\n fatal += message.slice(FATAL.length + 1);\n } else {\n this.dispatch(message);\n }\n };\n proc.stderr?.on(\"data\", dispatch);\n proc.stdout?.on(\"data\", dispatch);\n proc\n .on(\"message\", dispatch)\n .on(\"error\", (err) => {\n fatal += err.message;\n proc.kill();\n })\n .once(\"close\", (code, signal) => {\n if (code || signal || fatal) {\n fatal ||= `command failed: ${proc.spawnargs.join(\" \")}`;\n this.error(`${name}.close`, { code, signal, fatal });\n reject(new Error(fatal));\n } else {\n this.debug(`${name}.close`);\n resolve();\n }\n })\n .on(\"unhandledRejection\", (reason) => {\n this.error(`${name}.unhandled`, reason);\n })\n .on(\"uncaughtExceptionMonitor\", (err) => {\n this.error(`${name}.unhandled`, err);\n });\n });\n }\n}\n\nconst logger = new Logger();\n\nexport { logger };\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { arch, platform } from \"process\";\nimport { basedir } from \"./basedir\";\nimport { pupFFmpegPath } from \"./constants\";\nimport type { VideoFiles, VideoSpec } from \"./schema\";\n\ninterface Command {\n command: string;\n args: string[];\n}\n\nconst quiet = [\"-hide_banner\", \"-loglevel\", \"error\", \"-nostats\"];\n\nfunction resolveX265() {\n const path = `x265/${platform}-${arch}`;\n const dirs = [\n join(basedir, `../../${path}`), // process from src\n join(basedir, `../${path}`), // process from dist\n ];\n const found = dirs.find(existsSync);\n if (!found) {\n throw new Error(\"x265 not found\");\n }\n return found;\n}\n\nexport function createBgraFileCommand(\n bgraPath: string,\n spec: VideoSpec,\n files: VideoFiles,\n): Command {\n const { fps, frames } = spec;\n const args = [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${spec.size.width}x${spec.size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-frames:v\",\n `${Math.floor(frames)}`,\n ];\n if (files.mp4) {\n args.push(\n \"-colorspace\",\n \"bt709\",\n \"-color_primaries\",\n \"bt709\",\n \"-color_trc\",\n \"bt709\",\n \"-c:v\",\n \"libx264\",\n \"-preset\",\n \"fast\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuv420p\",\n \"-movflags\",\n \"+faststart\",\n files.mp4,\n );\n }\n if (files.webm) {\n args.push(\n \"-c:v\",\n \"libvpx-vp9\",\n \"-row-mt\",\n \"1\",\n \"-cpu-used\",\n \"1\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuva420p\",\n \"-auto-alt-ref\",\n \"0\",\n files.webm,\n );\n }\n return { command: pupFFmpegPath, args };\n}\n\ninterface X265Pipeline {\n raw: Command;\n x265: Command;\n mux: Command;\n}\n\nexport function createBgraToMovPipeline(\n bgraPath: string,\n spec: VideoSpec,\n mov: string,\n): X265Pipeline {\n const { fps, size } = spec;\n return {\n raw: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${size.width}x${size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"yuva420p10le\",\n \"pipe:1\",\n ],\n },\n x265: {\n command: resolveX265(),\n args: [\n \"--no-progress\",\n \"--log-level\",\n \"error\",\n \"--input\",\n \"-\",\n \"--input-res\",\n `${size.width}x${size.height}`,\n \"--input-csp\",\n \"i420\",\n \"--input-depth\",\n \"10\",\n \"--output-depth\",\n \"10\",\n \"--fps\",\n `${fps}`,\n \"--alpha\",\n \"--bframes\",\n \"0\",\n \"--colorprim\",\n \"bt709\",\n \"--transfer\",\n \"bt709\",\n \"--colormatrix\",\n \"bt709\",\n \"--crf\",\n \"18\",\n \"--output\",\n \"-\",\n ],\n },\n mux: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"hevc\",\n \"-r\",\n `${fps}`,\n \"-i\",\n \"pipe:0\",\n \"-c:v\",\n \"copy\",\n \"-tag:v\",\n \"hvc1\",\n \"-movflags\",\n \"+faststart\",\n mov,\n ],\n },\n };\n}\n\nexport function createCoverCommand(src: string, dst: string): Command {\n return {\n command: pupFFmpegPath,\n args: [\"-y\", ...quiet, \"-i\", src, \"-frames:v\", \"1\", \"-q:v\", \"2\", dst],\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { createBgraFileCommand, createBgraToMovPipeline } from \"./ffmpeg\";\nimport { exec, type ProcessHandle } from \"./process\";\nimport type { VideoSpec } from \"./schema\";\n\nexport function encodeBgraFile(\n bgraPath: string,\n outputPath: string,\n spec: VideoSpec,\n format: \"mp4\" | \"webm\",\n): ProcessHandle {\n const files = format === \"mp4\" ? { mp4: outputPath } : { webm: outputPath };\n const cmd = createBgraFileCommand(bgraPath, spec, files);\n return exec(`${cmd.command} ${cmd.args.join(\" \")}`, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n });\n}\n\nexport function encodeBgraToMov(\n bgraPath: string,\n movPath: string,\n spec: VideoSpec,\n): ProcessHandle {\n const x265 = createBgraToMovPipeline(bgraPath, spec, movPath);\n const shellCmd = [\n `${x265.raw.command} ${x265.raw.args.join(\" \")}`,\n `${x265.x265.command} ${x265.x265.args.join(\" \")}`,\n `${x265.mux.command} ${x265.mux.args.join(\" \")}`,\n ].join(\" | \");\n return exec(shellCmd, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n shell: true,\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport class ConcurrencyLimiter {\n private _active = 0;\n private _queue: VoidFunction[] = [];\n private _pending = 0;\n private _ended = false;\n\n constructor(readonly maxConcurrency: number) {}\n\n get active(): number {\n return this._active;\n }\n\n get pending(): number {\n return this._pending;\n }\n\n async schedule<T>(fn: () => Promise<T>): Promise<T> {\n if (this._ended) {\n throw new Error(\"ended\");\n }\n return new Promise<T>((resolve, reject) => {\n const run = () => {\n this._active++;\n this._pending--;\n fn()\n .then(resolve)\n .catch(reject)\n .finally(() => {\n this._active--;\n this.next();\n });\n };\n this._pending++;\n if (this._active < this.maxConcurrency) {\n run();\n } else {\n this._queue.push(run);\n }\n });\n }\n\n async end() {\n if (!this._ended) {\n this._ended = true;\n while (this._active > 0 || this._pending > 0) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n }\n }\n\n private next() {\n if (this._active < this.maxConcurrency && this._queue.length > 0) {\n this._queue.shift()?.();\n }\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport type { ChildProcess } from \"child_process\";\n\nexport interface StreamWriter {\n write(buffer: Buffer): Promise<void>;\n end(): void;\n}\n\nexport function createWriter(stdin: NodeJS.WritableStream): StreamWriter {\n const drainPromise = new Map<NodeJS.WritableStream, Promise<void>>();\n\n const waitDrain = (stream: NodeJS.WritableStream) => {\n const existing = drainPromise.get(stream);\n if (existing) return existing;\n const promise = new Promise<void>((resolve, reject) => {\n const cleanup = (fn: () => void) => {\n stream.off(\"drain\", onDrain);\n stream.off(\"error\", onError);\n stream.off(\"close\", onClose);\n drainPromise.delete(stream);\n fn();\n };\n const onDrain = () => cleanup(resolve);\n const onError = (err: Error) => cleanup(() => reject(err));\n const onClose = () => cleanup(() => reject(new Error(\"stream closed\")));\n stream.on(\"drain\", onDrain);\n stream.on(\"error\", onError);\n stream.on(\"close\", onClose);\n });\n drainPromise.set(stream, promise);\n return promise;\n };\n\n const destroyed = () => Reflect.get(stdin, \"destroyed\");\n return {\n async write(buffer: Buffer) {\n if (destroyed()) {\n throw new Error(\"stdin destroyed\");\n }\n if (!stdin.write(buffer)) {\n await waitDrain(stdin);\n }\n },\n end: () => {\n if (!destroyed()) stdin.end();\n },\n };\n}\n\nexport function pipeline(...procs: ChildProcess[]) {\n for (let i = 0; i < procs.length - 1; i++) {\n const src = procs[i];\n const dst = procs[i + 1];\n if (!src?.stdout || !dst?.stdin) throw new Error(\"pipeline broken\");\n src.stdout.pipe(dst.stdin);\n }\n}\n\nexport function waitAll(...procs: ChildProcess[]) {\n return Promise.all(\n procs.map(\n (proc) =>\n new Promise<void>((resolve, reject) => {\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) =>\n code === 0\n ? resolve()\n : reject(new Error(`exit ${code ?? \"null\"}`)),\n );\n }),\n ),\n );\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport type { Plugin } from \"@opencode-ai/plugin\";\nimport { tool } from \"@opencode-ai/plugin\";\nimport {\n DEFAULT_DURATION,\n DEFAULT_FPS,\n DEFAULT_HEIGHT,\n DEFAULT_OUT_DIR,\n DEFAULT_WIDTH,\n} from \"../base/schema\";\nimport { pup } from \"../pup\";\nimport { MCP_TOOL_DESC, MCP_TOOL_NAME, PupMCPSchema } from \"./mcp\";\n\nconst z = tool.schema;\n\nconst PupPluginSchema = z.object({\n source: z.string().describe(PupMCPSchema.shape.source.description!),\n duration: z\n .number()\n .optional()\n .default(DEFAULT_DURATION)\n .describe(PupMCPSchema.shape.duration.description!),\n width: z\n .number()\n .optional()\n .default(DEFAULT_WIDTH)\n .describe(PupMCPSchema.shape.width.description!),\n height: z\n .number()\n .optional()\n .default(DEFAULT_HEIGHT)\n .describe(PupMCPSchema.shape.height.description!),\n fps: z\n .number()\n .optional()\n .default(DEFAULT_FPS)\n .describe(PupMCPSchema.shape.fps.description!),\n withAlphaChannel: z\n .boolean()\n .optional()\n .default(false)\n .describe(PupMCPSchema.shape.withAlphaChannel.description!),\n outDir: z\n .string()\n .optional()\n .default(DEFAULT_OUT_DIR)\n .describe(PupMCPSchema.shape.outDir.description!),\n useInnerProxy: z\n .boolean()\n .optional()\n .default(false)\n .describe(PupMCPSchema.shape.useInnerProxy.description!),\n});\n\nexport const PupOpenCodePlugin: Plugin = async () => {\n return {\n tool: {\n [MCP_TOOL_NAME]: tool({\n description: MCP_TOOL_DESC,\n args: PupPluginSchema.shape,\n async execute(args) {\n try {\n const result = await pup(args.source, args);\n return JSON.stringify(result, null, 2);\n } catch (error) {\n return JSON.stringify({ error: String(error) });\n }\n },\n }),\n },\n };\n};\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport class Lazy<T> {\n constructor(readonly makeValue: () => T) {}\n\n get value(): T {\n if (!this._initialized) {\n this._value = this.makeValue();\n this._initialized = true;\n }\n return this._value!;\n }\n\n get initialized(): boolean {\n return this._initialized;\n }\n\n private _initialized = false;\n private _value: T | undefined;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/24.\n\nexport function noerr<Fn extends (...args: any[]) => any, D>(\n fn: Fn,\n defaultValue: D,\n): (...args: Parameters<Fn>) => ReturnType<Fn> | D {\n return (...args) => {\n try {\n const ret = fn(...args);\n if (ret instanceof Promise) {\n return ret.catch(() => defaultValue);\n }\n return ret;\n } catch {\n return defaultValue;\n }\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/05.\n\nimport { setTimeout } from \"timers/promises\";\nimport { sleep } from \"./timing\";\n\nexport interface RetryOptions<Args extends any[], Ret> {\n fn: (...args: Args) => Promise<Ret>;\n maxAttempts?: number;\n timeout?: number;\n}\n\nexport function useRetry<Args extends any[], Ret>({\n fn,\n maxAttempts = 3,\n timeout,\n}: RetryOptions<Args, Ret>) {\n const timeoutError = new Error(`timeout over ${timeout}ms`);\n return async function (...args: Args) {\n let attempt = 0;\n while (true) {\n try {\n const promises = [fn(...args)];\n if (timeout) {\n promises.push(\n setTimeout(timeout).then(() => {\n throw timeoutError;\n }),\n );\n }\n return await Promise.race(promises);\n } catch (e) {\n attempt++;\n if (attempt >= maxAttempts) {\n throw e;\n }\n await sleep(Math.pow(2, attempt) * 100 + Math.random() * 100);\n }\n }\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nexport function sleep(ms: number) {\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\nexport function periodical(\n callback: (count: number) => Promise<void> | void,\n ms: number,\n) {\n let token: NodeJS.Timeout;\n let closed = false;\n async function tick(count: number) {\n await callback(count);\n if (closed) return;\n token = setTimeout(() => tick(count + 1), ms);\n }\n token = setTimeout(() => tick(0), ms);\n return () => {\n closed = true;\n clearTimeout(token);\n };\n}\n"],"mappings":"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","names":["z","spawn","join","existsSync","join","join","existsSync","join","spawn","z","z","setTimeout","setTimeout"]}
|
|
1
|
+
{"version":3,"sources":["../src/ai/mcp.ts","../package.json","../src/base/schema.ts","../src/pup.ts","../src/base/abort.ts","../src/base/constants.ts","../src/base/basedir.ts","../src/base/env.ts","../src/base/parser.ts","../src/base/electron.ts","../src/base/process.ts","../src/base/logging.ts","../src/base/ffmpeg.ts","../src/base/encoder.ts","../src/base/limiter.ts","../src/base/stream.ts","../src/ai/opencode.ts","../src/base/lazy.ts","../src/base/noerr.ts","../src/base/retry.ts","../src/base/timing.ts"],"sourcesContent":["// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport z from \"zod\";\nimport packageJSON from \"../../package.json\";\nimport { RecordSchema } from \"../base/schema\";\nimport { pup } from \"../pup\";\n\nexport const PupMCPSchema = z\n .object({ source: z.string().describe(\"file://, http(s)://, or data: URI\") })\n .extend(RecordSchema.shape);\n\nexport const MCP_TOOL_NAME = packageJSON.name;\nexport const MCP_TOOL_TITLE = \"Record Webpage\";\nexport const MCP_TOOL_DESC = \"Record a webpage to video\";\n\nexport function mcpAddPup(server: McpServer) {\n server.registerTool(\n MCP_TOOL_NAME,\n {\n title: MCP_TOOL_TITLE,\n description: MCP_TOOL_DESC,\n inputSchema: PupMCPSchema,\n },\n async (args) => {\n try {\n const result = await pup(args.source, args);\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n { type: \"text\", text: JSON.stringify({ error: String(error) }) },\n ],\n };\n }\n },\n );\n}\n\nexport async function startMCPServer() {\n const server = new McpServer(packageJSON);\n mcpAddPup(server);\n await server.connect(new StdioServerTransport());\n}\n","{\n \"name\": \"pup-recorder\",\n \"version\": \"0.0.15\",\n \"description\": \"A nice webview recording tool.\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Autokaka/pup-recorder.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"autokaka\",\n \"type\": \"module\",\n \"bin\": {\n \"pup\": \"dist/cli.js\",\n \"pup-cjs\": \"dist/cjs/cli.cjs\",\n \"pup-mcp-server\": \"dist/mcp_server.js\",\n \"pup-mcp-server-cjs\": \"dist/cjs/mcp_server.cjs\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n }\n },\n \"engines\": {\n \"bun\": \">= 1\",\n \"node\": \">= 20\"\n },\n \"engineStrict\": true,\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/node\": \"^20.0.0\",\n \"@typescript/native-preview\": \"latest\",\n \"tsup\": \"latest\",\n \"typescript\": \"latest\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"latest\",\n \"@opencode-ai/plugin\": \"latest\",\n \"commander\": \"latest\",\n \"electron\": \"latest\",\n \"zod\": \"latest\"\n },\n \"scripts\": {\n \"build\": \"bun build.ts && bun build_rust.ts\"\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport type { Size } from \"electron\";\nimport z from \"zod\";\n\nexport interface VideoSpec {\n fps: number;\n frames: number;\n size: Size;\n}\n\nexport interface VideoFiles {\n mp4?: string;\n webm?: string;\n mov?: string;\n}\n\nexport interface VideoFilesWithCover extends VideoFiles {\n cover: string;\n}\n\nexport const DEFAULT_WIDTH = 1920;\nexport const DEFAULT_HEIGHT = 1080;\nexport const DEFAULT_FPS = 30;\nexport const DEFAULT_DURATION = 5;\nexport const DEFAULT_OUT_DIR = \"out\";\n\nexport const RecordSchema = z.object({\n duration: z\n .number()\n .optional()\n .default(DEFAULT_DURATION)\n .describe(\"Recording duration in seconds\"),\n width: z.number().optional().default(DEFAULT_WIDTH).describe(\"Video width\"),\n height: z\n .number()\n .optional()\n .default(DEFAULT_HEIGHT)\n .describe(\"Video height\"),\n fps: z.number().optional().default(DEFAULT_FPS).describe(\"Frames per second\"),\n withAlphaChannel: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Output with alpha channel\"),\n outDir: z\n .string()\n .optional()\n .default(DEFAULT_OUT_DIR)\n .describe(\"Output directory\"),\n useInnerProxy: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Use bilibili inner proxy for resource access\"),\n});\n\nexport interface RecordOptions {\n duration: number;\n width: number;\n height: number;\n fps: number;\n withAlphaChannel: boolean;\n outDir: string;\n useInnerProxy: boolean;\n}\n\nexport interface RecordResult {\n options: RecordOptions;\n written: number;\n bgraPath: string;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { spawn } from \"child_process\";\nimport type { Size } from \"electron\";\nimport { readFile, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { AbortLink, type AbortQuery } from \"./base/abort\";\nimport { pupAppPath } from \"./base/constants\";\nimport { runElectronApp } from \"./base/electron\";\nimport { encodeBgraFile, encodeBgraToMov } from \"./base/encoder\";\nimport { createCoverCommand } from \"./base/ffmpeg\";\nimport { ConcurrencyLimiter } from \"./base/limiter\";\nimport { logger } from \"./base/logging\";\nimport { parseNumber } from \"./base/parser\";\nimport { type ProcessHandle } from \"./base/process\";\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n type RecordOptions,\n type RecordResult,\n type VideoFilesWithCover,\n type VideoSpec,\n} from \"./base/schema\";\nimport { waitAll } from \"./base/stream\";\n\nconst TAG = \"[pup]\";\nconst PROGRESS_TAG = \" progress: \";\n\nexport type PupProgressCallback = (progress: number) => Promise<void> | void;\n\nexport interface PupOptions extends Partial<RecordOptions> {\n cancelQuery?: AbortQuery;\n onProgress?: PupProgressCallback;\n}\n\nfunction runPupApp(source: string, options: PupOptions) {\n logger.debug(TAG, `runPupApp`, source, options);\n\n const args: string[] = [source];\n if (options.width) args.push(\"--width\", `${options.width}`);\n if (options.height) args.push(\"--height\", `${options.height}`);\n if (options.fps) args.push(\"--fps\", `${options.fps}`);\n if (options.duration) args.push(\"--duration\", `${options.duration}`);\n if (options.outDir) args.push(\"--out-dir\", options.outDir);\n if (options.withAlphaChannel) args.push(\"--with-alpha-channel\");\n if (options.useInnerProxy) args.push(\"--use-inner-proxy\");\n\n const w = options.width ?? DEFAULT_WIDTH;\n const h = options.height ?? DEFAULT_HEIGHT;\n const handle = runElectronApp({ width: w, height: h }, pupAppPath, args);\n const counter = new ConcurrencyLimiter(1);\n handle.process.stdout?.on(\"data\", (data: Buffer) => {\n let message = data.toString().trim();\n let start = message.indexOf(PROGRESS_TAG);\n if (start < 0) {\n return;\n }\n message = message.slice(start + PROGRESS_TAG.length);\n const end = message.indexOf(\"%\");\n if (end < 0) {\n return;\n }\n const progressStr = message.slice(0, end);\n const progress = parseNumber(progressStr);\n counter.schedule(async () => {\n await options.onProgress?.(progress);\n });\n });\n return { handle, counter };\n}\n\nexport async function pup(source: string, options: PupOptions) {\n logger.debug(TAG, `pup`, source, options);\n\n const link = AbortLink.start(options.cancelQuery);\n const outDir = options.outDir ?? \"out\";\n\n const t0 = performance.now();\n const { handle, counter } = runPupApp(source, { ...options, outDir });\n\n await link.wait(handle);\n await counter.end();\n logger.info(TAG, `capture cost ${Math.round(performance.now() - t0)}ms`);\n\n const metaPath = join(outDir, \"record.json\");\n const meta = JSON.parse(await readFile(metaPath, \"utf-8\")) as RecordResult;\n\n const { bgraPath, written, options: recordOptions } = meta;\n const { fps, width, height, withAlphaChannel } = recordOptions;\n const size: Size = { width, height };\n\n const outputs: VideoFilesWithCover = {\n mp4: withAlphaChannel ? undefined : join(outDir, \"output.mp4\"),\n webm: withAlphaChannel ? join(outDir, \"output.webm\") : undefined,\n mov: withAlphaChannel ? join(outDir, \"output.mov\") : undefined,\n cover: join(outDir, \"cover.png\"),\n };\n\n try {\n const t1 = performance.now();\n\n const spec: VideoSpec = { fps, frames: written, size };\n const handles: ProcessHandle[] = [];\n if (outputs.mp4) {\n handles.push(encodeBgraFile(bgraPath, outputs.mp4, spec, \"mp4\"));\n }\n if (outputs.webm) {\n handles.push(encodeBgraFile(bgraPath, outputs.webm, spec, \"webm\"));\n }\n if (outputs.mov) {\n handles.push(encodeBgraToMov(bgraPath, outputs.mov, spec));\n }\n await link.wait(...handles);\n\n const coverSrc = outputs.mov ?? outputs.webm ?? outputs.mp4;\n if (coverSrc) {\n const coverCmd = createCoverCommand(coverSrc, outputs.cover);\n await waitAll(\n spawn(coverCmd.command, coverCmd.args, { stdio: \"inherit\" }),\n );\n }\n\n link.stop();\n logger.info(TAG, `encoding cost ${Math.round(performance.now() - t1)}ms`);\n\n await Promise.all([\n rm(bgraPath, { force: true }),\n rm(metaPath, { force: true }),\n ]);\n return {\n ...outputs,\n width,\n height,\n fps,\n duration: Math.ceil(written / fps),\n };\n } catch (error) {\n await rm(outDir, { recursive: true, force: true });\n throw error;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/11.\n\nimport type { ProcessHandle } from \"./process\";\n\nexport type AsyncTask = () => Promise<void> | void;\nexport type AbortQuery = () => Promise<boolean> | boolean;\n\nexport class AbortLink {\n private _callback?: AsyncTask;\n private _aborted?: boolean;\n private _stopped = false;\n\n private constructor(\n readonly query?: AbortQuery,\n readonly interval: number = 1000,\n ) {\n if (query) {\n this.tick();\n }\n }\n\n static start(query?: AbortQuery, interval?: number) {\n return new AbortLink(query, interval);\n }\n\n get aborted() {\n return !this._stopped && this._aborted;\n }\n\n get stopped() {\n return this._stopped;\n }\n\n async onAbort(callback: AsyncTask) {\n if (this._aborted) {\n await callback();\n } else {\n this._callback = callback;\n }\n }\n\n wait(...handles: ProcessHandle[]) {\n const abort = new Promise((_, reject) => {\n this.onAbort(async () => {\n handles.forEach((h) => h.process.kill());\n reject(new Error(\"aborted\"));\n });\n });\n return Promise.race([\n abort,\n Promise.all(handles.map((h) => h.wait)), //\n ]);\n }\n\n stop() {\n this._stopped = true;\n }\n\n private tick() {\n setTimeout(async () => {\n if (this._stopped) {\n return;\n }\n this._aborted = await this.query?.();\n if (this._stopped) {\n return;\n }\n if (this._aborted) {\n await this._callback?.();\n } else {\n this.tick();\n }\n }, this.interval);\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { basedir } from \"./basedir\";\nimport { penv } from \"./env\";\nimport { parseNumber } from \"./parser\";\n\nconst pupAppSearchPaths = [\n join(basedir, \"cjs/app.cjs\"), // process from dist\n join(basedir, \"app.cjs\"), // process from dist/cjs\n join(basedir, \"../../cjs/app.cjs\"), // process from src\n];\nexport const pupAppPath = pupAppSearchPaths.find(existsSync)!;\n\nconst env = process.env;\nexport const pupLogLevel = penv(\"PUP_LOG_LEVEL\", parseNumber, 2);\nexport const pupUseInnerProxy = env[\"PUP_USE_INNER_PROXY\"] === \"1\";\nexport const pupFFmpegPath = env[\"FFMPEG_BIN\"] ?? `ffmpeg`;\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport { dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nexport const basedir = dirname(fileURLToPath(import.meta.url));\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nexport type EnvParser<T> = (value: unknown) => T;\n\nexport function penv<T>(name: string, parser: EnvParser<T>, defaultValue: T): T;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined {\n try {\n return parser(process.env[name]);\n } catch {\n return defaultValue;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport function parseNumber(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new Error(`Value ${value} is not a valid number`);\n }\n return num;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport electron, { type Size } from \"electron\";\nimport { exec } from \"./process\";\n\nexport const ELECTRON_OPTS = [\n \"no-sandbox\",\n \"disable-setuid-sandbox\",\n \"disable-gpu\",\n \"disable-dev-shm-usage\",\n \"disable-software-rasterizer\",\n \"disable-web-security\",\n \"disable-site-isolation-trials\",\n \"disable-features=IsolateOrigins,site-per-process\",\n \"allow-insecure-localhost\",\n \"ignore-certificate-errors\",\n \"disable-blink-features=AutomationControlled\",\n \"mute-audio\",\n \"disable-extensions\",\n \"disable-background-networking\",\n \"address-family=ipv4\",\n \"disable-async-dns\",\n \"force-device-scale-factor=1\",\n \"trace-warnings\",\n \"force-color-profile=srgb\",\n \"disable-color-correct-rendering\",\n \"log-level=3\",\n];\n\nexport function runElectronApp(size: Size, app: unknown, args: unknown[]) {\n const electronArgs = ELECTRON_OPTS.map((a) => `--${a}`);\n const cmdParts = [];\n if (process.platform === \"linux\") {\n cmdParts.push(\n \"xvfb-run\",\n \"--auto-servernum\",\n `--server-args='-screen 0 ${size.width}x${size.height}x24'`,\n );\n }\n cmdParts.push(electron, ...electronArgs, app);\n return exec(cmdParts.join(\" \"), {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: true,\n env: {\n ...process.env,\n ELECTRON_DISABLE_DBUS: \"1\",\n RUST_BACKTRACE: \"full\",\n __PUP_ARGS__: JSON.stringify(args),\n },\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nimport { spawn, type ChildProcess, type SpawnOptions } from \"child_process\";\nimport { logger } from \"./logging\";\n\nexport const PUP_ARGS_ENV_KEY = \"__PUP_ARGS__\";\n\nexport function pargs() {\n const pupArgs = process.env[PUP_ARGS_ENV_KEY];\n if (pupArgs) {\n const args = [\"exec\", ...process.argv.slice(-1)];\n args.push(...JSON.parse(pupArgs));\n logger.debug(\"pupargs\", args);\n return args;\n }\n\n logger.debug(\"procargv\", process.argv);\n return process.argv;\n}\n\nexport interface ProcessHandle {\n process: ChildProcess;\n wait: Promise<void>;\n}\n\nexport function exec(cmd: string, options?: SpawnOptions): ProcessHandle {\n const parts = cmd.split(\" \").filter((s) => s.length);\n const [command, ...args] = parts;\n if (!command) throw new Error(\"empty command\");\n const proc = spawn(command, args, {\n stdio: \"inherit\",\n ...options,\n });\n return { process: proc, wait: logger.attach(proc, command) };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport { ChildProcess, type Serializable } from \"child_process\";\nimport { pupLogLevel } from \"./constants\";\n\nexport interface LoggerLike {\n debug?(this: void, ...messages: unknown[]): void;\n\n info?(this: void, ...messages: unknown[]): void;\n\n warn?(this: void, ...messages: unknown[]): void;\n\n error?(this: void, ...messages: unknown[]): void;\n}\n\nconst DEBUG = \"<pup@debug>\";\nconst INFO = \"<pup@info>\";\nconst WARN = \"<pup@warn>\";\nconst ERROR = \"<pup@error>\";\nconst FATAL = \"<pup@fatal>\";\n\nclass Logger implements LoggerLike {\n private _impl?: LoggerLike;\n\n get impl(): LoggerLike | undefined {\n return this._impl;\n }\n\n set impl(value: LoggerLike) {\n const debug = value.debug ?? console.debug;\n const info = value.info ?? console.info;\n const warn = value.warn ?? console.warn;\n const error = value.error ?? console.error;\n this._impl = {\n debug: pupLogLevel >= 3 ? debug : undefined,\n info: pupLogLevel >= 2 ? info : undefined,\n warn: pupLogLevel >= 1 ? warn : undefined,\n error: pupLogLevel >= 0 ? error : undefined,\n };\n }\n\n constructor() {\n this.impl = console;\n }\n\n debug(...messages: unknown[]): void {\n this.impl?.debug?.(DEBUG, ...messages);\n }\n\n info(...messages: unknown[]): void {\n this.impl?.info?.(INFO, ...messages);\n }\n\n warn(...messages: unknown[]): void {\n this.impl?.warn?.(WARN, ...messages);\n }\n\n error(...messages: unknown[]): void {\n this.impl?.error?.(ERROR, ...messages);\n }\n\n fatal(...messages: unknown[]): never {\n this.impl?.error?.(FATAL, ...messages);\n process.exit(1);\n }\n\n private dispatch(message: string) {\n if (message.startsWith(DEBUG)) {\n this.debug(message.slice(DEBUG.length + 1));\n } else if (message.startsWith(INFO)) {\n this.info(message.slice(INFO.length + 1));\n } else if (message.startsWith(WARN)) {\n this.warn(message.slice(WARN.length + 1));\n } else if (message.startsWith(ERROR)) {\n this.error(message.slice(ERROR.length + 1));\n } else {\n this.info(message);\n }\n }\n\n attach(proc: ChildProcess, name: string) {\n return new Promise<void>((resolve, reject) => {\n this.debug(`${name}.attach`);\n let fatal: string = \"\";\n const dispatch = (data: Buffer | Serializable) => {\n const message = data.toString();\n if (message.startsWith(FATAL)) {\n fatal += message.slice(FATAL.length + 1);\n } else {\n this.dispatch(message);\n }\n };\n proc.stderr?.on(\"data\", dispatch);\n proc.stdout?.on(\"data\", dispatch);\n proc\n .on(\"message\", dispatch)\n .on(\"error\", (err) => {\n fatal += err.message;\n proc.kill();\n })\n .once(\"close\", (code, signal) => {\n if (code || signal || fatal) {\n fatal ||= `command failed: ${proc.spawnargs.join(\" \")}`;\n this.error(`${name}.close`, { code, signal, fatal });\n reject(new Error(fatal));\n } else {\n this.debug(`${name}.close`);\n resolve();\n }\n })\n .on(\"unhandledRejection\", (reason) => {\n this.error(`${name}.unhandled`, reason);\n })\n .on(\"uncaughtExceptionMonitor\", (err) => {\n this.error(`${name}.unhandled`, err);\n });\n });\n }\n}\n\nconst logger = new Logger();\n\nexport { logger };\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { arch, platform } from \"process\";\nimport { basedir } from \"./basedir\";\nimport { pupFFmpegPath } from \"./constants\";\nimport type { VideoFiles, VideoSpec } from \"./schema\";\n\ninterface Command {\n command: string;\n args: string[];\n}\n\nconst quiet = [\"-hide_banner\", \"-loglevel\", \"error\", \"-nostats\"];\n\nfunction resolveX265() {\n const path = `x265/${platform}-${arch}`;\n const dirs = [\n join(basedir, `../../${path}`), // process from src\n join(basedir, `../${path}`), // process from dist\n ];\n const found = dirs.find(existsSync);\n if (!found) {\n throw new Error(\"x265 not found\");\n }\n return found;\n}\n\nexport function createBgraFileCommand(\n bgraPath: string,\n spec: VideoSpec,\n files: VideoFiles,\n): Command {\n const { fps, frames } = spec;\n const args = [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${spec.size.width}x${spec.size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-frames:v\",\n `${Math.floor(frames)}`,\n ];\n if (files.mp4) {\n args.push(\n \"-colorspace\",\n \"bt709\",\n \"-color_primaries\",\n \"bt709\",\n \"-color_trc\",\n \"bt709\",\n \"-c:v\",\n \"libx264\",\n \"-preset\",\n \"fast\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuv420p\",\n \"-movflags\",\n \"+faststart\",\n files.mp4,\n );\n }\n if (files.webm) {\n args.push(\n \"-c:v\",\n \"libvpx-vp9\",\n \"-row-mt\",\n \"1\",\n \"-cpu-used\",\n \"1\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuva420p\",\n \"-auto-alt-ref\",\n \"0\",\n files.webm,\n );\n }\n return { command: pupFFmpegPath, args };\n}\n\ninterface X265Pipeline {\n raw: Command;\n x265: Command;\n mux: Command;\n}\n\nexport function createBgraToMovPipeline(\n bgraPath: string,\n spec: VideoSpec,\n mov: string,\n): X265Pipeline {\n const { fps, size } = spec;\n return {\n raw: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${size.width}x${size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"yuva420p10le\",\n \"pipe:1\",\n ],\n },\n x265: {\n command: resolveX265(),\n args: [\n \"--no-progress\",\n \"--log-level\",\n \"error\",\n \"--input\",\n \"-\",\n \"--input-res\",\n `${size.width}x${size.height}`,\n \"--input-csp\",\n \"i420\",\n \"--input-depth\",\n \"10\",\n \"--output-depth\",\n \"10\",\n \"--fps\",\n `${fps}`,\n \"--alpha\",\n \"--bframes\",\n \"0\",\n \"--colorprim\",\n \"bt709\",\n \"--transfer\",\n \"bt709\",\n \"--colormatrix\",\n \"bt709\",\n \"--crf\",\n \"18\",\n \"--output\",\n \"-\",\n ],\n },\n mux: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"hevc\",\n \"-r\",\n `${fps}`,\n \"-i\",\n \"pipe:0\",\n \"-c:v\",\n \"copy\",\n \"-tag:v\",\n \"hvc1\",\n \"-movflags\",\n \"+faststart\",\n mov,\n ],\n },\n };\n}\n\nexport function createCoverCommand(src: string, dst: string): Command {\n return {\n command: pupFFmpegPath,\n args: [\"-y\", ...quiet, \"-i\", src, \"-frames:v\", \"1\", \"-q:v\", \"2\", dst],\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { createBgraFileCommand, createBgraToMovPipeline } from \"./ffmpeg\";\nimport { exec, type ProcessHandle } from \"./process\";\nimport type { VideoSpec } from \"./schema\";\n\nexport function encodeBgraFile(\n bgraPath: string,\n outputPath: string,\n spec: VideoSpec,\n format: \"mp4\" | \"webm\",\n): ProcessHandle {\n const files = format === \"mp4\" ? { mp4: outputPath } : { webm: outputPath };\n const cmd = createBgraFileCommand(bgraPath, spec, files);\n return exec(`${cmd.command} ${cmd.args.join(\" \")}`, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n });\n}\n\nexport function encodeBgraToMov(\n bgraPath: string,\n movPath: string,\n spec: VideoSpec,\n): ProcessHandle {\n const x265 = createBgraToMovPipeline(bgraPath, spec, movPath);\n const shellCmd = [\n `${x265.raw.command} ${x265.raw.args.join(\" \")}`,\n `${x265.x265.command} ${x265.x265.args.join(\" \")}`,\n `${x265.mux.command} ${x265.mux.args.join(\" \")}`,\n ].join(\" | \");\n return exec(shellCmd, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n shell: true,\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport class ConcurrencyLimiter {\n private _active = 0;\n private _queue: VoidFunction[] = [];\n private _pending = 0;\n private _ended = false;\n\n constructor(readonly maxConcurrency: number) {}\n\n get active(): number {\n return this._active;\n }\n\n get pending(): number {\n return this._pending;\n }\n\n async schedule<T>(fn: () => Promise<T>): Promise<T> {\n if (this._ended) {\n throw new Error(\"ended\");\n }\n return new Promise<T>((resolve, reject) => {\n const run = () => {\n this._active++;\n this._pending--;\n fn()\n .then(resolve)\n .catch(reject)\n .finally(() => {\n this._active--;\n this.next();\n });\n };\n this._pending++;\n if (this._active < this.maxConcurrency) {\n run();\n } else {\n this._queue.push(run);\n }\n });\n }\n\n async end() {\n if (!this._ended) {\n this._ended = true;\n while (this._active > 0 || this._pending > 0) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n }\n }\n\n private next() {\n if (this._active < this.maxConcurrency && this._queue.length > 0) {\n this._queue.shift()?.();\n }\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport type { ChildProcess } from \"child_process\";\n\nexport interface StreamWriter {\n write(buffer: Buffer): Promise<void>;\n end(): void;\n}\n\nexport function createWriter(stdin: NodeJS.WritableStream): StreamWriter {\n const drainPromise = new Map<NodeJS.WritableStream, Promise<void>>();\n\n const waitDrain = (stream: NodeJS.WritableStream) => {\n const existing = drainPromise.get(stream);\n if (existing) return existing;\n const promise = new Promise<void>((resolve, reject) => {\n const cleanup = (fn: () => void) => {\n stream.off(\"drain\", onDrain);\n stream.off(\"error\", onError);\n stream.off(\"close\", onClose);\n drainPromise.delete(stream);\n fn();\n };\n const onDrain = () => cleanup(resolve);\n const onError = (err: Error) => cleanup(() => reject(err));\n const onClose = () => cleanup(() => reject(new Error(\"stream closed\")));\n stream.on(\"drain\", onDrain);\n stream.on(\"error\", onError);\n stream.on(\"close\", onClose);\n });\n drainPromise.set(stream, promise);\n return promise;\n };\n\n const destroyed = () => Reflect.get(stdin, \"destroyed\");\n return {\n async write(buffer: Buffer) {\n if (destroyed()) {\n throw new Error(\"stdin destroyed\");\n }\n if (!stdin.write(buffer)) {\n await waitDrain(stdin);\n }\n },\n end: () => {\n if (!destroyed()) stdin.end();\n },\n };\n}\n\nexport function pipeline(...procs: ChildProcess[]) {\n for (let i = 0; i < procs.length - 1; i++) {\n const src = procs[i];\n const dst = procs[i + 1];\n if (!src?.stdout || !dst?.stdin) throw new Error(\"pipeline broken\");\n src.stdout.pipe(dst.stdin);\n }\n}\n\nexport function waitAll(...procs: ChildProcess[]) {\n return Promise.all(\n procs.map(\n (proc) =>\n new Promise<void>((resolve, reject) => {\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) =>\n code === 0\n ? resolve()\n : reject(new Error(`exit ${code ?? \"null\"}`)),\n );\n }),\n ),\n );\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport type { Plugin } from \"@opencode-ai/plugin\";\nimport { tool } from \"@opencode-ai/plugin\";\nimport {\n DEFAULT_DURATION,\n DEFAULT_FPS,\n DEFAULT_HEIGHT,\n DEFAULT_OUT_DIR,\n DEFAULT_WIDTH,\n} from \"../base/schema\";\nimport { pup } from \"../pup\";\nimport { MCP_TOOL_DESC, MCP_TOOL_NAME, PupMCPSchema } from \"./mcp\";\n\nconst z = tool.schema;\n\nconst PupPluginSchema = z.object({\n source: z.string().describe(PupMCPSchema.shape.source.description!),\n duration: z\n .number()\n .optional()\n .default(DEFAULT_DURATION)\n .describe(PupMCPSchema.shape.duration.description!),\n width: z\n .number()\n .optional()\n .default(DEFAULT_WIDTH)\n .describe(PupMCPSchema.shape.width.description!),\n height: z\n .number()\n .optional()\n .default(DEFAULT_HEIGHT)\n .describe(PupMCPSchema.shape.height.description!),\n fps: z\n .number()\n .optional()\n .default(DEFAULT_FPS)\n .describe(PupMCPSchema.shape.fps.description!),\n withAlphaChannel: z\n .boolean()\n .optional()\n .default(false)\n .describe(PupMCPSchema.shape.withAlphaChannel.description!),\n outDir: z\n .string()\n .optional()\n .default(DEFAULT_OUT_DIR)\n .describe(PupMCPSchema.shape.outDir.description!),\n useInnerProxy: z\n .boolean()\n .optional()\n .default(false)\n .describe(PupMCPSchema.shape.useInnerProxy.description!),\n});\n\nexport const PupOpenCodePlugin: Plugin = async () => {\n return {\n tool: {\n [MCP_TOOL_NAME]: tool({\n description: MCP_TOOL_DESC,\n args: PupPluginSchema.shape,\n async execute(args) {\n try {\n const result = await pup(args.source, args);\n return JSON.stringify(result, null, 2);\n } catch (error) {\n return JSON.stringify({ error: String(error) });\n }\n },\n }),\n },\n };\n};\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport class Lazy<T> {\n constructor(readonly makeValue: () => T) {}\n\n get value(): T {\n if (!this._initialized) {\n this._value = this.makeValue();\n this._initialized = true;\n }\n return this._value!;\n }\n\n get initialized(): boolean {\n return this._initialized;\n }\n\n private _initialized = false;\n private _value: T | undefined;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/24.\n\nexport function noerr<Fn extends (...args: any[]) => any, D>(\n fn: Fn,\n defaultValue: D,\n): (...args: Parameters<Fn>) => ReturnType<Fn> | D {\n return (...args) => {\n try {\n const ret = fn(...args);\n if (ret instanceof Promise) {\n return ret.catch(() => defaultValue);\n }\n return ret;\n } catch {\n return defaultValue;\n }\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/05.\n\nimport { setTimeout } from \"timers/promises\";\nimport { sleep } from \"./timing\";\n\nexport interface RetryOptions<Args extends any[], Ret> {\n fn: (...args: Args) => Promise<Ret>;\n maxAttempts?: number;\n timeout?: number;\n}\n\nexport function useRetry<Args extends any[], Ret>({\n fn,\n maxAttempts = 3,\n timeout,\n}: RetryOptions<Args, Ret>) {\n const timeoutError = new Error(`timeout over ${timeout}ms`);\n return async function (...args: Args) {\n let attempt = 0;\n while (true) {\n try {\n const promises = [fn(...args)];\n if (timeout) {\n promises.push(\n setTimeout(timeout).then(() => {\n throw timeoutError;\n }),\n );\n }\n return await Promise.race(promises);\n } catch (e) {\n attempt++;\n if (attempt >= maxAttempts) {\n throw e;\n }\n await sleep(Math.pow(2, attempt) * 100 + Math.random() * 100);\n }\n }\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nexport function sleep(ms: number) {\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\nexport function periodical(\n callback: (count: number) => Promise<void> | void,\n ms: number,\n) {\n let token: NodeJS.Timeout;\n let closed = false;\n async function tick(count: number) {\n await callback(count);\n if (closed) return;\n token = setTimeout(() => tick(count + 1), ms);\n }\n token = setTimeout(() => tick(0), ms);\n return () => {\n closed = true;\n clearTimeout(token);\n };\n}\n"],"mappings":"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","names":["z","spawn","join","existsSync","join","join","existsSync","join","spawn","z","z","setTimeout","setTimeout"]}
|
package/dist/mcp_server.js
CHANGED
|
@@ -6,9 +6,12 @@ import z2 from "zod";
|
|
|
6
6
|
// package.json
|
|
7
7
|
var package_default = {
|
|
8
8
|
name: "pup-recorder",
|
|
9
|
-
version: "0.0.
|
|
9
|
+
version: "0.0.15",
|
|
10
10
|
description: "A nice webview recording tool.",
|
|
11
|
-
|
|
11
|
+
repository: {
|
|
12
|
+
type: "git",
|
|
13
|
+
url: "https://github.com/Autokaka/pup-recorder.git"
|
|
14
|
+
},
|
|
12
15
|
license: "MIT",
|
|
13
16
|
author: "autokaka",
|
|
14
17
|
type: "module",
|
package/dist/mcp_server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ai/mcp.ts","../package.json","../src/base/schema.ts","../src/pup.ts","../src/base/abort.ts","../src/base/constants.ts","../src/base/basedir.ts","../src/base/env.ts","../src/base/parser.ts","../src/base/electron.ts","../src/base/process.ts","../src/base/logging.ts","../src/base/ffmpeg.ts","../src/base/encoder.ts","../src/base/limiter.ts","../src/base/stream.ts","../src/mcp_server.ts"],"sourcesContent":["// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport z from \"zod\";\nimport packageJSON from \"../../package.json\";\nimport { RecordSchema } from \"../base/schema\";\nimport { pup } from \"../pup\";\n\nexport const PupMCPSchema = z\n .object({ source: z.string().describe(\"file://, http(s)://, or data: URI\") })\n .extend(RecordSchema.shape);\n\nexport const MCP_TOOL_NAME = packageJSON.name;\nexport const MCP_TOOL_TITLE = \"Record Webpage\";\nexport const MCP_TOOL_DESC = \"Record a webpage to video\";\n\nexport function mcpAddPup(server: McpServer) {\n server.registerTool(\n MCP_TOOL_NAME,\n {\n title: MCP_TOOL_TITLE,\n description: MCP_TOOL_DESC,\n inputSchema: PupMCPSchema,\n },\n async (args) => {\n try {\n const result = await pup(args.source, args);\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n { type: \"text\", text: JSON.stringify({ error: String(error) }) },\n ],\n };\n }\n },\n );\n}\n\nexport async function startMCPServer() {\n const server = new McpServer(packageJSON);\n mcpAddPup(server);\n await server.connect(new StdioServerTransport());\n}\n","{\n \"name\": \"pup-recorder\",\n \"version\": \"0.0.12\",\n \"description\": \"A nice webview recording tool.\",\n \"homepage\": \"https://github.com/Autokaka/pup-recorder\",\n \"license\": \"MIT\",\n \"author\": \"autokaka\",\n \"type\": \"module\",\n \"bin\": {\n \"pup\": \"dist/cli.js\",\n \"pup-cjs\": \"dist/cjs/cli.cjs\",\n \"pup-mcp-server\": \"dist/mcp_server.js\",\n \"pup-mcp-server-cjs\": \"dist/cjs/mcp_server.cjs\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n }\n },\n \"engines\": {\n \"bun\": \">= 1\",\n \"node\": \">= 20\"\n },\n \"engineStrict\": true,\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/node\": \"^20.0.0\",\n \"@typescript/native-preview\": \"latest\",\n \"tsup\": \"latest\",\n \"typescript\": \"latest\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"latest\",\n \"@opencode-ai/plugin\": \"latest\",\n \"commander\": \"latest\",\n \"electron\": \"latest\",\n \"zod\": \"latest\"\n },\n \"scripts\": {\n \"build\": \"bun build.ts && bun build_rust.ts\"\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport type { Size } from \"electron\";\nimport z from \"zod\";\n\nexport interface VideoSpec {\n fps: number;\n frames: number;\n size: Size;\n}\n\nexport interface VideoFiles {\n mp4?: string;\n webm?: string;\n mov?: string;\n}\n\nexport interface VideoFilesWithCover extends VideoFiles {\n cover: string;\n}\n\nexport const DEFAULT_WIDTH = 1920;\nexport const DEFAULT_HEIGHT = 1080;\nexport const DEFAULT_FPS = 30;\nexport const DEFAULT_DURATION = 5;\nexport const DEFAULT_OUT_DIR = \"out\";\n\nexport const RecordSchema = z.object({\n duration: z\n .number()\n .optional()\n .default(DEFAULT_DURATION)\n .describe(\"Recording duration in seconds\"),\n width: z.number().optional().default(DEFAULT_WIDTH).describe(\"Video width\"),\n height: z\n .number()\n .optional()\n .default(DEFAULT_HEIGHT)\n .describe(\"Video height\"),\n fps: z.number().optional().default(DEFAULT_FPS).describe(\"Frames per second\"),\n withAlphaChannel: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Output with alpha channel\"),\n outDir: z\n .string()\n .optional()\n .default(DEFAULT_OUT_DIR)\n .describe(\"Output directory\"),\n useInnerProxy: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Use bilibili inner proxy for resource access\"),\n});\n\nexport interface RecordOptions {\n duration: number;\n width: number;\n height: number;\n fps: number;\n withAlphaChannel: boolean;\n outDir: string;\n useInnerProxy: boolean;\n}\n\nexport interface RecordResult {\n options: RecordOptions;\n written: number;\n bgraPath: string;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { spawn } from \"child_process\";\nimport type { Size } from \"electron\";\nimport { readFile, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { AbortLink, type AbortQuery } from \"./base/abort\";\nimport { pupAppPath } from \"./base/constants\";\nimport { runElectronApp } from \"./base/electron\";\nimport { encodeBgraFile, encodeBgraToMov } from \"./base/encoder\";\nimport { createCoverCommand } from \"./base/ffmpeg\";\nimport { ConcurrencyLimiter } from \"./base/limiter\";\nimport { logger } from \"./base/logging\";\nimport { parseNumber } from \"./base/parser\";\nimport { type ProcessHandle } from \"./base/process\";\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n type RecordOptions,\n type RecordResult,\n type VideoFilesWithCover,\n type VideoSpec,\n} from \"./base/schema\";\nimport { waitAll } from \"./base/stream\";\n\nconst TAG = \"[pup]\";\nconst PROGRESS_TAG = \" progress: \";\n\nexport type PupProgressCallback = (progress: number) => Promise<void> | void;\n\nexport interface PupOptions extends Partial<RecordOptions> {\n cancelQuery?: AbortQuery;\n onProgress?: PupProgressCallback;\n}\n\nfunction runPupApp(source: string, options: PupOptions) {\n logger.debug(TAG, `runPupApp`, source, options);\n\n const args: string[] = [source];\n if (options.width) args.push(\"--width\", `${options.width}`);\n if (options.height) args.push(\"--height\", `${options.height}`);\n if (options.fps) args.push(\"--fps\", `${options.fps}`);\n if (options.duration) args.push(\"--duration\", `${options.duration}`);\n if (options.outDir) args.push(\"--out-dir\", options.outDir);\n if (options.withAlphaChannel) args.push(\"--with-alpha-channel\");\n if (options.useInnerProxy) args.push(\"--use-inner-proxy\");\n\n const w = options.width ?? DEFAULT_WIDTH;\n const h = options.height ?? DEFAULT_HEIGHT;\n const handle = runElectronApp({ width: w, height: h }, pupAppPath, args);\n const counter = new ConcurrencyLimiter(1);\n handle.process.stdout?.on(\"data\", (data: Buffer) => {\n let message = data.toString().trim();\n let start = message.indexOf(PROGRESS_TAG);\n if (start < 0) {\n return;\n }\n message = message.slice(start + PROGRESS_TAG.length);\n const end = message.indexOf(\"%\");\n if (end < 0) {\n return;\n }\n const progressStr = message.slice(0, end);\n const progress = parseNumber(progressStr);\n counter.schedule(async () => {\n await options.onProgress?.(progress);\n });\n });\n return { handle, counter };\n}\n\nexport async function pup(source: string, options: PupOptions) {\n logger.debug(TAG, `pup`, source, options);\n\n const link = AbortLink.start(options.cancelQuery);\n const outDir = options.outDir ?? \"out\";\n\n const t0 = performance.now();\n const { handle, counter } = runPupApp(source, { ...options, outDir });\n\n await link.wait(handle);\n await counter.end();\n logger.info(TAG, `capture cost ${Math.round(performance.now() - t0)}ms`);\n\n const metaPath = join(outDir, \"record.json\");\n const meta = JSON.parse(await readFile(metaPath, \"utf-8\")) as RecordResult;\n\n const { bgraPath, written, options: recordOptions } = meta;\n const { fps, width, height, withAlphaChannel } = recordOptions;\n const size: Size = { width, height };\n\n const outputs: VideoFilesWithCover = {\n mp4: withAlphaChannel ? undefined : join(outDir, \"output.mp4\"),\n webm: withAlphaChannel ? join(outDir, \"output.webm\") : undefined,\n mov: withAlphaChannel ? join(outDir, \"output.mov\") : undefined,\n cover: join(outDir, \"cover.png\"),\n };\n\n try {\n const t1 = performance.now();\n\n const spec: VideoSpec = { fps, frames: written, size };\n const handles: ProcessHandle[] = [];\n if (outputs.mp4) {\n handles.push(encodeBgraFile(bgraPath, outputs.mp4, spec, \"mp4\"));\n }\n if (outputs.webm) {\n handles.push(encodeBgraFile(bgraPath, outputs.webm, spec, \"webm\"));\n }\n if (outputs.mov) {\n handles.push(encodeBgraToMov(bgraPath, outputs.mov, spec));\n }\n await link.wait(...handles);\n\n const coverSrc = outputs.mov ?? outputs.webm ?? outputs.mp4;\n if (coverSrc) {\n const coverCmd = createCoverCommand(coverSrc, outputs.cover);\n await waitAll(\n spawn(coverCmd.command, coverCmd.args, { stdio: \"inherit\" }),\n );\n }\n\n link.stop();\n logger.info(TAG, `encoding cost ${Math.round(performance.now() - t1)}ms`);\n\n await Promise.all([\n rm(bgraPath, { force: true }),\n rm(metaPath, { force: true }),\n ]);\n return {\n ...outputs,\n width,\n height,\n fps,\n duration: Math.ceil(written / fps),\n };\n } catch (error) {\n await rm(outDir, { recursive: true, force: true });\n throw error;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/11.\n\nimport type { ProcessHandle } from \"./process\";\n\nexport type AsyncTask = () => Promise<void> | void;\nexport type AbortQuery = () => Promise<boolean> | boolean;\n\nexport class AbortLink {\n private _callback?: AsyncTask;\n private _aborted?: boolean;\n private _stopped = false;\n\n private constructor(\n readonly query?: AbortQuery,\n readonly interval: number = 1000,\n ) {\n if (query) {\n this.tick();\n }\n }\n\n static start(query?: AbortQuery, interval?: number) {\n return new AbortLink(query, interval);\n }\n\n get aborted() {\n return !this._stopped && this._aborted;\n }\n\n get stopped() {\n return this._stopped;\n }\n\n async onAbort(callback: AsyncTask) {\n if (this._aborted) {\n await callback();\n } else {\n this._callback = callback;\n }\n }\n\n wait(...handles: ProcessHandle[]) {\n const abort = new Promise((_, reject) => {\n this.onAbort(async () => {\n handles.forEach((h) => h.process.kill());\n reject(new Error(\"aborted\"));\n });\n });\n return Promise.race([\n abort,\n Promise.all(handles.map((h) => h.wait)), //\n ]);\n }\n\n stop() {\n this._stopped = true;\n }\n\n private tick() {\n setTimeout(async () => {\n if (this._stopped) {\n return;\n }\n this._aborted = await this.query?.();\n if (this._stopped) {\n return;\n }\n if (this._aborted) {\n await this._callback?.();\n } else {\n this.tick();\n }\n }, this.interval);\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { basedir } from \"./basedir\";\nimport { penv } from \"./env\";\nimport { parseNumber } from \"./parser\";\n\nconst pupAppSearchPaths = [\n join(basedir, \"cjs/app.cjs\"), // process from dist\n join(basedir, \"app.cjs\"), // process from dist/cjs\n join(basedir, \"../../cjs/app.cjs\"), // process from src\n];\nexport const pupAppPath = pupAppSearchPaths.find(existsSync)!;\n\nconst env = process.env;\nexport const pupLogLevel = penv(\"PUP_LOG_LEVEL\", parseNumber, 2);\nexport const pupUseInnerProxy = env[\"PUP_USE_INNER_PROXY\"] === \"1\";\nexport const pupFFmpegPath = env[\"FFMPEG_BIN\"] ?? `ffmpeg`;\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport { dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nexport const basedir = dirname(fileURLToPath(import.meta.url));\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nexport type EnvParser<T> = (value: unknown) => T;\n\nexport function penv<T>(name: string, parser: EnvParser<T>, defaultValue: T): T;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined {\n try {\n return parser(process.env[name]);\n } catch {\n return defaultValue;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport function parseNumber(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new Error(`Value ${value} is not a valid number`);\n }\n return num;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport electron, { type Size } from \"electron\";\nimport { exec } from \"./process\";\n\nexport const ELECTRON_OPTS = [\n \"no-sandbox\",\n \"disable-setuid-sandbox\",\n \"disable-gpu\",\n \"disable-dev-shm-usage\",\n \"disable-software-rasterizer\",\n \"disable-web-security\",\n \"disable-site-isolation-trials\",\n \"disable-features=IsolateOrigins,site-per-process\",\n \"allow-insecure-localhost\",\n \"ignore-certificate-errors\",\n \"disable-blink-features=AutomationControlled\",\n \"mute-audio\",\n \"disable-extensions\",\n \"disable-background-networking\",\n \"address-family=ipv4\",\n \"disable-async-dns\",\n \"force-device-scale-factor=1\",\n \"trace-warnings\",\n \"force-color-profile=srgb\",\n \"disable-color-correct-rendering\",\n \"log-level=3\",\n];\n\nexport function runElectronApp(size: Size, app: unknown, args: unknown[]) {\n const electronArgs = ELECTRON_OPTS.map((a) => `--${a}`);\n const cmdParts = [];\n if (process.platform === \"linux\") {\n cmdParts.push(\n \"xvfb-run\",\n \"--auto-servernum\",\n `--server-args='-screen 0 ${size.width}x${size.height}x24'`,\n );\n }\n cmdParts.push(electron, ...electronArgs, app);\n return exec(cmdParts.join(\" \"), {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: true,\n env: {\n ...process.env,\n ELECTRON_DISABLE_DBUS: \"1\",\n RUST_BACKTRACE: \"full\",\n __PUP_ARGS__: JSON.stringify(args),\n },\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nimport { spawn, type ChildProcess, type SpawnOptions } from \"child_process\";\nimport { logger } from \"./logging\";\n\nexport const PUP_ARGS_ENV_KEY = \"__PUP_ARGS__\";\n\nexport function pargs() {\n const pupArgs = process.env[PUP_ARGS_ENV_KEY];\n if (pupArgs) {\n const args = [\"exec\", ...process.argv.slice(-1)];\n args.push(...JSON.parse(pupArgs));\n logger.debug(\"pupargs\", args);\n return args;\n }\n\n logger.debug(\"procargv\", process.argv);\n return process.argv;\n}\n\nexport interface ProcessHandle {\n process: ChildProcess;\n wait: Promise<void>;\n}\n\nexport function exec(cmd: string, options?: SpawnOptions): ProcessHandle {\n const parts = cmd.split(\" \").filter((s) => s.length);\n const [command, ...args] = parts;\n if (!command) throw new Error(\"empty command\");\n const proc = spawn(command, args, {\n stdio: \"inherit\",\n ...options,\n });\n return { process: proc, wait: logger.attach(proc, command) };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport { ChildProcess, type Serializable } from \"child_process\";\nimport { pupLogLevel } from \"./constants\";\n\nexport interface LoggerLike {\n debug?(this: void, ...messages: unknown[]): void;\n\n info?(this: void, ...messages: unknown[]): void;\n\n warn?(this: void, ...messages: unknown[]): void;\n\n error?(this: void, ...messages: unknown[]): void;\n}\n\nconst DEBUG = \"<pup@debug>\";\nconst INFO = \"<pup@info>\";\nconst WARN = \"<pup@warn>\";\nconst ERROR = \"<pup@error>\";\nconst FATAL = \"<pup@fatal>\";\n\nclass Logger implements LoggerLike {\n private _impl?: LoggerLike;\n\n get impl(): LoggerLike | undefined {\n return this._impl;\n }\n\n set impl(value: LoggerLike) {\n const debug = value.debug ?? console.debug;\n const info = value.info ?? console.info;\n const warn = value.warn ?? console.warn;\n const error = value.error ?? console.error;\n this._impl = {\n debug: pupLogLevel >= 3 ? debug : undefined,\n info: pupLogLevel >= 2 ? info : undefined,\n warn: pupLogLevel >= 1 ? warn : undefined,\n error: pupLogLevel >= 0 ? error : undefined,\n };\n }\n\n constructor() {\n this.impl = console;\n }\n\n debug(...messages: unknown[]): void {\n this.impl?.debug?.(DEBUG, ...messages);\n }\n\n info(...messages: unknown[]): void {\n this.impl?.info?.(INFO, ...messages);\n }\n\n warn(...messages: unknown[]): void {\n this.impl?.warn?.(WARN, ...messages);\n }\n\n error(...messages: unknown[]): void {\n this.impl?.error?.(ERROR, ...messages);\n }\n\n fatal(...messages: unknown[]): never {\n this.impl?.error?.(FATAL, ...messages);\n process.exit(1);\n }\n\n private dispatch(message: string) {\n if (message.startsWith(DEBUG)) {\n this.debug(message.slice(DEBUG.length + 1));\n } else if (message.startsWith(INFO)) {\n this.info(message.slice(INFO.length + 1));\n } else if (message.startsWith(WARN)) {\n this.warn(message.slice(WARN.length + 1));\n } else if (message.startsWith(ERROR)) {\n this.error(message.slice(ERROR.length + 1));\n } else {\n this.info(message);\n }\n }\n\n attach(proc: ChildProcess, name: string) {\n return new Promise<void>((resolve, reject) => {\n this.debug(`${name}.attach`);\n let fatal: string = \"\";\n const dispatch = (data: Buffer | Serializable) => {\n const message = data.toString();\n if (message.startsWith(FATAL)) {\n fatal += message.slice(FATAL.length + 1);\n } else {\n this.dispatch(message);\n }\n };\n proc.stderr?.on(\"data\", dispatch);\n proc.stdout?.on(\"data\", dispatch);\n proc\n .on(\"message\", dispatch)\n .on(\"error\", (err) => {\n fatal += err.message;\n proc.kill();\n })\n .once(\"close\", (code, signal) => {\n if (code || signal || fatal) {\n fatal ||= `command failed: ${proc.spawnargs.join(\" \")}`;\n this.error(`${name}.close`, { code, signal, fatal });\n reject(new Error(fatal));\n } else {\n this.debug(`${name}.close`);\n resolve();\n }\n })\n .on(\"unhandledRejection\", (reason) => {\n this.error(`${name}.unhandled`, reason);\n })\n .on(\"uncaughtExceptionMonitor\", (err) => {\n this.error(`${name}.unhandled`, err);\n });\n });\n }\n}\n\nconst logger = new Logger();\n\nexport { logger };\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { arch, platform } from \"process\";\nimport { basedir } from \"./basedir\";\nimport { pupFFmpegPath } from \"./constants\";\nimport type { VideoFiles, VideoSpec } from \"./schema\";\n\ninterface Command {\n command: string;\n args: string[];\n}\n\nconst quiet = [\"-hide_banner\", \"-loglevel\", \"error\", \"-nostats\"];\n\nfunction resolveX265() {\n const path = `x265/${platform}-${arch}`;\n const dirs = [\n join(basedir, `../../${path}`), // process from src\n join(basedir, `../${path}`), // process from dist\n ];\n const found = dirs.find(existsSync);\n if (!found) {\n throw new Error(\"x265 not found\");\n }\n return found;\n}\n\nexport function createBgraFileCommand(\n bgraPath: string,\n spec: VideoSpec,\n files: VideoFiles,\n): Command {\n const { fps, frames } = spec;\n const args = [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${spec.size.width}x${spec.size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-frames:v\",\n `${Math.floor(frames)}`,\n ];\n if (files.mp4) {\n args.push(\n \"-colorspace\",\n \"bt709\",\n \"-color_primaries\",\n \"bt709\",\n \"-color_trc\",\n \"bt709\",\n \"-c:v\",\n \"libx264\",\n \"-preset\",\n \"fast\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuv420p\",\n \"-movflags\",\n \"+faststart\",\n files.mp4,\n );\n }\n if (files.webm) {\n args.push(\n \"-c:v\",\n \"libvpx-vp9\",\n \"-row-mt\",\n \"1\",\n \"-cpu-used\",\n \"1\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuva420p\",\n \"-auto-alt-ref\",\n \"0\",\n files.webm,\n );\n }\n return { command: pupFFmpegPath, args };\n}\n\ninterface X265Pipeline {\n raw: Command;\n x265: Command;\n mux: Command;\n}\n\nexport function createBgraToMovPipeline(\n bgraPath: string,\n spec: VideoSpec,\n mov: string,\n): X265Pipeline {\n const { fps, size } = spec;\n return {\n raw: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${size.width}x${size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"yuva420p10le\",\n \"pipe:1\",\n ],\n },\n x265: {\n command: resolveX265(),\n args: [\n \"--no-progress\",\n \"--log-level\",\n \"error\",\n \"--input\",\n \"-\",\n \"--input-res\",\n `${size.width}x${size.height}`,\n \"--input-csp\",\n \"i420\",\n \"--input-depth\",\n \"10\",\n \"--output-depth\",\n \"10\",\n \"--fps\",\n `${fps}`,\n \"--alpha\",\n \"--bframes\",\n \"0\",\n \"--colorprim\",\n \"bt709\",\n \"--transfer\",\n \"bt709\",\n \"--colormatrix\",\n \"bt709\",\n \"--crf\",\n \"18\",\n \"--output\",\n \"-\",\n ],\n },\n mux: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"hevc\",\n \"-r\",\n `${fps}`,\n \"-i\",\n \"pipe:0\",\n \"-c:v\",\n \"copy\",\n \"-tag:v\",\n \"hvc1\",\n \"-movflags\",\n \"+faststart\",\n mov,\n ],\n },\n };\n}\n\nexport function createCoverCommand(src: string, dst: string): Command {\n return {\n command: pupFFmpegPath,\n args: [\"-y\", ...quiet, \"-i\", src, \"-frames:v\", \"1\", \"-q:v\", \"2\", dst],\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { createBgraFileCommand, createBgraToMovPipeline } from \"./ffmpeg\";\nimport { exec, type ProcessHandle } from \"./process\";\nimport type { VideoSpec } from \"./schema\";\n\nexport function encodeBgraFile(\n bgraPath: string,\n outputPath: string,\n spec: VideoSpec,\n format: \"mp4\" | \"webm\",\n): ProcessHandle {\n const files = format === \"mp4\" ? { mp4: outputPath } : { webm: outputPath };\n const cmd = createBgraFileCommand(bgraPath, spec, files);\n return exec(`${cmd.command} ${cmd.args.join(\" \")}`, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n });\n}\n\nexport function encodeBgraToMov(\n bgraPath: string,\n movPath: string,\n spec: VideoSpec,\n): ProcessHandle {\n const x265 = createBgraToMovPipeline(bgraPath, spec, movPath);\n const shellCmd = [\n `${x265.raw.command} ${x265.raw.args.join(\" \")}`,\n `${x265.x265.command} ${x265.x265.args.join(\" \")}`,\n `${x265.mux.command} ${x265.mux.args.join(\" \")}`,\n ].join(\" | \");\n return exec(shellCmd, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n shell: true,\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport class ConcurrencyLimiter {\n private _active = 0;\n private _queue: VoidFunction[] = [];\n private _pending = 0;\n private _ended = false;\n\n constructor(readonly maxConcurrency: number) {}\n\n get active(): number {\n return this._active;\n }\n\n get pending(): number {\n return this._pending;\n }\n\n async schedule<T>(fn: () => Promise<T>): Promise<T> {\n if (this._ended) {\n throw new Error(\"ended\");\n }\n return new Promise<T>((resolve, reject) => {\n const run = () => {\n this._active++;\n this._pending--;\n fn()\n .then(resolve)\n .catch(reject)\n .finally(() => {\n this._active--;\n this.next();\n });\n };\n this._pending++;\n if (this._active < this.maxConcurrency) {\n run();\n } else {\n this._queue.push(run);\n }\n });\n }\n\n async end() {\n if (!this._ended) {\n this._ended = true;\n while (this._active > 0 || this._pending > 0) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n }\n }\n\n private next() {\n if (this._active < this.maxConcurrency && this._queue.length > 0) {\n this._queue.shift()?.();\n }\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport type { ChildProcess } from \"child_process\";\n\nexport interface StreamWriter {\n write(buffer: Buffer): Promise<void>;\n end(): void;\n}\n\nexport function createWriter(stdin: NodeJS.WritableStream): StreamWriter {\n const drainPromise = new Map<NodeJS.WritableStream, Promise<void>>();\n\n const waitDrain = (stream: NodeJS.WritableStream) => {\n const existing = drainPromise.get(stream);\n if (existing) return existing;\n const promise = new Promise<void>((resolve, reject) => {\n const cleanup = (fn: () => void) => {\n stream.off(\"drain\", onDrain);\n stream.off(\"error\", onError);\n stream.off(\"close\", onClose);\n drainPromise.delete(stream);\n fn();\n };\n const onDrain = () => cleanup(resolve);\n const onError = (err: Error) => cleanup(() => reject(err));\n const onClose = () => cleanup(() => reject(new Error(\"stream closed\")));\n stream.on(\"drain\", onDrain);\n stream.on(\"error\", onError);\n stream.on(\"close\", onClose);\n });\n drainPromise.set(stream, promise);\n return promise;\n };\n\n const destroyed = () => Reflect.get(stdin, \"destroyed\");\n return {\n async write(buffer: Buffer) {\n if (destroyed()) {\n throw new Error(\"stdin destroyed\");\n }\n if (!stdin.write(buffer)) {\n await waitDrain(stdin);\n }\n },\n end: () => {\n if (!destroyed()) stdin.end();\n },\n };\n}\n\nexport function pipeline(...procs: ChildProcess[]) {\n for (let i = 0; i < procs.length - 1; i++) {\n const src = procs[i];\n const dst = procs[i + 1];\n if (!src?.stdout || !dst?.stdin) throw new Error(\"pipeline broken\");\n src.stdout.pipe(dst.stdin);\n }\n}\n\nexport function waitAll(...procs: ChildProcess[]) {\n return Promise.all(\n procs.map(\n (proc) =>\n new Promise<void>((resolve, reject) => {\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) =>\n code === 0\n ? resolve()\n : reject(new Error(`exit ${code ?? \"null\"}`)),\n );\n }),\n ),\n );\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport { startMCPServer } from \"./ai/mcp\";\n\nstartMCPServer();\n"],"mappings":"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","names":["z","spawn","join","existsSync","join","join","existsSync","join","spawn","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/ai/mcp.ts","../package.json","../src/base/schema.ts","../src/pup.ts","../src/base/abort.ts","../src/base/constants.ts","../src/base/basedir.ts","../src/base/env.ts","../src/base/parser.ts","../src/base/electron.ts","../src/base/process.ts","../src/base/logging.ts","../src/base/ffmpeg.ts","../src/base/encoder.ts","../src/base/limiter.ts","../src/base/stream.ts","../src/mcp_server.ts"],"sourcesContent":["// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport z from \"zod\";\nimport packageJSON from \"../../package.json\";\nimport { RecordSchema } from \"../base/schema\";\nimport { pup } from \"../pup\";\n\nexport const PupMCPSchema = z\n .object({ source: z.string().describe(\"file://, http(s)://, or data: URI\") })\n .extend(RecordSchema.shape);\n\nexport const MCP_TOOL_NAME = packageJSON.name;\nexport const MCP_TOOL_TITLE = \"Record Webpage\";\nexport const MCP_TOOL_DESC = \"Record a webpage to video\";\n\nexport function mcpAddPup(server: McpServer) {\n server.registerTool(\n MCP_TOOL_NAME,\n {\n title: MCP_TOOL_TITLE,\n description: MCP_TOOL_DESC,\n inputSchema: PupMCPSchema,\n },\n async (args) => {\n try {\n const result = await pup(args.source, args);\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n { type: \"text\", text: JSON.stringify({ error: String(error) }) },\n ],\n };\n }\n },\n );\n}\n\nexport async function startMCPServer() {\n const server = new McpServer(packageJSON);\n mcpAddPup(server);\n await server.connect(new StdioServerTransport());\n}\n","{\n \"name\": \"pup-recorder\",\n \"version\": \"0.0.15\",\n \"description\": \"A nice webview recording tool.\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Autokaka/pup-recorder.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"autokaka\",\n \"type\": \"module\",\n \"bin\": {\n \"pup\": \"dist/cli.js\",\n \"pup-cjs\": \"dist/cjs/cli.cjs\",\n \"pup-mcp-server\": \"dist/mcp_server.js\",\n \"pup-mcp-server-cjs\": \"dist/cjs/mcp_server.cjs\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n }\n },\n \"engines\": {\n \"bun\": \">= 1\",\n \"node\": \">= 20\"\n },\n \"engineStrict\": true,\n \"devDependencies\": {\n \"@types/bun\": \"latest\",\n \"@types/node\": \"^20.0.0\",\n \"@typescript/native-preview\": \"latest\",\n \"tsup\": \"latest\",\n \"typescript\": \"latest\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"latest\",\n \"@opencode-ai/plugin\": \"latest\",\n \"commander\": \"latest\",\n \"electron\": \"latest\",\n \"zod\": \"latest\"\n },\n \"scripts\": {\n \"build\": \"bun build.ts && bun build_rust.ts\"\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport type { Size } from \"electron\";\nimport z from \"zod\";\n\nexport interface VideoSpec {\n fps: number;\n frames: number;\n size: Size;\n}\n\nexport interface VideoFiles {\n mp4?: string;\n webm?: string;\n mov?: string;\n}\n\nexport interface VideoFilesWithCover extends VideoFiles {\n cover: string;\n}\n\nexport const DEFAULT_WIDTH = 1920;\nexport const DEFAULT_HEIGHT = 1080;\nexport const DEFAULT_FPS = 30;\nexport const DEFAULT_DURATION = 5;\nexport const DEFAULT_OUT_DIR = \"out\";\n\nexport const RecordSchema = z.object({\n duration: z\n .number()\n .optional()\n .default(DEFAULT_DURATION)\n .describe(\"Recording duration in seconds\"),\n width: z.number().optional().default(DEFAULT_WIDTH).describe(\"Video width\"),\n height: z\n .number()\n .optional()\n .default(DEFAULT_HEIGHT)\n .describe(\"Video height\"),\n fps: z.number().optional().default(DEFAULT_FPS).describe(\"Frames per second\"),\n withAlphaChannel: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Output with alpha channel\"),\n outDir: z\n .string()\n .optional()\n .default(DEFAULT_OUT_DIR)\n .describe(\"Output directory\"),\n useInnerProxy: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Use bilibili inner proxy for resource access\"),\n});\n\nexport interface RecordOptions {\n duration: number;\n width: number;\n height: number;\n fps: number;\n withAlphaChannel: boolean;\n outDir: string;\n useInnerProxy: boolean;\n}\n\nexport interface RecordResult {\n options: RecordOptions;\n written: number;\n bgraPath: string;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { spawn } from \"child_process\";\nimport type { Size } from \"electron\";\nimport { readFile, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { AbortLink, type AbortQuery } from \"./base/abort\";\nimport { pupAppPath } from \"./base/constants\";\nimport { runElectronApp } from \"./base/electron\";\nimport { encodeBgraFile, encodeBgraToMov } from \"./base/encoder\";\nimport { createCoverCommand } from \"./base/ffmpeg\";\nimport { ConcurrencyLimiter } from \"./base/limiter\";\nimport { logger } from \"./base/logging\";\nimport { parseNumber } from \"./base/parser\";\nimport { type ProcessHandle } from \"./base/process\";\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n type RecordOptions,\n type RecordResult,\n type VideoFilesWithCover,\n type VideoSpec,\n} from \"./base/schema\";\nimport { waitAll } from \"./base/stream\";\n\nconst TAG = \"[pup]\";\nconst PROGRESS_TAG = \" progress: \";\n\nexport type PupProgressCallback = (progress: number) => Promise<void> | void;\n\nexport interface PupOptions extends Partial<RecordOptions> {\n cancelQuery?: AbortQuery;\n onProgress?: PupProgressCallback;\n}\n\nfunction runPupApp(source: string, options: PupOptions) {\n logger.debug(TAG, `runPupApp`, source, options);\n\n const args: string[] = [source];\n if (options.width) args.push(\"--width\", `${options.width}`);\n if (options.height) args.push(\"--height\", `${options.height}`);\n if (options.fps) args.push(\"--fps\", `${options.fps}`);\n if (options.duration) args.push(\"--duration\", `${options.duration}`);\n if (options.outDir) args.push(\"--out-dir\", options.outDir);\n if (options.withAlphaChannel) args.push(\"--with-alpha-channel\");\n if (options.useInnerProxy) args.push(\"--use-inner-proxy\");\n\n const w = options.width ?? DEFAULT_WIDTH;\n const h = options.height ?? DEFAULT_HEIGHT;\n const handle = runElectronApp({ width: w, height: h }, pupAppPath, args);\n const counter = new ConcurrencyLimiter(1);\n handle.process.stdout?.on(\"data\", (data: Buffer) => {\n let message = data.toString().trim();\n let start = message.indexOf(PROGRESS_TAG);\n if (start < 0) {\n return;\n }\n message = message.slice(start + PROGRESS_TAG.length);\n const end = message.indexOf(\"%\");\n if (end < 0) {\n return;\n }\n const progressStr = message.slice(0, end);\n const progress = parseNumber(progressStr);\n counter.schedule(async () => {\n await options.onProgress?.(progress);\n });\n });\n return { handle, counter };\n}\n\nexport async function pup(source: string, options: PupOptions) {\n logger.debug(TAG, `pup`, source, options);\n\n const link = AbortLink.start(options.cancelQuery);\n const outDir = options.outDir ?? \"out\";\n\n const t0 = performance.now();\n const { handle, counter } = runPupApp(source, { ...options, outDir });\n\n await link.wait(handle);\n await counter.end();\n logger.info(TAG, `capture cost ${Math.round(performance.now() - t0)}ms`);\n\n const metaPath = join(outDir, \"record.json\");\n const meta = JSON.parse(await readFile(metaPath, \"utf-8\")) as RecordResult;\n\n const { bgraPath, written, options: recordOptions } = meta;\n const { fps, width, height, withAlphaChannel } = recordOptions;\n const size: Size = { width, height };\n\n const outputs: VideoFilesWithCover = {\n mp4: withAlphaChannel ? undefined : join(outDir, \"output.mp4\"),\n webm: withAlphaChannel ? join(outDir, \"output.webm\") : undefined,\n mov: withAlphaChannel ? join(outDir, \"output.mov\") : undefined,\n cover: join(outDir, \"cover.png\"),\n };\n\n try {\n const t1 = performance.now();\n\n const spec: VideoSpec = { fps, frames: written, size };\n const handles: ProcessHandle[] = [];\n if (outputs.mp4) {\n handles.push(encodeBgraFile(bgraPath, outputs.mp4, spec, \"mp4\"));\n }\n if (outputs.webm) {\n handles.push(encodeBgraFile(bgraPath, outputs.webm, spec, \"webm\"));\n }\n if (outputs.mov) {\n handles.push(encodeBgraToMov(bgraPath, outputs.mov, spec));\n }\n await link.wait(...handles);\n\n const coverSrc = outputs.mov ?? outputs.webm ?? outputs.mp4;\n if (coverSrc) {\n const coverCmd = createCoverCommand(coverSrc, outputs.cover);\n await waitAll(\n spawn(coverCmd.command, coverCmd.args, { stdio: \"inherit\" }),\n );\n }\n\n link.stop();\n logger.info(TAG, `encoding cost ${Math.round(performance.now() - t1)}ms`);\n\n await Promise.all([\n rm(bgraPath, { force: true }),\n rm(metaPath, { force: true }),\n ]);\n return {\n ...outputs,\n width,\n height,\n fps,\n duration: Math.ceil(written / fps),\n };\n } catch (error) {\n await rm(outDir, { recursive: true, force: true });\n throw error;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/11.\n\nimport type { ProcessHandle } from \"./process\";\n\nexport type AsyncTask = () => Promise<void> | void;\nexport type AbortQuery = () => Promise<boolean> | boolean;\n\nexport class AbortLink {\n private _callback?: AsyncTask;\n private _aborted?: boolean;\n private _stopped = false;\n\n private constructor(\n readonly query?: AbortQuery,\n readonly interval: number = 1000,\n ) {\n if (query) {\n this.tick();\n }\n }\n\n static start(query?: AbortQuery, interval?: number) {\n return new AbortLink(query, interval);\n }\n\n get aborted() {\n return !this._stopped && this._aborted;\n }\n\n get stopped() {\n return this._stopped;\n }\n\n async onAbort(callback: AsyncTask) {\n if (this._aborted) {\n await callback();\n } else {\n this._callback = callback;\n }\n }\n\n wait(...handles: ProcessHandle[]) {\n const abort = new Promise((_, reject) => {\n this.onAbort(async () => {\n handles.forEach((h) => h.process.kill());\n reject(new Error(\"aborted\"));\n });\n });\n return Promise.race([\n abort,\n Promise.all(handles.map((h) => h.wait)), //\n ]);\n }\n\n stop() {\n this._stopped = true;\n }\n\n private tick() {\n setTimeout(async () => {\n if (this._stopped) {\n return;\n }\n this._aborted = await this.query?.();\n if (this._stopped) {\n return;\n }\n if (this._aborted) {\n await this._callback?.();\n } else {\n this.tick();\n }\n }, this.interval);\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { basedir } from \"./basedir\";\nimport { penv } from \"./env\";\nimport { parseNumber } from \"./parser\";\n\nconst pupAppSearchPaths = [\n join(basedir, \"cjs/app.cjs\"), // process from dist\n join(basedir, \"app.cjs\"), // process from dist/cjs\n join(basedir, \"../../cjs/app.cjs\"), // process from src\n];\nexport const pupAppPath = pupAppSearchPaths.find(existsSync)!;\n\nconst env = process.env;\nexport const pupLogLevel = penv(\"PUP_LOG_LEVEL\", parseNumber, 2);\nexport const pupUseInnerProxy = env[\"PUP_USE_INNER_PROXY\"] === \"1\";\nexport const pupFFmpegPath = env[\"FFMPEG_BIN\"] ?? `ffmpeg`;\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport { dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nexport const basedir = dirname(fileURLToPath(import.meta.url));\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nexport type EnvParser<T> = (value: unknown) => T;\n\nexport function penv<T>(name: string, parser: EnvParser<T>, defaultValue: T): T;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined {\n try {\n return parser(process.env[name]);\n } catch {\n return defaultValue;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport function parseNumber(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new Error(`Value ${value} is not a valid number`);\n }\n return num;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport electron, { type Size } from \"electron\";\nimport { exec } from \"./process\";\n\nexport const ELECTRON_OPTS = [\n \"no-sandbox\",\n \"disable-setuid-sandbox\",\n \"disable-gpu\",\n \"disable-dev-shm-usage\",\n \"disable-software-rasterizer\",\n \"disable-web-security\",\n \"disable-site-isolation-trials\",\n \"disable-features=IsolateOrigins,site-per-process\",\n \"allow-insecure-localhost\",\n \"ignore-certificate-errors\",\n \"disable-blink-features=AutomationControlled\",\n \"mute-audio\",\n \"disable-extensions\",\n \"disable-background-networking\",\n \"address-family=ipv4\",\n \"disable-async-dns\",\n \"force-device-scale-factor=1\",\n \"trace-warnings\",\n \"force-color-profile=srgb\",\n \"disable-color-correct-rendering\",\n \"log-level=3\",\n];\n\nexport function runElectronApp(size: Size, app: unknown, args: unknown[]) {\n const electronArgs = ELECTRON_OPTS.map((a) => `--${a}`);\n const cmdParts = [];\n if (process.platform === \"linux\") {\n cmdParts.push(\n \"xvfb-run\",\n \"--auto-servernum\",\n `--server-args='-screen 0 ${size.width}x${size.height}x24'`,\n );\n }\n cmdParts.push(electron, ...electronArgs, app);\n return exec(cmdParts.join(\" \"), {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: true,\n env: {\n ...process.env,\n ELECTRON_DISABLE_DBUS: \"1\",\n RUST_BACKTRACE: \"full\",\n __PUP_ARGS__: JSON.stringify(args),\n },\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nimport { spawn, type ChildProcess, type SpawnOptions } from \"child_process\";\nimport { logger } from \"./logging\";\n\nexport const PUP_ARGS_ENV_KEY = \"__PUP_ARGS__\";\n\nexport function pargs() {\n const pupArgs = process.env[PUP_ARGS_ENV_KEY];\n if (pupArgs) {\n const args = [\"exec\", ...process.argv.slice(-1)];\n args.push(...JSON.parse(pupArgs));\n logger.debug(\"pupargs\", args);\n return args;\n }\n\n logger.debug(\"procargv\", process.argv);\n return process.argv;\n}\n\nexport interface ProcessHandle {\n process: ChildProcess;\n wait: Promise<void>;\n}\n\nexport function exec(cmd: string, options?: SpawnOptions): ProcessHandle {\n const parts = cmd.split(\" \").filter((s) => s.length);\n const [command, ...args] = parts;\n if (!command) throw new Error(\"empty command\");\n const proc = spawn(command, args, {\n stdio: \"inherit\",\n ...options,\n });\n return { process: proc, wait: logger.attach(proc, command) };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport { ChildProcess, type Serializable } from \"child_process\";\nimport { pupLogLevel } from \"./constants\";\n\nexport interface LoggerLike {\n debug?(this: void, ...messages: unknown[]): void;\n\n info?(this: void, ...messages: unknown[]): void;\n\n warn?(this: void, ...messages: unknown[]): void;\n\n error?(this: void, ...messages: unknown[]): void;\n}\n\nconst DEBUG = \"<pup@debug>\";\nconst INFO = \"<pup@info>\";\nconst WARN = \"<pup@warn>\";\nconst ERROR = \"<pup@error>\";\nconst FATAL = \"<pup@fatal>\";\n\nclass Logger implements LoggerLike {\n private _impl?: LoggerLike;\n\n get impl(): LoggerLike | undefined {\n return this._impl;\n }\n\n set impl(value: LoggerLike) {\n const debug = value.debug ?? console.debug;\n const info = value.info ?? console.info;\n const warn = value.warn ?? console.warn;\n const error = value.error ?? console.error;\n this._impl = {\n debug: pupLogLevel >= 3 ? debug : undefined,\n info: pupLogLevel >= 2 ? info : undefined,\n warn: pupLogLevel >= 1 ? warn : undefined,\n error: pupLogLevel >= 0 ? error : undefined,\n };\n }\n\n constructor() {\n this.impl = console;\n }\n\n debug(...messages: unknown[]): void {\n this.impl?.debug?.(DEBUG, ...messages);\n }\n\n info(...messages: unknown[]): void {\n this.impl?.info?.(INFO, ...messages);\n }\n\n warn(...messages: unknown[]): void {\n this.impl?.warn?.(WARN, ...messages);\n }\n\n error(...messages: unknown[]): void {\n this.impl?.error?.(ERROR, ...messages);\n }\n\n fatal(...messages: unknown[]): never {\n this.impl?.error?.(FATAL, ...messages);\n process.exit(1);\n }\n\n private dispatch(message: string) {\n if (message.startsWith(DEBUG)) {\n this.debug(message.slice(DEBUG.length + 1));\n } else if (message.startsWith(INFO)) {\n this.info(message.slice(INFO.length + 1));\n } else if (message.startsWith(WARN)) {\n this.warn(message.slice(WARN.length + 1));\n } else if (message.startsWith(ERROR)) {\n this.error(message.slice(ERROR.length + 1));\n } else {\n this.info(message);\n }\n }\n\n attach(proc: ChildProcess, name: string) {\n return new Promise<void>((resolve, reject) => {\n this.debug(`${name}.attach`);\n let fatal: string = \"\";\n const dispatch = (data: Buffer | Serializable) => {\n const message = data.toString();\n if (message.startsWith(FATAL)) {\n fatal += message.slice(FATAL.length + 1);\n } else {\n this.dispatch(message);\n }\n };\n proc.stderr?.on(\"data\", dispatch);\n proc.stdout?.on(\"data\", dispatch);\n proc\n .on(\"message\", dispatch)\n .on(\"error\", (err) => {\n fatal += err.message;\n proc.kill();\n })\n .once(\"close\", (code, signal) => {\n if (code || signal || fatal) {\n fatal ||= `command failed: ${proc.spawnargs.join(\" \")}`;\n this.error(`${name}.close`, { code, signal, fatal });\n reject(new Error(fatal));\n } else {\n this.debug(`${name}.close`);\n resolve();\n }\n })\n .on(\"unhandledRejection\", (reason) => {\n this.error(`${name}.unhandled`, reason);\n })\n .on(\"uncaughtExceptionMonitor\", (err) => {\n this.error(`${name}.unhandled`, err);\n });\n });\n }\n}\n\nconst logger = new Logger();\n\nexport { logger };\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { arch, platform } from \"process\";\nimport { basedir } from \"./basedir\";\nimport { pupFFmpegPath } from \"./constants\";\nimport type { VideoFiles, VideoSpec } from \"./schema\";\n\ninterface Command {\n command: string;\n args: string[];\n}\n\nconst quiet = [\"-hide_banner\", \"-loglevel\", \"error\", \"-nostats\"];\n\nfunction resolveX265() {\n const path = `x265/${platform}-${arch}`;\n const dirs = [\n join(basedir, `../../${path}`), // process from src\n join(basedir, `../${path}`), // process from dist\n ];\n const found = dirs.find(existsSync);\n if (!found) {\n throw new Error(\"x265 not found\");\n }\n return found;\n}\n\nexport function createBgraFileCommand(\n bgraPath: string,\n spec: VideoSpec,\n files: VideoFiles,\n): Command {\n const { fps, frames } = spec;\n const args = [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${spec.size.width}x${spec.size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-frames:v\",\n `${Math.floor(frames)}`,\n ];\n if (files.mp4) {\n args.push(\n \"-colorspace\",\n \"bt709\",\n \"-color_primaries\",\n \"bt709\",\n \"-color_trc\",\n \"bt709\",\n \"-c:v\",\n \"libx264\",\n \"-preset\",\n \"fast\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuv420p\",\n \"-movflags\",\n \"+faststart\",\n files.mp4,\n );\n }\n if (files.webm) {\n args.push(\n \"-c:v\",\n \"libvpx-vp9\",\n \"-row-mt\",\n \"1\",\n \"-cpu-used\",\n \"1\",\n \"-threads\",\n \"0\",\n \"-pix_fmt\",\n \"yuva420p\",\n \"-auto-alt-ref\",\n \"0\",\n files.webm,\n );\n }\n return { command: pupFFmpegPath, args };\n}\n\ninterface X265Pipeline {\n raw: Command;\n x265: Command;\n mux: Command;\n}\n\nexport function createBgraToMovPipeline(\n bgraPath: string,\n spec: VideoSpec,\n mov: string,\n): X265Pipeline {\n const { fps, size } = spec;\n return {\n raw: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"bgra\",\n \"-s\",\n `${size.width}x${size.height}`,\n \"-r\",\n `${fps}`,\n \"-i\",\n bgraPath,\n \"-f\",\n \"rawvideo\",\n \"-pix_fmt\",\n \"yuva420p10le\",\n \"pipe:1\",\n ],\n },\n x265: {\n command: resolveX265(),\n args: [\n \"--no-progress\",\n \"--log-level\",\n \"error\",\n \"--input\",\n \"-\",\n \"--input-res\",\n `${size.width}x${size.height}`,\n \"--input-csp\",\n \"i420\",\n \"--input-depth\",\n \"10\",\n \"--output-depth\",\n \"10\",\n \"--fps\",\n `${fps}`,\n \"--alpha\",\n \"--bframes\",\n \"0\",\n \"--colorprim\",\n \"bt709\",\n \"--transfer\",\n \"bt709\",\n \"--colormatrix\",\n \"bt709\",\n \"--crf\",\n \"18\",\n \"--output\",\n \"-\",\n ],\n },\n mux: {\n command: pupFFmpegPath,\n args: [\n \"-y\",\n ...quiet,\n \"-f\",\n \"hevc\",\n \"-r\",\n `${fps}`,\n \"-i\",\n \"pipe:0\",\n \"-c:v\",\n \"copy\",\n \"-tag:v\",\n \"hvc1\",\n \"-movflags\",\n \"+faststart\",\n mov,\n ],\n },\n };\n}\n\nexport function createCoverCommand(src: string, dst: string): Command {\n return {\n command: pupFFmpegPath,\n args: [\"-y\", ...quiet, \"-i\", src, \"-frames:v\", \"1\", \"-q:v\", \"2\", dst],\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { createBgraFileCommand, createBgraToMovPipeline } from \"./ffmpeg\";\nimport { exec, type ProcessHandle } from \"./process\";\nimport type { VideoSpec } from \"./schema\";\n\nexport function encodeBgraFile(\n bgraPath: string,\n outputPath: string,\n spec: VideoSpec,\n format: \"mp4\" | \"webm\",\n): ProcessHandle {\n const files = format === \"mp4\" ? { mp4: outputPath } : { webm: outputPath };\n const cmd = createBgraFileCommand(bgraPath, spec, files);\n return exec(`${cmd.command} ${cmd.args.join(\" \")}`, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n });\n}\n\nexport function encodeBgraToMov(\n bgraPath: string,\n movPath: string,\n spec: VideoSpec,\n): ProcessHandle {\n const x265 = createBgraToMovPipeline(bgraPath, spec, movPath);\n const shellCmd = [\n `${x265.raw.command} ${x265.raw.args.join(\" \")}`,\n `${x265.x265.command} ${x265.x265.args.join(\" \")}`,\n `${x265.mux.command} ${x265.mux.args.join(\" \")}`,\n ].join(\" | \");\n return exec(shellCmd, {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n shell: true,\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport class ConcurrencyLimiter {\n private _active = 0;\n private _queue: VoidFunction[] = [];\n private _pending = 0;\n private _ended = false;\n\n constructor(readonly maxConcurrency: number) {}\n\n get active(): number {\n return this._active;\n }\n\n get pending(): number {\n return this._pending;\n }\n\n async schedule<T>(fn: () => Promise<T>): Promise<T> {\n if (this._ended) {\n throw new Error(\"ended\");\n }\n return new Promise<T>((resolve, reject) => {\n const run = () => {\n this._active++;\n this._pending--;\n fn()\n .then(resolve)\n .catch(reject)\n .finally(() => {\n this._active--;\n this.next();\n });\n };\n this._pending++;\n if (this._active < this.maxConcurrency) {\n run();\n } else {\n this._queue.push(run);\n }\n });\n }\n\n async end() {\n if (!this._ended) {\n this._ended = true;\n while (this._active > 0 || this._pending > 0) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n }\n }\n\n private next() {\n if (this._active < this.maxConcurrency && this._queue.length > 0) {\n this._queue.shift()?.();\n }\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport type { ChildProcess } from \"child_process\";\n\nexport interface StreamWriter {\n write(buffer: Buffer): Promise<void>;\n end(): void;\n}\n\nexport function createWriter(stdin: NodeJS.WritableStream): StreamWriter {\n const drainPromise = new Map<NodeJS.WritableStream, Promise<void>>();\n\n const waitDrain = (stream: NodeJS.WritableStream) => {\n const existing = drainPromise.get(stream);\n if (existing) return existing;\n const promise = new Promise<void>((resolve, reject) => {\n const cleanup = (fn: () => void) => {\n stream.off(\"drain\", onDrain);\n stream.off(\"error\", onError);\n stream.off(\"close\", onClose);\n drainPromise.delete(stream);\n fn();\n };\n const onDrain = () => cleanup(resolve);\n const onError = (err: Error) => cleanup(() => reject(err));\n const onClose = () => cleanup(() => reject(new Error(\"stream closed\")));\n stream.on(\"drain\", onDrain);\n stream.on(\"error\", onError);\n stream.on(\"close\", onClose);\n });\n drainPromise.set(stream, promise);\n return promise;\n };\n\n const destroyed = () => Reflect.get(stdin, \"destroyed\");\n return {\n async write(buffer: Buffer) {\n if (destroyed()) {\n throw new Error(\"stdin destroyed\");\n }\n if (!stdin.write(buffer)) {\n await waitDrain(stdin);\n }\n },\n end: () => {\n if (!destroyed()) stdin.end();\n },\n };\n}\n\nexport function pipeline(...procs: ChildProcess[]) {\n for (let i = 0; i < procs.length - 1; i++) {\n const src = procs[i];\n const dst = procs[i + 1];\n if (!src?.stdout || !dst?.stdin) throw new Error(\"pipeline broken\");\n src.stdout.pipe(dst.stdin);\n }\n}\n\nexport function waitAll(...procs: ChildProcess[]) {\n return Promise.all(\n procs.map(\n (proc) =>\n new Promise<void>((resolve, reject) => {\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) =>\n code === 0\n ? resolve()\n : reject(new Error(`exit ${code ?? \"null\"}`)),\n );\n }),\n ),\n );\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/26.\n\nimport { startMCPServer } from \"./ai/mcp\";\n\nstartMCPServer();\n"],"mappings":"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","names":["z","spawn","join","existsSync","join","join","existsSync","join","spawn","z"]}
|
package/package.json
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pup-recorder",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.15",
|
|
4
4
|
"description": "A nice webview recording tool.",
|
|
5
|
-
"
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/Autokaka/pup-recorder.git"
|
|
8
|
+
},
|
|
6
9
|
"license": "MIT",
|
|
7
10
|
"author": "autokaka",
|
|
8
11
|
"type": "module",
|