@pixeldojo/mcp 0.21.0 → 0.23.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 +261 -91
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +261 -91
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +260 -91
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +260 -91
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -1311,6 +1311,171 @@ var init_caption = __esm({
|
|
|
1311
1311
|
}
|
|
1312
1312
|
});
|
|
1313
1313
|
async function run7(input, ctx) {
|
|
1314
|
+
const { hook, callout, review, offer, end_card: card } = input;
|
|
1315
|
+
if (!hook && !callout && !review && !input.progress_bar && !offer && !card) {
|
|
1316
|
+
return { kind: "text", text: "pixeldojo_overlay needs at least one of hook, callout, review, progress_bar, offer or end_card." };
|
|
1317
|
+
}
|
|
1318
|
+
const submitted = await ctx.client.run(MODEL2, {
|
|
1319
|
+
prompt: "",
|
|
1320
|
+
video: input.video_url,
|
|
1321
|
+
...input.color ? { color: input.color } : {},
|
|
1322
|
+
...hook ? { hook_text: hook.text, hook_duration: hook.duration_sec } : {},
|
|
1323
|
+
...callout ? {
|
|
1324
|
+
callout_title: callout.title,
|
|
1325
|
+
callout_subtitle: callout.subtitle,
|
|
1326
|
+
callout_start: callout.start_sec,
|
|
1327
|
+
callout_duration: callout.duration_sec
|
|
1328
|
+
} : {},
|
|
1329
|
+
...review ? {
|
|
1330
|
+
review_quote: review.quote,
|
|
1331
|
+
review_name: review.name,
|
|
1332
|
+
review_stars: review.stars,
|
|
1333
|
+
review_start: review.start_sec,
|
|
1334
|
+
review_duration: review.duration_sec
|
|
1335
|
+
} : {},
|
|
1336
|
+
...input.progress_bar ? { progress_bar: true } : {},
|
|
1337
|
+
...offer ? {
|
|
1338
|
+
offer_text: offer.text,
|
|
1339
|
+
offer_subtext: offer.subtext,
|
|
1340
|
+
offer_start: offer.start_sec,
|
|
1341
|
+
offer_duration: offer.duration_sec,
|
|
1342
|
+
offer_position: offer.position
|
|
1343
|
+
} : {},
|
|
1344
|
+
...card ? {
|
|
1345
|
+
end_headline: card.headline,
|
|
1346
|
+
end_cta: card.cta,
|
|
1347
|
+
end_url: card.url,
|
|
1348
|
+
logo_url: card.logo_url,
|
|
1349
|
+
end_duration: card.duration_sec
|
|
1350
|
+
} : {}
|
|
1351
|
+
});
|
|
1352
|
+
const result = await pollJobUntilDoneOrHandoff(
|
|
1353
|
+
submitted.jobId,
|
|
1354
|
+
(id) => ctx.client.getJob(id),
|
|
1355
|
+
ctx.buildStatusUrl,
|
|
1356
|
+
{ now: ctx.pollOverrides?.now, sleep: ctx.pollOverrides?.sleep }
|
|
1357
|
+
);
|
|
1358
|
+
return pollResultToSkillResult(
|
|
1359
|
+
result,
|
|
1360
|
+
(urls) => urls.length === 0 ? `Job ${submitted.jobId} completed but returned no assets.` : `Branded. Asset: ${urls[0]}`
|
|
1361
|
+
);
|
|
1362
|
+
}
|
|
1363
|
+
var MODEL2, InputSchema7, InputJsonSchema7, overlaySkill;
|
|
1364
|
+
var init_overlay = __esm({
|
|
1365
|
+
"src/skills/overlay.ts"() {
|
|
1366
|
+
init_poll();
|
|
1367
|
+
init_types();
|
|
1368
|
+
MODEL2 = "brand-overlay";
|
|
1369
|
+
InputSchema7 = zod.z.object({
|
|
1370
|
+
video_url: zod.z.string().url(),
|
|
1371
|
+
color: zod.z.string().optional(),
|
|
1372
|
+
hook: zod.z.object({ text: zod.z.string().max(60), duration_sec: zod.z.number().min(1).max(6).optional() }).optional(),
|
|
1373
|
+
callout: zod.z.object({
|
|
1374
|
+
title: zod.z.string().max(32),
|
|
1375
|
+
subtitle: zod.z.string().max(40).optional(),
|
|
1376
|
+
start_sec: zod.z.number().min(0).optional(),
|
|
1377
|
+
duration_sec: zod.z.number().min(1).max(10).optional()
|
|
1378
|
+
}).optional(),
|
|
1379
|
+
review: zod.z.object({
|
|
1380
|
+
quote: zod.z.string().max(90),
|
|
1381
|
+
name: zod.z.string().max(30).optional(),
|
|
1382
|
+
stars: zod.z.number().int().min(1).max(5).optional(),
|
|
1383
|
+
start_sec: zod.z.number().min(0).optional(),
|
|
1384
|
+
duration_sec: zod.z.number().min(1).max(10).optional()
|
|
1385
|
+
}).optional(),
|
|
1386
|
+
progress_bar: zod.z.boolean().optional(),
|
|
1387
|
+
offer: zod.z.object({
|
|
1388
|
+
text: zod.z.string().max(24),
|
|
1389
|
+
subtext: zod.z.string().max(40).optional(),
|
|
1390
|
+
start_sec: zod.z.number().min(0).optional(),
|
|
1391
|
+
duration_sec: zod.z.number().min(1).max(10).optional(),
|
|
1392
|
+
position: zod.z.enum(["top", "bottom"]).optional()
|
|
1393
|
+
}).optional(),
|
|
1394
|
+
end_card: zod.z.object({
|
|
1395
|
+
headline: zod.z.string().max(40),
|
|
1396
|
+
cta: zod.z.string().max(24).optional(),
|
|
1397
|
+
url: zod.z.string().max(40).optional(),
|
|
1398
|
+
logo_url: zod.z.string().url().optional(),
|
|
1399
|
+
duration_sec: zod.z.number().min(2).max(5).optional()
|
|
1400
|
+
}).optional()
|
|
1401
|
+
});
|
|
1402
|
+
InputJsonSchema7 = {
|
|
1403
|
+
type: "object",
|
|
1404
|
+
required: ["video_url"],
|
|
1405
|
+
properties: {
|
|
1406
|
+
video_url: { type: "string", format: "uri", description: "The video to brand (MP4 or MOV)." },
|
|
1407
|
+
color: { type: "string", description: "Brand color as #RRGGBB: the badge and the button. Defaults to #FFE500." },
|
|
1408
|
+
hook: {
|
|
1409
|
+
type: "object",
|
|
1410
|
+
description: "Hook title over the first seconds, the overlay that decides whether people keep watching. 5-8 words.",
|
|
1411
|
+
required: ["text"],
|
|
1412
|
+
properties: {
|
|
1413
|
+
text: { type: "string", maxLength: 60, description: 'e.g. "Octopuses have THREE hearts?".' },
|
|
1414
|
+
duration_sec: { type: "number", minimum: 1, maximum: 6, description: "Default 2.5." }
|
|
1415
|
+
}
|
|
1416
|
+
},
|
|
1417
|
+
callout: {
|
|
1418
|
+
type: "object",
|
|
1419
|
+
description: 'Lower-third label that slides in from the left: a benefit ("Ships in 24h") or a name and title.',
|
|
1420
|
+
required: ["title"],
|
|
1421
|
+
properties: {
|
|
1422
|
+
title: { type: "string", maxLength: 32, description: "The label." },
|
|
1423
|
+
subtitle: { type: "string", maxLength: 40, description: "Optional second line." },
|
|
1424
|
+
start_sec: { type: "number", description: "Default 3." },
|
|
1425
|
+
duration_sec: { type: "number", minimum: 1, maximum: 10, description: "Default 4." }
|
|
1426
|
+
}
|
|
1427
|
+
},
|
|
1428
|
+
review: {
|
|
1429
|
+
type: "object",
|
|
1430
|
+
description: "Review card: stars, a short quote and a name.",
|
|
1431
|
+
required: ["quote"],
|
|
1432
|
+
properties: {
|
|
1433
|
+
quote: { type: "string", maxLength: 90, description: "The review text, without quote marks." },
|
|
1434
|
+
name: { type: "string", maxLength: 30, description: 'e.g. "Jess, verified buyer".' },
|
|
1435
|
+
stars: { type: "integer", minimum: 1, maximum: 5, description: "Default 5." },
|
|
1436
|
+
start_sec: { type: "number", description: "Default just after the hook." },
|
|
1437
|
+
duration_sec: { type: "number", minimum: 1, maximum: 10, description: "Default 4." }
|
|
1438
|
+
}
|
|
1439
|
+
},
|
|
1440
|
+
progress_bar: { type: "boolean", description: "A thin bar in the brand color across the top that fills as the video plays." },
|
|
1441
|
+
offer: {
|
|
1442
|
+
type: "object",
|
|
1443
|
+
description: "Offer callout: a badge that pops in on cue (after the hook when there is one).",
|
|
1444
|
+
required: ["text"],
|
|
1445
|
+
properties: {
|
|
1446
|
+
text: { type: "string", maxLength: 24, description: 'e.g. "50% OFF".' },
|
|
1447
|
+
subtext: { type: "string", maxLength: 40, description: 'Small line under it, e.g. "This week only".' },
|
|
1448
|
+
start_sec: { type: "number", description: "Second it appears. Default 0.5." },
|
|
1449
|
+
duration_sec: { type: "number", minimum: 1, maximum: 10, description: "Seconds it stays. Default 3." },
|
|
1450
|
+
position: { type: "string", enum: ["top", "bottom"], description: "Default top." }
|
|
1451
|
+
}
|
|
1452
|
+
},
|
|
1453
|
+
end_card: {
|
|
1454
|
+
type: "object",
|
|
1455
|
+
description: "End card held after the last frame.",
|
|
1456
|
+
required: ["headline"],
|
|
1457
|
+
properties: {
|
|
1458
|
+
headline: { type: "string", maxLength: 40, description: 'e.g. "Your new favorite mug".' },
|
|
1459
|
+
cta: { type: "string", maxLength: 24, description: 'Button text, e.g. "Shop now".' },
|
|
1460
|
+
url: { type: "string", maxLength: 40, description: "Web address shown under the button." },
|
|
1461
|
+
logo_url: { type: "string", format: "uri", description: "PNG (transparent works best) or JPG." },
|
|
1462
|
+
duration_sec: { type: "number", minimum: 2, maximum: 5, description: "Default 3." }
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1465
|
+
}
|
|
1466
|
+
};
|
|
1467
|
+
overlaySkill = {
|
|
1468
|
+
name: "pixeldojo_overlay",
|
|
1469
|
+
description: 'Add short-form ad text layouts to a finished video, exact text in the brand color, clear of the TikTok/Reels/Shorts UI: hook (title over the first seconds), callout (lower-third label), review (stars, quote, name), progress_bar, offer ("50% OFF" badge) and end_card (logo, headline, button, web address over the held last frame). Pass video_url plus any of them; one call does all. 2 credits.',
|
|
1470
|
+
inputZod: InputSchema7,
|
|
1471
|
+
inputJsonSchema: InputJsonSchema7,
|
|
1472
|
+
allowedModels: [MODEL2],
|
|
1473
|
+
defaultModel: MODEL2,
|
|
1474
|
+
run: run7
|
|
1475
|
+
};
|
|
1476
|
+
}
|
|
1477
|
+
});
|
|
1478
|
+
async function run8(input, ctx) {
|
|
1314
1479
|
const job = await ctx.client.getJob(input.jobId);
|
|
1315
1480
|
if (job.status === "completed") {
|
|
1316
1481
|
const urls = extractAssetUrls2(job);
|
|
@@ -1374,13 +1539,13 @@ function extractAssetUrls2(job) {
|
|
|
1374
1539
|
if (output?.video) return [output.video];
|
|
1375
1540
|
return [];
|
|
1376
1541
|
}
|
|
1377
|
-
var
|
|
1542
|
+
var InputSchema8, InputJsonSchema8, STUCK_HINT_MS, ABANDON_HINT_MS, statusSkill;
|
|
1378
1543
|
var init_status = __esm({
|
|
1379
1544
|
"src/skills/status.ts"() {
|
|
1380
|
-
|
|
1545
|
+
InputSchema8 = zod.z.object({
|
|
1381
1546
|
jobId: zod.z.string().min(1).max(200).describe("Job id returned from a prior pixeldojo_* skill handoff.")
|
|
1382
1547
|
});
|
|
1383
|
-
|
|
1548
|
+
InputJsonSchema8 = {
|
|
1384
1549
|
type: "object",
|
|
1385
1550
|
properties: {
|
|
1386
1551
|
jobId: {
|
|
@@ -1395,16 +1560,16 @@ var init_status = __esm({
|
|
|
1395
1560
|
statusSkill = {
|
|
1396
1561
|
name: "pixeldojo_status",
|
|
1397
1562
|
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".',
|
|
1398
|
-
inputZod:
|
|
1399
|
-
inputJsonSchema:
|
|
1563
|
+
inputZod: InputSchema8,
|
|
1564
|
+
inputJsonSchema: InputJsonSchema8,
|
|
1400
1565
|
// status is special — it doesn't dispatch to a model
|
|
1401
1566
|
allowedModels: [],
|
|
1402
1567
|
defaultModel: "",
|
|
1403
|
-
run:
|
|
1568
|
+
run: run8
|
|
1404
1569
|
};
|
|
1405
1570
|
}
|
|
1406
1571
|
});
|
|
1407
|
-
async function
|
|
1572
|
+
async function run9(input, ctx) {
|
|
1408
1573
|
const product = await ctx.client.extractProduct(input.url);
|
|
1409
1574
|
const summary = [
|
|
1410
1575
|
`Product: ${product.name}`,
|
|
@@ -1421,13 +1586,13 @@ function truncate(input, max) {
|
|
|
1421
1586
|
if (input.length <= max) return input;
|
|
1422
1587
|
return input.slice(0, max - 3) + "...";
|
|
1423
1588
|
}
|
|
1424
|
-
var
|
|
1589
|
+
var InputSchema9, InputJsonSchema9, fromUrlSkill;
|
|
1425
1590
|
var init_from_url = __esm({
|
|
1426
1591
|
"src/skills/from-url.ts"() {
|
|
1427
|
-
|
|
1592
|
+
InputSchema9 = zod.z.object({
|
|
1428
1593
|
url: zod.z.string().min(1).max(2048).describe("Product page URL. Shopify, BigCommerce, WooCommerce, or any page with JSON-LD / OpenGraph product metadata.")
|
|
1429
1594
|
});
|
|
1430
|
-
|
|
1595
|
+
InputJsonSchema9 = {
|
|
1431
1596
|
type: "object",
|
|
1432
1597
|
properties: {
|
|
1433
1598
|
url: {
|
|
@@ -1440,12 +1605,12 @@ var init_from_url = __esm({
|
|
|
1440
1605
|
fromUrlSkill = {
|
|
1441
1606
|
name: "pixeldojo_from_url",
|
|
1442
1607
|
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.",
|
|
1443
|
-
inputZod:
|
|
1444
|
-
inputJsonSchema:
|
|
1608
|
+
inputZod: InputSchema9,
|
|
1609
|
+
inputJsonSchema: InputJsonSchema9,
|
|
1445
1610
|
// No model dispatch — this skill calls a server-side scrape, not a generation.
|
|
1446
1611
|
allowedModels: [],
|
|
1447
1612
|
defaultModel: "",
|
|
1448
|
-
run:
|
|
1613
|
+
run: run9
|
|
1449
1614
|
};
|
|
1450
1615
|
}
|
|
1451
1616
|
});
|
|
@@ -2008,7 +2173,7 @@ async function redoShots(input, ctx) {
|
|
|
2008
2173
|
followUp: keepGoing(filmId, 30, { soundtrack: input.soundtrack })
|
|
2009
2174
|
};
|
|
2010
2175
|
}
|
|
2011
|
-
async function
|
|
2176
|
+
async function run10(input, ctx) {
|
|
2012
2177
|
const action = input.action === "plan" && input.film_id ? input.cast?.length ? "cast" : "status" : input.action;
|
|
2013
2178
|
if (action === "plan") return plan(input, ctx);
|
|
2014
2179
|
if (!input.film_id) return { kind: "text", text: "produce/status/cast/redo need the film_id returned by the plan step." };
|
|
@@ -2028,7 +2193,7 @@ async function run9(input, ctx) {
|
|
|
2028
2193
|
if (action === "redo") return redoShots(input, ctx);
|
|
2029
2194
|
return advance(input.film_id, input.soundtrack, input.music_job_id, ctx);
|
|
2030
2195
|
}
|
|
2031
|
-
var STORY_LOOKS, MUSIC_VIDEO_LOOKS, LOOKS, MUSIC_CLIP_ENGINE_ID,
|
|
2196
|
+
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;
|
|
2032
2197
|
var init_film = __esm({
|
|
2033
2198
|
"src/skills/film.ts"() {
|
|
2034
2199
|
init_upload_helpers();
|
|
@@ -2036,7 +2201,7 @@ var init_film = __esm({
|
|
|
2036
2201
|
MUSIC_VIDEO_LOOKS = ["rap-video", "neon-club", "stage-performance", "retro-camcorder", "y2k-pop", "moody-rnb", "rock-grit", "dream-pop", "k-pop"];
|
|
2037
2202
|
LOOKS = [...STORY_LOOKS, ...MUSIC_VIDEO_LOOKS];
|
|
2038
2203
|
MUSIC_CLIP_ENGINE_ID = "minimax-h3-reference";
|
|
2039
|
-
|
|
2204
|
+
InputSchema10 = zod.z.object({
|
|
2040
2205
|
idea: zod.z.string().max(2e3).optional().describe("One-to-three sentence film idea. The studio writes the screenplay (free). Provide idea OR script for planning."),
|
|
2041
2206
|
script: zod.z.string().max(2e4).optional().describe("A full screenplay to plan instead of an idea (sluglines, action lines, dialogue)."),
|
|
2042
2207
|
look: zod.z.enum(LOOKS).optional().describe("Visual style carried through frames, clips, and soundtrack. Default live-action, or rap-video for a music video."),
|
|
@@ -2064,7 +2229,7 @@ var init_film = __esm({
|
|
|
2064
2229
|
soundtrack: zod.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."),
|
|
2065
2230
|
music_job_id: zod.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.")
|
|
2066
2231
|
});
|
|
2067
|
-
|
|
2232
|
+
InputJsonSchema10 = {
|
|
2068
2233
|
type: "object",
|
|
2069
2234
|
properties: {
|
|
2070
2235
|
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.` },
|
|
@@ -2178,11 +2343,11 @@ var init_film = __esm({
|
|
|
2178
2343
|
name: "pixeldojo_film",
|
|
2179
2344
|
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.",
|
|
2180
2345
|
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.",
|
|
2181
|
-
inputZod:
|
|
2182
|
-
inputJsonSchema:
|
|
2346
|
+
inputZod: InputSchema10,
|
|
2347
|
+
inputJsonSchema: InputJsonSchema10,
|
|
2183
2348
|
allowedModels: [],
|
|
2184
2349
|
defaultModel: "",
|
|
2185
|
-
run:
|
|
2350
|
+
run: run10
|
|
2186
2351
|
};
|
|
2187
2352
|
}
|
|
2188
2353
|
});
|
|
@@ -2269,7 +2434,7 @@ function buildVideoPayload(verb, apiId, i) {
|
|
|
2269
2434
|
};
|
|
2270
2435
|
}
|
|
2271
2436
|
}
|
|
2272
|
-
async function
|
|
2437
|
+
async function run11(input, ctx) {
|
|
2273
2438
|
const paramsGate = paramsWithoutModel(input.params, input.model);
|
|
2274
2439
|
if (paramsGate) return { kind: "text", text: paramsGate };
|
|
2275
2440
|
const verb = input.verb;
|
|
@@ -2332,7 +2497,7 @@ async function run10(input, ctx) {
|
|
|
2332
2497
|
notes.join(" ")
|
|
2333
2498
|
);
|
|
2334
2499
|
}
|
|
2335
|
-
var VIDEO_STUDIO_ENGINES, VERBS, BACKWARD_ENGINES, clamp, NEEDS_VIDEO_DURATION, NO_IMAGE_ENGINES,
|
|
2500
|
+
var VIDEO_STUDIO_ENGINES, VERBS, BACKWARD_ENGINES, clamp, NEEDS_VIDEO_DURATION, NO_IMAGE_ENGINES, InputSchema11, engineList, InputJsonSchema11, BASE_DESCRIPTION, videoSkill;
|
|
2336
2501
|
var init_video = __esm({
|
|
2337
2502
|
"src/skills/video.ts"() {
|
|
2338
2503
|
init_poll();
|
|
@@ -2366,7 +2531,7 @@ var init_video = __esm({
|
|
|
2366
2531
|
"wan-video-character-swap"
|
|
2367
2532
|
]);
|
|
2368
2533
|
NO_IMAGE_ENGINES = /* @__PURE__ */ new Set(["flux-video-edit", "xai-video-edit"]);
|
|
2369
|
-
|
|
2534
|
+
InputSchema11 = zod.z.object({
|
|
2370
2535
|
verb: zod.z.enum(VERBS),
|
|
2371
2536
|
prompt: zod.z.string().max(8e3).optional(),
|
|
2372
2537
|
video_url: zod.z.string().url().optional(),
|
|
@@ -2381,7 +2546,7 @@ var init_video = __esm({
|
|
|
2381
2546
|
params: ParamsInput
|
|
2382
2547
|
});
|
|
2383
2548
|
engineList = (verb) => `${verb}: ${VIDEO_STUDIO_ENGINES[verb].join(", ")} (default ${VIDEO_STUDIO_ENGINES[verb][0]})`;
|
|
2384
|
-
|
|
2549
|
+
InputJsonSchema11 = {
|
|
2385
2550
|
type: "object",
|
|
2386
2551
|
properties: {
|
|
2387
2552
|
verb: {
|
|
@@ -2442,11 +2607,11 @@ var init_video = __esm({
|
|
|
2442
2607
|
name: "pixeldojo_video",
|
|
2443
2608
|
description: `${BASE_DESCRIPTION} Local files: video_path / image_path (uploaded to 24h temp storage first).`,
|
|
2444
2609
|
hostedDescription: `${BASE_DESCRIPTION} Media must be public http(s) URLs.`,
|
|
2445
|
-
inputZod:
|
|
2446
|
-
inputJsonSchema:
|
|
2610
|
+
inputZod: InputSchema11,
|
|
2611
|
+
inputJsonSchema: InputJsonSchema11,
|
|
2447
2612
|
allowedModels: Array.from(new Set(VERBS.flatMap((v) => VIDEO_STUDIO_ENGINES[v]))),
|
|
2448
2613
|
defaultModel: VIDEO_STUDIO_ENGINES.change[0],
|
|
2449
|
-
run:
|
|
2614
|
+
run: run11
|
|
2450
2615
|
};
|
|
2451
2616
|
}
|
|
2452
2617
|
});
|
|
@@ -2621,14 +2786,14 @@ async function produce2(id, ctx) {
|
|
|
2621
2786
|
const musicNote = ep.musicEnabled && ep.music?.status === "failed" ? " The music bed failed, so this cut has no music." : "";
|
|
2622
2787
|
return { kind: "text", text: `Export started, free${prior}.${musicNote} ${next(id, "produce", "~60s")}` };
|
|
2623
2788
|
}
|
|
2624
|
-
async function
|
|
2789
|
+
async function run12(input, ctx) {
|
|
2625
2790
|
const action = input.action === "create" && input.episode_id ? "status" : input.action;
|
|
2626
2791
|
if (action === "create") return create(input, ctx);
|
|
2627
2792
|
if (!input.episode_id) return { kind: "text", text: "produce and status need the episode_id returned by the create step." };
|
|
2628
2793
|
if (action === "produce") return produce2(input.episode_id, ctx);
|
|
2629
2794
|
return status(input.episode_id, ctx);
|
|
2630
2795
|
}
|
|
2631
|
-
var STYLES2, CATEGORIES, ENGINES, MIN_SECONDS, MAX_SECONDS, MAX_IN_FLIGHT,
|
|
2796
|
+
var STYLES2, CATEGORIES, ENGINES, MIN_SECONDS, MAX_SECONDS, MAX_IN_FLIGHT, InputSchema12, InputJsonSchema12, call, next, needsRender, PLAN_POLL_MS, PLAN_MAX_POLLS, stillPlanning, episodeSkill;
|
|
2632
2797
|
var init_episode = __esm({
|
|
2633
2798
|
"src/skills/episode.ts"() {
|
|
2634
2799
|
STYLES2 = ["editorial-motion", "paper-diorama", "hand-drawn", "storybook", "poster-vector", "soft-3d"];
|
|
@@ -2637,7 +2802,7 @@ var init_episode = __esm({
|
|
|
2637
2802
|
MIN_SECONDS = 60;
|
|
2638
2803
|
MAX_SECONDS = 300;
|
|
2639
2804
|
MAX_IN_FLIGHT = 4;
|
|
2640
|
-
|
|
2805
|
+
InputSchema12 = zod.z.object({
|
|
2641
2806
|
action: zod.z.enum(["create", "produce", "status"]).default("create"),
|
|
2642
2807
|
topic: zod.z.string().min(8).max(400).optional(),
|
|
2643
2808
|
episode_id: zod.z.string().max(40).optional(),
|
|
@@ -2650,7 +2815,7 @@ var init_episode = __esm({
|
|
|
2650
2815
|
music: zod.z.boolean().default(true),
|
|
2651
2816
|
title: zod.z.string().max(120).optional()
|
|
2652
2817
|
});
|
|
2653
|
-
|
|
2818
|
+
InputJsonSchema12 = {
|
|
2654
2819
|
type: "object",
|
|
2655
2820
|
properties: {
|
|
2656
2821
|
action: {
|
|
@@ -2683,15 +2848,15 @@ var init_episode = __esm({
|
|
|
2683
2848
|
episodeSkill = {
|
|
2684
2849
|
name: "pixeldojo_episode",
|
|
2685
2850
|
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.",
|
|
2686
|
-
inputZod:
|
|
2687
|
-
inputJsonSchema:
|
|
2851
|
+
inputZod: InputSchema12,
|
|
2852
|
+
inputJsonSchema: InputJsonSchema12,
|
|
2688
2853
|
allowedModels: [],
|
|
2689
2854
|
defaultModel: "",
|
|
2690
|
-
run:
|
|
2855
|
+
run: run12
|
|
2691
2856
|
};
|
|
2692
2857
|
}
|
|
2693
2858
|
});
|
|
2694
|
-
async function
|
|
2859
|
+
async function run13(input, ctx) {
|
|
2695
2860
|
const productImages = [
|
|
2696
2861
|
...input.product_image_urls ?? [],
|
|
2697
2862
|
...await Promise.all((input.product_image_paths ?? []).map((p) => uploadLocalFile(p, ctx)))
|
|
@@ -2734,13 +2899,13 @@ async function run12(input, ctx) {
|
|
|
2734
2899
|
(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]}`
|
|
2735
2900
|
);
|
|
2736
2901
|
}
|
|
2737
|
-
var
|
|
2902
|
+
var InputSchema13, InputJsonSchema13, adSkill;
|
|
2738
2903
|
var init_ad = __esm({
|
|
2739
2904
|
"src/skills/ad.ts"() {
|
|
2740
2905
|
init_types();
|
|
2741
2906
|
init_poll();
|
|
2742
2907
|
init_upload_helpers();
|
|
2743
|
-
|
|
2908
|
+
InputSchema13 = zod.z.object({
|
|
2744
2909
|
style: zod.z.string().max(80).optional().describe(
|
|
2745
2910
|
"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."
|
|
2746
2911
|
),
|
|
@@ -2766,7 +2931,7 @@ var init_ad = __esm({
|
|
|
2766
2931
|
path: ["product_url"]
|
|
2767
2932
|
}
|
|
2768
2933
|
);
|
|
2769
|
-
|
|
2934
|
+
InputJsonSchema13 = {
|
|
2770
2935
|
type: "object",
|
|
2771
2936
|
properties: {
|
|
2772
2937
|
style: {
|
|
@@ -2853,16 +3018,16 @@ var init_ad = __esm({
|
|
|
2853
3018
|
name: "pixeldojo_ad",
|
|
2854
3019
|
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.",
|
|
2855
3020
|
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.",
|
|
2856
|
-
inputZod:
|
|
2857
|
-
inputJsonSchema:
|
|
3021
|
+
inputZod: InputSchema13,
|
|
3022
|
+
inputJsonSchema: InputJsonSchema13,
|
|
2858
3023
|
// Composition skill — the server routes to the ad engine internally.
|
|
2859
3024
|
allowedModels: [],
|
|
2860
3025
|
defaultModel: "",
|
|
2861
|
-
run:
|
|
3026
|
+
run: run13
|
|
2862
3027
|
};
|
|
2863
3028
|
}
|
|
2864
3029
|
});
|
|
2865
|
-
async function
|
|
3030
|
+
async function run14(input, ctx) {
|
|
2866
3031
|
const client = ctx.client;
|
|
2867
3032
|
const result = await client.runCampaign(input);
|
|
2868
3033
|
if (result.kind === "campaign") {
|
|
@@ -2889,10 +3054,10 @@ async function run13(input, ctx) {
|
|
|
2889
3054
|
statusUrl: result.statusUrl ?? ctx.buildStatusUrl(result.campaignId)
|
|
2890
3055
|
};
|
|
2891
3056
|
}
|
|
2892
|
-
var
|
|
3057
|
+
var InputSchema14, InputJsonSchema14, campaignSkill;
|
|
2893
3058
|
var init_campaign = __esm({
|
|
2894
3059
|
"src/skills/campaign.ts"() {
|
|
2895
|
-
|
|
3060
|
+
InputSchema14 = zod.z.object({
|
|
2896
3061
|
productUrl: zod.z.string().url().optional().describe("Product page URL. We extract name + description + images automatically."),
|
|
2897
3062
|
product: zod.z.object({
|
|
2898
3063
|
name: zod.z.string().min(1).max(200),
|
|
@@ -2908,7 +3073,7 @@ var init_campaign = __esm({
|
|
|
2908
3073
|
message: "productUrl or product is required",
|
|
2909
3074
|
path: ["productUrl"]
|
|
2910
3075
|
});
|
|
2911
|
-
|
|
3076
|
+
InputJsonSchema14 = {
|
|
2912
3077
|
type: "object",
|
|
2913
3078
|
properties: {
|
|
2914
3079
|
productUrl: {
|
|
@@ -2959,17 +3124,17 @@ var init_campaign = __esm({
|
|
|
2959
3124
|
campaignSkill = {
|
|
2960
3125
|
name: "pixeldojo_campaign",
|
|
2961
3126
|
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.",
|
|
2962
|
-
inputZod:
|
|
2963
|
-
inputJsonSchema:
|
|
3127
|
+
inputZod: InputSchema14,
|
|
3128
|
+
inputJsonSchema: InputJsonSchema14,
|
|
2964
3129
|
// Composition skill — internal sub-jobs route to per-tool models, no
|
|
2965
3130
|
// single allowed-models list applies here.
|
|
2966
3131
|
allowedModels: [],
|
|
2967
3132
|
defaultModel: "",
|
|
2968
|
-
run:
|
|
3133
|
+
run: run14
|
|
2969
3134
|
};
|
|
2970
3135
|
}
|
|
2971
3136
|
});
|
|
2972
|
-
async function
|
|
3137
|
+
async function run15(input, ctx) {
|
|
2973
3138
|
const client = ctx.client;
|
|
2974
3139
|
const result = await client.getCampaign(input.campaignId);
|
|
2975
3140
|
if (result.kind === "campaign") {
|
|
@@ -2999,13 +3164,13 @@ async function run14(input, ctx) {
|
|
|
2999
3164
|
statusUrl: result.statusUrl ?? ctx.buildStatusUrl(result.campaignId)
|
|
3000
3165
|
};
|
|
3001
3166
|
}
|
|
3002
|
-
var
|
|
3167
|
+
var InputSchema15, InputJsonSchema15, campaignStatusSkill;
|
|
3003
3168
|
var init_campaign_status = __esm({
|
|
3004
3169
|
"src/skills/campaign-status.ts"() {
|
|
3005
|
-
|
|
3170
|
+
InputSchema15 = zod.z.object({
|
|
3006
3171
|
campaignId: zod.z.string().min(1).max(200).describe("Campaign id returned from a prior pixeldojo_campaign handoff.")
|
|
3007
3172
|
});
|
|
3008
|
-
|
|
3173
|
+
InputJsonSchema15 = {
|
|
3009
3174
|
type: "object",
|
|
3010
3175
|
properties: {
|
|
3011
3176
|
campaignId: {
|
|
@@ -3018,15 +3183,15 @@ var init_campaign_status = __esm({
|
|
|
3018
3183
|
campaignStatusSkill = {
|
|
3019
3184
|
name: "pixeldojo_campaign_status",
|
|
3020
3185
|
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.",
|
|
3021
|
-
inputZod:
|
|
3022
|
-
inputJsonSchema:
|
|
3186
|
+
inputZod: InputSchema15,
|
|
3187
|
+
inputJsonSchema: InputJsonSchema15,
|
|
3023
3188
|
allowedModels: [],
|
|
3024
3189
|
defaultModel: "",
|
|
3025
|
-
run:
|
|
3190
|
+
run: run15
|
|
3026
3191
|
};
|
|
3027
3192
|
}
|
|
3028
3193
|
});
|
|
3029
|
-
async function
|
|
3194
|
+
async function run16(input, ctx) {
|
|
3030
3195
|
let url;
|
|
3031
3196
|
try {
|
|
3032
3197
|
url = await uploadLocalFile(input.path, ctx);
|
|
@@ -3042,16 +3207,16 @@ async function run15(input, ctx) {
|
|
|
3042
3207
|
(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.)`
|
|
3043
3208
|
};
|
|
3044
3209
|
}
|
|
3045
|
-
var
|
|
3210
|
+
var InputSchema16, InputJsonSchema16, uploadSkill;
|
|
3046
3211
|
var init_upload = __esm({
|
|
3047
3212
|
"src/skills/upload.ts"() {
|
|
3048
3213
|
init_upload_helpers();
|
|
3049
|
-
|
|
3214
|
+
InputSchema16 = zod.z.object({
|
|
3050
3215
|
path: zod.z.string().min(1).max(4096).describe(
|
|
3051
3216
|
"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."
|
|
3052
3217
|
)
|
|
3053
3218
|
});
|
|
3054
|
-
|
|
3219
|
+
InputJsonSchema16 = {
|
|
3055
3220
|
type: "object",
|
|
3056
3221
|
properties: {
|
|
3057
3222
|
path: {
|
|
@@ -3064,15 +3229,15 @@ var init_upload = __esm({
|
|
|
3064
3229
|
uploadSkill = {
|
|
3065
3230
|
name: "pixeldojo_upload",
|
|
3066
3231
|
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.",
|
|
3067
|
-
inputZod:
|
|
3068
|
-
inputJsonSchema:
|
|
3232
|
+
inputZod: InputSchema16,
|
|
3233
|
+
inputJsonSchema: InputJsonSchema16,
|
|
3069
3234
|
allowedModels: [],
|
|
3070
3235
|
defaultModel: "",
|
|
3071
|
-
run:
|
|
3236
|
+
run: run16
|
|
3072
3237
|
};
|
|
3073
3238
|
}
|
|
3074
3239
|
});
|
|
3075
|
-
async function
|
|
3240
|
+
async function run17(input, ctx) {
|
|
3076
3241
|
const requested = input.model ?? DEFAULT_MODEL6;
|
|
3077
3242
|
if (!ALLOWED4.includes(requested)) {
|
|
3078
3243
|
return {
|
|
@@ -3110,14 +3275,14 @@ async function run16(input, ctx) {
|
|
|
3110
3275
|
(urls) => urls.length === 0 ? `Job ${submitted.jobId} completed but returned no assets.` : `Audio ready. Asset: ${urls[0]}`
|
|
3111
3276
|
);
|
|
3112
3277
|
}
|
|
3113
|
-
var ALLOWED4, DEFAULT_MODEL6,
|
|
3278
|
+
var ALLOWED4, DEFAULT_MODEL6, InputSchema17, InputJsonSchema17, audioSkill;
|
|
3114
3279
|
var init_audio = __esm({
|
|
3115
3280
|
"src/skills/audio.ts"() {
|
|
3116
3281
|
init_poll();
|
|
3117
3282
|
init_types();
|
|
3118
3283
|
ALLOWED4 = ["seed-audio", "text-to-speech"];
|
|
3119
3284
|
DEFAULT_MODEL6 = "seed-audio";
|
|
3120
|
-
|
|
3285
|
+
InputSchema17 = zod.z.object({
|
|
3121
3286
|
prompt: zod.z.string().min(1).describe(
|
|
3122
3287
|
"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."
|
|
3123
3288
|
),
|
|
@@ -3127,7 +3292,7 @@ var init_audio = __esm({
|
|
|
3127
3292
|
output_format: zod.z.string().optional().describe("Output format. seed-audio: mp3 (default), wav, pcm, ogg_opus. text-to-speech: mp3 (default), wav, flac, pcm."),
|
|
3128
3293
|
speed: zod.z.number().min(0.5).max(2).optional().describe("Speech speed multiplier, 0.5-2 (default 1). Both models.")
|
|
3129
3294
|
});
|
|
3130
|
-
|
|
3295
|
+
InputJsonSchema17 = {
|
|
3131
3296
|
type: "object",
|
|
3132
3297
|
properties: {
|
|
3133
3298
|
prompt: {
|
|
@@ -3165,15 +3330,15 @@ var init_audio = __esm({
|
|
|
3165
3330
|
audioSkill = {
|
|
3166
3331
|
name: "pixeldojo_audio",
|
|
3167
3332
|
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.",
|
|
3168
|
-
inputZod:
|
|
3169
|
-
inputJsonSchema:
|
|
3333
|
+
inputZod: InputSchema17,
|
|
3334
|
+
inputJsonSchema: InputJsonSchema17,
|
|
3170
3335
|
allowedModels: [...ALLOWED4],
|
|
3171
3336
|
defaultModel: DEFAULT_MODEL6,
|
|
3172
|
-
run:
|
|
3337
|
+
run: run17
|
|
3173
3338
|
};
|
|
3174
3339
|
}
|
|
3175
3340
|
});
|
|
3176
|
-
async function
|
|
3341
|
+
async function run18(input, ctx) {
|
|
3177
3342
|
if (input.source === "characters") {
|
|
3178
3343
|
const { characters } = await ctx.client.listCharacters({ q: input.q, limit: input.limit ?? 25 });
|
|
3179
3344
|
if (characters.length === 0) {
|
|
@@ -3224,17 +3389,17 @@ ${lines.join("\n")}
|
|
|
3224
3389
|
Pass any URL back into pixeldojo_generate, pixeldojo_edit, pixeldojo_character, or pixeldojo_upscale as a reference input.`
|
|
3225
3390
|
};
|
|
3226
3391
|
}
|
|
3227
|
-
var
|
|
3392
|
+
var InputSchema18, InputJsonSchema18, librarySkill;
|
|
3228
3393
|
var init_library = __esm({
|
|
3229
3394
|
"src/skills/library.ts"() {
|
|
3230
|
-
|
|
3395
|
+
InputSchema18 = zod.z.object({
|
|
3231
3396
|
source: zod.z.enum(["media", "characters"]).optional().describe("media (default): saved and recent results. characters: saved Character Studio characters and elements, usable as @Name in prompts."),
|
|
3232
3397
|
q: zod.z.string().optional().describe("Substring match against the prompt that produced the asset."),
|
|
3233
3398
|
model: zod.z.string().optional().describe("Restrict to a single model (apiId)."),
|
|
3234
3399
|
modality: zod.z.enum(["image", "video", "audio"]).optional().describe("Restrict to one output type."),
|
|
3235
3400
|
limit: zod.z.number().int().min(1).max(50).optional().describe("Max results (default 10).")
|
|
3236
3401
|
});
|
|
3237
|
-
|
|
3402
|
+
InputJsonSchema18 = {
|
|
3238
3403
|
type: "object",
|
|
3239
3404
|
properties: {
|
|
3240
3405
|
source: {
|
|
@@ -3259,15 +3424,15 @@ var init_library = __esm({
|
|
|
3259
3424
|
librarySkill = {
|
|
3260
3425
|
name: "pixeldojo_library",
|
|
3261
3426
|
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.",
|
|
3262
|
-
inputZod:
|
|
3263
|
-
inputJsonSchema:
|
|
3427
|
+
inputZod: InputSchema18,
|
|
3428
|
+
inputJsonSchema: InputJsonSchema18,
|
|
3264
3429
|
allowedModels: [],
|
|
3265
3430
|
defaultModel: "",
|
|
3266
|
-
run:
|
|
3431
|
+
run: run18
|
|
3267
3432
|
};
|
|
3268
3433
|
}
|
|
3269
3434
|
});
|
|
3270
|
-
async function
|
|
3435
|
+
async function run19(input, ctx) {
|
|
3271
3436
|
const res = await ctx.client.saveMedia({
|
|
3272
3437
|
url: input.url,
|
|
3273
3438
|
prompt: input.prompt,
|
|
@@ -3281,17 +3446,17 @@ async function run18(input, ctx) {
|
|
|
3281
3446
|
It will appear at https://pixeldojo.ai/my-images and in pixeldojo_library searches.`
|
|
3282
3447
|
};
|
|
3283
3448
|
}
|
|
3284
|
-
var
|
|
3449
|
+
var InputSchema19, InputJsonSchema19, saveSkill;
|
|
3285
3450
|
var init_save = __esm({
|
|
3286
3451
|
"src/skills/save.ts"() {
|
|
3287
|
-
|
|
3452
|
+
InputSchema19 = zod.z.object({
|
|
3288
3453
|
url: zod.z.string().url().describe("The asset URL to save (image or video)."),
|
|
3289
3454
|
prompt: zod.z.string().optional().describe("The prompt that produced it \u2014 makes it findable in the library later."),
|
|
3290
3455
|
tool_name: zod.z.string().optional().describe("Tool/model slug that produced it."),
|
|
3291
3456
|
modality: zod.z.enum(["image", "video", "audio"]).optional(),
|
|
3292
3457
|
job_id: zod.z.string().optional().describe("The jobId that produced this asset, when known.")
|
|
3293
3458
|
});
|
|
3294
|
-
|
|
3459
|
+
InputJsonSchema19 = {
|
|
3295
3460
|
type: "object",
|
|
3296
3461
|
properties: {
|
|
3297
3462
|
url: { type: "string", format: "uri", description: "The result URL to keep (image or video from a PixelDojo job)." },
|
|
@@ -3305,15 +3470,15 @@ var init_save = __esm({
|
|
|
3305
3470
|
saveSkill = {
|
|
3306
3471
|
name: "pixeldojo_save",
|
|
3307
3472
|
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.`,
|
|
3308
|
-
inputZod:
|
|
3309
|
-
inputJsonSchema:
|
|
3473
|
+
inputZod: InputSchema19,
|
|
3474
|
+
inputJsonSchema: InputJsonSchema19,
|
|
3310
3475
|
allowedModels: [],
|
|
3311
3476
|
defaultModel: "",
|
|
3312
|
-
run:
|
|
3477
|
+
run: run19
|
|
3313
3478
|
};
|
|
3314
3479
|
}
|
|
3315
3480
|
});
|
|
3316
|
-
async function
|
|
3481
|
+
async function run20(input, ctx) {
|
|
3317
3482
|
const res = await ctx.client.saveCharacter({
|
|
3318
3483
|
name: input.name,
|
|
3319
3484
|
kind: input.kind ?? "character",
|
|
@@ -3325,17 +3490,17 @@ async function run19(input, ctx) {
|
|
|
3325
3490
|
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.`
|
|
3326
3491
|
};
|
|
3327
3492
|
}
|
|
3328
|
-
var KINDS,
|
|
3493
|
+
var KINDS, InputSchema20, InputJsonSchema20, saveCharacterSkill;
|
|
3329
3494
|
var init_save_character = __esm({
|
|
3330
3495
|
"src/skills/save-character.ts"() {
|
|
3331
3496
|
KINDS = ["character", "product", "outfit", "location", "object", "style"];
|
|
3332
|
-
|
|
3497
|
+
InputSchema20 = zod.z.object({
|
|
3333
3498
|
name: zod.z.string().min(1).max(60).describe("What to call it. Used as @Name in prompts."),
|
|
3334
3499
|
kind: zod.z.enum(KINDS).optional().describe("Default character."),
|
|
3335
3500
|
image_urls: zod.z.array(zod.z.string().url()).max(8).optional().describe("3 to 5 photos from different angles works best for a character."),
|
|
3336
3501
|
description: zod.z.string().max(1500).optional().describe("Appearance notes, or the scene text for an element.")
|
|
3337
3502
|
});
|
|
3338
|
-
|
|
3503
|
+
InputJsonSchema20 = {
|
|
3339
3504
|
type: "object",
|
|
3340
3505
|
properties: {
|
|
3341
3506
|
name: { type: "string", description: "What to call it. Used as @Name in prompts afterwards." },
|
|
@@ -3353,11 +3518,11 @@ var init_save_character = __esm({
|
|
|
3353
3518
|
saveCharacterSkill = {
|
|
3354
3519
|
name: "pixeldojo_save_character",
|
|
3355
3520
|
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.",
|
|
3356
|
-
inputZod:
|
|
3357
|
-
inputJsonSchema:
|
|
3521
|
+
inputZod: InputSchema20,
|
|
3522
|
+
inputJsonSchema: InputJsonSchema20,
|
|
3358
3523
|
allowedModels: [],
|
|
3359
3524
|
defaultModel: "",
|
|
3360
|
-
run:
|
|
3525
|
+
run: run20
|
|
3361
3526
|
};
|
|
3362
3527
|
}
|
|
3363
3528
|
});
|
|
@@ -3617,6 +3782,7 @@ __export(skills_exports, {
|
|
|
3617
3782
|
generateSkill: () => generateSkill,
|
|
3618
3783
|
librarySkill: () => librarySkill,
|
|
3619
3784
|
listWorkflowsSkill: () => listWorkflowsSkill,
|
|
3785
|
+
overlaySkill: () => overlaySkill,
|
|
3620
3786
|
runWorkflowSkill: () => runWorkflowSkill,
|
|
3621
3787
|
saveCharacterSkill: () => saveCharacterSkill,
|
|
3622
3788
|
saveSkill: () => saveSkill,
|
|
@@ -3655,6 +3821,7 @@ var init_skills = __esm({
|
|
|
3655
3821
|
init_storyboard();
|
|
3656
3822
|
init_upscale();
|
|
3657
3823
|
init_caption();
|
|
3824
|
+
init_overlay();
|
|
3658
3825
|
init_status();
|
|
3659
3826
|
init_from_url();
|
|
3660
3827
|
init_film();
|
|
@@ -3676,6 +3843,7 @@ var init_skills = __esm({
|
|
|
3676
3843
|
storyboardSkill,
|
|
3677
3844
|
upscaleSkill,
|
|
3678
3845
|
captionSkill,
|
|
3846
|
+
overlaySkill,
|
|
3679
3847
|
audioSkill,
|
|
3680
3848
|
librarySkill,
|
|
3681
3849
|
saveSkill,
|
|
@@ -3716,6 +3884,7 @@ var init_skills = __esm({
|
|
|
3716
3884
|
pixeldojo_storyboard: render("Storyboard preview video"),
|
|
3717
3885
|
pixeldojo_upscale: render("Upscale image or video"),
|
|
3718
3886
|
pixeldojo_caption: render("Caption video"),
|
|
3887
|
+
pixeldojo_overlay: render("Add offer or end card"),
|
|
3719
3888
|
pixeldojo_audio: render("Generate music, speech or sound"),
|
|
3720
3889
|
pixeldojo_video: render("Change, animate or extend video"),
|
|
3721
3890
|
pixeldojo_ad: render("Make video ad"),
|
|
@@ -3786,7 +3955,7 @@ function makeRedactedLogger(target = console) {
|
|
|
3786
3955
|
}
|
|
3787
3956
|
|
|
3788
3957
|
// src/server.ts
|
|
3789
|
-
var PACKAGE_VERSION = "0.
|
|
3958
|
+
var PACKAGE_VERSION = "0.23.0" ;
|
|
3790
3959
|
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.";
|
|
3791
3960
|
function buildServer(options) {
|
|
3792
3961
|
if (!options.apiKey) {
|
|
@@ -3959,6 +4128,7 @@ function printInit() {
|
|
|
3959
4128
|
`# pixeldojo_storyboard Multi-shot scenes from one brief.`,
|
|
3960
4129
|
`# pixeldojo_upscale Enhance any image or video.`,
|
|
3961
4130
|
`# pixeldojo_caption Animated word-by-word captions on a video.`,
|
|
4131
|
+
`# pixeldojo_overlay Offer callout and branded end card on a video.`,
|
|
3962
4132
|
`# pixeldojo_audio Voices + effects + music in one clip.`,
|
|
3963
4133
|
`# pixeldojo_library Search your saved media + generations.`,
|
|
3964
4134
|
`# pixeldojo_*_workflow Save / run / list multi-step chains.`,
|