@koda-sl/baker-cli 0.519.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.
Files changed (104) hide show
  1. package/dist/{account-Z2N545F3.js → account-JXUUHDEB.js} +3 -3
  2. package/dist/{account-assets-JH3JJBLA.js → account-assets-3SIBPJXJ.js} +9 -9
  3. package/dist/account-assets-3SIBPJXJ.js.map +1 -0
  4. package/dist/{account-level-5LUIZDXV.js → account-level-46AIGZXA.js} +6 -6
  5. package/dist/{account-reads-QDVBCQ7D.js → account-reads-5VPDX6NF.js} +3 -3
  6. package/dist/{accounts-DAWCHDAC.js → accounts-D6FP4DC2.js} +3 -3
  7. package/dist/{activities-UIBWZUGE.js → activities-NYWRMNCH.js} +3 -3
  8. package/dist/{ads-Y7WZPGER.js → ads-ALI6QLW2.js} +4 -4
  9. package/dist/{ads-3XSQSOOX.js → ads-DRMVHMJH.js} +12 -12
  10. package/dist/{adsets-LHKCRU7R.js → adsets-XE5S6J5S.js} +11 -11
  11. package/dist/{asset-writes-KGOTQFID.js → asset-writes-5TAUIKSN.js} +6 -6
  12. package/dist/{audience-writes-BFEXKZVU.js → audience-writes-P63WFDXJ.js} +6 -6
  13. package/dist/{audiences-KJBUP4BG.js → audiences-U6MQRRTP.js} +8 -8
  14. package/dist/{businesses-XH7A32WX.js → businesses-RRYQYTG4.js} +3 -3
  15. package/dist/{campaigns-OTPTBE6X.js → campaigns-DDUXFR77.js} +11 -11
  16. package/dist/{catalogs-7J3FFXOP.js → catalogs-A6CHXN5B.js} +5 -5
  17. package/dist/{chunk-Q2EMZDVH.js → chunk-2UQJ5BDJ.js} +3 -3
  18. package/dist/{chunk-YETYHRYI.js → chunk-3XG6I4K6.js} +2 -2
  19. package/dist/{chunk-Q3GSVLE5.js → chunk-GC5P4KWY.js} +1 -1
  20. package/dist/{chunk-Q3GSVLE5.js.map → chunk-GC5P4KWY.js.map} +1 -1
  21. package/dist/{chunk-7RERKOMK.js → chunk-IQ3MYXCJ.js} +2 -2
  22. package/dist/{chunk-6HZF5XQB.js → chunk-JHEWSMOS.js} +2 -2
  23. package/dist/{chunk-ZZHKIC64.js → chunk-NAYO267Q.js} +2 -2
  24. package/dist/{chunk-Y2JZX6JB.js → chunk-QALAJNBG.js} +6 -5
  25. package/dist/chunk-QALAJNBG.js.map +1 -0
  26. package/dist/{chunk-XOQNM7I4.js → chunk-VBGRHAEX.js} +2 -2
  27. package/dist/cli.js +2 -2
  28. package/dist/{conversion-upload-command-OG3UCC5N.js → conversion-upload-command-TYGIB7XJ.js} +3 -3
  29. package/dist/{copy-writes-RIRV3YKY.js → copy-writes-GUOL2QUD.js} +6 -6
  30. package/dist/{creatives-5JL2KD5E.js → creatives-BGYARLCC.js} +6 -6
  31. package/dist/{custom-conversions-RNZLL4WZ.js → custom-conversions-SUXA7KSN.js} +6 -6
  32. package/dist/{draft-7VJRJ2XH.js → draft-2EO63W4K.js} +3 -3
  33. package/dist/{draft-RF6LORXE.js → draft-PJT5TSFQ.js} +3 -3
  34. package/dist/{forecast-3G6GGAKZ.js → forecast-IECMUBL2.js} +3 -3
  35. package/dist/{google-4BN4ERUJ.js → google-CWHRLDBL.js} +11 -11
  36. package/dist/{insights-2S3KOAJP.js → insights-VW475N6G.js} +4 -4
  37. package/dist/{instant-experiences-VQWWNKJU.js → instant-experiences-JJJKZAQQ.js} +5 -5
  38. package/dist/{leads-UJ5EM37H.js → leads-2BXRQDT5.js} +5 -5
  39. package/dist/{media-L7N7ZAKV.js → media-KXBWT2YJ.js} +3 -3
  40. package/dist/{meta-56NL7BXO.js → meta-5ODNL2LA.js} +38 -38
  41. package/dist/{page-photos-CRRTU4XP.js → page-photos-CJIFQDW5.js} +5 -5
  42. package/dist/{pages-DYWRNXQP.js → pages-NJN2E5HU.js} +3 -3
  43. package/dist/{pixels-R3ISRBUJ.js → pixels-E7UYF4KE.js} +3 -3
  44. package/dist/{preview-NUDV3GBY.js → preview-QGLUDJ3A.js} +4 -4
  45. package/dist/{rule-writes-Q66JFL7P.js → rule-writes-AHDYOYVO.js} +6 -6
  46. package/dist/{rules-PZPK4D3F.js → rules-5HIC2F34.js} +9 -9
  47. package/dist/{shared-DADIQPBQ.js → shared-S7ZPZXF5.js} +3 -3
  48. package/dist/{shopify-3KNP5U4O.js → shopify-4JA7QEOL.js} +2 -2
  49. package/dist/{studies-FGCYJFJB.js → studies-FXX4XW4A.js} +7 -7
  50. package/dist/{study-writes-RNPDFYMQ.js → study-writes-H6RDMXF3.js} +5 -5
  51. package/dist/{targeting-JVLGOSWN.js → targeting-URLZVNS2.js} +5 -5
  52. package/dist/{terms-2PXN3ZKO.js → terms-VIAM2BO5.js} +2 -2
  53. package/dist/{themes-SHDZQODW.js → themes-CIXQPTFX.js} +3 -3
  54. package/dist/{write-commands-LF27WNSN.js → write-commands-AANGPJ5F.js} +9 -9
  55. package/package.json +1 -1
  56. package/dist/account-assets-JH3JJBLA.js.map +0 -1
  57. package/dist/chunk-Y2JZX6JB.js.map +0 -1
  58. /package/dist/{account-Z2N545F3.js.map → account-JXUUHDEB.js.map} +0 -0
  59. /package/dist/{account-level-5LUIZDXV.js.map → account-level-46AIGZXA.js.map} +0 -0
  60. /package/dist/{account-reads-QDVBCQ7D.js.map → account-reads-5VPDX6NF.js.map} +0 -0
  61. /package/dist/{accounts-DAWCHDAC.js.map → accounts-D6FP4DC2.js.map} +0 -0
  62. /package/dist/{activities-UIBWZUGE.js.map → activities-NYWRMNCH.js.map} +0 -0
  63. /package/dist/{ads-Y7WZPGER.js.map → ads-ALI6QLW2.js.map} +0 -0
  64. /package/dist/{ads-3XSQSOOX.js.map → ads-DRMVHMJH.js.map} +0 -0
  65. /package/dist/{adsets-LHKCRU7R.js.map → adsets-XE5S6J5S.js.map} +0 -0
  66. /package/dist/{asset-writes-KGOTQFID.js.map → asset-writes-5TAUIKSN.js.map} +0 -0
  67. /package/dist/{audience-writes-BFEXKZVU.js.map → audience-writes-P63WFDXJ.js.map} +0 -0
  68. /package/dist/{audiences-KJBUP4BG.js.map → audiences-U6MQRRTP.js.map} +0 -0
  69. /package/dist/{businesses-XH7A32WX.js.map → businesses-RRYQYTG4.js.map} +0 -0
  70. /package/dist/{campaigns-OTPTBE6X.js.map → campaigns-DDUXFR77.js.map} +0 -0
  71. /package/dist/{catalogs-7J3FFXOP.js.map → catalogs-A6CHXN5B.js.map} +0 -0
  72. /package/dist/{chunk-Q2EMZDVH.js.map → chunk-2UQJ5BDJ.js.map} +0 -0
  73. /package/dist/{chunk-YETYHRYI.js.map → chunk-3XG6I4K6.js.map} +0 -0
  74. /package/dist/{chunk-7RERKOMK.js.map → chunk-IQ3MYXCJ.js.map} +0 -0
  75. /package/dist/{chunk-6HZF5XQB.js.map → chunk-JHEWSMOS.js.map} +0 -0
  76. /package/dist/{chunk-ZZHKIC64.js.map → chunk-NAYO267Q.js.map} +0 -0
  77. /package/dist/{chunk-XOQNM7I4.js.map → chunk-VBGRHAEX.js.map} +0 -0
  78. /package/dist/{conversion-upload-command-OG3UCC5N.js.map → conversion-upload-command-TYGIB7XJ.js.map} +0 -0
  79. /package/dist/{copy-writes-RIRV3YKY.js.map → copy-writes-GUOL2QUD.js.map} +0 -0
  80. /package/dist/{creatives-5JL2KD5E.js.map → creatives-BGYARLCC.js.map} +0 -0
  81. /package/dist/{custom-conversions-RNZLL4WZ.js.map → custom-conversions-SUXA7KSN.js.map} +0 -0
  82. /package/dist/{draft-7VJRJ2XH.js.map → draft-2EO63W4K.js.map} +0 -0
  83. /package/dist/{draft-RF6LORXE.js.map → draft-PJT5TSFQ.js.map} +0 -0
  84. /package/dist/{forecast-3G6GGAKZ.js.map → forecast-IECMUBL2.js.map} +0 -0
  85. /package/dist/{google-4BN4ERUJ.js.map → google-CWHRLDBL.js.map} +0 -0
  86. /package/dist/{insights-2S3KOAJP.js.map → insights-VW475N6G.js.map} +0 -0
  87. /package/dist/{instant-experiences-VQWWNKJU.js.map → instant-experiences-JJJKZAQQ.js.map} +0 -0
  88. /package/dist/{leads-UJ5EM37H.js.map → leads-2BXRQDT5.js.map} +0 -0
  89. /package/dist/{media-L7N7ZAKV.js.map → media-KXBWT2YJ.js.map} +0 -0
  90. /package/dist/{meta-56NL7BXO.js.map → meta-5ODNL2LA.js.map} +0 -0
  91. /package/dist/{page-photos-CRRTU4XP.js.map → page-photos-CJIFQDW5.js.map} +0 -0
  92. /package/dist/{pages-DYWRNXQP.js.map → pages-NJN2E5HU.js.map} +0 -0
  93. /package/dist/{pixels-R3ISRBUJ.js.map → pixels-E7UYF4KE.js.map} +0 -0
  94. /package/dist/{preview-NUDV3GBY.js.map → preview-QGLUDJ3A.js.map} +0 -0
  95. /package/dist/{rule-writes-Q66JFL7P.js.map → rule-writes-AHDYOYVO.js.map} +0 -0
  96. /package/dist/{rules-PZPK4D3F.js.map → rules-5HIC2F34.js.map} +0 -0
  97. /package/dist/{shared-DADIQPBQ.js.map → shared-S7ZPZXF5.js.map} +0 -0
  98. /package/dist/{shopify-3KNP5U4O.js.map → shopify-4JA7QEOL.js.map} +0 -0
  99. /package/dist/{studies-FGCYJFJB.js.map → studies-FXX4XW4A.js.map} +0 -0
  100. /package/dist/{study-writes-RNPDFYMQ.js.map → study-writes-H6RDMXF3.js.map} +0 -0
  101. /package/dist/{targeting-JVLGOSWN.js.map → targeting-URLZVNS2.js.map} +0 -0
  102. /package/dist/{terms-2PXN3ZKO.js.map → terms-VIAM2BO5.js.map} +0 -0
  103. /package/dist/{themes-SHDZQODW.js.map → themes-CIXQPTFX.js.map} +0 -0
  104. /package/dist/{write-commands-LF27WNSN.js.map → write-commands-AANGPJ5F.js.map} +0 -0
