@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.
Files changed (120) hide show
  1. package/README.md +5 -1
  2. package/dist/{ads-7QKQEHKT.js → ads-CWKKIYD6.js} +5 -5
  3. package/dist/{analytics-B6ER4TQ7.js → analytics-XPU5SANS.js} +6 -6
  4. package/dist/{avatars-Y3DALQIU.js → avatars-3OMFIKOJ.js} +1 -1
  5. package/dist/{brief-NA3E2W4P.js → brief-TNOKTNFJ.js} +8 -8
  6. package/dist/{canvas-WHFDCHUP.js → canvas-PVNQ7YWV.js} +11 -11
  7. package/dist/{chatgpt-YBHXCXWZ.js → chatgpt-6KBW7F5S.js} +2 -2
  8. package/dist/{chunk-OBQ5YUOZ.js → chunk-7WDH6OKW.js} +2 -2
  9. package/dist/{chunk-KT5JVIPZ.js → chunk-AMM4JMSN.js} +2 -2
  10. package/dist/{chunk-3HKZU3Y5.js → chunk-AU3IMZZC.js} +2 -2
  11. package/dist/chunk-EGVWSAWY.js +83 -0
  12. package/dist/chunk-EGVWSAWY.js.map +1 -0
  13. package/dist/{chunk-DAMC4FKK.js → chunk-KLO36KTV.js} +2 -2
  14. package/dist/{chunk-U6G6ALXP.js → chunk-MAVT2CJ4.js} +3 -3
  15. package/dist/{chunk-WIOPEK7K.js → chunk-MJDN7CR7.js} +3 -3
  16. package/dist/{chunk-6PT22YSR.js → chunk-QAJFMVGU.js} +2 -2
  17. package/dist/{chunk-XYKODRQR.js → chunk-TRAMBRVO.js} +3 -3
  18. package/dist/chunk-VN3WDB4O.js +45 -0
  19. package/dist/chunk-VN3WDB4O.js.map +1 -0
  20. package/dist/{chunk-KOEXPN3G.js → chunk-ZC6FICZ7.js} +5 -5
  21. package/dist/{chunk-6WVYBY2G.js → chunk-ZEGWP4FP.js} +6 -6
  22. package/dist/cli.js +18 -18
  23. package/dist/{conversions-CRL327RY.js → conversions-UGRVDRWU.js} +1 -1
  24. package/dist/{creatives-LTIV3XPT.js → creatives-IFOPXTZK.js} +6 -6
  25. package/dist/{creatives-Y2WLGDJW.js → creatives-WBBN6G7H.js} +8 -2
  26. package/dist/{creatives-Y2WLGDJW.js.map → creatives-WBBN6G7H.js.map} +1 -1
  27. package/dist/{critique-RFTS2I46.js → critique-PQRVFC52.js} +3 -3
  28. package/dist/{experiment-3NDXGQK6.js → experiment-O6726OBP.js} +4 -4
  29. package/dist/{feedback-QSIPSNAL.js → feedback-MXUZWVOL.js} +7 -7
  30. package/dist/{feedback-record-DJHJWJAF.js → feedback-record-76RUAHZH.js} +7 -7
  31. package/dist/{ga4-IJ2UUICC.js → ga4-XFJO7VK2.js} +1 -1
  32. package/dist/{gsc-YAU4EA75.js → gsc-ILEIJYWP.js} +1 -1
  33. package/dist/{images-VUWUKGD6.js → images-Z7YBWRVJ.js} +1 -1
  34. package/dist/{inspiration-DNWTXEPX.js → inspiration-WGUU7W5Z.js} +2 -2
  35. package/dist/{landing-L3WDTW4D.js → landing-5RRWTSWK.js} +2 -2
  36. package/dist/{linkedin-RONIUYLJ.js → linkedin-DJ4VDOF4.js} +16 -2
  37. package/dist/linkedin-DJ4VDOF4.js.map +1 -0
  38. package/dist/{make-ZIJQZD5K.js → make-HZ5KAYSB.js} +28 -28
  39. package/dist/{media-sources-L4BI7HFL.js → media-sources-DEEKEJUB.js} +1 -1
  40. package/dist/{meta-2GJZPVKM.js → meta-XUHI3E3L.js} +3 -3
  41. package/dist/{meta-2GJZPVKM.js.map → meta-XUHI3E3L.js.map} +1 -1
  42. package/dist/{posts-MVCGZV54.js → posts-F7NFSUHV.js} +1 -1
  43. package/dist/preview-IBNFQ5RQ.js +101 -0
  44. package/dist/preview-IBNFQ5RQ.js.map +1 -0
  45. package/dist/{preview-DMTQR6ZW.js → preview-OV2EZ6YF.js} +43 -16
  46. package/dist/preview-OV2EZ6YF.js.map +1 -0
  47. package/dist/{rerun-MA2GB6WL.js → rerun-X7XVOAL3.js} +8 -8
  48. package/dist/{research-WWJUNYSJ.js → research-JMU4C4JZ.js} +1 -1
  49. package/dist/{run-HENSSAQW.js → run-3GCYZ2HX.js} +8 -8
  50. package/dist/{scaffold-ad-QQBCUYUO.js → scaffold-ad-E6DD6U46.js} +4 -4
  51. package/dist/{scaffold-static-ad-WUOAQEXS.js → scaffold-static-ad-6WNS2PXB.js} +11 -11
  52. package/dist/{scaffold-video-KFQAKQUO.js → scaffold-video-QKXFQ5FC.js} +4 -4
  53. package/dist/{scrape-FQUGOXCG.js → scrape-O4X6VGV2.js} +7 -39
  54. package/dist/scrape-O4X6VGV2.js.map +1 -0
  55. package/dist/{select-K2SXPDDJ.js → select-ABRNFFR2.js} +6 -6
  56. package/dist/{set-prompt-BZFOV3EB.js → set-prompt-5LYHDT4E.js} +3 -3
  57. package/dist/{shopify-Q7TQIQ6N.js → shopify-L4ZUI6OT.js} +4 -4
  58. package/dist/{sources-DTQ4NQAM.js → sources-6TWWOO7Q.js} +1 -1
  59. package/dist/{stale-5O7BQVTN.js → stale-MLQPXNLZ.js} +5 -5
  60. package/dist/{studio-IDXFTGHP.js → studio-ZLBBYHNY.js} +1 -1
  61. package/dist/{sync-definition-Q3XUSEZJ.js → sync-definition-MXVL2I2H.js} +4 -4
  62. package/dist/{testimonials-KLF3Y4QO.js → testimonials-RIJSQDSB.js} +2 -2
  63. package/dist/{translate-CBITGC7C.js → translate-A4GHRHSP.js} +10 -10
  64. package/dist/{validate-SAQEORZY.js → validate-44PVFQH7.js} +6 -6
  65. package/dist/{videos-GOIDZVVD.js → videos-RWPQVXS5.js} +1 -1
  66. package/dist/{winning-ads-LOMI72Q2.js → winning-ads-IT3O4EAN.js} +1 -1
  67. package/dist/{x-APVY4YHX.js → x-X7URL52T.js} +1 -1
  68. package/package.json +1 -1
  69. package/dist/linkedin-RONIUYLJ.js.map +0 -1
  70. package/dist/preview-DMTQR6ZW.js.map +0 -1
  71. package/dist/scrape-FQUGOXCG.js.map +0 -1
  72. /package/dist/{ads-7QKQEHKT.js.map → ads-CWKKIYD6.js.map} +0 -0
  73. /package/dist/{analytics-B6ER4TQ7.js.map → analytics-XPU5SANS.js.map} +0 -0
  74. /package/dist/{avatars-Y3DALQIU.js.map → avatars-3OMFIKOJ.js.map} +0 -0
  75. /package/dist/{brief-NA3E2W4P.js.map → brief-TNOKTNFJ.js.map} +0 -0
  76. /package/dist/{canvas-WHFDCHUP.js.map → canvas-PVNQ7YWV.js.map} +0 -0
  77. /package/dist/{chatgpt-YBHXCXWZ.js.map → chatgpt-6KBW7F5S.js.map} +0 -0
  78. /package/dist/{chunk-OBQ5YUOZ.js.map → chunk-7WDH6OKW.js.map} +0 -0
  79. /package/dist/{chunk-KT5JVIPZ.js.map → chunk-AMM4JMSN.js.map} +0 -0
  80. /package/dist/{chunk-3HKZU3Y5.js.map → chunk-AU3IMZZC.js.map} +0 -0
  81. /package/dist/{chunk-DAMC4FKK.js.map → chunk-KLO36KTV.js.map} +0 -0
  82. /package/dist/{chunk-U6G6ALXP.js.map → chunk-MAVT2CJ4.js.map} +0 -0
  83. /package/dist/{chunk-WIOPEK7K.js.map → chunk-MJDN7CR7.js.map} +0 -0
  84. /package/dist/{chunk-6PT22YSR.js.map → chunk-QAJFMVGU.js.map} +0 -0
  85. /package/dist/{chunk-XYKODRQR.js.map → chunk-TRAMBRVO.js.map} +0 -0
  86. /package/dist/{chunk-KOEXPN3G.js.map → chunk-ZC6FICZ7.js.map} +0 -0
  87. /package/dist/{chunk-6WVYBY2G.js.map → chunk-ZEGWP4FP.js.map} +0 -0
  88. /package/dist/{conversions-CRL327RY.js.map → conversions-UGRVDRWU.js.map} +0 -0
  89. /package/dist/{creatives-LTIV3XPT.js.map → creatives-IFOPXTZK.js.map} +0 -0
  90. /package/dist/{critique-RFTS2I46.js.map → critique-PQRVFC52.js.map} +0 -0
  91. /package/dist/{experiment-3NDXGQK6.js.map → experiment-O6726OBP.js.map} +0 -0
  92. /package/dist/{feedback-QSIPSNAL.js.map → feedback-MXUZWVOL.js.map} +0 -0
  93. /package/dist/{feedback-record-DJHJWJAF.js.map → feedback-record-76RUAHZH.js.map} +0 -0
  94. /package/dist/{ga4-IJ2UUICC.js.map → ga4-XFJO7VK2.js.map} +0 -0
  95. /package/dist/{gsc-YAU4EA75.js.map → gsc-ILEIJYWP.js.map} +0 -0
  96. /package/dist/{images-VUWUKGD6.js.map → images-Z7YBWRVJ.js.map} +0 -0
  97. /package/dist/{inspiration-DNWTXEPX.js.map → inspiration-WGUU7W5Z.js.map} +0 -0
  98. /package/dist/{landing-L3WDTW4D.js.map → landing-5RRWTSWK.js.map} +0 -0
  99. /package/dist/{make-ZIJQZD5K.js.map → make-HZ5KAYSB.js.map} +0 -0
  100. /package/dist/{media-sources-L4BI7HFL.js.map → media-sources-DEEKEJUB.js.map} +0 -0
  101. /package/dist/{posts-MVCGZV54.js.map → posts-F7NFSUHV.js.map} +0 -0
  102. /package/dist/{rerun-MA2GB6WL.js.map → rerun-X7XVOAL3.js.map} +0 -0
  103. /package/dist/{research-WWJUNYSJ.js.map → research-JMU4C4JZ.js.map} +0 -0
  104. /package/dist/{run-HENSSAQW.js.map → run-3GCYZ2HX.js.map} +0 -0
  105. /package/dist/{scaffold-ad-QQBCUYUO.js.map → scaffold-ad-E6DD6U46.js.map} +0 -0
  106. /package/dist/{scaffold-static-ad-WUOAQEXS.js.map → scaffold-static-ad-6WNS2PXB.js.map} +0 -0
  107. /package/dist/{scaffold-video-KFQAKQUO.js.map → scaffold-video-QKXFQ5FC.js.map} +0 -0
  108. /package/dist/{select-K2SXPDDJ.js.map → select-ABRNFFR2.js.map} +0 -0
  109. /package/dist/{set-prompt-BZFOV3EB.js.map → set-prompt-5LYHDT4E.js.map} +0 -0
  110. /package/dist/{shopify-Q7TQIQ6N.js.map → shopify-L4ZUI6OT.js.map} +0 -0
  111. /package/dist/{sources-DTQ4NQAM.js.map → sources-6TWWOO7Q.js.map} +0 -0
  112. /package/dist/{stale-5O7BQVTN.js.map → stale-MLQPXNLZ.js.map} +0 -0
  113. /package/dist/{studio-IDXFTGHP.js.map → studio-ZLBBYHNY.js.map} +0 -0
  114. /package/dist/{sync-definition-Q3XUSEZJ.js.map → sync-definition-MXVL2I2H.js.map} +0 -0
  115. /package/dist/{testimonials-KLF3Y4QO.js.map → testimonials-RIJSQDSB.js.map} +0 -0
  116. /package/dist/{translate-CBITGC7C.js.map → translate-A4GHRHSP.js.map} +0 -0
  117. /package/dist/{validate-SAQEORZY.js.map → validate-44PVFQH7.js.map} +0 -0
  118. /package/dist/{videos-GOIDZVVD.js.map → videos-RWPQVXS5.js.map} +0 -0
  119. /package/dist/{winning-ads-LOMI72Q2.js.map → winning-ads-IT3O4EAN.js.map} +0 -0
  120. /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-KT5JVIPZ.js";
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-6PT22YSR.js";
20
+ } from "./chunk-QAJFMVGU.js";
21
21
  import {
22
22
  runBaker
23
- } from "./chunk-WIOPEK7K.js";
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-ZIJQZD5K.js.map
1367
+ //# sourceMappingURL=make-HZ5KAYSB.js.map
@@ -32,4 +32,4 @@ Full guide: __tooling__/docs/tools/baker/media-sources.md`
32
32
  export {
33
33
  mediaSourcesCommand
34
34
  };
35
- //# sourceMappingURL=media-sources-L4BI7HFL.js.map
35
+ //# sourceMappingURL=media-sources-DEEKEJUB.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 --creative-id 9988 --ad-format MOBILE_FEED_STANDARD --out-file /tmp/p.html
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-DMTQR6ZW.js").then((m) => m.previewCommand),
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-2GJZPVKM.js.map
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":[]}
@@ -33,4 +33,4 @@ Full guide: __tooling__/docs/tools/baker/posts.md`
33
33
  export {
34
34
  postsCommand
35
35
  };
