@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
package/README.md CHANGED
@@ -1231,7 +1231,7 @@ baker ads meta adsets --campaign-id 6123 --all-statuses --audience --output json
1231
1231
 
1232
1232
  # "Tell me about ad 9988"
1233
1233
  baker ads meta creatives --creative-id 9988
1234
- baker ads meta preview --creative-id 9988 --ad-format MOBILE_FEED_STANDARD --out-file /tmp/p.html
1234
+ baker ads meta preview --creative-id 9988 --ad-format MOBILE_FEED_STANDARD # the text the ad displays + a picture; --out-file also keeps the iframe HTML
1235
1235
 
1236
1236
  # "Why does it show as a still image in one placement?"
1237
1237
  baker ads meta insights --object 9988 --level ad --intent video \
@@ -1547,6 +1547,10 @@ baker ads linkedin analytics
1547
1547
  baker ads linkedin analytics --level campaign --campaign-id 1234 \
1548
1548
  --pivot job-title --intent baseline --last-days 30
1549
1549
 
1550
+ # "What does this ad actually show?" — LinkedIn's own feed rendering, desktop + mobile:
1551
+ # data.previews[].shownText (the text displayed, in order) and .image (a picture)
1552
+ baker ads linkedin preview 1611562694 --account-id 503001492
1553
+
1550
1554
  # "Top companies seeing this campaign" (ABM feedback loop) — org names auto-resolved
1551
1555
  baker ads linkedin top-companies --campaign-id 1234 --last-days 30
1552
1556
 
@@ -34,10 +34,10 @@ Full guides: __tooling__/docs/tools/baker/ads-<platform>.md (google|meta|linkedi
34
34
  },
35
35
  subCommands: {
36
36
  google: () => import("./google-UJ4YJGTJ.js").then((m) => m.googleCommand),
37
- meta: () => import("./meta-2GJZPVKM.js").then((m) => m.metaCommand),
38
- linkedin: () => import("./linkedin-RONIUYLJ.js").then((m) => m.linkedinCommand),
39
- x: () => import("./x-APVY4YHX.js").then((m) => m.xCommand),
40
- chatgpt: () => import("./chatgpt-YBHXCXWZ.js").then((m) => m.chatgptCommand),
37
+ meta: () => import("./meta-XUHI3E3L.js").then((m) => m.metaCommand),
38
+ linkedin: () => import("./linkedin-DJ4VDOF4.js").then((m) => m.linkedinCommand),
39
+ x: () => import("./x-X7URL52T.js").then((m) => m.xCommand),
40
+ chatgpt: () => import("./chatgpt-6KBW7F5S.js").then((m) => m.chatgptCommand),
41
41
  performance: () => import("./performance-MQLRSH44.js").then((m) => m.performanceCommand),
42
42
  terms: () => import("./terms-NX5CAJXT.js").then((m) => m.termsCommand)
43
43
  }