@@ -3,16 +3,16 @@ import {
3
3
  failWriteValidation,
4
4
  requireTarget,
5
5
  stageOp
6
- } from "./chunk-Q2EMZDVH.js";
7
- import "./chunk-Q3GSVLE5.js";
6
+ } from "./chunk-2UQJ5BDJ.js";
7
+ import "./chunk-GC5P4KWY.js";
8
8
  import "./chunk-GDFJOCDO.js";
9
- import "./chunk-6HZF5XQB.js";
9
+ import "./chunk-JHEWSMOS.js";
10
10
  import "./chunk-ERSX3MKH.js";
11
11
  import "./chunk-QBFJGCWA.js";
12
12
  import "./chunk-4NZ47VXO.js";
13
13
  import "./chunk-D5FY4FAK.js";
14
14
  import "./chunk-JRQI6EVP.js";
15
- import "./chunk-Y2JZX6JB.js";
15
+ import "./chunk-QALAJNBG.js";
16
16
  import "./chunk-X7DMNLDD.js";
17
17
  import "./chunk-K6HH2KF3.js";
18
18
  import "./chunk-M7MLFR2S.js";
@@ -115,4 +115,4 @@ var pagePhotosCommand = defineCommand({
115
115
  export {
116
116
  pagePhotosCommand
117
117
  };
118
- //# sourceMappingURL=page-photos-CRRTU4XP.js.map
118
+ //# sourceMappingURL=page-photos-CJIFQDW5.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  csvOrJson,
3
3
  handleMetaError
4
- } from "./chunk-6HZF5XQB.js";
5
- import "./chunk-Y2JZX6JB.js";
4
+ } from "./chunk-JHEWSMOS.js";
5
+ import "./chunk-QALAJNBG.js";
6
6
  import {
7
7
  writeAdsOutput,
8
8
  writeJsonEnvelope
@@ -64,4 +64,4 @@ export {
64
64
  pageSelectionHints,
65
65
  pagesCommand
66
66
  };
67
- //# sourceMappingURL=pages-DYWRNXQP.js.map
67
+ //# sourceMappingURL=pages-NJN2E5HU.js.map
@@ -4,8 +4,8 @@ import {
4
4
  handleMetaError,
5
5
  resolveAccountIdArg,
6
6
  todayIso
7
- } from "./chunk-6HZF5XQB.js";
8
- import "./chunk-Y2JZX6JB.js";
7
+ } from "./chunk-JHEWSMOS.js";
8
+ import "./chunk-QALAJNBG.js";
9
9
  import {
10
10
  writeAdsJson,
11
11
  writeAdsOutput
@@ -106,4 +106,4 @@ export {
106
106
  pixelWarnings,
107
107
  pixelsCommand
108
108
  };
109
- //# sourceMappingURL=pixels-R3ISRBUJ.js.map
109
+ //# sourceMappingURL=pixels-E7UYF4KE.js.map
@@ -3,12 +3,12 @@ import {
3
3
  INSTAGRAM_PREVIEW_FORMATS,
4
4
  PLATFORM_SCOPED_POSITIONS,
5
5
  previewFormatForPosition
6
- } from "./chunk-Q3GSVLE5.js";
6
+ } from "./chunk-GC5P4KWY.js";
7
7
  import "./chunk-GDFJOCDO.js";