36
- //# sourceMappingURL=posts-MVCGZV54.js.map
36
+ //# sourceMappingURL=posts-F7NFSUHV.js.map
@@ -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: `Generate a Meta-hosted preview iframe for a creative or ad. Returns iframe HTML which you
142
- can embed or save to a file. The iframe URL contains a short-lived access token \u2014 treat as secret.
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 when you need to know what a creative looks like in one specific placement \u2014 this is
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-file /tmp/preview.html
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: "Save iframe HTML to this path" },
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
- const summary = { ok: true, data: { file: args["out-file"], rows: data.length, adFormat } };
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
- writeJsonEnvelope(hints.length > 0 ? { ok: true, data, hints } : { ok: true, data });
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-DMTQR6ZW.js.map
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":"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","names":[]}
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  executeCanvasRun
3
- } from "./chunk-KOEXPN3G.js";
3
+ } from "./chunk-ZC6FICZ7.js";
4
4
  import "./chunk-XZAVBONI.js";
5
- import "./chunk-XYKODRQR.js";
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-WIOPEK7K.js";
14
- import "./chunk-OBQ5YUOZ.js";
13
+ import "./chunk-MJDN7CR7.js";
14
+ import "./chunk-7WDH6OKW.js";
15
15
  import "./chunk-EJBLF2LI.js";
16
- import "./chunk-6WVYBY2G.js";
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-MA2GB6WL.js.map
96
+ //# sourceMappingURL=rerun-X7XVOAL3.js.map
@@ -72,4 +72,4 @@ Full guide: __tooling__/docs/tools/baker/research.md`
72
72
  export {
73
73
  researchCommand
74
74
  };
