@koda-sl/baker-cli 0.557.0 → 0.558.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 (65) hide show
  1. package/dist/{account-reads-T6GTSAXE.js → account-reads-GQWTMLTY.js} +2 -2
  2. package/dist/{accounts-HJAQTVDA.js → accounts-ZFQYZT3J.js} +7 -2
  3. package/dist/accounts-ZFQYZT3J.js.map +1 -0
  4. package/dist/{ads-WWZK7UYG.js → ads-VYMFRGAC.js} +2 -2
  5. package/dist/{advertisers-FME2ABRB.js → advertisers-A3Q53R2S.js} +2 -2
  6. package/dist/{autocomplete-CBOYGT73.js → autocomplete-OOLUPUIJ.js} +2 -2
  7. package/dist/{changes-OIVPZJHE.js → changes-MVCX3GLE.js} +16 -11
  8. package/dist/changes-MVCX3GLE.js.map +1 -0
  9. package/dist/{chunk-JPK34QPS.js → chunk-2L24FULD.js} +3 -3
  10. package/dist/chunk-2L24FULD.js.map +1 -0
  11. package/dist/{chunk-PQ7RLE43.js → chunk-HNELOMY2.js} +26 -433
  12. package/dist/chunk-HNELOMY2.js.map +1 -0
  13. package/dist/chunk-NPGPRZW2.js +1313 -0
  14. package/dist/chunk-NPGPRZW2.js.map +1 -0
  15. package/dist/{chunk-SNWFM2DB.js → chunk-Q2JDS6WL.js} +11 -1
  16. package/dist/chunk-Q2JDS6WL.js.map +1 -0
  17. package/dist/cli.js +2 -2
  18. package/dist/{conversion-upload-command-J2FIO74Y.js → conversion-upload-command-U36QYHUT.js} +2 -2
  19. package/dist/{currency-B5T7TYKD.js → currency-XFY2EX72.js} +3 -3
  20. package/dist/{discover-SS3PO5Y6.js → discover-J5344ATV.js} +2 -2
  21. package/dist/{draft-EB5ZFDVN.js → draft-OIGJUFOH.js} +2 -2
  22. package/dist/{forecast-XDRKCR65.js → forecast-HFCRTFIF.js} +2 -2
  23. package/dist/{google-UJ4YJGTJ.js → google-TOO3FDZ6.js} +22 -22
  24. package/dist/{intent-OMSJPOJZ.js → intent-PU3XUDLL.js} +2 -2
  25. package/dist/{keyword-gap-3P72T4NV.js → keyword-gap-B6T7ZFTZ.js} +2 -2
  26. package/dist/{keyword-metrics-DDY2RDYK.js → keyword-metrics-CXGNLERO.js} +2 -2
  27. package/dist/{keywords-for-site-TFHOM23P.js → keywords-for-site-OYMDRMMX.js} +2 -2
  28. package/dist/{languages-WWKMRZCH.js → languages-ETKG5WM3.js} +2 -2
  29. package/dist/{locations-P3CUBKYZ.js → locations-VPZYTFVK.js} +2 -2
  30. package/dist/{metrics-PSXIV4QS.js → metrics-J3WD2CUD.js} +2 -2
  31. package/dist/{query-PC7V3OFF.js → query-ZYG5RCCW.js} +5 -5
  32. package/dist/{relevant-pages-3CCAQA5Y.js → relevant-pages-7U6I2WPM.js} +2 -2
  33. package/dist/{research-M6LXE3VX.js → research-3BWJCS7N.js} +8 -8
  34. package/dist/{themes-BGBDYQQK.js → themes-C4PPU427.js} +2 -2
  35. package/dist/{url-options-GJ7ZIUPD.js → url-options-C3ZOWN2L.js} +3 -3
  36. package/package.json +1 -1
  37. package/dist/accounts-HJAQTVDA.js.map +0 -1
  38. package/dist/changes-OIVPZJHE.js.map +0 -1
  39. package/dist/chunk-6HPTF5YS.js +0 -857
  40. package/dist/chunk-6HPTF5YS.js.map +0 -1
  41. package/dist/chunk-JPK34QPS.js.map +0 -1
  42. package/dist/chunk-PQ7RLE43.js.map +0 -1
  43. package/dist/chunk-SNWFM2DB.js.map +0 -1
  44. /package/dist/{account-reads-T6GTSAXE.js.map → account-reads-GQWTMLTY.js.map} +0 -0
  45. /package/dist/{ads-WWZK7UYG.js.map → ads-VYMFRGAC.js.map} +0 -0
  46. /package/dist/{advertisers-FME2ABRB.js.map → advertisers-A3Q53R2S.js.map} +0 -0
  47. /package/dist/{autocomplete-CBOYGT73.js.map → autocomplete-OOLUPUIJ.js.map} +0 -0
  48. /package/dist/{conversion-upload-command-J2FIO74Y.js.map → conversion-upload-command-U36QYHUT.js.map} +0 -0
  49. /package/dist/{currency-B5T7TYKD.js.map → currency-XFY2EX72.js.map} +0 -0
  50. /package/dist/{discover-SS3PO5Y6.js.map → discover-J5344ATV.js.map} +0 -0
  51. /package/dist/{draft-EB5ZFDVN.js.map → draft-OIGJUFOH.js.map} +0 -0
  52. /package/dist/{forecast-XDRKCR65.js.map → forecast-HFCRTFIF.js.map} +0 -0
  53. /package/dist/{google-UJ4YJGTJ.js.map → google-TOO3FDZ6.js.map} +0 -0
  54. /package/dist/{intent-OMSJPOJZ.js.map → intent-PU3XUDLL.js.map} +0 -0
  55. /package/dist/{keyword-gap-3P72T4NV.js.map → keyword-gap-B6T7ZFTZ.js.map} +0 -0
  56. /package/dist/{keyword-metrics-DDY2RDYK.js.map → keyword-metrics-CXGNLERO.js.map} +0 -0
  57. /package/dist/{keywords-for-site-TFHOM23P.js.map → keywords-for-site-OYMDRMMX.js.map} +0 -0
  58. /package/dist/{languages-WWKMRZCH.js.map → languages-ETKG5WM3.js.map} +0 -0
  59. /package/dist/{locations-P3CUBKYZ.js.map → locations-VPZYTFVK.js.map} +0 -0
  60. /package/dist/{metrics-PSXIV4QS.js.map → metrics-J3WD2CUD.js.map} +0 -0
  61. /package/dist/{query-PC7V3OFF.js.map → query-ZYG5RCCW.js.map} +0 -0
  62. /package/dist/{relevant-pages-3CCAQA5Y.js.map → relevant-pages-7U6I2WPM.js.map} +0 -0
  63. /package/dist/{research-M6LXE3VX.js.map → research-3BWJCS7N.js.map} +0 -0
  64. /package/dist/{themes-BGBDYQQK.js.map → themes-C4PPU427.js.map} +0 -0
  65. /package/dist/{url-options-GJ7ZIUPD.js.map → url-options-C3ZOWN2L.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  GOOGLE_ADS_LANGUAGES
3
3
  } from "./chunk-FVDC6AKZ.js";