8
8
  import {
9
9
  handleMetaError
10
- } from "./chunk-6HZF5XQB.js";
11
- import "./chunk-Y2JZX6JB.js";
10
+ } from "./chunk-JHEWSMOS.js";
11
+ import "./chunk-QALAJNBG.js";
12
12
  import {
13
13
  writeAdsJson,
14
14
  writeJsonEnvelope
@@ -215,4 +215,4 @@ Examples:
215
215
  export {
216
216
  previewCommand
217
217
  };
218
- //# sourceMappingURL=preview-NUDV3GBY.js.map
218
+ //# sourceMappingURL=preview-QGLUDJ3A.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  decimalMarkShown
3
- } from "./chunk-XOQNM7I4.js";
3
+ } from "./chunk-VBGRHAEX.js";
4
4
  import {
5
5
  bareAccountId,
6
6
  failWriteValidation,
7
7
  requireTarget,
8
8
  stageOp
9
- } from "./chunk-Q2EMZDVH.js";
10
- import "./chunk-Q3GSVLE5.js";
9
+ } from "./chunk-2UQJ5BDJ.js";
10
+ import "./chunk-GC5P4KWY.js";
11
11
  import "./chunk-GDFJOCDO.js";
12
- import "./chunk-6HZF5XQB.js";
12
+ import "./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-Y2JZX6JB.js";
20
+ import "./chunk-QALAJNBG.js";
21
21
  import "./chunk-X7DMNLDD.js";