@@ -45,4 +45,4 @@ Full guides: __tooling__/docs/tools/baker/ads-<platform>.md (google|meta|linkedi
45
45
  export {
46
46
  adsCommand
47
47
  };
48
- //# sourceMappingURL=ads-7QKQEHKT.js.map
48
+ //# sourceMappingURL=ads-CWKKIYD6.js.map
@@ -18,6 +18,11 @@ import {
18
18
  ingestBrief
19
19
  } from "./chunk-PQFTKHDA.js";
20
20
  import "./chunk-GRQ2AXDX.js";
21
+ import {
22
+ ConversionArgsError,
23
+ conversionsWrite,
24
+ parseConversionsArgs
25
+ } from "./chunk-IHZUSAUX.js";
21
26
  import {
22
27
  TAG_MANAGER_TIMEOUT_MS
23
28
  } from "./chunk-P5HG6WDH.js";
@@ -28,11 +33,6 @@ import {
28
33
  import {
29
34
  analyticsErrorEnvelope
30
35
  } from "./chunk-5HPKYRTE.js";
31
- import {
32
- ConversionArgsError,
33
- conversionsWrite,
34
- parseConversionsArgs
35
- } from "./chunk-IHZUSAUX.js";
36
36
  import {
37
37
  AD_PARAM_ROLE_SPECS,
38
38
  ANALYTICS_EVENT_DOORS,
@@ -2434,4 +2434,4 @@ export {
2434
2434
  requestBody,
2435
2435
  sendingEventsAddress
2436
2436
  };
2437
- //# sourceMappingURL=analytics-B6ER4TQ7.js.map
2437
+ //# sourceMappingURL=analytics-XPU5SANS.js.map
@@ -35,4 +35,4 @@ Full guide: __tooling__/docs/tools/baker/avatars.md`
35
35
  export {
36
36
  avatarsCommand
37
37
  };
38
- //# sourceMappingURL=avatars-Y3DALQIU.js.map
38
+ //# sourceMappingURL=avatars-3OMFIKOJ.js.map
@@ -8,23 +8,23 @@ import {
8
8
  buildNext,
9
9
  ideasReport
10
10
  } from "./chunk-NL77JRKE.js";
11
+ import {
12
+ withDefinitions
13
+ } from "./chunk-7TDJCDKT.js";
11
14
  import {
12
15
  buildSearchBody
13
16
  } from "./chunk-LK5OKVCM.js";
14
17
  import "./chunk-DEZBCK5P.js";
15
18
  import "./chunk-RIVHJC6L.js";
19
+ import {
20
+ liveViewerLookups
21
+ } from "./chunk-2QGGI7MF.js";
22
+ import "./chunk-CH44XVPE.js";
16
23
  import "./chunk-QFODAMYR.js";
17
24
  import "./chunk-EKX37C3T.js";
18
- import {
19
- withDefinitions
20
- } from "./chunk-7TDJCDKT.js";
21
25
  import {
22
26
  readInsights
23
27
  } from "./chunk-Q5DFEVLE.js";
24
- import {
25
- liveViewerLookups
26
- } from "./chunk-2QGGI7MF.js";
27
- import "./chunk-CH44XVPE.js";
28
28
  import "./chunk-IOKD77L2.js";
29
29
  import "./chunk-PGAYESXE.js";
30
30
  import {
@@ -540,4 +540,4 @@ export {
540
540
  tastePart,
541
541
  whatWorks
542
542
  };
543
- //# sourceMappingURL=brief-NA3E2W4P.js.map
543
+ //# sourceMappingURL=brief-TNOKTNFJ.js.map
@@ -25,22 +25,22 @@ Subcommands:
25
25
  Full guide: __tooling__/docs/tools/baker/canvas.md`
26
26
  },
27
27
  subCommands: {
28
- run: () => import("./run-HENSSAQW.js").then((m) => m.runCommand),
29
- rerun: () => import("./rerun-MA2GB6WL.js").then((m) => m.rerunCommand),
30
- validate: () => import("./validate-SAQEORZY.js").then((m) => m.validateCommand),
31
- critique: () => import("./critique-RFTS2I46.js").then((m) => m.critiqueCommand),
28
+ run: () => import("./run-3GCYZ2HX.js").then((m) => m.runCommand),
29
+ rerun: () => import("./rerun-X7XVOAL3.js").then((m) => m.rerunCommand),
30
+ validate: () => import("./validate-44PVFQH7.js").then((m) => m.validateCommand),
31
+ critique: () => import("./critique-PQRVFC52.js").then((m) => m.critiqueCommand),
32
32
  "viewer-check": () => import("./viewer-check-KTRRUVZN.js").then((m) => m.viewerCheckCommand),
33
33
  catalog: () => import("./catalog-URTZYAPU.js").then((m) => m.catalogCommand),
34
34
  inspect: () => import("./inspect-BM6GJHQV.js").then((m) => m.inspectCommand),
35
- "scaffold-ad": () => import("./scaffold-ad-QQBCUYUO.js").then((m) => m.scaffoldAdCommand),
36
- "scaffold-video": () => import("./scaffold-video-KFQAKQUO.js").then((m) => m.scaffoldVideoCommand),
37
- "scaffold-static-ad": () => import("./scaffold-static-ad-WUOAQEXS.js").then((m) => m.scaffoldStaticAdCommand),
38
- "set-prompt": () => import("./set-prompt-BZFOV3EB.js").then((m) => m.setPromptCommand),
39
- "sync-definition": () => import("./sync-definition-Q3XUSEZJ.js").then((m) => m.syncDefinitionCommand),
40
- stale: () => import("./stale-5O7BQVTN.js").then((m) => m.staleCommand)
35
+ "scaffold-ad": () => import("./scaffold-ad-E6DD6U46.js").then((m) => m.scaffoldAdCommand),
36
+ "scaffold-video": () => import("./scaffold-video-QKXFQ5FC.js").then((m) => m.scaffoldVideoCommand),
37
+ "scaffold-static-ad": () => import("./scaffold-static-ad-6WNS2PXB.js").then((m) => m.scaffoldStaticAdCommand),
38
+ "set-prompt": () => import("./set-prompt-5LYHDT4E.js").then((m) => m.setPromptCommand),
39
+ "sync-definition": () => import("./sync-definition-MXVL2I2H.js").then((m) => m.syncDefinitionCommand),
40
+ stale: () => import("./stale-MLQPXNLZ.js").then((m) => m.staleCommand)
41
41
  }
42
42
  });
43
43
  export {
44
44
  canvasCommand
45
45
  };
46
- //# sourceMappingURL=canvas-WHFDCHUP.js.map
46
+ //# sourceMappingURL=canvas-PVNQ7YWV.js.map
@@ -31,7 +31,7 @@ Full guide: __tooling__/docs/tools/baker/ads-chatgpt.md`
31
31
  campaigns: () => import("./campaigns-IRMLPW6N.js").then((m) => m.campaignsCommand),
32
32
  "ad-groups": () => import("./ad-groups-TW2UKDVU.js").then((m) => m.adGroupsCommand),
33
33
  ads: () => import("./ads-5CJQRTUN.js").then((m) => m.adsCommand),
34
- conversions: () => import("./conversions-CRL327RY.js").then((m) => m.conversionsCommand),
34
+ conversions: () => import("./conversions-UGRVDRWU.js").then((m) => m.conversionsCommand),
35
35
  pixels: () => import("./pixels-3BHTXTDV.js").then((m) => m.pixelsCommand),
36
36
  audiences: () => import("./audiences-4MYDTY74.js").then((m) => m.audiencesCommand),
37
37
  catalogs: () => import("./catalogs-WYRRTRCM.js").then((m) => m.catalogsCommand),
@@ -44,4 +44,4 @@ Full guide: __tooling__/docs/tools/baker/ads-chatgpt.md`
44
44
  export {
45
45
  chatgptCommand
46
46
  };