4
- import "./chunk-SNWFM2DB.js";
4
+ import "./chunk-Q2JDS6WL.js";
5
5
  import {
6
6
  writeAdsJson
7
7
  } from "./chunk-QYH2UZAK.js";
@@ -37,4 +37,4 @@ var languagesCommand = defineCommand({
37
37
  export {
38
38
  languagesCommand
39
39
  };
40
- //# sourceMappingURL=languages-WWKMRZCH.js.map
40
+ //# sourceMappingURL=languages-ETKG5WM3.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  GOOGLE_ADS_LOCATIONS
3
3
  } from "./chunk-FVDC6AKZ.js";
4
- import "./chunk-SNWFM2DB.js";
4
+ import "./chunk-Q2JDS6WL.js";
5
5
  import {
6
6
  writeAdsJson
7
7
  } from "./chunk-QYH2UZAK.js";
@@ -37,4 +37,4 @@ var locationsCommand = defineCommand({
37
37
  export {
38
38
  locationsCommand
39
39
  };
40
- //# sourceMappingURL=locations-P3CUBKYZ.js.map
40
+ //# sourceMappingURL=locations-VPZYTFVK.js.map
@@ -7,7 +7,7 @@ import {
7
7
  buildAdsQueryContext,
8
8
  warnDefaults
9
9
  } from "./chunk-FVDC6AKZ.js";
10
- import "./chunk-SNWFM2DB.js";
10
+ import "./chunk-Q2JDS6WL.js";
11
11
  import {
12
12
  buildQueryCacheKey,
13
13
  cacheGet,
@@ -149,4 +149,4 @@ export {
149
149
  metricsCommand,
150
150
  stampMetricsResponse
151
151
  };
152
- //# sourceMappingURL=metrics-PSXIV4QS.js.map
152
+ //# sourceMappingURL=metrics-J3WD2CUD.js.map
@@ -22,11 +22,11 @@ import {
22
22
  unobservedSelectedFields,
23
23
  unwrittenColumnWarnings,
24
24
  warningLines
25
- } from "./chunk-PQ7RLE43.js";
25
+ } from "./chunk-HNELOMY2.js";
26
26
  import "./chunk-Y2FAUFWK.js";
27
- import "./chunk-JPK34QPS.js";
28
- import "./chunk-6HPTF5YS.js";
29
- import "./chunk-SNWFM2DB.js";
27
+ import "./chunk-2L24FULD.js";
28
+ import "./chunk-NPGPRZW2.js";
29
+ import "./chunk-Q2JDS6WL.js";
30
30
  import "./chunk-QYH2UZAK.js";
31
31
  import "./chunk-MSMTG6OC.js";
32
32
  import "./chunk-GFWWHCBF.js";
@@ -59,4 +59,4 @@ export {
59
59
  unwrittenColumnWarnings,
60
60
  warningLines
61
61
  };
62
- //# sourceMappingURL=query-PC7V3OFF.js.map
62
+ //# sourceMappingURL=query-ZYG5RCCW.js.map
@@ -9,7 +9,7 @@ import {
9
9
  buildResearchQueryContext,
10
10
  warnDefaults
11
11
  } from "./chunk-FVDC6AKZ.js";
12
- import "./chunk-SNWFM2DB.js";
12
+ import "./chunk-Q2JDS6WL.js";
13
13
  import "./chunk-MSMTG6OC.js";
14
14
  import {
15
15
  apiPost
@@ -96,4 +96,4 @@ Examples:
96
96
  export {
97
97
  relevantPagesCommand
98
98
  };
99
- //# sourceMappingURL=relevant-pages-3CCAQA5Y.js.map
99
+ //# sourceMappingURL=relevant-pages-7U6I2WPM.js.map
@@ -57,19 +57,19 @@ Full guide: __tooling__/docs/tools/baker/research.md`
57
57
  "google-ads": () => import("./google-ads-DYGNJEIT.js").then((m) => m.googleAdsCommand),
58
58
  reddit: () => import("./reddit-3KAMZIPT.js").then((m) => m.redditCommand),
59
59
  customers: () => import("./customers-DXOLSUXV.js").then((m) => m.customersCommand),
60
- advertisers: () => import("./advertisers-FME2ABRB.js").then((m) => m.advertisersCommand),
61
- autocomplete: () => import("./autocomplete-CBOYGT73.js").then((m) => m.autocompleteCommand),
60
+ advertisers: () => import("./advertisers-A3Q53R2S.js").then((m) => m.advertisersCommand),
61
+ autocomplete: () => import("./autocomplete-OOLUPUIJ.js").then((m) => m.autocompleteCommand),
62
62
  countries: () => import("./countries-6ST54UGJ.js").then((m) => m.countriesCommand),
63
- intent: () => import("./intent-OMSJPOJZ.js").then((m) => m.intentCommand),
64
- "keyword-metrics": () => import("./keyword-metrics-DDY2RDYK.js").then((m) => m.keywordMetricsCommand),
65
- "keywords-for-site": () => import("./keywords-for-site-TFHOM23P.js").then((m) => m.keywordsForSiteCommand),
66
- "keyword-gap": () => import("./keyword-gap-3P72T4NV.js").then((m) => m.keywordGapCommand),
63
+ intent: () => import("./intent-PU3XUDLL.js").then((m) => m.intentCommand),
64
+ "keyword-metrics": () => import("./keyword-metrics-CXGNLERO.js").then((m) => m.keywordMetricsCommand),
65
+ "keywords-for-site": () => import("./keywords-for-site-OYMDRMMX.js").then((m) => m.keywordsForSiteCommand),
66
+ "keyword-gap": () => import("./keyword-gap-B6T7ZFTZ.js").then((m) => m.keywordGapCommand),
67
67
  languages: () => import("./languages-Q5RMPGI4.js").then((m) => m.languagesCommand),
68
68
  lighthouse: () => import("./lighthouse-D3BJGHLO.js").then((m) => m.lighthouseCommand),
69
- "relevant-pages": () => import("./relevant-pages-3CCAQA5Y.js").then((m) => m.relevantPagesCommand)
69
+ "relevant-pages": () => import("./relevant-pages-7U6I2WPM.js").then((m) => m.relevantPagesCommand)
70
70
  }
71
71
  });
72
72
  export {
73
73
  researchCommand
74
74
  };
75
- //# sourceMappingURL=research-M6LXE3VX.js.map
75
+ //# sourceMappingURL=research-3BWJCS7N.js.map
@@ -12,7 +12,7 @@ import "./chunk-4NZ47VXO.js";
12
12
  import "./chunk-D5FY4FAK.js";
13
13
  import "./chunk-4H6XLX7E.js";
14
14
  import "./chunk-QALAJNBG.js";
15
- import "./chunk-SNWFM2DB.js";
15
+ import "./chunk-Q2JDS6WL.js";
16
16
  import {
17
17
  getManagerIdForCustomer,
18
18
  writeJsonEnvelope
@@ -92,4 +92,4 @@ Example:
92
92
  export {
93
93
  themesCommand
94
94
  };
95
- //# sourceMappingURL=themes-BGBDYQQK.js.map
95
+ //# sourceMappingURL=themes-C4PPU427.js.map
@@ -5,10 +5,10 @@ import {
5
5
  import "./chunk-NKQWDEB7.js";
6
6
  import {
7
7
  parseApiError
8
- } from "./chunk-6HPTF5YS.js";
8
+ } from "./chunk-NPGPRZW2.js";
9
9
  import {
10
10
  urlOptionsHints
11
- } from "./chunk-SNWFM2DB.js";
11
+ } from "./chunk-Q2JDS6WL.js";
12
12
  import {
13
13
  getManagerIdForCustomer,
14
14
  resolveCustomerId,
@@ -128,4 +128,4 @@ Examples:
128
128
  export {
129
129
  urlOptionsCommand
130
130
  };
131
- //# sourceMappingURL=url-options-GJ7ZIUPD.js.map
131
+ //# sourceMappingURL=url-options-C3ZOWN2L.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koda-sl/baker-cli",
3
- "version": "0.557.0",
3
+ "version": "0.558.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/google/accounts.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { AVAILABLE_ARG, writeAvailableAccounts } from \"../../../available-accounts.ts\";\nimport { ApiError, apiGet } from \"../../../client.ts\";\nimport { connectedResourceHints } from \"../../../connected-resources.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson, writeAdsOutput, writeJsonEnvelope } from \"../output.ts\";\nimport type { AdsErrorEnvelope } from \"../types.ts\";\n\nregisterSchema({\n command: \"ads.google.accounts\",\n description:\n \"List the Google Ads accounts this company connected — there can be several, and every one of them is yours to work in. Returns accounts with id, name, access_type (direct or managed), level in the hierarchy, and optional manager_id for managed accounts. Run this first to find account IDs for other commands.\",\n args: {\n \"no-cache\": { type: \"boolean\", description: \"Skip cache, hit API directly\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n available: AVAILABLE_ARG,\n },\n});\n\ninterface AccountInfo {\n id: string;\n name: string;\n access_type: \"direct\" | \"managed\";\n level: number;\n manager_id?: string;\n}\n\nimport { handleConnectionError, needsConnectionFix } from \"../../../error-handler.ts\";\n\nfunction accountHints(accounts: AccountInfo[]): string[] {\n return connectedResourceHints({\n plural: \"Google Ads accounts\",\n singular: \"Google Ads account\",\n flag: \"--customer-id\",\n resources: accounts.map((account) => ({ id: account.id, label: account.name })),\n });\n}\n\nfunction handleAccountsError(err: unknown): never {\n if (err instanceof ApiError) {\n if (needsConnectionFix(err.code, err.message)) {\n handleConnectionError(\"google_ads\", err.message);\n }\n const envelope: AdsErrorEnvelope = {\n ok: false,\n error: {\n code: err.code,\n message: err.message,\n fix: {\n action: \"reject\",\n explanation: err.message,\n },\n retryable: false,\n },\n };\n writeAdsJson(envelope);\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n}\n\nexport const accountsCommand = defineCommand({\n meta: {\n name: \"accounts\",\n description: `List accessible Google Ads accounts. Returns customer IDs needed for all other commands.\n\nExamples:\n baker ads google accounts\n baker ads google accounts --available # every account the login reaches, selected or not`,\n },\n args: {\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n available: AVAILABLE_ARG,\n },\n run: async ({ args }) => {\n if (args.available) return writeAvailableAccounts(\"google-ads\", handleAccountsError);\n const useCache = !args[\"no-cache\"];\n\n if (useCache) {\n const cached = cacheGet<AccountInfo[]>(\"accounts\", \"list\");\n if (cached) {\n writeJsonEnvelope({ ok: true, data: cached.data, cached: true, hints: accountHints(cached.data) });\n return;\n }\n }\n\n try {\n const params = !useCache ? { \"skip-cache\": \"true\" } : undefined;\n const data = await apiGet<AccountInfo[]>(\"/api/ads/google/accounts\", params);\n if (useCache) {\n cacheSet(\"accounts\", \"list\", data, 60 * 60 * 1000);\n }\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, format);\n return;\n }\n writeJsonEnvelope({ ok: true, data, hints: accountHints(data) });\n } catch (err) {\n handleAccountsError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAS9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,WAAW,aAAa,gCAAgC,UAAU,MAAM;AAAA,IAC5F,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,IAC/F,WAAW;AAAA,EACb;AACF,CAAC;AAYD,SAAS,aAAa,UAAmC;AACvD,SAAO,uBAAuB;AAAA,IAC5B,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,WAAW,SAAS,IAAI,CAAC,aAAa,EAAE,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,EAAE;AAAA,EAChF,CAAC;AACH;AAEA,SAAS,oBAAoB,KAAqB;AAChD,MAAI,eAAe,UAAU;AAC3B,QAAI,mBAAmB,IAAI,MAAM,IAAI,OAAO,GAAG;AAC7C,4BAAsB,cAAc,IAAI,OAAO;AAAA,IACjD;AACA,UAAM,WAA6B;AAAA,MACjC,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM,IAAI;AAAA,QACV,SAAS,IAAI;AAAA,QACb,KAAK;AAAA,UACH,QAAQ;AAAA,UACR,aAAa,IAAI;AAAA,QACnB;AAAA,QACA,WAAW;AAAA,MACb;AAAA,IACF;AACA,iBAAa,QAAQ;AACrB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,eAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,UAAQ,KAAK,CAAC;AAChB;AAEO,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,IAC/F,WAAW;AAAA,EACb;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI,KAAK,UAAW,QAAO,uBAAuB,cAAc,mBAAmB;AACnF,UAAM,WAAW,CAAC,KAAK,UAAU;AAEjC,QAAI,UAAU;AACZ,YAAM,SAAS,SAAwB,YAAY,MAAM;AACzD,UAAI,QAAQ;AACV,0BAAkB,EAAE,IAAI,MAAM,MAAM,OAAO,MAAM,QAAQ,MAAM,OAAO,aAAa,OAAO,IAAI,EAAE,CAAC;AACjG;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,CAAC,WAAW,EAAE,cAAc,OAAO,IAAI;AACtD,YAAM,OAAO,MAAM,OAAsB,4BAA4B,MAAM;AAC3E,UAAI,UAAU;AACZ,iBAAS,YAAY,QAAQ,MAAM,KAAK,KAAK,GAAI;AAAA,MACnD;AACA,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,MAAmD,MAAM;AACxE;AAAA,MACF;AACA,wBAAkB,EAAE,IAAI,MAAM,MAAM,OAAO,aAAa,IAAI,EAAE,CAAC;AAAA,IACjE,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/ads/google/changes.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { getManagerIdForCustomer } from \"../cache.ts\";\nimport { getFieldDescriptions } from \"../field-descriptions.ts\";\nimport { resolveCustomerId, writeAdsJson, writeAdsOutput, writeJsonEnvelope } from \"../output.ts\";\nimport {\n CHANGE_SCOPE_MAX_DAYS,\n cappedChangesHint,\n DEFAULT_CHANGE_DAYS,\n resolveChangesWindow,\n} from \"./changes-window.ts\";\nimport { parseApiError } from \"./error-parser.ts\";\n\nregisterSchema({\n command: \"ads.google.changes\",\n description:\n \"Read the account's change history. --scope detail (default) shows what changed and to what value, back 30 days; --scope summary shows which resources changed, back 90 days.\",\n args: {\n \"customer-id\": {\n type: \"string\",\n description: \"Google Ads customer ID (10 digits, no dashes). Falls back to BAKER_GOOGLE_ADS_CUSTOMER_ID env var.\",\n required: false,\n },\n days: {\n type: \"string\",\n description: `Lookback days (default: ${DEFAULT_CHANGE_DAYS}). Max ${CHANGE_SCOPE_MAX_DAYS.detail} with --scope detail, ${CHANGE_SCOPE_MAX_DAYS.summary} with --scope summary. Google keeps nothing older behind any API.`,\n required: false,\n default: DEFAULT_CHANGE_DAYS,\n },\n scope: {\n type: \"string\",\n description: `detail|summary (default: detail). detail = old/new values plus who made the change, ${CHANGE_SCOPE_MAX_DAYS.detail} days. summary = which resources were added, changed or removed, ${CHANGE_SCOPE_MAX_DAYS.summary} days, without values.`,\n required: false,\n default: \"detail\",\n },\n \"resource-type\": {\n type: \"string\",\n description:\n \"Filter by type: CAMPAIGN, CAMPAIGN_CRITERION, AD_GROUP, AD_GROUP_AD, AD_GROUP_CRITERION. CAMPAIGN_CRITERION covers campaign-level negatives, location and audience exclusions.\",\n required: false,\n },\n limit: {\n type: \"string\",\n description:\n \"Max change events (default: 50, max: 1000). A read that comes back exactly this full has older changes behind it, and a hint says so.\",\n required: false,\n default: 50,\n },\n output: { type: \"string\", description: \"Format: json|csv|jsonl|md\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache, hit API directly\", required: false },\n },\n});\n\nexport const changesCommand = defineCommand({\n meta: {\n name: \"changes\",\n description: `Read the change history of a Google Ads account.\n\nGoogle keeps account history in two layers, and neither reaches past 90 days:\n --scope detail (default) what changed, old → new value, who changed it — last ${CHANGE_SCOPE_MAX_DAYS.detail} days\n --scope summary which resources were added, changed or removed — last ${CHANGE_SCOPE_MAX_DAYS.summary} days\n\nFor anything older, infer it from performance instead — a monthly spend trend per\ncampaign shows what started or stopped, just not who did it.\n\nExamples:\n baker ads google changes --customer-id 1234567890\n baker ads google changes --customer-id 1234567890 --days 14 --resource-type CAMPAIGN\n baker ads google changes --customer-id 1234567890 --days 60 --scope summary`,\n },\n args: {\n \"customer-id\": { type: \"string\", description: \"Google Ads customer ID\", required: false },\n days: { type: \"string\", description: `Lookback days (default ${DEFAULT_CHANGE_DAYS})`, required: false },\n scope: { type: \"string\", description: \"detail (30 days) or summary (90 days)\", required: false },\n \"resource-type\": { type: \"string\", description: \"Filter by resource type\", required: false },\n limit: { type: \"string\", description: \"Max results (default 50)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache, hit API directly\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const customerId = await resolveCustomerId(args);\n\n const window = resolveChangesWindow({\n days: args.days ? Number(args.days) : undefined,\n scope: args.scope as string | undefined,\n });\n if (!window.ok) {\n writeJsonEnvelope({ ok: false, error: { ...window.error, retryable: false } });\n process.exit(1);\n return;\n }\n\n const limit = args.limit ? Number(args.limit) : 50;\n const body: Record<string, unknown> = { customerId, days: window.days, scope: window.scope, limit };\n const managerId = getManagerIdForCustomer(customerId);\n if (managerId) body.managerId = managerId;\n if (args[\"resource-type\"]) body.resourceType = args[\"resource-type\"];\n if (args[\"no-cache\"]) body.skipCache = true;\n\n try {\n const data = await apiPost<Array<Record<string, unknown>>>(\"/api/ads/google/changes\", body);\n const format = (args.output as string) || \"json\";\n const capped = cappedChangesHint(data, limit, window.days);\n\n if (format !== \"json\") {\n writeAdsOutput(data, format, undefined, capped ? [capped] : []);\n return;\n }\n\n const first = data[0];\n const fields = first ? Object.keys(first) : [];\n const fieldDescs = getFieldDescriptions(fields);\n writeJsonEnvelope({\n ok: true,\n data,\n fields: fieldDescs,\n hints: capped ? [capped, ...window.hints] : window.hints,\n });\n } catch (err) {\n if (err instanceof ApiError) {\n writeAdsJson(parseApiError(err.message, \"\", customerId, err.code));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":[]}