22
22
  import "./chunk-K6HH2KF3.js";
23
23
  import "./chunk-M7MLFR2S.js";
@@ -522,4 +522,4 @@ export {
522
522
  rulesRunCommand,
523
523
  rulesUpdateCommand
524
524
  };
525
- //# sourceMappingURL=rule-writes-Q66JFL7P.js.map
525
+ //# sourceMappingURL=rule-writes-AHDYOYVO.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  handleMetaError,
3
3
  resolveAccountIdArg
4
- } from "./chunk-6HZF5XQB.js";
5
- import "./chunk-Y2JZX6JB.js";
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-Q66JFL7P.js").then((m) => m.rulesCreateCommand),
198
- update: () => import("./rule-writes-Q66JFL7P.js").then((m) => m.rulesUpdateCommand),
199
- enable: () => import("./rule-writes-Q66JFL7P.js").then((m) => m.rulesEnableCommand),
200
- disable: () => import("./rule-writes-Q66JFL7P.js").then((m) => m.rulesDisableCommand),
201
- delete: () => import("./rule-writes-Q66JFL7P.js").then((m) => m.rulesDeleteCommand),
202
- run: () => import("./rule-writes-Q66JFL7P.js").then((m) => m.rulesRunCommand)
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-PZPK4D3F.js.map
217
+ //# sourceMappingURL=rules-5HIC2F34.js.map
@@ -9,8 +9,8 @@ import {
9
9
  resolveEffectiveStatus,
10
10
  statusFilterHints,
11
11
  todayIso
12
- } from "./chunk-6HZF5XQB.js";
13
- import "./chunk-Y2JZX6JB.js";
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-DADIQPBQ.js.map
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-Y2JZX6JB.js";
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-3KNP5U4O.js.map
3958
+ //# sourceMappingURL=shopify-4JA7QEOL.js.map
@@ -6,8 +6,8 @@ import {
6
6
  import {
7
7
  handleMetaError,
8
8
  resolveAccountIdArg
9
- } from "./chunk-6HZF5XQB.js";
10
- import "./chunk-Y2JZX6JB.js";
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-RNPDFYMQ.js").then((m) => m.studiesCreateCommand),
236
- update: () => import("./study-writes-RNPDFYMQ.js").then((m) => m.studiesUpdateCommand),
237
- end: () => import("./study-writes-RNPDFYMQ.js").then((m) => m.studiesEndCommand),
238
- delete: () => import("./study-writes-RNPDFYMQ.js").then((m) => m.studiesDeleteCommand)
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-FGCYJFJB.js.map
250
+ //# sourceMappingURL=studies-FXX4XW4A.js.map
@@ -4,10 +4,10 @@ import {
4
4
  loadJsonFileArg,
5
5
  requireTarget,
6
6
  stageOp
7
- } from "./chunk-Q2EMZDVH.js";
8
- import "./chunk-Q3GSVLE5.js";
7
+ } from "./chunk-2UQJ5BDJ.js";
8
+ import "./chunk-GC5P4KWY.js";
9
9
  import "./chunk-GDFJOCDO.js";