47
- //# sourceMappingURL=chatgpt-YBHXCXWZ.js.map
47
+ //# sourceMappingURL=chatgpt-6KBW7F5S.js.map
@@ -16,7 +16,7 @@ import {
16
16
  readPeople,
17
17
  uncastPeople,
18
18
  unsuppliedPlaceholderAssets
19
- } from "./chunk-6WVYBY2G.js";
19
+ } from "./chunk-ZEGWP4FP.js";
20
20
  import {
21
21
  ViewerAnswerSchema,
22
22
  describeViewer,
@@ -1899,4 +1899,4 @@ export {
1899
1899
  staleCreatives,
1900
1900
  clearLegacyDirtyMarker
1901
1901
  };
1902
- //# sourceMappingURL=chunk-OBQ5YUOZ.js.map
1902
+ //# sourceMappingURL=chunk-7WDH6OKW.js.map
@@ -3,7 +3,7 @@ import {
3
3
  parseDefinitionDelivery,
4
4
  resolveDelivery,
5
5
  resolveFormatList
6
- } from "./chunk-6WVYBY2G.js";
6
+ } from "./chunk-ZEGWP4FP.js";
7
7
  import {
8
8
  AD_PLACEMENTS
9
9
  } from "./chunk-MCJ5I5LR.js";
@@ -88,4 +88,4 @@ export {
88
88
  deliveryDefinitionFields,
89
89
  deliveryNote
90
90
  };
91
- //# sourceMappingURL=chunk-KT5JVIPZ.js.map
91
+ //# sourceMappingURL=chunk-AMM4JMSN.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  latestVersion
3
- } from "./chunk-OBQ5YUOZ.js";
3
+ } from "./chunk-7WDH6OKW.js";
4
4
  import {
5
5
  canvasOutputsRoot
6
6
  } from "./chunk-N3PASNUA.js";
