@koda-sl/baker-cli 0.526.0 → 0.528.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 (101) hide show
  1. package/README.md +2 -0
  2. package/dist/{account-APMJVG2F.js → account-CQJFUII3.js} +3 -3
  3. package/dist/{account-APMJVG2F.js.map → account-CQJFUII3.js.map} +1 -1
  4. package/dist/{account-assets-TAUEBCY5.js → account-assets-IDVG4DGK.js} +12 -12
  5. package/dist/account-assets-IDVG4DGK.js.map +1 -0
  6. package/dist/{account-level-2MYDHOID.js → account-level-GK7M2MMQ.js} +14 -14
  7. package/dist/account-level-GK7M2MMQ.js.map +1 -0
  8. package/dist/{accounts-VIAQC3PA.js → accounts-KRW3JNCW.js} +2 -2
  9. package/dist/{activities-MJMAV3SI.js → activities-2RAJXP3J.js} +3 -3
  10. package/dist/{activities-MJMAV3SI.js.map → activities-2RAJXP3J.js.map} +1 -1
  11. package/dist/{ads-O4RL4JXD.js → ads-6ESCXPHK.js} +3 -3
  12. package/dist/{ads-NNKUR4HG.js → ads-JVBLNTBF.js} +20 -15
  13. package/dist/ads-JVBLNTBF.js.map +1 -0
  14. package/dist/{adsets-VO5C7PDM.js → adsets-FN5ZWSYF.js} +11 -11
  15. package/dist/adsets-FN5ZWSYF.js.map +1 -0
  16. package/dist/{asset-writes-PQNENVYY.js → asset-writes-SSI3CO2A.js} +4 -4
  17. package/dist/{audience-writes-QDDADCYE.js → audience-writes-G64754LR.js} +6 -6
  18. package/dist/audience-writes-G64754LR.js.map +1 -0
  19. package/dist/{audiences-TQ5ZEWIR.js → audiences-JAVNJ5NC.js} +8 -8
  20. package/dist/audiences-JAVNJ5NC.js.map +1 -0
  21. package/dist/{businesses-CW4RB36R.js → businesses-DXRDQIFP.js} +2 -2
  22. package/dist/{campaigns-IQYYYD2S.js → campaigns-GQWFSKGC.js} +11 -11
  23. package/dist/campaigns-GQWFSKGC.js.map +1 -0
  24. package/dist/{catalogs-PLBY32BE.js → catalogs-TBRONC2D.js} +15 -15
  25. package/dist/catalogs-TBRONC2D.js.map +1 -0
  26. package/dist/{chunk-OEJNZSJG.js → chunk-4XXA4WCS.js} +4 -4
  27. package/dist/chunk-4XXA4WCS.js.map +1 -0
  28. package/dist/{chunk-HPAGYPAF.js → chunk-BN4TDL5L.js} +65 -23
  29. package/dist/chunk-BN4TDL5L.js.map +1 -0
  30. package/dist/{chunk-5LN7GWRE.js → chunk-GEFZVG4P.js} +10 -10
  31. package/dist/chunk-GEFZVG4P.js.map +1 -0
  32. package/dist/{chunk-XB2FODWU.js → chunk-TKDOVFO6.js} +2 -2
  33. package/dist/cli.js +1 -1
  34. package/dist/{copy-writes-GZ744FHU.js → copy-writes-EUFEVWDW.js} +5 -5
  35. package/dist/{copy-writes-GZ744FHU.js.map → copy-writes-EUFEVWDW.js.map} +1 -1
  36. package/dist/{creatives-GTRQAZSB.js → creatives-6VJDUHEY.js} +6 -6
  37. package/dist/creatives-6VJDUHEY.js.map +1 -0
  38. package/dist/{custom-conversions-VQ3LBWYV.js → custom-conversions-NDY5RHSM.js} +6 -6
  39. package/dist/{custom-conversions-VQ3LBWYV.js.map → custom-conversions-NDY5RHSM.js.map} +1 -1
  40. package/dist/{draft-ME4TNPO7.js → draft-G432FJ7N.js} +2 -2
  41. package/dist/{insights-INIFHYR7.js → insights-IVW6W5CP.js} +2 -2
  42. package/dist/{instant-experiences-NMJUWNP3.js → instant-experiences-6F6GXZ67.js} +5 -5
  43. package/dist/{instant-experiences-NMJUWNP3.js.map → instant-experiences-6F6GXZ67.js.map} +1 -1
  44. package/dist/{leads-QBWR7FKT.js → leads-CJKRKB2Q.js} +6 -6
  45. package/dist/{leads-QBWR7FKT.js.map → leads-CJKRKB2Q.js.map} +1 -1
  46. package/dist/{media-23IW442U.js → media-HDHZULQ7.js} +3 -3
  47. package/dist/{meta-H3KBPU33.js → meta-MOSJVYIE.js} +38 -38
  48. package/dist/{page-photos-SHIGXDYE.js → page-photos-4JTIKXAW.js} +5 -5
  49. package/dist/page-photos-4JTIKXAW.js.map +1 -0
  50. package/dist/{pages-XJF3FBOJ.js → pages-BAUS7LQM.js} +2 -2
  51. package/dist/{performance-L3Q57H4H.js → performance-6XFKDJGY.js} +11 -2
  52. package/dist/performance-6XFKDJGY.js.map +1 -0
  53. package/dist/{pixels-AZCIWWXK.js → pixels-QOSEYXCP.js} +3 -3
  54. package/dist/pixels-QOSEYXCP.js.map +1 -0
  55. package/dist/{preview-BIEVHIDJ.js → preview-X6EJGPAY.js} +2 -2
  56. package/dist/{rule-writes-QLZNJ7CT.js → rule-writes-A4BFYHPA.js} +7 -7
  57. package/dist/rule-writes-A4BFYHPA.js.map +1 -0
  58. package/dist/{rules-FJHYG4SJ.js → rules-HLREXY2M.js} +11 -11
  59. package/dist/rules-HLREXY2M.js.map +1 -0
  60. package/dist/{shared-HY2VP7PT.js → shared-I3SB77VH.js} +2 -2
  61. package/dist/{studies-Z2ZIWLTO.js → studies-IGOCWM7F.js} +7 -7
  62. package/dist/{studies-Z2ZIWLTO.js.map → studies-IGOCWM7F.js.map} +1 -1
  63. package/dist/{study-writes-V7BXLTQG.js → study-writes-Z5P2W7JH.js} +6 -6
  64. package/dist/study-writes-Z5P2W7JH.js.map +1 -0
  65. package/dist/{targeting-YBIWD27C.js → targeting-7HXKBXWY.js} +12 -12
  66. package/dist/targeting-7HXKBXWY.js.map +1 -0
  67. package/dist/{write-commands-R5SN6CVQ.js → write-commands-CY734U34.js} +22 -22
  68. package/dist/write-commands-CY734U34.js.map +1 -0
  69. package/package.json +1 -1
  70. package/dist/account-assets-TAUEBCY5.js.map +0 -1
  71. package/dist/account-level-2MYDHOID.js.map +0 -1
  72. package/dist/ads-NNKUR4HG.js.map +0 -1
  73. package/dist/adsets-VO5C7PDM.js.map +0 -1
  74. package/dist/audience-writes-QDDADCYE.js.map +0 -1
  75. package/dist/audiences-TQ5ZEWIR.js.map +0 -1
  76. package/dist/campaigns-IQYYYD2S.js.map +0 -1
  77. package/dist/catalogs-PLBY32BE.js.map +0 -1
  78. package/dist/chunk-5LN7GWRE.js.map +0 -1
  79. package/dist/chunk-HPAGYPAF.js.map +0 -1
  80. package/dist/chunk-OEJNZSJG.js.map +0 -1
  81. package/dist/creatives-GTRQAZSB.js.map +0 -1
  82. package/dist/page-photos-SHIGXDYE.js.map +0 -1
  83. package/dist/performance-L3Q57H4H.js.map +0 -1
  84. package/dist/pixels-AZCIWWXK.js.map +0 -1
  85. package/dist/rule-writes-QLZNJ7CT.js.map +0 -1
  86. package/dist/rules-FJHYG4SJ.js.map +0 -1
  87. package/dist/study-writes-V7BXLTQG.js.map +0 -1
  88. package/dist/targeting-YBIWD27C.js.map +0 -1
  89. package/dist/write-commands-R5SN6CVQ.js.map +0 -1
  90. /package/dist/{accounts-VIAQC3PA.js.map → accounts-KRW3JNCW.js.map} +0 -0
  91. /package/dist/{ads-O4RL4JXD.js.map → ads-6ESCXPHK.js.map} +0 -0
  92. /package/dist/{asset-writes-PQNENVYY.js.map → asset-writes-SSI3CO2A.js.map} +0 -0
  93. /package/dist/{businesses-CW4RB36R.js.map → businesses-DXRDQIFP.js.map} +0 -0
  94. /package/dist/{chunk-XB2FODWU.js.map → chunk-TKDOVFO6.js.map} +0 -0
  95. /package/dist/{draft-ME4TNPO7.js.map → draft-G432FJ7N.js.map} +0 -0
  96. /package/dist/{insights-INIFHYR7.js.map → insights-IVW6W5CP.js.map} +0 -0
  97. /package/dist/{media-23IW442U.js.map → media-HDHZULQ7.js.map} +0 -0
  98. /package/dist/{meta-H3KBPU33.js.map → meta-MOSJVYIE.js.map} +0 -0
  99. /package/dist/{pages-XJF3FBOJ.js.map → pages-BAUS7LQM.js.map} +0 -0
  100. /package/dist/{preview-BIEVHIDJ.js.map → preview-X6EJGPAY.js.map} +0 -0
  101. /package/dist/{shared-HY2VP7PT.js.map → shared-I3SB77VH.js.map} +0 -0
