@pixeldojo/mcp 0.21.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/cli.cjs +198 -91
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +198 -91
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +197 -91
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +197 -91
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1309,6 +1309,108 @@ var init_caption = __esm({
|
|
|
1309
1309
|
}
|
|
1310
1310
|
});
|
|
1311
1311
|
async function run7(input, ctx) {
|
|
1312
|
+
if (!input.offer && !input.end_card) {
|
|
1313
|
+
return { kind: "text", text: "pixeldojo_overlay needs an offer, an end_card, or both." };
|
|
1314
|
+
}
|
|
1315
|
+
const { offer, end_card: card } = input;
|
|
1316
|
+
const submitted = await ctx.client.run(MODEL2, {
|
|
1317
|
+
prompt: "",
|
|
1318
|
+
video: input.video_url,
|
|
1319
|
+
...input.color ? { color: input.color } : {},
|
|
1320
|
+
...offer ? {
|
|
1321
|
+
offer_text: offer.text,
|
|
1322
|
+
offer_subtext: offer.subtext,
|
|
1323
|
+
offer_start: offer.start_sec,
|
|
1324
|
+
offer_duration: offer.duration_sec,
|
|
1325
|
+
offer_position: offer.position
|
|
1326
|
+
} : {},
|
|
1327
|
+
...card ? {
|
|
1328
|
+
end_headline: card.headline,
|
|
1329
|
+
end_cta: card.cta,
|
|
1330
|
+
end_url: card.url,
|
|
1331
|
+
logo_url: card.logo_url,
|
|
1332
|
+
end_duration: card.duration_sec
|
|
1333
|
+
} : {}
|
|
1334
|
+
});
|
|
1335
|
+
const result = await pollJobUntilDoneOrHandoff(
|
|
1336
|
+
submitted.jobId,
|
|
1337
|
+
(id) => ctx.client.getJob(id),
|
|
1338
|
+
ctx.buildStatusUrl,
|
|
1339
|
+
{ now: ctx.pollOverrides?.now, sleep: ctx.pollOverrides?.sleep }
|
|
1340
|
+
);
|
|
1341
|
+
return pollResultToSkillResult(
|
|
1342
|
+
result,
|
|
1343
|
+
(urls) => urls.length === 0 ? `Job ${submitted.jobId} completed but returned no assets.` : `Branded. Asset: ${urls[0]}`
|
|
1344
|
+
);
|
|
1345
|
+
}
|
|
1346
|
+
var MODEL2, InputSchema7, InputJsonSchema7, overlaySkill;
|
|
1347
|
+
var init_overlay = __esm({
|
|
1348
|
+
"src/skills/overlay.ts"() {
|
|
1349
|
+
init_poll();
|
|
1350
|
+
init_types();
|
|
1351
|
+
MODEL2 = "brand-overlay";
|
|
1352
|
+
InputSchema7 = z.object({
|
|
1353
|
+
video_url: z.string().url(),
|
|
1354
|
+
color: z.string().optional(),
|
|
1355
|
+
offer: z.object({
|
|
1356
|
+
text: z.string().max(24),
|
|
1357
|
+
subtext: z.string().max(40).optional(),
|
|
1358
|
+
start_sec: z.number().min(0).optional(),
|
|
1359
|
+
duration_sec: z.number().min(1).max(10).optional(),
|
|
1360
|
+
position: z.enum(["top", "bottom"]).optional()
|
|
1361
|
+
}).optional(),
|
|
1362
|
+
end_card: z.object({
|
|
1363
|
+
headline: z.string().max(40),
|
|
1364
|
+
cta: z.string().max(24).optional(),
|
|
1365
|
+
url: z.string().max(40).optional(),
|
|
1366
|
+
logo_url: z.string().url().optional(),
|
|
1367
|
+
duration_sec: z.number().min(2).max(5).optional()
|
|
1368
|
+
}).optional()
|
|
1369
|
+
});
|
|
1370
|
+
InputJsonSchema7 = {
|
|
1371
|
+
type: "object",
|
|
1372
|
+
required: ["video_url"],
|
|
1373
|
+
properties: {
|
|
1374
|
+
video_url: { type: "string", format: "uri", description: "The video to brand (MP4 or MOV)." },
|
|
1375
|
+
color: { type: "string", description: "Brand color as #RRGGBB: the badge and the button. Defaults to #FFE500." },
|
|
1376
|
+
offer: {
|
|
1377
|
+
type: "object",
|
|
1378
|
+
description: "Offer callout: a badge that pops in on cue.",
|
|
1379
|
+
required: ["text"],
|
|
1380
|
+
properties: {
|
|
1381
|
+
text: { type: "string", maxLength: 24, description: 'e.g. "50% OFF".' },
|
|
1382
|
+
subtext: { type: "string", maxLength: 40, description: 'Small line under it, e.g. "This week only".' },
|
|
1383
|
+
start_sec: { type: "number", description: "Second it appears. Default 0.5." },
|
|
1384
|
+
duration_sec: { type: "number", minimum: 1, maximum: 10, description: "Seconds it stays. Default 3." },
|
|
1385
|
+
position: { type: "string", enum: ["top", "bottom"], description: "Default top." }
|
|
1386
|
+
}
|
|
1387
|
+
},
|
|
1388
|
+
end_card: {
|
|
1389
|
+
type: "object",
|
|
1390
|
+
description: "End card held after the last frame.",
|
|
1391
|
+
required: ["headline"],
|
|
1392
|
+
properties: {
|
|
1393
|
+
headline: { type: "string", maxLength: 40, description: 'e.g. "Your new favorite mug".' },
|
|
1394
|
+
cta: { type: "string", maxLength: 24, description: 'Button text, e.g. "Shop now".' },
|
|
1395
|
+
url: { type: "string", maxLength: 40, description: "Web address shown under the button." },
|
|
1396
|
+
logo_url: { type: "string", format: "uri", description: "PNG (transparent works best) or JPG." },
|
|
1397
|
+
duration_sec: { type: "number", minimum: 2, maximum: 5, description: "Default 3." }
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
};
|
|
1402
|
+
overlaySkill = {
|
|
1403
|
+
name: "pixeldojo_overlay",
|
|
1404
|
+
description: 'Add an offer callout (a badge like "50% OFF" that pops in on cue) and/or a branded end card (the last frame held under a logo, headline, button and web address) to a video. The text renders exactly as written, in the brand color. Pass video_url plus offer and/or end_card. 2 credits.',
|
|
1405
|
+
inputZod: InputSchema7,
|
|
1406
|
+
inputJsonSchema: InputJsonSchema7,
|
|
1407
|
+
allowedModels: [MODEL2],
|
|
1408
|
+
defaultModel: MODEL2,
|
|
1409
|
+
run: run7
|
|
1410
|
+
};
|
|
1411
|
+
}
|
|
1412
|
+
});
|
|
1413
|
+
async function run8(input, ctx) {
|
|
1312
1414
|
const job = await ctx.client.getJob(input.jobId);
|
|
1313
1415
|
if (job.status === "completed") {
|
|
1314
1416
|
const urls = extractAssetUrls2(job);
|
|
@@ -1372,13 +1474,13 @@ function extractAssetUrls2(job) {
|
|
|
1372
1474
|
if (output?.video) return [output.video];
|
|
1373
1475
|
return [];
|
|
1374
1476
|
}
|
|
1375
|
-
var
|
|
1477
|
+
var InputSchema8, InputJsonSchema8, STUCK_HINT_MS, ABANDON_HINT_MS, statusSkill;
|
|
1376
1478
|
var init_status = __esm({
|
|
1377
1479
|
"src/skills/status.ts"() {
|
|
1378
|
-
|
|
1480
|
+
InputSchema8 = z.object({
|
|
1379
1481
|
jobId: z.string().min(1).max(200).describe("Job id returned from a prior pixeldojo_* skill handoff.")
|
|
1380
1482
|
});
|
|
1381
|
-
|
|
1483
|
+
InputJsonSchema8 = {
|
|
1382
1484
|
type: "object",
|
|
1383
1485
|
properties: {
|
|
1384
1486
|
jobId: {
|
|
@@ -1393,16 +1495,16 @@ var init_status = __esm({
|
|
|
1393
1495
|
statusSkill = {
|
|
1394
1496
|
name: "pixeldojo_status",
|
|
1395
1497
|
description: 'Check once, without waiting, on a jobId that a generation tool returned instead of an asset after its 30s wait. Free. Returns asset URLs when complete, the failure reason if it failed, or the current state and job age if still running. Campaign ids go to pixeldojo_campaign_status; films report progress through pixeldojo_film with action "status".',
|
|
1396
|
-
inputZod:
|
|
1397
|
-
inputJsonSchema:
|
|
1498
|
+
inputZod: InputSchema8,
|
|
1499
|
+
inputJsonSchema: InputJsonSchema8,
|
|
1398
1500
|
// status is special — it doesn't dispatch to a model
|
|
1399
1501
|
allowedModels: [],
|
|
1400
1502
|
defaultModel: "",
|
|
1401
|
-
run:
|
|
1503
|
+
run: run8
|
|
1402
1504
|
};
|
|
1403
1505
|
}
|
|
1404
1506
|
});
|
|
1405
|
-
async function
|
|
1507
|
+
async function run9(input, ctx) {
|
|
1406
1508
|
const product = await ctx.client.extractProduct(input.url);
|
|
1407
1509
|
const summary = [
|
|
1408
1510
|
`Product: ${product.name}`,
|
|
@@ -1419,13 +1521,13 @@ function truncate(input, max) {
|
|
|
1419
1521
|
if (input.length <= max) return input;
|
|
1420
1522
|
return input.slice(0, max - 3) + "...";
|
|
1421
1523
|
}
|
|
1422
|
-
var
|
|
1524
|
+
var InputSchema9, InputJsonSchema9, fromUrlSkill;
|
|
1423
1525
|
var init_from_url = __esm({
|
|
1424
1526
|
"src/skills/from-url.ts"() {
|
|
1425
|
-
|
|
1527
|
+
InputSchema9 = z.object({
|
|
1426
1528
|
url: z.string().min(1).max(2048).describe("Product page URL. Shopify, BigCommerce, WooCommerce, or any page with JSON-LD / OpenGraph product metadata.")
|
|
1427
1529
|
});
|
|
1428
|
-
|
|
1530
|
+
InputJsonSchema9 = {
|
|
1429
1531
|
type: "object",
|
|
1430
1532
|
properties: {
|
|
1431
1533
|
url: {
|
|
@@ -1438,12 +1540,12 @@ var init_from_url = __esm({
|
|
|
1438
1540
|
fromUrlSkill = {
|
|
1439
1541
|
name: "pixeldojo_from_url",
|
|
1440
1542
|
description: "Extract a product profile from a product page URL: name, description, image URLs (the first three are listed), and the extraction method used. Works on Shopify, BigCommerce, WooCommerce, or any page with JSON-LD / OpenGraph product metadata. Free. pixeldojo_campaign and pixeldojo_ad accept a product URL and run this extraction themselves; call this directly to check the product data first, or to reuse its images in other tools.",
|
|
1441
|
-
inputZod:
|
|
1442
|
-
inputJsonSchema:
|
|
1543
|
+
inputZod: InputSchema9,
|
|
1544
|
+
inputJsonSchema: InputJsonSchema9,
|
|
1443
1545
|
// No model dispatch — this skill calls a server-side scrape, not a generation.
|
|
1444
1546
|
allowedModels: [],
|
|
1445
1547
|
defaultModel: "",
|
|
1446
|
-
run:
|
|
1548
|
+
run: run9
|
|
1447
1549
|
};
|
|
1448
1550
|
}
|
|
1449
1551
|
});
|
|
@@ -2006,7 +2108,7 @@ async function redoShots(input, ctx) {
|
|
|
2006
2108
|
followUp: keepGoing(filmId, 30, { soundtrack: input.soundtrack })
|
|
2007
2109
|
};
|
|
2008
2110
|
}
|
|
2009
|
-
async function
|
|
2111
|
+
async function run10(input, ctx) {
|
|
2010
2112
|
const action = input.action === "plan" && input.film_id ? input.cast?.length ? "cast" : "status" : input.action;
|
|
2011
2113
|
if (action === "plan") return plan(input, ctx);
|
|
2012
2114
|
if (!input.film_id) return { kind: "text", text: "produce/status/cast/redo need the film_id returned by the plan step." };
|
|
@@ -2026,7 +2128,7 @@ async function run9(input, ctx) {
|
|
|
2026
2128
|
if (action === "redo") return redoShots(input, ctx);
|
|
2027
2129
|
return advance(input.film_id, input.soundtrack, input.music_job_id, ctx);
|
|
2028
2130
|
}
|
|
2029
|
-
var STORY_LOOKS, MUSIC_VIDEO_LOOKS, LOOKS, MUSIC_CLIP_ENGINE_ID,
|
|
2131
|
+
var STORY_LOOKS, MUSIC_VIDEO_LOOKS, LOOKS, MUSIC_CLIP_ENGINE_ID, InputSchema10, InputJsonSchema10, shots, benignDispatchRefusal, count, frameDone, RETRY_CLEARS, REFUSED, isRefused, PLANNER_POLL_MS, PLANNER_MAX_POLLS, isMusicVideo, needsSlice, stillPlanningText, LOOK_MUSIC, ARC, filmSkill;
|
|
2030
2132
|
var init_film = __esm({
|
|
2031
2133
|
"src/skills/film.ts"() {
|
|
2032
2134
|
init_upload_helpers();
|
|
@@ -2034,7 +2136,7 @@ var init_film = __esm({
|
|
|
2034
2136
|
MUSIC_VIDEO_LOOKS = ["rap-video", "neon-club", "stage-performance", "retro-camcorder", "y2k-pop", "moody-rnb", "rock-grit", "dream-pop", "k-pop"];
|
|
2035
2137
|
LOOKS = [...STORY_LOOKS, ...MUSIC_VIDEO_LOOKS];
|
|
2036
2138
|
MUSIC_CLIP_ENGINE_ID = "minimax-h3-reference";
|
|
2037
|
-
|
|
2139
|
+
InputSchema10 = z.object({
|
|
2038
2140
|
idea: z.string().max(2e3).optional().describe("One-to-three sentence film idea. The studio writes the screenplay (free). Provide idea OR script for planning."),
|
|
2039
2141
|
script: z.string().max(2e4).optional().describe("A full screenplay to plan instead of an idea (sluglines, action lines, dialogue)."),
|
|
2040
2142
|
look: z.enum(LOOKS).optional().describe("Visual style carried through frames, clips, and soundtrack. Default live-action, or rap-video for a music video."),
|
|
@@ -2062,7 +2164,7 @@ var init_film = __esm({
|
|
|
2062
2164
|
soundtrack: z.enum(["scene-synced", "flat", "none"]).default("scene-synced").describe("scene-synced composes one musical section per scene, pinned to the scene lengths (default). flat is a single cohesive bed. none skips music."),
|
|
2063
2165
|
music_job_id: z.string().max(80).optional().describe("The music_job_id from the previous status reply while the score is composing, so that score is attached. A status call without it, once all clips are ready and no score is attached, starts and charges for a new score.")
|
|
2064
2166
|
});
|
|
2065
|
-
|
|
2167
|
+
InputJsonSchema10 = {
|
|
2066
2168
|
type: "object",
|
|
2067
2169
|
properties: {
|
|
2068
2170
|
idea: { type: "string", description: `Plan step: one-to-three sentence film idea. The studio writes the screenplay (free). Provide idea or script. Keep the user's own words for who each character is, including their gender and pronouns ("she", "he") and species; the writer has nothing else to go on.` },
|
|
@@ -2176,11 +2278,11 @@ var init_film = __esm({
|
|
|
2176
2278
|
name: "pixeldojo_film",
|
|
2177
2279
|
description: "Make a finished short film from one idea: screenplay, storyboard frames (AI-reviewed), video clips with spoken dialogue, scene-synced soundtrack, stitched export. Or a music video: pass song_path (a local file) or song_url (your own PixelDojo upload from pixeldojo_upload, never a third-party link) with optional lyrics; the film is cut to that song, each clip lip-synced to its slice on the studio music video engine, and no score is composed: the export plays the song. Every named character must be cast (cast: your own images, a portrait prompt, or a Character Studio character) before frames render; cast entries can also replace or remove someone. Phased: plan is free; cast; produce starts charged generation; status advances production (poll every ~30s); redo renders a new take of chosen shots and status re-exports.",
|
|
2178
2280
|
hostedDescription: "Make a finished short film from one idea: screenplay, storyboard frames (AI-reviewed), video clips with spoken dialogue, scene-synced soundtrack, stitched export. Or a music video: pass song_url (your own PixelDojo upload made with POST /api/v1/upload, never a third-party link) with optional lyrics; the film is cut to that song, each clip lip-synced to its slice on the studio music video engine, and no score is composed: the export plays the song. Every named character must be cast (cast: your own images, a portrait prompt, or a Character Studio character) before frames render; cast entries can also replace or remove someone. Phased: plan is free; cast; produce starts charged generation; status advances production (poll every ~30s); redo renders a new take of chosen shots and status re-exports.",
|
|
2179
|
-
inputZod:
|
|
2180
|
-
inputJsonSchema:
|
|
2281
|
+
inputZod: InputSchema10,
|
|
2282
|
+
inputJsonSchema: InputJsonSchema10,
|
|
2181
2283
|
allowedModels: [],
|
|
2182
2284
|
defaultModel: "",
|
|
2183
|
-
run:
|
|
2285
|
+
run: run10
|
|
2184
2286
|
};
|
|
2185
2287
|
}
|
|
2186
2288
|
});
|
|
@@ -2267,7 +2369,7 @@ function buildVideoPayload(verb, apiId, i) {
|
|
|
2267
2369
|
};
|
|
2268
2370
|
}
|
|
2269
2371
|
}
|
|
2270
|
-
async function
|
|
2372
|
+
async function run11(input, ctx) {
|
|
2271
2373
|
const paramsGate = paramsWithoutModel(input.params, input.model);
|
|
2272
2374
|
if (paramsGate) return { kind: "text", text: paramsGate };
|
|
2273
2375
|
const verb = input.verb;
|
|
@@ -2330,7 +2432,7 @@ async function run10(input, ctx) {
|
|
|
2330
2432
|
notes.join(" ")
|
|
2331
2433
|
);
|
|
2332
2434
|
}
|
|
2333
|
-
var VIDEO_STUDIO_ENGINES, VERBS, BACKWARD_ENGINES, clamp, NEEDS_VIDEO_DURATION, NO_IMAGE_ENGINES,
|
|
2435
|
+
var VIDEO_STUDIO_ENGINES, VERBS, BACKWARD_ENGINES, clamp, NEEDS_VIDEO_DURATION, NO_IMAGE_ENGINES, InputSchema11, engineList, InputJsonSchema11, BASE_DESCRIPTION, videoSkill;
|
|
2334
2436
|
var init_video = __esm({
|
|
2335
2437
|
"src/skills/video.ts"() {
|
|
2336
2438
|
init_poll();
|
|
@@ -2364,7 +2466,7 @@ var init_video = __esm({
|
|
|
2364
2466
|
"wan-video-character-swap"
|
|
2365
2467
|
]);
|
|
2366
2468
|
NO_IMAGE_ENGINES = /* @__PURE__ */ new Set(["flux-video-edit", "xai-video-edit"]);
|
|
2367
|
-
|
|
2469
|
+
InputSchema11 = z.object({
|
|
2368
2470
|
verb: z.enum(VERBS),
|
|
2369
2471
|
prompt: z.string().max(8e3).optional(),
|
|
2370
2472
|
video_url: z.string().url().optional(),
|
|
@@ -2379,7 +2481,7 @@ var init_video = __esm({
|
|
|
2379
2481
|
params: ParamsInput
|
|
2380
2482
|
});
|
|
2381
2483
|
engineList = (verb) => `${verb}: ${VIDEO_STUDIO_ENGINES[verb].join(", ")} (default ${VIDEO_STUDIO_ENGINES[verb][0]})`;
|
|
2382
|
-
|
|
2484
|
+
InputJsonSchema11 = {
|
|
2383
2485
|
type: "object",
|
|
2384
2486
|
properties: {
|
|
2385
2487
|
verb: {
|
|
@@ -2440,11 +2542,11 @@ var init_video = __esm({
|
|
|
2440
2542
|
name: "pixeldojo_video",
|
|
2441
2543
|
description: `${BASE_DESCRIPTION} Local files: video_path / image_path (uploaded to 24h temp storage first).`,
|
|
2442
2544
|
hostedDescription: `${BASE_DESCRIPTION} Media must be public http(s) URLs.`,
|
|
2443
|
-
inputZod:
|
|
2444
|
-
inputJsonSchema:
|
|
2545
|
+
inputZod: InputSchema11,
|
|
2546
|
+
inputJsonSchema: InputJsonSchema11,
|
|
2445
2547
|
allowedModels: Array.from(new Set(VERBS.flatMap((v) => VIDEO_STUDIO_ENGINES[v]))),
|
|
2446
2548
|
defaultModel: VIDEO_STUDIO_ENGINES.change[0],
|
|
2447
|
-
run:
|
|
2549
|
+
run: run11
|
|
2448
2550
|
};
|
|
2449
2551
|
}
|
|
2450
2552
|
});
|
|
@@ -2619,14 +2721,14 @@ async function produce2(id, ctx) {
|
|
|
2619
2721
|
const musicNote = ep.musicEnabled && ep.music?.status === "failed" ? " The music bed failed, so this cut has no music." : "";
|
|
2620
2722
|
return { kind: "text", text: `Export started, free${prior}.${musicNote} ${next(id, "produce", "~60s")}` };
|
|
2621
2723
|
}
|
|
2622
|
-
async function
|
|
2724
|
+
async function run12(input, ctx) {
|
|
2623
2725
|
const action = input.action === "create" && input.episode_id ? "status" : input.action;
|
|
2624
2726
|
if (action === "create") return create(input, ctx);
|
|
2625
2727
|
if (!input.episode_id) return { kind: "text", text: "produce and status need the episode_id returned by the create step." };
|
|
2626
2728
|
if (action === "produce") return produce2(input.episode_id, ctx);
|
|
2627
2729
|
return status(input.episode_id, ctx);
|
|
2628
2730
|
}
|
|
2629
|
-
var STYLES2, CATEGORIES, ENGINES, MIN_SECONDS, MAX_SECONDS, MAX_IN_FLIGHT,
|
|
2731
|
+
var STYLES2, CATEGORIES, ENGINES, MIN_SECONDS, MAX_SECONDS, MAX_IN_FLIGHT, InputSchema12, InputJsonSchema12, call, next, needsRender, PLAN_POLL_MS, PLAN_MAX_POLLS, stillPlanning, episodeSkill;
|
|
2630
2732
|
var init_episode = __esm({
|
|
2631
2733
|
"src/skills/episode.ts"() {
|
|
2632
2734
|
STYLES2 = ["editorial-motion", "paper-diorama", "hand-drawn", "storybook", "poster-vector", "soft-3d"];
|
|
@@ -2635,7 +2737,7 @@ var init_episode = __esm({
|
|
|
2635
2737
|
MIN_SECONDS = 60;
|
|
2636
2738
|
MAX_SECONDS = 300;
|
|
2637
2739
|
MAX_IN_FLIGHT = 4;
|
|
2638
|
-
|
|
2740
|
+
InputSchema12 = z.object({
|
|
2639
2741
|
action: z.enum(["create", "produce", "status"]).default("create"),
|
|
2640
2742
|
topic: z.string().min(8).max(400).optional(),
|
|
2641
2743
|
episode_id: z.string().max(40).optional(),
|
|
@@ -2648,7 +2750,7 @@ var init_episode = __esm({
|
|
|
2648
2750
|
music: z.boolean().default(true),
|
|
2649
2751
|
title: z.string().max(120).optional()
|
|
2650
2752
|
});
|
|
2651
|
-
|
|
2753
|
+
InputJsonSchema12 = {
|
|
2652
2754
|
type: "object",
|
|
2653
2755
|
properties: {
|
|
2654
2756
|
action: {
|
|
@@ -2681,15 +2783,15 @@ var init_episode = __esm({
|
|
|
2681
2783
|
episodeSkill = {
|
|
2682
2784
|
name: "pixeldojo_episode",
|
|
2683
2785
|
description: "Make a finished narrated faceless video (explainer, history, kids story) from one topic: script, scene visuals, AI narration, music bed, stitched export saved to the Library. Phased: create is free and returns a credit quote; produce is charged and advances one step per call (poll every ~30s until it returns the video URL); status is free.",
|
|
2684
|
-
inputZod:
|
|
2685
|
-
inputJsonSchema:
|
|
2786
|
+
inputZod: InputSchema12,
|
|
2787
|
+
inputJsonSchema: InputJsonSchema12,
|
|
2686
2788
|
allowedModels: [],
|
|
2687
2789
|
defaultModel: "",
|
|
2688
|
-
run:
|
|
2790
|
+
run: run12
|
|
2689
2791
|
};
|
|
2690
2792
|
}
|
|
2691
2793
|
});
|
|
2692
|
-
async function
|
|
2794
|
+
async function run13(input, ctx) {
|
|
2693
2795
|
const productImages = [
|
|
2694
2796
|
...input.product_image_urls ?? [],
|
|
2695
2797
|
...await Promise.all((input.product_image_paths ?? []).map((p) => uploadLocalFile(p, ctx)))
|
|
@@ -2732,13 +2834,13 @@ async function run12(input, ctx) {
|
|
|
2732
2834
|
(urls) => urls.length === 0 ? `Ad job ${submitted.jobId} completed but returned no assets.` : `Ad rendered (style: ${styleLabel}${submitted.ad?.product?.name ? `, product: ${submitted.ad.product.name}` : ""}). Video: ${urls[0]}`
|
|
2733
2835
|
);
|
|
2734
2836
|
}
|
|
2735
|
-
var
|
|
2837
|
+
var InputSchema13, InputJsonSchema13, adSkill;
|
|
2736
2838
|
var init_ad = __esm({
|
|
2737
2839
|
"src/skills/ad.ts"() {
|
|
2738
2840
|
init_types();
|
|
2739
2841
|
init_poll();
|
|
2740
2842
|
init_upload_helpers();
|
|
2741
|
-
|
|
2843
|
+
InputSchema13 = z.object({
|
|
2742
2844
|
style: z.string().max(80).optional().describe(
|
|
2743
2845
|
"Ad style slug (default ugc-testimonial). Catalog: GET /api/v1/marketing/presets \u2014 e.g. ugc-testimonial, unboxing-reveal, unboxing-asmr, virtual-try-on, street-style, product-showcase, macro-details, crush-test, hyper-motion, before-after, day-in-the-life, the-gift, tv-spot."
|
|
2744
2846
|
),
|
|
@@ -2764,7 +2866,7 @@ var init_ad = __esm({
|
|
|
2764
2866
|
path: ["product_url"]
|
|
2765
2867
|
}
|
|
2766
2868
|
);
|
|
2767
|
-
|
|
2869
|
+
InputJsonSchema13 = {
|
|
2768
2870
|
type: "object",
|
|
2769
2871
|
properties: {
|
|
2770
2872
|
style: {
|
|
@@ -2851,16 +2953,16 @@ var init_ad = __esm({
|
|
|
2851
2953
|
name: "pixeldojo_ad",
|
|
2852
2954
|
description: "Marketing Studio: turn a product into a rendered video ad with voiceover. Requires `product_url` (name, description and images are extracted), or `product_name` plus product_image_urls / product_image_paths. Pick a `style` slug (default ugc-testimonial; full catalog at GET https://pixeldojo.ai/api/v1/marketing/presets), and optionally add presenter reference images, a location, a hook, and the exact spoken script. Returns the video URL, or a jobId to check with pixeldojo_status.",
|
|
2853
2955
|
hostedDescription: "Marketing Studio: turn a product into a rendered video ad with voiceover. Requires `product_url` (name, description and images are extracted), or `product_name` plus product_image_urls (public http(s) URLs). Pick a `style` slug (default ugc-testimonial; full catalog at GET https://pixeldojo.ai/api/v1/marketing/presets), and optionally add presenter reference images, a location, a hook, and the exact spoken script. Returns the video URL, or a jobId to check with pixeldojo_status.",
|
|
2854
|
-
inputZod:
|
|
2855
|
-
inputJsonSchema:
|
|
2956
|
+
inputZod: InputSchema13,
|
|
2957
|
+
inputJsonSchema: InputJsonSchema13,
|
|
2856
2958
|
// Composition skill — the server routes to the ad engine internally.
|
|
2857
2959
|
allowedModels: [],
|
|
2858
2960
|
defaultModel: "",
|
|
2859
|
-
run:
|
|
2961
|
+
run: run13
|
|
2860
2962
|
};
|
|
2861
2963
|
}
|
|
2862
2964
|
});
|
|
2863
|
-
async function
|
|
2965
|
+
async function run14(input, ctx) {
|
|
2864
2966
|
const client = ctx.client;
|
|
2865
2967
|
const result = await client.runCampaign(input);
|
|
2866
2968
|
if (result.kind === "campaign") {
|
|
@@ -2887,10 +2989,10 @@ async function run13(input, ctx) {
|
|
|
2887
2989
|
statusUrl: result.statusUrl ?? ctx.buildStatusUrl(result.campaignId)
|
|
2888
2990
|
};
|
|
2889
2991
|
}
|
|
2890
|
-
var
|
|
2992
|
+
var InputSchema14, InputJsonSchema14, campaignSkill;
|
|
2891
2993
|
var init_campaign = __esm({
|
|
2892
2994
|
"src/skills/campaign.ts"() {
|
|
2893
|
-
|
|
2995
|
+
InputSchema14 = z.object({
|
|
2894
2996
|
productUrl: z.string().url().optional().describe("Product page URL. We extract name + description + images automatically."),
|
|
2895
2997
|
product: z.object({
|
|
2896
2998
|
name: z.string().min(1).max(200),
|
|
@@ -2906,7 +3008,7 @@ var init_campaign = __esm({
|
|
|
2906
3008
|
message: "productUrl or product is required",
|
|
2907
3009
|
path: ["productUrl"]
|
|
2908
3010
|
});
|
|
2909
|
-
|
|
3011
|
+
InputJsonSchema14 = {
|
|
2910
3012
|
type: "object",
|
|
2911
3013
|
properties: {
|
|
2912
3014
|
productUrl: {
|
|
@@ -2957,17 +3059,17 @@ var init_campaign = __esm({
|
|
|
2957
3059
|
campaignSkill = {
|
|
2958
3060
|
name: "pixeldojo_campaign",
|
|
2959
3061
|
description: "Generate a coherent product launch package (hero image + N lifestyle variants + optional vertical video) from one URL or product profile. Composes hero / lifestyle / video models server-side; returns assets in one call or a handoff with campaignId to poll via pixeldojo_campaign_status.",
|
|
2960
|
-
inputZod:
|
|
2961
|
-
inputJsonSchema:
|
|
3062
|
+
inputZod: InputSchema14,
|
|
3063
|
+
inputJsonSchema: InputJsonSchema14,
|
|
2962
3064
|
// Composition skill — internal sub-jobs route to per-tool models, no
|
|
2963
3065
|
// single allowed-models list applies here.
|
|
2964
3066
|
allowedModels: [],
|
|
2965
3067
|
defaultModel: "",
|
|
2966
|
-
run:
|
|
3068
|
+
run: run14
|
|
2967
3069
|
};
|
|
2968
3070
|
}
|
|
2969
3071
|
});
|
|
2970
|
-
async function
|
|
3072
|
+
async function run15(input, ctx) {
|
|
2971
3073
|
const client = ctx.client;
|
|
2972
3074
|
const result = await client.getCampaign(input.campaignId);
|
|
2973
3075
|
if (result.kind === "campaign") {
|
|
@@ -2997,13 +3099,13 @@ async function run14(input, ctx) {
|
|
|
2997
3099
|
statusUrl: result.statusUrl ?? ctx.buildStatusUrl(result.campaignId)
|
|
2998
3100
|
};
|
|
2999
3101
|
}
|
|
3000
|
-
var
|
|
3102
|
+
var InputSchema15, InputJsonSchema15, campaignStatusSkill;
|
|
3001
3103
|
var init_campaign_status = __esm({
|
|
3002
3104
|
"src/skills/campaign-status.ts"() {
|
|
3003
|
-
|
|
3105
|
+
InputSchema15 = z.object({
|
|
3004
3106
|
campaignId: z.string().min(1).max(200).describe("Campaign id returned from a prior pixeldojo_campaign handoff.")
|
|
3005
3107
|
});
|
|
3006
|
-
|
|
3108
|
+
InputJsonSchema15 = {
|
|
3007
3109
|
type: "object",
|
|
3008
3110
|
properties: {
|
|
3009
3111
|
campaignId: {
|
|
@@ -3016,15 +3118,15 @@ var init_campaign_status = __esm({
|
|
|
3016
3118
|
campaignStatusSkill = {
|
|
3017
3119
|
name: "pixeldojo_campaign_status",
|
|
3018
3120
|
description: "Poll a campaign by campaignId returned from pixeldojo_campaign. Returns assets when every sub-job is done, or a handoff describing what is still in flight.",
|
|
3019
|
-
inputZod:
|
|
3020
|
-
inputJsonSchema:
|
|
3121
|
+
inputZod: InputSchema15,
|
|
3122
|
+
inputJsonSchema: InputJsonSchema15,
|
|
3021
3123
|
allowedModels: [],
|
|
3022
3124
|
defaultModel: "",
|
|
3023
|
-
run:
|
|
3125
|
+
run: run15
|
|
3024
3126
|
};
|
|
3025
3127
|
}
|
|
3026
3128
|
});
|
|
3027
|
-
async function
|
|
3129
|
+
async function run16(input, ctx) {
|
|
3028
3130
|
let url;
|
|
3029
3131
|
try {
|
|
3030
3132
|
url = await uploadLocalFile(input.path, ctx);
|
|
@@ -3040,16 +3142,16 @@ async function run15(input, ctx) {
|
|
|
3040
3142
|
(temp storage; auto-deletes in ~24h. Pass this URL as image_url, video_url for a clip, or song_url on pixeldojo_film for a song, to any pixeldojo tool that takes one.)`
|
|
3041
3143
|
};
|
|
3042
3144
|
}
|
|
3043
|
-
var
|
|
3145
|
+
var InputSchema16, InputJsonSchema16, uploadSkill;
|
|
3044
3146
|
var init_upload = __esm({
|
|
3045
3147
|
"src/skills/upload.ts"() {
|
|
3046
3148
|
init_upload_helpers();
|
|
3047
|
-
|
|
3149
|
+
InputSchema16 = z.object({
|
|
3048
3150
|
path: z.string().min(1).max(4096).describe(
|
|
3049
3151
|
"Absolute local file path to upload. JPEG, PNG, WebP, GIF (\u226450MB), MP4, WebM, MOV (\u2264200MB) or MP3, WAV, M4A, AAC, OGG, FLAC audio (\u226450MB). Returns a public URL on the temp CDN; storage auto-expires after 24 hours."
|
|
3050
3152
|
)
|
|
3051
3153
|
});
|
|
3052
|
-
|
|
3154
|
+
InputJsonSchema16 = {
|
|
3053
3155
|
type: "object",
|
|
3054
3156
|
properties: {
|
|
3055
3157
|
path: {
|
|
@@ -3062,15 +3164,15 @@ var init_upload = __esm({
|
|
|
3062
3164
|
uploadSkill = {
|
|
3063
3165
|
name: "pixeldojo_upload",
|
|
3064
3166
|
description: "Upload a local image, video or audio file (JPEG, PNG, WebP, GIF up to 50MB; MP4, WebM, MOV up to 200MB; MP3, WAV, M4A, AAC, OGG, FLAC up to 50MB) and get back a public URL that expires after 24 hours. Free. Pass an audio URL as song_url to pixeldojo_film for a music video. Pass the URL as image_url (stills) or video_url (clips) to tools that take hosted URLs only, such as pixeldojo_character, pixeldojo_storyboard and pixeldojo_upscale. pixeldojo_generate, pixeldojo_edit and pixeldojo_ad take local paths directly and need no separate upload.",
|
|
3065
|
-
inputZod:
|
|
3066
|
-
inputJsonSchema:
|
|
3167
|
+
inputZod: InputSchema16,
|
|
3168
|
+
inputJsonSchema: InputJsonSchema16,
|
|
3067
3169
|
allowedModels: [],
|
|
3068
3170
|
defaultModel: "",
|
|
3069
|
-
run:
|
|
3171
|
+
run: run16
|
|
3070
3172
|
};
|
|
3071
3173
|
}
|
|
3072
3174
|
});
|
|
3073
|
-
async function
|
|
3175
|
+
async function run17(input, ctx) {
|
|
3074
3176
|
const requested = input.model ?? DEFAULT_MODEL6;
|
|
3075
3177
|
if (!ALLOWED4.includes(requested)) {
|
|
3076
3178
|
return {
|
|
@@ -3108,14 +3210,14 @@ async function run16(input, ctx) {
|
|
|
3108
3210
|
(urls) => urls.length === 0 ? `Job ${submitted.jobId} completed but returned no assets.` : `Audio ready. Asset: ${urls[0]}`
|
|
3109
3211
|
);
|
|
3110
3212
|
}
|
|
3111
|
-
var ALLOWED4, DEFAULT_MODEL6,
|
|
3213
|
+
var ALLOWED4, DEFAULT_MODEL6, InputSchema17, InputJsonSchema17, audioSkill;
|
|
3112
3214
|
var init_audio = __esm({
|
|
3113
3215
|
"src/skills/audio.ts"() {
|
|
3114
3216
|
init_poll();
|
|
3115
3217
|
init_types();
|
|
3116
3218
|
ALLOWED4 = ["seed-audio", "text-to-speech"];
|
|
3117
3219
|
DEFAULT_MODEL6 = "seed-audio";
|
|
3118
|
-
|
|
3220
|
+
InputSchema17 = z.object({
|
|
3119
3221
|
prompt: z.string().min(1).describe(
|
|
3120
3222
|
"seed-audio: a script to speak, or a scene description (dialogue, sound effects, music), up to 2048 characters; refer to audio_urls clips in order as @Audio1..@Audio3. text-to-speech: the exact text to speak, up to 10,000 characters."
|
|
3121
3223
|
),
|
|
@@ -3125,7 +3227,7 @@ var init_audio = __esm({
|
|
|
3125
3227
|
output_format: z.string().optional().describe("Output format. seed-audio: mp3 (default), wav, pcm, ogg_opus. text-to-speech: mp3 (default), wav, flac, pcm."),
|
|
3126
3228
|
speed: z.number().min(0.5).max(2).optional().describe("Speech speed multiplier, 0.5-2 (default 1). Both models.")
|
|
3127
3229
|
});
|
|
3128
|
-
|
|
3230
|
+
InputJsonSchema17 = {
|
|
3129
3231
|
type: "object",
|
|
3130
3232
|
properties: {
|
|
3131
3233
|
prompt: {
|
|
@@ -3163,15 +3265,15 @@ var init_audio = __esm({
|
|
|
3163
3265
|
audioSkill = {
|
|
3164
3266
|
name: "pixeldojo_audio",
|
|
3165
3267
|
description: "Generate audio: speech, multi-character dialogue, sound effects, and background music from one prompt (Seed Audio 1.0 by default; plain text-to-speech available). Voice cloning takes hosted reference clip URLs in audio_urls; local audio files are not accepted. Returns an audio URL, or a jobId for pixeldojo_status.",
|
|
3166
|
-
inputZod:
|
|
3167
|
-
inputJsonSchema:
|
|
3268
|
+
inputZod: InputSchema17,
|
|
3269
|
+
inputJsonSchema: InputJsonSchema17,
|
|
3168
3270
|
allowedModels: [...ALLOWED4],
|
|
3169
3271
|
defaultModel: DEFAULT_MODEL6,
|
|
3170
|
-
run:
|
|
3272
|
+
run: run17
|
|
3171
3273
|
};
|
|
3172
3274
|
}
|
|
3173
3275
|
});
|
|
3174
|
-
async function
|
|
3276
|
+
async function run18(input, ctx) {
|
|
3175
3277
|
if (input.source === "characters") {
|
|
3176
3278
|
const { characters } = await ctx.client.listCharacters({ q: input.q, limit: input.limit ?? 25 });
|
|
3177
3279
|
if (characters.length === 0) {
|
|
@@ -3222,17 +3324,17 @@ ${lines.join("\n")}
|
|
|
3222
3324
|
Pass any URL back into pixeldojo_generate, pixeldojo_edit, pixeldojo_character, or pixeldojo_upscale as a reference input.`
|
|
3223
3325
|
};
|
|
3224
3326
|
}
|
|
3225
|
-
var
|
|
3327
|
+
var InputSchema18, InputJsonSchema18, librarySkill;
|
|
3226
3328
|
var init_library = __esm({
|
|
3227
3329
|
"src/skills/library.ts"() {
|
|
3228
|
-
|
|
3330
|
+
InputSchema18 = z.object({
|
|
3229
3331
|
source: z.enum(["media", "characters"]).optional().describe("media (default): saved and recent results. characters: saved Character Studio characters and elements, usable as @Name in prompts."),
|
|
3230
3332
|
q: z.string().optional().describe("Substring match against the prompt that produced the asset."),
|
|
3231
3333
|
model: z.string().optional().describe("Restrict to a single model (apiId)."),
|
|
3232
3334
|
modality: z.enum(["image", "video", "audio"]).optional().describe("Restrict to one output type."),
|
|
3233
3335
|
limit: z.number().int().min(1).max(50).optional().describe("Max results (default 10).")
|
|
3234
3336
|
});
|
|
3235
|
-
|
|
3337
|
+
InputJsonSchema18 = {
|
|
3236
3338
|
type: "object",
|
|
3237
3339
|
properties: {
|
|
3238
3340
|
source: {
|
|
@@ -3257,15 +3359,15 @@ var init_library = __esm({
|
|
|
3257
3359
|
librarySkill = {
|
|
3258
3360
|
name: "pixeldojo_library",
|
|
3259
3361
|
description: "Search your Library, newest first. source=media (default): saved media (permanent) and recent API/MCP generations (deleted 1 hour after they finish), as URLs to reuse as references. source=characters: saved Character Studio characters and elements, each usable as @Name in any prompt.",
|
|
3260
|
-
inputZod:
|
|
3261
|
-
inputJsonSchema:
|
|
3362
|
+
inputZod: InputSchema18,
|
|
3363
|
+
inputJsonSchema: InputJsonSchema18,
|
|
3262
3364
|
allowedModels: [],
|
|
3263
3365
|
defaultModel: "",
|
|
3264
|
-
run:
|
|
3366
|
+
run: run18
|
|
3265
3367
|
};
|
|
3266
3368
|
}
|
|
3267
3369
|
});
|
|
3268
|
-
async function
|
|
3370
|
+
async function run19(input, ctx) {
|
|
3269
3371
|
const res = await ctx.client.saveMedia({
|
|
3270
3372
|
url: input.url,
|
|
3271
3373
|
prompt: input.prompt,
|
|
@@ -3279,17 +3381,17 @@ async function run18(input, ctx) {
|
|
|
3279
3381
|
It will appear at https://pixeldojo.ai/my-images and in pixeldojo_library searches.`
|
|
3280
3382
|
};
|
|
3281
3383
|
}
|
|
3282
|
-
var
|
|
3384
|
+
var InputSchema19, InputJsonSchema19, saveSkill;
|
|
3283
3385
|
var init_save = __esm({
|
|
3284
3386
|
"src/skills/save.ts"() {
|
|
3285
|
-
|
|
3387
|
+
InputSchema19 = z.object({
|
|
3286
3388
|
url: z.string().url().describe("The asset URL to save (image or video)."),
|
|
3287
3389
|
prompt: z.string().optional().describe("The prompt that produced it \u2014 makes it findable in the library later."),
|
|
3288
3390
|
tool_name: z.string().optional().describe("Tool/model slug that produced it."),
|
|
3289
3391
|
modality: z.enum(["image", "video", "audio"]).optional(),
|
|
3290
3392
|
job_id: z.string().optional().describe("The jobId that produced this asset, when known.")
|
|
3291
3393
|
});
|
|
3292
|
-
|
|
3394
|
+
InputJsonSchema19 = {
|
|
3293
3395
|
type: "object",
|
|
3294
3396
|
properties: {
|
|
3295
3397
|
url: { type: "string", format: "uri", description: "The result URL to keep (image or video from a PixelDojo job)." },
|
|
@@ -3303,15 +3405,15 @@ var init_save = __esm({
|
|
|
3303
3405
|
saveSkill = {
|
|
3304
3406
|
name: "pixeldojo_save",
|
|
3305
3407
|
description: `Save a generated image or video into the user's My Media library permanently ("save this", "keep it"). Results otherwise expire 1 hour after they finish. Pass the result URL; it is safety-checked before it is kept.`,
|
|
3306
|
-
inputZod:
|
|
3307
|
-
inputJsonSchema:
|
|
3408
|
+
inputZod: InputSchema19,
|
|
3409
|
+
inputJsonSchema: InputJsonSchema19,
|
|
3308
3410
|
allowedModels: [],
|
|
3309
3411
|
defaultModel: "",
|
|
3310
|
-
run:
|
|
3412
|
+
run: run19
|
|
3311
3413
|
};
|
|
3312
3414
|
}
|
|
3313
3415
|
});
|
|
3314
|
-
async function
|
|
3416
|
+
async function run20(input, ctx) {
|
|
3315
3417
|
const res = await ctx.client.saveCharacter({
|
|
3316
3418
|
name: input.name,
|
|
3317
3419
|
kind: input.kind ?? "character",
|
|
@@ -3323,17 +3425,17 @@ async function run19(input, ctx) {
|
|
|
3323
3425
|
text: `Saved ${res.kind} "${res.name}" to Character Studio (${res.image_urls.length} image${res.image_urls.length === 1 ? "" : "s"}). Use it in any prompt as ${res.mention}, for example "${res.mention} walking on a beach at sunset". It also appears at https://pixeldojo.ai/characters.`
|
|
3324
3426
|
};
|
|
3325
3427
|
}
|
|
3326
|
-
var KINDS,
|
|
3428
|
+
var KINDS, InputSchema20, InputJsonSchema20, saveCharacterSkill;
|
|
3327
3429
|
var init_save_character = __esm({
|
|
3328
3430
|
"src/skills/save-character.ts"() {
|
|
3329
3431
|
KINDS = ["character", "product", "outfit", "location", "object", "style"];
|
|
3330
|
-
|
|
3432
|
+
InputSchema20 = z.object({
|
|
3331
3433
|
name: z.string().min(1).max(60).describe("What to call it. Used as @Name in prompts."),
|
|
3332
3434
|
kind: z.enum(KINDS).optional().describe("Default character."),
|
|
3333
3435
|
image_urls: z.array(z.string().url()).max(8).optional().describe("3 to 5 photos from different angles works best for a character."),
|
|
3334
3436
|
description: z.string().max(1500).optional().describe("Appearance notes, or the scene text for an element.")
|
|
3335
3437
|
});
|
|
3336
|
-
|
|
3438
|
+
InputJsonSchema20 = {
|
|
3337
3439
|
type: "object",
|
|
3338
3440
|
properties: {
|
|
3339
3441
|
name: { type: "string", description: "What to call it. Used as @Name in prompts afterwards." },
|
|
@@ -3351,11 +3453,11 @@ var init_save_character = __esm({
|
|
|
3351
3453
|
saveCharacterSkill = {
|
|
3352
3454
|
name: "pixeldojo_save_character",
|
|
3353
3455
|
description: "Save a character (a person, from 3-5 photos) or an element (product, outfit, location, prop, style) to the user's Character Studio library. Afterwards write @Name in any prompt to use it. List saved ones with pixeldojo_library source=characters.",
|
|
3354
|
-
inputZod:
|
|
3355
|
-
inputJsonSchema:
|
|
3456
|
+
inputZod: InputSchema20,
|
|
3457
|
+
inputJsonSchema: InputJsonSchema20,
|
|
3356
3458
|
allowedModels: [],
|
|
3357
3459
|
defaultModel: "",
|
|
3358
|
-
run:
|
|
3460
|
+
run: run20
|
|
3359
3461
|
};
|
|
3360
3462
|
}
|
|
3361
3463
|
});
|
|
@@ -3615,6 +3717,7 @@ __export(skills_exports, {
|
|
|
3615
3717
|
generateSkill: () => generateSkill,
|
|
3616
3718
|
librarySkill: () => librarySkill,
|
|
3617
3719
|
listWorkflowsSkill: () => listWorkflowsSkill,
|
|
3720
|
+
overlaySkill: () => overlaySkill,
|
|
3618
3721
|
runWorkflowSkill: () => runWorkflowSkill,
|
|
3619
3722
|
saveCharacterSkill: () => saveCharacterSkill,
|
|
3620
3723
|
saveSkill: () => saveSkill,
|
|
@@ -3653,6 +3756,7 @@ var init_skills = __esm({
|
|
|
3653
3756
|
init_storyboard();
|
|
3654
3757
|
init_upscale();
|
|
3655
3758
|
init_caption();
|
|
3759
|
+
init_overlay();
|
|
3656
3760
|
init_status();
|
|
3657
3761
|
init_from_url();
|
|
3658
3762
|
init_film();
|
|
@@ -3674,6 +3778,7 @@ var init_skills = __esm({
|
|
|
3674
3778
|
storyboardSkill,
|
|
3675
3779
|
upscaleSkill,
|
|
3676
3780
|
captionSkill,
|
|
3781
|
+
overlaySkill,
|
|
3677
3782
|
audioSkill,
|
|
3678
3783
|
librarySkill,
|
|
3679
3784
|
saveSkill,
|
|
@@ -3714,6 +3819,7 @@ var init_skills = __esm({
|
|
|
3714
3819
|
pixeldojo_storyboard: render("Storyboard preview video"),
|
|
3715
3820
|
pixeldojo_upscale: render("Upscale image or video"),
|
|
3716
3821
|
pixeldojo_caption: render("Caption video"),
|
|
3822
|
+
pixeldojo_overlay: render("Add offer or end card"),
|
|
3717
3823
|
pixeldojo_audio: render("Generate music, speech or sound"),
|
|
3718
3824
|
pixeldojo_video: render("Change, animate or extend video"),
|
|
3719
3825
|
pixeldojo_ad: render("Make video ad"),
|
|
@@ -3784,7 +3890,7 @@ function makeRedactedLogger(target = console) {
|
|
|
3784
3890
|
}
|
|
3785
3891
|
|
|
3786
3892
|
// src/server.ts
|
|
3787
|
-
var PACKAGE_VERSION = "0.
|
|
3893
|
+
var PACKAGE_VERSION = "0.22.0" ;
|
|
3788
3894
|
var SERVER_INSTRUCTIONS = "Pixel Dojo generates images, video, audio and short films from one catalog of AI models, billed in credits from the connected Pixel Dojo account. A job that runs past the 30-second wait returns a jobId to check later; check it rather than submitting again, since every new submission is charged. Generated asset URLs are deleted one hour after they are created: pixeldojo_save keeps one in the user's My Media permanently (after a safety check), and finished films stay in the account library. In any prompt, @Name uses a character, product, outfit, location, prop or style the user saved in Character Studio: its photos are attached automatically. pixeldojo_library source=characters lists them, and pixeldojo_save_character saves a new one from 3 to 5 photos.";
|
|
3789
3895
|
function buildServer(options) {
|
|
3790
3896
|
if (!options.apiKey) {
|