@@ -16,4 +16,4 @@ async function versionOf(slug, run) {
16
16
  export {
17
17
  versionOf
18
18
  };
19
- //# sourceMappingURL=chunk-3HKZU3Y5.js.map
19
+ //# sourceMappingURL=chunk-AU3IMZZC.js.map
@@ -0,0 +1,83 @@
1
+ import {
2
+ launchBrowser
3
+ } from "./chunk-VN3WDB4O.js";
4
+
5
+ // src/commands/ads/ad-preview-images.ts
6
+ import { mkdirSync } from "fs";
7
+ import { tmpdir } from "os";
8
+ import { join } from "path";
9
+ var AD_PREVIEW_DIR = join(tmpdir(), "baker-ad-previews");
10
+ async function renderAdPreviews(inputs, target, draw = drawPreviewInChromium) {
11
+ mkdirSync(target.dir, { recursive: true });
12
+ const previews = [];
13
+ const taken = /* @__PURE__ */ new Map();
14
+ for (const input of inputs) {
15
+ const where = input.surface ? { placement: input.placement, surface: input.surface } : { placement: input.placement };
16
+ const base = [target.name, input.placement, input.surface?.toLowerCase()].filter(Boolean).join("-");
17
+ const seen = (taken.get(base) ?? 0) + 1;
18
+ taken.set(base, seen);
19
+ const file = join(target.dir, `${seen > 1 ? `${base}-${seen}` : base}.png`);
20
+ try {
21
+ const { text } = await draw(input.html, file);
22
+ previews.push({ ...where, shownText: shownLines(text), image: file });
23
+ } catch (err) {
24
+ previews.push({ ...where, error: err instanceof Error ? err.message : String(err) });
25
+ }
26
+ }
27
+ return { previews, hints: previewHints(previews) };
28
+ }
29
+ function shownLines(text) {
30
+ return text.split("\n").map((line) => line.replace(/\s+/g, " ").trim()).filter(Boolean);
31
+ }
32
+ function previewHints(previews) {
33
+ const hints = [];
34
+ if (previews.some((p) => "image" in p)) {
35
+ hints.push(
36
+ "shownText is what people see on the ad, in order \u2014 rendered by the platform itself, so it settles which text is displayed (headline under the image, button, cut-off intro). The API fields only say what is stored. Words drawn into the artwork are not in shownText: Read the image for those, and for cropping or how the ad looks."
37
+ );
38
+ }
39
+ if (previews.some((p) => "error" in p)) {
40
+ hints.push(
41
+ "Some previews could not be drawn. Do not describe how those look \u2014 say they could not be checked, and carry on with the rest."
42
+ );
43
+ }
44
+ return hints;
45
+ }
46
+ async function drawPreviewInChromium(html, file) {
47
+ const browser = await launchBrowser();
48
+ try {
49
+ const context = await browser.newContext({ viewport: { width: 900, height: 1200 }, deviceScaleFactor: 2 });
50
+ const page = await context.newPage();
51
+ await page.setContent(`<!doctype html><body style="margin:0;background:#fff">${html}</body>`, {
52
+ waitUntil: "load",
53
+ timeout: 3e4
54
+ });
55
+ await page.waitForLoadState("networkidle", { timeout: 15e3 }).catch(() => void 0);
56
+ const iframe = await page.$("iframe");
57
+ if (!iframe) throw new Error("the platform returned no preview frame");
58
+ const frame = await iframe.contentFrame();
59
+ if (frame) {
60
+ const height = await frame.evaluate(
61
+ () => Math.max(document.documentElement.scrollHeight, document.body?.scrollHeight ?? 0)
62
+ );
63
+ if (height > 0) {
64
+ await iframe.evaluate((node, h) => {
65
+ node.removeAttribute("height");
66
+ node.style.height = `${h}px`;
67
+ }, height);
68
+ await frame.waitForLoadState("networkidle", { timeout: 1e4 }).catch(() => void 0);
69
+ }
70
+ }
71
+ await iframe.screenshot({ path: file });
72
+ const text = frame ? await frame.evaluate(() => document.body?.innerText ?? "") : "";
73
+ return { text };
74
+ } finally {
75
+ await browser.close();
76
+ }
77
+ }
78
+
79
+ export {
80
+ AD_PREVIEW_DIR,
81
+ renderAdPreviews
82
+ };
83
+ //# sourceMappingURL=chunk-EGVWSAWY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/ad-preview-images.ts"],"sourcesContent":["import { mkdirSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { launchBrowser } from \"../../engine/landing-library/browser.ts\";\n\n/**\n * Opens a platform's preview iframe and returns what it displays: the text\n * people read (`shownText`) and a picture for questions text cannot answer.\n *\n * The API's fields say what is stored, not what shows. A Session paused seven\n * live ads because a stored headline read like an internal code, with no way to\n * check whether the feed showed it. The rendered text settles that; the picture\n * covers what is not text — words drawn into the artwork, cropping, layout.\n */\n\nexport interface AdPreviewInput {\n placement: string;\n /** Where the platform shows it (LinkedIn FEED, …) when one placement renders on several surfaces. */\n surface?: string;\n html: string;\n}\n\ntype AdPreviewWhere = { placement: string; surface?: string };\nexport type AdPreviewResult =\n | (AdPreviewWhere & { shownText: string[]; image: string })\n | (AdPreviewWhere & { error: string });\n\n/** Render `html` (a platform iframe): save a PNG at `file`, return the text it displays. */\nexport type DrawPreview = (html: string, file: string) => Promise<{ text: string }>;\n\nexport const AD_PREVIEW_DIR = join(tmpdir(), \"baker-ad-previews\");\n\nexport async function renderAdPreviews(\n inputs: readonly AdPreviewInput[],\n target: { dir: string; name: string },\n draw: DrawPreview = drawPreviewInChromium,\n): Promise<{ previews: AdPreviewResult[]; hints: string[] }> {\n mkdirSync(target.dir, { recursive: true });\n const previews: AdPreviewResult[] = [];\n const taken = new Map<string, number>();\n for (const input of inputs) {\n const where: AdPreviewWhere = input.surface\n ? { placement: input.placement, surface: input.surface }\n : { placement: input.placement };\n // One file per rendering: a shared name would leave two results pointing at the last picture drawn.\n const base = [target.name, input.placement, input.surface?.toLowerCase()].filter(Boolean).join(\"-\");\n const seen = (taken.get(base) ?? 0) + 1;\n taken.set(base, seen);\n const file = join(target.dir, `${seen > 1 ? `${base}-${seen}` : base}.png`);\n try {\n const { text } = await draw(input.html, file);\n previews.push({ ...where, shownText: shownLines(text), image: file });\n } catch (err) {\n previews.push({ ...where, error: err instanceof Error ? err.message : String(err) });\n }\n }\n return { previews, hints: previewHints(previews) };\n}\n\nfunction shownLines(text: string): string[] {\n return text\n .split(\"\\n\")\n .map((line) => line.replace(/\\s+/g, \" \").trim())\n .filter(Boolean);\n}\n\nfunction previewHints(previews: readonly AdPreviewResult[]): string[] {\n const hints: string[] = [];\n if (previews.some((p) => \"image\" in p)) {\n hints.push(\n \"shownText is what people see on the ad, in order — rendered by the platform itself, so it settles which text is displayed (headline under the image, button, cut-off intro). The API fields only say what is stored. Words drawn into the artwork are not in shownText: Read the image for those, and for cropping or how the ad looks.\",\n );\n }\n if (previews.some((p) => \"error\" in p)) {\n hints.push(\n \"Some previews could not be drawn. Do not describe how those look — say they could not be checked, and carry on with the rest.\",\n );\n }\n return hints;\n}\n\n/**\n * The platforms' iframes have a fixed window (Meta's 335×450) and scroll the rest,\n * which cuts the headline and button off a picture. The frame is grown to its\n * content's height first, so the picture holds the whole ad.\n */\nexport async function drawPreviewInChromium(html: string, file: string): Promise<{ text: string }> {\n const browser = await launchBrowser();\n try {\n const context = await browser.newContext({ viewport: { width: 900, height: 1200 }, deviceScaleFactor: 2 });\n const page = await context.newPage();\n await page.setContent(`<!doctype html><body style=\"margin:0;background:#fff\">${html}</body>`, {\n waitUntil: \"load\",\n timeout: 30_000,\n });\n await page.waitForLoadState(\"networkidle\", { timeout: 15_000 }).catch(() => undefined);\n const iframe = await page.$(\"iframe\");\n if (!iframe) throw new Error(\"the platform returned no preview frame\");\n const frame = await iframe.contentFrame();\n if (frame) {\n const height = await frame.evaluate(() =>\n Math.max(document.documentElement.scrollHeight, document.body?.scrollHeight ?? 0),\n );\n if (height > 0) {\n await iframe.evaluate((node, h) => {\n node.removeAttribute(\"height\");\n (node as HTMLElement).style.height = `${h}px`;\n }, height);\n await frame.waitForLoadState(\"networkidle\", { timeout: 10_000 }).catch(() => undefined);\n }\n }\n await iframe.screenshot({ path: file });\n // innerText follows the layout: hidden elements drop out, line breaks stay.\n const text = frame ? await frame.evaluate(() => document.body?.innerText ?? \"\") : \"\";\n return { text };\n } finally {\n await browser.close();\n }\n}\n"],"mappings":"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","names":[]}
@@ -10,7 +10,7 @@ import {
10
10
  parseDefinitionSourceFields,
11
11
  parseDefinitionStrategyFields,
12
12
  prepareCanvas
13
- } from "./chunk-6WVYBY2G.js";
13
+ } from "./chunk-ZEGWP4FP.js";
14
14
  import {
15
15
  BackendClient
16
16
  } from "./chunk-DWPOAU4Z.js";