@@ -11,7 +11,7 @@ import {
11
11
  resolveAccountIdArg,
12
12
  resolveEffectiveStatus,
13
13
  statusFilterHints
14
- } from "./chunk-HPAGYPAF.js";
14
+ } from "./chunk-BN4TDL5L.js";
15
15
  import "./chunk-QALAJNBG.js";
16
16
  import "./chunk-HPDGVK6R.js";
17
17
  import {
@@ -28,8 +28,12 @@ import "./chunk-YQSBHWOI.js";
28
28
 
29
29
  // src/commands/ads/meta/ads.ts
30
30
  import { defineCommand } from "citty";
31
+ var ACCOUNT_SELECTION = "Account: --account-id, else BAKER_META_AD_ACCOUNT_ID, else the company's only connected Meta ad account. With several connected it refuses with MISSING_ACCOUNT_ID listing each \u2014 re-run naming one.";
31
32
  var listArgs = {
32
- "account-id": { type: "string", description: "Meta ad account ID" },
33
+ "account-id": {
34
+ type: "string",
35
+ description: "Meta ad account ID (act_123). Optional when the company connected only one account (or BAKER_META_AD_ACCOUNT_ID is set); required when several are connected."
36
+ },
33
37
  "adset-id": { type: "string", description: "Filter to one adset" },
34
38
  "campaign-id": { type: "string", description: "Filter to one campaign" },
35
39
  "effective-status": { type: "string", description: "Comma-separated effective_status filter (overrides default)" },
@@ -41,17 +45,17 @@ var listArgs = {
41
45
  };
42
46
  registerMetaListSchema(
43
47
  "ads",
44
- "List ads in a Meta ad account, as a table by default: id, name, adset_id, campaign_id, effective_status, creative_id, issues (why an ad is WITH_ISSUES), created_time. Start here: baker ads meta ads --adset-id 6123. --fields takes dotted paths (e.g. id,tracking_specs); --full returns every field Meta sent; --output json returns the rows in the envelope.",
48
+ `List ads in a Meta ad account, as a table by default: id, name, adset_id, campaign_id, effective_status, creative_id, issues (why an ad is WITH_ISSUES), created_time. Start here: baker ads meta ads --adset-id 6123. --fields takes dotted paths (e.g. id,tracking_specs); --full returns every field Meta sent; --output json returns the rows in the envelope. ${ACCOUNT_SELECTION}`,
45
49
  listArgs
46
50
  );
47
51
  var listCommand = defineCommand({
48
52
  meta: {
49
53
  name: "list",
50
- description: "List ads in a Meta ad account. Runs by default when no subcommand is given. Example: baker ads meta ads --account-id act_123"
54
+ description: `List ads in a Meta ad account. Runs by default when no subcommand is given. ${ACCOUNT_SELECTION} Example: baker ads meta ads --account-id act_123`
51
55
  },
52
56
  args: listArgs,
53
57
  run: async ({ args }) => {
54
- const accountId = resolveAccountIdArg(args);
58
+ const accountId = await resolveAccountIdArg(args);
55
59
  const effectiveStatus = resolveEffectiveStatus(args);
56
60
  try {
57
61
  const params = { "account-id": accountId };
@@ -74,6 +78,7 @@ var adsListCommand = defineCommand({
74
78
  name: "ads",
75
79
  description: `List ads in a Meta ad account, or stage writes (create/update/pause/resume/archive/delete/duplicate/copy/retag).
76
80
  Defaults to ACTIVE only \u2014 pass --all-statuses to widen. Write subcommands stage ops on this chat's draft.
81
+ ${ACCOUNT_SELECTION}
77
82
 
78
83
  The dashboard shows effective_status (e.g. WITH_ISSUES, PENDING_REVIEW, DISAPPROVED, ADSET_PAUSED), not status.
79
84
 
@@ -92,15 +97,15 @@ Examples:
92
97
  },
93
98
  subCommands: {
94
99
  list: listCommand,
95
- create: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adsCreateCommand),
96
- update: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adsUpdateCommand),
97
- pause: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adsPauseCommand),
98
- resume: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adsResumeCommand),
99
- archive: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adsArchiveCommand),
100
- delete: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adsDeleteCommand),
101
- duplicate: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adsDuplicateCommand),
102
- copy: () => import("./copy-writes-GZ744FHU.js").then((m) => m.adsCopyCommand),
103
- retag: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adsRetagCommand)
100
+ create: () => import("./write-commands-CY734U34.js").then((m) => m.adsCreateCommand),
101
+ update: () => import("./write-commands-CY734U34.js").then((m) => m.adsUpdateCommand),
102
+ pause: () => import("./write-commands-CY734U34.js").then((m) => m.adsPauseCommand),
103
+ resume: () => import("./write-commands-CY734U34.js").then((m) => m.adsResumeCommand),
104
+ archive: () => import("./write-commands-CY734U34.js").then((m) => m.adsArchiveCommand),
105
+ delete: () => import("./write-commands-CY734U34.js").then((m) => m.adsDeleteCommand),
106
+ duplicate: () => import("./write-commands-CY734U34.js").then((m) => m.adsDuplicateCommand),
107
+ copy: () => import("./copy-writes-EUFEVWDW.js").then((m) => m.adsCopyCommand),
108
+ retag: () => import("./write-commands-CY734U34.js").then((m) => m.adsRetagCommand)
104
109
  },
105
110
  // `args` stays even though the parent has no `run`: citty scans rawArgs for the
106
111
  // subcommand name using THIS command's arg defs, so without them `--account-id act_1`
@@ -112,4 +117,4 @@ Examples:
112
117
  export {
113
118
  adsListCommand
114
119
  };
115
- //# sourceMappingURL=ads-NNKUR4HG.js.map
120
+ //# sourceMappingURL=ads-JVBLNTBF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/meta/ads.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { META_LIST_SHAPE_ARGS, registerMetaListSchema, shapeMetaListRows, writeMetaListRows } from \"./list-rows.ts\";\nimport {\n csvOrJson,\n handleMetaError,\n NAME_CONTAINS_ARG,\n resolveAccountIdArg,\n resolveEffectiveStatus,\n statusFilterHints,\n} from \"./shared.ts\";\n\nconst ACCOUNT_SELECTION =\n \"Account: --account-id, else BAKER_META_AD_ACCOUNT_ID, else the company's only connected Meta ad account. With several connected it refuses with MISSING_ACCOUNT_ID listing each — re-run naming one.\";\n\nconst listArgs = {\n \"account-id\": {\n type: \"string\",\n description:\n \"Meta ad account ID (act_123). Optional when the company connected only one account (or BAKER_META_AD_ACCOUNT_ID is set); required when several are connected.\",\n },\n \"adset-id\": { type: \"string\", description: \"Filter to one adset\" },\n \"campaign-id\": { type: \"string\", description: \"Filter to one campaign\" },\n \"effective-status\": { type: \"string\", description: \"Comma-separated effective_status filter (overrides default)\" },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the default ACTIVE filter\" },\n \"name-contains\": NAME_CONTAINS_ARG,\n limit: { type: \"string\", description: \"Max rows (default 1000)\" },\n \"no-cache\": NO_CACHE_ARG,\n ...META_LIST_SHAPE_ARGS,\n} as const;\n\nregisterMetaListSchema(\n \"ads\",\n `List ads in a Meta ad account, as a table by default: id, name, adset_id, campaign_id, effective_status, creative_id, issues (why an ad is WITH_ISSUES), created_time. Start here: baker ads meta ads --adset-id 6123. --fields takes dotted paths (e.g. id,tracking_specs); --full returns every field Meta sent; --output json returns the rows in the envelope. ${ACCOUNT_SELECTION}`,\n listArgs,\n);\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description: `List ads in a Meta ad account. Runs by default when no subcommand is given. ${ACCOUNT_SELECTION} Example: baker ads meta ads --account-id act_123`,\n },\n args: listArgs,\n run: async ({ args }) => {\n const accountId = await resolveAccountIdArg(args);\n const effectiveStatus = resolveEffectiveStatus(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"adset-id\"]) params[\"adset-id\"] = args[\"adset-id\"] as string;\n if (args[\"campaign-id\"]) params[\"campaign-id\"] = args[\"campaign-id\"] as string;\n if (effectiveStatus) params[\"effective-status\"] = effectiveStatus;\n if (args[\"name-contains\"]) params[\"name-contains\"] = args[\"name-contains\"] as string;\n if (args.limit) params.limit = args.limit as string;\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/ads\", params);\n const shaped = shapeMetaListRows(\"ads\", data, args);\n writeMetaListRows(\"ads\", shaped, csvOrJson(args), statusFilterHints(data, effectiveStatus, \"ads\"));\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nexport const adsListCommand = defineCommand({\n meta: {\n name: \"ads\",\n description: `List ads in a Meta ad account, or stage writes (create/update/pause/resume/archive/delete/duplicate/copy/retag).\nDefaults to ACTIVE only — pass --all-statuses to widen. Write subcommands stage ops on this chat's draft.\n${ACCOUNT_SELECTION}\n\nThe dashboard shows effective_status (e.g. WITH_ISSUES, PENDING_REVIEW, DISAPPROVED, ADSET_PAUSED), not status.\n\nListings print a table by default: id, name, adset_id, campaign_id, effective_status, creative_id, issues\n(why an ad is WITH_ISSUES), created_time. --fields takes dotted paths (e.g. tracking_specs,\npreview_shareable_link); --full returns every field; --output json returns the rows as JSON.\n\nExamples:\n baker ads meta ads --account-id act_123\n baker ads meta ads --adset-id 6123\n baker ads meta ads --account-id act_123 --all-statuses --name-contains octubre --fields id,name,adset_id,creative_id — find one ad by name\n baker ads meta ads --adset-id 6123 --fields id,name,preview_shareable_link\n baker ads meta ads create --name \"Ad 1\" --adset meta_temp_as01 --creative meta_temp_cr01\n baker ads meta ads pause 6123 --account-id act_123\n baker ads meta ads retag 6123 --set \"utm_medium=paid-social\" — fix tracking on a LIVE ad, keeping everything else`,\n },\n subCommands: {\n list: listCommand,\n create: () => import(\"./write-commands.ts\").then((m) => m.adsCreateCommand),\n update: () => import(\"./write-commands.ts\").then((m) => m.adsUpdateCommand),\n pause: () => import(\"./write-commands.ts\").then((m) => m.adsPauseCommand),\n resume: () => import(\"./write-commands.ts\").then((m) => m.adsResumeCommand),\n archive: () => import(\"./write-commands.ts\").then((m) => m.adsArchiveCommand),\n delete: () => import(\"./write-commands.ts\").then((m) => m.adsDeleteCommand),\n duplicate: () => import(\"./write-commands.ts\").then((m) => m.adsDuplicateCommand),\n copy: () => import(\"./copy-writes.ts\").then((m) => m.adsCopyCommand),\n retag: () => import(\"./write-commands.ts\").then((m) => m.adsRetagCommand),\n },\n // `args` stays even though the parent has no `run`: citty scans rawArgs for the\n // subcommand name using THIS command's arg defs, so without them `--account-id act_1`\n // would read `act_1` as a subcommand. `default` (not `run`) dispatches the bare\n // invocation — citty falls through to `run` after a subcommand, double-executing it.\n args: listArgs,\n default: \"list\",\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAa9B,IAAM,oBACJ;AAEF,IAAM,WAAW;AAAA,EACf,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,YAAY,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,EACjE,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,EACvE,oBAAoB,EAAE,MAAM,UAAU,aAAa,8DAA8D;AAAA,EACjH,gBAAgB,EAAE,MAAM,WAAW,aAAa,iCAAiC;AAAA,EACjF,iBAAiB;AAAA,EACjB,OAAO,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,EAChE,YAAY;AAAA,EACZ,GAAG;AACL;AAEA;AAAA,EACE;AAAA,EACA,sWAAsW,iBAAiB;AAAA,EACvX;AACF;AAEA,IAAM,cAAc,cAAc;AAAA,EAChC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa,+EAA+E,iBAAiB;AAAA,EAC/G;AAAA,EACA,MAAM;AAAA,EACN,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,oBAAoB,IAAI;AAChD,UAAM,kBAAkB,uBAAuB,IAAI;AACnD,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,UAAU,EAAG,QAAO,UAAU,IAAI,KAAK,UAAU;AAC1D,UAAI,KAAK,aAAa,EAAG,QAAO,aAAa,IAAI,KAAK,aAAa;AACnE,UAAI,gBAAiB,QAAO,kBAAkB,IAAI;AAClD,UAAI,KAAK,eAAe,EAAG,QAAO,eAAe,IAAI,KAAK,eAAe;AACzE,UAAI,KAAK,MAAO,QAAO,QAAQ,KAAK;AACpC,UAAI,KAAK,UAAU,EAAG,QAAO,YAAY,IAAI;AAC7C,YAAM,OAAO,MAAM,OAAuC,qBAAqB,MAAM;AACrF,YAAM,SAAS,kBAAkB,OAAO,MAAM,IAAI;AAClD,wBAAkB,OAAO,QAAQ,UAAU,IAAI,GAAG,kBAAkB,MAAM,iBAAiB,KAAK,CAAC;AAAA,IACnG,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;AAEM,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA,EAEf,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBjB;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,QAAQ,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,gBAAgB;AAAA,IAC1E,QAAQ,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,gBAAgB;AAAA,IAC1E,OAAO,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,eAAe;AAAA,IACxE,QAAQ,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,gBAAgB;AAAA,IAC1E,SAAS,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,iBAAiB;AAAA,IAC5E,QAAQ,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,gBAAgB;AAAA,IAC1E,WAAW,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,mBAAmB;AAAA,IAChF,MAAM,MAAM,OAAO,2BAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,cAAc;AAAA,IACnE,OAAO,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,eAAe;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM;AAAA,EACN,SAAS;AACX,CAAC;","names":[]}
@@ -19,7 +19,7 @@ import {
19
19
  resolveAccountIdArg,
20
20
  resolveEffectiveStatus,
21
21
  statusFilterHints
22
- } from "./chunk-HPAGYPAF.js";
22
+ } from "./chunk-BN4TDL5L.js";
23
23
  import {
24
24
  rememberedJev
25
25
  } from "./chunk-FBG3JDET.js";
@@ -113,7 +113,7 @@ var listCommand = defineCommand({
113
113
  },
114
114
  args: listArgs,
115
115
  run: async ({ args }) => {
116
- const accountId = resolveAccountIdArg(args);
116
+ const accountId = await resolveAccountIdArg(args);
117
117
  const effectiveStatus = resolveEffectiveStatus(args);
118
118
  try {
119
119
  const params = { "account-id": accountId };
@@ -160,14 +160,14 @@ Examples:
160
160
  },
161
161
  subCommands: {
162
162
  list: listCommand,
163
- create: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adSetsCreateCommand),
164
- update: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adSetsUpdateCommand),
165
- pause: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adSetsPauseCommand),
166
- resume: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adSetsResumeCommand),
167
- archive: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adSetsArchiveCommand),
168
- delete: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adSetsDeleteCommand),
169
- duplicate: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.adSetsDuplicateCommand),
170
- copy: () => import("./copy-writes-GZ744FHU.js").then((m) => m.adSetsCopyCommand)
163
+ create: () => import("./write-commands-CY734U34.js").then((m) => m.adSetsCreateCommand),
164
+ update: () => import("./write-commands-CY734U34.js").then((m) => m.adSetsUpdateCommand),
165
+ pause: () => import("./write-commands-CY734U34.js").then((m) => m.adSetsPauseCommand),
166
+ resume: () => import("./write-commands-CY734U34.js").then((m) => m.adSetsResumeCommand),
167
+ archive: () => import("./write-commands-CY734U34.js").then((m) => m.adSetsArchiveCommand),
168
+ delete: () => import("./write-commands-CY734U34.js").then((m) => m.adSetsDeleteCommand),
169
+ duplicate: () => import("./write-commands-CY734U34.js").then((m) => m.adSetsDuplicateCommand),
170
+ copy: () => import("./copy-writes-EUFEVWDW.js").then((m) => m.adSetsCopyCommand)
171
171
  },
172
172
  // `args` stays even though the parent has no `run`: citty scans rawArgs for the
173
173
  // subcommand name using THIS command's arg defs, so without them `--account-id act_1`
@@ -179,4 +179,4 @@ Examples:
179
179
  export {
180
180
  adsetsCommand
181
181
  };
182
- //# sourceMappingURL=adsets-VO5C7PDM.js.map
182
+ //# sourceMappingURL=adsets-FN5ZWSYF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/meta/adsets.ts"],"sourcesContent":["import path from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { readAudienceNames } from \"../../../audience-names.ts\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { rememberedJev } from \"../../../engine/lib/remembered-nouls.ts\";\nimport type { ReviewUsage } from \"../../../engine/nodes/local/lib/render-review.ts\";\nimport { findWorkspaceRoot } from \"../../canvas/normalize-paths.ts\";\nimport { holdUnbilledSpend } from \"../../canvas/unbilled-spend.ts\";\nimport { writeAdsOutput } from \"../output.ts\";\nimport { adSetViewerRows, audienceNamesOf, flattenViewerRows, VIEWER_TABLE_COLUMNS } from \"./adset-viewers.ts\";\nimport {\n budgetUnitHints,\n META_LIST_SHAPE_ARGS,\n registerMetaListSchema,\n shapeMetaListRows,\n writeMetaListRows,\n} from \"./list-rows.ts\";\nimport {\n csvOrJson,\n handleMetaError,\n NAME_CONTAINS_ARG,\n resolveAccountIdArg,\n resolveEffectiveStatus,\n statusFilterHints,\n} from \"./shared.ts\";\n\nconst listArgs = {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID\" },\n \"campaign-id\": { type: \"string\", description: \"Filter to one campaign\" },\n \"effective-status\": { type: \"string\", description: \"Comma-separated effective_status filter (overrides default)\" },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the default ACTIVE filter\" },\n \"name-contains\": NAME_CONTAINS_ARG,\n limit: { type: \"string\", description: \"Max rows (default 1000)\" },\n \"no-cache\": NO_CACHE_ARG,\n audience: {\n type: \"boolean\",\n description:\n \"Who each ad set reaches, instead of the compact row: a viewer per ad set — temperature (cold|warm|hot), what they already know (brand/offer/product), placements, and the reasons, read from its targeting, the account's audiences and the campaign objective. Start here before writing an ad for an ad set: baker ads meta adsets --campaign-id 6123 --audience --output json\",\n },\n ...META_LIST_SHAPE_ARGS,\n} as const;\n\ntype MetaRow = Record<string, unknown>;\n\n/**\n * The audience list and the campaign objectives only sharpen the read: without them\n * each audience is read from its name and the objective is left out, so a refused\n * read degrades the viewer rather than failing the listing.\n */\nasync function readOrEmpty(path: string, params: Record<string, string>, label: string, hints: string[]) {\n try {\n return await apiGet<MetaRow[]>(path, params);\n } catch (err) {\n const message = err instanceof Error ? err.message : \"unknown error\";\n hints.push(`Could not read the account's ${label} (${message}); the viewer was read without them.`);\n return [];\n }\n}\n\nasync function writeAdSetViewers(\n adSets: MetaRow[],\n accountParams: Record<string, string>,\n format: string,\n hints: string[],\n): Promise<void> {\n const [audiences, campaigns] = await Promise.all([\n readOrEmpty(\"/api/ads/meta/audiences\", accountParams, \"audiences\", hints),\n readOrEmpty(\"/api/ads/meta/campaigns\", accountParams, \"campaigns\", hints),\n ]);\n const root = findWorkspaceRoot(process.cwd()) ?? process.cwd();\n const cacheDir = path.join(root, \"canvas\", \".cache\");\n const spent: ReviewUsage[] = [];\n const readName = await readAudienceNames(\n audienceNamesOf(adSets, audiences),\n rememberedJev(path.join(cacheDir, \"audience-names.json\"), (u) => spent.push(u)),\n );\n await holdUnbilledSpend(cacheDir, spent).catch(() => undefined);\n const rows = adSetViewerRows(adSets, audiences, campaigns, readName);\n if (rows.length > 0) {\n hints.push(\n 'Write each ad for the viewer of the ad set it will run in, then record it in the creative\\'s _definition.md: targetAdSet: \"<ad set id>\" and viewer: { temperature, knows, placements, source }.',\n );\n }\n if (format === \"md\" || format === \"csv\") {\n writeAdsOutput(flattenViewerRows(rows), format, [...VIEWER_TABLE_COLUMNS], hints);\n return;\n }\n writeAdsOutput(rows as unknown as MetaRow[], format, undefined, hints);\n}\n\nregisterMetaListSchema(\n \"adsets\",\n \"List ad sets in a Meta ad account, as a table by default: id, name, campaign_id, effective_status, optimization_goal, billing_event, bid_strategy, budgets, destination_type, is_dynamic_creative, learning_stage, end_time, created_time. Targeting is not in the compact row — ask for it with --fields id,name,targeting (or --full). --audience replaces the row with who each ad set reaches (a viewer: temperature, what they already know, placements, reasons) — read it before writing an ad for an ad set. Start here: baker ads meta adsets --campaign-id 6123 --all-statuses. --output json returns the rows in the envelope.\",\n listArgs,\n);\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List ad sets in a Meta ad account. Runs by default when no subcommand is given. Example: baker ads meta adsets --account-id act_123\",\n },\n args: listArgs,\n run: async ({ args }) => {\n const accountId = await resolveAccountIdArg(args);\n const effectiveStatus = resolveEffectiveStatus(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"campaign-id\"]) params[\"campaign-id\"] = args[\"campaign-id\"] as string;\n if (effectiveStatus) params[\"effective-status\"] = effectiveStatus;\n if (args[\"name-contains\"]) params[\"name-contains\"] = args[\"name-contains\"] as string;\n if (args.limit) params.limit = args.limit as string;\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/adsets\", params);\n if (args.audience) {\n const hints = statusFilterHints(data, effectiveStatus, \"ad sets\");\n const accountParams: Record<string, string> = { \"account-id\": accountId };\n if (args[\"no-cache\"]) accountParams[\"skip-cache\"] = \"true\";\n await writeAdSetViewers(data, accountParams, csvOrJson(args), hints);\n return;\n }\n const shaped = shapeMetaListRows(\"adsets\", data, args);\n writeMetaListRows(\"adsets\", shaped, csvOrJson(args), [\n ...statusFilterHints(data, effectiveStatus, \"ad sets\"),\n ...budgetUnitHints(data),\n ]);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nexport const adsetsCommand = defineCommand({\n meta: {\n name: \"adsets\",\n description: `List ad sets in a Meta ad account, or stage writes (create/update/pause/resume/archive/delete/duplicate/copy).\nDefaults to ACTIVE only. Write subcommands stage ops on this chat's draft.\n\nListings print a table by default: id, name, campaign_id, effective_status, optimization_goal, billing_event,\nbid_strategy, budgets, destination_type, is_dynamic_creative, learning_stage, end_time, created_time. Targeting\nis not in the compact row — ask for it with --fields (dotted paths) or --full. --output json returns the rows as JSON.\n\nExamples:\n baker ads meta adsets --account-id act_123\n baker ads meta adsets --campaign-id 6123456789\n baker ads meta adsets --account-id act_123 --all-statuses --name-contains retargeting — find one ad set by name\n baker ads meta adsets --campaign-id 6123456789 --fields id,name,targeting.geo_locations\n baker ads meta adsets --campaign-id 6123456789 --audience --output json — who each ad set reaches (viewer per ad set)\n baker ads meta adsets create --campaign meta_temp_ab12 --name \"US 25-54\" --optimization-goal LINK_CLICKS --billing-event IMPRESSIONS --daily-budget 50 --targeting-file t.json`,\n },\n subCommands: {\n list: listCommand,\n create: () => import(\"./write-commands.ts\").then((m) => m.adSetsCreateCommand),\n update: () => import(\"./write-commands.ts\").then((m) => m.adSetsUpdateCommand),\n pause: () => import(\"./write-commands.ts\").then((m) => m.adSetsPauseCommand),\n resume: () => import(\"./write-commands.ts\").then((m) => m.adSetsResumeCommand),\n archive: () => import(\"./write-commands.ts\").then((m) => m.adSetsArchiveCommand),\n delete: () => import(\"./write-commands.ts\").then((m) => m.adSetsDeleteCommand),\n duplicate: () => import(\"./write-commands.ts\").then((m) => m.adSetsDuplicateCommand),\n copy: () => import(\"./copy-writes.ts\").then((m) => m.adSetsCopyCommand),\n },\n // `args` stays even though the parent has no `run`: citty scans rawArgs for the\n // subcommand name using THIS command's arg defs, so without them `--account-id act_1`\n // would read `act_1` as a subcommand. `default` (not `run`) dispatches the bare\n // invocation — citty falls through to `run` after a subcommand, double-executing it.\n args: listArgs,\n default: \"list\",\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AA0B9B,IAAM,WAAW;AAAA,EACf,cAAc,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,EAClE,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,EACvE,oBAAoB,EAAE,MAAM,UAAU,aAAa,8DAA8D;AAAA,EACjH,gBAAgB,EAAE,MAAM,WAAW,aAAa,iCAAiC;AAAA,EACjF,iBAAiB;AAAA,EACjB,OAAO,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,EAChE,YAAY;AAAA,EACZ,UAAU;AAAA,IACR,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,GAAG;AACL;AASA,eAAe,YAAYA,OAAc,QAAgC,OAAe,OAAiB;AACvG,MAAI;AACF,WAAO,MAAM,OAAkBA,OAAM,MAAM;AAAA,EAC7C,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,UAAM,KAAK,gCAAgC,KAAK,KAAK,OAAO,sCAAsC;AAClG,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,kBACb,QACA,eACA,QACA,OACe;AACf,QAAM,CAAC,WAAW,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC/C,YAAY,2BAA2B,eAAe,aAAa,KAAK;AAAA,IACxE,YAAY,2BAA2B,eAAe,aAAa,KAAK;AAAA,EAC1E,CAAC;AACD,QAAM,OAAO,kBAAkB,QAAQ,IAAI,CAAC,KAAK,QAAQ,IAAI;AAC7D,QAAM,WAAW,KAAK,KAAK,MAAM,UAAU,QAAQ;AACnD,QAAM,QAAuB,CAAC;AAC9B,QAAM,WAAW,MAAM;AAAA,IACrB,gBAAgB,QAAQ,SAAS;AAAA,IACjC,cAAc,KAAK,KAAK,UAAU,qBAAqB,GAAG,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;AAAA,EAChF;AACA,QAAM,kBAAkB,UAAU,KAAK,EAAE,MAAM,MAAM,MAAS;AAC9D,QAAM,OAAO,gBAAgB,QAAQ,WAAW,WAAW,QAAQ;AACnE,MAAI,KAAK,SAAS,GAAG;AACnB,UAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACA,MAAI,WAAW,QAAQ,WAAW,OAAO;AACvC,mBAAe,kBAAkB,IAAI,GAAG,QAAQ,CAAC,GAAG,oBAAoB,GAAG,KAAK;AAChF;AAAA,EACF;AACA,iBAAe,MAA8B,QAAQ,QAAW,KAAK;AACvE;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,cAAc,cAAc;AAAA,EAChC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,EACN,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,oBAAoB,IAAI;AAChD,UAAM,kBAAkB,uBAAuB,IAAI;AACnD,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,aAAa,EAAG,QAAO,aAAa,IAAI,KAAK,aAAa;AACnE,UAAI,gBAAiB,QAAO,kBAAkB,IAAI;AAClD,UAAI,KAAK,eAAe,EAAG,QAAO,eAAe,IAAI,KAAK,eAAe;AACzE,UAAI,KAAK,MAAO,QAAO,QAAQ,KAAK;AACpC,UAAI,KAAK,UAAU,EAAG,QAAO,YAAY,IAAI;AAC7C,YAAM,OAAO,MAAM,OAAuC,wBAAwB,MAAM;AACxF,UAAI,KAAK,UAAU;AACjB,cAAM,QAAQ,kBAAkB,MAAM,iBAAiB,SAAS;AAChE,cAAM,gBAAwC,EAAE,cAAc,UAAU;AACxE,YAAI,KAAK,UAAU,EAAG,eAAc,YAAY,IAAI;AACpD,cAAM,kBAAkB,MAAM,eAAe,UAAU,IAAI,GAAG,KAAK;AACnE;AAAA,MACF;AACA,YAAM,SAAS,kBAAkB,UAAU,MAAM,IAAI;AACrD,wBAAkB,UAAU,QAAQ,UAAU,IAAI,GAAG;AAAA,QACnD,GAAG,kBAAkB,MAAM,iBAAiB,SAAS;AAAA,QACrD,GAAG,gBAAgB,IAAI;AAAA,MACzB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;AAEM,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcf;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,QAAQ,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,mBAAmB;AAAA,IAC7E,QAAQ,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,mBAAmB;AAAA,IAC7E,OAAO,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,kBAAkB;AAAA,IAC3E,QAAQ,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,mBAAmB;AAAA,IAC7E,SAAS,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,oBAAoB;AAAA,IAC/E,QAAQ,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,mBAAmB;AAAA,IAC7E,WAAW,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,sBAAsB;AAAA,IACnF,MAAM,MAAM,OAAO,2BAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,iBAAiB;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM;AAAA,EACN,SAAS;AACX,CAAC;","names":["path"]}
@@ -9,11 +9,11 @@ import {
9
9
  labelsDetachCommand,
10
10
  labelsRenameCommand,
11
11
  mediaDeleteCommand
12
- } from "./chunk-5LN7GWRE.js";
13
- import "./chunk-OEJNZSJG.js";
12
+ } from "./chunk-GEFZVG4P.js";
13
+ import "./chunk-4XXA4WCS.js";
14
14
  import "./chunk-GC5P4KWY.js";
15
15
  import "./chunk-GDFJOCDO.js";
16
- import "./chunk-HPAGYPAF.js";
16
+ import "./chunk-BN4TDL5L.js";
17
17
  import "./chunk-ERSX3MKH.js";
18
18
  import "./chunk-WPAW6EVY.js";
19
19
  import "./chunk-4NZ47VXO.js";
@@ -47,4 +47,4 @@ export {
47
47
  labelsRenameCommand,
48
48
  mediaDeleteCommand
49
49
  };
50
- //# sourceMappingURL=asset-writes-PQNENVYY.js.map
50
+ //# sourceMappingURL=asset-writes-SSI3CO2A.js.map
@@ -10,7 +10,7 @@ import {
10
10
  repeatedListFlag,
11
11
  requireTarget,
12
12
  stageOp
13
- } from "./chunk-OEJNZSJG.js";
13
+ } from "./chunk-4XXA4WCS.js";
14
14
  import {
15
15
  CUSTOMER_LIST_BATCH_ROWS,
16
16
  CUSTOMER_LIST_MAX_BATCHES,
@@ -21,7 +21,7 @@ import {
21
21
  csvOrJson,
22
22
  handleMetaError,
23
23
  resolveAccountIdArg
24
- } from "./chunk-HPAGYPAF.js";
24
+ } from "./chunk-BN4TDL5L.js";
25
25
  import "./chunk-ERSX3MKH.js";