75
- //# sourceMappingURL=research-WWJUNYSJ.js.map
75
+ //# sourceMappingURL=research-JMU4C4JZ.js.map
@@ -3,9 +3,9 @@ import {
3
3
  executeCanvasRun,
4
4
  runCommand,
5
5
  stopBeforeKinds
6
- } from "./chunk-KOEXPN3G.js";
6
+ } from "./chunk-ZC6FICZ7.js";
7
7
  import "./chunk-XZAVBONI.js";
8
- import "./chunk-XYKODRQR.js";
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-WIOPEK7K.js";
17
- import "./chunk-OBQ5YUOZ.js";
16
+ import "./chunk-MJDN7CR7.js";
17
+ import "./chunk-7WDH6OKW.js";
18
18
  import "./chunk-EJBLF2LI.js";
19
- import "./chunk-6WVYBY2G.js";
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-HENSSAQW.js.map
71
+ //# sourceMappingURL=run-3GCYZ2HX.js.map
@@ -11,7 +11,7 @@ import {
11
11
  import {
12
12
  readDefinitionPlatforms,
13
13
  syncCreativeDefinitionBestEffort
14
- } from "./chunk-DAMC4FKK.js";
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-6WVYBY2G.js";
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-QQBCUYUO.js.map
1513
+ //# sourceMappingURL=scaffold-ad-E6DD6U46.js.map
@@ -16,12 +16,12 @@ import {
16
16
  import {
17
17
  readDefinitionPlatforms,
18
18
  syncCreativeDefinitionBestEffort
19
- } from "./chunk-DAMC4FKK.js";
19
+ } from "./chunk-KLO36KTV.js";
20
20
  import {
21
21
  buildBackendClient
22
- } from "./chunk-KOEXPN3G.js";
22
+ } from "./chunk-ZC6FICZ7.js";
23
23
  import "./chunk-XZAVBONI.js";
24
- import "./chunk-XYKODRQR.js";
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-KT5JVIPZ.js";
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-WIOPEK7K.js";
52
- import "./chunk-OBQ5YUOZ.js";
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-6WVYBY2G.js";
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-WUOAQEXS.js.map
1011
+ //# sourceMappingURL=scaffold-static-ad-6WNS2PXB.js.map