@@ -221,4 +221,4 @@ export {
221
221
  resolveCanvasPath,
222
222
  syncDefinitionCommand
223
223
  };
224
- //# sourceMappingURL=chunk-DAMC4FKK.js.map
224
+ //# sourceMappingURL=chunk-KLO36KTV.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  recordIdeaLines
3
- } from "./chunk-OBQ5YUOZ.js";
3
+ } from "./chunk-7WDH6OKW.js";
4
4
  import {
5
5
  anchorLines,
6
6
  readIdeaAnchor
7
- } from "./chunk-6WVYBY2G.js";
7
+ } from "./chunk-ZEGWP4FP.js";
8
8
  import {
9
9
  findWorkspaceRoot
10
10
  } from "./chunk-N3PASNUA.js";
@@ -63,4 +63,4 @@ export {
63
63
  withAnchor,
64
64
  readCreativeIdea
65
65
  };
66
- //# sourceMappingURL=chunk-U6G6ALXP.js.map
66
+ //# sourceMappingURL=chunk-MAVT2CJ4.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  isStaticAdCanvas,
3
3
  readRenderState
4
- } from "./chunk-OBQ5YUOZ.js";
4
+ } from "./chunk-7WDH6OKW.js";
5
5
  import {
6
6
  finalOutputLabelsFromCanvas
7
7
  } from "./chunk-EJBLF2LI.js";
@@ -14,7 +14,7 @@ import {
14
14
  plateFixPrompt,
15
15
  sameTag,
16
16
  seriesMemberAd
17
- } from "./chunk-6WVYBY2G.js";
17
+ } from "./chunk-ZEGWP4FP.js";
18
18
  import {
19
19
  fetchRunRecord
20
20
  } from "./chunk-HLHR3EK2.js";
@@ -927,4 +927,4 @@ export {
927
927
  writeSeriesMemberCanvas,
928
928
  seriesRunHints
929
929
  };
930
- //# sourceMappingURL=chunk-WIOPEK7K.js.map
930
+ //# sourceMappingURL=chunk-MJDN7CR7.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  leadVersion,
3
3
  writeSeriesMemberCanvas
4
- } from "./chunk-WIOPEK7K.js";
4
+ } from "./chunk-MJDN7CR7.js";
5
5
  import {
6
6
  definitionFieldsOf,
7
7
  setDefinitionFields,
@@ -88,4 +88,4 @@ export {
88
88
  makeSeriesAd,
89
89
  seriesMadeEnvelope
90
90
  };
91
- //# sourceMappingURL=chunk-6PT22YSR.js.map
91
+ //# sourceMappingURL=chunk-QAJFMVGU.js.map
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  readRenderState,
3
3
  recordSeen
4
- } from "./chunk-OBQ5YUOZ.js";
4
+ } from "./chunk-7WDH6OKW.js";
5
5
  import {
6
6
  GLOBAL_PROMPT_FILE,
7
7
  ideaBaseline,
8
8
  isVideoBlueprint,
9
9
  readIdeaAnchor,
10
10
  recordedChanges
11
- } from "./chunk-6WVYBY2G.js";
11
+ } from "./chunk-ZEGWP4FP.js";
12
12
  import {
13
13
  loadCompositionMeta
14
14
  } from "./chunk-DWPOAU4Z.js";
@@ -188,4 +188,4 @@ export {
188
188
  shownVersion,
189
189
  shownBaseline
190
190
  };