26
26
  import "./chunk-WPAW6EVY.js";
27
27
  import "./chunk-4NZ47VXO.js";
@@ -149,7 +149,7 @@ function listHints(list) {
149
149
  return hints;
150
150
  }
151
151
  async function stageMembers(action, args, rawArgs) {
152
- const accountId = bareAccountId(args);
152
+ const accountId = await bareAccountId(args);
153
153
  const audienceId = requireTarget(args, "audience");
154
154
  const list = readList(args, rawArgs);
155
155
  if (list.rows.length === 0) {
@@ -241,7 +241,7 @@ var audiencesDeleteCommand = defineCommand({
241
241
  run: async ({ args }) => {
242
242
  await stageOp({
243
243
  kind: "customAudience.update",
244
- accountId: bareAccountId(args),
244
+ accountId: await bareAccountId(args),
245
245
  target: requireTarget(args, "audience"),
246
246
  payload: { status: "DELETED" }
247
247
  });
@@ -273,7 +273,7 @@ var savedAudiencesCommand = defineCommand({
273
273
  output: { type: "string", description: "json|csv|jsonl|md", default: "json" }
274
274
  },
275
275
  run: async ({ args }) => {
276
- const accountId = resolveAccountIdArg(args);
276
+ const accountId = await resolveAccountIdArg(args);
277
277
  try {
278
278
  const params = { "account-id": accountId };
279
279
  if (args["saved-audience-id"]) params["saved-audience-id"] = String(args["saved-audience-id"]);
@@ -324,4 +324,4 @@ export {
324
324
  savedAudiencesCommand,
325
325
  targetingFromSavedAudience
326
326
  };
327
- //# sourceMappingURL=audience-writes-QDDADCYE.js.map
327
+ //# sourceMappingURL=audience-writes-G64754LR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/meta/audience-writes.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { brandSafetyTargetingFields } from \"@baker/api/ads-meta/brandSafety\";\nimport {\n CUSTOMER_LIST_BATCH_ROWS,\n CUSTOMER_LIST_MAX_BATCHES,\n type CustomerListAction,\n type CustomerListBatchResponse,\n} from \"@baker/api/ads-meta/customerList\";\nimport { defineCommand } from \"citty\";\nimport { apiGet, apiPost } from \"../../../client.ts\";\nimport { requireChatId } from \"../../../env.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { writeAdsOutput, writeJsonEnvelope } from \"../output.ts\";\nimport {\n customerListBatches,\n customerListFromFile,\n customerListUploadRefusal,\n DATE_ORDERS,\n type DateOrder,\n type HashedCustomerList,\n} from \"./customer-list.ts\";\nimport { csvOrJson, handleMetaError, resolveAccountIdArg } from \"./shared.ts\";\nimport { bareAccountId, failWriteValidation, repeatedListFlag, requireTarget, stageOp } from \"./write-shared.ts\";\n\n/**\n * Staged writes on who is in a customer list, deleting an audience, and the\n * saved audiences an ad set can copy. The people are read from a file in the\n * workspace and hashed here; only their digests are held by Baker until the\n * chat publishes, and only counts are ever printed.\n */\n\nconst STAGED_NOTE = \"Staged until publish — review with `baker ads meta draft`.\";\n\nconst membersArgs = {\n id: {\n type: \"positional\",\n description: \"Customer-list audience id, or a meta_temp_* ref created in this chat\",\n required: true,\n },\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\" },\n file: {\n type: \"string\",\n description:\n \"CSV (or ;/tab separated) in the workspace with a header row: email, phone, first name, last name, city, state, zip, country, birthday, gender, madid, external id\",\n },\n country: {\n type: \"string\",\n description:\n \"Two-letter country for phones written without their country code (when the row has no country column)\",\n },\n \"value-column\": {\n type: \"string\",\n description: \"Value-based list only: the column with each person's value (e.g. revenue)\",\n },\n columns: {\n type: \"string\",\n description:\n \"For a file without a header row: what each column is, in order (email,phone,country — comma-separated or repeated)\",\n },\n \"date-format\": {\n type: \"string\",\n description:\n \"How birthdays like 03/07/1990 are written: DMY (day first) or MDY (month first, US). Needed only when no date in the file shows it\",\n },\n} as const;\n\nfunction schemaArgs<T extends Record<string, { type: string; description: string; required?: boolean }>>(args: T) {\n return Object.fromEntries(\n Object.entries(args).map(([key, arg]) => [\n key,\n { type: arg.type, description: arg.description, required: arg.required === true },\n ]),\n );\n}\n\nconst ACTION_NOTES: Record<CustomerListAction, string> = {\n add: \"Adds the people in the file to the list; those already in it stay.\",\n remove: \"Removes the people in the file from the list.\",\n replace:\n \"Replaces the whole list with the file — everyone not in it leaves. Runs alone: not beside another change to the same list in this chat.\",\n};\n\nfunction dateFormatFlag(value: unknown): DateOrder | undefined {\n if (value === undefined) return undefined;\n const upperValue = String(value).toUpperCase();\n if (!(DATE_ORDERS as readonly string[]).includes(upperValue)) {\n failWriteValidation(`--date-format takes ${DATE_ORDERS.join(\" or \")}, not ${String(value)}`);\n }\n return upperValue as DateOrder;\n}\n\nfunction readList(args: Record<string, unknown>, rawArgs: readonly string[] | undefined): HashedCustomerList {\n const path = typeof args.file === \"string\" ? args.file : \"\";\n if (!path) {\n failWriteValidation(\"pass --file with the customer list (CSV in the workspace)\");\n }\n let content: string;\n try {\n content = readFileSync(path, \"utf8\");\n } catch (err) {\n failWriteValidation(`could not read ${path}: ${err instanceof Error ? err.message : String(err)}`);\n }\n try {\n return customerListFromFile(content, {\n defaultCountry: typeof args.country === \"string\" ? args.country : undefined,\n valueColumn: typeof args[\"value-column\"] === \"string\" ? args[\"value-column\"] : undefined,\n columns: repeatedListFlag(rawArgs, \"columns\", args.columns),\n dateFormat: dateFormatFlag(args[\"date-format\"]),\n });\n } catch (err) {\n failWriteValidation(err instanceof Error ? err.message : String(err));\n }\n}\n\n/** What the agent learns about the file: counts only. */\nfunction listHints(list: HashedCustomerList): string[] {\n const hints = [`${list.rows.length.toLocaleString(\"en-US\")} people read from the file, hashed before upload`];\n const unreadable = Object.entries(list.unreadable).map(([key, count]) => `${count} ${key}`);\n if (unreadable.length > 0) {\n hints.push(`values that could not be read and were left out: ${unreadable.join(\", \")}`);\n }\n if (list.skippedRows > 0) {\n hints.push(\n `${list.skippedRows} rows had nothing Meta can match on (no readable email, phone or id${list.schema.includes(\"LOOKALIKE_VALUE\") ? \", or no readable value\" : \"\"}) and were left out`,\n );\n }\n if (list.ignoredColumns.length > 0) {\n hints.push(`columns not sent (Meta does not match on them): ${list.ignoredColumns.join(\", \")}`);\n }\n if (list.rows.length < 100) {\n hints.push(\"Meta needs about 100 matched people before a list can be used for ads or as a lookalike seed\");\n }\n return hints;\n}\n\nasync function stageMembers(\n action: CustomerListAction,\n args: Record<string, unknown>,\n rawArgs: readonly string[] | undefined,\n): Promise<void> {\n const accountId = await bareAccountId(args);\n const audienceId = requireTarget(args, \"audience\");\n const list = readList(args, rawArgs);\n if (list.rows.length === 0) {\n failWriteValidation(\"no one in this file can be matched — check the columns (email, phone, …) and their values\");\n }\n const batches = customerListBatches(list);\n if (batches.length > CUSTOMER_LIST_MAX_BATCHES) {\n failWriteValidation(\n `this file holds ${list.rows.length.toLocaleString(\"en-US\")} people; one change carries at most ${(CUSTOMER_LIST_BATCH_ROWS * CUSTOMER_LIST_MAX_BATCHES).toLocaleString(\"en-US\")} — split the file and stage one add per part`,\n );\n }\n const refusal = customerListUploadRefusal(audienceId, action, list);\n if (refusal) {\n failWriteValidation(refusal);\n }\n const stored: CustomerListBatchResponse[] = [];\n try {\n const chatId = requireChatId();\n for (const batch of batches) {\n const response = await apiPost<{ ok: true; data: CustomerListBatchResponse }>(\n \"/api/ads/meta/draft/customer-list-batch\",\n { chatId, accountId, batch },\n { timeoutMs: 120_000 },\n );\n stored.push(response.data);\n }\n } catch (err) {\n handleMetaError(err);\n }\n await stageOp(\n {\n kind: \"customAudience.members\",\n accountId,\n payload: { audience_id: audienceId, action, schema: list.schema, batches: stored },\n },\n listHints(list),\n );\n}\n\nfunction membersCommand(action: CustomerListAction) {\n registerSchema({\n command: `ads.meta.audiences.members.${action}`,\n description: `Stage ${action === \"add\" ? \"adding people to\" : action === \"remove\" ? \"removing people from\" : \"replacing everyone in\"} a Meta customer list from a CSV in the workspace. ${ACTION_NOTES[action]} Every value is normalized and SHA-256 hashed on this machine before upload, as Meta asks, with a masked copy of each person (l***@empresa.com) for the review; only counts are printed. Applied at publish; Meta takes up to 24h to match.`,\n args: schemaArgs(membersArgs),\n });\n return defineCommand({\n meta: {\n name: action,\n description: `${ACTION_NOTES[action]} ${STAGED_NOTE}\nExample: baker ads meta audiences members ${action} 120249492603650208 --file customers.csv --country ES`,\n },\n args: membersArgs,\n run: async ({ args, rawArgs }) => {\n await stageMembers(action, args as Record<string, unknown>, rawArgs);\n },\n });\n}\n\nexport const audiencesMembersCommand = defineCommand({\n meta: {\n name: \"members\",\n description: `Change who is in a customer-list audience, from a CSV in the workspace. Hashed here before upload. ${STAGED_NOTE}\n baker ads meta audiences members add <audienceId|meta_temp_…> --file customers.csv [--country ES]\n baker ads meta audiences members remove <audienceId> --file unsubscribed.csv\n baker ads meta audiences members replace <audienceId> --file customers.csv\n value-based list: add --value-column revenue`,\n },\n subCommands: {\n add: membersCommand(\"add\"),\n remove: membersCommand(\"remove\"),\n replace: membersCommand(\"replace\"),\n },\n});\n\n// --- Delete ---\n\nregisterSchema({\n command: \"ads.meta.audiences.delete\",\n description:\n \"Stage deleting a Meta custom audience — permanent, applied at publish. Every ad that targets it stops and cannot be restarted; Meta refuses while a lookalike is built from it (delete the lookalike first).\",\n args: {\n id: { type: \"positional\", description: \"Audience id\", required: true },\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\", required: false },\n },\n});\n\nexport const audiencesDeleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: `Stage deleting an audience — permanent: ads that target it stop for good. Only when the user asked to delete it. ${STAGED_NOTE}`,\n },\n args: {\n id: { type: \"positional\", description: \"Audience id\", required: true },\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\" },\n },\n run: async ({ args }) => {\n await stageOp({\n kind: \"customAudience.update\",\n accountId: await bareAccountId(args as Record<string, unknown>),\n target: requireTarget(args as Record<string, unknown>, \"audience\"),\n payload: { status: \"DELETED\" },\n });\n },\n});\n\n// --- Saved audiences ---\n\nregisterSchema({\n command: \"ads.meta.audiences.saved\",\n description:\n \"List the ad account's saved audiences (targeting saved in Ads Manager), or one with --saved-audience-id. Read-only — Meta's API cannot create or change one. Use one on a new ad set with `adsets create --saved-audience <id>`.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\", required: false },\n \"saved-audience-id\": {\n type: \"string\",\n description: \"One saved audience, with its full targeting\",\n required: false,\n },\n full: { type: \"boolean\", description: \"Include each audience's whole targeting spec\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nexport const savedAudiencesCommand = defineCommand({\n meta: {\n name: \"saved\",\n description:\n \"Saved audiences on the account (read-only). Example: baker ads meta audiences saved --account-id act_123; use one with `adsets create --saved-audience <id>`\",\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\" },\n \"saved-audience-id\": { type: \"string\", description: \"One saved audience, with its full targeting\" },\n full: { type: \"boolean\", description: \"Include each audience's whole targeting spec\" },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = await resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"saved-audience-id\"]) params[\"saved-audience-id\"] = String(args[\"saved-audience-id\"]);\n const rows = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/saved-audiences\", params);\n const shown =\n args.full || args[\"saved-audience-id\"] ? rows : rows.map(({ targeting: _targeting, ...row }) => row);\n const hints =\n rows.length === 0\n ? [\n \"This account has no saved audiences — Meta's API cannot create one; build the targeting on the ad set instead.\",\n ]\n : [\n \"Use one on a new ad set: `baker ads meta adsets create … --saved-audience <id>` (its targeting is copied).\",\n ];\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(shown, fmt, undefined, hints);\n return;\n }\n writeJsonEnvelope({ ok: true, data: shown, hints });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\n/**\n * A saved audience's targeting with the command's own targeting laid over it:\n * the brand-safety flags (`--block-list`, …) join it, while a targeting file\n * would replace it whole, so the two are refused together.\n */\nexport function targetingFromSavedAudience(\n saved: Record<string, unknown>,\n flagged: Record<string, unknown> | undefined,\n): { targeting: Record<string, unknown> } | { refusal: string } {\n if (flagged === undefined) return { targeting: saved };\n if (!Object.keys(flagged).every((key) => key in brandSafetyTargetingFields)) {\n return { refusal: \"--saved-audience brings the targeting — pass it or --targeting-file, not both\" };\n }\n return { targeting: { ...saved, ...flagged } };\n}\n\n/** A saved audience's targeting, to start an ad set from. */\nexport async function savedAudienceTargeting(\n accountId: string,\n savedAudienceId: string,\n): Promise<Record<string, unknown>> {\n try {\n const rows = await apiGet<Array<{ targeting?: Record<string, unknown> }>>(\"/api/ads/meta/saved-audiences\", {\n \"account-id\": accountId,\n \"saved-audience-id\": savedAudienceId,\n });\n const targeting = rows[0]?.targeting;\n if (!targeting) {\n failWriteValidation(`saved audience ${savedAudienceId} has no targeting to copy`);\n }\n return targeting;\n } catch (err) {\n handleMetaError(err);\n }\n}\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  csvOrJson,
3
3
  handleMetaError,
4
4
  resolveAccountIdArg
5
- } from "./chunk-HPAGYPAF.js";
5
+ } from "./chunk-BN4TDL5L.js";
6
6
  import "./chunk-QALAJNBG.js";
7
7
  import {
8
8
  writeAdsJson,
@@ -34,7 +34,7 @@ var listCommand = defineCommand({
34
34
  },
35
35
  args: listArgs,
36
36
  run: async ({ args }) => {
37
- const accountId = resolveAccountIdArg(args);
37
+ const accountId = await resolveAccountIdArg(args);
38
38
  try {
39
39
  const params = { "account-id": accountId };
40
40
  if (args.limit) params.limit = args.limit;
@@ -67,11 +67,11 @@ Examples:
67
67
  },
68
68
  subCommands: {
69
69
  list: listCommand,
70
- create: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.audiencesCreateCommand),
71
- update: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.audiencesUpdateCommand),
72
- delete: () => import("./audience-writes-QDDADCYE.js").then((m) => m.audiencesDeleteCommand),
73
- members: () => import("./audience-writes-QDDADCYE.js").then((m) => m.audiencesMembersCommand),
74
- saved: () => import("./audience-writes-QDDADCYE.js").then((m) => m.savedAudiencesCommand)
70
+ create: () => import("./write-commands-CY734U34.js").then((m) => m.audiencesCreateCommand),
71
+ update: () => import("./write-commands-CY734U34.js").then((m) => m.audiencesUpdateCommand),
72
+ delete: () => import("./audience-writes-G64754LR.js").then((m) => m.audiencesDeleteCommand),
73
+ members: () => import("./audience-writes-G64754LR.js").then((m) => m.audiencesMembersCommand),
74
+ saved: () => import("./audience-writes-G64754LR.js").then((m) => m.savedAudiencesCommand)
75
75
  },
76
76
  // `args` stays even though the parent has no `run`: citty scans rawArgs for the
77
77
  // subcommand name using THIS command's arg defs, so without them `--account-id act_1`
@@ -83,4 +83,4 @@ Examples:
83
83
  export {
84
84
  audiencesCommand
85
85
  };
86
- //# sourceMappingURL=audiences-TQ5ZEWIR.js.map
86
+ //# sourceMappingURL=audiences-JAVNJ5NC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/meta/audiences.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleMetaError, resolveAccountIdArg } from \"./shared.ts\";\n\nconst listArgs = {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID\" },\n limit: { type: \"string\", description: \"Max rows\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"Output format\", default: \"json\" },\n} as const;\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List custom audiences. Runs by default when no subcommand is given. Example: baker ads meta audiences --account-id act_123\",\n },\n args: listArgs,\n run: async ({ args }) => {\n const accountId = await resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args.limit) params.limit = args.limit as string;\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/audiences\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nexport const audiencesCommand = defineCommand({\n meta: {\n name: \"audiences\",\n description: `List custom audiences, or stage writes (create/update/delete, members add|remove|replace). Write subcommands stage ops on this chat's draft.\nIncludes lookalikes, website-pixel audiences, customer-file audiences. Meta hides exact size when count < 1000.\n\nExamples:\n baker ads meta audiences --account-id act_123\n baker ads meta audiences create --name \"Site 30d\" --subtype WEBSITE --file rule.json\n baker ads meta audiences create --name \"Past buyers\" --subtype CUSTOM --file buyers.json # {\"members\":[{\"email\":\"…\"}]}\n baker ads meta audiences create --name \"Customers\" --subtype CUSTOM --customer-file-source USER_PROVIDED_ONLY\n baker ads meta audiences members add meta_temp_ab12 --file customers.csv --country ES\n baker ads meta audiences saved --account-id act_123 — saved audiences (read-only)`,\n },\n subCommands: {\n list: listCommand,\n create: () => import(\"./write-commands.ts\").then((m) => m.audiencesCreateCommand),\n update: () => import(\"./write-commands.ts\").then((m) => m.audiencesUpdateCommand),\n delete: () => import(\"./audience-writes.ts\").then((m) => m.audiencesDeleteCommand),\n members: () => import(\"./audience-writes.ts\").then((m) => m.audiencesMembersCommand),\n saved: () => import(\"./audience-writes.ts\").then((m) => m.savedAudiencesCommand),\n },\n // `args` stays even though the parent has no `run`: citty scans rawArgs for the\n // subcommand name using THIS command's arg defs, so without them `--account-id act_1`\n // would read `act_1` as a subcommand. `default` (not `run`) dispatches the bare\n // invocation — citty falls through to `run` after a subcommand, double-executing it.\n args: listArgs,\n default: \"list\",\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAM9B,IAAM,WAAW;AAAA,EACf,cAAc,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,EAClE,OAAO,EAAE,MAAM,UAAU,aAAa,WAAW;AAAA,EACjD,YAAY;AAAA,EACZ,QAAQ,EAAE,MAAM,UAAU,aAAa,iBAAiB,SAAS,OAAO;AAC1E;AAEA,IAAM,cAAc,cAAc;AAAA,EAChC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,EACN,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,oBAAoB,IAAI;AAChD,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,MAAO,QAAO,QAAQ,KAAK;AACpC,UAAI,KAAK,UAAU,EAAG,QAAO,YAAY,IAAI;AAC7C,YAAM,OAAO,MAAM,OAAuC,2BAA2B,MAAM;AAC3F,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAM,GAAG;AACxB;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;AAEM,IAAM,mBAAmB,cAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUf;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,QAAQ,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,sBAAsB;AAAA,IAChF,QAAQ,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,sBAAsB;AAAA,IAChF,QAAQ,MAAM,OAAO,+BAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,sBAAsB;AAAA,IACjF,SAAS,MAAM,OAAO,+BAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,uBAAuB;AAAA,IACnF,OAAO,MAAM,OAAO,+BAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,qBAAqB;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM;AAAA,EACN,SAAS;AACX,CAAC;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  csvOrJson,
3
3
  handleMetaError
4
- } from "./chunk-HPAGYPAF.js";
4
+ } from "./chunk-BN4TDL5L.js";
5
5
  import "./chunk-QALAJNBG.js";
6
6
  import {
7
7
  writeAdsJson,
@@ -51,4 +51,4 @@ Examples:
51
51
  export {
52
52
  businessesCommand
53
53
  };
54
- //# sourceMappingURL=businesses-CW4RB36R.js.map
54
+ //# sourceMappingURL=businesses-DXRDQIFP.js.map
@@ -12,7 +12,7 @@ import {
12
12
  resolveAccountIdArg,
13
13
  resolveEffectiveStatus,
14
14
  statusFilterHints
15
- } from "./chunk-HPAGYPAF.js";
15
+ } from "./chunk-BN4TDL5L.js";
16
16
  import "./chunk-QALAJNBG.js";
17
17
  import "./chunk-HPDGVK6R.js";
18
18
  import {
@@ -60,7 +60,7 @@ var listCommand = defineCommand({
60
60
  },
61
61
  args: listArgs,
62
62
  run: async ({ args }) => {
63
- const accountId = resolveAccountIdArg(args);
63
+ const accountId = await resolveAccountIdArg(args);
64
64
  const effectiveStatus = resolveEffectiveStatus(args);
65
65
  try {
66
66
  const params = { "account-id": accountId };
@@ -107,14 +107,14 @@ Examples:
107
107
  },
108
108
  subCommands: {
109
109
  list: listCommand,
110
- create: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.campaignsCreateCommand),
111
- update: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.campaignsUpdateCommand),
112
- pause: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.campaignsPauseCommand),
113
- resume: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.campaignsResumeCommand),
114
- archive: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.campaignsArchiveCommand),
115
- delete: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.campaignsDeleteCommand),
116
- duplicate: () => import("./write-commands-R5SN6CVQ.js").then((m) => m.campaignsDuplicateCommand),
117
- copy: () => import("./copy-writes-GZ744FHU.js").then((m) => m.campaignsCopyCommand)
110
+ create: () => import("./write-commands-CY734U34.js").then((m) => m.campaignsCreateCommand),
111
+ update: () => import("./write-commands-CY734U34.js").then((m) => m.campaignsUpdateCommand),
112
+ pause: () => import("./write-commands-CY734U34.js").then((m) => m.campaignsPauseCommand),
113
+ resume: () => import("./write-commands-CY734U34.js").then((m) => m.campaignsResumeCommand),
114
+ archive: () => import("./write-commands-CY734U34.js").then((m) => m.campaignsArchiveCommand),
115
+ delete: () => import("./write-commands-CY734U34.js").then((m) => m.campaignsDeleteCommand),
116
+ duplicate: () => import("./write-commands-CY734U34.js").then((m) => m.campaignsDuplicateCommand),
117
+ copy: () => import("./copy-writes-EUFEVWDW.js").then((m) => m.campaignsCopyCommand)
118
118
  },
119
119
  // `args` stays even though the parent has no `run`: citty scans rawArgs for the
120
120
  // subcommand name using THIS command's arg defs, so without them `--account-id act_1`
@@ -127,4 +127,4 @@ export {
127
127
  advantagePlusHints,
128
128
  campaignsCommand
129
129
  };
130
- //# sourceMappingURL=campaigns-IQYYYD2S.js.map
130
+ //# sourceMappingURL=campaigns-GQWFSKGC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/meta/campaigns.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport {\n budgetUnitHints,\n META_LIST_SHAPE_ARGS,\n registerMetaListSchema,\n shapeMetaListRows,\n writeMetaListRows,\n} from \"./list-rows.ts\";\nimport {\n csvOrJson,\n handleMetaError,\n NAME_CONTAINS_ARG,\n resolveAccountIdArg,\n resolveEffectiveStatus,\n statusFilterHints,\n} from \"./shared.ts\";\n\n/**\n * Which listed campaigns Meta counts as Advantage+, read off the derived\n * `advantage_state_info` — a hint rather than a column, so the compact row of a\n * 100-campaign account stays small. Advantage+ is not a switch: it follows from\n * a campaign budget, Advantage+ audience and automatic placements.\n */\nexport function advantagePlusHints(rows: ReadonlyArray<Record<string, unknown>>): string[] {\n const named = rows.flatMap((row) => {\n const info = row.advantage_state_info as { advantage_state?: unknown } | undefined;\n const state = info?.advantage_state;\n return typeof state === \"string\" && state.startsWith(\"ADVANTAGE_PLUS_\")\n ? [`${String(row.id)} (${state.slice(\"ADVANTAGE_PLUS_\".length).toLowerCase()})`]\n : [];\n });\n return named.length > 0\n ? [\n `Advantage+ campaigns: ${named.join(\", \")}. Per-lever states (budget, audience, placements): --fields id,name,advantage_state_info.`,\n ]\n : [];\n}\n\nconst listArgs = {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID\" },\n \"effective-status\": { type: \"string\", description: \"Comma-separated effective_status filter (overrides default)\" },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the default ACTIVE filter and return everything\" },\n \"name-contains\": NAME_CONTAINS_ARG,\n limit: { type: \"string\", description: \"Max rows (default 1000)\" },\n \"no-cache\": NO_CACHE_ARG,\n ...META_LIST_SHAPE_ARGS,\n} as const;\n\nregisterMetaListSchema(\n \"campaigns\",\n \"List campaigns in a Meta ad account, as a table by default: id, name, effective_status, daily_budget, lifetime_budget, created_date. ACTIVE only unless --all-statuses. Start here: baker ads meta campaigns --account-id act_123 --all-statuses. --fields takes dotted paths for anything else (e.g. id,name,objective,bid_strategy,special_ad_categories,advantage_state_info); --full returns every field Meta sent; --output json returns the rows in the envelope. A hint names the campaigns Meta counts as Advantage+.\",\n listArgs,\n);\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List campaigns for a Meta ad account. Runs by default when no subcommand is given. Example: baker ads meta campaigns --account-id act_123\",\n },\n args: listArgs,\n run: async ({ args }) => {\n const accountId = await resolveAccountIdArg(args);\n const effectiveStatus = resolveEffectiveStatus(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (effectiveStatus) params[\"effective-status\"] = effectiveStatus;\n if (args[\"name-contains\"]) params[\"name-contains\"] = args[\"name-contains\"] as string;\n if (args.limit) params.limit = args.limit as string;\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/campaigns\", params);\n const shaped = shapeMetaListRows(\"campaigns\", data, args);\n writeMetaListRows(\"campaigns\", shaped, csvOrJson(args), [\n ...statusFilterHints(data, effectiveStatus, \"campaigns\"),\n ...advantagePlusHints(data),\n ...budgetUnitHints(data),\n ]);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nexport const campaignsCommand = defineCommand({\n meta: {\n name: \"campaigns\",\n description: `List campaigns for a Meta ad account, or stage writes (create/update/pause/resume/archive/delete/duplicate/copy).\nDefaults to ACTIVE only — pass --all-statuses to widen. Write subcommands stage ops on this chat's draft and\napply only when the chat is published.\n\nIn Meta's API \"campaign\" is the top-of-tree object (what marketers usually call a campaign group).\nThe dashboard shows effective_status: ACTIVE, PAUSED, DELETED, ARCHIVED, IN_PROCESS, WITH_ISSUES, etc.\n\nListings print a table by default: id, name, effective_status, daily/lifetime budget, created_date.\n--fields takes dotted paths for anything else (objective, bid_strategy, special_ad_categories, created_time,\nadvantage_state_info). A hint names the campaigns Meta counts as Advantage+ — a state Meta derives from a\ncampaign budget, Advantage+ audience and automatic placements on every ad set, not a setting;\n--full returns every field; --output json returns the same rows in the { ok, data } envelope.\n\nExamples:\n baker ads meta campaigns --account-id act_123 # ACTIVE only\n baker ads meta campaigns --account-id act_123 --all-statuses # everything\n baker ads meta campaigns --account-id act_123 --all-statuses --name-contains Q3 # find one by name\n baker ads meta campaigns --account-id act_123 --fields id,name,objective,bid_strategy,special_ad_categories\n baker ads meta campaigns --account-id act_123 --output json # rows as JSON\n baker ads meta campaigns create --account-id act_123 --name \"Q3\" --objective OUTCOME_LEADS --daily-budget 50\n baker ads meta campaigns pause 6123 --account-id act_123`,\n },\n subCommands: {\n list: listCommand,\n create: () => import(\"./write-commands.ts\").then((m) => m.campaignsCreateCommand),\n update: () => import(\"./write-commands.ts\").then((m) => m.campaignsUpdateCommand),\n pause: () => import(\"./write-commands.ts\").then((m) => m.campaignsPauseCommand),\n resume: () => import(\"./write-commands.ts\").then((m) => m.campaignsResumeCommand),\n archive: () => import(\"./write-commands.ts\").then((m) => m.campaignsArchiveCommand),\n delete: () => import(\"./write-commands.ts\").then((m) => m.campaignsDeleteCommand),\n duplicate: () => import(\"./write-commands.ts\").then((m) => m.campaignsDuplicateCommand),\n copy: () => import(\"./copy-writes.ts\").then((m) => m.campaignsCopyCommand),\n },\n // `args` stays even though the parent has no `run`: citty scans rawArgs for the\n // subcommand name using THIS command's arg defs, so without them `--account-id act_1`\n // would read `act_1` as a subcommand. `default` (not `run`) dispatches the bare\n // invocation — citty falls through to `run` after a subcommand, double-executing it.\n args: listArgs,\n default: \"list\",\n});\n"],"mappings":"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","names":[]}
@@ -7,7 +7,7 @@ import {
7
7
  requireTarget,
8
8
  stageOp,
9
9
  upper
10
- } from "./chunk-OEJNZSJG.js";
10
+ } from "./chunk-4XXA4WCS.js";
11
11
  import {
12
12
  retailerIdFilter
13
13
  } from "./chunk-GC5P4KWY.js";
@@ -15,7 +15,7 @@ import "./chunk-GDFJOCDO.js";
15
15
  import {
16
16
  csvOrJson,
17
17
  handleMetaError
18
- } from "./chunk-HPAGYPAF.js";
18
+ } from "./chunk-BN4TDL5L.js";
19
19
  import {
20
20
  repeatedValues
21
21
  } from "./chunk-ERSX3MKH.js";