10
- import "./chunk-6HZF5XQB.js";
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-Y2JZX6JB.js";
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-RNPDFYMQ.js.map
470
+ //# sourceMappingURL=study-writes-H6RDMXF3.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  loadJsonFileArg
3
- } from "./chunk-Q2EMZDVH.js";
3
+ } from "./chunk-2UQJ5BDJ.js";
4
4
  import {
5
5
  metaTargetingSchema
6
- } from "./chunk-Q3GSVLE5.js";
6
+ } from "./chunk-GC5P4KWY.js";
7
7
  import "./chunk-GDFJOCDO.js";
8
8
  import {
9
9
  csvOrJson,
10
10
  handleMetaError,
11
11
  resolveAccountIdArg
12
- } from "./chunk-6HZF5XQB.js";
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-Y2JZX6JB.js";
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-JVLGOSWN.js.map
762
+ //# sourceMappingURL=targeting-URLZVNS2.js.map
@@ -3,7 +3,7 @@ import {
3
3
  adsTermsPlatformSchema,
4
4
  compactTerms,
5
5
  termsHints
6
- } from "./chunk-Y2JZX6JB.js";
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-2PXN3ZKO.js.map
102
+ //# sourceMappingURL=terms-VIAM2BO5.js.map
@@ -5,13 +5,13 @@ import {
5
5
  failWriteValidation,
6
6
  listFlag,
7
7
  requireCustomerId
8
- } from "./chunk-7RERKOMK.js";
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-Y2JZX6JB.js";
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-SHDZQODW.js.map
95
+ //# sourceMappingURL=themes-CIXQPTFX.js.map
@@ -7,7 +7,7 @@ import {
7
7
  budgetBoostsFromFlags,
8
8
  clearArg,
9
9
  clearFromFlags
10
- } from "./chunk-YETYHRYI.js";
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-Q2EMZDVH.js";
26
+ } from "./chunk-2UQJ5BDJ.js";
27
27
  import {
28
28
  buildCustomConversionRule
29
- } from "./chunk-Q3GSVLE5.js";
29
+ } from "./chunk-GC5P4KWY.js";
30
30
  import {
31
31
  VISUAL_ENHANCEMENT_FEATURES
32
32
  } from "./chunk-GDFJOCDO.js";
33
- import "./chunk-6HZF5XQB.js";
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-Y2JZX6JB.js";
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-BFEXKZVU.js");
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-DADIQPBQ.js");
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-DADIQPBQ.js");
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-LF27WNSN.js.map
1172
+ //# sourceMappingURL=write-commands-AANGPJ5F.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koda-sl/baker-cli",
3
- "version": "0.519.0",
3
+ "version": "0.521.0",
4
4
  "description": "AI-agent-first CLI for interacting with Baker, including the Baker creative canvas.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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":[]}