191
- //# sourceMappingURL=chunk-XYKODRQR.js.map
191
+ //# sourceMappingURL=chunk-TRAMBRVO.js.map
@@ -0,0 +1,45 @@
1
+ // src/engine/landing-library/browser.ts
2
+ import { createRequire } from "module";
3
+ var require_ = createRequire(import.meta.url);
4
+ var pwSpecifier = ["play", "wright"].join("");
5
+ var DESKTOP_VIEWPORT = { width: 1440, height: 900 };
6
+ var MOBILE_VIEWPORT = { width: 390, height: 844 };
7
+ var DEVICE_SCALE_FACTOR = 2;
8
+ async function launchBrowser(route = { kind: "direct" }) {
9
+ const playwright = require_(pwSpecifier);
10
+ return await playwright.chromium.launch({
11
+ headless: true,
12
+ args: ["--hide-scrollbars", "--disable-blink-features=AutomationControlled", "--mute-audio"],
13
+ ...route.kind === "proxy" ? { proxy: { server: route.server, username: route.username, password: route.password } } : {}
14
+ });
15
+ }
16
+ async function newPage(browser, viewport, opts = { motion: false }) {
17
+ const context = await browser.newContext({
18
+ viewport,
19
+ deviceScaleFactor: DEVICE_SCALE_FACTOR,
20
+ // We read third-party marketing pages and send them nothing — no cookies we
21
+ // own, no credentials, no form posts — so the usual reason to refuse a bad
22
+ // certificate (an attacker between us and a session we care about) does not
23
+ // apply. Refusing one instead makes a whole class of real sites permanently
24
+ // uncapturable: `growthspree.com` and `arcus.so` both fail the handshake,
25
+ // and `inspiration scrape` is the escalation the whole repo points agents at
26
+ // when `WebFetch` fails, so it inheriting the same blind spot means there is
27
+ // no route to those pages at all. Every capture therefore records that the
28
+ // certificate was not validated — see `PrepareResult.security`.
29
+ ignoreHTTPSErrors: true,
30
+ // Still captures freeze motion so screenshots are reproducible; the motion
31
+ // pass re-opens a context with animation enabled.
32
+ reducedMotion: opts.motion ? "no-preference" : "reduce",
33
+ userAgent: viewport.width < 500 ? "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"
34
+ });
35
+ const page = await context.newPage();
36
+ return { context, page };
37
+ }
38
+
39
+ export {
40
+ DESKTOP_VIEWPORT,
41
+ MOBILE_VIEWPORT,
42
+ launchBrowser,
43
+ newPage
44
+ };
45
+ //# sourceMappingURL=chunk-VN3WDB4O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engine/landing-library/browser.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport type { ProxyRoute } from \"@baker/proxy\";\nimport type { Browser, BrowserContext, Page } from \"playwright\";\n\n// Resolved at runtime rather than imported: inside the E2B sandbox the CLI is\n// installed globally and Playwright comes from the sandbox image, not from this\n// package's tarball. The split specifier keeps bundlers from rewriting it.\nconst require_ = createRequire(import.meta.url);\nconst pwSpecifier = [\"play\", \"wright\"].join(\"\");\n\nexport const DESKTOP_VIEWPORT = { width: 1440, height: 900 };\nexport const MOBILE_VIEWPORT = { width: 390, height: 844 };\n/** Retina, so section screenshots stay legible when an agent reads them. */\nexport const DEVICE_SCALE_FACTOR = 2;\n\n/**\n * A browser that reaches the internet by one specific route.\n *\n * The proxy is set at **launch**, not per context, and that is load-bearing\n * rather than incidental. `renderBundleToPng` re-renders extracted markup from\n * local `data:`/HTML to score fidelity — it must never egress, and certainly\n * never over a metered residential exit. Setting the route on the process means\n * the local renderer physically cannot leak onto a paid route, instead of that\n * being a flag someone has to remember at each `newPage` call site (there are\n * four, and a fifth will be added by someone who has not read this comment).\n *\n * So a capture runs up to two browsers: this one on the winning route, and a\n * second plain one for bundle rendering.\n */\nexport async function launchBrowser(route: ProxyRoute = { kind: \"direct\" }): Promise<Browser> {\n const playwright = require_(pwSpecifier) as typeof import(\"playwright\");\n return await playwright.chromium.launch({\n headless: true,\n args: [\"--hide-scrollbars\", \"--disable-blink-features=AutomationControlled\", \"--mute-audio\"],\n ...(route.kind === \"proxy\"\n ? { proxy: { server: route.server, username: route.username, password: route.password } }\n : {}),\n });\n}\n\nexport async function newPage(\n browser: Browser,\n viewport: { width: number; height: number },\n opts: { motion: boolean } = { motion: false },\n): Promise<{ context: BrowserContext; page: Page }> {\n const context = await browser.newContext({\n viewport,\n deviceScaleFactor: DEVICE_SCALE_FACTOR,\n // We read third-party marketing pages and send them nothing — no cookies we\n // own, no credentials, no form posts — so the usual reason to refuse a bad\n // certificate (an attacker between us and a session we care about) does not\n // apply. Refusing one instead makes a whole class of real sites permanently\n // uncapturable: `growthspree.com` and `arcus.so` both fail the handshake,\n // and `inspiration scrape` is the escalation the whole repo points agents at\n // when `WebFetch` fails, so it inheriting the same blind spot means there is\n // no route to those pages at all. Every capture therefore records that the\n // certificate was not validated — see `PrepareResult.security`.\n ignoreHTTPSErrors: true,\n // Still captures freeze motion so screenshots are reproducible; the motion\n // pass re-opens a context with animation enabled.\n reducedMotion: opts.motion ? \"no-preference\" : \"reduce\",\n userAgent:\n viewport.width < 500\n ? \"Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1\"\n : \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36\",\n });\n const page = await context.newPage();\n return { context, page };\n}\n"],"mappings":";AAAA,SAAS,qBAAqB;AAO9B,IAAM,WAAW,cAAc,YAAY,GAAG;AAC9C,IAAM,cAAc,CAAC,QAAQ,QAAQ,EAAE,KAAK,EAAE;AAEvC,IAAM,mBAAmB,EAAE,OAAO,MAAM,QAAQ,IAAI;AACpD,IAAM,kBAAkB,EAAE,OAAO,KAAK,QAAQ,IAAI;AAElD,IAAM,sBAAsB;AAgBnC,eAAsB,cAAc,QAAoB,EAAE,MAAM,SAAS,GAAqB;AAC5F,QAAM,aAAa,SAAS,WAAW;AACvC,SAAO,MAAM,WAAW,SAAS,OAAO;AAAA,IACtC,UAAU;AAAA,IACV,MAAM,CAAC,qBAAqB,iDAAiD,cAAc;AAAA,IAC3F,GAAI,MAAM,SAAS,UACf,EAAE,OAAO,EAAE,QAAQ,MAAM,QAAQ,UAAU,MAAM,UAAU,UAAU,MAAM,SAAS,EAAE,IACtF,CAAC;AAAA,EACP,CAAC;AACH;AAEA,eAAsB,QACpB,SACA,UACA,OAA4B,EAAE,QAAQ,MAAM,GACM;AAClD,QAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,IACvC;AAAA,IACA,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUnB,mBAAmB;AAAA;AAAA;AAAA,IAGnB,eAAe,KAAK,SAAS,kBAAkB;AAAA,IAC/C,WACE,SAAS,QAAQ,MACb,4IACA;AAAA,EACR,CAAC;AACD,QAAM,OAAO,MAAM,QAAQ,QAAQ;AACnC,SAAO,EAAE,SAAS,KAAK;AACzB;","names":[]}
@@ -5,7 +5,7 @@ import {
5
5
  outputRatioWarningsFor,
6
6
  shownBaseline,
7
7
  shownVersion
8
- } from "./chunk-XYKODRQR.js";
8
+ } from "./chunk-TRAMBRVO.js";
9
9
  import {
10
10
  waitForSheet
11
11
  } from "./chunk-WN4KX7GE.js";
