@koda-sl/baker-cli 0.520.0 → 0.521.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/dist/{account-Z2N545F3.js → account-JXUUHDEB.js} +3 -3
- package/dist/{account-assets-UQ5RS66K.js → account-assets-3SIBPJXJ.js} +9 -9
- package/dist/account-assets-3SIBPJXJ.js.map +1 -0
- package/dist/{account-level-QHTIN4DY.js → account-level-46AIGZXA.js} +5 -5
- package/dist/{account-reads-QDVBCQ7D.js → account-reads-5VPDX6NF.js} +3 -3
- package/dist/{accounts-DAWCHDAC.js → accounts-D6FP4DC2.js} +3 -3
- package/dist/{activities-UIBWZUGE.js → activities-NYWRMNCH.js} +3 -3
- package/dist/{ads-6OUSUM5Y.js → ads-ALI6QLW2.js} +4 -4
- package/dist/{ads-I2KFV42R.js → ads-DRMVHMJH.js} +12 -12
- package/dist/{adsets-GYVCPG4K.js → adsets-XE5S6J5S.js} +11 -11
- package/dist/{asset-writes-F5E3TWLS.js → asset-writes-5TAUIKSN.js} +5 -5
- package/dist/{audience-writes-LVPTXKT7.js → audience-writes-P63WFDXJ.js} +4 -4
- package/dist/{audiences-AVQ2VWHF.js → audiences-U6MQRRTP.js} +8 -8
- package/dist/{businesses-XH7A32WX.js → businesses-RRYQYTG4.js} +3 -3
- package/dist/{campaigns-7ZUR46T2.js → campaigns-DDUXFR77.js} +11 -11
- package/dist/{catalogs-L6SLRMPR.js → catalogs-A6CHXN5B.js} +4 -4
- package/dist/{chunk-LC75VG6J.js → chunk-2UQJ5BDJ.js} +2 -2
- package/dist/{chunk-AI3ICPS6.js → chunk-3XG6I4K6.js} +2 -2
- package/dist/{chunk-7RERKOMK.js → chunk-IQ3MYXCJ.js} +2 -2
- package/dist/{chunk-6HZF5XQB.js → chunk-JHEWSMOS.js} +2 -2
- package/dist/{chunk-EAIFDVBK.js → chunk-NAYO267Q.js} +2 -2
- package/dist/{chunk-Y2JZX6JB.js → chunk-QALAJNBG.js} +6 -5
- package/dist/chunk-QALAJNBG.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/{conversion-upload-command-OG3UCC5N.js → conversion-upload-command-TYGIB7XJ.js} +3 -3
- package/dist/{copy-writes-USCBG57G.js → copy-writes-GUOL2QUD.js} +5 -5
- package/dist/{creatives-52E7O3RB.js → creatives-BGYARLCC.js} +6 -6
- package/dist/{custom-conversions-L3CMZCTZ.js → custom-conversions-SUXA7KSN.js} +6 -6
- package/dist/{draft-7VJRJ2XH.js → draft-2EO63W4K.js} +3 -3
- package/dist/{draft-RF6LORXE.js → draft-PJT5TSFQ.js} +3 -3
- package/dist/{forecast-3G6GGAKZ.js → forecast-IECMUBL2.js} +3 -3
- package/dist/{google-4BN4ERUJ.js → google-CWHRLDBL.js} +11 -11
- package/dist/{insights-HOZ5H4A3.js → insights-VW475N6G.js} +3 -3
- package/dist/{instant-experiences-ARUYYGVW.js → instant-experiences-JJJKZAQQ.js} +4 -4
- package/dist/{leads-KCFSCWZY.js → leads-2BXRQDT5.js} +4 -4
- package/dist/{media-SXILZKYE.js → media-KXBWT2YJ.js} +3 -3
- package/dist/{meta-ZQLFWVAR.js → meta-5ODNL2LA.js} +38 -38
- package/dist/{page-photos-22Q6ZH2W.js → page-photos-CJIFQDW5.js} +4 -4
- package/dist/{pages-DYWRNXQP.js → pages-NJN2E5HU.js} +3 -3
- package/dist/{pixels-R3ISRBUJ.js → pixels-E7UYF4KE.js} +3 -3
- package/dist/{preview-UOMZ5TUK.js → preview-QGLUDJ3A.js} +3 -3
- package/dist/{rule-writes-OGVSR5US.js → rule-writes-AHDYOYVO.js} +4 -4
- package/dist/{rules-O2TI4YBB.js → rules-5HIC2F34.js} +9 -9
- package/dist/{shared-DADIQPBQ.js → shared-S7ZPZXF5.js} +3 -3
- package/dist/{shopify-3KNP5U4O.js → shopify-4JA7QEOL.js} +2 -2
- package/dist/{studies-6NJN4GE4.js → studies-FXX4XW4A.js} +7 -7
- package/dist/{study-writes-UTBR34XR.js → study-writes-H6RDMXF3.js} +4 -4
- package/dist/{targeting-RF7GL7TJ.js → targeting-URLZVNS2.js} +4 -4
- package/dist/{terms-2PXN3ZKO.js → terms-VIAM2BO5.js} +2 -2
- package/dist/{themes-SHDZQODW.js → themes-CIXQPTFX.js} +3 -3
- package/dist/{write-commands-K2XXF7JP.js → write-commands-AANGPJ5F.js} +8 -8
- package/package.json +1 -1
- package/dist/account-assets-UQ5RS66K.js.map +0 -1
- package/dist/chunk-Y2JZX6JB.js.map +0 -1
- /package/dist/{account-Z2N545F3.js.map → account-JXUUHDEB.js.map} +0 -0
- /package/dist/{account-level-QHTIN4DY.js.map → account-level-46AIGZXA.js.map} +0 -0
- /package/dist/{account-reads-QDVBCQ7D.js.map → account-reads-5VPDX6NF.js.map} +0 -0
- /package/dist/{accounts-DAWCHDAC.js.map → accounts-D6FP4DC2.js.map} +0 -0
- /package/dist/{activities-UIBWZUGE.js.map → activities-NYWRMNCH.js.map} +0 -0
- /package/dist/{ads-6OUSUM5Y.js.map → ads-ALI6QLW2.js.map} +0 -0
- /package/dist/{ads-I2KFV42R.js.map → ads-DRMVHMJH.js.map} +0 -0
- /package/dist/{adsets-GYVCPG4K.js.map → adsets-XE5S6J5S.js.map} +0 -0
- /package/dist/{asset-writes-F5E3TWLS.js.map → asset-writes-5TAUIKSN.js.map} +0 -0
- /package/dist/{audience-writes-LVPTXKT7.js.map → audience-writes-P63WFDXJ.js.map} +0 -0
- /package/dist/{audiences-AVQ2VWHF.js.map → audiences-U6MQRRTP.js.map} +0 -0
- /package/dist/{businesses-XH7A32WX.js.map → businesses-RRYQYTG4.js.map} +0 -0
- /package/dist/{campaigns-7ZUR46T2.js.map → campaigns-DDUXFR77.js.map} +0 -0
- /package/dist/{catalogs-L6SLRMPR.js.map → catalogs-A6CHXN5B.js.map} +0 -0
- /package/dist/{chunk-LC75VG6J.js.map → chunk-2UQJ5BDJ.js.map} +0 -0
- /package/dist/{chunk-AI3ICPS6.js.map → chunk-3XG6I4K6.js.map} +0 -0
- /package/dist/{chunk-7RERKOMK.js.map → chunk-IQ3MYXCJ.js.map} +0 -0
- /package/dist/{chunk-6HZF5XQB.js.map → chunk-JHEWSMOS.js.map} +0 -0
- /package/dist/{chunk-EAIFDVBK.js.map → chunk-NAYO267Q.js.map} +0 -0
- /package/dist/{conversion-upload-command-OG3UCC5N.js.map → conversion-upload-command-TYGIB7XJ.js.map} +0 -0
- /package/dist/{copy-writes-USCBG57G.js.map → copy-writes-GUOL2QUD.js.map} +0 -0
- /package/dist/{creatives-52E7O3RB.js.map → creatives-BGYARLCC.js.map} +0 -0
- /package/dist/{custom-conversions-L3CMZCTZ.js.map → custom-conversions-SUXA7KSN.js.map} +0 -0
- /package/dist/{draft-7VJRJ2XH.js.map → draft-2EO63W4K.js.map} +0 -0
- /package/dist/{draft-RF6LORXE.js.map → draft-PJT5TSFQ.js.map} +0 -0
- /package/dist/{forecast-3G6GGAKZ.js.map → forecast-IECMUBL2.js.map} +0 -0
- /package/dist/{google-4BN4ERUJ.js.map → google-CWHRLDBL.js.map} +0 -0
- /package/dist/{insights-HOZ5H4A3.js.map → insights-VW475N6G.js.map} +0 -0
- /package/dist/{instant-experiences-ARUYYGVW.js.map → instant-experiences-JJJKZAQQ.js.map} +0 -0
- /package/dist/{leads-KCFSCWZY.js.map → leads-2BXRQDT5.js.map} +0 -0
- /package/dist/{media-SXILZKYE.js.map → media-KXBWT2YJ.js.map} +0 -0
- /package/dist/{meta-ZQLFWVAR.js.map → meta-5ODNL2LA.js.map} +0 -0
- /package/dist/{page-photos-22Q6ZH2W.js.map → page-photos-CJIFQDW5.js.map} +0 -0
- /package/dist/{pages-DYWRNXQP.js.map → pages-NJN2E5HU.js.map} +0 -0
- /package/dist/{pixels-R3ISRBUJ.js.map → pixels-E7UYF4KE.js.map} +0 -0
- /package/dist/{preview-UOMZ5TUK.js.map → preview-QGLUDJ3A.js.map} +0 -0
- /package/dist/{rule-writes-OGVSR5US.js.map → rule-writes-AHDYOYVO.js.map} +0 -0
- /package/dist/{rules-O2TI4YBB.js.map → rules-5HIC2F34.js.map} +0 -0
- /package/dist/{shared-DADIQPBQ.js.map → shared-S7ZPZXF5.js.map} +0 -0
- /package/dist/{shopify-3KNP5U4O.js.map → shopify-4JA7QEOL.js.map} +0 -0
- /package/dist/{studies-6NJN4GE4.js.map → studies-FXX4XW4A.js.map} +0 -0
- /package/dist/{study-writes-UTBR34XR.js.map → study-writes-H6RDMXF3.js.map} +0 -0
- /package/dist/{targeting-RF7GL7TJ.js.map → targeting-URLZVNS2.js.map} +0 -0
- /package/dist/{terms-2PXN3ZKO.js.map → terms-VIAM2BO5.js.map} +0 -0
- /package/dist/{themes-SHDZQODW.js.map → themes-CIXQPTFX.js.map} +0 -0
- /package/dist/{write-commands-K2XXF7JP.js.map → write-commands-AANGPJ5F.js.map} +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
handleMetaError,
|
|
3
3
|
resolveAccountIdArg
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-JHEWSMOS.js";
|
|
5
|
+
import "./chunk-QALAJNBG.js";
|
|
6
6
|
import {
|
|
7
7
|
writeJsonEnvelope
|
|
8
8
|
} from "./chunk-X7DMNLDD.js";
|
|
@@ -194,12 +194,12 @@ Examples:
|
|
|
194
194
|
list: listCommand,
|
|
195
195
|
history: historyCommand,
|
|
196
196
|
preview: previewCommand,
|
|
197
|
-
create: () => import("./rule-writes-
|
|
198
|
-
update: () => import("./rule-writes-
|
|
199
|
-
enable: () => import("./rule-writes-
|
|
200
|
-
disable: () => import("./rule-writes-
|
|
201
|
-
delete: () => import("./rule-writes-
|
|
202
|
-
run: () => import("./rule-writes-
|
|
197
|
+
create: () => import("./rule-writes-AHDYOYVO.js").then((m) => m.rulesCreateCommand),
|
|
198
|
+
update: () => import("./rule-writes-AHDYOYVO.js").then((m) => m.rulesUpdateCommand),
|
|
199
|
+
enable: () => import("./rule-writes-AHDYOYVO.js").then((m) => m.rulesEnableCommand),
|
|
200
|
+
disable: () => import("./rule-writes-AHDYOYVO.js").then((m) => m.rulesDisableCommand),
|
|
201
|
+
delete: () => import("./rule-writes-AHDYOYVO.js").then((m) => m.rulesDeleteCommand),
|
|
202
|
+
run: () => import("./rule-writes-AHDYOYVO.js").then((m) => m.rulesRunCommand)
|
|
203
203
|
},
|
|
204
204
|
args: {
|
|
205
205
|
"account-id": { type: "string", description: "Meta ad account ID" },
|
|
@@ -214,4 +214,4 @@ export {
|
|
|
214
214
|
ruleListHints,
|
|
215
215
|
rulesCommand
|
|
216
216
|
};
|
|
217
|
-
//# sourceMappingURL=rules-
|
|
217
|
+
//# sourceMappingURL=rules-5HIC2F34.js.map
|
|
@@ -9,8 +9,8 @@ import {
|
|
|
9
9
|
resolveEffectiveStatus,
|
|
10
10
|
statusFilterHints,
|
|
11
11
|
todayIso
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-JHEWSMOS.js";
|
|
13
|
+
import "./chunk-QALAJNBG.js";
|
|
14
14
|
import "./chunk-X7DMNLDD.js";
|
|
15
15
|
import "./chunk-4U7HXXSA.js";
|
|
16
16
|
import "./chunk-V6AAOAMM.js";
|
|
@@ -29,4 +29,4 @@ export {
|
|
|
29
29
|
statusFilterHints,
|
|
30
30
|
todayIso
|
|
31
31
|
};
|
|
32
|
-
//# sourceMappingURL=shared-
|
|
32
|
+
//# sourceMappingURL=shared-S7ZPZXF5.js.map
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
import "./chunk-D5FY4FAK.js";
|
|
20
20
|
import {
|
|
21
21
|
termsRefusalFix
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-QALAJNBG.js";
|
|
23
23
|
import "./chunk-X7DMNLDD.js";
|
|
24
24
|
import {
|
|
25
25
|
CHAT_READ_ARG
|
|
@@ -3955,4 +3955,4 @@ Full guide: __tooling__/docs/tools/baker/shopify.md`
|
|
|
3955
3955
|
export {
|
|
3956
3956
|
shopifyCommand
|
|
3957
3957
|
};
|
|
3958
|
-
//# sourceMappingURL=shopify-
|
|
3958
|
+
//# sourceMappingURL=shopify-4JA7QEOL.js.map
|
|
@@ -6,8 +6,8 @@ import {
|
|
|
6
6
|
import {
|
|
7
7
|
handleMetaError,
|
|
8
8
|
resolveAccountIdArg
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-JHEWSMOS.js";
|
|
10
|
+
import "./chunk-QALAJNBG.js";
|
|
11
11
|
import {
|
|
12
12
|
writeJsonEnvelope
|
|
13
13
|
} from "./chunk-X7DMNLDD.js";
|
|
@@ -232,10 +232,10 @@ Examples:
|
|
|
232
232
|
},
|
|
233
233
|
subCommands: {
|
|
234
234
|
list: listCommand,
|
|
235
|
-
create: () => import("./study-writes-
|
|
236
|
-
update: () => import("./study-writes-
|
|
237
|
-
end: () => import("./study-writes-
|
|
238
|
-
delete: () => import("./study-writes-
|
|
235
|
+
create: () => import("./study-writes-H6RDMXF3.js").then((m) => m.studiesCreateCommand),
|
|
236
|
+
update: () => import("./study-writes-H6RDMXF3.js").then((m) => m.studiesUpdateCommand),
|
|
237
|
+
end: () => import("./study-writes-H6RDMXF3.js").then((m) => m.studiesEndCommand),
|
|
238
|
+
delete: () => import("./study-writes-H6RDMXF3.js").then((m) => m.studiesDeleteCommand)
|
|
239
239
|
},
|
|
240
240
|
args: listArgs,
|
|
241
241
|
default: "list"
|
|
@@ -247,4 +247,4 @@ export {
|
|
|
247
247
|
studyHints,
|
|
248
248
|
studyState
|
|
249
249
|
};
|
|
250
|
-
//# sourceMappingURL=studies-
|
|
250
|
+
//# sourceMappingURL=studies-FXX4XW4A.js.map
|
|
@@ -4,10 +4,10 @@ import {
|
|
|
4
4
|
loadJsonFileArg,
|
|
5
5
|
requireTarget,
|
|
6
6
|
stageOp
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-2UQJ5BDJ.js";
|
|
8
8
|
import "./chunk-GC5P4KWY.js";
|
|
9
9
|
import "./chunk-GDFJOCDO.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-JHEWSMOS.js";
|
|
11
11
|
import {
|
|
12
12
|
repeatedValues
|
|
13
13
|
} from "./chunk-ERSX3MKH.js";
|
|
@@ -15,7 +15,7 @@ import "./chunk-QBFJGCWA.js";
|
|
|
15
15
|
import "./chunk-4NZ47VXO.js";
|
|
16
16
|
import "./chunk-D5FY4FAK.js";
|
|
17
17
|
import "./chunk-JRQI6EVP.js";
|
|
18
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-QALAJNBG.js";
|
|
19
19
|
import "./chunk-X7DMNLDD.js";
|
|
20
20
|
import "./chunk-K6HH2KF3.js";
|
|
21
21
|
import "./chunk-M7MLFR2S.js";
|
|
@@ -467,4 +467,4 @@ export {
|
|
|
467
467
|
studiesUpdateCommand,
|
|
468
468
|
studyFlagsFromArgs
|
|
469
469
|
};
|
|
470
|
-
//# sourceMappingURL=study-writes-
|
|
470
|
+
//# sourceMappingURL=study-writes-H6RDMXF3.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadJsonFileArg
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-2UQJ5BDJ.js";
|
|
4
4
|
import {
|
|
5
5
|
metaTargetingSchema
|
|
6
6
|
} from "./chunk-GC5P4KWY.js";
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
csvOrJson,
|
|
10
10
|
handleMetaError,
|
|
11
11
|
resolveAccountIdArg
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-JHEWSMOS.js";
|
|
13
13
|
import {
|
|
14
14
|
repeatedValues
|
|
15
15
|
} from "./chunk-ERSX3MKH.js";
|
|
@@ -17,7 +17,7 @@ import "./chunk-QBFJGCWA.js";
|
|
|
17
17
|
import "./chunk-4NZ47VXO.js";
|
|
18
18
|
import "./chunk-D5FY4FAK.js";
|
|
19
19
|
import "./chunk-JRQI6EVP.js";
|
|
20
|
-
import "./chunk-
|
|
20
|
+
import "./chunk-QALAJNBG.js";
|
|
21
21
|
import {
|
|
22
22
|
writeAdsJson,
|
|
23
23
|
writeAdsOutput,
|
|
@@ -759,4 +759,4 @@ Start here before writing interests, behaviors, places or languages into an ad s
|
|
|
759
759
|
export {
|
|
760
760
|
targetingCommand
|
|
761
761
|
};
|
|
762
|
-
//# sourceMappingURL=targeting-
|
|
762
|
+
//# sourceMappingURL=targeting-URLZVNS2.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
adsTermsPlatformSchema,
|
|
4
4
|
compactTerms,
|
|
5
5
|
termsHints
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-QALAJNBG.js";
|
|
7
7
|
import {
|
|
8
8
|
getManagerIdForCustomer,
|
|
9
9
|
handleConnectionError,
|
|
@@ -99,4 +99,4 @@ Examples:
|
|
|
99
99
|
export {
|
|
100
100
|
termsCommand
|
|
101
101
|
};
|
|
102
|
-
//# sourceMappingURL=terms-
|
|
102
|
+
//# sourceMappingURL=terms-VIAM2BO5.js.map
|
|
@@ -5,13 +5,13 @@ import {
|
|
|
5
5
|
failWriteValidation,
|
|
6
6
|
listFlag,
|
|
7
7
|
requireCustomerId
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-IQ3MYXCJ.js";
|
|
9
9
|
import "./chunk-ERSX3MKH.js";
|
|
10
10
|
import "./chunk-QBFJGCWA.js";
|
|
11
11
|
import "./chunk-4NZ47VXO.js";
|
|
12
12
|
import "./chunk-D5FY4FAK.js";
|
|
13
13
|
import "./chunk-JRQI6EVP.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-QALAJNBG.js";
|
|
15
15
|
import "./chunk-44ZRCSR7.js";
|
|
16
16
|
import {
|
|
17
17
|
getManagerIdForCustomer,
|
|
@@ -92,4 +92,4 @@ Example:
|
|
|
92
92
|
export {
|
|
93
93
|
themesCommand
|
|
94
94
|
};
|
|
95
|
-
//# sourceMappingURL=themes-
|
|
95
|
+
//# sourceMappingURL=themes-CIXQPTFX.js.map
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
budgetBoostsFromFlags,
|
|
8
8
|
clearArg,
|
|
9
9
|
clearFromFlags
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-3XG6I4K6.js";
|
|
11
11
|
import {
|
|
12
12
|
bareAccountId,
|
|
13
13
|
failWriteValidation,
|
|
@@ -23,14 +23,14 @@ import {
|
|
|
23
23
|
stageOp,
|
|
24
24
|
stageStatusChange,
|
|
25
25
|
upper
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-2UQJ5BDJ.js";
|
|
27
27
|
import {
|
|
28
28
|
buildCustomConversionRule
|
|
29
29
|
} from "./chunk-GC5P4KWY.js";
|
|
30
30
|
import {
|
|
31
31
|
VISUAL_ENHANCEMENT_FEATURES
|
|
32
32
|
} from "./chunk-GDFJOCDO.js";
|
|
33
|
-
import "./chunk-
|
|
33
|
+
import "./chunk-JHEWSMOS.js";
|
|
34
34
|
import {
|
|
35
35
|
repeatedValues
|
|
36
36
|
} from "./chunk-ERSX3MKH.js";
|
|
@@ -38,7 +38,7 @@ import "./chunk-QBFJGCWA.js";
|
|
|
38
38
|
import "./chunk-4NZ47VXO.js";
|
|
39
39
|
import "./chunk-D5FY4FAK.js";
|
|
40
40
|
import "./chunk-JRQI6EVP.js";
|
|
41
|
-
import "./chunk-
|
|
41
|
+
import "./chunk-QALAJNBG.js";
|
|
42
42
|
import "./chunk-X7DMNLDD.js";
|
|
43
43
|
import "./chunk-K6HH2KF3.js";
|
|
44
44
|
import "./chunk-M7MLFR2S.js";
|
|
@@ -461,7 +461,7 @@ Example: baker ads meta adsets create --campaign 6123 --name "Reach ES" --optimi
|
|
|
461
461
|
const file = loadJsonFileArg(args.file);
|
|
462
462
|
const payload = mergePayload(file, adSetPayloadFromFlags(args, rawArgs, file));
|
|
463
463
|
if (args["saved-audience"]) {
|
|
464
|
-
const { savedAudienceTargeting, targetingFromSavedAudience } = await import("./audience-writes-
|
|
464
|
+
const { savedAudienceTargeting, targetingFromSavedAudience } = await import("./audience-writes-P63WFDXJ.js");
|
|
465
465
|
const saved = await savedAudienceTargeting(accountId, String(args["saved-audience"]));
|
|
466
466
|
const merged = targetingFromSavedAudience(saved, payload.targeting);
|
|
467
467
|
if ("refusal" in merged) failWriteValidation(merged.refusal);
|
|
@@ -873,7 +873,7 @@ Example: baker ads meta ads retag 120252158038400247 --url-tags "utm_source={{si
|
|
|
873
873
|
const { apiPost } = await import("./client-CRKH3ZYG.js");
|
|
874
874
|
const { requireChatId } = await import("./env-OXMIRJRU.js");
|
|
875
875
|
const { writeJsonEnvelope } = await import("./output-UPGKR3FB.js");
|
|
876
|
-
const { handleMetaError } = await import("./shared-
|
|
876
|
+
const { handleMetaError } = await import("./shared-S7ZPZXF5.js");
|
|
877
877
|
try {
|
|
878
878
|
const accountId = bareAccountId(args);
|
|
879
879
|
const urlTags = typeof args["url-tags"] === "string" ? args["url-tags"] : void 0;
|
|
@@ -1096,7 +1096,7 @@ function duplicateCommand(entity, label) {
|
|
|
1096
1096
|
const { apiPost } = await import("./client-CRKH3ZYG.js");
|
|
1097
1097
|
const { requireChatId } = await import("./env-OXMIRJRU.js");
|
|
1098
1098
|
const { writeJsonEnvelope } = await import("./output-UPGKR3FB.js");
|
|
1099
|
-
const { handleMetaError } = await import("./shared-
|
|
1099
|
+
const { handleMetaError } = await import("./shared-S7ZPZXF5.js");
|
|
1100
1100
|
try {
|
|
1101
1101
|
const accountId = bareAccountId(args);
|
|
1102
1102
|
const chatId = requireChatId();
|
|
@@ -1169,4 +1169,4 @@ export {
|
|
|
1169
1169
|
retagSetPairs,
|
|
1170
1170
|
targetingFromFlags
|
|
1171
1171
|
};
|
|
1172
|
-
//# sourceMappingURL=write-commands-
|
|
1172
|
+
//# sourceMappingURL=write-commands-AANGPJ5F.js.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/ads/meta/account-assets.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { writeAdsOutput, writeJsonEnvelope } from \"../output.ts\";\nimport { csvOrJson, handleMetaError, resolveAccountIdArg } from \"./shared.ts\";\n\n/**\n * The account's identities and libraries an ad is built from — reads that used\n * to exist only as backend routes. They were left off the CLI as \"rarely\n * needed in isolation\", but each answers a question staging otherwise answers\n * with a refusal: which Instagram account an ad can run as, which apps it can\n * promote, whom an EU ad names, what an image hash or label id is, which\n * product sets a catalog ad can use, what an A/B test found.\n */\n\ntype Row = Record<string, unknown>;\ntype Args = Record<string, unknown>;\n\nfunction emit(rows: Row[], args: Args, hints: string[]): void {\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(rows, fmt, undefined, hints);\n return;\n }\n writeJsonEnvelope(hints.length > 0 ? { ok: true, data: rows, hints } : { ok: true, data: rows });\n}\n\nasync function read<T>(path: string, params: Record<string, string>, args: Args): Promise<T> {\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n return await apiGet<T>(path, params);\n}\n\nconst outputArg = { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" } as const;\nconst accountArg = { type: \"string\", description: \"Meta ad account ID (act_...)\" } as const;\nconst schemaAccount = { type: \"string\", description: \"Meta ad account ID (act_123)\", required: false };\nconst schemaNoCache = { type: \"boolean\", description: \"Bypass the cache\", required: false };\nconst schemaOutput = { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" };\n\n// --- Instagram identities ---\n\nexport interface MetaInstagramIdentity {\n id: string;\n username?: string;\n sources: Array<\"ad_account\" | \"connected\" | \"page\" | \"page_backed\">;\n pageId?: string;\n pageName?: string;\n}\n\nexport function instagramIdentityHints(rows: readonly MetaInstagramIdentity[]): string[] {\n if (rows.length === 0) {\n return [\n \"No Instagram account is linked to this ad account or its Pages. A creative without --instagram-user cannot run in Instagram feeds, Stories or Reels — the account owner links one in Meta Business settings (Accounts → Instagram accounts) and assigns it to the ad account.\",\n ];\n }\n const listed = rows.filter((row) => row.sources.includes(\"ad_account\") || row.sources.includes(\"connected\"));\n const hints = [\"Pass the id as `creatives create --instagram-user <id>`.\"];\n if (listed.length > 0 && listed.length < rows.length) {\n hints.push(\n `Use one listed on the ad account (${listed.map((row) => row.username ?? row.id).join(\", \")}): when the account lists any, staging refuses an identity it does not list.`,\n );\n } else if (listed.length === 0) {\n hints.push(\n \"Only Page identities are listed (page = the Page's linked Instagram account, page_backed = an Instagram presence Meta made for a Page with none). Meta accepts either as --instagram-user; a page_backed one shows the Page's name and picture on Instagram.\",\n );\n }\n if (new Set(rows.map((row) => row.pageId).filter(Boolean)).size > 1) {\n hints.push(\"Several Pages are involved — use the identity of the Page the creative runs from (--page).\");\n }\n return hints;\n}\n\nregisterSchema({\n command: \"ads.meta.instagram-accounts\",\n description:\n \"The Instagram accounts an ad on this account can run as — the id `creatives create --instagram-user` takes. Lists accounts assigned or connected to the ad account and each promotable Page's linked or page-backed one.\",\n args: {\n \"account-id\": schemaAccount,\n \"no-cache\": schemaNoCache,\n output: { type: \"string\", description: \"json|csv\", required: false, default: \"json\" },\n },\n});\n\nexport const instagramAccountsCommand = defineCommand({\n meta: {\n name: \"instagram-accounts\",\n description:\n \"Instagram identities an ad can run as (the --instagram-user id). Start here before creatives create: baker ads meta instagram-accounts --account-id act_123\",\n },\n args: { \"account-id\": accountArg, \"no-cache\": NO_CACHE_ARG, output: outputArg },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const rows = await read<MetaInstagramIdentity[]>(\n \"/api/ads/meta/instagram-accounts\",\n { \"account-id\": accountId },\n args,\n );\n emit(\n rows.map((row) => ({ ...row, sources: row.sources.join(\",\") })),\n args,\n instagramIdentityHints(rows),\n );\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\n// --- Apps ---\n\nregisterSchema({\n command: \"ads.meta.apps\",\n description:\n \"The apps this ad account can promote (app installs / app engagement), with their store URLs — the application_id and object_store_url an app ad set's promoted_object takes.\",\n args: { \"account-id\": schemaAccount, \"no-cache\": schemaNoCache, output: schemaOutput },\n});\n\nexport const appsCommand = defineCommand({\n meta: {\n name: \"apps\",\n description:\n \"Apps the ad account can promote, for an app ad set's promoted_object. Example: baker ads meta apps --account-id act_123\",\n },\n args: { \"account-id\": accountArg, \"no-cache\": NO_CACHE_ARG, output: outputArg },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const rows = await read<Array<{ id: string; name?: string; object_store_urls?: Record<string, string> }>>(\n \"/api/ads/meta/apps\",\n { \"account-id\": accountId },\n args,\n );\n emit(\n rows.map((row) => ({ ...row })),\n args,\n rows.length > 0\n ? [\n 'An app ad set promotes one: promoted_object {\"application_id\":\"<id>\",\"object_store_url\":\"<store url>\"}. Use a real store URL (itunes / google_play); fb_canvas and instant_game are not app stores.',\n ]\n : [\n \"No promotable apps. The app has to be registered in Meta for Developers and its owner has to add this ad account under the app's Advanced settings → Advertising accounts.\",\n ],\n );\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\n// --- DSA ---\n\nregisterSchema({\n command: \"ads.meta.dsa-recommendations\",\n description:\n \"Names Meta suggests for the EU Digital Services Act disclosure (who benefits from and who pays for an ad) on this account.\",\n args: { \"account-id\": schemaAccount, \"no-cache\": schemaNoCache },\n});\n\nexport const dsaRecommendationsCommand = defineCommand({\n meta: {\n name: \"dsa-recommendations\",\n description:\n \"Meta's suggested DSA beneficiary/payor names for EU ad sets. Example: baker ads meta dsa-recommendations --account-id act_123\",\n },\n args: { \"account-id\": accountArg, \"no-cache\": NO_CACHE_ARG },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const names = await read<string[]>(\"/api/ads/meta/dsa-recommendations\", { \"account-id\": accountId }, args);\n writeJsonEnvelope({\n ok: true,\n data: names,\n hints: [\n \"An ad set reaching the EU needs dsa_beneficiary and dsa_payor. Baker fills both with the business name when they are missing; pass one of these instead when the user names someone else (an agency paying for a client).\",\n ],\n });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\n// --- Images and labels ---\n\nfunction compactImage(row: Row): Row {\n return {\n hash: row.hash,\n name: row.name,\n width: row.width,\n height: row.height,\n status: row.status,\n created_time: row.created_time,\n };\n}\n\nregisterSchema({\n command: \"ads.meta.images\",\n description:\n \"The ad account's image library — each image_hash a creative can reuse without uploading again. --hash looks one up.\",\n args: {\n \"account-id\": schemaAccount,\n hash: { type: \"string\", description: \"One image hash\", required: false },\n limit: { type: \"string\", description: \"Max rows (default 500)\", required: false },\n full: { type: \"boolean\", description: \"URLs, permalink and which creatives use it\", required: false },\n \"no-cache\": schemaNoCache,\n output: schemaOutput,\n },\n});\n\nexport const imagesCommand = defineCommand({\n meta: {\n name: \"images\",\n description:\n \"Image library of the ad account (image hashes). Example: baker ads meta images --account-id act_123 --limit 20; --hash <hash> for one\",\n },\n args: {\n \"account-id\": accountArg,\n hash: { type: \"string\", description: \"Look up one image hash\" },\n limit: { type: \"string\", description: \"Max rows (default 500)\" },\n full: { type: \"boolean\", description: \"Every field: url, permalink_url, creatives\" },\n \"no-cache\": NO_CACHE_ARG,\n output: outputArg,\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args.hash) params.hash = args.hash as string;\n if (args.limit) params.limit = args.limit as string;\n try {\n const rows = await read<Row[]>(\"/api/ads/meta/images\", params, args);\n emit(args.full ? rows : rows.map(compactImage), args, [\n \"A creative reuses one with its hash (the `image_hash` of a creative file). To push a Baker-library image, stage `media upload` instead.\",\n ]);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nregisterSchema({\n command: \"ads.meta.labels\",\n description: \"Ad labels defined on the account (Meta's tags for campaigns, ad sets, ads and creatives).\",\n args: { \"account-id\": schemaAccount, \"no-cache\": schemaNoCache, output: schemaOutput },\n});\n\nconst labelsListArgs = { \"account-id\": accountArg, \"no-cache\": NO_CACHE_ARG, output: outputArg };\n\nexport const labelsCommand = defineCommand({\n meta: {\n name: \"labels\",\n description: `Ad labels on the account (list), or stage label writes: create, rename, delete, attach (file campaigns/ad sets/ads/creatives under one), detach.\n baker ads meta labels --account-id act_123\n baker ads meta labels create --name \"Q4 launch\"\n baker ads meta labels attach <labelId|meta_temp_…> --campaigns 6123,6124 --ads 6125`,\n },\n subCommands: {\n list: () => labelsListCommand,\n create: () => import(\"./asset-writes.ts\").then((m) => m.labelsCreateCommand),\n rename: () => import(\"./asset-writes.ts\").then((m) => m.labelsRenameCommand),\n delete: () => import(\"./asset-writes.ts\").then((m) => m.labelsDeleteCommand),\n attach: () => import(\"./asset-writes.ts\").then((m) => m.labelsAttachCommand),\n detach: () => import(\"./asset-writes.ts\").then((m) => m.labelsDetachCommand),\n },\n args: labelsListArgs,\n default: \"list\",\n});\n\nconst labelsListCommand = defineCommand({\n meta: {\n name: \"list\",\n description: \"Ad labels on the account. Runs by default. Example: baker ads meta labels --account-id act_123\",\n },\n args: labelsListArgs,\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const rows = await read<Row[]>(\"/api/ads/meta/labels\", { \"account-id\": accountId }, args);\n emit(rows, args, rows.length === 0 ? [\"This account has no ad labels.\"] : []);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\n// --- High-demand periods ---\n\nregisterSchema({\n command: \"ads.meta.high-demand-periods\",\n description: \"The budget boosts (high-demand periods) set on a campaign or ad set: when each runs and by how much.\",\n args: {\n \"campaign-id\": { type: \"string\", description: \"Campaign or ad set ID\", required: true },\n \"no-cache\": schemaNoCache,\n output: schemaOutput,\n },\n});\n\nexport const highDemandPeriodsCommand = defineCommand({\n meta: {\n name: \"high-demand-periods\",\n description:\n \"Budget boosts on a campaign or ad set. Example: baker ads meta high-demand-periods --campaign-id 6123 (stage new ones with --budget-boost on campaigns or adsets create|update)\",\n },\n args: {\n \"campaign-id\": { type: \"string\", description: \"Campaign (or ad set) ID\", required: true },\n \"no-cache\": NO_CACHE_ARG,\n output: outputArg,\n },\n run: async ({ args }) => {\n try {\n const rows = await read<Row[]>(\n \"/api/ads/meta/high-demand-periods\",\n { \"campaign-id\": args[\"campaign-id\"] as string },\n args,\n );\n emit(rows, args, rows.length === 0 ? [\"No budget boosts on this campaign.\"] : []);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../api/src/ads-terms.ts","../src/commands/ads/terms-output.ts"],"sourcesContent":["/**\n * Ad platform terms — the shared CLI ⇄ backend ⇄ dashboard contract for the agreements a Baker\n * feature depends on (`baker ads terms`, `/api/ads/terms`, every staging gate that checks one, and\n * the review's \"Action needed before publishing\" row).\n *\n * Each platform asks a person on the account to accept some terms once before it takes certain\n * work (a customer list, a lead form, conversions matched by email). Baker can read whether most\n * of them are accepted, never accept them for anyone, and must say who does it and where — in the\n * same plain words wherever it is said. So the words live here, once: `adsTermGuide` is the whole\n * guide for one agreement, `termsActionNotice` is the one sentence a staging refusal or warning\n * carries, and `parseTermsActionNotice` lets the review render that sentence as a row with the\n * platform's mark and numbered steps.\n *\n * The inventory and its official sources: docs/platform-terms.md.\n *\n * This package must not depend on `convex`.\n */\nimport { z } from \"zod\";\n\nexport const ADS_TERMS_PLATFORMS = [\"meta\", \"google\", \"linkedin\"] as const;\nexport const adsTermsPlatformSchema = z.enum(ADS_TERMS_PLATFORMS);\nexport type AdsTermsPlatform = z.infer<typeof adsTermsPlatformSchema>;\n\nexport const ADS_TERMS_PLATFORM_LABEL: Readonly<Record<AdsTermsPlatform, string>> = {\n meta: \"Meta\",\n google: \"Google Ads\",\n linkedin: \"LinkedIn\",\n};\n\nexport const ADS_TERM_IDS = [\n \"meta.custom_audience\",\n \"meta.web_custom_audience\",\n \"meta.lead_generation\",\n \"google.customer_data\",\n \"google.lead_form\",\n] as const;\nexport const adsTermIdSchema = z.enum(ADS_TERM_IDS);\nexport type AdsTermId = z.infer<typeof adsTermIdSchema>;\n\nexport const ADS_TERM_STATUSES = [\"accepted\", \"not_accepted\", \"unknown\"] as const;\nexport type AdsTermStatus = (typeof ADS_TERM_STATUSES)[number];\n\n/** Where one agreement is accepted: the account (or Page) it belongs to, as the platform names it. */\nexport interface AdsTermSubject {\n accountId: string;\n pageId?: string;\n pageName?: string;\n}\n\nexport interface AdsTermGuide {\n id: AdsTermId;\n platform: AdsTermsPlatform;\n /** What the platform calls it on its own screens. */\n name: string;\n /** The Baker work that needs it, in the user's words. */\n neededFor: string[];\n /** True when the platform refuses that work without it; false when it takes it but its policy requires them. */\n blocks: boolean;\n /** What happens without them, one sentence. */\n consequence: string;\n /** Who can accept them. */\n who: string;\n /** Numbered-in-order steps a person follows, plain words. */\n steps: string[];\n /** Where to start, when the platform has a direct address for it. */\n link: string | null;\n}\n\nconst bare = (accountId: string) => accountId.replace(/^act_/, \"\").replace(/-/g, \"\");\n\n/** The address Meta gives for an ad account's Custom Audience terms (`act=` takes the bare id). */\nexport function metaCustomAudienceTermsUrl(accountId: string): string {\n return `https://business.facebook.com/ads/manage/customaudiences/tos/?act=${bare(accountId)}`;\n}\n\nexport const META_LEAD_GENERATION_TERMS_URL = \"https://www.facebook.com/ads/leadgen/tos\";\n\nconst GOOGLE_ADS_URL = \"https://ads.google.com\";\n\n/** \"the Google Ads account 386-508-3115\" as Google writes it, or just \"the Google Ads account\" when unknown. */\nfunction googleAccount(accountId: string): string {\n const digits = bare(accountId);\n if (!digits) return \"the Google Ads account\";\n return `the Google Ads account ${digits.length === 10 ? `${digits.slice(0, 3)}-${digits.slice(3, 6)}-${digits.slice(6)}` : digits}`;\n}\n\n/** The whole guide for one agreement on one account (or Page). Sources: docs/platform-terms.md. */\nexport function adsTermGuide(id: AdsTermId, subject: AdsTermSubject): AdsTermGuide {\n const account = bare(subject.accountId);\n switch (id) {\n case \"meta.custom_audience\": {\n const link = metaCustomAudienceTermsUrl(account);\n return {\n id,\n platform: \"meta\",\n name: \"Custom Audience terms\",\n neededFor: [\"customer lists\", \"Shopify buyer audiences\", \"lookalikes made from a customer list\"],\n blocks: true,\n consequence: \"Meta refuses every customer list on this ad account until they are accepted.\",\n who: `a person with a role on the ad account ${account}`,\n steps: [\n `Open ${link} while signed in to Facebook as a person with a role on ad account ${account}.`,\n \"Read Meta's Custom Audience terms and click Accept.\",\n \"Tell Baker it's done; Baker checks again before anything is published.\",\n ],\n link,\n };\n }\n case \"meta.web_custom_audience\": {\n const link = `https://adsmanager.facebook.com/adsmanager/audiences?act=${account}`;\n return {\n id,\n platform: \"meta\",\n name: \"Custom Audience terms for website audiences\",\n neededFor: [\"website visitor audiences (from the Meta pixel)\"],\n blocks: true,\n consequence: \"Meta refuses website visitor audiences on this ad account until they are accepted.\",\n who: `a person with a role on the ad account ${account}`,\n steps: [\n `Open ${link} (Meta Ads Manager ▸ Audiences for ad account ${account}).`,\n \"Click Create audience ▸ Custom audience ▸ Website; Meta shows its terms the first time.\",\n \"Read them and click Accept, then close the window without creating anything.\",\n \"Tell Baker it's done; Baker checks again before anything is published.\",\n ],\n link,\n };\n }\n case \"meta.lead_generation\": {\n const page = subject.pageName ? `\"${subject.pageName}\"` : `with id ${subject.pageId ?? \"?\"}`;\n return {\n id,\n platform: \"meta\",\n name: \"Lead Ads Terms\",\n neededFor: [\"instant forms\", \"lead ads that open a form inside the ad\"],\n blocks: true,\n consequence: `Meta refuses instant forms and lead ads for the Facebook Page ${page} until they are accepted, once per Page.`,\n who: `someone who can advertise for the Facebook Page ${page}`,\n steps: [\n `Open ${META_LEAD_GENERATION_TERMS_URL} while signed in to Facebook as someone who manages the Page.`,\n `Choose the Page ${page}.`,\n \"Read Meta's Lead Ads Terms and click Accept (in Ads Manager the same terms appear as View Terms ▸ I agree when making a first instant form).\",\n \"Tell Baker it's done; Baker checks again before anything is published.\",\n ],\n link: META_LEAD_GENERATION_TERMS_URL,\n };\n }\n case \"google.customer_data\":\n return {\n id,\n platform: \"google\",\n name: \"Customer data terms\",\n neededFor: [\n \"conversions uploaded with a customer's email or phone\",\n \"enhanced conversions\",\n \"customer lists and Shopify buyer audiences\",\n ],\n blocks: true,\n consequence:\n \"Google refuses conversions matched by a customer's email or phone until they are accepted, and its Customer Match policy expects them for customer lists.\",\n who: `an admin of ${googleAccount(account)} — or of its manager account, when the manager tracks this account's conversions`,\n steps: [\n `Sign in at ${GOOGLE_ADS_URL} and open ${googleAccount(account)} (the manager account instead, if it tracks this account's conversions).`,\n \"Click Goals, then Settings (in some accounts: Goals ▸ Conversions ▸ Settings).\",\n 'Next to \"Customer data terms\" (newer accounts: \"Customer data use\"), click View terms, tick that you accept them for your company, and click Agree.',\n \"Tell Baker it's done; Baker checks again before anything is published.\",\n ],\n link: GOOGLE_ADS_URL,\n };\n case \"google.lead_form\":\n return {\n id,\n platform: \"google\",\n name: \"Lead form ads terms\",\n neededFor: [\"lead forms inside Google ads (Baker can't create these yet)\"],\n blocks: true,\n consequence: \"Google refuses lead forms on this account until they are accepted.\",\n who: `an admin of ${googleAccount(account)}`,\n steps: [\n `Sign in at ${GOOGLE_ADS_URL} and open ${googleAccount(account)}.`,\n 'Click Admin, then Account settings, open \"Lead form ads terms\" and accept them (Google also asks the first time a lead form is made in Google Ads).',\n \"Tell Baker it's done; Baker checks again before anything is published.\",\n ],\n link: GOOGLE_ADS_URL,\n };\n default:\n return unreachableTerm(id);\n }\n}\n\nfunction unreachableTerm(id: never): never {\n throw new Error(`No guide for terms ${String(id)}`);\n}\n\n/** Every refusal or warning that asks a person to accept a platform's terms starts with this. */\nexport const TERMS_ACTION_PREFIX = \"Action needed before publishing:\";\n\nconst PLATFORM_BY_LABEL = new Map(\n ADS_TERMS_PLATFORMS.map((platform) => [ADS_TERMS_PLATFORM_LABEL[platform], platform] as const),\n);\n\n/**\n * The one sentence a staging refusal or warning carries for terms a person still has to accept:\n * what, where, why, who, and the numbered steps. Read back by `parseTermsActionNotice`. `consequence`\n * replaces the guide's when the caller knows more (how many conversions, what else would work).\n */\nexport function termsActionNotice(guide: AdsTermGuide, consequence: string = guide.consequence): string {\n const steps = guide.steps.map((step, index) => `${index + 1}. ${step}`).join(\" \");\n return `${TERMS_ACTION_PREFIX} accept ${guide.name} in ${ADS_TERMS_PLATFORM_LABEL[guide.platform]}. ${consequence} Who: ${guide.who}. Steps: ${steps}`;\n}\n\nexport interface ParsedTermsActionNotice {\n platform: AdsTermsPlatform;\n name: string;\n consequence: string;\n who: string;\n steps: string[];\n link: string | null;\n}\n\nconst NOTICE_SHAPE = /^accept (.+?) in (Meta|Google Ads|LinkedIn)\\. (.+?) Who: (.+?)\\. Steps: (1\\. .+)$/;\n\n/** \"1. a 2. b\" → [\"a\", \"b\"], cutting only at the next number in sequence (a step may hold other numbers). */\nfunction numberedSteps(text: string): string[] {\n const steps: string[] = [];\n let rest = text.replace(/^1\\.\\s/, \"\");\n for (let next = 2; ; next++) {\n const cut = rest.indexOf(` ${next}. `);\n if (cut < 0) break;\n steps.push(rest.slice(0, cut).trim());\n rest = rest.slice(cut + ` ${next}. `.length);\n }\n steps.push(rest.trim());\n return steps;\n}\n\n/** A notice made by `termsActionNotice`, taken apart for the review row; `undefined` for any other text. */\nexport function parseTermsActionNotice(text: string): ParsedTermsActionNotice | undefined {\n if (!text.startsWith(TERMS_ACTION_PREFIX)) return undefined;\n const match = NOTICE_SHAPE.exec(text.slice(TERMS_ACTION_PREFIX.length).trim());\n if (!match) return undefined;\n const [, name, label, consequence, who, stepText] = match;\n const platform = label ? PLATFORM_BY_LABEL.get(label) : undefined;\n if (!platform || !name || !consequence || !who || !stepText) return undefined;\n const steps = numberedSteps(stepText);\n const link = stepText.match(/https:\\/\\/\\S+?(?=[\\s,;)]|\\.(?:\\s|$)|$)/)?.[0] ?? null;\n return { platform, name, consequence, who, steps, link };\n}\n\n// --- `baker ads terms` -------------------------------------------------------------------------\n\nexport const adsTermsRequestSchema = z.strictObject({\n platform: adsTermsPlatformSchema,\n /** Meta `act_<id>` or bare id; Google 10-digit customer id; LinkedIn sponsored account id. */\n accountId: z.string().min(1),\n /** Google: the manager the account is reached through, when there is one. */\n managerId: z\n .string()\n .regex(/^\\d{10}$/, \"a 10-digit manager id\")\n .optional(),\n /** Meta: the Facebook Pages whose Lead Ads Terms to read (`baker ads meta pages`). */\n pageIds: z.array(z.string().regex(/^\\d+$/, \"a numeric Facebook Page id\")).max(10).optional(),\n});\nexport type AdsTermsRequest = z.infer<typeof adsTermsRequestSchema>;\n\nexport const adsTermSchema = z.object({\n id: adsTermIdSchema,\n name: z.string(),\n status: z.enum(ADS_TERM_STATUSES),\n /** The Page this row is about, for Page-owned terms. */\n pageId: z.string().optional(),\n neededFor: z.array(z.string()),\n blocks: z.boolean(),\n who: z.string(),\n steps: z.array(z.string()),\n link: z.string().nullable(),\n /** Why the status is what it is — the field read, or why it could not be. */\n basis: z.string(),\n});\nexport type AdsTerm = z.infer<typeof adsTermSchema>;\n\nexport const adsTermsResponseSchema = z.object({\n platform: adsTermsPlatformSchema,\n accountId: z.string(),\n terms: z.array(adsTermSchema),\n /** Agreements this platform has that Baker cannot read, or no Baker work needs today. */\n notes: z.array(z.string()),\n});\nexport type AdsTermsResponse = z.infer<typeof adsTermsResponseSchema>;\n\n/** One row of the read: the guide, plus what the platform said. */\nexport function adsTermRow(guide: AdsTermGuide, status: AdsTermStatus, basis: string, pageId?: string): AdsTerm {\n return {\n id: guide.id,\n name: guide.name,\n status,\n ...(pageId ? { pageId } : {}),\n neededFor: guide.neededFor,\n blocks: guide.blocks,\n who: guide.who,\n steps: guide.steps,\n link: guide.link,\n basis,\n };\n}\n","import {\n ADS_TERMS_PLATFORM_LABEL,\n type AdsTerm,\n type AdsTermsResponse,\n parseTermsActionNotice,\n} from \"@baker/api/ads-terms\";\n\n/**\n * What `baker ads terms` prints, and the `error.fix` every staging command gives for terms a\n * person still has to accept. Pure.\n */\n\ntype CompactTerm = Pick<AdsTerm, \"id\" | \"name\" | \"status\" | \"neededFor\"> &\n Partial<Pick<AdsTerm, \"pageId\" | \"who\" | \"steps\" | \"link\">>;\n\n/** Compact by default: an accepted term needs no steps; one that isn't carries who and how. */\nexport function compactTerms(answer: AdsTermsResponse): {\n platform: string;\n accountId: string;\n terms: CompactTerm[];\n notes: string[];\n} {\n return {\n platform: answer.platform,\n accountId: answer.accountId,\n terms: answer.terms.map((term) => ({\n id: term.id,\n name: term.name,\n status: term.status,\n ...(term.pageId ? { pageId: term.pageId } : {}),\n neededFor: term.neededFor,\n ...(term.status === \"accepted\" ? {} : { who: term.who, steps: term.steps, link: term.link }),\n })),\n notes: answer.notes,\n };\n}\n\nexport function termsHints(answer: AdsTermsResponse): string[] {\n const platform = ADS_TERMS_PLATFORM_LABEL[answer.platform];\n const hints: string[] = [];\n for (const term of answer.terms) {\n const page = term.pageId ? ` for Page ${term.pageId}` : \"\";\n if (term.status === \"not_accepted\") {\n hints.push(\n `${term.name}${page} are NOT accepted in ${platform}; needed for ${term.neededFor.join(\", \")}. Before proposing or staging that work, tell the user in plain words, give them the numbered steps and link exactly as listed, and say who has to do it (${term.who}). Baker cannot accept terms for them. Carry on with the rest of the task, and run this command again when they say it's done.`,\n );\n } else if (term.status === \"unknown\") {\n hints.push(\n `${platform} did not say whether ${term.name}${page} are accepted (${term.basis}). Don't tell the user they are accepted; if the work needs them, give the steps and ask the user to check.`,\n );\n }\n }\n if (hints.length === 0 && answer.terms.length > 0) {\n hints.push(`Every ${platform} term listed is accepted; nothing for the user to do.`);\n }\n return hints;\n}\n\nexport interface TermsRefusal {\n code: \"PLATFORM_TERMS_NOT_ACCEPTED\";\n fix: { action: \"ask_user\"; explanation: string; steps?: string[]; link?: string };\n}\n\n/**\n * The fix for a staging refusal whose message is a `termsActionNotice`; null for any other failure.\n * `code` is the CLI client's (`client.ts` `mapHttpError`): a backend 400 arrives as VALIDATION_ERROR.\n */\nexport function termsRefusalFix(code: string, message: string): TermsRefusal | null {\n if (code !== \"VALIDATION_ERROR\" && code !== \"FORBIDDEN\") return null;\n const notice = parseTermsActionNotice(message);\n if (!notice) return null;\n const platform = ADS_TERMS_PLATFORM_LABEL[notice.platform];\n return {\n code: \"PLATFORM_TERMS_NOT_ACCEPTED\",\n fix: {\n action: \"ask_user\",\n explanation: `${platform} needs ${notice.name} accepted first, and only ${notice.who} can do it — Baker cannot. Tell the user plainly, give them the numbered steps (and link) below, and ask them to say when it's done. Don't retry before that; keep going with the rest of the task. When they confirm, run \\`baker ads terms --platform ${notice.platform} --account-id <id>\\` to check, then stage it again.`,\n steps: notice.steps,\n ...(notice.link ? { link: notice.link } : {}),\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|