@@ -182,7 +182,7 @@ Example: baker ads meta catalogs create --account-id act_123 --name "Spring shop
182
182
  await stageOp(
183
183
  {
184
184
  kind: "productCatalog.create",
185
- accountId: bareAccountId(args),
185
+ accountId: await bareAccountId(args),
186
186
  payload: { name: args.name, event_sources: pixels.length > 0 ? pixels : void 0 }
187
187
  },
188
188
  [
@@ -220,7 +220,7 @@ Example: baker ads meta catalogs update 1798573158016525 --account-id act_123 --
220
220
  const unlink = repeatedValues(rawArgs, "unlink-pixel", args["unlink-pixel"]);
221
221
  await stageOp({
222
222
  kind: "productCatalog.update",
223
- accountId: bareAccountId(args),
223
+ accountId: await bareAccountId(args),
224
224
  target: requireTarget(args, "catalog"),
225
225
  payload: {
226
226
  name: args.name,
@@ -245,7 +245,7 @@ Example: baker ads meta catalogs delete 1798573158016525 --account-id act_123`
245
245
  run: async ({ args }) => {
246
246
  await stageOp({
247
247
  kind: "productCatalog.update",
248
- accountId: bareAccountId(args),
248
+ accountId: await bareAccountId(args),
249
249
  target: requireTarget(args, "catalog"),
250
250
  payload: { status: "DELETED" }
251
251
  });
@@ -355,7 +355,7 @@ Example: baker ads meta catalogs products create --account-id act_123 --catalog-
355
355
  retailer_id: args["retailer-id"],
356
356
  ...productFieldsFromArgs(args, rawArgs)
357
357
  });
358
- await stageOp({ kind: "product.create", accountId: bareAccountId(args), payload }, [
358
+ await stageOp({ kind: "product.create", accountId: await bareAccountId(args), payload }, [
359
359
  "Group products for an ad with `catalogs sets create --catalog-id <id> --retailer-id <sku> \u2026`."
360
360
  ]);
361
361
  }
@@ -383,7 +383,7 @@ Example: baker ads meta catalogs products update 39108967418750368 --account-id
383
383
  run: async ({ args, rawArgs }) => {
384
384
  await stageOp({
385
385
  kind: "product.update",
386
- accountId: bareAccountId(args),
386
+ accountId: await bareAccountId(args),
387
387
  target: requireTarget(args, "product"),
388
388
  payload: productFieldsFromArgs(args, rawArgs)
389
389
  });
@@ -404,7 +404,7 @@ Example: baker ads meta catalogs products delete 39108967418750368 --account-id
404
404
  run: async ({ args }) => {
405
405
  await stageOp({
406
406
  kind: "product.update",
407
- accountId: bareAccountId(args),
407
+ accountId: await bareAccountId(args),
408
408
  target: requireTarget(args, "product"),
409
409
  payload: { status: "DELETED" }
410
410
  });
@@ -505,7 +505,7 @@ Rule: --filter '{"brand":{"eq":"Acme"}}'. Without --retailer-id or --filter the
505
505
  await stageOp(
506
506
  {
507
507
  kind: "productSet.create",
508
- accountId: bareAccountId(args),
508
+ accountId: await bareAccountId(args),
509
509
  payload: {
510
510
  catalog_id: args["catalog-id"],
511
511
  name: args.name,
@@ -544,7 +544,7 @@ Example: baker ads meta catalogs sets update 1748674113031942 --account-id act_1
544
544
  run: async ({ args, rawArgs }) => {
545
545
  await stageOp({
546
546
  kind: "productSet.update",
547
- accountId: bareAccountId(args),
547
+ accountId: await bareAccountId(args),
548
548
  target: requireTarget(args, "product set"),
549
549
  payload: { name: args.name, filter: productSetFilterFromArgs(args, rawArgs) }
550
550
  });
@@ -565,7 +565,7 @@ Example: baker ads meta catalogs sets delete 1748674113031942 --account-id act_1
565
565
  run: async ({ args }) => {
566
566
  await stageOp({
567
567
  kind: "productSet.update",
568
- accountId: bareAccountId(args),
568
+ accountId: await bareAccountId(args),
569
569
  target: requireTarget(args, "product set"),
570
570
  payload: { status: "DELETED" }
571
571
  });
@@ -648,7 +648,7 @@ Example: baker ads meta catalogs feeds create --account-id act_123 --catalog-id
648
648
  run: async ({ args }) => {
649
649
  await stageOp({
650
650
  kind: "productFeed.create",
651
- accountId: bareAccountId(args),
651
+ accountId: await bareAccountId(args),
652
652
  payload: { catalog_id: args["catalog-id"], name: args.name, schedule: feedScheduleFromArgs(args) }
653
653
  });
654
654
  }
@@ -681,7 +681,7 @@ Example: baker ads meta catalogs feeds update 1157910959893469 --account-id act_
681
681
  run: async ({ args }) => {
682
682
  await stageOp({
683
683
  kind: "productFeed.update",
684
- accountId: bareAccountId(args),
684
+ accountId: await bareAccountId(args),
685
685
  target: requireTarget(args, "feed"),
686
686
  payload: { name: args.name, schedule: feedScheduleFromArgs(args) }
687
687
  });
@@ -702,7 +702,7 @@ Example: baker ads meta catalogs feeds delete 1157910959893469 --account-id act_
702
702
  run: async ({ args }) => {
703
703
  await stageOp({
704
704
  kind: "productFeed.update",
705
- accountId: bareAccountId(args),
705
+ accountId: await bareAccountId(args),
706
706
  target: requireTarget(args, "feed"),
707
707
  payload: { status: "DELETED" }
708
708
  });
@@ -778,4 +778,4 @@ export {
778
778
  productFieldsFromArgs,
779
779
  productSetFilterFromArgs
780
780
  };
781
- //# sourceMappingURL=catalogs-PLBY32BE.js.map
781
+ //# sourceMappingURL=catalogs-TBRONC2D.js.map