@@ -35,7 +35,7 @@ import {
35
35
  variantImage,
36
36
  versionRun,
37
37
  writeSeriesMemberCanvas
38
- } from "./chunk-WIOPEK7K.js";
38
+ } from "./chunk-MJDN7CR7.js";
39
39
  import {
40
40
  AUTO_FIX_ROUNDS,
41
41
  autoFixStep,
@@ -73,7 +73,7 @@ import {
73
73
  withRelayEdit,
74
74
  withRelayNote,
75
75
  withSizesFollowingFix
76
- } from "./chunk-OBQ5YUOZ.js";
76
+ } from "./chunk-7WDH6OKW.js";
77
77
  import {
78
78
  buildFailedRunRecord,
79
79
  buildInitialRunRecord,
@@ -104,7 +104,7 @@ import {
104
104
  seriesOf,
105
105
  wireNamedPeople,
106
106
  wireProofBadges
107
- } from "./chunk-6WVYBY2G.js";
107
+ } from "./chunk-ZEGWP4FP.js";
108
108
  import {
109
109
  gatewayViewerModel,
110
110
  jevReadJudge,
@@ -2206,4 +2206,4 @@ export {
2206
2206
  executeCanvasRun,
2207
2207
  buildBackendClient
2208
2208
  };
2209
- //# sourceMappingURL=chunk-KOEXPN3G.js.map
2209
+ //# sourceMappingURL=chunk-ZC6FICZ7.js.map
@@ -1,14 +1,14 @@
1
+ import {
2
+ heldRules,
3
+ readAdWords,
4
+ ruleGate
5
+ } from "./chunk-CH44XVPE.js";
1
6
  import {
2
7
  storeProductReads
3
8
  } from "./chunk-QFODAMYR.js";
4
9
  import {
5
10
  readInsights
6
11
  } from "./chunk-Q5DFEVLE.js";
7
- import {
8
- heldRules,
9
- readAdWords,
10
- ruleGate
11
- } from "./chunk-CH44XVPE.js";
12
12
  import {
13
13
  avatarRelation,
14
14
  castCompany
@@ -8951,4 +8951,4 @@ export {
8951
8951
  prepareCanvas,
8952
8952
  exitOnPrepareError
8953
8953
  };
8954
- //# sourceMappingURL=chunk-6WVYBY2G.js.map
8954
+ //# sourceMappingURL=chunk-ZEGWP4FP.js.map
package/dist/cli.js CHANGED
@@ -463,25 +463,25 @@ Introspection: Run 'baker schema <command>' to inspect argument schemas.`
463
463
  capabilities: () => import("./capabilities-FVMMLKPY.js").then((m) => m.capabilitiesCommand),
464
464
  actions: () => import("./actions-Q2BMP27K.js").then((m) => m.actionsCommand),
465
465
  "scheduled-agents": () => import("./scheduled-agents-ZWAP6QLC.js").then((m) => m.scheduledAgentsCommand),
466
- ads: () => import("./ads-7QKQEHKT.js").then((m) => m.adsCommand),
466
+ ads: () => import("./ads-CWKKIYD6.js").then((m) => m.adsCommand),
467
467
  brand: () => import("./brand-IZYD5SBJ.js").then((m) => m.brandCommand),
468
- analytics: () => import("./analytics-B6ER4TQ7.js").then((m) => m.analyticsCommand),
469
- experiment: () => import("./experiment-3NDXGQK6.js").then((m) => m.experimentCommand),
470
- ga4: () => import("./ga4-IJ2UUICC.js").then((m) => m.ga4Command),
471
- gsc: () => import("./gsc-YAU4EA75.js").then((m) => m.gscCommand),
472
- research: () => import("./research-WWJUNYSJ.js").then((m) => m.researchCommand),
468
+ analytics: () => import("./analytics-XPU5SANS.js").then((m) => m.analyticsCommand),
469
+ experiment: () => import("./experiment-O6726OBP.js").then((m) => m.experimentCommand),
470
+ ga4: () => import("./ga4-XFJO7VK2.js").then((m) => m.ga4Command),
471
+ gsc: () => import("./gsc-ILEIJYWP.js").then((m) => m.gscCommand),
472
+ research: () => import("./research-JMU4C4JZ.js").then((m) => m.researchCommand),
473
473
  decide: () => import("./decide-JZXG6LZR.js").then((m) => m.decideCommand),
474
474
  knowledge: () => import("./knowledge-PN3FAZJ2.js").then((m) => m.knowledgeCommand),
475
- creatives: () => import("./creatives-LTIV3XPT.js").then((m) => m.creativesCommand),
475
+ creatives: () => import("./creatives-IFOPXTZK.js").then((m) => m.creativesCommand),
476
476
  flows: () => import("./flows-EZV3KCV6.js").then((m) => m.flowsCommand),
477
477
  funnel: () => import("./funnel-3YABA3G2.js").then((m) => m.funnelCommand),
478
- images: () => import("./images-VUWUKGD6.js").then((m) => m.imagesCommand),
479
- studio: () => import("./studio-IDXFTGHP.js").then((m) => m.studioCommand),
480
- avatars: () => import("./avatars-Y3DALQIU.js").then((m) => m.avatarsCommand),
481
- landing: () => import("./landing-L3WDTW4D.js").then((m) => m.landingCommand),
482
- videos: () => import("./videos-GOIDZVVD.js").then((m) => m.videosCommand),
483
- testimonials: () => import("./testimonials-KLF3Y4QO.js").then((m) => m.testimonialsCommand),
484
- canvas: () => import("./canvas-WHFDCHUP.js").then((m) => m.canvasCommand),
478
+ images: () => import("./images-Z7YBWRVJ.js").then((m) => m.imagesCommand),
479
+ studio: () => import("./studio-ZLBBYHNY.js").then((m) => m.studioCommand),
480
+ avatars: () => import("./avatars-3OMFIKOJ.js").then((m) => m.avatarsCommand),
481
+ landing: () => import("./landing-5RRWTSWK.js").then((m) => m.landingCommand),
482
+ videos: () => import("./videos-RWPQVXS5.js").then((m) => m.videosCommand),
483
+ testimonials: () => import("./testimonials-RIJSQDSB.js").then((m) => m.testimonialsCommand),
484
+ canvas: () => import("./canvas-PVNQ7YWV.js").then((m) => m.canvasCommand),
485
485
  tags: () => import("./tags-NBGGBHXR.js").then((m) => m.tagsCommand),
486
486
  "tag-manager": () => import("./tag-manager-5WZPX2FJ.js").then((m) => m.tagManagerCommand),
487
487
  chats: () => import("./chats-EENMDXWZ.js").then((m) => m.chatsCommand),
@@ -490,10 +490,10 @@ Introspection: Run 'baker schema <command>' to inspect argument schemas.`
490
490
  hubspot: () => import("./hubspot-KWLXJ6QD.js").then((m) => m.hubspotCommand),
491
491
  activecampaign: () => import("./activecampaign-SJO2YK6M.js").then((m) => m.activecampaignCommand),
492
492
  accounts: () => import("./accounts-EXQNPSYH.js").then((m) => m.accountsCommand),
493
- shopify: () => import("./shopify-Q7TQIQ6N.js").then((m) => m.shopifyCommand),
494
- "winning-ads": () => import("./winning-ads-LOMI72Q2.js").then((m) => m.winningAdsCommand),
495
- "media-sources": () => import("./media-sources-L4BI7HFL.js").then((m) => m.mediaSourcesCommand),
496
- posts: () => import("./posts-MVCGZV54.js").then((m) => m.postsCommand),
493
+ shopify: () => import("./shopify-L4ZUI6OT.js").then((m) => m.shopifyCommand),
494
+ "winning-ads": () => import("./winning-ads-IT3O4EAN.js").then((m) => m.winningAdsCommand),
495
+ "media-sources": () => import("./media-sources-DEEKEJUB.js").then((m) => m.mediaSourcesCommand),
496
+ posts: () => import("./posts-F7NFSUHV.js").then((m) => m.postsCommand),
497
497
  site: () => import("./site-S6QVMP7W.js").then((m) => m.siteCommand),
498
498
  "lead-routes": () => import("./lead-routes-RLYGO47M.js").then((m) => m.leadRoutesCommand),
499
499
  mcp: () => import("./mcp-ABQEICYR.js").then((m) => m.mcpCommand),
@@ -75,4 +75,4 @@ export {
75
75
  conversionHints,
76
76
  conversionsCommand
77
77
  };
78
- //# sourceMappingURL=conversions-CRL327RY.js.map
78
+ //# sourceMappingURL=conversions-UGRVDRWU.js.map
@@ -39,15 +39,15 @@ How published creatives are doing in live Meta ads (results, fatigue, angle; hoo
39
39
  Full guide: __tooling__/docs/tools/baker/creatives.md`
40
40
  },
41
41
  subCommands: {
42
- brief: () => import("./brief-NA3E2W4P.js").then((m) => m.briefCommand),
42
+ brief: () => import("./brief-TNOKTNFJ.js").then((m) => m.briefCommand),
43
43
  ideas: () => import("./ideas-ZO533P5Y.js").then((m) => m.ideasCommand),
44
- make: () => import("./make-ZIJQZD5K.js").then((m) => m.makeCommand),
45
- translate: () => import("./translate-CBITGC7C.js").then((m) => m.translateCommand),
44
+ make: () => import("./make-HZ5KAYSB.js").then((m) => m.makeCommand),
45
+ translate: () => import("./translate-A4GHRHSP.js").then((m) => m.translateCommand),
46
46
  learn: () => import("./learn-V2LIBEEY.js").then((m) => m.learnCommand),
47
- feedback: () => import("./feedback-QSIPSNAL.js").then((m) => m.feedbackCommand),
47
+ feedback: () => import("./feedback-MXUZWVOL.js").then((m) => m.feedbackCommand),
48
48
  rules: () => import("./rules-F6RNUOXP.js").then((m) => m.rulesCommand),
49
49
  check: () => import("./check-7735BPTR.js").then((m) => m.checkCommand),
50
- select: () => import("./select-K2SXPDDJ.js").then((m) => m.selectCommand),
50
+ select: () => import("./select-ABRNFFR2.js").then((m) => m.selectCommand),
51
51
  publish: () => import("./publish-OUVO65Z5.js").then((m) => m.publishCommand),
52
52
  performance: () => import("./performance-RUBIGEAQ.js").then((m) => m.performanceCommand)
53
53
  }
@@ -55,4 +55,4 @@ Full guide: __tooling__/docs/tools/baker/creatives.md`
55
55
  export {
56
56
  creativesCommand
57
57
  };
58
- //# sourceMappingURL=creatives-LTIV3XPT.js.map
58
+ //# sourceMappingURL=creatives-IFOPXTZK.js.map