@koda-sl/baker-cli 0.555.0 → 0.556.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/dist/{ads-7QKQEHKT.js → ads-CWKKIYD6.js} +5 -5
- package/dist/{analytics-B6ER4TQ7.js → analytics-XPU5SANS.js} +6 -6
- package/dist/{avatars-Y3DALQIU.js → avatars-3OMFIKOJ.js} +1 -1
- package/dist/{brief-NA3E2W4P.js → brief-TNOKTNFJ.js} +8 -8
- package/dist/{canvas-WHFDCHUP.js → canvas-PVNQ7YWV.js} +11 -11
- package/dist/{chatgpt-YBHXCXWZ.js → chatgpt-6KBW7F5S.js} +2 -2
- package/dist/{chunk-OBQ5YUOZ.js → chunk-7WDH6OKW.js} +2 -2
- package/dist/{chunk-KT5JVIPZ.js → chunk-AMM4JMSN.js} +2 -2
- package/dist/{chunk-3HKZU3Y5.js → chunk-AU3IMZZC.js} +2 -2
- package/dist/chunk-EGVWSAWY.js +83 -0
- package/dist/chunk-EGVWSAWY.js.map +1 -0
- package/dist/{chunk-DAMC4FKK.js → chunk-KLO36KTV.js} +2 -2
- package/dist/{chunk-U6G6ALXP.js → chunk-MAVT2CJ4.js} +3 -3
- package/dist/{chunk-WIOPEK7K.js → chunk-MJDN7CR7.js} +3 -3
- package/dist/{chunk-6PT22YSR.js → chunk-QAJFMVGU.js} +2 -2
- package/dist/{chunk-XYKODRQR.js → chunk-TRAMBRVO.js} +3 -3
- package/dist/chunk-VN3WDB4O.js +45 -0
- package/dist/chunk-VN3WDB4O.js.map +1 -0
- package/dist/{chunk-KOEXPN3G.js → chunk-ZC6FICZ7.js} +5 -5
- package/dist/{chunk-6WVYBY2G.js → chunk-ZEGWP4FP.js} +6 -6
- package/dist/cli.js +18 -18
- package/dist/{conversions-CRL327RY.js → conversions-UGRVDRWU.js} +1 -1
- package/dist/{creatives-LTIV3XPT.js → creatives-IFOPXTZK.js} +6 -6
- package/dist/{creatives-Y2WLGDJW.js → creatives-WBBN6G7H.js} +8 -2
- package/dist/{creatives-Y2WLGDJW.js.map → creatives-WBBN6G7H.js.map} +1 -1
- package/dist/{critique-RFTS2I46.js → critique-PQRVFC52.js} +3 -3
- package/dist/{experiment-3NDXGQK6.js → experiment-O6726OBP.js} +4 -4
- package/dist/{feedback-QSIPSNAL.js → feedback-MXUZWVOL.js} +7 -7
- package/dist/{feedback-record-DJHJWJAF.js → feedback-record-76RUAHZH.js} +7 -7
- package/dist/{ga4-IJ2UUICC.js → ga4-XFJO7VK2.js} +1 -1
- package/dist/{gsc-YAU4EA75.js → gsc-ILEIJYWP.js} +1 -1
- package/dist/{images-VUWUKGD6.js → images-Z7YBWRVJ.js} +1 -1
- package/dist/{inspiration-DNWTXEPX.js → inspiration-WGUU7W5Z.js} +2 -2
- package/dist/{landing-L3WDTW4D.js → landing-5RRWTSWK.js} +2 -2
- package/dist/{linkedin-RONIUYLJ.js → linkedin-DJ4VDOF4.js} +16 -2
- package/dist/linkedin-DJ4VDOF4.js.map +1 -0
- package/dist/{make-ZIJQZD5K.js → make-HZ5KAYSB.js} +28 -28
- package/dist/{media-sources-L4BI7HFL.js → media-sources-DEEKEJUB.js} +1 -1
- package/dist/{meta-2GJZPVKM.js → meta-XUHI3E3L.js} +3 -3
- package/dist/{meta-2GJZPVKM.js.map → meta-XUHI3E3L.js.map} +1 -1
- package/dist/{posts-MVCGZV54.js → posts-F7NFSUHV.js} +1 -1
- package/dist/preview-IBNFQ5RQ.js +101 -0
- package/dist/preview-IBNFQ5RQ.js.map +1 -0
- package/dist/{preview-DMTQR6ZW.js → preview-OV2EZ6YF.js} +43 -16
- package/dist/preview-OV2EZ6YF.js.map +1 -0
- package/dist/{rerun-MA2GB6WL.js → rerun-X7XVOAL3.js} +8 -8
- package/dist/{research-WWJUNYSJ.js → research-JMU4C4JZ.js} +1 -1
- package/dist/{run-HENSSAQW.js → run-3GCYZ2HX.js} +8 -8
- package/dist/{scaffold-ad-QQBCUYUO.js → scaffold-ad-E6DD6U46.js} +4 -4
- package/dist/{scaffold-static-ad-WUOAQEXS.js → scaffold-static-ad-6WNS2PXB.js} +11 -11
- package/dist/{scaffold-video-KFQAKQUO.js → scaffold-video-QKXFQ5FC.js} +4 -4
- package/dist/{scrape-FQUGOXCG.js → scrape-O4X6VGV2.js} +7 -39
- package/dist/scrape-O4X6VGV2.js.map +1 -0
- package/dist/{select-K2SXPDDJ.js → select-ABRNFFR2.js} +6 -6
- package/dist/{set-prompt-BZFOV3EB.js → set-prompt-5LYHDT4E.js} +3 -3
- package/dist/{shopify-Q7TQIQ6N.js → shopify-L4ZUI6OT.js} +4 -4
- package/dist/{sources-DTQ4NQAM.js → sources-6TWWOO7Q.js} +1 -1
- package/dist/{stale-5O7BQVTN.js → stale-MLQPXNLZ.js} +5 -5
- package/dist/{studio-IDXFTGHP.js → studio-ZLBBYHNY.js} +1 -1
- package/dist/{sync-definition-Q3XUSEZJ.js → sync-definition-MXVL2I2H.js} +4 -4
- package/dist/{testimonials-KLF3Y4QO.js → testimonials-RIJSQDSB.js} +2 -2
- package/dist/{translate-CBITGC7C.js → translate-A4GHRHSP.js} +10 -10
- package/dist/{validate-SAQEORZY.js → validate-44PVFQH7.js} +6 -6
- package/dist/{videos-GOIDZVVD.js → videos-RWPQVXS5.js} +1 -1
- package/dist/{winning-ads-LOMI72Q2.js → winning-ads-IT3O4EAN.js} +1 -1
- package/dist/{x-APVY4YHX.js → x-X7URL52T.js} +1 -1
- package/package.json +1 -1
- package/dist/linkedin-RONIUYLJ.js.map +0 -1
- package/dist/preview-DMTQR6ZW.js.map +0 -1
- package/dist/scrape-FQUGOXCG.js.map +0 -1
- /package/dist/{ads-7QKQEHKT.js.map → ads-CWKKIYD6.js.map} +0 -0
- /package/dist/{analytics-B6ER4TQ7.js.map → analytics-XPU5SANS.js.map} +0 -0
- /package/dist/{avatars-Y3DALQIU.js.map → avatars-3OMFIKOJ.js.map} +0 -0
- /package/dist/{brief-NA3E2W4P.js.map → brief-TNOKTNFJ.js.map} +0 -0
- /package/dist/{canvas-WHFDCHUP.js.map → canvas-PVNQ7YWV.js.map} +0 -0
- /package/dist/{chatgpt-YBHXCXWZ.js.map → chatgpt-6KBW7F5S.js.map} +0 -0
- /package/dist/{chunk-OBQ5YUOZ.js.map → chunk-7WDH6OKW.js.map} +0 -0
- /package/dist/{chunk-KT5JVIPZ.js.map → chunk-AMM4JMSN.js.map} +0 -0
- /package/dist/{chunk-3HKZU3Y5.js.map → chunk-AU3IMZZC.js.map} +0 -0
- /package/dist/{chunk-DAMC4FKK.js.map → chunk-KLO36KTV.js.map} +0 -0
- /package/dist/{chunk-U6G6ALXP.js.map → chunk-MAVT2CJ4.js.map} +0 -0
- /package/dist/{chunk-WIOPEK7K.js.map → chunk-MJDN7CR7.js.map} +0 -0
- /package/dist/{chunk-6PT22YSR.js.map → chunk-QAJFMVGU.js.map} +0 -0
- /package/dist/{chunk-XYKODRQR.js.map → chunk-TRAMBRVO.js.map} +0 -0
- /package/dist/{chunk-KOEXPN3G.js.map → chunk-ZC6FICZ7.js.map} +0 -0
- /package/dist/{chunk-6WVYBY2G.js.map → chunk-ZEGWP4FP.js.map} +0 -0
- /package/dist/{conversions-CRL327RY.js.map → conversions-UGRVDRWU.js.map} +0 -0
- /package/dist/{creatives-LTIV3XPT.js.map → creatives-IFOPXTZK.js.map} +0 -0
- /package/dist/{critique-RFTS2I46.js.map → critique-PQRVFC52.js.map} +0 -0
- /package/dist/{experiment-3NDXGQK6.js.map → experiment-O6726OBP.js.map} +0 -0
- /package/dist/{feedback-QSIPSNAL.js.map → feedback-MXUZWVOL.js.map} +0 -0
- /package/dist/{feedback-record-DJHJWJAF.js.map → feedback-record-76RUAHZH.js.map} +0 -0
- /package/dist/{ga4-IJ2UUICC.js.map → ga4-XFJO7VK2.js.map} +0 -0
- /package/dist/{gsc-YAU4EA75.js.map → gsc-ILEIJYWP.js.map} +0 -0
- /package/dist/{images-VUWUKGD6.js.map → images-Z7YBWRVJ.js.map} +0 -0
- /package/dist/{inspiration-DNWTXEPX.js.map → inspiration-WGUU7W5Z.js.map} +0 -0
- /package/dist/{landing-L3WDTW4D.js.map → landing-5RRWTSWK.js.map} +0 -0
- /package/dist/{make-ZIJQZD5K.js.map → make-HZ5KAYSB.js.map} +0 -0
- /package/dist/{media-sources-L4BI7HFL.js.map → media-sources-DEEKEJUB.js.map} +0 -0
- /package/dist/{posts-MVCGZV54.js.map → posts-F7NFSUHV.js.map} +0 -0
- /package/dist/{rerun-MA2GB6WL.js.map → rerun-X7XVOAL3.js.map} +0 -0
- /package/dist/{research-WWJUNYSJ.js.map → research-JMU4C4JZ.js.map} +0 -0
- /package/dist/{run-HENSSAQW.js.map → run-3GCYZ2HX.js.map} +0 -0
- /package/dist/{scaffold-ad-QQBCUYUO.js.map → scaffold-ad-E6DD6U46.js.map} +0 -0
- /package/dist/{scaffold-static-ad-WUOAQEXS.js.map → scaffold-static-ad-6WNS2PXB.js.map} +0 -0
- /package/dist/{scaffold-video-KFQAKQUO.js.map → scaffold-video-QKXFQ5FC.js.map} +0 -0
- /package/dist/{select-K2SXPDDJ.js.map → select-ABRNFFR2.js.map} +0 -0
- /package/dist/{set-prompt-BZFOV3EB.js.map → set-prompt-5LYHDT4E.js.map} +0 -0
- /package/dist/{shopify-Q7TQIQ6N.js.map → shopify-L4ZUI6OT.js.map} +0 -0
- /package/dist/{sources-DTQ4NQAM.js.map → sources-6TWWOO7Q.js.map} +0 -0
- /package/dist/{stale-5O7BQVTN.js.map → stale-MLQPXNLZ.js.map} +0 -0
- /package/dist/{studio-IDXFTGHP.js.map → studio-ZLBBYHNY.js.map} +0 -0
- /package/dist/{sync-definition-Q3XUSEZJ.js.map → sync-definition-MXVL2I2H.js.map} +0 -0
- /package/dist/{testimonials-KLF3Y4QO.js.map → testimonials-RIJSQDSB.js.map} +0 -0
- /package/dist/{translate-CBITGC7C.js.map → translate-A4GHRHSP.js.map} +0 -0
- /package/dist/{validate-SAQEORZY.js.map → validate-44PVFQH7.js.map} +0 -0
- /package/dist/{videos-GOIDZVVD.js.map → videos-RWPQVXS5.js.map} +0 -0
- /package/dist/{winning-ads-LOMI72Q2.js.map → winning-ads-IT3O4EAN.js.map} +0 -0
- /package/dist/{x-APVY4YHX.js.map → x-X7URL52T.js.map} +0 -0
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
|
|
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-
|
|
38
|
-
linkedin: () => import("./linkedin-
|
|
39
|
-
x: () => import("./x-
|
|
40
|
-
chatgpt: () => import("./chatgpt-
|
|
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-
|
|
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-
|
|
2437
|
+
//# sourceMappingURL=analytics-XPU5SANS.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-
|
|
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-
|
|
29
|
-
rerun: () => import("./rerun-
|
|
30
|
-
validate: () => import("./validate-
|
|
31
|
-
critique: () => import("./critique-
|
|
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-
|
|
36
|
-
"scaffold-video": () => import("./scaffold-video-
|
|
37
|
-
"scaffold-static-ad": () => import("./scaffold-static-ad-
|
|
38
|
-
"set-prompt": () => import("./set-prompt-
|
|
39
|
-
"sync-definition": () => import("./sync-definition-
|
|
40
|
-
stale: () => import("./stale-
|
|
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-
|
|
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-
|
|
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-
|
|
47
|
+
//# sourceMappingURL=chatgpt-6KBW7F5S.js.map
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
readPeople,
|
|
17
17
|
uncastPeople,
|
|
18
18
|
unsuppliedPlaceholderAssets
|
|
19
|
-
} from "./chunk-
|
|
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-
|
|
1902
|
+
//# sourceMappingURL=chunk-7WDH6OKW.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
parseDefinitionDelivery,
|
|
4
4
|
resolveDelivery,
|
|
5
5
|
resolveFormatList
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
91
|
+
//# sourceMappingURL=chunk-AMM4JMSN.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
latestVersion
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
224
|
+
//# sourceMappingURL=chunk-KLO36KTV.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
recordIdeaLines
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-7WDH6OKW.js";
|
|
4
4
|
import {
|
|
5
5
|
anchorLines,
|
|
6
6
|
readIdeaAnchor
|
|
7
|
-
} from "./chunk-
|
|
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-
|
|
66
|
+
//# sourceMappingURL=chunk-MAVT2CJ4.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isStaticAdCanvas,
|
|
3
3
|
readRenderState
|
|
4
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
930
|
+
//# sourceMappingURL=chunk-MJDN7CR7.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
leadVersion,
|
|
3
3
|
writeSeriesMemberCanvas
|
|
4
|
-
} from "./chunk-
|
|
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-
|
|
91
|
+
//# sourceMappingURL=chunk-QAJFMVGU.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
readRenderState,
|
|
3
3
|
recordSeen
|
|
4
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
469
|
-
experiment: () => import("./experiment-
|
|
470
|
-
ga4: () => import("./ga4-
|
|
471
|
-
gsc: () => import("./gsc-
|
|
472
|
-
research: () => import("./research-
|
|
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-
|
|
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-
|
|
479
|
-
studio: () => import("./studio-
|
|
480
|
-
avatars: () => import("./avatars-
|
|
481
|
-
landing: () => import("./landing-
|
|
482
|
-
videos: () => import("./videos-
|
|
483
|
-
testimonials: () => import("./testimonials-
|
|
484
|
-
canvas: () => import("./canvas-
|
|
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-
|
|
494
|
-
"winning-ads": () => import("./winning-ads-
|
|
495
|
-
"media-sources": () => import("./media-sources-
|
|
496
|
-
posts: () => import("./posts-
|
|
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),
|
|
@@ -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-
|
|
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-
|
|
45
|
-
translate: () => import("./translate-
|
|
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-
|
|
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-
|
|
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-
|
|
58
|
+
//# sourceMappingURL=creatives-IFOPXTZK.js.map
|