@koda-sl/baker-cli 0.555.0 → 0.556.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 +5 -1
- package/dist/{ads-7QKQEHKT.js → ads-CWKKIYD6.js} +5 -5
- package/dist/{analytics-B6ER4TQ7.js → analytics-XPU5SANS.js} +6 -6
- package/dist/{avatars-Y3DALQIU.js → avatars-3OMFIKOJ.js} +1 -1
- package/dist/{brief-NA3E2W4P.js → brief-TNOKTNFJ.js} +8 -8
- package/dist/{canvas-WHFDCHUP.js → canvas-PVNQ7YWV.js} +11 -11
- package/dist/{chatgpt-YBHXCXWZ.js → chatgpt-6KBW7F5S.js} +2 -2
- package/dist/{chunk-OBQ5YUOZ.js → chunk-7WDH6OKW.js} +2 -2
- package/dist/{chunk-KT5JVIPZ.js → chunk-AMM4JMSN.js} +2 -2
- package/dist/{chunk-3HKZU3Y5.js → chunk-AU3IMZZC.js} +2 -2
- package/dist/chunk-EGVWSAWY.js +83 -0
- package/dist/chunk-EGVWSAWY.js.map +1 -0
- package/dist/{chunk-DAMC4FKK.js → chunk-KLO36KTV.js} +2 -2
- package/dist/{chunk-U6G6ALXP.js → chunk-MAVT2CJ4.js} +3 -3
- package/dist/{chunk-WIOPEK7K.js → chunk-MJDN7CR7.js} +3 -3
- package/dist/{chunk-6PT22YSR.js → chunk-QAJFMVGU.js} +2 -2
- package/dist/{chunk-XYKODRQR.js → chunk-TRAMBRVO.js} +3 -3
- package/dist/chunk-VN3WDB4O.js +45 -0
- package/dist/chunk-VN3WDB4O.js.map +1 -0
- package/dist/{chunk-KOEXPN3G.js → chunk-ZC6FICZ7.js} +5 -5
- package/dist/{chunk-6WVYBY2G.js → chunk-ZEGWP4FP.js} +6 -6
- package/dist/cli.js +18 -18
- package/dist/{conversions-CRL327RY.js → conversions-UGRVDRWU.js} +1 -1
- package/dist/{creatives-LTIV3XPT.js → creatives-IFOPXTZK.js} +6 -6
- package/dist/{creatives-Y2WLGDJW.js → creatives-WBBN6G7H.js} +8 -2
- package/dist/{creatives-Y2WLGDJW.js.map → creatives-WBBN6G7H.js.map} +1 -1
- package/dist/{critique-RFTS2I46.js → critique-PQRVFC52.js} +3 -3
- package/dist/{experiment-3NDXGQK6.js → experiment-O6726OBP.js} +4 -4
- package/dist/{feedback-QSIPSNAL.js → feedback-MXUZWVOL.js} +7 -7
- package/dist/{feedback-record-DJHJWJAF.js → feedback-record-76RUAHZH.js} +7 -7
- package/dist/{ga4-IJ2UUICC.js → ga4-XFJO7VK2.js} +1 -1
- package/dist/{gsc-YAU4EA75.js → gsc-ILEIJYWP.js} +1 -1
- package/dist/{images-VUWUKGD6.js → images-Z7YBWRVJ.js} +1 -1
- package/dist/{inspiration-DNWTXEPX.js → inspiration-WGUU7W5Z.js} +2 -2
- package/dist/{landing-L3WDTW4D.js → landing-5RRWTSWK.js} +2 -2
- package/dist/{linkedin-RONIUYLJ.js → linkedin-DJ4VDOF4.js} +16 -2
- package/dist/linkedin-DJ4VDOF4.js.map +1 -0
- package/dist/{make-ZIJQZD5K.js → make-HZ5KAYSB.js} +28 -28
- package/dist/{media-sources-L4BI7HFL.js → media-sources-DEEKEJUB.js} +1 -1
- package/dist/{meta-2GJZPVKM.js → meta-XUHI3E3L.js} +3 -3
- package/dist/{meta-2GJZPVKM.js.map → meta-XUHI3E3L.js.map} +1 -1
- package/dist/{posts-MVCGZV54.js → posts-F7NFSUHV.js} +1 -1
- package/dist/preview-IBNFQ5RQ.js +101 -0
- package/dist/preview-IBNFQ5RQ.js.map +1 -0
- package/dist/{preview-DMTQR6ZW.js → preview-OV2EZ6YF.js} +43 -16
- package/dist/preview-OV2EZ6YF.js.map +1 -0
- package/dist/{rerun-MA2GB6WL.js → rerun-X7XVOAL3.js} +8 -8
- package/dist/{research-WWJUNYSJ.js → research-JMU4C4JZ.js} +1 -1
- package/dist/{run-HENSSAQW.js → run-3GCYZ2HX.js} +8 -8
- package/dist/{scaffold-ad-QQBCUYUO.js → scaffold-ad-E6DD6U46.js} +4 -4
- package/dist/{scaffold-static-ad-WUOAQEXS.js → scaffold-static-ad-6WNS2PXB.js} +11 -11
- package/dist/{scaffold-video-KFQAKQUO.js → scaffold-video-QKXFQ5FC.js} +4 -4
- package/dist/{scrape-FQUGOXCG.js → scrape-O4X6VGV2.js} +7 -39
- package/dist/scrape-O4X6VGV2.js.map +1 -0
- package/dist/{select-K2SXPDDJ.js → select-ABRNFFR2.js} +6 -6
- package/dist/{set-prompt-BZFOV3EB.js → set-prompt-5LYHDT4E.js} +3 -3
- package/dist/{shopify-Q7TQIQ6N.js → shopify-L4ZUI6OT.js} +4 -4
- package/dist/{sources-DTQ4NQAM.js → sources-6TWWOO7Q.js} +1 -1
- package/dist/{stale-5O7BQVTN.js → stale-MLQPXNLZ.js} +5 -5
- package/dist/{studio-IDXFTGHP.js → studio-ZLBBYHNY.js} +1 -1
- package/dist/{sync-definition-Q3XUSEZJ.js → sync-definition-MXVL2I2H.js} +4 -4
- package/dist/{testimonials-KLF3Y4QO.js → testimonials-RIJSQDSB.js} +2 -2
- package/dist/{translate-CBITGC7C.js → translate-A4GHRHSP.js} +10 -10
- package/dist/{validate-SAQEORZY.js → validate-44PVFQH7.js} +6 -6
- package/dist/{videos-GOIDZVVD.js → videos-RWPQVXS5.js} +1 -1
- package/dist/{winning-ads-LOMI72Q2.js → winning-ads-IT3O4EAN.js} +1 -1
- package/dist/{x-APVY4YHX.js → x-X7URL52T.js} +1 -1
- package/package.json +1 -1
- package/dist/linkedin-RONIUYLJ.js.map +0 -1
- package/dist/preview-DMTQR6ZW.js.map +0 -1
- package/dist/scrape-FQUGOXCG.js.map +0 -1
- /package/dist/{ads-7QKQEHKT.js.map → ads-CWKKIYD6.js.map} +0 -0
- /package/dist/{analytics-B6ER4TQ7.js.map → analytics-XPU5SANS.js.map} +0 -0
- /package/dist/{avatars-Y3DALQIU.js.map → avatars-3OMFIKOJ.js.map} +0 -0
- /package/dist/{brief-NA3E2W4P.js.map → brief-TNOKTNFJ.js.map} +0 -0
- /package/dist/{canvas-WHFDCHUP.js.map → canvas-PVNQ7YWV.js.map} +0 -0
- /package/dist/{chatgpt-YBHXCXWZ.js.map → chatgpt-6KBW7F5S.js.map} +0 -0
- /package/dist/{chunk-OBQ5YUOZ.js.map → chunk-7WDH6OKW.js.map} +0 -0
- /package/dist/{chunk-KT5JVIPZ.js.map → chunk-AMM4JMSN.js.map} +0 -0
- /package/dist/{chunk-3HKZU3Y5.js.map → chunk-AU3IMZZC.js.map} +0 -0
- /package/dist/{chunk-DAMC4FKK.js.map → chunk-KLO36KTV.js.map} +0 -0
- /package/dist/{chunk-U6G6ALXP.js.map → chunk-MAVT2CJ4.js.map} +0 -0
- /package/dist/{chunk-WIOPEK7K.js.map → chunk-MJDN7CR7.js.map} +0 -0
- /package/dist/{chunk-6PT22YSR.js.map → chunk-QAJFMVGU.js.map} +0 -0
- /package/dist/{chunk-XYKODRQR.js.map → chunk-TRAMBRVO.js.map} +0 -0
- /package/dist/{chunk-KOEXPN3G.js.map → chunk-ZC6FICZ7.js.map} +0 -0
- /package/dist/{chunk-6WVYBY2G.js.map → chunk-ZEGWP4FP.js.map} +0 -0
- /package/dist/{conversions-CRL327RY.js.map → conversions-UGRVDRWU.js.map} +0 -0
- /package/dist/{creatives-LTIV3XPT.js.map → creatives-IFOPXTZK.js.map} +0 -0
- /package/dist/{critique-RFTS2I46.js.map → critique-PQRVFC52.js.map} +0 -0
- /package/dist/{experiment-3NDXGQK6.js.map → experiment-O6726OBP.js.map} +0 -0
- /package/dist/{feedback-QSIPSNAL.js.map → feedback-MXUZWVOL.js.map} +0 -0
- /package/dist/{feedback-record-DJHJWJAF.js.map → feedback-record-76RUAHZH.js.map} +0 -0
- /package/dist/{ga4-IJ2UUICC.js.map → ga4-XFJO7VK2.js.map} +0 -0
- /package/dist/{gsc-YAU4EA75.js.map → gsc-ILEIJYWP.js.map} +0 -0
- /package/dist/{images-VUWUKGD6.js.map → images-Z7YBWRVJ.js.map} +0 -0
- /package/dist/{inspiration-DNWTXEPX.js.map → inspiration-WGUU7W5Z.js.map} +0 -0
- /package/dist/{landing-L3WDTW4D.js.map → landing-5RRWTSWK.js.map} +0 -0
- /package/dist/{make-ZIJQZD5K.js.map → make-HZ5KAYSB.js.map} +0 -0
- /package/dist/{media-sources-L4BI7HFL.js.map → media-sources-DEEKEJUB.js.map} +0 -0
- /package/dist/{posts-MVCGZV54.js.map → posts-F7NFSUHV.js.map} +0 -0
- /package/dist/{rerun-MA2GB6WL.js.map → rerun-X7XVOAL3.js.map} +0 -0
- /package/dist/{research-WWJUNYSJ.js.map → research-JMU4C4JZ.js.map} +0 -0
- /package/dist/{run-HENSSAQW.js.map → run-3GCYZ2HX.js.map} +0 -0
- /package/dist/{scaffold-ad-QQBCUYUO.js.map → scaffold-ad-E6DD6U46.js.map} +0 -0
- /package/dist/{scaffold-static-ad-WUOAQEXS.js.map → scaffold-static-ad-6WNS2PXB.js.map} +0 -0
- /package/dist/{scaffold-video-KFQAKQUO.js.map → scaffold-video-QKXFQ5FC.js.map} +0 -0
- /package/dist/{select-K2SXPDDJ.js.map → select-ABRNFFR2.js.map} +0 -0
- /package/dist/{set-prompt-BZFOV3EB.js.map → set-prompt-5LYHDT4E.js.map} +0 -0
- /package/dist/{shopify-Q7TQIQ6N.js.map → shopify-L4ZUI6OT.js.map} +0 -0
- /package/dist/{sources-DTQ4NQAM.js.map → sources-6TWWOO7Q.js.map} +0 -0
- /package/dist/{stale-5O7BQVTN.js.map → stale-MLQPXNLZ.js.map} +0 -0
- /package/dist/{studio-IDXFTGHP.js.map → studio-ZLBBYHNY.js.map} +0 -0
- /package/dist/{sync-definition-Q3XUSEZJ.js.map → sync-definition-MXVL2I2H.js.map} +0 -0
- /package/dist/{testimonials-KLF3Y4QO.js.map → testimonials-RIJSQDSB.js.map} +0 -0
- /package/dist/{translate-CBITGC7C.js.map → translate-A4GHRHSP.js.map} +0 -0
- /package/dist/{validate-SAQEORZY.js.map → validate-44PVFQH7.js.map} +0 -0
- /package/dist/{videos-GOIDZVVD.js.map → videos-RWPQVXS5.js.map} +0 -0
- /package/dist/{winning-ads-LOMI72Q2.js.map → winning-ads-IT3O4EAN.js.map} +0 -0
- /package/dist/{x-APVY4YHX.js.map → x-X7URL52T.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
scaffoldDelivery
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-AMM4JMSN.js";
|
|
4
4
|
import {
|
|
5
5
|
buildSearchBody
|
|
6
6
|
} from "./chunk-LK5OKVCM.js";
|
|
@@ -17,29 +17,10 @@ import {
|
|
|
17
17
|
import {
|
|
18
18
|
makeSeriesAd,
|
|
19
19
|
seriesMadeEnvelope
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-QAJFMVGU.js";
|
|
21
21
|
import {
|
|
22
22
|
runBaker
|
|
23
|
-
} from "./chunk-
|
|
24
|
-
import "./chunk-OBQ5YUOZ.js";
|
|
25
|
-
import "./chunk-EJBLF2LI.js";
|
|
26
|
-
import {
|
|
27
|
-
parseDefinitionDelivery,
|
|
28
|
-
parseDefinitionSourceFields,
|
|
29
|
-
platformsNamedIn,
|
|
30
|
-
projectAdaptBriefs,
|
|
31
|
-
projectFormatBriefs,
|
|
32
|
-
projectStaticBriefs,
|
|
33
|
-
recordedShape,
|
|
34
|
-
reroutedOnSpec,
|
|
35
|
-
thinkingOutline,
|
|
36
|
-
withThinking
|
|
37
|
-
} from "./chunk-6WVYBY2G.js";
|
|
38
|
-
import "./chunk-HLHR3EK2.js";
|
|
39
|
-
import {
|
|
40
|
-
storeProductReads
|
|
41
|
-
} from "./chunk-QFODAMYR.js";
|
|
42
|
-
import "./chunk-EKX37C3T.js";
|
|
23
|
+
} from "./chunk-MJDN7CR7.js";
|
|
43
24
|
import {
|
|
44
25
|
audienceQuery,
|
|
45
26
|
definitionFieldsOf,
|
|
@@ -63,6 +44,30 @@ import {
|
|
|
63
44
|
whyUnfit,
|
|
64
45
|
withFitConcept
|
|
65
46
|
} from "./chunk-X3YYZLBH.js";
|
|
47
|
+
import "./chunk-7WDH6OKW.js";
|
|
48
|
+
import "./chunk-EJBLF2LI.js";
|
|
49
|
+
import {
|
|
50
|
+
parseDefinitionDelivery,
|
|
51
|
+
parseDefinitionSourceFields,
|
|
52
|
+
platformsNamedIn,
|
|
53
|
+
projectAdaptBriefs,
|
|
54
|
+
projectFormatBriefs,
|
|
55
|
+
projectStaticBriefs,
|
|
56
|
+
recordedShape,
|
|
57
|
+
reroutedOnSpec,
|
|
58
|
+
thinkingOutline,
|
|
59
|
+
withThinking
|
|
60
|
+
} from "./chunk-ZEGWP4FP.js";
|
|
61
|
+
import "./chunk-HLHR3EK2.js";
|
|
62
|
+
import {
|
|
63
|
+
liveViewerLookups,
|
|
64
|
+
readPersonas
|
|
65
|
+
} from "./chunk-2QGGI7MF.js";
|
|
66
|
+
import "./chunk-CH44XVPE.js";
|
|
67
|
+
import {
|
|
68
|
+
storeProductReads
|
|
69
|
+
} from "./chunk-QFODAMYR.js";
|
|
70
|
+
import "./chunk-EKX37C3T.js";
|
|
66
71
|
import {
|
|
67
72
|
IDEAS_DIR,
|
|
68
73
|
coverageOf,
|
|
@@ -72,11 +77,6 @@ import {
|
|
|
72
77
|
readKnowledgeCorpus,
|
|
73
78
|
readPersonaIds
|
|
74
79
|
} from "./chunk-Q5DFEVLE.js";
|
|
75
|
-
import {
|
|
76
|
-
liveViewerLookups,
|
|
77
|
-
readPersonas
|
|
78
|
-
} from "./chunk-2QGGI7MF.js";
|
|
79
|
-
import "./chunk-CH44XVPE.js";
|
|
80
80
|
import {
|
|
81
81
|
castInventory,
|
|
82
82
|
companyName
|
|
@@ -1364,4 +1364,4 @@ export {
|
|
|
1364
1364
|
startsFromIdea,
|
|
1365
1365
|
unbuiltReference
|
|
1366
1366
|
};
|
|
1367
|
-
//# sourceMappingURL=make-
|
|
1367
|
+
//# sourceMappingURL=make-HZ5KAYSB.js.map
|
|
@@ -73,7 +73,7 @@ A/B tests (Meta splits the audience between versions and calls the winner):
|
|
|
73
73
|
|
|
74
74
|
Audit & review:
|
|
75
75
|
baker ads meta activities --account-id act_123 --days 14
|
|
76
|
-
baker ads meta preview --
|
|
76
|
+
baker ads meta preview --ad-id 9988 --ad-format MOBILE_FEED_STANDARD \u2014 SEE the ad: displayed text + a picture
|
|
77
77
|
Full guide: __tooling__/docs/tools/baker/ads-meta.md`
|
|
78
78
|
},
|
|
79
79
|
subCommands: {
|
|
@@ -93,7 +93,7 @@ Full guide: __tooling__/docs/tools/baker/ads-meta.md`
|
|
|
93
93
|
pixels: () => import("./pixels-IGJFC2XC.js").then((m) => m.pixelsCommand),
|
|
94
94
|
activities: () => import("./activities-ORMACIG2.js").then((m) => m.activitiesCommand),
|
|
95
95
|
insights: () => import("./insights-U6QAA77O.js").then((m) => m.insightsCommand),
|
|
96
|
-
preview: () => import("./preview-
|
|
96
|
+
preview: () => import("./preview-OV2EZ6YF.js").then((m) => m.previewCommand),
|
|
97
97
|
targeting: () => import("./targeting-DAUTJDUB.js").then((m) => m.targetingCommand),
|
|
98
98
|
"instagram-accounts": () => import("./account-assets-QMKT5AT7.js").then((m) => m.instagramAccountsCommand),
|
|
99
99
|
apps: () => import("./account-assets-QMKT5AT7.js").then((m) => m.appsCommand),
|
|
@@ -119,4 +119,4 @@ Full guide: __tooling__/docs/tools/baker/ads-meta.md`
|
|
|
119
119
|
export {
|
|
120
120
|
metaCommand
|
|
121
121
|
};
|
|
122
|
-
//# sourceMappingURL=meta-
|
|
122
|
+
//# sourceMappingURL=meta-XUHI3E3L.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/ads/meta/index.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\n\n/**\n * Meta Ads command surface — curated for AI agents, not 1:1 with the Marketing API.\n *\n * Every backend read route has a command except `/currency`: `account` already\n * returns the currency and time zone, so a second command for two of its\n * fields would only be a second place to look.\n *\n * Default behaviors that matter:\n * - Listings (campaigns/adsets/ads) filter to ACTIVE — pass --all-statuses to widen.\n * - Insights filter out non-delivered rows (impressions=0) and sort by spend desc.\n * - Insights pick a smart field bundle via --intent (baseline|revenue|funnel|ranking|video|identity).\n * - Heavy insights queries auto-fall to async (poll loop hidden).\n * - Attribution defaults to 7d_click,1d_view — the only windows still working as of Jan 2026.\n */\nexport const metaCommand = defineCommand({\n meta: {\n name: \"meta\",\n description: `Meta Marketing API — AI-first command surface (Facebook + Instagram ads).\n\nDiscovery:\n baker ads meta accounts — accounts in this company's connected scope\n baker ads meta businesses — Business Manager IDs\n baker ads meta pages — Facebook Pages the selected ad accounts can promote (an ad's identity)\n baker ads meta lead-forms --page-id 100635183117758 — instant (lead) forms on a Page, with lead counts\n baker ads meta lead-forms create --account-id act_123 --page-id 555 --file form.json — stage a new form\n baker ads meta leads --form-id 987654321 — the leads one form collected (contact details masked)\n\nSnapshot a running account (default = ACTIVE only):\n baker ads meta campaigns --account-id act_123\n baker ads meta adsets --campaign-id 6123\n baker ads meta ads --adset-id 6123\n baker ads meta campaigns --account-id act_123 --all-statuses — include paused, archived\n\nBuild targeting (Meta takes ids, never names — look them up first):\n baker ads meta targeting search --account-id act_123 --q \"solar energy\" — interest/behavior/employer… ids\n baker ads meta targeting geo --account-id act_123 --q Madrid — location keys\n baker ads meta targeting validate --account-id act_123 --targeting-file t.json\n baker ads meta targeting estimate --account-id act_123 --targeting-file t.json --optimization-goal LEAD_GENERATION\n baker ads meta targeting describe --account-id act_123 --adset-id 6123 — the audience in Meta's words\n\nIdentities and libraries:\n baker ads meta instagram-accounts --account-id act_123 — the --instagram-user an ad can run as\n baker ads meta apps --account-id act_123 — apps it can promote\n baker ads meta dsa-recommendations --account-id act_123 — EU DSA beneficiary/payor names\n baker ads meta images --account-id act_123 — image hashes already on Meta\n baker ads meta labels --account-id act_123\n baker ads meta catalogs --business-id 601050769212882 — product catalogs; --catalog-id for product sets; products/sets/feeds/diagnostics\n baker ads meta page-photos upload --page-id … --image-id … — a photo on a Page, not posted (Instant Experiences)\n baker ads meta instant-experiences --page-id 904238019441800 — full-screen pages an ad can open (collection ads)\n baker ads meta studies --account-id act_123 — A/B tests; --study-id for results\n baker ads meta high-demand-periods --campaign-id 6123 — budget boosts\n baker ads meta page-posts --page-id 904238019441800 — posts an ad can boost; instagram-media for Instagram\n baker ads meta block-lists --account-id act_123 — sites and apps ads stay off (brand safety)\n baker ads meta reach-frequency --account-id act_123 — reach & frequency quotes; predict | reserve | cancel\n baker ads meta account-settings --account-id act_123 --spending-limit 5000 — account name / spending limit (staged)\n baker ads meta comments --ad-id 120211234567890 — comments on an ad's post\n baker ads meta account-details --account-id act_123 --show users — people, Meta's suggestions, Advantage+ controls, playables, page sets\n\nDrill in:\n baker ads meta account --account-id act_123 — currency, balance, business, whether it can deliver\n baker ads meta creatives --creative-id 9988,9989 — creatives' copy, link and assets, several at once\n baker ads meta audiences --name-contains buyers — one audience and its lookalikes\n baker ads meta custom-conversions --account-id act_123 — the marketer's own conversions (\"my conversions\")\n baker ads meta pixels --account-id act_123 — pixel list\n baker ads meta pixels --pixel-id 9988 --stats --days 7 — firing health\n\nPerformance (the workhorse):\n baker ads meta insights --object act_123 — defaults: level=account, intent=baseline, last_7d\n baker ads meta insights --object act_123 --intent revenue --date-preset last_28d\n baker ads meta insights --object act_123 --level ad --intent ranking — flag creatives to refresh\n baker ads meta insights --object act_123 --level adset --breakdowns publisher_platform,age — placement × age\n baker ads meta insights --object act_123 --level ad --since 2026-01-01 --until 2026-03-31 — auto-async\n baker ads meta insights --list-intents\n\nAutomated rules (run on Meta, unattended, once published):\n baker ads meta rules --account-id act_123 — every rule and what it does\n baker ads meta rules history --rule-id 1132635173044914 — what a rule did and when\n baker ads meta rules create --name \"Stop expensive ads\" --apply-to ad --when \"cost_per_result>20\" --action pause\n\nA/B tests (Meta splits the audience between versions and calls the winner):\n baker ads meta adsets duplicate 6123 --name \"… – lookalike\" — then change ONE thing on the copy\n baker ads meta studies create --name \"Broad vs lookalike\" --adsets 6123,meta_temp_ab12 --start 2026-10-20T08:00Z --days 14\n\nAudit & review:\n baker ads meta activities --account-id act_123 --days 14\n baker ads meta preview --creative-id 9988 --ad-format MOBILE_FEED_STANDARD --out-file /tmp/p.html\nFull guide: __tooling__/docs/tools/baker/ads-meta.md`,\n },\n subCommands: {\n accounts: () => import(\"./accounts.ts\").then((m) => m.accountsCommand),\n account: () => import(\"./account.ts\").then((m) => m.accountCommand),\n businesses: () => import(\"./businesses.ts\").then((m) => m.businessesCommand),\n pages: () => import(\"./pages.ts\").then((m) => m.pagesCommand),\n \"lead-forms\": () => import(\"./leads.ts\").then((m) => m.leadFormsCommand),\n \"instant-experiences\": () => import(\"./instant-experiences.ts\").then((m) => m.instantExperiencesCommand),\n leads: () => import(\"./leads.ts\").then((m) => m.leadsCommand),\n campaigns: () => import(\"./campaigns.ts\").then((m) => m.campaignsCommand),\n adsets: () => import(\"./adsets.ts\").then((m) => m.adsetsCommand),\n ads: () => import(\"./ads.ts\").then((m) => m.adsListCommand),\n creatives: () => import(\"./creatives.ts\").then((m) => m.creativesCommand),\n audiences: () => import(\"./audiences.ts\").then((m) => m.audiencesCommand),\n \"custom-conversions\": () => import(\"./custom-conversions.ts\").then((m) => m.customConversionsCommand),\n pixels: () => import(\"./pixels.ts\").then((m) => m.pixelsCommand),\n activities: () => import(\"./activities.ts\").then((m) => m.activitiesCommand),\n insights: () => import(\"./insights.ts\").then((m) => m.insightsCommand),\n preview: () => import(\"./preview.ts\").then((m) => m.previewCommand),\n targeting: () => import(\"./targeting.ts\").then((m) => m.targetingCommand),\n \"instagram-accounts\": () => import(\"./account-assets.ts\").then((m) => m.instagramAccountsCommand),\n apps: () => import(\"./account-assets.ts\").then((m) => m.appsCommand),\n \"dsa-recommendations\": () => import(\"./account-assets.ts\").then((m) => m.dsaRecommendationsCommand),\n images: () => import(\"./account-assets.ts\").then((m) => m.imagesCommand),\n labels: () => import(\"./account-assets.ts\").then((m) => m.labelsCommand),\n studies: () => import(\"./studies.ts\").then((m) => m.studiesCommand),\n catalogs: () => import(\"./catalogs.ts\").then((m) => m.catalogsCommand),\n \"page-photos\": () => import(\"./page-photos.ts\").then((m) => m.pagePhotosCommand),\n \"page-posts\": () => import(\"./account-level.ts\").then((m) => m.pagePostsCommand),\n \"instagram-media\": () => import(\"./account-level.ts\").then((m) => m.instagramMediaCommand),\n comments: () => import(\"./account-level.ts\").then((m) => m.commentsCommand),\n \"account-settings\": () => import(\"./account-level.ts\").then((m) => m.accountSettingsCommand),\n \"account-details\": () => import(\"./account-level.ts\").then((m) => m.accountDetailsCommand),\n \"block-lists\": () => import(\"./account-level.ts\").then((m) => m.blockListsCommand),\n \"reach-frequency\": () => import(\"./account-level.ts\").then((m) => m.reachFrequencyCommand),\n \"high-demand-periods\": () => import(\"./account-assets.ts\").then((m) => m.highDemandPeriodsCommand),\n rules: () => import(\"./rules.ts\").then((m) => m.rulesCommand),\n media: () => import(\"./media.ts\").then((m) => m.metaMediaCommand),\n draft: () => import(\"./draft.ts\").then((m) => m.metaDraftCommand),\n },\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/meta/index.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\n\n/**\n * Meta Ads command surface — curated for AI agents, not 1:1 with the Marketing API.\n *\n * Every backend read route has a command except `/currency`: `account` already\n * returns the currency and time zone, so a second command for two of its\n * fields would only be a second place to look.\n *\n * Default behaviors that matter:\n * - Listings (campaigns/adsets/ads) filter to ACTIVE — pass --all-statuses to widen.\n * - Insights filter out non-delivered rows (impressions=0) and sort by spend desc.\n * - Insights pick a smart field bundle via --intent (baseline|revenue|funnel|ranking|video|identity).\n * - Heavy insights queries auto-fall to async (poll loop hidden).\n * - Attribution defaults to 7d_click,1d_view — the only windows still working as of Jan 2026.\n */\nexport const metaCommand = defineCommand({\n meta: {\n name: \"meta\",\n description: `Meta Marketing API — AI-first command surface (Facebook + Instagram ads).\n\nDiscovery:\n baker ads meta accounts — accounts in this company's connected scope\n baker ads meta businesses — Business Manager IDs\n baker ads meta pages — Facebook Pages the selected ad accounts can promote (an ad's identity)\n baker ads meta lead-forms --page-id 100635183117758 — instant (lead) forms on a Page, with lead counts\n baker ads meta lead-forms create --account-id act_123 --page-id 555 --file form.json — stage a new form\n baker ads meta leads --form-id 987654321 — the leads one form collected (contact details masked)\n\nSnapshot a running account (default = ACTIVE only):\n baker ads meta campaigns --account-id act_123\n baker ads meta adsets --campaign-id 6123\n baker ads meta ads --adset-id 6123\n baker ads meta campaigns --account-id act_123 --all-statuses — include paused, archived\n\nBuild targeting (Meta takes ids, never names — look them up first):\n baker ads meta targeting search --account-id act_123 --q \"solar energy\" — interest/behavior/employer… ids\n baker ads meta targeting geo --account-id act_123 --q Madrid — location keys\n baker ads meta targeting validate --account-id act_123 --targeting-file t.json\n baker ads meta targeting estimate --account-id act_123 --targeting-file t.json --optimization-goal LEAD_GENERATION\n baker ads meta targeting describe --account-id act_123 --adset-id 6123 — the audience in Meta's words\n\nIdentities and libraries:\n baker ads meta instagram-accounts --account-id act_123 — the --instagram-user an ad can run as\n baker ads meta apps --account-id act_123 — apps it can promote\n baker ads meta dsa-recommendations --account-id act_123 — EU DSA beneficiary/payor names\n baker ads meta images --account-id act_123 — image hashes already on Meta\n baker ads meta labels --account-id act_123\n baker ads meta catalogs --business-id 601050769212882 — product catalogs; --catalog-id for product sets; products/sets/feeds/diagnostics\n baker ads meta page-photos upload --page-id … --image-id … — a photo on a Page, not posted (Instant Experiences)\n baker ads meta instant-experiences --page-id 904238019441800 — full-screen pages an ad can open (collection ads)\n baker ads meta studies --account-id act_123 — A/B tests; --study-id for results\n baker ads meta high-demand-periods --campaign-id 6123 — budget boosts\n baker ads meta page-posts --page-id 904238019441800 — posts an ad can boost; instagram-media for Instagram\n baker ads meta block-lists --account-id act_123 — sites and apps ads stay off (brand safety)\n baker ads meta reach-frequency --account-id act_123 — reach & frequency quotes; predict | reserve | cancel\n baker ads meta account-settings --account-id act_123 --spending-limit 5000 — account name / spending limit (staged)\n baker ads meta comments --ad-id 120211234567890 — comments on an ad's post\n baker ads meta account-details --account-id act_123 --show users — people, Meta's suggestions, Advantage+ controls, playables, page sets\n\nDrill in:\n baker ads meta account --account-id act_123 — currency, balance, business, whether it can deliver\n baker ads meta creatives --creative-id 9988,9989 — creatives' copy, link and assets, several at once\n baker ads meta audiences --name-contains buyers — one audience and its lookalikes\n baker ads meta custom-conversions --account-id act_123 — the marketer's own conversions (\"my conversions\")\n baker ads meta pixels --account-id act_123 — pixel list\n baker ads meta pixels --pixel-id 9988 --stats --days 7 — firing health\n\nPerformance (the workhorse):\n baker ads meta insights --object act_123 — defaults: level=account, intent=baseline, last_7d\n baker ads meta insights --object act_123 --intent revenue --date-preset last_28d\n baker ads meta insights --object act_123 --level ad --intent ranking — flag creatives to refresh\n baker ads meta insights --object act_123 --level adset --breakdowns publisher_platform,age — placement × age\n baker ads meta insights --object act_123 --level ad --since 2026-01-01 --until 2026-03-31 — auto-async\n baker ads meta insights --list-intents\n\nAutomated rules (run on Meta, unattended, once published):\n baker ads meta rules --account-id act_123 — every rule and what it does\n baker ads meta rules history --rule-id 1132635173044914 — what a rule did and when\n baker ads meta rules create --name \"Stop expensive ads\" --apply-to ad --when \"cost_per_result>20\" --action pause\n\nA/B tests (Meta splits the audience between versions and calls the winner):\n baker ads meta adsets duplicate 6123 --name \"… – lookalike\" — then change ONE thing on the copy\n baker ads meta studies create --name \"Broad vs lookalike\" --adsets 6123,meta_temp_ab12 --start 2026-10-20T08:00Z --days 14\n\nAudit & review:\n baker ads meta activities --account-id act_123 --days 14\n baker ads meta preview --ad-id 9988 --ad-format MOBILE_FEED_STANDARD — SEE the ad: displayed text + a picture\nFull guide: __tooling__/docs/tools/baker/ads-meta.md`,\n },\n subCommands: {\n accounts: () => import(\"./accounts.ts\").then((m) => m.accountsCommand),\n account: () => import(\"./account.ts\").then((m) => m.accountCommand),\n businesses: () => import(\"./businesses.ts\").then((m) => m.businessesCommand),\n pages: () => import(\"./pages.ts\").then((m) => m.pagesCommand),\n \"lead-forms\": () => import(\"./leads.ts\").then((m) => m.leadFormsCommand),\n \"instant-experiences\": () => import(\"./instant-experiences.ts\").then((m) => m.instantExperiencesCommand),\n leads: () => import(\"./leads.ts\").then((m) => m.leadsCommand),\n campaigns: () => import(\"./campaigns.ts\").then((m) => m.campaignsCommand),\n adsets: () => import(\"./adsets.ts\").then((m) => m.adsetsCommand),\n ads: () => import(\"./ads.ts\").then((m) => m.adsListCommand),\n creatives: () => import(\"./creatives.ts\").then((m) => m.creativesCommand),\n audiences: () => import(\"./audiences.ts\").then((m) => m.audiencesCommand),\n \"custom-conversions\": () => import(\"./custom-conversions.ts\").then((m) => m.customConversionsCommand),\n pixels: () => import(\"./pixels.ts\").then((m) => m.pixelsCommand),\n activities: () => import(\"./activities.ts\").then((m) => m.activitiesCommand),\n insights: () => import(\"./insights.ts\").then((m) => m.insightsCommand),\n preview: () => import(\"./preview.ts\").then((m) => m.previewCommand),\n targeting: () => import(\"./targeting.ts\").then((m) => m.targetingCommand),\n \"instagram-accounts\": () => import(\"./account-assets.ts\").then((m) => m.instagramAccountsCommand),\n apps: () => import(\"./account-assets.ts\").then((m) => m.appsCommand),\n \"dsa-recommendations\": () => import(\"./account-assets.ts\").then((m) => m.dsaRecommendationsCommand),\n images: () => import(\"./account-assets.ts\").then((m) => m.imagesCommand),\n labels: () => import(\"./account-assets.ts\").then((m) => m.labelsCommand),\n studies: () => import(\"./studies.ts\").then((m) => m.studiesCommand),\n catalogs: () => import(\"./catalogs.ts\").then((m) => m.catalogsCommand),\n \"page-photos\": () => import(\"./page-photos.ts\").then((m) => m.pagePhotosCommand),\n \"page-posts\": () => import(\"./account-level.ts\").then((m) => m.pagePostsCommand),\n \"instagram-media\": () => import(\"./account-level.ts\").then((m) => m.instagramMediaCommand),\n comments: () => import(\"./account-level.ts\").then((m) => m.commentsCommand),\n \"account-settings\": () => import(\"./account-level.ts\").then((m) => m.accountSettingsCommand),\n \"account-details\": () => import(\"./account-level.ts\").then((m) => m.accountDetailsCommand),\n \"block-lists\": () => import(\"./account-level.ts\").then((m) => m.blockListsCommand),\n \"reach-frequency\": () => import(\"./account-level.ts\").then((m) => m.reachFrequencyCommand),\n \"high-demand-periods\": () => import(\"./account-assets.ts\").then((m) => m.highDemandPeriodsCommand),\n rules: () => import(\"./rules.ts\").then((m) => m.rulesCommand),\n media: () => import(\"./media.ts\").then((m) => m.metaMediaCommand),\n draft: () => import(\"./draft.ts\").then((m) => m.metaDraftCommand),\n },\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import {
|
|
2
|
+
handleLinkedinError,
|
|
3
|
+
resolveAccountIdArg
|
|
4
|
+
} from "./chunk-OTFHIGEO.js";
|
|
5
|
+
import {
|
|
6
|
+
AD_PREVIEW_DIR,
|
|
7
|
+
renderAdPreviews
|
|
8
|
+
} from "./chunk-EGVWSAWY.js";
|
|
9
|
+
import "./chunk-VN3WDB4O.js";
|
|
10
|
+
import {
|
|
11
|
+
writeJsonEnvelope
|
|
12
|
+
} from "./chunk-QYH2UZAK.js";
|
|
13
|
+
import "./chunk-MKLAZD23.js";
|
|
14
|
+
import "./chunk-QV6AST5T.js";
|
|
15
|
+
import "./chunk-WCU362Z6.js";
|
|
16
|
+
import "./chunk-GIWHHCD6.js";
|
|
17
|
+
import "./chunk-SOPVIIUW.js";
|
|
18
|
+
import "./chunk-G4FG5EQO.js";
|
|
19
|
+
import "./chunk-R7XDGNZD.js";
|
|
20
|
+
import "./chunk-MSMTG6OC.js";
|
|
21
|
+
import {
|
|
22
|
+
apiPost
|
|
23
|
+
} from "./chunk-GFWWHCBF.js";
|
|
24
|
+
import "./chunk-JXTNP3B5.js";
|
|
25
|
+
import "./chunk-45D6WRCJ.js";
|
|
26
|
+
import "./chunk-CCYZJMZ7.js";
|
|
27
|
+
import "./chunk-YQSBHWOI.js";
|
|
28
|
+
|
|
29
|
+
// src/commands/ads/linkedin/preview.ts
|
|
30
|
+
import { writeFileSync } from "fs";
|
|
31
|
+
import { defineCommand } from "citty";
|
|
32
|
+
var previewCommand = defineCommand({
|
|
33
|
+
meta: {
|
|
34
|
+
name: "preview",
|
|
35
|
+
description: `See an existing LinkedIn ad exactly as people see it in the feed \u2014 LinkedIn's own renderer,
|
|
36
|
+
for desktop and mobile. Returns shownText (the text displayed, in order) and a picture of each;
|
|
37
|
+
Read the picture only for what text cannot tell (words in the artwork, cropping, how it looks).
|
|
38
|
+
|
|
39
|
+
Start here before saying anything about how an ad LOOKS (which text shows, whether the headline
|
|
40
|
+
appears under the image, what the button says): the API fields say what is stored, the preview
|
|
41
|
+
shows what is displayed. Works for single image, carousel, video, event and job ads that already
|
|
42
|
+
exist on LinkedIn; staged (unpublished) ads have no preview yet.
|
|
43
|
+
|
|
44
|
+
Examples:
|
|
45
|
+
baker ads linkedin preview 1611562694 --account-id 503001492
|
|
46
|
+
baker ads linkedin preview 1611562694 --placement mobile
|
|
47
|
+
baker ads linkedin preview 1611562694 --out-dir /tmp/review`
|
|
48
|
+
},
|
|
49
|
+
args: {
|
|
50
|
+
id: { type: "positional", description: "Creative id or urn:li:sponsoredCreative:N", required: true },
|
|
51
|
+
"account-id": { type: "string", description: "Numeric account ID or urn:li:sponsoredAccount:N" },
|
|
52
|
+
"account-urn": { type: "string", description: "Alias for --account-id" },
|
|
53
|
+
placement: { type: "string", description: "desktop|mobile|both (default: both)", default: "both" },
|
|
54
|
+
"out-dir": { type: "string", description: `Folder for the pictures (default: ${AD_PREVIEW_DIR})` },
|
|
55
|
+
"html-file": { type: "string", description: "Also save LinkedIn's raw preview iframes to this file" }
|
|
56
|
+
},
|
|
57
|
+
run: async ({ args }) => {
|
|
58
|
+
const accountId = resolveAccountIdArg(args);
|
|
59
|
+
const placement = String(args.placement);
|
|
60
|
+
if (!["desktop", "mobile", "both"].includes(placement)) {
|
|
61
|
+
writeJsonEnvelope({
|
|
62
|
+
ok: false,
|
|
63
|
+
error: { code: "VALIDATION_ERROR", message: "--placement must be desktop, mobile or both" }
|
|
64
|
+
});
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const body = { accountId, creativeId: String(args.id) };
|
|
69
|
+
const data = await apiPost("/api/ads/linkedin/preview", body);
|
|
70
|
+
const wanted = data.previews.filter((p) => placement === "both" || p.placement === placement);
|
|
71
|
+
if (wanted.length === 0) {
|
|
72
|
+
writeJsonEnvelope({
|
|
73
|
+
ok: true,
|
|
74
|
+
data: { creativeId: data.creativeId, previews: [] },
|
|
75
|
+
hints: [
|
|
76
|
+
"LinkedIn returned no preview for this ad (its format may not support one). Say its look could not be checked; do not describe it from the API fields."
|
|
77
|
+
]
|
|
78
|
+
});
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (args["html-file"]) {
|
|
82
|
+
writeFileSync(String(args["html-file"]), wanted.map((p) => p.html).join("\n"), "utf-8");
|
|
83
|
+
}
|
|
84
|
+
const rendered = await renderAdPreviews(wanted, {
|
|
85
|
+
dir: args["out-dir"] ? String(args["out-dir"]) : AD_PREVIEW_DIR,
|
|
86
|
+
name: `linkedin-${data.creativeId}`
|
|
87
|
+
});
|
|
88
|
+
writeJsonEnvelope({
|
|
89
|
+
ok: true,
|
|
90
|
+
data: { creativeId: data.creativeId, previews: rendered.previews },
|
|
91
|
+
hints: rendered.hints
|
|
92
|
+
});
|
|
93
|
+
} catch (err) {
|
|
94
|
+
handleLinkedinError(err);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
export {
|
|
99
|
+
previewCommand
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=preview-IBNFQ5RQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/linkedin/preview.ts"],"sourcesContent":["import { writeFileSync } from \"node:fs\";\nimport type { LinkedinAdPreviewRequest, LinkedinAdPreviewResponse } from \"@baker/api/ads-linkedin/preview\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { AD_PREVIEW_DIR, renderAdPreviews } from \"../ad-preview-images.ts\";\nimport { writeJsonEnvelope } from \"../output.ts\";\nimport { handleLinkedinError, resolveAccountIdArg } from \"./shared.ts\";\n\nexport const previewCommand = defineCommand({\n meta: {\n name: \"preview\",\n description: `See an existing LinkedIn ad exactly as people see it in the feed — LinkedIn's own renderer,\nfor desktop and mobile. Returns shownText (the text displayed, in order) and a picture of each;\nRead the picture only for what text cannot tell (words in the artwork, cropping, how it looks).\n\nStart here before saying anything about how an ad LOOKS (which text shows, whether the headline\nappears under the image, what the button says): the API fields say what is stored, the preview\nshows what is displayed. Works for single image, carousel, video, event and job ads that already\nexist on LinkedIn; staged (unpublished) ads have no preview yet.\n\nExamples:\n baker ads linkedin preview 1611562694 --account-id 503001492\n baker ads linkedin preview 1611562694 --placement mobile\n baker ads linkedin preview 1611562694 --out-dir /tmp/review`,\n },\n args: {\n id: { type: \"positional\", description: \"Creative id or urn:li:sponsoredCreative:N\", required: true },\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n placement: { type: \"string\", description: \"desktop|mobile|both (default: both)\", default: \"both\" },\n \"out-dir\": { type: \"string\", description: `Folder for the pictures (default: ${AD_PREVIEW_DIR})` },\n \"html-file\": { type: \"string\", description: \"Also save LinkedIn's raw preview iframes to this file\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n const placement = String(args.placement);\n if (![\"desktop\", \"mobile\", \"both\"].includes(placement)) {\n writeJsonEnvelope({\n ok: false,\n error: { code: \"VALIDATION_ERROR\", message: \"--placement must be desktop, mobile or both\" },\n });\n process.exit(1);\n }\n try {\n const body: LinkedinAdPreviewRequest = { accountId, creativeId: String(args.id) };\n const data = await apiPost<LinkedinAdPreviewResponse>(\"/api/ads/linkedin/preview\", body);\n const wanted = data.previews.filter((p) => placement === \"both\" || p.placement === placement);\n if (wanted.length === 0) {\n writeJsonEnvelope({\n ok: true,\n data: { creativeId: data.creativeId, previews: [] },\n hints: [\n \"LinkedIn returned no preview for this ad (its format may not support one). Say its look could not be checked; do not describe it from the API fields.\",\n ],\n });\n return;\n }\n if (args[\"html-file\"]) {\n writeFileSync(String(args[\"html-file\"]), wanted.map((p) => p.html).join(\"\\n\"), \"utf-8\");\n }\n const rendered = await renderAdPreviews(wanted, {\n dir: args[\"out-dir\"] ? String(args[\"out-dir\"]) : AD_PREVIEW_DIR,\n name: `linkedin-${data.creativeId}`,\n });\n writeJsonEnvelope({\n ok: true,\n data: { creativeId: data.creativeId, previews: rendered.previews },\n hints: rendered.hints,\n });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAE9B,SAAS,qBAAqB;AAMvB,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,6CAA6C,UAAU,KAAK;AAAA,IACnG,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC/F,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,WAAW,EAAE,MAAM,UAAU,aAAa,uCAAuC,SAAS,OAAO;AAAA,IACjG,WAAW,EAAE,MAAM,UAAU,aAAa,qCAAqC,cAAc,IAAI;AAAA,IACjG,aAAa,EAAE,MAAM,UAAU,aAAa,wDAAwD;AAAA,EACtG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,UAAM,YAAY,OAAO,KAAK,SAAS;AACvC,QAAI,CAAC,CAAC,WAAW,UAAU,MAAM,EAAE,SAAS,SAAS,GAAG;AACtD,wBAAkB;AAAA,QAChB,IAAI;AAAA,QACJ,OAAO,EAAE,MAAM,oBAAoB,SAAS,8CAA8C;AAAA,MAC5F,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI;AACF,YAAM,OAAiC,EAAE,WAAW,YAAY,OAAO,KAAK,EAAE,EAAE;AAChF,YAAM,OAAO,MAAM,QAAmC,6BAA6B,IAAI;AACvF,YAAM,SAAS,KAAK,SAAS,OAAO,CAAC,MAAM,cAAc,UAAU,EAAE,cAAc,SAAS;AAC5F,UAAI,OAAO,WAAW,GAAG;AACvB,0BAAkB;AAAA,UAChB,IAAI;AAAA,UACJ,MAAM,EAAE,YAAY,KAAK,YAAY,UAAU,CAAC,EAAE;AAAA,UAClD,OAAO;AAAA,YACL;AAAA,UACF;AAAA,QACF,CAAC;AACD;AAAA,MACF;AACA,UAAI,KAAK,WAAW,GAAG;AACrB,sBAAc,OAAO,KAAK,WAAW,CAAC,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,GAAG,OAAO;AAAA,MACxF;AACA,YAAM,WAAW,MAAM,iBAAiB,QAAQ;AAAA,QAC9C,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,CAAC,IAAI;AAAA,QACjD,MAAM,YAAY,KAAK,UAAU;AAAA,MACnC,CAAC;AACD,wBAAkB;AAAA,QAChB,IAAI;AAAA,QACJ,MAAM,EAAE,YAAY,KAAK,YAAY,UAAU,SAAS,SAAS;AAAA,QACjE,OAAO,SAAS;AAAA,MAClB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AD_PREVIEW_DIR,
|
|
3
|
+
renderAdPreviews
|
|
4
|
+
} from "./chunk-EGVWSAWY.js";
|
|
5
|
+
import "./chunk-VN3WDB4O.js";
|
|
1
6
|
import {
|
|
2
7
|
FACEBOOK_PREVIEW_FORMATS,
|
|
3
8
|
INSTAGRAM_PREVIEW_FORMATS,
|
|
@@ -27,6 +32,7 @@ import "./chunk-CCYZJMZ7.js";
|
|
|
27
32
|
import "./chunk-YQSBHWOI.js";
|
|
28
33
|
|
|
29
34
|
// src/commands/ads/meta/preview.ts
|
|
35
|
+
import { createHash } from "crypto";
|
|
30
36
|
import { writeFileSync } from "fs";
|
|
31
37
|
import { defineCommand } from "citty";
|
|
32
38
|
var VALID_AD_FORMATS = [
|
|
@@ -135,13 +141,20 @@ function listPlacements() {
|
|
|
135
141
|
const instagram = Object.keys(INSTAGRAM_PREVIEW_FORMATS).join(", ");
|
|
136
142
|
return `facebook \u2014 ${facebook}; instagram \u2014 ${instagram}`;
|
|
137
143
|
}
|
|
144
|
+
function previewFileName(target) {
|
|
145
|
+
const id = target.adId ?? target.creativeId;
|
|
146
|
+
if (id) return `meta-${id}`;
|
|
147
|
+
return `meta-draft-${createHash("sha256").update(target.creative ?? "").digest("hex").slice(0, 12)}`;
|
|
148
|
+
}
|
|
138
149
|
var previewCommand = defineCommand({
|
|
139
150
|
meta: {
|
|
140
151
|
name: "preview",
|
|
141
|
-
description: `
|
|
142
|
-
|
|
152
|
+
description: `See a creative or ad as Meta renders it in one placement: shownText (the text people see, in order)
|
|
153
|
+
plus a picture to Read for what text cannot tell (words in the artwork, cropping, how it looks).
|
|
154
|
+
--out-file also saves Meta's raw iframe HTML (its URL holds a short-lived access token \u2014 treat as secret).
|
|
143
155
|
|
|
144
|
-
Start here
|
|
156
|
+
Start here before saying anything about how an ad LOOKS (which text shows, the headline under the
|
|
157
|
+
image, the button). Start here too when you need to know what a creative looks like in one specific placement \u2014 this is
|
|
145
158
|
Meta's own renderer, so it settles "does my video show as a still image there?" without guessing.
|
|
146
159
|
Pass the placement straight from an insights breakdown with --placement (a platform_position value),
|
|
147
160
|
or a Meta ad_format with --ad-format. Run --list-formats to see both sets.
|
|
@@ -149,7 +162,7 @@ or a Meta ad_format with --ad-format. Run --list-formats to see both sets.
|
|
|
149
162
|
Examples:
|
|
150
163
|
baker ads meta preview --creative-id 6123 --ad-format MOBILE_FEED_STANDARD
|
|
151
164
|
baker ads meta preview --creative-id 6123 --placement facebook_reels_overlay --platform facebook
|
|
152
|
-
baker ads meta preview --ad-id 9988 --ad-format INSTAGRAM_REELS --out-
|
|
165
|
+
baker ads meta preview --ad-id 9988 --ad-format INSTAGRAM_REELS --out-dir /tmp/review
|
|
153
166
|
baker ads meta preview --account-id act_123 --creative '{"object_story_spec":{...}}' --ad-format MOBILE_FEED_STANDARD`
|
|
154
167
|
},
|
|
155
168
|
args: {
|
|
@@ -164,7 +177,8 @@ Examples:
|
|
|
164
177
|
},
|
|
165
178
|
platform: { type: "string", description: "facebook|instagram \u2014 required for --placement feed, which both report" },
|
|
166
179
|
"list-formats": { type: "boolean", description: "Print the ad_format values and placement mappings, then exit" },
|
|
167
|
-
"out-file": { type: "string", description: "
|
|
180
|
+
"out-file": { type: "string", description: "Also save Meta's iframe HTML to this path" },
|
|
181
|
+
"out-dir": { type: "string", description: `Folder for the picture (default: ${AD_PREVIEW_DIR})` },
|
|
168
182
|
"no-cache": NO_CACHE_ARG
|
|
169
183
|
},
|
|
170
184
|
run: async ({ args }) => {
|
|
@@ -196,23 +210,36 @@ Examples:
|
|
|
196
210
|
if (args["no-cache"]) body.skipCache = true;
|
|
197
211
|
try {
|
|
198
212
|
const data = await apiPost("/api/ads/meta/preview", body);
|
|
199
|
-
const html = data.map((d) => d.body).join("\n");
|
|
200
|
-
const hints = placement ? [
|
|
201
|
-
`Rendered ${placement} as ad_format ${adFormat}. Open the iframe to SEE it \u2014 Meta does not document what it renders for a creative a placement cannot take, so a preview you looked at is the evidence, and anything you did not look at stays unverified.`
|
|
202
|
-
] : [];
|
|
203
213
|
if (args["out-file"]) {
|
|
204
|
-
|
|
205
|
-
writeFileSync(args["out-file"], html, "utf-8");
|
|
206
|
-
writeJsonEnvelope(hints.length > 0 ? { ...summary, hints } : summary);
|
|
207
|
-
return;
|
|
214
|
+
writeFileSync(args["out-file"], data.map((d) => d.body).join("\n"), "utf-8");
|
|
208
215
|
}
|
|
209
|
-
|
|
216
|
+
const rendered = await renderAdPreviews(
|
|
217
|
+
data.map((d, i) => ({ placement: data.length > 1 ? `${adFormat}-${i + 1}` : adFormat, html: d.body })),
|
|
218
|
+
{
|
|
219
|
+
dir: args["out-dir"] ? String(args["out-dir"]) : AD_PREVIEW_DIR,
|
|
220
|
+
name: previewFileName({
|
|
221
|
+
adId: args["ad-id"],
|
|
222
|
+
creativeId: args["creative-id"],
|
|
223
|
+
creative: args.creative
|
|
224
|
+
})
|
|
225
|
+
}
|
|
226
|
+
);
|
|
227
|
+
const hints = placement ? [
|
|
228
|
+
`Rendered ${placement} as ad_format ${adFormat}. Meta does not document what it renders for a creative a placement cannot take, so the picture is the evidence.`,
|
|
229
|
+
...rendered.hints
|
|
230
|
+
] : rendered.hints;
|
|
231
|
+
writeJsonEnvelope({
|
|
232
|
+
ok: true,
|
|
233
|
+
data: { adFormat, previews: rendered.previews, ...args["out-file"] ? { file: args["out-file"] } : {} },
|
|
234
|
+
hints
|
|
235
|
+
});
|
|
210
236
|
} catch (err) {
|
|
211
237
|
handleMetaError(err);
|
|
212
238
|
}
|
|
213
239
|
}
|
|
214
240
|
});
|
|
215
241
|
export {
|
|
216
|
-
previewCommand
|
|
242
|
+
previewCommand,
|
|
243
|
+
previewFileName
|
|
217
244
|
};
|
|
218
|
-
//# sourceMappingURL=preview-
|
|
245
|
+
//# sourceMappingURL=preview-OV2EZ6YF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/meta/preview.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { writeFileSync } from \"node:fs\";\nimport {\n FACEBOOK_PREVIEW_FORMATS,\n INSTAGRAM_PREVIEW_FORMATS,\n PLATFORM_SCOPED_POSITIONS,\n previewFormatForPosition,\n} from \"@baker/api/ads-meta\";\nimport { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiPost } from \"../../../client.ts\";\nimport { AD_PREVIEW_DIR, renderAdPreviews } from \"../ad-preview-images.ts\";\nimport { writeAdsJson, writeJsonEnvelope } from \"../output.ts\";\nimport { handleMetaError } from \"./shared.ts\";\n\n/**\n * The `ad_format` enum of `generatepreviews` as Meta's reference lists it (every value rendered live on v26.0, 2026-10-15)\n * (read 2026-10-14), plus INSTAGRAM_SHOP — dropped from that list yet still\n * rendered live the same day, so a format an older answer named keeps working.\n */\nconst VALID_AD_FORMATS = [\n \"AUDIENCE_NETWORK_INSTREAM_VIDEO\",\n \"AUDIENCE_NETWORK_INSTREAM_VIDEO_MOBILE\",\n \"AUDIENCE_NETWORK_OUTSTREAM_VIDEO\",\n \"AUDIENCE_NETWORK_REWARDED_VIDEO\",\n \"BIZ_DISCO_FEED_MOBILE\",\n \"DESKTOP_FEED_STANDARD\",\n \"FACEBOOK_IFU_REELS_MOBILE\",\n \"FACEBOOK_PROFILE_FEED_DESKTOP\",\n \"FACEBOOK_PROFILE_FEED_MOBILE\",\n \"FACEBOOK_PROFILE_REELS_MOBILE\",\n \"FACEBOOK_REELS_BANNER\",\n \"FACEBOOK_REELS_BANNER_DESKTOP\",\n \"FACEBOOK_REELS_BANNER_FEED_ANDROID\",\n \"FACEBOOK_REELS_BANNER_FEED_ANDROID_LARGE\",\n \"FACEBOOK_REELS_BANNER_FULLSCREEN_IOS\",\n \"FACEBOOK_REELS_BANNER_FULLSCREEN_MOBILE\",\n \"FACEBOOK_REELS_MOBILE\",\n \"FACEBOOK_REELS_POSTLOOP\",\n \"FACEBOOK_REELS_POSTLOOP_FEED\",\n \"FACEBOOK_REELS_SIMILAR_PRODUCTS_MOBILE\",\n \"FACEBOOK_REELS_STICKER\",\n \"FACEBOOK_STORY_MOBILE\",\n \"FACEBOOK_STORY_STICKER_MOBILE\",\n \"INSTAGRAM_EXPLORE_CONTEXTUAL\",\n \"INSTAGRAM_EXPLORE_GRID_HOME\",\n \"INSTAGRAM_EXPLORE_IMMERSIVE\",\n \"INSTAGRAM_FEED_WEB\",\n \"INSTAGRAM_FEED_WEB_M_SITE\",\n \"INSTAGRAM_LEAD_GEN_MULTI_SUBMIT_ADS\",\n \"INSTAGRAM_PROFILE_FEED\",\n \"INSTAGRAM_PROFILE_REELS\",\n \"INSTAGRAM_REELS\",\n \"INSTAGRAM_REELS_OVERLAY\",\n \"INSTAGRAM_REELS_WEB\",\n \"INSTAGRAM_REELS_WEB_M_SITE\",\n \"INSTAGRAM_SEARCH_CHAIN\",\n \"INSTAGRAM_SEARCH_GRID\",\n \"INSTAGRAM_SHOP\",\n \"INSTAGRAM_STANDARD\",\n \"INSTAGRAM_STORY\",\n \"INSTAGRAM_STORY_EFFECT_TRAY\",\n \"INSTAGRAM_STORY_WEB\",\n \"INSTAGRAM_STORY_WEB_M_SITE\",\n \"INSTANT_ARTICLE_RECIRCULATION_AD\",\n \"INSTANT_ARTICLE_STANDARD\",\n \"INSTREAM_BANNER_DESKTOP\",\n \"INSTREAM_BANNER_FEED_IOS\",\n \"INSTREAM_BANNER_FULLSCREEN_IOS\",\n \"INSTREAM_BANNER_FULLSCREEN_MOBILE\",\n \"INSTREAM_BANNER_IMMERSIVE_MOBILE\",\n \"INSTREAM_BANNER_MOBILE\",\n \"INSTREAM_VIDEO_DESKTOP\",\n \"INSTREAM_VIDEO_FULLSCREEN_IOS\",\n \"INSTREAM_VIDEO_FULLSCREEN_MOBILE\",\n \"INSTREAM_VIDEO_IMAGE\",\n \"INSTREAM_VIDEO_IMMERSIVE_MOBILE\",\n \"INSTREAM_VIDEO_MOBILE\",\n \"JOB_BROWSER_DESKTOP\",\n \"JOB_BROWSER_MOBILE\",\n \"MARKETPLACE_MOBILE\",\n \"MESSENGER_MOBILE_INBOX_MEDIA\",\n \"MESSENGER_MOBILE_STORY_MEDIA\",\n \"MOBILE_BANNER\",\n \"MOBILE_FEED_BASIC\",\n \"MOBILE_FEED_STANDARD\",\n \"MOBILE_FULLWIDTH\",\n \"MOBILE_INTERSTITIAL\",\n \"MOBILE_MEDIUM_RECTANGLE\",\n \"MOBILE_NATIVE\",\n \"RIGHT_COLUMN_STANDARD\",\n \"SUGGESTED_VIDEO_DESKTOP\",\n \"SUGGESTED_VIDEO_FULLSCREEN_MOBILE\",\n \"SUGGESTED_VIDEO_IMMERSIVE_MOBILE\",\n \"SUGGESTED_VIDEO_MOBILE\",\n \"WATCH_FEED_HOME\",\n \"WATCH_FEED_MOBILE\",\n \"WHATSAPP_STATUS_MEDIA\",\n];\n\n/** A bad flag is not a network failure — mislabelling it invites a retry of the same doomed call. */\nfunction failPreviewValidation(message: string): never {\n writeAdsJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message } });\n process.exit(1);\n}\n\n/**\n * Preview is the free way to see what Meta actually renders for a creative in a\n * given surface — the check that turns \"this placement must be showing a still\"\n * from a claim into an observation. It was being used by guessing format names,\n * so both doors are open now: the Meta `ad_format` enum via `--ad-format`, and\n * the `platform_position` an insights breakdown reports via `--placement`.\n */\nfunction resolvePlacement(position: string, platform: unknown): string {\n const platformArg = typeof platform === \"string\" ? platform.toLowerCase() : undefined;\n if (platformArg && platformArg !== \"facebook\" && platformArg !== \"instagram\") {\n failPreviewValidation(\"--platform must be facebook or instagram\");\n }\n const format = previewFormatForPosition(position, platformArg);\n if (format) {\n return format;\n }\n if (PLATFORM_SCOPED_POSITIONS.has(position) && !platformArg) {\n failPreviewValidation(\n `--placement ${position} names a different surface on Facebook and on Instagram — add --platform facebook or --platform instagram (the breakdown row's publisher_platform)`,\n );\n }\n failPreviewValidation(\n `No Meta preview format is published for placement \"${position}\". Meta does not document one for every placement (facebook_notification among them), so this placement cannot be previewed — report it as unverified rather than inferring what it renders. Pass the platform_position exactly as the insights breakdown spelled it: targeting names a few surfaces differently (story, reels, explore_home) and those names never appear in a breakdown. Previewable placements: ${listPlacements()}`,\n );\n}\n\nfunction listPlacements(): string {\n const facebook = Object.keys(FACEBOOK_PREVIEW_FORMATS).join(\", \");\n const instagram = Object.keys(INSTAGRAM_PREVIEW_FORMATS).join(\", \");\n return `facebook — ${facebook}; instagram — ${instagram}`;\n}\n\n/** File name for a preview's picture. An unpublished spec has no id, so its content names it. */\nexport function previewFileName(target: { adId?: string; creativeId?: string; creative?: string }): string {\n const id = target.adId ?? target.creativeId;\n if (id) return `meta-${id}`;\n return `meta-draft-${createHash(\"sha256\")\n .update(target.creative ?? \"\")\n .digest(\"hex\")\n .slice(0, 12)}`;\n}\n\nexport const previewCommand = defineCommand({\n meta: {\n name: \"preview\",\n description: `See a creative or ad as Meta renders it in one placement: shownText (the text people see, in order)\nplus a picture to Read for what text cannot tell (words in the artwork, cropping, how it looks).\n--out-file also saves Meta's raw iframe HTML (its URL holds a short-lived access token — treat as secret).\n\nStart here before saying anything about how an ad LOOKS (which text shows, the headline under the\nimage, the button). Start here too when you need to know what a creative looks like in one specific placement — this is\nMeta's own renderer, so it settles \"does my video show as a still image there?\" without guessing.\nPass the placement straight from an insights breakdown with --placement (a platform_position value),\nor a Meta ad_format with --ad-format. Run --list-formats to see both sets.\n\nExamples:\n baker ads meta preview --creative-id 6123 --ad-format MOBILE_FEED_STANDARD\n baker ads meta preview --creative-id 6123 --placement facebook_reels_overlay --platform facebook\n baker ads meta preview --ad-id 9988 --ad-format INSTAGRAM_REELS --out-dir /tmp/review\n baker ads meta preview --account-id act_123 --creative '{\"object_story_spec\":{...}}' --ad-format MOBILE_FEED_STANDARD`,\n },\n args: {\n \"creative-id\": { type: \"string\", description: \"Existing creative ID\" },\n \"ad-id\": { type: \"string\", description: \"Existing ad ID\" },\n \"account-id\": { type: \"string\", description: \"Required when previewing an unpublished --creative spec\" },\n creative: { type: \"string\", description: \"JSON spec of an unpublished creative (e.g. object_story_spec)\" },\n \"ad-format\": { type: \"string\", description: \"Meta ad_format enum value (--list-formats to see them)\" },\n placement: {\n type: \"string\",\n description:\n \"platform_position from an insights breakdown (e.g. facebook_reels_overlay) — resolved to an ad_format\",\n },\n platform: { type: \"string\", description: \"facebook|instagram — required for --placement feed, which both report\" },\n \"list-formats\": { type: \"boolean\", description: \"Print the ad_format values and placement mappings, then exit\" },\n \"out-file\": { type: \"string\", description: \"Also save Meta's iframe HTML to this path\" },\n \"out-dir\": { type: \"string\", description: `Folder for the picture (default: ${AD_PREVIEW_DIR})` },\n \"no-cache\": NO_CACHE_ARG,\n },\n run: async ({ args }) => {\n if (args[\"list-formats\"]) {\n writeAdsJson({\n ok: true,\n data: {\n adFormats: VALID_AD_FORMATS,\n placements: { facebook: FACEBOOK_PREVIEW_FORMATS, instagram: INSTAGRAM_PREVIEW_FORMATS },\n },\n });\n return;\n }\n\n const placement = args.placement as string | undefined;\n const adFormat = placement ? resolvePlacement(placement, args.platform) : (args[\"ad-format\"] as string);\n if (!adFormat) {\n failPreviewValidation(\"pass --ad-format or --placement (see --list-formats)\");\n }\n if (!VALID_AD_FORMATS.includes(adFormat)) {\n failPreviewValidation(\n `Invalid --ad-format \"${adFormat}\". Meta's ad_format values: ${VALID_AD_FORMATS.join(\", \")}. To preview a placement you saw in an insights breakdown, pass --placement <platform_position> instead of guessing a format name.`,\n );\n }\n const body: Record<string, unknown> = { adFormat };\n if (args[\"creative-id\"]) body.creativeId = args[\"creative-id\"];\n if (args[\"ad-id\"]) body.adId = args[\"ad-id\"];\n if (args[\"account-id\"]) body.accountId = args[\"account-id\"];\n if (args.creative) body.creative = args.creative;\n if (args[\"no-cache\"]) body.skipCache = true;\n\n try {\n const data = await apiPost<Array<{ body: string }>>(\"/api/ads/meta/preview\", body);\n if (args[\"out-file\"]) {\n writeFileSync(args[\"out-file\"] as string, data.map((d) => d.body).join(\"\\n\"), \"utf-8\");\n }\n const rendered = await renderAdPreviews(\n data.map((d, i) => ({ placement: data.length > 1 ? `${adFormat}-${i + 1}` : adFormat, html: d.body })),\n {\n dir: args[\"out-dir\"] ? String(args[\"out-dir\"]) : AD_PREVIEW_DIR,\n name: previewFileName({\n adId: args[\"ad-id\"] as string | undefined,\n creativeId: args[\"creative-id\"] as string | undefined,\n creative: args.creative as string | undefined,\n }),\n },\n );\n const hints = placement\n ? [\n `Rendered ${placement} as ad_format ${adFormat}. Meta does not document what it renders for a creative a placement cannot take, so the picture is the evidence.`,\n ...rendered.hints,\n ]\n : rendered.hints;\n writeJsonEnvelope({\n ok: true,\n data: { adFormat, previews: rendered.previews, ...(args[\"out-file\"] ? { file: args[\"out-file\"] } : {}) },\n hints,\n });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAO9B,SAAS,qBAAqB;AAY9B,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,SAAS,sBAAsB,SAAwB;AACrD,eAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,QAAQ,EAAE,CAAC;AACxE,UAAQ,KAAK,CAAC;AAChB;AASA,SAAS,iBAAiB,UAAkB,UAA2B;AACrE,QAAM,cAAc,OAAO,aAAa,WAAW,SAAS,YAAY,IAAI;AAC5E,MAAI,eAAe,gBAAgB,cAAc,gBAAgB,aAAa;AAC5E,0BAAsB,0CAA0C;AAAA,EAClE;AACA,QAAM,SAAS,yBAAyB,UAAU,WAAW;AAC7D,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AACA,MAAI,0BAA0B,IAAI,QAAQ,KAAK,CAAC,aAAa;AAC3D;AAAA,MACE,eAAe,QAAQ;AAAA,IACzB;AAAA,EACF;AACA;AAAA,IACE,sDAAsD,QAAQ,2ZAAsZ,eAAe,CAAC;AAAA,EACte;AACF;AAEA,SAAS,iBAAyB;AAChC,QAAM,WAAW,OAAO,KAAK,wBAAwB,EAAE,KAAK,IAAI;AAChE,QAAM,YAAY,OAAO,KAAK,yBAAyB,EAAE,KAAK,IAAI;AAClE,SAAO,mBAAc,QAAQ,sBAAiB,SAAS;AACzD;AAGO,SAAS,gBAAgB,QAA2E;AACzG,QAAM,KAAK,OAAO,QAAQ,OAAO;AACjC,MAAI,GAAI,QAAO,QAAQ,EAAE;AACzB,SAAO,cAAc,WAAW,QAAQ,EACrC,OAAO,OAAO,YAAY,EAAE,EAC5B,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE,CAAC;AACjB;AAEO,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAef;AAAA,EACA,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,IACrE,SAAS,EAAE,MAAM,UAAU,aAAa,iBAAiB;AAAA,IACzD,cAAc,EAAE,MAAM,UAAU,aAAa,0DAA0D;AAAA,IACvG,UAAU,EAAE,MAAM,UAAU,aAAa,gEAAgE;AAAA,IACzG,aAAa,EAAE,MAAM,UAAU,aAAa,yDAAyD;AAAA,IACrG,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aACE;AAAA,IACJ;AAAA,IACA,UAAU,EAAE,MAAM,UAAU,aAAa,6EAAwE;AAAA,IACjH,gBAAgB,EAAE,MAAM,WAAW,aAAa,+DAA+D;AAAA,IAC/G,YAAY,EAAE,MAAM,UAAU,aAAa,4CAA4C;AAAA,IACvF,WAAW,EAAE,MAAM,UAAU,aAAa,oCAAoC,cAAc,IAAI;AAAA,IAChG,YAAY;AAAA,EACd;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI,KAAK,cAAc,GAAG;AACxB,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,MAAM;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,EAAE,UAAU,0BAA0B,WAAW,0BAA0B;AAAA,QACzF;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,UAAM,YAAY,KAAK;AACvB,UAAM,WAAW,YAAY,iBAAiB,WAAW,KAAK,QAAQ,IAAK,KAAK,WAAW;AAC3F,QAAI,CAAC,UAAU;AACb,4BAAsB,sDAAsD;AAAA,IAC9E;AACA,QAAI,CAAC,iBAAiB,SAAS,QAAQ,GAAG;AACxC;AAAA,QACE,wBAAwB,QAAQ,+BAA+B,iBAAiB,KAAK,IAAI,CAAC;AAAA,MAC5F;AAAA,IACF;AACA,UAAM,OAAgC,EAAE,SAAS;AACjD,QAAI,KAAK,aAAa,EAAG,MAAK,aAAa,KAAK,aAAa;AAC7D,QAAI,KAAK,OAAO,EAAG,MAAK,OAAO,KAAK,OAAO;AAC3C,QAAI,KAAK,YAAY,EAAG,MAAK,YAAY,KAAK,YAAY;AAC1D,QAAI,KAAK,SAAU,MAAK,WAAW,KAAK;AACxC,QAAI,KAAK,UAAU,EAAG,MAAK,YAAY;AAEvC,QAAI;AACF,YAAM,OAAO,MAAM,QAAiC,yBAAyB,IAAI;AACjF,UAAI,KAAK,UAAU,GAAG;AACpB,sBAAc,KAAK,UAAU,GAAa,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,GAAG,OAAO;AAAA,MACvF;AACA,YAAM,WAAW,MAAM;AAAA,QACrB,KAAK,IAAI,CAAC,GAAG,OAAO,EAAE,WAAW,KAAK,SAAS,IAAI,GAAG,QAAQ,IAAI,IAAI,CAAC,KAAK,UAAU,MAAM,EAAE,KAAK,EAAE;AAAA,QACrG;AAAA,UACE,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,CAAC,IAAI;AAAA,UACjD,MAAM,gBAAgB;AAAA,YACpB,MAAM,KAAK,OAAO;AAAA,YAClB,YAAY,KAAK,aAAa;AAAA,YAC9B,UAAU,KAAK;AAAA,UACjB,CAAC;AAAA,QACH;AAAA,MACF;AACA,YAAM,QAAQ,YACV;AAAA,QACE,YAAY,SAAS,iBAAiB,QAAQ;AAAA,QAC9C,GAAG,SAAS;AAAA,MACd,IACA,SAAS;AACb,wBAAkB;AAAA,QAChB,IAAI;AAAA,QACJ,MAAM,EAAE,UAAU,UAAU,SAAS,UAAU,GAAI,KAAK,UAAU,IAAI,EAAE,MAAM,KAAK,UAAU,EAAE,IAAI,CAAC,EAAG;AAAA,QACvG;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
executeCanvasRun
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZC6FICZ7.js";
|
|
4
4
|
import "./chunk-XZAVBONI.js";
|
|
5
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-TRAMBRVO.js";
|
|
6
6
|
import "./chunk-WN4KX7GE.js";
|
|
7
7
|
import "./chunk-FHN4QXZN.js";
|
|
8
8
|
import "./chunk-IVIJJXXT.js";
|
|
@@ -10,16 +10,16 @@ import "./chunk-Q6ULQMWG.js";
|
|
|
10
10
|
import "./chunk-KKJ4KJCW.js";
|
|
11
11
|
import "./chunk-IAZKXDWV.js";
|
|
12
12
|
import "./chunk-3ACMDRSE.js";
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-MJDN7CR7.js";
|
|
14
|
+
import "./chunk-7WDH6OKW.js";
|
|
15
15
|
import "./chunk-EJBLF2LI.js";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-ZEGWP4FP.js";
|
|
17
17
|
import "./chunk-HLHR3EK2.js";
|
|
18
|
+
import "./chunk-2QGGI7MF.js";
|
|
19
|
+
import "./chunk-CH44XVPE.js";
|
|
18
20
|
import "./chunk-QFODAMYR.js";
|
|
19
21
|
import "./chunk-EKX37C3T.js";
|
|
20
22
|
import "./chunk-Q5DFEVLE.js";
|
|
21
|
-
import "./chunk-2QGGI7MF.js";
|
|
22
|
-
import "./chunk-CH44XVPE.js";
|
|
23
23
|
import "./chunk-IOKD77L2.js";
|
|
24
24
|
import "./chunk-PGAYESXE.js";
|
|
25
25
|
import "./chunk-3OMFSYQ3.js";
|
|
@@ -93,4 +93,4 @@ var rerunCommand = defineCommand({
|
|
|
93
93
|
export {
|
|
94
94
|
rerunCommand
|
|
95
95
|
};
|
|
96
|
-
//# sourceMappingURL=rerun-
|
|
96
|
+
//# sourceMappingURL=rerun-X7XVOAL3.js.map
|
|
@@ -3,9 +3,9 @@ import {
|
|
|
3
3
|
executeCanvasRun,
|
|
4
4
|
runCommand,
|
|
5
5
|
stopBeforeKinds
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-ZC6FICZ7.js";
|
|
7
7
|
import "./chunk-XZAVBONI.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-TRAMBRVO.js";
|
|
9
9
|
import "./chunk-WN4KX7GE.js";
|
|
10
10
|
import "./chunk-FHN4QXZN.js";
|
|
11
11
|
import "./chunk-IVIJJXXT.js";
|
|
@@ -13,16 +13,16 @@ import "./chunk-Q6ULQMWG.js";
|
|
|
13
13
|
import "./chunk-KKJ4KJCW.js";
|
|
14
14
|
import "./chunk-IAZKXDWV.js";
|
|
15
15
|
import "./chunk-3ACMDRSE.js";
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-MJDN7CR7.js";
|
|
17
|
+
import "./chunk-7WDH6OKW.js";
|
|
18
18
|
import "./chunk-EJBLF2LI.js";
|
|
19
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-ZEGWP4FP.js";
|
|
20
20
|
import "./chunk-HLHR3EK2.js";
|
|
21
|
+
import "./chunk-2QGGI7MF.js";
|
|
22
|
+
import "./chunk-CH44XVPE.js";
|
|
21
23
|
import "./chunk-QFODAMYR.js";
|
|
22
24
|
import "./chunk-EKX37C3T.js";
|
|
23
25
|
import "./chunk-Q5DFEVLE.js";
|
|
24
|
-
import "./chunk-2QGGI7MF.js";
|
|
25
|
-
import "./chunk-CH44XVPE.js";
|
|
26
26
|
import "./chunk-IOKD77L2.js";
|
|
27
27
|
import "./chunk-PGAYESXE.js";
|
|
28
28
|
import "./chunk-3OMFSYQ3.js";
|
|
@@ -68,4 +68,4 @@ export {
|
|
|
68
68
|
runCommand,
|
|
69
69
|
stopBeforeKinds
|
|
70
70
|
};
|
|
71
|
-
//# sourceMappingURL=run-
|
|
71
|
+
//# sourceMappingURL=run-3GCYZ2HX.js.map
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
import {
|
|
12
12
|
readDefinitionPlatforms,
|
|
13
13
|
syncCreativeDefinitionBestEffort
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-KLO36KTV.js";
|
|
15
15
|
import "./chunk-XZAVBONI.js";
|
|
16
16
|
import {
|
|
17
17
|
pinnedModelHint
|
|
@@ -45,11 +45,11 @@ import {
|
|
|
45
45
|
voiceGenderModel,
|
|
46
46
|
webFontUrl,
|
|
47
47
|
writeSceneFiles
|
|
48
|
-
} from "./chunk-
|
|
48
|
+
} from "./chunk-ZEGWP4FP.js";
|
|
49
|
+
import "./chunk-CH44XVPE.js";
|
|
49
50
|
import "./chunk-QFODAMYR.js";
|
|
50
51
|
import "./chunk-EKX37C3T.js";
|
|
51
52
|
import "./chunk-Q5DFEVLE.js";
|
|
52
|
-
import "./chunk-CH44XVPE.js";
|
|
53
53
|
import "./chunk-IOKD77L2.js";
|
|
54
54
|
import {
|
|
55
55
|
readAvatars
|
|
@@ -1510,4 +1510,4 @@ async function stageBrandDisplayFace(outDir, compositionDir) {
|
|
|
1510
1510
|
export {
|
|
1511
1511
|
scaffoldAdCommand
|
|
1512
1512
|
};
|
|
1513
|
-
//# sourceMappingURL=scaffold-ad-
|
|
1513
|
+
//# sourceMappingURL=scaffold-ad-E6DD6U46.js.map
|
|
@@ -16,12 +16,12 @@ import {
|
|
|
16
16
|
import {
|
|
17
17
|
readDefinitionPlatforms,
|
|
18
18
|
syncCreativeDefinitionBestEffort
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-KLO36KTV.js";
|
|
20
20
|
import {
|
|
21
21
|
buildBackendClient
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-ZC6FICZ7.js";
|
|
23
23
|
import "./chunk-XZAVBONI.js";
|
|
24
|
-
import "./chunk-
|
|
24
|
+
import "./chunk-TRAMBRVO.js";
|
|
25
25
|
import "./chunk-WN4KX7GE.js";
|
|
26
26
|
import "./chunk-FHN4QXZN.js";
|
|
27
27
|
import "./chunk-IVIJJXXT.js";
|
|
@@ -34,7 +34,7 @@ import {
|
|
|
34
34
|
deliveryNote,
|
|
35
35
|
namesDelivery,
|
|
36
36
|
scaffoldDelivery
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-AMM4JMSN.js";
|
|
38
38
|
import {
|
|
39
39
|
LIBRARY_PLATFORMS,
|
|
40
40
|
NO_FIT_HINT,
|
|
@@ -48,8 +48,8 @@ import {
|
|
|
48
48
|
referenceDescribeContext,
|
|
49
49
|
resolveSourcePlatform
|
|
50
50
|
} from "./chunk-WC3YSN7L.js";
|
|
51
|
-
import "./chunk-
|
|
52
|
-
import "./chunk-
|
|
51
|
+
import "./chunk-MJDN7CR7.js";
|
|
52
|
+
import "./chunk-7WDH6OKW.js";
|
|
53
53
|
import "./chunk-EJBLF2LI.js";
|
|
54
54
|
import {
|
|
55
55
|
brandBlock,
|
|
@@ -76,17 +76,17 @@ import {
|
|
|
76
76
|
staticAvatarsNotCast,
|
|
77
77
|
titleFromSlug,
|
|
78
78
|
webFontUrl
|
|
79
|
-
} from "./chunk-
|
|
79
|
+
} from "./chunk-ZEGWP4FP.js";
|
|
80
80
|
import "./chunk-HLHR3EK2.js";
|
|
81
|
-
import "./chunk-QFODAMYR.js";
|
|
82
|
-
import "./chunk-EKX37C3T.js";
|
|
83
|
-
import "./chunk-Q5DFEVLE.js";
|
|
84
81
|
import {
|
|
85
82
|
describeViewer,
|
|
86
83
|
liveViewerLookups,
|
|
87
84
|
resolveViewer
|
|
88
85
|
} from "./chunk-2QGGI7MF.js";
|
|
89
86
|
import "./chunk-CH44XVPE.js";
|
|
87
|
+
import "./chunk-QFODAMYR.js";
|
|
88
|
+
import "./chunk-EKX37C3T.js";
|
|
89
|
+
import "./chunk-Q5DFEVLE.js";
|
|
90
90
|
import "./chunk-IOKD77L2.js";
|
|
91
91
|
import "./chunk-PGAYESXE.js";
|
|
92
92
|
import "./chunk-3OMFSYQ3.js";
|
|
@@ -1008,4 +1008,4 @@ export {
|
|
|
1008
1008
|
uploadSourceAsReference,
|
|
1009
1009
|
validateScaffoldedStaticAd
|
|
1010
1010
|
};
|
|
1011
|
-
//# sourceMappingURL=scaffold-static-ad-
|
|
1011
|
+
//# sourceMappingURL=scaffold-static-ad-6WNS2PXB.js.map
|