@koda-sl/baker-cli 0.486.0 → 0.487.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1437,7 +1437,7 @@ Notes:
1437
1437
 
1438
1438
  - All write commands take `--file <json>` payloads; explicit flags override file keys. `baker schema ads.linkedin.campaigns.create` for exact args.
1439
1439
  - Money flags (`--bid`, `--daily-budget`, `--total-budget`) require `--currency`.
1440
- - Creative media comes from the Baker library (`--image-id`/`--video-id` from `baker images`/`baker videos` — uploaded to LinkedIn at publish) or as LinkedIn URNs (`--image-urn`/`--video-urn`). Formats: `image|video|text|spotlight|follower|document|carousel|conversation|tla|jobs`; complex formats take `--file` with the full content object; conversation ads take `--file` with the message flow (`{message: {subject, body, senderName?, buttons[]}}` — buttons `NESTED` (with `nestedMessage`) or `LANDING_PAGE` (with `landingPageUrl`), ≤25 messages, bodies ≤500 chars, labels ≤25). Limits: headline ≤70, text-ad 25/75, intro soft-truncates at 600 chars. TLA sponsors an existing post via `--post-urn`.
1440
+ - Creative media comes from the Baker library (`--image-id` from `baker images` — uploaded to LinkedIn at publish, any format) or as LinkedIn URNs (`--image-urn`/`--video-urn`). Library videos can't be sent to LinkedIn yet: staging refuses `--video-id`. Formats: `image|video|text|spotlight|follower|document|carousel|conversation|tla|jobs`; complex formats take `--file` with the full content object; conversation ads take `--file` with the message flow (`{message: {subject, body, senderName?, buttons[]}}` — buttons `NESTED` (with `nestedMessage`) or `LANDING_PAGE` (with `landingPageUrl`), ≤25 messages, bodies ≤500 chars, labels ≤25). Limits: headline ≤70, text-ad 25/75, intro soft-truncates at 600 chars. TLA sponsors an existing post via `--post-urn`.
1441
1441
  - Lead forms are file-first (`lead-forms create --file form.json`). Required: name, headline (≤60), privacyPolicyUrl, questions[] (≤12; playbook: ≤4 for completion). Each question is a predefined profile field (`{ name, predefinedField: "EMAIL" }` — Contact/Work/Company/Education/Demographic library) or a custom question (`{ name, questionType: "SINGLE_LINE_TEXT" | "MULTIPLE_CHOICE", options?: [...] }`; ≤3 custom, MULTIPLE_CHOICE needs 2–30 options). Also supported: `locale {country,language}`, `formImageId`/`formImageUrn` (banner), `consents[]` (≤5 disclosure checkboxes `{text, required}`), `hiddenFields[]` (≤20 `{name, value}` tracking fields), `legalDisclaimer`, `thankYou {message, cta, landingUrl | appointmentUrl}` (Calendly/Chili Piper booking link). The staged preview emits non-blocking best-practice warnings when a form has no qualifying question, no confirmation message/action, or no consent checkbox.
1442
1442
 
1443
1443
  #### `audit` — playbook diagnostic
@@ -68,7 +68,7 @@ Examples:
68
68
  },
69
69
  subCommands: {
70
70
  detail: accountDetailCommand,
71
- "url-params": () => import("./write-commands-E7JOB4HX.js").then((m) => m.accountUrlParamsCommand)
71
+ "url-params": () => import("./write-commands-MPXJK2AD.js").then((m) => m.accountUrlParamsCommand)
72
72
  },
73
73
  args: accountDetailCommand.args,
74
74
  default: "detail"
@@ -76,4 +76,4 @@ Examples:
76
76
  export {
77
77
  accountCommand
78
78
  };
79
- //# sourceMappingURL=account-VH2AATWI.js.map
79
+ //# sourceMappingURL=account-EPVHKQEM.js.map
@@ -29,7 +29,7 @@ Full guides: __tooling__/docs/tools/baker/ads-<platform>.md (google|meta|linkedi
29
29
  subCommands: {
30
30
  google: () => import("./google-ZTTE34A4.js").then((m) => m.googleCommand),
31
31
  meta: () => import("./meta-AOIPEDV5.js").then((m) => m.metaCommand),
32
- linkedin: () => import("./linkedin-7F6YVXQL.js").then((m) => m.linkedinCommand),
32
+ linkedin: () => import("./linkedin-PHEYOHVG.js").then((m) => m.linkedinCommand),
33
33
  x: () => import("./x-UNSN57YP.js").then((m) => m.xCommand),
34
34
  chatgpt: () => import("./chatgpt-4PEWDJKP.js").then((m) => m.chatgptCommand)
35
35
  }
@@ -37,4 +37,4 @@ Full guides: __tooling__/docs/tools/baker/ads-<platform>.md (google|meta|linkedi
37
37
  export {
38
38
  adsCommand
39
39
  };
40
- //# sourceMappingURL=ads-WPI3AMSR.js.map
40
+ //# sourceMappingURL=ads-HHEB2LZG.js.map
@@ -77,11 +77,11 @@ Examples:
77
77
  },
78
78
  subCommands: {
79
79
  list: campaignGroupsListCommand,
80
- create: () => import("./write-commands-E7JOB4HX.js").then((m) => m.campaignGroupsCreateCommand),
81
- update: () => import("./write-commands-E7JOB4HX.js").then((m) => m.campaignGroupsUpdateCommand),
82
- pause: () => import("./write-commands-E7JOB4HX.js").then((m) => m.campaignGroupsPauseCommand),
83
- resume: () => import("./write-commands-E7JOB4HX.js").then((m) => m.campaignGroupsResumeCommand),
84
- duplicate: () => import("./write-commands-E7JOB4HX.js").then((m) => m.campaignGroupsDuplicateCommand)
80
+ create: () => import("./write-commands-MPXJK2AD.js").then((m) => m.campaignGroupsCreateCommand),
81
+ update: () => import("./write-commands-MPXJK2AD.js").then((m) => m.campaignGroupsUpdateCommand),
82
+ pause: () => import("./write-commands-MPXJK2AD.js").then((m) => m.campaignGroupsPauseCommand),
83
+ resume: () => import("./write-commands-MPXJK2AD.js").then((m) => m.campaignGroupsResumeCommand),
84
+ duplicate: () => import("./write-commands-MPXJK2AD.js").then((m) => m.campaignGroupsDuplicateCommand)
85
85
  },
86
86
  // A parent must never declare `run`: citty falls through to it *after* running
87
87
  // the matched subcommand, so every write would also trigger a full live list.
@@ -92,4 +92,4 @@ Examples:
92
92
  export {
93
93
  campaignGroupsCommand
94
94
  };
95
- //# sourceMappingURL=campaign-groups-5CMTEJZZ.js.map
95
+ //# sourceMappingURL=campaign-groups-BJ53O3HV.js.map
@@ -88,14 +88,14 @@ Examples:
88
88
  },
89
89
  subCommands: {
90
90
  list: campaignsListCommand,
91
- create: () => import("./write-commands-E7JOB4HX.js").then((m) => m.campaignsCreateCommand),
92
- update: () => import("./write-commands-E7JOB4HX.js").then((m) => m.campaignsUpdateCommand),
93
- pause: () => import("./write-commands-E7JOB4HX.js").then((m) => m.campaignsPauseCommand),
94
- resume: () => import("./write-commands-E7JOB4HX.js").then((m) => m.campaignsResumeCommand),
95
- archive: () => import("./write-commands-E7JOB4HX.js").then((m) => m.campaignsArchiveCommand),
96
- duplicate: () => import("./write-commands-E7JOB4HX.js").then((m) => m.campaignsDuplicateCommand),
97
- "url-params": () => import("./write-commands-E7JOB4HX.js").then((m) => m.campaignsUrlParamsCommand),
98
- "exclude-companies": () => import("./write-commands-E7JOB4HX.js").then((m) => m.campaignsExcludeCompaniesCommand)
91
+ create: () => import("./write-commands-MPXJK2AD.js").then((m) => m.campaignsCreateCommand),
92
+ update: () => import("./write-commands-MPXJK2AD.js").then((m) => m.campaignsUpdateCommand),
93
+ pause: () => import("./write-commands-MPXJK2AD.js").then((m) => m.campaignsPauseCommand),
94
+ resume: () => import("./write-commands-MPXJK2AD.js").then((m) => m.campaignsResumeCommand),
95
+ archive: () => import("./write-commands-MPXJK2AD.js").then((m) => m.campaignsArchiveCommand),
96
+ duplicate: () => import("./write-commands-MPXJK2AD.js").then((m) => m.campaignsDuplicateCommand),
97
+ "url-params": () => import("./write-commands-MPXJK2AD.js").then((m) => m.campaignsUrlParamsCommand),
98
+ "exclude-companies": () => import("./write-commands-MPXJK2AD.js").then((m) => m.campaignsExcludeCompaniesCommand)
99
99
  },
100
100
  // A parent must never declare `run`: citty falls through to it *after* running
101
101
  // the matched subcommand, so every write would also trigger a full live list.
@@ -106,4 +106,4 @@ Examples:
106
106
  export {
107
107
  campaignsCommand
108
108
  };
109
- //# sourceMappingURL=campaigns-PC7UAVXR.js.map
109
+ //# sourceMappingURL=campaigns-KMCIZYKR.js.map
package/dist/cli.js CHANGED
@@ -115,7 +115,7 @@ Introspection: Run 'baker schema <command>' to inspect argument schemas.`
115
115
  capabilities: () => import("./capabilities-FNVTPCDT.js").then((m) => m.capabilitiesCommand),
116
116
  actions: () => import("./actions-KQTXBNJU.js").then((m) => m.actionsCommand),
117
117
  "scheduled-agents": () => import("./scheduled-agents-MUCDCONT.js").then((m) => m.scheduledAgentsCommand),
118
- ads: () => import("./ads-WPI3AMSR.js").then((m) => m.adsCommand),
118
+ ads: () => import("./ads-HHEB2LZG.js").then((m) => m.adsCommand),
119
119
  brand: () => import("./brand-TRPJFCRL.js").then((m) => m.brandCommand),
120
120
  analytics: () => import("./analytics-IFNBT7IM.js").then((m) => m.analyticsCommand),
121
121
  experiment: () => import("./experiment-G3FQVAJU.js").then((m) => m.experimentCommand),
@@ -123,13 +123,13 @@ Subcommands:
123
123
  subCommands: {
124
124
  list: listCmd,
125
125
  health: healthCmd,
126
- create: () => import("./write-commands-E7JOB4HX.js").then((m) => m.conversionsCreateCommand),
127
- update: () => import("./write-commands-E7JOB4HX.js").then((m) => m.conversionsUpdateCommand),
128
- "associate-campaign": () => import("./write-commands-E7JOB4HX.js").then((m) => m.conversionsAssociateCommand),
129
- "dissociate-campaign": () => import("./write-commands-E7JOB4HX.js").then((m) => m.conversionsDissociateCommand)
126
+ create: () => import("./write-commands-MPXJK2AD.js").then((m) => m.conversionsCreateCommand),
127
+ update: () => import("./write-commands-MPXJK2AD.js").then((m) => m.conversionsUpdateCommand),
128
+ "associate-campaign": () => import("./write-commands-MPXJK2AD.js").then((m) => m.conversionsAssociateCommand),
129
+ "dissociate-campaign": () => import("./write-commands-MPXJK2AD.js").then((m) => m.conversionsDissociateCommand)
130
130
  }
131
131
  });
132
132
  export {
133
133
  conversionsCommand
134
134
  };
135
- //# sourceMappingURL=conversions-ZLC6YTJ5.js.map
135
+ //# sourceMappingURL=conversions-X5OWB6HQ.js.map
@@ -162,11 +162,11 @@ Examples:
162
162
  },
163
163
  subCommands: {
164
164
  list: creativesListCommand,
165
- create: () => import("./write-commands-E7JOB4HX.js").then((m) => m.creativesCreateCommand),
166
- update: () => import("./write-commands-E7JOB4HX.js").then((m) => m.creativesUpdateCommand),
167
- pause: () => import("./write-commands-E7JOB4HX.js").then((m) => m.creativesPauseCommand),
168
- resume: () => import("./write-commands-E7JOB4HX.js").then((m) => m.creativesResumeCommand),
169
- duplicate: () => import("./write-commands-E7JOB4HX.js").then((m) => m.creativesDuplicateCommand)
165
+ create: () => import("./write-commands-MPXJK2AD.js").then((m) => m.creativesCreateCommand),
166
+ update: () => import("./write-commands-MPXJK2AD.js").then((m) => m.creativesUpdateCommand),
167
+ pause: () => import("./write-commands-MPXJK2AD.js").then((m) => m.creativesPauseCommand),
168
+ resume: () => import("./write-commands-MPXJK2AD.js").then((m) => m.creativesResumeCommand),
169
+ duplicate: () => import("./write-commands-MPXJK2AD.js").then((m) => m.creativesDuplicateCommand)
170
170
  },
171
171
  // A parent must never declare `run`: citty falls through to it *after* running
172
172
  // the matched subcommand, so every write would also trigger a full live list.
@@ -179,4 +179,4 @@ export {
179
179
  creativesCommand,
180
180
  unmappedShapeWarnings
181
181
  };
182
- //# sourceMappingURL=creatives-KD7MOCR3.js.map
182
+ //# sourceMappingURL=creatives-2TE2DVC2.js.map
@@ -715,7 +715,11 @@ registerSchema({
715
715
  "cta-label": { type: "string", description: "Spotlight custom CTA label", required: false },
716
716
  "image-id": { type: "string", description: "Baker image library id", required: false },
717
717
  "image-urn": { type: "string", description: "Existing urn:li:image:*", required: false },
718
- "video-id": { type: "string", description: "Baker video library id", required: false },
718
+ "video-id": {
719
+ type: "string",
720
+ description: "Baker video library id \u2014 not sent to LinkedIn yet; staging refuses it, use --video-urn",
721
+ required: false
722
+ },
719
723
  "video-urn": { type: "string", description: "Existing urn:li:video:*", required: false },
720
724
  "logo-image-id": { type: "string", description: "Baker image id for the logo", required: false },
721
725
  title: { type: "string", description: "Media title", required: false },
@@ -724,7 +728,7 @@ registerSchema({
724
728
  });
725
729
  registerSchema({
726
730
  command: "ads.linkedin.creatives.create",
727
- description: "Stage a new creative (ad). Formats: image|video|text|spotlight|follower|document|carousel|conversation|tla|jobs|event|article. Media: --image-id/--video-id reference the Baker library (`baker images`/`baker videos`) and upload to LinkedIn at publish; --image-urn/--video-urn reference media already on LinkedIn. Limits: headline \u226470 (text ads \u226425), intro soft-truncates at 600 chars, landing URL must be https. Complex formats take --file with the full content object; conversation ads take --file with the message flow ({message: {subject, body (\u2264500), senderName?, buttons \u22645 \xD7 {label \u226425, type NESTED|LANDING_PAGE, nestedMessage?|landingPageUrl?}}}, \u226425 messages). Staged until publish.",
731
+ description: "Stage a new creative (ad). Formats: image|video|text|spotlight|follower|document|carousel|conversation|tla|jobs|event|article. Media: --image-id references the Baker library (`baker images`) and uploads to LinkedIn at publish, any format; --image-urn/--video-urn reference media already on LinkedIn (library videos can't be sent yet). Limits: headline \u226470 (text ads \u226425), intro soft-truncates at 600 chars, landing URL must be https. Complex formats take --file with the full content object; conversation ads take --file with the message flow ({message: {subject, body (\u2264500), senderName?, buttons \u22645 \xD7 {label \u226425, type NESTED|LANDING_PAGE, nestedMessage?|landingPageUrl?}}}, \u226425 messages). Staged until publish.",
728
732
  args: {
729
733
  ...writeAccountArgs,
730
734
  campaign: { type: "string", description: "Campaign id/URN or li_temp_* ref", required: true },
@@ -735,7 +739,11 @@ registerSchema({
735
739
  },
736
740
  "image-id": { type: "string", description: "Baker image library id", required: false },
737
741
  "image-urn": { type: "string", description: "Existing urn:li:image:*", required: false },
738
- "video-id": { type: "string", description: "Baker video library id", required: false },
742
+ "video-id": {
743
+ type: "string",
744
+ description: "Baker video library id \u2014 not sent to LinkedIn yet; staging refuses it, use --video-urn",
745
+ required: false
746
+ },
739
747
  "video-urn": { type: "string", description: "Existing urn:li:video:*", required: false },
740
748
  "logo-image-id": { type: "string", description: "Baker image id for the logo", required: false },
741
749
  intro: { type: "string", description: "Commentary / intro text", required: false },
@@ -796,7 +804,11 @@ registerSchema({
796
804
  "cta-label": { type: "string", description: "Spotlight custom CTA label", required: false },
797
805
  "image-id": { type: "string", description: "Baker image library id", required: false },
798
806
  "image-urn": { type: "string", description: "Existing urn:li:image:*", required: false },
799
- "video-id": { type: "string", description: "Baker video library id", required: false },
807
+ "video-id": {
808
+ type: "string",
809
+ description: "Baker video library id \u2014 not sent to LinkedIn yet; staging refuses it, use --video-urn",
810
+ required: false
811
+ },
800
812
  "video-urn": { type: "string", description: "Existing urn:li:video:*", required: false },
801
813
  "logo-image-id": { type: "string", description: "Baker image id for the logo", required: false },
802
814
  "thumbnail-image-id": {
@@ -1016,12 +1028,12 @@ Full guide: __tooling__/docs/tools/baker/ads-linkedin.md`
1016
1028
  },
1017
1029
  subCommands: {
1018
1030
  accounts: () => import("./accounts-XG472YLB.js").then((m) => m.accountsCommand),
1019
- account: () => import("./account-VH2AATWI.js").then((m) => m.accountCommand),
1020
- "campaign-groups": () => import("./campaign-groups-5CMTEJZZ.js").then((m) => m.campaignGroupsCommand),
1021
- campaigns: () => import("./campaigns-PC7UAVXR.js").then((m) => m.campaignsCommand),
1022
- creatives: () => import("./creatives-KD7MOCR3.js").then((m) => m.creativesCommand),
1023
- audiences: () => import("./write-commands-E7JOB4HX.js").then((m) => m.audiencesCommand),
1024
- "lead-forms": () => import("./write-commands-E7JOB4HX.js").then((m) => m.leadFormsCommand),
1031
+ account: () => import("./account-EPVHKQEM.js").then((m) => m.accountCommand),
1032
+ "campaign-groups": () => import("./campaign-groups-BJ53O3HV.js").then((m) => m.campaignGroupsCommand),
1033
+ campaigns: () => import("./campaigns-KMCIZYKR.js").then((m) => m.campaignsCommand),
1034
+ creatives: () => import("./creatives-2TE2DVC2.js").then((m) => m.creativesCommand),
1035
+ audiences: () => import("./write-commands-MPXJK2AD.js").then((m) => m.audiencesCommand),
1036
+ "lead-forms": () => import("./write-commands-MPXJK2AD.js").then((m) => m.leadFormsCommand),
1025
1037
  draft: () => import("./draft-BIQ3ZAYW.js").then((m) => m.linkedinDraftCommand),
1026
1038
  analytics: () => import("./analytics-I4LZCRG2.js").then((m) => m.analyticsCommand),
1027
1039
  demographics: () => import("./demographics-IKWN2H3V.js").then((m) => m.demographicsCommand),
@@ -1033,7 +1045,7 @@ Full guide: __tooling__/docs/tools/baker/ads-linkedin.md`
1033
1045
  "bid-pricing": () => import("./bid-pricing-5LZFHQTS.js").then((m) => m.bidPricingCommand),
1034
1046
  forecast: () => import("./forecast-W5F2MNOV.js").then((m) => m.forecastCommand),
1035
1047
  leads: () => import("./leads-H6JIWVI6.js").then((m) => m.leadsCommand),
1036
- conversions: () => import("./conversions-ZLC6YTJ5.js").then((m) => m.conversionsCommand),
1048
+ conversions: () => import("./conversions-X5OWB6HQ.js").then((m) => m.conversionsCommand),
1037
1049
  conversation: () => import("./conversation-VZKBZZGG.js").then((m) => m.conversationCommand),
1038
1050
  audit: () => import("./audit-6AG6BPXQ.js").then((m) => m.auditCommand),
1039
1051
  "url-params": () => import("./url-params-2DKIXKHH.js").then((m) => m.urlParamsCommand)
@@ -1042,4 +1054,4 @@ Full guide: __tooling__/docs/tools/baker/ads-linkedin.md`
1042
1054
  export {
1043
1055
  linkedinCommand
1044
1056
  };
1045
- //# sourceMappingURL=linkedin-7F6YVXQL.js.map
1057
+ //# sourceMappingURL=linkedin-PHEYOHVG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/ads/linkedin/index.ts","../src/commands/ads/linkedin/schemas.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport \"./schemas.ts\"; // side-effect import: registers `baker schema ads.linkedin.*` entries\n\n/**\n * LinkedIn Ads CLI — designed around LinkedIn's distinguishing strength:\n * firmographic (per-job-title, per-company, per-industry, per-seniority)\n * pivots on adAnalytics. AI agents should reach for `linkedin analytics\n * --pivot job-title` and `--pivot company` when answering ABM/persona\n * questions — Meta and Google can't do that.\n *\n * Read-only v1. All analytics queries default to `--level account --intent\n * baseline --granularity DAILY --last-days 7`. When pivoting on a MEMBER_*\n * dimension, the CLI auto-forces granularity=ALL (LinkedIn rejects\n * DAILY + demographic) and surfaces a \"demographic delayed 12-24h\" warning.\n *\n * Authentication: requires the LinkedIn integration to be connected in the\n * dashboard with `r_ads` and `r_ads_reporting` scopes. CLI talks to Baker's\n * backend, which holds the OAuth token.\n */\nexport const linkedinCommand = defineCommand({\n meta: {\n name: \"linkedin\",\n description: `LinkedIn Marketing API — AI-first command surface for B2B ad insights.\n\nDiscovery:\n baker ads linkedin accounts — accounts in this company's connected scope\n baker ads linkedin account --account-id 503001492 — single-account detail (currency, type, status)\n baker ads linkedin url-params [--ad-sets] — UTMs in effect today, and keys set at two levels\n\nHierarchy (default ACTIVE-only — pass --all-statuses to widen):\n baker ads linkedin campaign-groups --account-id 503001492\n baker ads linkedin campaigns --account-id 503001492\n baker ads linkedin campaigns --account-id 503001492 --campaign-group-id 12345\n baker ads linkedin creatives --account-id 503001492 --campaign-id 67890\n\nPerformance — the workhorse (3 axes):\n baker ads linkedin analytics — defaults: level=account, intent=baseline, last_7d, DAILY\n baker ads linkedin analytics --intent revenue --last-days 28\n baker ads linkedin analytics --level campaign --campaign-id 1234 --pivot job-title — LinkedIn's superpower (per-title perf)\n baker ads linkedin analytics --level campaign --campaign-id 1234 --pivot company — top companies seeing the ad (ABM gold; names auto-resolved)\n baker ads linkedin companies --last-months 12 --by month — which companies the ads reached, per month (ABM / warm accounts)\n baker ads linkedin resolve --urns urn:li:organization:17719 — resolve org URNs to company names\n baker ads linkedin analytics --level campaign --campaign-id 1234 --intent ranking — fatigue: derives frequency\n baker ads linkedin analytics --list-intents\n baker ads linkedin analytics --list-pivots\n\nStaged writes (never hit LinkedIn directly — ops stage on this chat's draft,\nshow in the dashboard as pending LinkedIn changes, and apply when the chat is\npublished, at which point they reach the real ad account):\n baker ads linkedin account url-params — UTMs for every ad in the account\n baker ads linkedin campaign-groups create|update|pause|resume|duplicate\n baker ads linkedin campaigns create|update|pause|resume|archive|duplicate\n baker ads linkedin creatives create|update|pause|resume|duplicate\n baker ads linkedin audiences create|upload\n baker ads linkedin conversions create|update\n baker ads linkedin lead-forms create|update\n baker ads linkedin draft list — review staged ops\n baker ads linkedin draft remove <ref> — undo one (draft clear: all)\n\nAccount ID format:\n --account-id accepts numeric (503001492) or URN (urn:li:sponsoredAccount:503001492).\n Set BAKER_LINKEDIN_AD_ACCOUNT_ID env to skip --account-id on every call.\nFull guide: __tooling__/docs/tools/baker/ads-linkedin.md`,\n },\n subCommands: {\n accounts: () => import(\"./accounts.ts\").then((m) => m.accountsCommand),\n account: () => import(\"./account.ts\").then((m) => m.accountCommand),\n \"campaign-groups\": () => import(\"./campaign-groups.ts\").then((m) => m.campaignGroupsCommand),\n campaigns: () => import(\"./campaigns.ts\").then((m) => m.campaignsCommand),\n creatives: () => import(\"./creatives.ts\").then((m) => m.creativesCommand),\n audiences: () => import(\"./write-commands.ts\").then((m) => m.audiencesCommand),\n \"lead-forms\": () => import(\"./write-commands.ts\").then((m) => m.leadFormsCommand),\n draft: () => import(\"./draft.ts\").then((m) => m.linkedinDraftCommand),\n analytics: () => import(\"./analytics.ts\").then((m) => m.analyticsCommand),\n demographics: () => import(\"./demographics.ts\").then((m) => m.demographicsCommand),\n companies: () => import(\"./companies.ts\").then((m) => m.companiesCommand),\n \"top-companies\": () => import(\"./top-companies.ts\").then((m) => m.topCompaniesCommand),\n resolve: () => import(\"./resolve.ts\").then((m) => m.resolveCommand),\n facets: () => import(\"./facets.ts\").then((m) => m.facetsCommand),\n \"audience-size\": () => import(\"./audience-size.ts\").then((m) => m.audienceSizeCommand),\n \"bid-pricing\": () => import(\"./bid-pricing.ts\").then((m) => m.bidPricingCommand),\n forecast: () => import(\"./forecast.ts\").then((m) => m.forecastCommand),\n leads: () => import(\"./leads.ts\").then((m) => m.leadsCommand),\n conversions: () => import(\"./conversions.ts\").then((m) => m.conversionsCommand),\n conversation: () => import(\"./conversation.ts\").then((m) => m.conversationCommand),\n audit: () => import(\"./audit.ts\").then((m) => m.auditCommand),\n \"url-params\": () => import(\"./url-params.ts\").then((m) => m.urlParamsCommand),\n },\n});\n","import { AVAILABLE_ARG } from \"../../../available-accounts.ts\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { CHAT_READ_ARG } from \"../../chat-arg.ts\";\nimport { statusesArgDescription } from \"./shared.ts\";\nimport { TOTAL_BUDGET_HELP } from \"./write-shared.ts\";\n\nconst CHAT_READ_ARG_DESCRIPTION = CHAT_READ_ARG.description;\n\n// Single file rather than per-command. Imported from ./index.ts so registration\n// runs at CLI startup. Mirrors the surface visible to AI agents via\n// `baker schema ads.linkedin.<name>`.\n\nregisterSchema({\n command: \"ads.linkedin.accounts\",\n description: \"List LinkedIn ad accounts in the company's connected scope.\",\n args: {\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n available: AVAILABLE_ARG,\n },\n});\n\nconst accountDetailSchema = {\n description:\n \"Single LinkedIn ad account detail (currency, status, type). Resolves the urn → {id, name, currency, status, type}.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric ID or urn:li:sponsoredAccount:N\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n} as const;\n\n// `account` with no subcommand still runs the detail read, so both names answer.\nregisterSchema({ command: \"ads.linkedin.account\", ...accountDetailSchema });\nregisterSchema({ command: \"ads.linkedin.account.detail\", ...accountDetailSchema });\n\nregisterSchema({\n command: \"ads.linkedin.campaign-groups\",\n description: \"List LinkedIn campaign groups in an account. Default ACTIVE-only — pass --all-statuses to widen.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\", required: false },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the ACTIVE filter\", required: false },\n statuses: { type: \"string\", description: statusesArgDescription(\"campaignGroups\"), required: false },\n limit: { type: \"string\", description: \"Max rows (default 500)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns\",\n description:\n \"List LinkedIn campaigns. Returns audit-relevant settings (audienceExpansionEnabled, offsiteDeliveryEnabled, optimizationTargetType, costType, budgets, runSchedule, targetingCriteria).\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-group-id\": { type: \"string\", description: \"Filter by campaign group\", required: false },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the ACTIVE filter\", required: false },\n statuses: { type: \"string\", description: statusesArgDescription(\"campaigns\"), required: false },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.creatives\",\n description:\n \"List LinkedIn creatives. Compact by default: id, urn, campaign, status, review status, format, and the resolved destination (landingUrl, or postUrn for post-based ads). The opaque 'content' block is NOT returned unless you pass --full; --fields takes dotted paths for anything narrower.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-id\": { type: \"string\", description: \"Filter by campaign\", required: false },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the ACTIVE filter\", required: false },\n statuses: { type: \"string\", description: statusesArgDescription(\"creatives\"), required: false },\n fields: {\n type: \"string\",\n description: \"CSV of dotted paths to return instead of the compact row, e.g. id,content.textAd.landingPage\",\n required: false,\n },\n full: {\n type: \"boolean\",\n description: \"Return the complete raw records, including the opaque 'content' block\",\n required: false,\n },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.analytics\",\n description:\n \"Performance reporting (3-axis: --level × --intent × --pivot). LinkedIn's superpower: pivot=job-title|company|industry|seniority. Demographic pivots auto-force granularity=ALL and surface a delayed-data warning.\",\n args: {\n level: {\n type: \"string\",\n description: \"account|campaign-group|campaign|creative\",\n required: false,\n default: \"account\",\n },\n \"account-id\": { type: \"string\", description: \"When level=account\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-group-id\": { type: \"string\", description: \"CSV when level=campaign-group\", required: false },\n \"campaign-id\": { type: \"string\", description: \"CSV when level=campaign\", required: false },\n \"creative-id\": { type: \"string\", description: \"CSV when level=creative\", required: false },\n ids: { type: \"string\", description: \"Generic CSV alternative\", required: false },\n intent: {\n type: \"string\",\n description: \"Field bundle\",\n required: false,\n default: \"baseline\",\n enum: [\n \"baseline\",\n \"revenue\",\n \"funnel\",\n \"engagement\",\n \"video\",\n \"lead-gen\",\n \"inmail\",\n \"document\",\n \"ranking\",\n \"identity\",\n ],\n },\n pivot: {\n type: \"string\",\n description: \"Demographic / firmographic dim\",\n required: false,\n default: \"none\",\n enum: [\n \"none\",\n \"campaign\",\n \"campaign-group\",\n \"creative\",\n \"company\",\n \"account\",\n \"conversion\",\n \"job-title\",\n \"job-function\",\n \"seniority\",\n \"industry\",\n \"company-size\",\n \"country\",\n \"region\",\n \"dma\",\n \"device\",\n \"placement\",\n \"serving-location\",\n \"card-index\",\n \"objective\",\n \"conversation-node\",\n \"conversation-node-button\",\n ],\n },\n metrics: { type: \"string\", description: \"CSV metric override (escape hatch)\", required: false },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 7)\", required: false },\n granularity: {\n type: \"string\",\n description: \"DAILY|MONTHLY|YEARLY|ALL\",\n required: false,\n default: \"DAILY\",\n enum: [\"DAILY\", \"MONTHLY\", \"YEARLY\", \"ALL\"],\n },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"no-sort\": { type: \"boolean\", description: \"Skip default sort\", required: false },\n \"list-intents\": { type: \"boolean\", description: \"List intents and exit\", required: false },\n \"list-pivots\": { type: \"boolean\", description: \"List pivots and exit\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.demographics\",\n description:\n \"Sweep all firmographic pivots (job-title, company, industry, seniority, function, company-size) in one call. Returns top-N rows per pivot.\",\n args: {\n \"campaign-id\": { type: \"string\", description: \"CSV campaign IDs\", required: true },\n pivots: { type: \"string\", description: \"CSV of pivots (default: all firmographic)\", required: false },\n \"top-n\": { type: \"string\", description: \"Top rows per pivot (default 10)\", required: false },\n intent: { type: \"string\", description: \"Field bundle\", required: false, default: \"baseline\" },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 30)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.companies\",\n description:\n \"Which companies the LinkedIn ads reached — one row per company over the whole period ({org, name, impressions, clicks, engagements, costLocal}), most engaged first. Start here for warm accounts / ABM reporting. Defaults: last 12 calendar months, the only selected ad account, 100 companies a page (--page N for the next, --full for all; totalCompanies counts them all). --by month|campaign adds a months[] or campaigns[] breakdown; --with-domains adds domain + domainSource for CRM matching; --stats adds row counts and cost/reach/domain coverage (no names). LinkedIn drops companies under 3 events a month.\",\n args: {\n \"account-id\": {\n type: \"string\",\n description: \"Ad account id (numeric or urn:li:sponsoredAccount:N). Default: the only selected account\",\n required: false,\n },\n \"campaign-id\": { type: \"string\", description: \"CSV campaign ids — read only these campaigns\", required: false },\n \"last-months\": {\n type: \"string\",\n description: \"Calendar months back incl. this one (1-24, default 12)\",\n required: false,\n },\n start: { type: \"string\", description: \"YYYY-MM-DD (instead of --last-months)\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD (default today)\", required: false },\n by: { type: \"string\", description: \"none | month | campaign (default none)\", required: false },\n \"with-domains\": { type: \"boolean\", description: \"Add website domain + domainSource per company\", required: false },\n \"min-impressions\": { type: \"string\", description: \"Leave out companies under N impressions\", required: false },\n full: { type: \"boolean\", description: \"Every company, plus videoViews\", required: false },\n page: {\n type: \"string\",\n description: \"Which page of 100 companies, most engaged first (default 1)\",\n required: false,\n },\n stats: { type: \"boolean\", description: \"Add read-quality stats (counts and rates only)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.top-companies\",\n description:\n \"Top companies whose employees saw / clicked / converted. Wrapper for analytics --pivot company. The ABM feedback loop.\",\n args: {\n \"campaign-id\": { type: \"string\", description: \"CSV campaign IDs\", required: true },\n intent: { type: \"string\", description: \"Field bundle (default baseline)\", required: false },\n \"top-n\": { type: \"string\", description: \"Top rows by impressions (default 25)\", required: false },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 30)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.resolve\",\n description:\n \"Resolve organization URNs (from top-companies / analytics --pivot company) to company names. With --with-domains, returns each org's LinkedIn page (vanityName), website and registrable domain instead — ready to match against CRM company domains. domainSource: website (the org's own domain), subdomain (e.g. news.microsoft.com → microsoft.com; lower confidence), none (shortlink/redirector or no website). Unknown ids come back in errors.\",\n args: {\n urns: { type: \"string\", description: \"Comma-separated org URNs (urn:li:organization:NNN)\", required: false },\n ids: { type: \"string\", description: \"Comma-separated bare org ids (17719,19022)\", required: false },\n \"with-domains\": {\n type: \"boolean\",\n description: \"Return vanityName, website, domain and domainSource per org (+ errors for unknown ids)\",\n required: false,\n },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.facets.list\",\n description:\n \"List every targeting facet LinkedIn supports (industries, seniorities, titles, employers, growthRate, etc).\",\n args: {\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.facets.values\",\n description:\n \"Look up entity values for a facet — full list (q=adTargetingFacet) or typeahead search (q=typeahead, with --query).\",\n args: {\n facet: { type: \"string\", description: \"Facet name (industries) or URN\", required: true },\n query: { type: \"string\", description: \"Typeahead query (auto-switches finder)\", required: false },\n finder: { type: \"string\", description: \"adTargetingFacet|typeahead|similarEntities\", required: false },\n locale: { type: \"string\", description: \"Locale (default en_US)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audience-size\",\n description:\n \"Estimate audience size for a targetingCriteria payload. Returns total + active + playbook §04 sweet-spot warnings.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\", required: false },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.bid-pricing\",\n description:\n \"LinkedIn's suggested bid (min/default/max), bid limits and daily budget range for a targeting + objective + bid type, in the account's currency, plus the playbook §06 floor (2/3 of suggested).\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n objective: {\n type: \"string\",\n description: \"Objective type (LEAD_GENERATION, WEBSITE_VISIT, etc.)\",\n required: true,\n },\n \"cost-type\": {\n type: \"string\",\n description: \"CPC|CPM|CPV\",\n required: false,\n default: \"CPC\",\n enum: [\"CPC\", \"CPM\", \"CPV\"],\n },\n \"campaign-type\": {\n type: \"string\",\n description: \"Campaign type\",\n required: false,\n default: \"SPONSORED_UPDATES\",\n enum: [\"SPONSORED_UPDATES\", \"SPONSORED_INMAILS\", \"TEXT_AD\"],\n },\n \"audience-expansion\": {\n type: \"boolean\",\n description: \"Price with audience expansion on\",\n required: false,\n default: false,\n },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\", required: false },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.forecast\",\n description:\n \"LinkedIn's forecast for a campaign that doesn't exist yet: impressions, clicks, leads, spend, unit costs (cpc, cpm, costPerLead) and rates over a period, each { value, low, high }. Needs a budget; --bid forecasts a manual bid, without it LinkedIn's automated bidding.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n objective: { type: \"string\", description: \"Objective type\", required: false },\n \"cost-type\": {\n type: \"string\",\n description: \"Bid type of --bid\",\n required: false,\n default: \"CPC\",\n enum: [\"CPC\", \"CPM\", \"CPV\"],\n },\n \"campaign-type\": {\n type: \"string\",\n description: \"Campaign type\",\n required: false,\n default: \"SPONSORED_UPDATES\",\n enum: [\"SPONSORED_UPDATES\", \"SPONSORED_INMAILS\", \"DYNAMIC\"],\n },\n \"daily-budget\": { type: \"string\", description: \"e.g. '250' or '250 EUR'\", required: false },\n \"total-budget\": { type: \"string\", description: \"e.g. '7250' or '7250 EUR'\", required: false },\n bid: { type: \"string\", description: \"Manual bid e.g. '5.57'; omit for automated bidding\", required: false },\n \"optimization-target\": { type: \"string\", description: \"Automated-bidding goal, e.g. MAX_LEAD\", required: false },\n start: { type: \"string\", description: \"First day YYYY-MM-DD (default tomorrow)\", required: false },\n days: { type: \"string\", description: \"Period length in days (default 30)\", required: false },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\", required: false },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file\", required: false },\n full: { type: \"boolean\", description: \"Include LinkedIn's raw series\", required: false, default: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.leads\",\n description:\n \"List Lead Gen Form responses (90-day LinkedIn retention — sync to CRM via this endpoint). Filter by --form-id, --campaign-id, or --since-days.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"form-id\": { type: \"string\", description: \"Filter by form ID\", required: false },\n \"campaign-id\": { type: \"string\", description: \"Filter by campaign\", required: false },\n \"since-days\": { type: \"string\", description: \"Last N days\", required: false },\n \"since-ms\": { type: \"string\", description: \"Epoch ms (alternative to --since-days)\", required: false },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.list\",\n description: \"List conversion rules (Insight Tag + Conversions API).\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.health\",\n description:\n \"Playbook §07 5-point health check: rules enabled? lead/purchase event? CAPI fired in 7d? view-through ≤7d? lead de-dup correct?\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversation\",\n description:\n \"Per-button click rates inside Sponsored Messaging / Conversation Ads. Wraps analytics --pivot conversation-node-button.\",\n args: {\n \"campaign-id\": { type: \"string\", description: \"CSV campaign IDs\", required: true },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 30)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audit\",\n description:\n \"Run a 30+ check playbook audit (Settings, Tracking, Audience, Campaigns, Creative, Performance, Bidding, Compliance, Hygiene). Each finding: {id, area, check, status, severity, evidence, fix} with playbook citations. --format md renders a deliverable-ready table.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-id\": { type: \"string\", description: \"Narrow to a single campaign\", required: false },\n \"window-days\": { type: \"string\", description: \"Performance lookback (default 30)\", required: false },\n severity: { type: \"string\", description: \"CSV severity filter (critical,high,medium,low)\", required: false },\n area: { type: \"string\", description: \"CSV area filter\", required: false },\n format: { type: \"string\", description: \"json | md\", required: false, default: \"json\" },\n \"no-cache\": NO_CACHE_ARG,\n },\n});\n\n// ---------------------------------------------------------------------------\n// Staged writes — ops stage on this chat's draft, appear in the dashboard as\n// pending LinkedIn changes, and hit the LinkedIn API only when the chat is\n// published — at which point they reach the real ad account, for every company.\n// ---------------------------------------------------------------------------\n\nconst writeAccountArgs = {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\", required: false },\n} as const;\n\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.create\",\n description:\n \"Stage a new campaign group (staged until publish; review with `baker ads linkedin draft`). Returns a li_temp_* ref that later `campaigns create --group` calls can reference.\",\n args: {\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Name (≤100 chars)\", required: true },\n start: { type: \"string\", description: \"Run schedule start (ISO date or epoch ms)\", required: true },\n end: { type: \"string\", description: \"Run schedule end\", required: false },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP, required: false },\n currency: {\n type: \"string\",\n description: \"3-letter currency code (defaults to the ad account currency)\",\n required: false,\n },\n status: {\n type: \"string\",\n description: \"DRAFT|ACTIVE (default DRAFT) — LinkedIn refuses a new group created PAUSED\",\n required: false,\n },\n file: { type: \"string\", description: \"JSON payload file; flags override file keys\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.update\",\n description:\n \"Stage changes to an existing campaign group (name, schedule, budget, status). Captures a before-snapshot for the dashboard diff. Pass a li_temp_* ref to AMEND a group staged in this chat. Applies on chat publish.\",\n args: {\n id: {\n type: \"positional\",\n description: \"Campaign group id/URN, or li_temp_* ref staged in this chat\",\n required: true,\n },\n ...writeAccountArgs,\n name: { type: \"string\", description: \"New name\", required: false },\n start: { type: \"string\", description: \"New schedule start\", required: false },\n end: { type: \"string\", description: \"New schedule end\", required: false },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP, required: false },\n currency: {\n type: \"string\",\n description: \"3-letter currency code (defaults to the ad account currency)\",\n required: false,\n },\n status: { type: \"string\", description: \"ACTIVE|PAUSED|ARCHIVED\", required: false },\n file: { type: \"string\", description: \"JSON file with fields to change\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.create\",\n description:\n \"Stage a new campaign. --group accepts a real id/URN or a li_temp_* ref staged earlier in this chat. Targeting goes in --targeting-file as LinkedIn criteria: {include:{and:[{or:{'urn:li:adTargetingFacet:locations':['urn:li:geo:…']}}]}} — find facet values with `baker ads linkedin facets values`. Playbook defaults: manual bid (--bid), audience expansion off, LAN off. Staged until publish.\",\n args: {\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Name (≤255 chars)\", required: true },\n group: { type: \"string\", description: \"Campaign group id/URN or li_temp_* ref\", required: true },\n type: { type: \"string\", description: \"SPONSORED_UPDATES|TEXT_AD|SPONSORED_INMAILS|DYNAMIC\", required: true },\n objective: { type: \"string\", description: \"LEAD_GENERATION|WEBSITE_VISIT|BRAND_AWARENESS|…\", required: false },\n \"cost-type\": { type: \"string\", description: \"CPC|CPM|CPV\", required: true },\n bid: { type: \"string\", description: \"Manual bid amount (unitCost)\", required: false },\n \"daily-budget\": { type: \"string\", description: \"Daily budget amount\", required: false },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP, required: false },\n currency: {\n type: \"string\",\n description: \"3-letter currency code (defaults to the ad account currency)\",\n required: false,\n },\n start: { type: \"string\", description: \"Run schedule start\", required: false },\n end: { type: \"string\", description: \"Run schedule end\", required: false },\n locale: { type: \"string\", description: \"Profile locale like en_US (default en_US)\", required: false },\n \"targeting-file\": { type: \"string\", description: \"JSON file with targetingCriteria\", required: true },\n \"audience-expansion\": { type: \"string\", description: \"on|off (playbook: off; default off)\", required: false },\n lan: {\n type: \"string\",\n description: \"LinkedIn Audience Network on|off (playbook: off; default off)\",\n required: false,\n },\n ctv: { type: \"string\", description: \"Connected TV on|off (default off)\", required: false },\n \"creative-selection\": { type: \"string\", description: \"OPTIMIZED|ROUND_ROBIN\", required: false },\n \"associated-entity\": { type: \"string\", description: \"Organization URN\", required: false },\n \"political-intent\": {\n type: \"string\",\n description:\n \"NOT_DECLARED (default)|NOT_POLITICAL|POLITICAL — the advertiser's declaration; NOT_POLITICAL only after the user confirms their ads are not political advertising\",\n required: false,\n },\n status: {\n type: \"string\",\n description: \"DRAFT|ACTIVE|PAUSED (default DRAFT) — PAUSED needs a group that is not DRAFT\",\n required: false,\n },\n file: { type: \"string\", description: \"JSON payload file; flags override file keys\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.update\",\n description:\n \"Stage changes to an existing campaign — budget, bid, targeting, schedule, flags, status. Only pass what changes; a before-snapshot powers the dashboard diff. Pass a li_temp_* ref to AMEND a campaign staged in this chat (fields merge into the staged create). Applies on chat publish.\",\n args: {\n id: { type: \"positional\", description: \"Campaign id/URN, or li_temp_* ref staged in this chat\", required: true },\n ...writeAccountArgs,\n name: { type: \"string\", description: \"New name\", required: false },\n objective: { type: \"string\", description: \"New objective\", required: false },\n \"cost-type\": { type: \"string\", description: \"CPC|CPM|CPV\", required: false },\n bid: { type: \"string\", description: \"New manual bid\", required: false },\n \"daily-budget\": { type: \"string\", description: \"New daily budget\", required: false },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP, required: false },\n currency: {\n type: \"string\",\n description: \"3-letter currency code (defaults to the ad account currency)\",\n required: false,\n },\n start: { type: \"string\", description: \"New schedule start\", required: false },\n end: { type: \"string\", description: \"New schedule end\", required: false },\n \"targeting-file\": { type: \"string\", description: \"JSON file with replacement targetingCriteria\", required: false },\n \"audience-expansion\": { type: \"string\", description: \"on|off\", required: false },\n lan: { type: \"string\", description: \"on|off\", required: false },\n ctv: { type: \"string\", description: \"on|off\", required: false },\n \"creative-selection\": { type: \"string\", description: \"OPTIMIZED|ROUND_ROBIN\", required: false },\n \"political-intent\": {\n type: \"string\",\n description:\n \"NOT_DECLARED (default)|NOT_POLITICAL|POLITICAL — the advertiser's declaration; NOT_POLITICAL only after the user confirms their ads are not political advertising\",\n required: false,\n },\n status: { type: \"string\", description: \"ACTIVE|PAUSED|ARCHIVED\", required: false },\n file: { type: \"string\", description: \"JSON file with fields to change\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.exclude-companies\",\n description:\n \"Stop a live ad set reaching some companies (customers, open deals, competitors). Add-only — never removes an exclusion. At publish Baker re-reads the ad set and merges into its targeting as it stands then, keeping audience, locations and every existing exclusion. --org takes company ids (as `companies` / `top-companies` print them) or urn:li:organization URNs, comma-separated, up to 200 per call; a longer list goes into a company-list audience passed to --segment. Staged until publish.\",\n args: {\n id: {\n type: \"positional\",\n description: \"Ad set (campaign) id or URN — must already be on LinkedIn\",\n required: true,\n },\n ...writeAccountArgs,\n org: {\n type: \"string\",\n description: \"Company ids or urn:li:organization URNs, comma-separated — e.g. 1035,1441\",\n required: false,\n },\n segment: {\n type: \"string\",\n description: \"Matched audiences, comma-separated: urn:li:dmpSegment:N / urn:li:adSegment:N or a li_temp_* ref\",\n required: false,\n },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.url-params\",\n description:\n \"Start here for UTMs: stage the URL tracking parameters on an ad set. LinkedIn appends them to the link of EVERY ad in the ad set, including ads already running, so this is the level to set campaign-wide UTMs at — editing each ad's landing URL instead risks the same key landing twice. For a value that never varies across the whole account, set it once with `account url-params` instead; LinkedIn appends BOTH levels, so a key set at both lands in the URL twice. REPLACES the ad set's whole parameter set — LinkedIn does not merge, so read `ads.linkedin.url-params` first and re-send every pair that should survive. --param takes fixed values (repeatable or &-joined); --dynamic takes a value LinkedIn fills in per ad (ACCOUNT_ID, ACCOUNT_NAME, CAMPAIGN_GROUP_ID, CAMPAIGN_GROUP_NAME, CAMPAIGN_ID, CAMPAIGN_NAME, CREATIVE_ID, CREATIVE_NAME). Applies on chat publish; message and conversation ads are unaffected.\",\n args: {\n id: { type: \"positional\", description: \"Ad set (campaign) id or URN\", required: true },\n ...writeAccountArgs,\n param: {\n type: \"string\",\n description: 'Fixed key=value, repeatable or &-joined — e.g. \"utm_source=linkedin&utm_medium=paid-social\"',\n required: false,\n },\n dynamic: {\n type: \"string\",\n description: \"key=PLACEHOLDER filled in per ad, repeatable — e.g. utm_campaign=CAMPAIGN_NAME\",\n required: false,\n },\n clear: { type: \"boolean\", description: \"Remove every tracking parameter from this ad set\", required: false },\n file: { type: \"string\", description: \"JSON payload file; flags override file keys\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.url-params\",\n description:\n \"Read the URL tracking parameters in effect: the ad account's, optionally every ad set's, and the keys set at BOTH levels — which LinkedIn appends twice into the served URL. Run this BEFORE setting UTMs on an ad set, because whatever the account already carries is appended on top. Account-only by default (there is no batch read, so each ad set costs its own call); --ad-sets sweeps them, capped, and the response says how many of how many were examined.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric ID or urn:li:sponsoredAccount:N\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\", required: false },\n \"ad-sets\": { type: \"boolean\", description: \"Also read every ad set's parameters\", required: false },\n \"campaign-ids\": {\n type: \"string\",\n description: \"Comma-separated ad set ids to read instead of all\",\n required: false,\n },\n \"collisions-only\": { type: \"boolean\", description: \"Only the keys set at more than one level\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.account.url-params\",\n description:\n \"Stage the URL tracking parameters on the whole AD ACCOUNT — LinkedIn appends them to the link of every ad in every ad set, including ads already running. Use it for the values that never vary across the account (utm_source, utm_medium, an agency tag); anything naming a specific ad set belongs on the ad set (`campaigns url-params`), because LinkedIn appends BOTH levels and a key set at both lands in the URL twice. REPLACES the account's whole parameter set — LinkedIn does not merge, so read `ads.linkedin.url-params` first and re-send every pair that should survive. --param takes fixed values (repeatable or &-joined); --dynamic takes a value LinkedIn fills in per ad (ACCOUNT_ID, ACCOUNT_NAME, CAMPAIGN_GROUP_ID, CAMPAIGN_GROUP_NAME, CAMPAIGN_ID, CAMPAIGN_NAME, CREATIVE_ID, CREATIVE_NAME). Applies on chat publish; message and conversation ads are unaffected.\",\n args: {\n ...writeAccountArgs,\n param: {\n type: \"string\",\n description: 'Fixed key=value, repeatable or &-joined — e.g. \"utm_source=linkedin&utm_medium=paid-social\"',\n required: false,\n },\n dynamic: {\n type: \"string\",\n description: \"key=PLACEHOLDER filled in per ad, repeatable — e.g. utm_campaign=CAMPAIGN_NAME\",\n required: false,\n },\n clear: { type: \"boolean\", description: \"Remove every tracking parameter set on the ad account\", required: false },\n file: { type: \"string\", description: \"JSON payload file; flags override file keys\", required: false },\n },\n});\n\nconst statusSugarArgs = {\n id: {\n type: \"positional\",\n description: \"Entity id or URN — comma-separate several to change them all in one call\",\n required: false,\n },\n \"ids-file\": { type: \"string\", description: \"File of ids, one per line or comma-separated\", required: false },\n ...writeAccountArgs,\n} as const;\n\n/** Every status command takes a list; say so once, in the words the agent reads. */\nconst MULTI_ID_NOTE =\n \"Takes one id or many: comma-separate the ids, or pass --ids-file. Several ids stage together as one set — all of them or none. The list form is for real ids/URNs only: a li_temp_* ref AMENDS what this chat already staged, and an amend must be passed on its own.\";\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.pause\",\n description: `Stage pausing a campaign (status → PAUSED on publish). ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaigns.resume\",\n description: `Stage resuming a paused campaign (status → ACTIVE on publish). ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaigns.archive\",\n description: `Stage archiving a campaign (status → ARCHIVED on publish). ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.pause\",\n description: `Stage pausing a campaign group. ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.resume\",\n description: `Stage resuming a campaign group. ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.creatives.pause\",\n description: `Stage pausing a creative (intendedStatus → PAUSED on publish). Playbook early-kill rule: >30 impressions with 0 clicks. ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.creatives.resume\",\n description: `Stage resuming a paused creative. ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\n\nconst duplicateArgs = {\n id: { type: \"positional\", description: \"Source id or URN\", required: true },\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Name for the copy\", required: false },\n file: { type: \"string\", description: \"JSON file with field overrides for the copy\", required: false },\n} as const;\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.duplicate\",\n description:\n \"Stage a copy of an existing campaign as a new DRAFT create (playbook: duplicate, never link-to-original). Reads the source at stage time; override fields via --name/--file.\",\n args: duplicateArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.duplicate\",\n description: \"Stage a copy of an existing campaign group as a new DRAFT create.\",\n args: duplicateArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.creatives.duplicate\",\n description:\n \"Stage a copy of an existing ad, optionally with new content. Direct-content ads (text/spotlight/follower/jobs) copy field-by-field, so a copy is how their immutable content changes (they can also update in place via creatives.update). Post-based ads re-sponsor the SAME post — the post owns the copy, media and destination, so content flags are rejected here: stage creatives.create with the new content instead, then pause the old ad. --replace stages pausing the original, gated on the new ad publishing successfully, and the copy inherits the source's status.\",\n args: {\n id: { type: \"positional\", description: \"Source creative id or URN\", required: true },\n ...writeAccountArgs,\n campaign: { type: \"string\", description: \"Stage the copy under a different ad set\", required: false },\n \"intended-status\": { type: \"string\", description: \"Status for the copy (default DRAFT)\", required: false },\n replace: { type: \"boolean\", description: \"Also pause the original once the new ad publishes\", required: false },\n headline: { type: \"string\", description: \"New headline\", required: false },\n description: { type: \"string\", description: \"New description (text/spotlight)\", required: false },\n intro: { type: \"string\", description: \"New commentary / intro text\", required: false },\n \"landing-url\": { type: \"string\", description: \"New https destination URL\", required: false },\n cta: { type: \"string\", description: \"New CTA\", required: false },\n \"cta-label\": { type: \"string\", description: \"Spotlight custom CTA label\", required: false },\n \"image-id\": { type: \"string\", description: \"Baker image library id\", required: false },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\", required: false },\n \"video-id\": { type: \"string\", description: \"Baker video library id\", required: false },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\", required: false },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for the logo\", required: false },\n title: { type: \"string\", description: \"Media title\", required: false },\n file: { type: \"string\", description: \"JSON file with field overrides for the copy\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.creatives.create\",\n description:\n \"Stage a new creative (ad). Formats: image|video|text|spotlight|follower|document|carousel|conversation|tla|jobs|event|article. Media: --image-id/--video-id reference the Baker library (`baker images`/`baker videos`) and upload to LinkedIn at publish; --image-urn/--video-urn reference media already on LinkedIn. Limits: headline ≤70 (text ads ≤25), intro soft-truncates at 600 chars, landing URL must be https. Complex formats take --file with the full content object; conversation ads take --file with the message flow ({message: {subject, body (≤500), senderName?, buttons ≤5 × {label ≤25, type NESTED|LANDING_PAGE, nestedMessage?|landingPageUrl?}}}, ≤25 messages). Staged until publish.\",\n args: {\n ...writeAccountArgs,\n campaign: { type: \"string\", description: \"Campaign id/URN or li_temp_* ref\", required: true },\n format: {\n type: \"string\",\n description: \"image|video|text|spotlight|follower|document|carousel|conversation|tla|jobs|event|article\",\n required: true,\n },\n \"image-id\": { type: \"string\", description: \"Baker image library id\", required: false },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\", required: false },\n \"video-id\": { type: \"string\", description: \"Baker video library id\", required: false },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\", required: false },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for the logo\", required: false },\n intro: { type: \"string\", description: \"Commentary / intro text\", required: false },\n headline: { type: \"string\", description: \"Headline\", required: false },\n description: { type: \"string\", description: \"Description (text/spotlight)\", required: false },\n \"landing-url\": { type: \"string\", description: \"https destination URL\", required: false },\n cta: { type: \"string\", description: \"LEARN_MORE|REQUEST_DEMO|SIGN_UP|REGISTER|DOWNLOAD|…\", required: false },\n \"cta-label\": { type: \"string\", description: \"Spotlight CTA label (≤18 chars)\", required: false },\n \"post-urn\": { type: \"string\", description: \"TLA: post to sponsor (urn:li:share|ugcPost:*)\", required: false },\n \"event-urn\": {\n type: \"string\",\n description: \"Event ads: the LinkedIn event to sponsor (urn:li:event:*)\",\n required: false,\n },\n \"article-url\": {\n type: \"string\",\n description: \"Article ads: https URL of the article/newsletter to sponsor\",\n required: false,\n },\n \"thumbnail-image-id\": {\n type: \"string\",\n description: \"Article ads: Baker image id for the link thumbnail\",\n required: false,\n },\n \"thumbnail-urn\": { type: \"string\", description: \"Article ads: existing urn:li:image:* thumbnail\", required: false },\n \"intended-status\": { type: \"string\", description: \"DRAFT|ACTIVE|PAUSED (default DRAFT)\", required: false },\n title: { type: \"string\", description: \"Media title (image/video) or article title\", required: false },\n file: { type: \"string\", description: \"JSON file with the full content object\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.creatives.update\",\n description: `Stage changes to an existing creative. Direct-content ads (text/spotlight/follower/jobs) update copy/media/URL IN PLACE — pass only the changed fields (headline, description, landing-url, image-id, …); the ad's current content carries over. Post-based ads (image/video/carousel/…) sponsor a post that owns the copy, media and destination — neither this command nor creatives.duplicate can change it; stage creatives.create with the new content, then pause the old ad. Passing a li_temp_* ref AMENDS the creative staged in this chat instead. ${MULTI_ID_NOTE} Applies on chat publish.`,\n args: {\n id: {\n type: \"positional\",\n description:\n \"Creative id/URN — comma-separate several. A li_temp_* ref amends what this chat staged and must be passed on its own.\",\n required: false,\n },\n \"ids-file\": {\n type: \"string\",\n description: \"File of creative ids, one per line or comma-separated\",\n required: false,\n },\n ...writeAccountArgs,\n \"intended-status\": { type: \"string\", description: \"ACTIVE|PAUSED|ARCHIVED|DRAFT\", required: false },\n name: { type: \"string\", description: \"New creative name\", required: false },\n campaign: {\n type: \"string\",\n description: \"Re-parent to a different ad set (id/URN or li_temp_*) — staged creatives only\",\n required: false,\n },\n headline: { type: \"string\", description: \"New headline\", required: false },\n intro: { type: \"string\", description: \"Commentary / intro text\", required: false },\n description: { type: \"string\", description: \"Description (text/spotlight)\", required: false },\n \"landing-url\": { type: \"string\", description: \"New https destination URL\", required: false },\n cta: { type: \"string\", description: \"New CTA\", required: false },\n \"cta-label\": { type: \"string\", description: \"Spotlight custom CTA label\", required: false },\n \"image-id\": { type: \"string\", description: \"Baker image library id\", required: false },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\", required: false },\n \"video-id\": { type: \"string\", description: \"Baker video library id\", required: false },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\", required: false },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for the logo\", required: false },\n \"thumbnail-image-id\": {\n type: \"string\",\n description: \"Baker image id for the article thumbnail\",\n required: false,\n },\n \"thumbnail-urn\": { type: \"string\", description: \"Existing urn:li:image:* thumbnail\", required: false },\n title: { type: \"string\", description: \"Media or article title\", required: false },\n file: { type: \"string\", description: \"JSON file with fields to change; flags override file keys\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audiences.create\",\n description:\n \"Stage a new matched audience. company-list/user-list take --list-file (CSV with header; companyName,domain,organizationUrn for companies — organizationUrn matches the company page exactly; email column is SHA-256 hashed locally). LinkedIn needs 300+ MATCHED members to serve — upload well above that. retargeting/engagement configs go in --file. Staged until publish.\",\n args: {\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Audience name (≤100 chars)\", required: true },\n type: { type: \"string\", description: \"company-list|user-list|retargeting|engagement\", required: true },\n \"list-file\": { type: \"string\", description: \"CSV file with the list rows\", required: false },\n file: {\n type: \"string\",\n description:\n \"JSON raw source config for retargeting/engagement — sourcePlatform, type USER, and engagementRules (engagementSource, engagementTrigger, timeFrame)\",\n required: false,\n },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audiences.upload\",\n description:\n \"Stage adding rows to an existing audience segment (or a li_temp_* segment staged in this chat). Same CSV rules as audiences.create.\",\n args: {\n id: { type: \"positional\", description: \"Segment URN/id or li_temp_* ref\", required: true },\n ...writeAccountArgs,\n \"list-file\": { type: \"string\", description: \"CSV file with the rows to add\", required: true },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.create\",\n description:\n \"Stage a new conversion rule. Playbook defaults: --post-click-window 30 --view-window 7, counting ONE_TIME_EACH_MEMBER for leads. Staged until publish.\",\n args: {\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Rule name\", required: true },\n type: {\n type: \"string\",\n description:\n \"Conversion type. Common: LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, SIGN_UP, DOWNLOAD, PURCHASE, KEY_PAGE_VIEW, ADD_TO_CART, BOOK_APPOINTMENT, SUBMIT_APPLICATION, OTHER — `baker schema ads.linkedin.conversions.create` lists all 34\",\n required: true,\n },\n method: { type: \"string\", description: \"INSIGHT_TAG|CONVERSIONS_API\", required: true },\n \"post-click-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n required: false,\n },\n \"view-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n required: false,\n },\n \"attribution-type\": {\n type: \"string\",\n description: \"LAST_TOUCH_BY_CAMPAIGN|LAST_TOUCH_BY_CONVERSION\",\n required: false,\n },\n \"associate-all-campaigns\": {\n type: \"boolean\",\n description: \"Auto-associate with active campaigns\",\n required: false,\n },\n file: { type: \"string\", description: \"JSON payload file (e.g. urlMatchRuleExpression)\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.update\",\n description: \"Stage changes to a conversion rule (windows, attribution, enabled, name). Applies on chat publish.\",\n args: {\n id: { type: \"positional\", description: \"Conversion rule id or URN\", required: true },\n ...writeAccountArgs,\n name: { type: \"string\", description: \"New name\", required: false },\n \"post-click-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n required: false,\n },\n \"view-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n required: false,\n },\n \"attribution-type\": { type: \"string\", description: \"New attribution type\", required: false },\n enabled: { type: \"string\", description: \"on|off\", required: false },\n file: { type: \"string\", description: \"JSON file with fields to change\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.associate-campaign\",\n description:\n \"Count an existing conversion rule for one ad set. Which ad sets a rule counts for is a separate LinkedIn record, not a field on the rule — `conversions update` cannot change it, and `--associate-all-campaigns` exists only on create. Staged until publish.\",\n args: {\n id: { type: \"positional\", description: \"Conversion rule id or URN\", required: true },\n ...writeAccountArgs,\n campaign: { type: \"string\", description: \"Ad set (campaign) id or URN\", required: true },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.dissociate-campaign\",\n description: \"Stop counting an existing conversion rule for one ad set. Staged until publish.\",\n args: {\n id: { type: \"positional\", description: \"Conversion rule id or URN\", required: true },\n ...writeAccountArgs,\n campaign: { type: \"string\", description: \"Ad set (campaign) id or URN\", required: true },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.lead-forms.create\",\n description:\n \"Stage a new Lead Gen Form from a JSON file: {name, headline ≤60, description? ≤160, privacyPolicyUrl, questions[] ≤12 (playbook: ≤4 for completion), thankYou?, legalDisclaimer?}. Staged until publish.\",\n args: {\n ...writeAccountArgs,\n file: { type: \"string\", description: \"JSON form definition file\", required: true },\n name: { type: \"string\", description: \"Override the form name\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.lead-forms.update\",\n description: \"Stage changes to a Lead Gen Form from a JSON file. Applies on chat publish.\",\n args: {\n id: { type: \"positional\", description: \"Lead form id or URN\", required: true },\n ...writeAccountArgs,\n file: { type: \"string\", description: \"JSON file with the fields to change\", required: true },\n name: { type: \"string\", description: \"New form name\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.draft.list\",\n description:\n \"Show every LinkedIn write op staged in this chat: ref, summary, dependencies, warnings, and post-publish results. Ops are invisible to the read commands until publish, and publishing reaches the real ad account — check here before finishing.\",\n args: {\n json: {\n type: \"boolean\",\n description: \"Print the raw JSON envelope instead of the readable tree\",\n required: false,\n },\n chat: { type: \"string\", description: CHAT_READ_ARG_DESCRIPTION, required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.draft.remove\",\n description:\n \"Drop one staged LinkedIn op from this chat's draft. Removing a create cascades to every op that depends on it (a campaign removal drops its staged creatives).\",\n args: {\n ref: {\n type: \"positional\",\n description: \"Op ref (li_temp_* for creates, target id/URN for updates)\",\n required: true,\n },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.draft.show\",\n description:\n \"Print the full staged payload for one LinkedIn op — the receipt to verify a change looks right before publish (never truncated), and the only way to read back verbatim what an earlier chat wrote.\",\n args: {\n ref: {\n type: \"positional\",\n description: \"Op ref (li_temp_* for creates, target id/URN for updates)\",\n required: true,\n },\n chat: { type: \"string\", description: CHAT_READ_ARG_DESCRIPTION, required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.draft.clear\",\n description: \"Discard ALL staged LinkedIn ops in this chat's draft. Nothing applies on publish.\",\n args: {},\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/ads/linkedin/index.ts","../src/commands/ads/linkedin/schemas.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport \"./schemas.ts\"; // side-effect import: registers `baker schema ads.linkedin.*` entries\n\n/**\n * LinkedIn Ads CLI — designed around LinkedIn's distinguishing strength:\n * firmographic (per-job-title, per-company, per-industry, per-seniority)\n * pivots on adAnalytics. AI agents should reach for `linkedin analytics\n * --pivot job-title` and `--pivot company` when answering ABM/persona\n * questions — Meta and Google can't do that.\n *\n * Read-only v1. All analytics queries default to `--level account --intent\n * baseline --granularity DAILY --last-days 7`. When pivoting on a MEMBER_*\n * dimension, the CLI auto-forces granularity=ALL (LinkedIn rejects\n * DAILY + demographic) and surfaces a \"demographic delayed 12-24h\" warning.\n *\n * Authentication: requires the LinkedIn integration to be connected in the\n * dashboard with `r_ads` and `r_ads_reporting` scopes. CLI talks to Baker's\n * backend, which holds the OAuth token.\n */\nexport const linkedinCommand = defineCommand({\n meta: {\n name: \"linkedin\",\n description: `LinkedIn Marketing API — AI-first command surface for B2B ad insights.\n\nDiscovery:\n baker ads linkedin accounts — accounts in this company's connected scope\n baker ads linkedin account --account-id 503001492 — single-account detail (currency, type, status)\n baker ads linkedin url-params [--ad-sets] — UTMs in effect today, and keys set at two levels\n\nHierarchy (default ACTIVE-only — pass --all-statuses to widen):\n baker ads linkedin campaign-groups --account-id 503001492\n baker ads linkedin campaigns --account-id 503001492\n baker ads linkedin campaigns --account-id 503001492 --campaign-group-id 12345\n baker ads linkedin creatives --account-id 503001492 --campaign-id 67890\n\nPerformance — the workhorse (3 axes):\n baker ads linkedin analytics — defaults: level=account, intent=baseline, last_7d, DAILY\n baker ads linkedin analytics --intent revenue --last-days 28\n baker ads linkedin analytics --level campaign --campaign-id 1234 --pivot job-title — LinkedIn's superpower (per-title perf)\n baker ads linkedin analytics --level campaign --campaign-id 1234 --pivot company — top companies seeing the ad (ABM gold; names auto-resolved)\n baker ads linkedin companies --last-months 12 --by month — which companies the ads reached, per month (ABM / warm accounts)\n baker ads linkedin resolve --urns urn:li:organization:17719 — resolve org URNs to company names\n baker ads linkedin analytics --level campaign --campaign-id 1234 --intent ranking — fatigue: derives frequency\n baker ads linkedin analytics --list-intents\n baker ads linkedin analytics --list-pivots\n\nStaged writes (never hit LinkedIn directly — ops stage on this chat's draft,\nshow in the dashboard as pending LinkedIn changes, and apply when the chat is\npublished, at which point they reach the real ad account):\n baker ads linkedin account url-params — UTMs for every ad in the account\n baker ads linkedin campaign-groups create|update|pause|resume|duplicate\n baker ads linkedin campaigns create|update|pause|resume|archive|duplicate\n baker ads linkedin creatives create|update|pause|resume|duplicate\n baker ads linkedin audiences create|upload\n baker ads linkedin conversions create|update\n baker ads linkedin lead-forms create|update\n baker ads linkedin draft list — review staged ops\n baker ads linkedin draft remove <ref> — undo one (draft clear: all)\n\nAccount ID format:\n --account-id accepts numeric (503001492) or URN (urn:li:sponsoredAccount:503001492).\n Set BAKER_LINKEDIN_AD_ACCOUNT_ID env to skip --account-id on every call.\nFull guide: __tooling__/docs/tools/baker/ads-linkedin.md`,\n },\n subCommands: {\n accounts: () => import(\"./accounts.ts\").then((m) => m.accountsCommand),\n account: () => import(\"./account.ts\").then((m) => m.accountCommand),\n \"campaign-groups\": () => import(\"./campaign-groups.ts\").then((m) => m.campaignGroupsCommand),\n campaigns: () => import(\"./campaigns.ts\").then((m) => m.campaignsCommand),\n creatives: () => import(\"./creatives.ts\").then((m) => m.creativesCommand),\n audiences: () => import(\"./write-commands.ts\").then((m) => m.audiencesCommand),\n \"lead-forms\": () => import(\"./write-commands.ts\").then((m) => m.leadFormsCommand),\n draft: () => import(\"./draft.ts\").then((m) => m.linkedinDraftCommand),\n analytics: () => import(\"./analytics.ts\").then((m) => m.analyticsCommand),\n demographics: () => import(\"./demographics.ts\").then((m) => m.demographicsCommand),\n companies: () => import(\"./companies.ts\").then((m) => m.companiesCommand),\n \"top-companies\": () => import(\"./top-companies.ts\").then((m) => m.topCompaniesCommand),\n resolve: () => import(\"./resolve.ts\").then((m) => m.resolveCommand),\n facets: () => import(\"./facets.ts\").then((m) => m.facetsCommand),\n \"audience-size\": () => import(\"./audience-size.ts\").then((m) => m.audienceSizeCommand),\n \"bid-pricing\": () => import(\"./bid-pricing.ts\").then((m) => m.bidPricingCommand),\n forecast: () => import(\"./forecast.ts\").then((m) => m.forecastCommand),\n leads: () => import(\"./leads.ts\").then((m) => m.leadsCommand),\n conversions: () => import(\"./conversions.ts\").then((m) => m.conversionsCommand),\n conversation: () => import(\"./conversation.ts\").then((m) => m.conversationCommand),\n audit: () => import(\"./audit.ts\").then((m) => m.auditCommand),\n \"url-params\": () => import(\"./url-params.ts\").then((m) => m.urlParamsCommand),\n },\n});\n","import { AVAILABLE_ARG } from \"../../../available-accounts.ts\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { CHAT_READ_ARG } from \"../../chat-arg.ts\";\nimport { statusesArgDescription } from \"./shared.ts\";\nimport { TOTAL_BUDGET_HELP } from \"./write-shared.ts\";\n\nconst CHAT_READ_ARG_DESCRIPTION = CHAT_READ_ARG.description;\n\n// Single file rather than per-command. Imported from ./index.ts so registration\n// runs at CLI startup. Mirrors the surface visible to AI agents via\n// `baker schema ads.linkedin.<name>`.\n\nregisterSchema({\n command: \"ads.linkedin.accounts\",\n description: \"List LinkedIn ad accounts in the company's connected scope.\",\n args: {\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n available: AVAILABLE_ARG,\n },\n});\n\nconst accountDetailSchema = {\n description:\n \"Single LinkedIn ad account detail (currency, status, type). Resolves the urn → {id, name, currency, status, type}.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric ID or urn:li:sponsoredAccount:N\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n} as const;\n\n// `account` with no subcommand still runs the detail read, so both names answer.\nregisterSchema({ command: \"ads.linkedin.account\", ...accountDetailSchema });\nregisterSchema({ command: \"ads.linkedin.account.detail\", ...accountDetailSchema });\n\nregisterSchema({\n command: \"ads.linkedin.campaign-groups\",\n description: \"List LinkedIn campaign groups in an account. Default ACTIVE-only — pass --all-statuses to widen.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\", required: false },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the ACTIVE filter\", required: false },\n statuses: { type: \"string\", description: statusesArgDescription(\"campaignGroups\"), required: false },\n limit: { type: \"string\", description: \"Max rows (default 500)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns\",\n description:\n \"List LinkedIn campaigns. Returns audit-relevant settings (audienceExpansionEnabled, offsiteDeliveryEnabled, optimizationTargetType, costType, budgets, runSchedule, targetingCriteria).\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-group-id\": { type: \"string\", description: \"Filter by campaign group\", required: false },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the ACTIVE filter\", required: false },\n statuses: { type: \"string\", description: statusesArgDescription(\"campaigns\"), required: false },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.creatives\",\n description:\n \"List LinkedIn creatives. Compact by default: id, urn, campaign, status, review status, format, and the resolved destination (landingUrl, or postUrn for post-based ads). The opaque 'content' block is NOT returned unless you pass --full; --fields takes dotted paths for anything narrower.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-id\": { type: \"string\", description: \"Filter by campaign\", required: false },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the ACTIVE filter\", required: false },\n statuses: { type: \"string\", description: statusesArgDescription(\"creatives\"), required: false },\n fields: {\n type: \"string\",\n description: \"CSV of dotted paths to return instead of the compact row, e.g. id,content.textAd.landingPage\",\n required: false,\n },\n full: {\n type: \"boolean\",\n description: \"Return the complete raw records, including the opaque 'content' block\",\n required: false,\n },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.analytics\",\n description:\n \"Performance reporting (3-axis: --level × --intent × --pivot). LinkedIn's superpower: pivot=job-title|company|industry|seniority. Demographic pivots auto-force granularity=ALL and surface a delayed-data warning.\",\n args: {\n level: {\n type: \"string\",\n description: \"account|campaign-group|campaign|creative\",\n required: false,\n default: \"account\",\n },\n \"account-id\": { type: \"string\", description: \"When level=account\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-group-id\": { type: \"string\", description: \"CSV when level=campaign-group\", required: false },\n \"campaign-id\": { type: \"string\", description: \"CSV when level=campaign\", required: false },\n \"creative-id\": { type: \"string\", description: \"CSV when level=creative\", required: false },\n ids: { type: \"string\", description: \"Generic CSV alternative\", required: false },\n intent: {\n type: \"string\",\n description: \"Field bundle\",\n required: false,\n default: \"baseline\",\n enum: [\n \"baseline\",\n \"revenue\",\n \"funnel\",\n \"engagement\",\n \"video\",\n \"lead-gen\",\n \"inmail\",\n \"document\",\n \"ranking\",\n \"identity\",\n ],\n },\n pivot: {\n type: \"string\",\n description: \"Demographic / firmographic dim\",\n required: false,\n default: \"none\",\n enum: [\n \"none\",\n \"campaign\",\n \"campaign-group\",\n \"creative\",\n \"company\",\n \"account\",\n \"conversion\",\n \"job-title\",\n \"job-function\",\n \"seniority\",\n \"industry\",\n \"company-size\",\n \"country\",\n \"region\",\n \"dma\",\n \"device\",\n \"placement\",\n \"serving-location\",\n \"card-index\",\n \"objective\",\n \"conversation-node\",\n \"conversation-node-button\",\n ],\n },\n metrics: { type: \"string\", description: \"CSV metric override (escape hatch)\", required: false },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 7)\", required: false },\n granularity: {\n type: \"string\",\n description: \"DAILY|MONTHLY|YEARLY|ALL\",\n required: false,\n default: \"DAILY\",\n enum: [\"DAILY\", \"MONTHLY\", \"YEARLY\", \"ALL\"],\n },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"no-sort\": { type: \"boolean\", description: \"Skip default sort\", required: false },\n \"list-intents\": { type: \"boolean\", description: \"List intents and exit\", required: false },\n \"list-pivots\": { type: \"boolean\", description: \"List pivots and exit\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.demographics\",\n description:\n \"Sweep all firmographic pivots (job-title, company, industry, seniority, function, company-size) in one call. Returns top-N rows per pivot.\",\n args: {\n \"campaign-id\": { type: \"string\", description: \"CSV campaign IDs\", required: true },\n pivots: { type: \"string\", description: \"CSV of pivots (default: all firmographic)\", required: false },\n \"top-n\": { type: \"string\", description: \"Top rows per pivot (default 10)\", required: false },\n intent: { type: \"string\", description: \"Field bundle\", required: false, default: \"baseline\" },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 30)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.companies\",\n description:\n \"Which companies the LinkedIn ads reached — one row per company over the whole period ({org, name, impressions, clicks, engagements, costLocal}), most engaged first. Start here for warm accounts / ABM reporting. Defaults: last 12 calendar months, the only selected ad account, 100 companies a page (--page N for the next, --full for all; totalCompanies counts them all). --by month|campaign adds a months[] or campaigns[] breakdown; --with-domains adds domain + domainSource for CRM matching; --stats adds row counts and cost/reach/domain coverage (no names). LinkedIn drops companies under 3 events a month.\",\n args: {\n \"account-id\": {\n type: \"string\",\n description: \"Ad account id (numeric or urn:li:sponsoredAccount:N). Default: the only selected account\",\n required: false,\n },\n \"campaign-id\": { type: \"string\", description: \"CSV campaign ids — read only these campaigns\", required: false },\n \"last-months\": {\n type: \"string\",\n description: \"Calendar months back incl. this one (1-24, default 12)\",\n required: false,\n },\n start: { type: \"string\", description: \"YYYY-MM-DD (instead of --last-months)\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD (default today)\", required: false },\n by: { type: \"string\", description: \"none | month | campaign (default none)\", required: false },\n \"with-domains\": { type: \"boolean\", description: \"Add website domain + domainSource per company\", required: false },\n \"min-impressions\": { type: \"string\", description: \"Leave out companies under N impressions\", required: false },\n full: { type: \"boolean\", description: \"Every company, plus videoViews\", required: false },\n page: {\n type: \"string\",\n description: \"Which page of 100 companies, most engaged first (default 1)\",\n required: false,\n },\n stats: { type: \"boolean\", description: \"Add read-quality stats (counts and rates only)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.top-companies\",\n description:\n \"Top companies whose employees saw / clicked / converted. Wrapper for analytics --pivot company. The ABM feedback loop.\",\n args: {\n \"campaign-id\": { type: \"string\", description: \"CSV campaign IDs\", required: true },\n intent: { type: \"string\", description: \"Field bundle (default baseline)\", required: false },\n \"top-n\": { type: \"string\", description: \"Top rows by impressions (default 25)\", required: false },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 30)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.resolve\",\n description:\n \"Resolve organization URNs (from top-companies / analytics --pivot company) to company names. With --with-domains, returns each org's LinkedIn page (vanityName), website and registrable domain instead — ready to match against CRM company domains. domainSource: website (the org's own domain), subdomain (e.g. news.microsoft.com → microsoft.com; lower confidence), none (shortlink/redirector or no website). Unknown ids come back in errors.\",\n args: {\n urns: { type: \"string\", description: \"Comma-separated org URNs (urn:li:organization:NNN)\", required: false },\n ids: { type: \"string\", description: \"Comma-separated bare org ids (17719,19022)\", required: false },\n \"with-domains\": {\n type: \"boolean\",\n description: \"Return vanityName, website, domain and domainSource per org (+ errors for unknown ids)\",\n required: false,\n },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.facets.list\",\n description:\n \"List every targeting facet LinkedIn supports (industries, seniorities, titles, employers, growthRate, etc).\",\n args: {\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.facets.values\",\n description:\n \"Look up entity values for a facet — full list (q=adTargetingFacet) or typeahead search (q=typeahead, with --query).\",\n args: {\n facet: { type: \"string\", description: \"Facet name (industries) or URN\", required: true },\n query: { type: \"string\", description: \"Typeahead query (auto-switches finder)\", required: false },\n finder: { type: \"string\", description: \"adTargetingFacet|typeahead|similarEntities\", required: false },\n locale: { type: \"string\", description: \"Locale (default en_US)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audience-size\",\n description:\n \"Estimate audience size for a targetingCriteria payload. Returns total + active + playbook §04 sweet-spot warnings.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\", required: false },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.bid-pricing\",\n description:\n \"LinkedIn's suggested bid (min/default/max), bid limits and daily budget range for a targeting + objective + bid type, in the account's currency, plus the playbook §06 floor (2/3 of suggested).\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n objective: {\n type: \"string\",\n description: \"Objective type (LEAD_GENERATION, WEBSITE_VISIT, etc.)\",\n required: true,\n },\n \"cost-type\": {\n type: \"string\",\n description: \"CPC|CPM|CPV\",\n required: false,\n default: \"CPC\",\n enum: [\"CPC\", \"CPM\", \"CPV\"],\n },\n \"campaign-type\": {\n type: \"string\",\n description: \"Campaign type\",\n required: false,\n default: \"SPONSORED_UPDATES\",\n enum: [\"SPONSORED_UPDATES\", \"SPONSORED_INMAILS\", \"TEXT_AD\"],\n },\n \"audience-expansion\": {\n type: \"boolean\",\n description: \"Price with audience expansion on\",\n required: false,\n default: false,\n },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\", required: false },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.forecast\",\n description:\n \"LinkedIn's forecast for a campaign that doesn't exist yet: impressions, clicks, leads, spend, unit costs (cpc, cpm, costPerLead) and rates over a period, each { value, low, high }. Needs a budget; --bid forecasts a manual bid, without it LinkedIn's automated bidding.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n objective: { type: \"string\", description: \"Objective type\", required: false },\n \"cost-type\": {\n type: \"string\",\n description: \"Bid type of --bid\",\n required: false,\n default: \"CPC\",\n enum: [\"CPC\", \"CPM\", \"CPV\"],\n },\n \"campaign-type\": {\n type: \"string\",\n description: \"Campaign type\",\n required: false,\n default: \"SPONSORED_UPDATES\",\n enum: [\"SPONSORED_UPDATES\", \"SPONSORED_INMAILS\", \"DYNAMIC\"],\n },\n \"daily-budget\": { type: \"string\", description: \"e.g. '250' or '250 EUR'\", required: false },\n \"total-budget\": { type: \"string\", description: \"e.g. '7250' or '7250 EUR'\", required: false },\n bid: { type: \"string\", description: \"Manual bid e.g. '5.57'; omit for automated bidding\", required: false },\n \"optimization-target\": { type: \"string\", description: \"Automated-bidding goal, e.g. MAX_LEAD\", required: false },\n start: { type: \"string\", description: \"First day YYYY-MM-DD (default tomorrow)\", required: false },\n days: { type: \"string\", description: \"Period length in days (default 30)\", required: false },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\", required: false },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file\", required: false },\n full: { type: \"boolean\", description: \"Include LinkedIn's raw series\", required: false, default: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.leads\",\n description:\n \"List Lead Gen Form responses (90-day LinkedIn retention — sync to CRM via this endpoint). Filter by --form-id, --campaign-id, or --since-days.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"form-id\": { type: \"string\", description: \"Filter by form ID\", required: false },\n \"campaign-id\": { type: \"string\", description: \"Filter by campaign\", required: false },\n \"since-days\": { type: \"string\", description: \"Last N days\", required: false },\n \"since-ms\": { type: \"string\", description: \"Epoch ms (alternative to --since-days)\", required: false },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.list\",\n description: \"List conversion rules (Insight Tag + Conversions API).\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.health\",\n description:\n \"Playbook §07 5-point health check: rules enabled? lead/purchase event? CAPI fired in 7d? view-through ≤7d? lead de-dup correct?\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversation\",\n description:\n \"Per-button click rates inside Sponsored Messaging / Conversation Ads. Wraps analytics --pivot conversation-node-button.\",\n args: {\n \"campaign-id\": { type: \"string\", description: \"CSV campaign IDs\", required: true },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 30)\", required: false },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audit\",\n description:\n \"Run a 30+ check playbook audit (Settings, Tracking, Audience, Campaigns, Creative, Performance, Bidding, Compliance, Hygiene). Each finding: {id, area, check, status, severity, evidence, fix} with playbook citations. --format md renders a deliverable-ready table.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-id\": { type: \"string\", description: \"Narrow to a single campaign\", required: false },\n \"window-days\": { type: \"string\", description: \"Performance lookback (default 30)\", required: false },\n severity: { type: \"string\", description: \"CSV severity filter (critical,high,medium,low)\", required: false },\n area: { type: \"string\", description: \"CSV area filter\", required: false },\n format: { type: \"string\", description: \"json | md\", required: false, default: \"json\" },\n \"no-cache\": NO_CACHE_ARG,\n },\n});\n\n// ---------------------------------------------------------------------------\n// Staged writes — ops stage on this chat's draft, appear in the dashboard as\n// pending LinkedIn changes, and hit the LinkedIn API only when the chat is\n// published — at which point they reach the real ad account, for every company.\n// ---------------------------------------------------------------------------\n\nconst writeAccountArgs = {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\", required: false },\n} as const;\n\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.create\",\n description:\n \"Stage a new campaign group (staged until publish; review with `baker ads linkedin draft`). Returns a li_temp_* ref that later `campaigns create --group` calls can reference.\",\n args: {\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Name (≤100 chars)\", required: true },\n start: { type: \"string\", description: \"Run schedule start (ISO date or epoch ms)\", required: true },\n end: { type: \"string\", description: \"Run schedule end\", required: false },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP, required: false },\n currency: {\n type: \"string\",\n description: \"3-letter currency code (defaults to the ad account currency)\",\n required: false,\n },\n status: {\n type: \"string\",\n description: \"DRAFT|ACTIVE (default DRAFT) — LinkedIn refuses a new group created PAUSED\",\n required: false,\n },\n file: { type: \"string\", description: \"JSON payload file; flags override file keys\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.update\",\n description:\n \"Stage changes to an existing campaign group (name, schedule, budget, status). Captures a before-snapshot for the dashboard diff. Pass a li_temp_* ref to AMEND a group staged in this chat. Applies on chat publish.\",\n args: {\n id: {\n type: \"positional\",\n description: \"Campaign group id/URN, or li_temp_* ref staged in this chat\",\n required: true,\n },\n ...writeAccountArgs,\n name: { type: \"string\", description: \"New name\", required: false },\n start: { type: \"string\", description: \"New schedule start\", required: false },\n end: { type: \"string\", description: \"New schedule end\", required: false },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP, required: false },\n currency: {\n type: \"string\",\n description: \"3-letter currency code (defaults to the ad account currency)\",\n required: false,\n },\n status: { type: \"string\", description: \"ACTIVE|PAUSED|ARCHIVED\", required: false },\n file: { type: \"string\", description: \"JSON file with fields to change\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.create\",\n description:\n \"Stage a new campaign. --group accepts a real id/URN or a li_temp_* ref staged earlier in this chat. Targeting goes in --targeting-file as LinkedIn criteria: {include:{and:[{or:{'urn:li:adTargetingFacet:locations':['urn:li:geo:…']}}]}} — find facet values with `baker ads linkedin facets values`. Playbook defaults: manual bid (--bid), audience expansion off, LAN off. Staged until publish.\",\n args: {\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Name (≤255 chars)\", required: true },\n group: { type: \"string\", description: \"Campaign group id/URN or li_temp_* ref\", required: true },\n type: { type: \"string\", description: \"SPONSORED_UPDATES|TEXT_AD|SPONSORED_INMAILS|DYNAMIC\", required: true },\n objective: { type: \"string\", description: \"LEAD_GENERATION|WEBSITE_VISIT|BRAND_AWARENESS|…\", required: false },\n \"cost-type\": { type: \"string\", description: \"CPC|CPM|CPV\", required: true },\n bid: { type: \"string\", description: \"Manual bid amount (unitCost)\", required: false },\n \"daily-budget\": { type: \"string\", description: \"Daily budget amount\", required: false },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP, required: false },\n currency: {\n type: \"string\",\n description: \"3-letter currency code (defaults to the ad account currency)\",\n required: false,\n },\n start: { type: \"string\", description: \"Run schedule start\", required: false },\n end: { type: \"string\", description: \"Run schedule end\", required: false },\n locale: { type: \"string\", description: \"Profile locale like en_US (default en_US)\", required: false },\n \"targeting-file\": { type: \"string\", description: \"JSON file with targetingCriteria\", required: true },\n \"audience-expansion\": { type: \"string\", description: \"on|off (playbook: off; default off)\", required: false },\n lan: {\n type: \"string\",\n description: \"LinkedIn Audience Network on|off (playbook: off; default off)\",\n required: false,\n },\n ctv: { type: \"string\", description: \"Connected TV on|off (default off)\", required: false },\n \"creative-selection\": { type: \"string\", description: \"OPTIMIZED|ROUND_ROBIN\", required: false },\n \"associated-entity\": { type: \"string\", description: \"Organization URN\", required: false },\n \"political-intent\": {\n type: \"string\",\n description:\n \"NOT_DECLARED (default)|NOT_POLITICAL|POLITICAL — the advertiser's declaration; NOT_POLITICAL only after the user confirms their ads are not political advertising\",\n required: false,\n },\n status: {\n type: \"string\",\n description: \"DRAFT|ACTIVE|PAUSED (default DRAFT) — PAUSED needs a group that is not DRAFT\",\n required: false,\n },\n file: { type: \"string\", description: \"JSON payload file; flags override file keys\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.update\",\n description:\n \"Stage changes to an existing campaign — budget, bid, targeting, schedule, flags, status. Only pass what changes; a before-snapshot powers the dashboard diff. Pass a li_temp_* ref to AMEND a campaign staged in this chat (fields merge into the staged create). Applies on chat publish.\",\n args: {\n id: { type: \"positional\", description: \"Campaign id/URN, or li_temp_* ref staged in this chat\", required: true },\n ...writeAccountArgs,\n name: { type: \"string\", description: \"New name\", required: false },\n objective: { type: \"string\", description: \"New objective\", required: false },\n \"cost-type\": { type: \"string\", description: \"CPC|CPM|CPV\", required: false },\n bid: { type: \"string\", description: \"New manual bid\", required: false },\n \"daily-budget\": { type: \"string\", description: \"New daily budget\", required: false },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP, required: false },\n currency: {\n type: \"string\",\n description: \"3-letter currency code (defaults to the ad account currency)\",\n required: false,\n },\n start: { type: \"string\", description: \"New schedule start\", required: false },\n end: { type: \"string\", description: \"New schedule end\", required: false },\n \"targeting-file\": { type: \"string\", description: \"JSON file with replacement targetingCriteria\", required: false },\n \"audience-expansion\": { type: \"string\", description: \"on|off\", required: false },\n lan: { type: \"string\", description: \"on|off\", required: false },\n ctv: { type: \"string\", description: \"on|off\", required: false },\n \"creative-selection\": { type: \"string\", description: \"OPTIMIZED|ROUND_ROBIN\", required: false },\n \"political-intent\": {\n type: \"string\",\n description:\n \"NOT_DECLARED (default)|NOT_POLITICAL|POLITICAL — the advertiser's declaration; NOT_POLITICAL only after the user confirms their ads are not political advertising\",\n required: false,\n },\n status: { type: \"string\", description: \"ACTIVE|PAUSED|ARCHIVED\", required: false },\n file: { type: \"string\", description: \"JSON file with fields to change\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.exclude-companies\",\n description:\n \"Stop a live ad set reaching some companies (customers, open deals, competitors). Add-only — never removes an exclusion. At publish Baker re-reads the ad set and merges into its targeting as it stands then, keeping audience, locations and every existing exclusion. --org takes company ids (as `companies` / `top-companies` print them) or urn:li:organization URNs, comma-separated, up to 200 per call; a longer list goes into a company-list audience passed to --segment. Staged until publish.\",\n args: {\n id: {\n type: \"positional\",\n description: \"Ad set (campaign) id or URN — must already be on LinkedIn\",\n required: true,\n },\n ...writeAccountArgs,\n org: {\n type: \"string\",\n description: \"Company ids or urn:li:organization URNs, comma-separated — e.g. 1035,1441\",\n required: false,\n },\n segment: {\n type: \"string\",\n description: \"Matched audiences, comma-separated: urn:li:dmpSegment:N / urn:li:adSegment:N or a li_temp_* ref\",\n required: false,\n },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.url-params\",\n description:\n \"Start here for UTMs: stage the URL tracking parameters on an ad set. LinkedIn appends them to the link of EVERY ad in the ad set, including ads already running, so this is the level to set campaign-wide UTMs at — editing each ad's landing URL instead risks the same key landing twice. For a value that never varies across the whole account, set it once with `account url-params` instead; LinkedIn appends BOTH levels, so a key set at both lands in the URL twice. REPLACES the ad set's whole parameter set — LinkedIn does not merge, so read `ads.linkedin.url-params` first and re-send every pair that should survive. --param takes fixed values (repeatable or &-joined); --dynamic takes a value LinkedIn fills in per ad (ACCOUNT_ID, ACCOUNT_NAME, CAMPAIGN_GROUP_ID, CAMPAIGN_GROUP_NAME, CAMPAIGN_ID, CAMPAIGN_NAME, CREATIVE_ID, CREATIVE_NAME). Applies on chat publish; message and conversation ads are unaffected.\",\n args: {\n id: { type: \"positional\", description: \"Ad set (campaign) id or URN\", required: true },\n ...writeAccountArgs,\n param: {\n type: \"string\",\n description: 'Fixed key=value, repeatable or &-joined — e.g. \"utm_source=linkedin&utm_medium=paid-social\"',\n required: false,\n },\n dynamic: {\n type: \"string\",\n description: \"key=PLACEHOLDER filled in per ad, repeatable — e.g. utm_campaign=CAMPAIGN_NAME\",\n required: false,\n },\n clear: { type: \"boolean\", description: \"Remove every tracking parameter from this ad set\", required: false },\n file: { type: \"string\", description: \"JSON payload file; flags override file keys\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.url-params\",\n description:\n \"Read the URL tracking parameters in effect: the ad account's, optionally every ad set's, and the keys set at BOTH levels — which LinkedIn appends twice into the served URL. Run this BEFORE setting UTMs on an ad set, because whatever the account already carries is appended on top. Account-only by default (there is no batch read, so each ad set costs its own call); --ad-sets sweeps them, capped, and the response says how many of how many were examined.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric ID or urn:li:sponsoredAccount:N\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\", required: false },\n \"ad-sets\": { type: \"boolean\", description: \"Also read every ad set's parameters\", required: false },\n \"campaign-ids\": {\n type: \"string\",\n description: \"Comma-separated ad set ids to read instead of all\",\n required: false,\n },\n \"collisions-only\": { type: \"boolean\", description: \"Only the keys set at more than one level\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.account.url-params\",\n description:\n \"Stage the URL tracking parameters on the whole AD ACCOUNT — LinkedIn appends them to the link of every ad in every ad set, including ads already running. Use it for the values that never vary across the account (utm_source, utm_medium, an agency tag); anything naming a specific ad set belongs on the ad set (`campaigns url-params`), because LinkedIn appends BOTH levels and a key set at both lands in the URL twice. REPLACES the account's whole parameter set — LinkedIn does not merge, so read `ads.linkedin.url-params` first and re-send every pair that should survive. --param takes fixed values (repeatable or &-joined); --dynamic takes a value LinkedIn fills in per ad (ACCOUNT_ID, ACCOUNT_NAME, CAMPAIGN_GROUP_ID, CAMPAIGN_GROUP_NAME, CAMPAIGN_ID, CAMPAIGN_NAME, CREATIVE_ID, CREATIVE_NAME). Applies on chat publish; message and conversation ads are unaffected.\",\n args: {\n ...writeAccountArgs,\n param: {\n type: \"string\",\n description: 'Fixed key=value, repeatable or &-joined — e.g. \"utm_source=linkedin&utm_medium=paid-social\"',\n required: false,\n },\n dynamic: {\n type: \"string\",\n description: \"key=PLACEHOLDER filled in per ad, repeatable — e.g. utm_campaign=CAMPAIGN_NAME\",\n required: false,\n },\n clear: { type: \"boolean\", description: \"Remove every tracking parameter set on the ad account\", required: false },\n file: { type: \"string\", description: \"JSON payload file; flags override file keys\", required: false },\n },\n});\n\nconst statusSugarArgs = {\n id: {\n type: \"positional\",\n description: \"Entity id or URN — comma-separate several to change them all in one call\",\n required: false,\n },\n \"ids-file\": { type: \"string\", description: \"File of ids, one per line or comma-separated\", required: false },\n ...writeAccountArgs,\n} as const;\n\n/** Every status command takes a list; say so once, in the words the agent reads. */\nconst MULTI_ID_NOTE =\n \"Takes one id or many: comma-separate the ids, or pass --ids-file. Several ids stage together as one set — all of them or none. The list form is for real ids/URNs only: a li_temp_* ref AMENDS what this chat already staged, and an amend must be passed on its own.\";\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.pause\",\n description: `Stage pausing a campaign (status → PAUSED on publish). ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaigns.resume\",\n description: `Stage resuming a paused campaign (status → ACTIVE on publish). ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaigns.archive\",\n description: `Stage archiving a campaign (status → ARCHIVED on publish). ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.pause\",\n description: `Stage pausing a campaign group. ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.resume\",\n description: `Stage resuming a campaign group. ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.creatives.pause\",\n description: `Stage pausing a creative (intendedStatus → PAUSED on publish). Playbook early-kill rule: >30 impressions with 0 clicks. ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.creatives.resume\",\n description: `Stage resuming a paused creative. ${MULTI_ID_NOTE}`,\n args: statusSugarArgs,\n});\n\nconst duplicateArgs = {\n id: { type: \"positional\", description: \"Source id or URN\", required: true },\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Name for the copy\", required: false },\n file: { type: \"string\", description: \"JSON file with field overrides for the copy\", required: false },\n} as const;\n\nregisterSchema({\n command: \"ads.linkedin.campaigns.duplicate\",\n description:\n \"Stage a copy of an existing campaign as a new DRAFT create (playbook: duplicate, never link-to-original). Reads the source at stage time; override fields via --name/--file.\",\n args: duplicateArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.campaign-groups.duplicate\",\n description: \"Stage a copy of an existing campaign group as a new DRAFT create.\",\n args: duplicateArgs,\n});\nregisterSchema({\n command: \"ads.linkedin.creatives.duplicate\",\n description:\n \"Stage a copy of an existing ad, optionally with new content. Direct-content ads (text/spotlight/follower/jobs) copy field-by-field, so a copy is how their immutable content changes (they can also update in place via creatives.update). Post-based ads re-sponsor the SAME post — the post owns the copy, media and destination, so content flags are rejected here: stage creatives.create with the new content instead, then pause the old ad. --replace stages pausing the original, gated on the new ad publishing successfully, and the copy inherits the source's status.\",\n args: {\n id: { type: \"positional\", description: \"Source creative id or URN\", required: true },\n ...writeAccountArgs,\n campaign: { type: \"string\", description: \"Stage the copy under a different ad set\", required: false },\n \"intended-status\": { type: \"string\", description: \"Status for the copy (default DRAFT)\", required: false },\n replace: { type: \"boolean\", description: \"Also pause the original once the new ad publishes\", required: false },\n headline: { type: \"string\", description: \"New headline\", required: false },\n description: { type: \"string\", description: \"New description (text/spotlight)\", required: false },\n intro: { type: \"string\", description: \"New commentary / intro text\", required: false },\n \"landing-url\": { type: \"string\", description: \"New https destination URL\", required: false },\n cta: { type: \"string\", description: \"New CTA\", required: false },\n \"cta-label\": { type: \"string\", description: \"Spotlight custom CTA label\", required: false },\n \"image-id\": { type: \"string\", description: \"Baker image library id\", required: false },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\", required: false },\n \"video-id\": {\n type: \"string\",\n description: \"Baker video library id — not sent to LinkedIn yet; staging refuses it, use --video-urn\",\n required: false,\n },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\", required: false },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for the logo\", required: false },\n title: { type: \"string\", description: \"Media title\", required: false },\n file: { type: \"string\", description: \"JSON file with field overrides for the copy\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.creatives.create\",\n description:\n \"Stage a new creative (ad). Formats: image|video|text|spotlight|follower|document|carousel|conversation|tla|jobs|event|article. Media: --image-id references the Baker library (`baker images`) and uploads to LinkedIn at publish, any format; --image-urn/--video-urn reference media already on LinkedIn (library videos can't be sent yet). Limits: headline ≤70 (text ads ≤25), intro soft-truncates at 600 chars, landing URL must be https. Complex formats take --file with the full content object; conversation ads take --file with the message flow ({message: {subject, body (≤500), senderName?, buttons ≤5 × {label ≤25, type NESTED|LANDING_PAGE, nestedMessage?|landingPageUrl?}}}, ≤25 messages). Staged until publish.\",\n args: {\n ...writeAccountArgs,\n campaign: { type: \"string\", description: \"Campaign id/URN or li_temp_* ref\", required: true },\n format: {\n type: \"string\",\n description: \"image|video|text|spotlight|follower|document|carousel|conversation|tla|jobs|event|article\",\n required: true,\n },\n \"image-id\": { type: \"string\", description: \"Baker image library id\", required: false },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\", required: false },\n \"video-id\": {\n type: \"string\",\n description: \"Baker video library id — not sent to LinkedIn yet; staging refuses it, use --video-urn\",\n required: false,\n },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\", required: false },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for the logo\", required: false },\n intro: { type: \"string\", description: \"Commentary / intro text\", required: false },\n headline: { type: \"string\", description: \"Headline\", required: false },\n description: { type: \"string\", description: \"Description (text/spotlight)\", required: false },\n \"landing-url\": { type: \"string\", description: \"https destination URL\", required: false },\n cta: { type: \"string\", description: \"LEARN_MORE|REQUEST_DEMO|SIGN_UP|REGISTER|DOWNLOAD|…\", required: false },\n \"cta-label\": { type: \"string\", description: \"Spotlight CTA label (≤18 chars)\", required: false },\n \"post-urn\": { type: \"string\", description: \"TLA: post to sponsor (urn:li:share|ugcPost:*)\", required: false },\n \"event-urn\": {\n type: \"string\",\n description: \"Event ads: the LinkedIn event to sponsor (urn:li:event:*)\",\n required: false,\n },\n \"article-url\": {\n type: \"string\",\n description: \"Article ads: https URL of the article/newsletter to sponsor\",\n required: false,\n },\n \"thumbnail-image-id\": {\n type: \"string\",\n description: \"Article ads: Baker image id for the link thumbnail\",\n required: false,\n },\n \"thumbnail-urn\": { type: \"string\", description: \"Article ads: existing urn:li:image:* thumbnail\", required: false },\n \"intended-status\": { type: \"string\", description: \"DRAFT|ACTIVE|PAUSED (default DRAFT)\", required: false },\n title: { type: \"string\", description: \"Media title (image/video) or article title\", required: false },\n file: { type: \"string\", description: \"JSON file with the full content object\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.creatives.update\",\n description: `Stage changes to an existing creative. Direct-content ads (text/spotlight/follower/jobs) update copy/media/URL IN PLACE — pass only the changed fields (headline, description, landing-url, image-id, …); the ad's current content carries over. Post-based ads (image/video/carousel/…) sponsor a post that owns the copy, media and destination — neither this command nor creatives.duplicate can change it; stage creatives.create with the new content, then pause the old ad. Passing a li_temp_* ref AMENDS the creative staged in this chat instead. ${MULTI_ID_NOTE} Applies on chat publish.`,\n args: {\n id: {\n type: \"positional\",\n description:\n \"Creative id/URN — comma-separate several. A li_temp_* ref amends what this chat staged and must be passed on its own.\",\n required: false,\n },\n \"ids-file\": {\n type: \"string\",\n description: \"File of creative ids, one per line or comma-separated\",\n required: false,\n },\n ...writeAccountArgs,\n \"intended-status\": { type: \"string\", description: \"ACTIVE|PAUSED|ARCHIVED|DRAFT\", required: false },\n name: { type: \"string\", description: \"New creative name\", required: false },\n campaign: {\n type: \"string\",\n description: \"Re-parent to a different ad set (id/URN or li_temp_*) — staged creatives only\",\n required: false,\n },\n headline: { type: \"string\", description: \"New headline\", required: false },\n intro: { type: \"string\", description: \"Commentary / intro text\", required: false },\n description: { type: \"string\", description: \"Description (text/spotlight)\", required: false },\n \"landing-url\": { type: \"string\", description: \"New https destination URL\", required: false },\n cta: { type: \"string\", description: \"New CTA\", required: false },\n \"cta-label\": { type: \"string\", description: \"Spotlight custom CTA label\", required: false },\n \"image-id\": { type: \"string\", description: \"Baker image library id\", required: false },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\", required: false },\n \"video-id\": {\n type: \"string\",\n description: \"Baker video library id — not sent to LinkedIn yet; staging refuses it, use --video-urn\",\n required: false,\n },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\", required: false },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for the logo\", required: false },\n \"thumbnail-image-id\": {\n type: \"string\",\n description: \"Baker image id for the article thumbnail\",\n required: false,\n },\n \"thumbnail-urn\": { type: \"string\", description: \"Existing urn:li:image:* thumbnail\", required: false },\n title: { type: \"string\", description: \"Media or article title\", required: false },\n file: { type: \"string\", description: \"JSON file with fields to change; flags override file keys\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audiences.create\",\n description:\n \"Stage a new matched audience. company-list/user-list take --list-file (CSV with header; companyName,domain,organizationUrn for companies — organizationUrn matches the company page exactly; email column is SHA-256 hashed locally). LinkedIn needs 300+ MATCHED members to serve — upload well above that. retargeting/engagement configs go in --file. Staged until publish.\",\n args: {\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Audience name (≤100 chars)\", required: true },\n type: { type: \"string\", description: \"company-list|user-list|retargeting|engagement\", required: true },\n \"list-file\": { type: \"string\", description: \"CSV file with the list rows\", required: false },\n file: {\n type: \"string\",\n description:\n \"JSON raw source config for retargeting/engagement — sourcePlatform, type USER, and engagementRules (engagementSource, engagementTrigger, timeFrame)\",\n required: false,\n },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audiences.upload\",\n description:\n \"Stage adding rows to an existing audience segment (or a li_temp_* segment staged in this chat). Same CSV rules as audiences.create.\",\n args: {\n id: { type: \"positional\", description: \"Segment URN/id or li_temp_* ref\", required: true },\n ...writeAccountArgs,\n \"list-file\": { type: \"string\", description: \"CSV file with the rows to add\", required: true },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.create\",\n description:\n \"Stage a new conversion rule. Playbook defaults: --post-click-window 30 --view-window 7, counting ONE_TIME_EACH_MEMBER for leads. Staged until publish.\",\n args: {\n ...writeAccountArgs,\n name: { type: \"string\", description: \"Rule name\", required: true },\n type: {\n type: \"string\",\n description:\n \"Conversion type. Common: LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, SIGN_UP, DOWNLOAD, PURCHASE, KEY_PAGE_VIEW, ADD_TO_CART, BOOK_APPOINTMENT, SUBMIT_APPLICATION, OTHER — `baker schema ads.linkedin.conversions.create` lists all 34\",\n required: true,\n },\n method: { type: \"string\", description: \"INSIGHT_TAG|CONVERSIONS_API\", required: true },\n \"post-click-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n required: false,\n },\n \"view-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n required: false,\n },\n \"attribution-type\": {\n type: \"string\",\n description: \"LAST_TOUCH_BY_CAMPAIGN|LAST_TOUCH_BY_CONVERSION\",\n required: false,\n },\n \"associate-all-campaigns\": {\n type: \"boolean\",\n description: \"Auto-associate with active campaigns\",\n required: false,\n },\n file: { type: \"string\", description: \"JSON payload file (e.g. urlMatchRuleExpression)\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.update\",\n description: \"Stage changes to a conversion rule (windows, attribution, enabled, name). Applies on chat publish.\",\n args: {\n id: { type: \"positional\", description: \"Conversion rule id or URN\", required: true },\n ...writeAccountArgs,\n name: { type: \"string\", description: \"New name\", required: false },\n \"post-click-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n required: false,\n },\n \"view-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n required: false,\n },\n \"attribution-type\": { type: \"string\", description: \"New attribution type\", required: false },\n enabled: { type: \"string\", description: \"on|off\", required: false },\n file: { type: \"string\", description: \"JSON file with fields to change\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.associate-campaign\",\n description:\n \"Count an existing conversion rule for one ad set. Which ad sets a rule counts for is a separate LinkedIn record, not a field on the rule — `conversions update` cannot change it, and `--associate-all-campaigns` exists only on create. Staged until publish.\",\n args: {\n id: { type: \"positional\", description: \"Conversion rule id or URN\", required: true },\n ...writeAccountArgs,\n campaign: { type: \"string\", description: \"Ad set (campaign) id or URN\", required: true },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.dissociate-campaign\",\n description: \"Stop counting an existing conversion rule for one ad set. Staged until publish.\",\n args: {\n id: { type: \"positional\", description: \"Conversion rule id or URN\", required: true },\n ...writeAccountArgs,\n campaign: { type: \"string\", description: \"Ad set (campaign) id or URN\", required: true },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.lead-forms.create\",\n description:\n \"Stage a new Lead Gen Form from a JSON file: {name, headline ≤60, description? ≤160, privacyPolicyUrl, questions[] ≤12 (playbook: ≤4 for completion), thankYou?, legalDisclaimer?}. Staged until publish.\",\n args: {\n ...writeAccountArgs,\n file: { type: \"string\", description: \"JSON form definition file\", required: true },\n name: { type: \"string\", description: \"Override the form name\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.lead-forms.update\",\n description: \"Stage changes to a Lead Gen Form from a JSON file. Applies on chat publish.\",\n args: {\n id: { type: \"positional\", description: \"Lead form id or URN\", required: true },\n ...writeAccountArgs,\n file: { type: \"string\", description: \"JSON file with the fields to change\", required: true },\n name: { type: \"string\", description: \"New form name\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.draft.list\",\n description:\n \"Show every LinkedIn write op staged in this chat: ref, summary, dependencies, warnings, and post-publish results. Ops are invisible to the read commands until publish, and publishing reaches the real ad account — check here before finishing.\",\n args: {\n json: {\n type: \"boolean\",\n description: \"Print the raw JSON envelope instead of the readable tree\",\n required: false,\n },\n chat: { type: \"string\", description: CHAT_READ_ARG_DESCRIPTION, required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.draft.remove\",\n description:\n \"Drop one staged LinkedIn op from this chat's draft. Removing a create cascades to every op that depends on it (a campaign removal drops its staged creatives).\",\n args: {\n ref: {\n type: \"positional\",\n description: \"Op ref (li_temp_* for creates, target id/URN for updates)\",\n required: true,\n },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.draft.show\",\n description:\n \"Print the full staged payload for one LinkedIn op — the receipt to verify a change looks right before publish (never truncated), and the only way to read back verbatim what an earlier chat wrote.\",\n args: {\n ref: {\n type: \"positional\",\n description: \"Op ref (li_temp_* for creates, target id/URN for updates)\",\n required: true,\n },\n chat: { type: \"string\", description: CHAT_READ_ARG_DESCRIPTION, required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.draft.clear\",\n description: \"Discard ALL staged LinkedIn ops in this chat's draft. Nothing applies on publish.\",\n args: {},\n});\n"],"mappings":"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","names":[]}
@@ -515,7 +515,10 @@ Examples:
515
515
  "cta-label": { type: "string", description: "Spotlight custom CTA label" },
516
516
  "image-id": { type: "string", description: "Baker image library id" },
517
517
  "image-urn": { type: "string", description: "Existing urn:li:image:*" },
518
- "video-id": { type: "string", description: "Baker video library id" },
518
+ "video-id": {
519
+ type: "string",
520
+ description: "Baker video library id \u2014 not sent to LinkedIn yet; staging refuses it, use --video-urn"
521
+ },
519
522
  "video-urn": { type: "string", description: "Existing urn:li:video:*" },
520
523
  "logo-image-id": { type: "string", description: "Baker image id for the logo" },
521
524
  title: { type: "string", description: "Media title" },
@@ -578,7 +581,10 @@ Examples:
578
581
  format: { type: "string", description: CREATIVE_FORMATS.join("|") },
579
582
  "image-id": { type: "string", description: "Baker image library id (uploaded to LinkedIn at publish)" },
580
583
  "image-urn": { type: "string", description: "Existing urn:li:image:*" },
581
- "video-id": { type: "string", description: "Baker video library id" },
584
+ "video-id": {
585
+ type: "string",
586
+ description: "Baker video library id \u2014 not sent to LinkedIn yet; staging refuses it, use --video-urn"
587
+ },
582
588
  "video-urn": { type: "string", description: "Existing urn:li:video:*" },
583
589
  "logo-image-id": { type: "string", description: "Baker image id for logo (text/spotlight/follower/jobs)" },
584
590
  intro: { type: "string", description: "Commentary / intro text (\u2264600 chars before feed truncation)" },
@@ -700,7 +706,10 @@ Examples:
700
706
  "cta-label": { type: "string", description: "Spotlight custom CTA label" },
701
707
  "image-id": { type: "string", description: "Baker image library id" },
702
708
  "image-urn": { type: "string", description: "Existing urn:li:image:*" },
703
- "video-id": { type: "string", description: "Baker video library id" },
709
+ "video-id": {
710
+ type: "string",
711
+ description: "Baker video library id \u2014 not sent to LinkedIn yet; staging refuses it, use --video-urn"
712
+ },
704
713
  "video-urn": { type: "string", description: "Existing urn:li:video:*" },
705
714
  "logo-image-id": { type: "string", description: "Baker image id for the logo" },
706
715
  "thumbnail-image-id": { type: "string", description: "Baker image id for the article thumbnail" },
@@ -1012,4 +1021,4 @@ export {
1012
1021
  leadFormsCommand,
1013
1022
  trackingParamsPayload
1014
1023
  };
1015
- //# sourceMappingURL=write-commands-E7JOB4HX.js.map
1024
+ //# sourceMappingURL=write-commands-MPXJK2AD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/ads/linkedin/write-commands.ts"],"sourcesContent":["import {\n campaignExcludeCompaniesSchema,\n type LinkedinDraftStageResponse,\n type LinkedinTrackingParamDynamicValue,\n TEMP_REF_PREFIX,\n TRACKING_PARAM_DYNAMIC_VALUES,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { requireChatId } from \"../../../env.ts\";\nimport { repeatedValues } from \"../../../lib/repeatedFlags.ts\";\nimport { writeJsonEnvelope } from \"../output.ts\";\nimport { handleLinkedinError } from \"./shared.ts\";\nimport {\n bareAccountId,\n failWriteValidation,\n loadJsonFileArg,\n loadTargetingFileArg,\n mergePayload,\n parseDateFlag,\n parseListFileArg,\n parseLocaleFlag,\n parseMoneyFlag,\n parseOnOffFlag,\n requireTarget,\n requireTargets,\n stageLinkedinOps,\n stageOp,\n stageStatusChange,\n TOTAL_BUDGET_HELP,\n} from \"./write-shared.ts\";\n\n/**\n * Staged write subcommands. None of these touch the LinkedIn API — they stage\n * ops on this chat's draft; ops appear in the dashboard as pending LinkedIn\n * changes and apply when the chat is published. Review with\n * `baker ads linkedin draft`, undo with `draft remove <ref>`.\n */\n\nconst STAGED_NOTE = \"Staged until publish — review with `baker ads linkedin draft`.\";\n\nconst accountArgs = {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n} as const;\n\nfunction runScheduleFromFlags(args: Record<string, unknown>): { start?: number; end?: number } | undefined {\n const start = parseDateFlag(args.start, \"--start\");\n const end = parseDateFlag(args.end, \"--end\");\n if (start === undefined && end === undefined) {\n return undefined;\n }\n return { ...(start !== undefined ? { start } : {}), ...(end !== undefined ? { end } : {}) };\n}\n\n// --- Campaign groups ---\n\nexport const campaignGroupsCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new campaign group. ${STAGED_NOTE}\nA group can't be created PAUSED, and a --total-budget needs an --end.\nExample: baker ads linkedin campaign-groups create --name \"Q3 ABM\" --start 2026-07-10 --end 2026-09-30 --total-budget 5000 --currency EUR`,\n },\n args: {\n ...accountArgs,\n name: { type: \"string\", description: \"Campaign group name (≤100 chars)\" },\n start: { type: \"string\", description: \"Run schedule start (ISO date or epoch ms)\" },\n end: { type: \"string\", description: \"Run schedule end\" },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP },\n currency: { type: \"string\", description: \"3-letter currency code (defaults to the ad account currency)\" },\n status: {\n type: \"string\",\n description:\n \"DRAFT|ACTIVE (default DRAFT) — LinkedIn refuses a new group created PAUSED; pause it once it exists\",\n },\n file: { type: \"string\", description: \"JSON file with the full payload; flags override file keys\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n runSchedule: runScheduleFromFlags(args as Record<string, unknown>),\n totalBudget: parseMoneyFlag(args[\"total-budget\"], args.currency, \"--total-budget\"),\n status: args.status ? String(args.status).toUpperCase() : undefined,\n });\n await stageOp({ kind: \"campaignGroup.create\", accountId, payload });\n },\n});\n\nexport const campaignGroupsUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Stage changes to an existing campaign group. ${STAGED_NOTE}\nPass a li_temp_* ref to amend a group staged in this chat — fields merge into the staged create.\nExample: baker ads linkedin campaign-groups update 635137195 --total-budget 8000 --currency EUR`,\n },\n args: {\n id: { type: \"positional\", description: \"Campaign group id or URN\", required: true },\n ...accountArgs,\n name: { type: \"string\", description: \"New name\" },\n start: { type: \"string\", description: \"New run schedule start\" },\n end: { type: \"string\", description: \"New run schedule end\" },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP },\n currency: { type: \"string\", description: \"3-letter currency code (defaults to the ad account currency)\" },\n status: { type: \"string\", description: \"ACTIVE|PAUSED|ARCHIVED|…\" },\n file: { type: \"string\", description: \"JSON file with fields to change\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n runSchedule: runScheduleFromFlags(args as Record<string, unknown>),\n totalBudget: parseMoneyFlag(args[\"total-budget\"], args.currency, \"--total-budget\"),\n status: args.status ? String(args.status).toUpperCase() : undefined,\n });\n await stageOp({\n kind: \"campaignGroup.update\",\n accountId,\n target: requireTarget(args as Record<string, unknown>, \"campaign group\"),\n payload,\n });\n },\n});\n\n// --- Campaigns ---\n\nfunction campaignPayloadFromFlags(args: Record<string, unknown>): Record<string, unknown> {\n return {\n name: args.name,\n campaignGroup: args.group,\n type: args.type ? String(args.type).toUpperCase() : undefined,\n objectiveType: args.objective ? String(args.objective).toUpperCase() : undefined,\n costType: args[\"cost-type\"] ? String(args[\"cost-type\"]).toUpperCase() : undefined,\n unitCost: parseMoneyFlag(args.bid, args.currency, \"--bid\"),\n dailyBudget: parseMoneyFlag(args[\"daily-budget\"], args.currency, \"--daily-budget\"),\n totalBudget: parseMoneyFlag(args[\"total-budget\"], args.currency, \"--total-budget\"),\n runSchedule: runScheduleFromFlags(args),\n locale: parseLocaleFlag(args.locale),\n targetingCriteria: loadTargetingFileArg(args[\"targeting-file\"]),\n audienceExpansionEnabled: parseOnOffFlag(args[\"audience-expansion\"], \"--audience-expansion\"),\n offsiteDeliveryEnabled: parseOnOffFlag(args.lan, \"--lan\"),\n connectedTelevisionOnly: parseOnOffFlag(args.ctv, \"--ctv\"),\n creativeSelection: args[\"creative-selection\"] ? String(args[\"creative-selection\"]).toUpperCase() : undefined,\n associatedEntity: args[\"associated-entity\"],\n politicalIntent: args[\"political-intent\"] ? String(args[\"political-intent\"]).toUpperCase() : undefined,\n status: args.status ? String(args.status).toUpperCase() : undefined,\n };\n}\n\nconst POLITICAL_INTENT_HELP =\n 'NOT_DECLARED (default)|NOT_POLITICAL|POLITICAL — the advertiser\\'s own declaration. Pass NOT_POLITICAL only after the user confirms: \"I confirm this is not political advertising. None of my ads qualify as political advertising under the law of the targeted countries, including EU law for ads targeted to the EU.\"';\n\nconst campaignFlagArgs = {\n ...accountArgs,\n name: { type: \"string\", description: \"Campaign name (≤255 chars)\" },\n group: { type: \"string\", description: \"Campaign group id/URN, or li_temp_* ref staged in this chat\" },\n type: { type: \"string\", description: \"SPONSORED_UPDATES|TEXT_AD|SPONSORED_INMAILS|DYNAMIC\" },\n objective: { type: \"string\", description: \"e.g. LEAD_GENERATION, WEBSITE_VISIT, BRAND_AWARENESS\" },\n \"cost-type\": { type: \"string\", description: \"CPC|CPM|CPV\" },\n bid: { type: \"string\", description: \"Manual bid (unitCost) — playbook mandates manual bidding\" },\n \"daily-budget\": { type: \"string\", description: \"Daily budget amount\" },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP },\n currency: { type: \"string\", description: \"3-letter currency code (defaults to the ad account currency)\" },\n start: { type: \"string\", description: \"Run schedule start (ISO date or epoch ms)\" },\n end: { type: \"string\", description: \"Run schedule end\" },\n locale: { type: \"string\", description: \"Profile locale like en_US\" },\n \"targeting-file\": { type: \"string\", description: \"JSON file with targetingCriteria (include.and[].or facets)\" },\n \"audience-expansion\": { type: \"string\", description: \"on|off (playbook: off)\" },\n lan: { type: \"string\", description: \"LinkedIn Audience Network on|off (playbook: off)\" },\n ctv: { type: \"string\", description: \"Connected TV on|off\" },\n \"creative-selection\": { type: \"string\", description: \"OPTIMIZED|ROUND_ROBIN\" },\n \"associated-entity\": { type: \"string\", description: \"Organization URN\" },\n \"political-intent\": { type: \"string\", description: POLITICAL_INTENT_HELP },\n status: { type: \"string\", description: \"DRAFT|ACTIVE|PAUSED — PAUSED needs a group that is not DRAFT\" },\n file: { type: \"string\", description: \"JSON file with the full payload; flags override file keys\" },\n} as const;\n\nexport const campaignsCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new campaign. ${STAGED_NOTE}\nTargeting goes in --targeting-file (facet URNs). --group accepts a li_temp_* ref from a campaign group staged in this chat.\nExample: baker ads linkedin campaigns create --name \"ABM Tier-1\" --group li_temp_x1 --objective WEBSITE_VISIT --type SPONSORED_UPDATES --cost-type CPC --bid 8.50 --daily-budget 75 --currency EUR --locale en_US --targeting-file targeting.json`,\n },\n args: campaignFlagArgs,\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const payload = mergePayload(loadJsonFileArg(args.file), campaignPayloadFromFlags(args as Record<string, unknown>));\n if (payload.locale === undefined) {\n payload.locale = { country: \"US\", language: \"en\" };\n }\n await stageOp({ kind: \"campaign.create\", accountId, payload });\n },\n});\n\n/**\n * `campaigns update`'s flags → payload. Create-only fields (campaignGroup/type/locale/\n * associatedEntity) are not updatable on a LIVE campaign, so they're stripped there; a\n * `li_temp_*` target amends the staged create in place, where those fields are still fair game\n * (the amend path re-validates the merged payload as a full create).\n */\nexport function campaignUpdatePayloadFromFlags(\n args: Record<string, unknown>,\n target: string,\n file: Record<string, unknown>,\n): Record<string, unknown> {\n const flags = campaignPayloadFromFlags(args);\n if (!target.startsWith(TEMP_REF_PREFIX)) {\n flags.campaignGroup = undefined;\n flags.type = undefined;\n flags.locale = undefined;\n flags.associatedEntity = undefined;\n }\n return mergePayload(file, flags);\n}\n\nexport const campaignsUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Stage changes to an existing campaign (budget, bid, targeting, flags, schedule, status). ${STAGED_NOTE}\nPass a li_temp_* ref to amend a campaign staged in this chat — fields merge into the staged create, and --group/--type/--locale/--associated-entity carry through too (they're create-only on a LIVE campaign, but fair game while it's still staged).\nExample: baker ads linkedin campaigns update 123456 --daily-budget 100 --currency EUR --audience-expansion off`,\n },\n args: {\n id: { type: \"positional\", description: \"Campaign id or URN\", required: true },\n ...campaignFlagArgs,\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const target = requireTarget(args as Record<string, unknown>, \"campaign\");\n const payload = campaignUpdatePayloadFromFlags(args as Record<string, unknown>, target, loadJsonFileArg(args.file));\n await stageOp({ kind: \"campaign.update\", accountId, target, payload });\n },\n});\n\nfunction commaList(value: unknown): string[] {\n return typeof value === \"string\"\n ? value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n : [];\n}\n\n/** `--org` takes the bare ids `companies`/`top-companies` print, or full organization URNs. */\nexport function excludeCompaniesPayload(args: Record<string, unknown>): {\n add: { employers?: string[]; segments?: string[] };\n} {\n const employers = commaList(args.org).map((org) => (org.startsWith(\"urn:\") ? org : `urn:li:organization:${org}`));\n const segments = commaList(args.segment);\n return {\n add: {\n ...(employers.length > 0 ? { employers } : {}),\n ...(segments.length > 0 ? { segments } : {}),\n },\n };\n}\n\nconst EXCLUSION_FLAG_BY_FIELD: Record<string, string> = { employers: \"--org\", segments: \"--segment\" };\n\n/**\n * Why these flags cannot stage, in the flags' own words — `--org: 0 is not a\n * LinkedIn company id …` rather than the contract path `payload.add.employers.1`\n * and a pointer at the capabilities catalogue, which is for unknown fields.\n */\nexport function excludeCompaniesRefusal(args: Record<string, unknown>): string | undefined {\n const payload = excludeCompaniesPayload(args);\n if (!payload.add.employers && !payload.add.segments) {\n return \"pass --org and/or --segment — the companies or audiences this ad set should stop reaching\";\n }\n const parsed = campaignExcludeCompaniesSchema.safeParse(payload);\n if (parsed.success) {\n return undefined;\n }\n return parsed.error.issues\n .map((issue) => {\n const flag = EXCLUSION_FLAG_BY_FIELD[String(issue.path[1])];\n return flag ? `${flag}: ${issue.message}` : issue.message;\n })\n .join(\"; \");\n}\n\nexport const campaignsExcludeCompaniesCommand = defineCommand({\n meta: {\n name: \"exclude-companies\",\n description: `Stop an ad set reaching some companies — customers, open deals, competitors. ${STAGED_NOTE}\nAdd-only: adds to the ad set's exclusions and never removes one. At publish Baker re-reads the ad set and merges into its targeting as it stands then, so audience, locations and existing exclusions are kept.\n--org takes company ids (as \\`companies\\` / \\`top-companies\\` print them) or urn:li:organization URNs, comma-separated, up to 200 per call. For a longer list, upload it as a company-list audience and pass it to --segment (an urn:li:dmpSegment/adSegment URN, or a li_temp_* audience staged in this chat).\nExample: baker ads linkedin campaigns exclude-companies 123456 --org 1035,1441`,\n },\n args: {\n id: {\n type: \"positional\",\n description: \"Ad set (campaign) id or URN — must already be on LinkedIn\",\n required: true,\n },\n ...accountArgs,\n org: { type: \"string\", description: \"Company ids or urn:li:organization URNs to exclude, comma-separated\" },\n segment: {\n type: \"string\",\n description:\n \"Matched audiences to exclude, comma-separated: urn:li:dmpSegment:N / urn:li:adSegment:N or a li_temp_* ref\",\n },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const target = requireTarget(args as Record<string, unknown>, \"campaign\");\n const refusal = excludeCompaniesRefusal(args as Record<string, unknown>);\n if (refusal) {\n failWriteValidation(refusal);\n }\n const payload = excludeCompaniesPayload(args as Record<string, unknown>);\n await stageOp({ kind: \"campaign.excludeCompanies\", accountId, target, payload });\n },\n});\n\nfunction statusSugarCommand(\n entity: \"campaign-groups\" | \"campaigns\" | \"creatives\",\n kind: \"campaignGroup.update\" | \"campaign.update\" | \"creative.update\",\n name: \"pause\" | \"resume\" | \"archive\",\n) {\n const status = name === \"pause\" ? \"PAUSED\" : name === \"resume\" ? \"ACTIVE\" : \"ARCHIVED\";\n return defineCommand({\n meta: {\n name,\n description: `Stage a status change to ${status}, for one id or many. ${STAGED_NOTE}\nExamples:\n baker ads linkedin ${entity} ${name} 123456\n baker ads linkedin ${entity} ${name} 123456,123457,123458\n baker ads linkedin ${entity} ${name} --ids-file ids.txt`,\n },\n args: {\n id: { type: \"positional\", description: \"Entity id or URN — comma-separate several\", required: false },\n \"ids-file\": { type: \"string\", description: \"File of ids, one per line or comma-separated\" },\n ...accountArgs,\n },\n run: async ({ args }) => {\n await stageStatusChange({\n kind,\n accountId: bareAccountId(args as Record<string, unknown>),\n targets: requireTargets(args as Record<string, unknown>, entity.replace(/-/g, \" \").replace(/s$/, \"\")),\n status,\n });\n },\n });\n}\n\n// --- Ad set URL tracking parameters ---\n\n/**\n * `--param`/`--dynamic` accept a repeated flag, an `&`-joined query string, or\n * both — agents reach for all three, and the parsed result is identical.\n */\nfunction trackingPairs(value: unknown, flag: string): Array<[string, string]> {\n const raw = value === undefined ? [] : Array.isArray(value) ? value : [value];\n return raw.flatMap((entry) =>\n String(entry)\n .split(\"&\")\n .filter((pair) => pair.length > 0)\n .map((pair): [string, string] => {\n const at = pair.indexOf(\"=\");\n if (at < 1 || at === pair.length - 1) {\n failWriteValidation(`${flag} expects key=value pairs — got \"${pair}\"`);\n }\n return [pair.slice(0, at).trim(), pair.slice(at + 1).trim()];\n }),\n );\n}\n\n/** A value that names one of LinkedIn's placeholders, however the agent wrote it. */\nfunction asDynamicValue(value: string): LinkedinTrackingParamDynamicValue | undefined {\n const bare = value.replace(/^\\{+|\\}+$/g, \"\").toUpperCase();\n return (TRACKING_PARAM_DYNAMIC_VALUES as readonly string[]).includes(bare)\n ? (bare as LinkedinTrackingParamDynamicValue)\n : undefined;\n}\n\n/**\n * `rawArgs` is the command line, and it is what the repeatable flags are read\n * from: citty keeps only a repeated flag's LAST value, so `--param a=1 --param\n * b=2` arrives here as `\"b=2\"`. Since this write REPLACES the entity's whole\n * parameter set, taking it from `args` would stage one pair, report success,\n * and delete the rest at publish.\n */\nexport function trackingParamsPayload(\n args: Record<string, unknown>,\n rawArgs?: readonly string[],\n): Record<string, unknown> {\n if (args.clear) {\n return { dynamicValueParameters: {}, customValueParameters: {} };\n }\n const customValueParameters: Record<string, string> = {};\n for (const [key, value] of trackingPairs(repeatedValues(rawArgs, \"param\", args.param), \"--param\")) {\n if (asDynamicValue(value)) {\n failWriteValidation(\n `--param ${key}=${value} names a value LinkedIn fills in per ad — pass it as --dynamic ${key}=${value.replace(/^\\{+|\\}+$/g, \"\").toUpperCase()}`,\n );\n }\n customValueParameters[key] = value;\n }\n const dynamicValueParameters: Record<string, string> = {};\n for (const [key, value] of trackingPairs(repeatedValues(rawArgs, \"dynamic\", args.dynamic), \"--dynamic\")) {\n const resolved = asDynamicValue(value);\n if (!resolved) {\n failWriteValidation(\n `--dynamic ${key}=${value} is not a value LinkedIn can fill in — use one of ${TRACKING_PARAM_DYNAMIC_VALUES.join(\", \")}, or pass a fixed value with --param`,\n );\n }\n dynamicValueParameters[key] = resolved;\n }\n return mergePayload(loadJsonFileArg(args.file), {\n customValueParameters: Object.keys(customValueParameters).length > 0 ? customValueParameters : undefined,\n dynamicValueParameters: Object.keys(dynamicValueParameters).length > 0 ? dynamicValueParameters : undefined,\n });\n}\n\nexport const campaignsUrlParamsCommand = defineCommand({\n meta: {\n name: \"url-params\",\n description: `Stage the URL tracking parameters on an ad set — LinkedIn appends them to the link of EVERY ad in it, including ads already running. ${STAGED_NOTE}\n\nStart here: set UTMs at this level, not per ad. A per-ad landing URL is only for a genuinely different destination — LinkedIn appends the ad set's parameters on top of whatever the ad's own URL carries, so the same key set in both places lands twice.\n\nThis REPLACES the ad set's whole parameter set — LinkedIn does not merge. Read what it carries first (\\`baker ads linkedin url-params --campaign-ids <ad-set-id>\\`) and re-send every pair that should survive; the drop is otherwise silent until traffic stops being attributable.\n\nValues LinkedIn fills in per ad (--dynamic): ACCOUNT_ID, ACCOUNT_NAME, CAMPAIGN_GROUP_ID, CAMPAIGN_GROUP_NAME, CAMPAIGN_ID, CAMPAIGN_NAME, CREATIVE_ID, CREATIVE_NAME.\n\nExamples:\n baker ads linkedin campaigns url-params 123456 --param \"utm_source=linkedin&utm_medium=paid-social\" --dynamic utm_campaign=CAMPAIGN_NAME --dynamic utm_content=CREATIVE_ID\n baker ads linkedin campaigns url-params 123456 --param utm_agency=baker\n baker ads linkedin campaigns url-params 123456 --clear`,\n },\n args: {\n id: { type: \"positional\", description: \"Ad set (campaign) id or URN\", required: true },\n ...accountArgs,\n param: {\n type: \"string\",\n description: 'Fixed key=value, repeatable or &-joined (e.g. --param \"utm_source=linkedin&utm_medium=paid\")',\n },\n dynamic: {\n type: \"string\",\n description: \"key=PLACEHOLDER LinkedIn fills in per ad, repeatable (e.g. --dynamic utm_campaign=CAMPAIGN_NAME)\",\n },\n clear: { type: \"boolean\", description: \"Remove every tracking parameter from this ad set\" },\n file: { type: \"string\", description: \"JSON file with the full payload; flags override file keys\" },\n },\n run: async ({ args, rawArgs }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n await stageOp({\n kind: \"trackingParams.set\",\n accountId,\n target: requireTarget(args as Record<string, unknown>, \"ad set\"),\n payload: trackingParamsPayload(args as Record<string, unknown>, rawArgs),\n });\n },\n});\n\n/**\n * The same parameters, one level up. The target is built from the RESOLVED\n * account rather than taken as a positional: `trackingParamsLevel` reads a bare\n * numeric id as an ad set, so an account id typed bare would silently stage an\n * ad-set write — and this command has no ad set to name.\n */\n/**\n * The op target for an account-level set. Built from the account the command\n * already resolved, never from a positional: `--account-id` accepts the URN\n * form too, so composing the prefix without stripping it first would produce\n * `urn:li:sponsoredAccount:urn:li:sponsoredAccount:N` and 400 at publish.\n */\nexport function accountTrackingTarget(args: Record<string, unknown>): { accountId: string; target: string } {\n const accountId = bareAccountId(args);\n return { accountId, target: `urn:li:sponsoredAccount:${accountId}` };\n}\n\nexport const accountUrlParamsCommand = defineCommand({\n meta: {\n name: \"url-params\",\n description: `Stage the URL tracking parameters on the whole AD ACCOUNT — LinkedIn appends them to the link of every ad in every ad set, including ads already running. ${STAGED_NOTE}\n\nUse this for the parameters that never vary across the account (utm_source, utm_medium, an agency tag). Anything that identifies a specific ad set belongs on the ad set (\\`campaigns url-params\\`) — LinkedIn appends BOTH levels, so a key set in both places lands in the URL twice.\n\nThis REPLACES the account's whole parameter set — LinkedIn does not merge. Read what it carries first with \\`baker ads linkedin url-params\\` and re-send every pair that should survive.\n\nValues LinkedIn fills in per ad (--dynamic): ACCOUNT_ID, ACCOUNT_NAME, CAMPAIGN_GROUP_ID, CAMPAIGN_GROUP_NAME, CAMPAIGN_ID, CAMPAIGN_NAME, CREATIVE_ID, CREATIVE_NAME.\n\nExamples:\n baker ads linkedin account url-params --param \"utm_source=linkedin&utm_medium=paid_social\"\n baker ads linkedin account url-params --param utm_source=linkedin --dynamic utm_campaign=CAMPAIGN_NAME\n baker ads linkedin account url-params --clear`,\n },\n args: {\n ...accountArgs,\n param: {\n type: \"string\",\n description: 'Fixed key=value, repeatable or &-joined (e.g. --param \"utm_source=linkedin&utm_medium=paid\")',\n },\n dynamic: {\n type: \"string\",\n description: \"key=PLACEHOLDER LinkedIn fills in per ad, repeatable (e.g. --dynamic utm_campaign=CAMPAIGN_NAME)\",\n },\n clear: { type: \"boolean\", description: \"Remove every tracking parameter set on the ad account\" },\n file: { type: \"string\", description: \"JSON file with the full payload; flags override file keys\" },\n },\n run: async ({ args, rawArgs }) => {\n const { accountId, target } = accountTrackingTarget(args as Record<string, unknown>);\n await stageOp({\n kind: \"trackingParams.set\",\n accountId,\n target,\n payload: trackingParamsPayload(args as Record<string, unknown>, rawArgs),\n });\n },\n});\n\nexport const campaignsPauseCommand = statusSugarCommand(\"campaigns\", \"campaign.update\", \"pause\");\nexport const campaignsResumeCommand = statusSugarCommand(\"campaigns\", \"campaign.update\", \"resume\");\nexport const campaignsArchiveCommand = statusSugarCommand(\"campaigns\", \"campaign.update\", \"archive\");\nexport const campaignGroupsPauseCommand = statusSugarCommand(\"campaign-groups\", \"campaignGroup.update\", \"pause\");\nexport const campaignGroupsResumeCommand = statusSugarCommand(\"campaign-groups\", \"campaignGroup.update\", \"resume\");\nexport const creativesPauseCommand = statusSugarCommand(\"creatives\", \"creative.update\", \"pause\");\nexport const creativesResumeCommand = statusSugarCommand(\"creatives\", \"creative.update\", \"resume\");\n\nfunction duplicateCommand(entity: \"campaignGroup\" | \"campaign\" | \"creative\", cliGroup: string) {\n return defineCommand({\n meta: {\n name: \"duplicate\",\n description: `Stage a copy of an existing ${entity} as a new DRAFT create (playbook: duplicate, never link-to-original). ${STAGED_NOTE}\nExample: baker ads linkedin ${cliGroup} duplicate 123456 --name \"New variant\"`,\n },\n args: {\n id: { type: \"positional\", description: \"Source id or URN\", required: true },\n ...accountArgs,\n name: { type: \"string\", description: \"Name for the copy\" },\n file: { type: \"string\", description: \"JSON file with field overrides for the copy\" },\n },\n run: async ({ args }) => {\n try {\n const chatId = requireChatId();\n const overrides = mergePayload(loadJsonFileArg(args.file), { name: args.name });\n const response = await apiPost<{ ok: true; data: LinkedinDraftStageResponse }>(\n \"/api/ads/linkedin/draft/duplicate\",\n {\n chatId,\n accountId: bareAccountId(args as Record<string, unknown>),\n entity,\n sourceId: requireTarget(args as Record<string, unknown>, entity),\n ...(Object.keys(overrides).length > 0 ? { overrides } : {}),\n },\n );\n writeJsonEnvelope(response);\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n });\n}\n\nexport const campaignsDuplicateCommand = duplicateCommand(\"campaign\", \"campaigns\");\nexport const campaignGroupsDuplicateCommand = duplicateCommand(\"campaignGroup\", \"campaign-groups\");\n\nexport const creativesDuplicateCommand = defineCommand({\n meta: {\n name: \"duplicate\",\n description: `Stage a copy of an existing ad, optionally with new content. ${STAGED_NOTE}\nContent flags only apply to direct-content ads (text|spotlight|follower|jobs) — LinkedIn makes their content immutable, so a copy is how their copy/media/URL changes. Post-based ads (image|video|carousel|document|article|event|tla) sponsor a post that owns the copy, media and destination: a copy re-sponsors the SAME post, so content flags are rejected — stage \\`creatives create\\` with the new content instead, then pause the old ad.\n--replace also pauses the original once the new ad publishes (skipped if the new ad fails).\nExamples:\n baker ads linkedin creatives duplicate 1458413484 --headline \"10x Demos, Same Team\" --description \"AI handles every demo request.\" --replace\n baker ads linkedin creatives duplicate urn:li:sponsoredCreative:789 --campaign 799305464`,\n },\n args: {\n id: { type: \"positional\", description: \"Source creative id or URN\", required: true },\n ...accountArgs,\n campaign: { type: \"string\", description: \"Stage the copy under a different ad set (id/URN or li_temp_*)\" },\n \"intended-status\": {\n type: \"string\",\n description: \"Status for the copy (default DRAFT; with --replace, the source's status)\",\n },\n replace: {\n type: \"boolean\",\n description: \"Also pause the original once the new ad publishes; the copy inherits the source's status\",\n },\n intro: { type: \"string\", description: \"New commentary / intro text\" },\n headline: { type: \"string\", description: \"New headline\" },\n description: { type: \"string\", description: \"New description (text/spotlight ads)\" },\n \"landing-url\": {\n type: \"string\",\n description: \"New https destination URL (direct-content ads only — a post-based ad's URL lives in its post)\",\n },\n cta: { type: \"string\", description: \"New CTA (LEARN_MORE|REQUEST_DEMO|…)\" },\n \"cta-label\": { type: \"string\", description: \"Spotlight custom CTA label\" },\n \"image-id\": { type: \"string\", description: \"Baker image library id\" },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\" },\n \"video-id\": {\n type: \"string\",\n description: \"Baker video library id — not sent to LinkedIn yet; staging refuses it, use --video-urn\",\n },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\" },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for the logo\" },\n title: { type: \"string\", description: \"Media title\" },\n file: { type: \"string\", description: \"JSON file with field overrides for the copy\" },\n },\n run: async ({ args }) => {\n try {\n const chatId = requireChatId();\n const file = loadJsonFileArg(args.file);\n const fileContent =\n file.content !== null && typeof file.content === \"object\" && !Array.isArray(file.content)\n ? (file.content as Record<string, unknown>)\n : {};\n const content = { ...fileContent, ...creativeContentPatch(args as Record<string, unknown>) };\n const overrides = mergePayload(file, {\n campaign: args.campaign,\n intendedStatus: args[\"intended-status\"] ? String(args[\"intended-status\"]).toUpperCase() : undefined,\n content: Object.keys(content).length > 0 ? content : undefined,\n });\n const response = await apiPost<{ ok: true; data: LinkedinDraftStageResponse }>(\n \"/api/ads/linkedin/draft/duplicate\",\n {\n chatId,\n accountId: bareAccountId(args as Record<string, unknown>),\n entity: \"creative\",\n sourceId: requireTarget(args as Record<string, unknown>, \"creative\"),\n ...(Object.keys(overrides).length > 0 ? { overrides } : {}),\n ...(args.replace ? { replace: true } : {}),\n },\n );\n writeJsonEnvelope(response);\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\n// --- Creatives ---\n\nconst CREATIVE_FORMATS = [\n \"image\",\n \"video\",\n \"text\",\n \"spotlight\",\n \"follower\",\n \"document\",\n \"carousel\",\n \"conversation\",\n \"tla\",\n \"jobs\",\n \"event\",\n \"article\",\n] as const;\n\nexport const creativesCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new creative (ad). ${STAGED_NOTE}\nFormats: ${CREATIVE_FORMATS.join(\"|\")}. Media comes from the Baker library (--image-id / --video-id from \\`baker images\\`/\\`baker videos\\`) or as LinkedIn URNs. Complex formats (carousel, jobs) take --file with the full content object. Conversation ads take --file with the message flow ({message: {subject, body, buttons[]}} — buttons NESTED|LANDING_PAGE, nested messages recurse).\nExamples:\n baker ads linkedin creatives create --campaign li_temp_x2 --format image --image-id <bakerImageId> --intro \"Meet the platform…\" --headline \"Book a demo\" --landing-url https://example.com/demo --cta REQUEST_DEMO\n baker ads linkedin creatives create --campaign 123456 --format tla --post-urn urn:li:ugcPost:789`,\n },\n args: {\n ...accountArgs,\n campaign: { type: \"string\", description: \"Campaign id/URN, or li_temp_* ref staged in this chat\" },\n format: { type: \"string\", description: CREATIVE_FORMATS.join(\"|\") },\n \"image-id\": { type: \"string\", description: \"Baker image library id (uploaded to LinkedIn at publish)\" },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\" },\n \"video-id\": {\n type: \"string\",\n description: \"Baker video library id — not sent to LinkedIn yet; staging refuses it, use --video-urn\",\n },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\" },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for logo (text/spotlight/follower/jobs)\" },\n intro: { type: \"string\", description: \"Commentary / intro text (≤600 chars before feed truncation)\" },\n headline: { type: \"string\", description: \"Headline (≤70; text ads ≤25)\" },\n description: { type: \"string\", description: \"Description (text ads ≤75, spotlight ≤70)\" },\n \"landing-url\": { type: \"string\", description: \"https destination URL\" },\n cta: { type: \"string\", description: \"LEARN_MORE|REQUEST_DEMO|SIGN_UP|REGISTER|DOWNLOAD|…\" },\n \"cta-label\": { type: \"string\", description: \"Spotlight custom CTA label (≤18 chars)\" },\n \"post-urn\": { type: \"string\", description: \"TLA: existing post to sponsor (urn:li:share|ugcPost:*)\" },\n \"event-urn\": { type: \"string\", description: \"Event ads: the LinkedIn event to sponsor (urn:li:event:*)\" },\n \"article-url\": { type: \"string\", description: \"Article ads: https URL of the article/newsletter to sponsor\" },\n \"thumbnail-image-id\": { type: \"string\", description: \"Article ads: Baker image id for the link thumbnail\" },\n \"thumbnail-urn\": { type: \"string\", description: \"Article ads: existing urn:li:image:* thumbnail\" },\n \"intended-status\": { type: \"string\", description: \"DRAFT|ACTIVE|PAUSED (default DRAFT)\" },\n title: { type: \"string\", description: \"Media title (image/video) or article title\" },\n file: { type: \"string\", description: \"JSON file with the full content object; flags override\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n if (!args.campaign) {\n failWriteValidation(\"--campaign is required (id, URN, or li_temp_* ref)\");\n }\n const format = args.format ? String(args.format) : undefined;\n if (!format || !CREATIVE_FORMATS.includes(format as (typeof CREATIVE_FORMATS)[number])) {\n failWriteValidation(`--format must be one of ${CREATIVE_FORMATS.join(\"|\")}`);\n }\n const content = mergePayload(loadJsonFileArg(args.file), {\n format,\n commentary: args.intro,\n imageId: args[\"image-id\"],\n imageUrn: args[\"image-urn\"],\n videoId: args[\"video-id\"],\n videoUrn: args[\"video-urn\"],\n logoImageId: args[\"logo-image-id\"],\n headline: args.headline,\n description: args.description,\n landingUrl: args[\"landing-url\"],\n cta: args.cta ? String(args.cta).toUpperCase() : undefined,\n ctaLabel: args[\"cta-label\"],\n postUrn: args[\"post-urn\"],\n eventUrn: args[\"event-urn\"],\n source: args[\"article-url\"],\n thumbnailImageId: args[\"thumbnail-image-id\"],\n thumbnailUrn: args[\"thumbnail-urn\"],\n mediaTitle: args.title,\n title: args.title,\n });\n await stageOp({\n kind: \"creative.create\",\n accountId,\n payload: {\n campaign: args.campaign,\n intendedStatus: args[\"intended-status\"] ? String(args[\"intended-status\"]).toUpperCase() : undefined,\n content,\n },\n });\n },\n});\n\n/** Content fields `creatives update` can amend on a li_temp_* staged creative. */\nconst CREATIVE_AMEND_CONTENT_FLAGS = [\n [\"intro\", \"commentary\"],\n [\"headline\", \"headline\"],\n [\"description\", \"description\"],\n [\"landing-url\", \"landingUrl\"],\n [\"cta-label\", \"ctaLabel\"],\n [\"image-id\", \"imageId\"],\n [\"image-urn\", \"imageUrn\"],\n [\"video-id\", \"videoId\"],\n [\"video-urn\", \"videoUrn\"],\n [\"logo-image-id\", \"logoImageId\"],\n [\"thumbnail-image-id\", \"thumbnailImageId\"],\n [\"thumbnail-urn\", \"thumbnailUrn\"],\n [\"title\", \"title\"],\n] as const;\n\nfunction creativeContentPatch(args: Record<string, unknown>): Record<string, unknown> {\n const patch: Record<string, unknown> = {};\n for (const [flag, key] of CREATIVE_AMEND_CONTENT_FLAGS) {\n if (args[flag] !== undefined) {\n patch[key] = args[flag];\n }\n }\n if (args.cta !== undefined) {\n patch.cta = String(args.cta).toUpperCase();\n }\n return patch;\n}\n\nexport const creativesUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Stage changes to an existing creative, or amend a creative staged in this chat by passing its li_temp_* ref. ${STAGED_NOTE}\nDirect-content ads (text/spotlight/follower/jobs) update copy/media/URL IN PLACE — changed fields merge into the ad's current content. Post-based ads (image/video/carousel/…) sponsor a post that owns the copy, media and destination: neither this command nor \\`creatives duplicate\\` can change it — stage \\`creatives create\\` with the new content, then pause the old ad. Staged creatives (li_temp_*) accept all content flags and re-validate.\nApplies the same change to several ads at once: comma-separate the ids, or pass --ids-file. All of them stage together or none does. Live ids only — a li_temp_* amend has to be its own call.\n--campaign re-parents the ad to a different ad set — LinkedIn has no in-place move API, so this only works while the creative is still staged (li_temp_*); passing it against a live creative id/URN is rejected at stage time.\nExamples:\n baker ads linkedin creatives update 1458423674 --headline \"Sharper headline\" --description \"New copy.\"\n baker ads linkedin creatives update urn:li:sponsoredCreative:789 --intended-status PAUSED\n baker ads linkedin creatives update 1458423674,1458423675,1458423676 --intended-status PAUSED\n baker ads linkedin creatives update --ids-file ads.txt --intended-status PAUSED\n baker ads linkedin creatives update li_temp_x3 --campaign li_temp_x2`,\n },\n args: {\n id: {\n type: \"positional\",\n description:\n \"Creative id/URN — comma-separate several. A li_temp_* ref amends what this chat staged and must be passed on its own.\",\n required: false,\n },\n \"ids-file\": { type: \"string\", description: \"File of creative ids, one per line or comma-separated\" },\n ...accountArgs,\n \"intended-status\": { type: \"string\", description: \"ACTIVE|PAUSED|ARCHIVED|DRAFT\" },\n name: { type: \"string\", description: \"New creative name\" },\n campaign: {\n type: \"string\",\n description: \"Re-parent to a different ad set (id/URN or li_temp_*) — staged creatives only\",\n },\n intro: { type: \"string\", description: \"Commentary / intro text\" },\n headline: { type: \"string\", description: \"New headline\" },\n description: { type: \"string\", description: \"Description (text/spotlight ads)\" },\n \"landing-url\": { type: \"string\", description: \"New https destination URL\" },\n cta: { type: \"string\", description: \"New CTA (LEARN_MORE|REQUEST_DEMO|…)\" },\n \"cta-label\": { type: \"string\", description: \"Spotlight custom CTA label\" },\n \"image-id\": { type: \"string\", description: \"Baker image library id\" },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\" },\n \"video-id\": {\n type: \"string\",\n description: \"Baker video library id — not sent to LinkedIn yet; staging refuses it, use --video-urn\",\n },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\" },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for the logo\" },\n \"thumbnail-image-id\": { type: \"string\", description: \"Baker image id for the article thumbnail\" },\n \"thumbnail-urn\": { type: \"string\", description: \"Existing urn:li:image:* thumbnail\" },\n title: { type: \"string\", description: \"Media or article title\" },\n file: { type: \"string\", description: \"JSON file with fields to change; flags override file keys\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const targets = requireTargets(args as Record<string, unknown>, \"creative\");\n const file = loadJsonFileArg(args.file);\n const contentPatch = creativeContentPatch(args as Record<string, unknown>);\n const intendedStatus = args[\"intended-status\"] ? String(args[\"intended-status\"]).toUpperCase() : undefined;\n const fileContent =\n file.content !== null && typeof file.content === \"object\" && !Array.isArray(file.content)\n ? (file.content as Record<string, unknown>)\n : {};\n const content = { ...fileContent, ...contentPatch };\n const payload = mergePayload(file, {\n intendedStatus,\n name: args.name,\n campaign: args.campaign,\n content: Object.keys(content).length > 0 ? content : undefined,\n });\n await stageLinkedinOps(targets.map((target) => ({ kind: \"creative.update\", accountId, target, payload })));\n },\n});\n\n// --- Audiences ---\n\nconst AUDIENCE_TYPES = [\"company-list\", \"user-list\", \"retargeting\", \"engagement\"] as const;\nconst INLINE_ROWS_MAX = 10_000;\n\nconst audiencesCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new matched audience. ${STAGED_NOTE}\nList audiences take --list-file (CSV: companyName,domain,organizationUrn for companies — organizationUrn matches the company page exactly; email,… for contacts — emails are SHA-256 hashed locally). LinkedIn needs 300+ MATCHED members to serve.\nExample: baker ads linkedin audiences create --name \"ABM Tier-1\" --type company-list --list-file accounts.csv`,\n },\n args: {\n ...accountArgs,\n name: { type: \"string\", description: \"Audience name (≤100 chars)\" },\n type: { type: \"string\", description: AUDIENCE_TYPES.join(\"|\") },\n \"list-file\": { type: \"string\", description: \"CSV file with the list rows (header row required)\" },\n file: {\n type: \"string\",\n description:\n 'JSON file with a raw source config (retargeting/engagement) — sourcePlatform, type USER and at least one engagementRules entry, e.g. {\"sourcePlatform\":\"VIDEO_ADS\",\"type\":\"USER\",\"engagementRules\":[{\"engagementSource\":\"urn:li:sponsoredCampaign:123\",\"engagementTrigger\":\"urn:li:dmpEngagementTrigger:(urn:li:dmpEngagementSourceType:VIDEO_ADS,FIRST_QUARTILE)\",\"timeFrame\":{\"timeSpan\":{\"duration\":90,\"unit\":\"DAY\"}}}]}',\n },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const list = parseListFileArg(args[\"list-file\"], INLINE_ROWS_MAX);\n const raw = args.file ? loadJsonFileArg(args.file) : undefined;\n await stageOp({\n kind: \"audience.create\",\n accountId,\n payload: {\n name: args.name,\n audienceType: args.type,\n ...(list ? { listColumns: list.columns, listRows: list.rows } : {}),\n ...(raw ? { raw } : {}),\n },\n });\n },\n});\n\nconst audiencesUploadCommand = defineCommand({\n meta: {\n name: \"upload\",\n description: `Stage a list upload into an existing audience segment. ${STAGED_NOTE}\nExample: baker ads linkedin audiences upload urn:li:dmpSegment:42 --list-file more-accounts.csv`,\n },\n args: {\n id: { type: \"positional\", description: \"Segment URN/id, or li_temp_* ref staged in this chat\", required: true },\n ...accountArgs,\n \"list-file\": { type: \"string\", description: \"CSV file with the rows to add\", required: true },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const list = parseListFileArg(args[\"list-file\"], INLINE_ROWS_MAX);\n if (!list) {\n failWriteValidation(\"--list-file is required\");\n }\n await stageOp({\n kind: \"audience.uploadList\",\n accountId,\n payload: {\n segment: requireTarget(args as Record<string, unknown>, \"audience segment\"),\n listColumns: list.columns,\n listRows: list.rows,\n },\n });\n },\n});\n\nexport const audiencesCommand = defineCommand({\n meta: {\n name: \"audiences\",\n description:\n \"Stage LinkedIn matched-audience changes (create lists, upload rows). Staged until publish — never hits the API directly.\",\n },\n subCommands: {\n create: audiencesCreateCommand,\n upload: audiencesUploadCommand,\n },\n});\n\n// --- Conversions ---\n\nexport const conversionsCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new conversion rule. ${STAGED_NOTE}\nExample: baker ads linkedin conversions create --name \"Demo booked\" --type LEAD --method INSIGHT_TAG --post-click-window 30 --view-window 7`,\n },\n args: {\n ...accountArgs,\n name: { type: \"string\", description: \"Conversion rule name\" },\n type: {\n type: \"string\",\n description:\n \"Conversion type. Common: LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, SIGN_UP, DOWNLOAD, PURCHASE, KEY_PAGE_VIEW, ADD_TO_CART, BOOK_APPOINTMENT, SUBMIT_APPLICATION, OTHER — `baker schema ads.linkedin.conversions.create` lists all 34\",\n },\n method: { type: \"string\", description: \"INSIGHT_TAG|CONVERSIONS_API\" },\n \"post-click-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days (playbook default 30); 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n },\n \"view-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days (playbook default 7); 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n },\n \"attribution-type\": { type: \"string\", description: \"LAST_TOUCH_BY_CAMPAIGN|LAST_TOUCH_BY_CONVERSION\" },\n \"associate-all-campaigns\": { type: \"boolean\", description: \"Auto-associate with active campaigns\" },\n file: { type: \"string\", description: \"JSON file with the full payload (e.g. urlMatchRuleExpression)\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n type: args.type ? String(args.type).toUpperCase() : undefined,\n conversionMethod: args.method ? String(args.method).toUpperCase() : undefined,\n postClickAttributionWindowSize: args[\"post-click-window\"] ? Number(args[\"post-click-window\"]) : undefined,\n viewThroughAttributionWindowSize: args[\"view-window\"] ? Number(args[\"view-window\"]) : undefined,\n attributionType: args[\"attribution-type\"] ? String(args[\"attribution-type\"]).toUpperCase() : undefined,\n associateAllCampaigns: args[\"associate-all-campaigns\"] === true ? true : undefined,\n });\n await stageOp({ kind: \"conversion.create\", accountId, payload });\n },\n});\n\nexport const conversionsUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Stage changes to a conversion rule (windows, name, enabled). ${STAGED_NOTE}\nExample: baker ads linkedin conversions update 104988516 --post-click-window 30 --view-window 7`,\n },\n args: {\n id: { type: \"positional\", description: \"Conversion rule id or URN\", required: true },\n ...accountArgs,\n name: { type: \"string\", description: \"New name\" },\n \"post-click-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n },\n \"view-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n },\n \"attribution-type\": { type: \"string\", description: \"LAST_TOUCH_BY_CAMPAIGN|LAST_TOUCH_BY_CONVERSION\" },\n enabled: { type: \"string\", description: \"on|off\" },\n file: { type: \"string\", description: \"JSON file with fields to change\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n postClickAttributionWindowSize: args[\"post-click-window\"] ? Number(args[\"post-click-window\"]) : undefined,\n viewThroughAttributionWindowSize: args[\"view-window\"] ? Number(args[\"view-window\"]) : undefined,\n attributionType: args[\"attribution-type\"] ? String(args[\"attribution-type\"]).toUpperCase() : undefined,\n enabled: parseOnOffFlag(args.enabled, \"--enabled\"),\n });\n await stageOp({\n kind: \"conversion.update\",\n accountId,\n target: requireTarget(args as Record<string, unknown>, \"conversion rule\"),\n payload,\n });\n },\n});\n\nconst CONVERSION_CAMPAIGN_EXPLAINER = `Which ad sets a conversion rule counts for is a separate LinkedIn record, not a field on the rule — \\`conversions update\\` cannot change it, and \\`--associate-all-campaigns\\` only exists on create.`;\n\nfunction conversionCampaignArgs() {\n return {\n id: { type: \"positional\" as const, description: \"Conversion rule id or URN\", required: true },\n ...accountArgs,\n campaign: { type: \"string\" as const, description: \"Ad set (campaign) id or URN\", required: true },\n };\n}\n\nfunction requireCampaignArg(args: Record<string, unknown>): string {\n const campaign = args.campaign;\n if (typeof campaign !== \"string\" || campaign.length === 0) {\n failWriteValidation(\"--campaign is required — pass the ad set id or URN this conversion should count for\");\n }\n return campaign as string;\n}\n\nexport const conversionsAssociateCommand = defineCommand({\n meta: {\n name: \"associate-campaign\",\n description: `Count an existing conversion rule for one ad set. ${STAGED_NOTE}\n${CONVERSION_CAMPAIGN_EXPLAINER}\nExample: baker ads linkedin conversions associate-campaign 104988516 --campaign 337643194`,\n },\n args: conversionCampaignArgs(),\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n await stageOp({\n kind: \"conversion.associateCampaign\",\n accountId,\n target: requireTarget(args as Record<string, unknown>, \"conversion rule\"),\n payload: { campaign: requireCampaignArg(args as Record<string, unknown>) },\n });\n },\n});\n\nexport const conversionsDissociateCommand = defineCommand({\n meta: {\n name: \"dissociate-campaign\",\n description: `Stop counting an existing conversion rule for one ad set. ${STAGED_NOTE}\n${CONVERSION_CAMPAIGN_EXPLAINER}\nExample: baker ads linkedin conversions dissociate-campaign 104988516 --campaign 337643194`,\n },\n args: conversionCampaignArgs(),\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n await stageOp({\n kind: \"conversion.dissociateCampaign\",\n accountId,\n target: requireTarget(args as Record<string, unknown>, \"conversion rule\"),\n payload: { campaign: requireCampaignArg(args as Record<string, unknown>) },\n });\n },\n});\n\n// --- Lead gen forms (file-first — deeply nested) ---\n\nconst leadFormsCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new Lead Gen Form from a JSON file. ${STAGED_NOTE}\nRequired: name, headline (≤60), privacyPolicyUrl, questions[] (≤12; playbook: ≤4 for completion).\nEach question is a predefined profile field ({ name, predefinedField: \"EMAIL\" }) or a custom question ({ name, questionType: \"MULTIPLE_CHOICE\", options: [...] }; ≤3 custom).\nBest-practice fields the preview will nudge for if missing: 1-3 qualifying questions, consents[] (disclosure checkboxes), thankYou.message + thankYou.landingUrl|appointmentUrl.\nAlso supported: locale, formImageId|formImageUrn, hiddenFields[], legalDisclaimer, thankYou.cta. Example: baker ads linkedin lead-forms create --file form.json`,\n },\n args: {\n ...accountArgs,\n file: { type: \"string\", description: \"JSON file with the form definition\", required: true },\n name: { type: \"string\", description: \"Override the form name\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const payload = mergePayload(loadJsonFileArg(args.file), { name: args.name });\n await stageOp({ kind: \"leadForm.create\", accountId, payload });\n },\n});\n\nconst leadFormsUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Stage changes to a Lead Gen Form from a JSON file. ${STAGED_NOTE}`,\n },\n args: {\n id: { type: \"positional\", description: \"Lead form id or URN\", required: true },\n ...accountArgs,\n file: { type: \"string\", description: \"JSON file with the fields to change\", required: true },\n name: { type: \"string\", description: \"New form name\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const payload = mergePayload({ raw: loadJsonFileArg(args.file) }, { name: args.name });\n await stageOp({\n kind: \"leadForm.update\",\n accountId,\n target: requireTarget(args as Record<string, unknown>, \"lead form\"),\n payload,\n });\n },\n});\n\nexport const leadFormsCommand = defineCommand({\n meta: {\n name: \"lead-forms\",\n description:\n \"Stage LinkedIn Lead Gen Form changes (file-first). Staged until publish — never hits the API directly.\",\n },\n subCommands: {\n create: leadFormsCreateCommand,\n update: leadFormsUpdateCommand,\n },\n});\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koda-sl/baker-cli",
3
- "version": "0.486.0",
3
+ "version": "0.487.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/linkedin/write-commands.ts"],"sourcesContent":["import {\n campaignExcludeCompaniesSchema,\n type LinkedinDraftStageResponse,\n type LinkedinTrackingParamDynamicValue,\n TEMP_REF_PREFIX,\n TRACKING_PARAM_DYNAMIC_VALUES,\n} from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { requireChatId } from \"../../../env.ts\";\nimport { repeatedValues } from \"../../../lib/repeatedFlags.ts\";\nimport { writeJsonEnvelope } from \"../output.ts\";\nimport { handleLinkedinError } from \"./shared.ts\";\nimport {\n bareAccountId,\n failWriteValidation,\n loadJsonFileArg,\n loadTargetingFileArg,\n mergePayload,\n parseDateFlag,\n parseListFileArg,\n parseLocaleFlag,\n parseMoneyFlag,\n parseOnOffFlag,\n requireTarget,\n requireTargets,\n stageLinkedinOps,\n stageOp,\n stageStatusChange,\n TOTAL_BUDGET_HELP,\n} from \"./write-shared.ts\";\n\n/**\n * Staged write subcommands. None of these touch the LinkedIn API — they stage\n * ops on this chat's draft; ops appear in the dashboard as pending LinkedIn\n * changes and apply when the chat is published. Review with\n * `baker ads linkedin draft`, undo with `draft remove <ref>`.\n */\n\nconst STAGED_NOTE = \"Staged until publish — review with `baker ads linkedin draft`.\";\n\nconst accountArgs = {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n} as const;\n\nfunction runScheduleFromFlags(args: Record<string, unknown>): { start?: number; end?: number } | undefined {\n const start = parseDateFlag(args.start, \"--start\");\n const end = parseDateFlag(args.end, \"--end\");\n if (start === undefined && end === undefined) {\n return undefined;\n }\n return { ...(start !== undefined ? { start } : {}), ...(end !== undefined ? { end } : {}) };\n}\n\n// --- Campaign groups ---\n\nexport const campaignGroupsCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new campaign group. ${STAGED_NOTE}\nA group can't be created PAUSED, and a --total-budget needs an --end.\nExample: baker ads linkedin campaign-groups create --name \"Q3 ABM\" --start 2026-07-10 --end 2026-09-30 --total-budget 5000 --currency EUR`,\n },\n args: {\n ...accountArgs,\n name: { type: \"string\", description: \"Campaign group name (≤100 chars)\" },\n start: { type: \"string\", description: \"Run schedule start (ISO date or epoch ms)\" },\n end: { type: \"string\", description: \"Run schedule end\" },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP },\n currency: { type: \"string\", description: \"3-letter currency code (defaults to the ad account currency)\" },\n status: {\n type: \"string\",\n description:\n \"DRAFT|ACTIVE (default DRAFT) — LinkedIn refuses a new group created PAUSED; pause it once it exists\",\n },\n file: { type: \"string\", description: \"JSON file with the full payload; flags override file keys\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n runSchedule: runScheduleFromFlags(args as Record<string, unknown>),\n totalBudget: parseMoneyFlag(args[\"total-budget\"], args.currency, \"--total-budget\"),\n status: args.status ? String(args.status).toUpperCase() : undefined,\n });\n await stageOp({ kind: \"campaignGroup.create\", accountId, payload });\n },\n});\n\nexport const campaignGroupsUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Stage changes to an existing campaign group. ${STAGED_NOTE}\nPass a li_temp_* ref to amend a group staged in this chat — fields merge into the staged create.\nExample: baker ads linkedin campaign-groups update 635137195 --total-budget 8000 --currency EUR`,\n },\n args: {\n id: { type: \"positional\", description: \"Campaign group id or URN\", required: true },\n ...accountArgs,\n name: { type: \"string\", description: \"New name\" },\n start: { type: \"string\", description: \"New run schedule start\" },\n end: { type: \"string\", description: \"New run schedule end\" },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP },\n currency: { type: \"string\", description: \"3-letter currency code (defaults to the ad account currency)\" },\n status: { type: \"string\", description: \"ACTIVE|PAUSED|ARCHIVED|…\" },\n file: { type: \"string\", description: \"JSON file with fields to change\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n runSchedule: runScheduleFromFlags(args as Record<string, unknown>),\n totalBudget: parseMoneyFlag(args[\"total-budget\"], args.currency, \"--total-budget\"),\n status: args.status ? String(args.status).toUpperCase() : undefined,\n });\n await stageOp({\n kind: \"campaignGroup.update\",\n accountId,\n target: requireTarget(args as Record<string, unknown>, \"campaign group\"),\n payload,\n });\n },\n});\n\n// --- Campaigns ---\n\nfunction campaignPayloadFromFlags(args: Record<string, unknown>): Record<string, unknown> {\n return {\n name: args.name,\n campaignGroup: args.group,\n type: args.type ? String(args.type).toUpperCase() : undefined,\n objectiveType: args.objective ? String(args.objective).toUpperCase() : undefined,\n costType: args[\"cost-type\"] ? String(args[\"cost-type\"]).toUpperCase() : undefined,\n unitCost: parseMoneyFlag(args.bid, args.currency, \"--bid\"),\n dailyBudget: parseMoneyFlag(args[\"daily-budget\"], args.currency, \"--daily-budget\"),\n totalBudget: parseMoneyFlag(args[\"total-budget\"], args.currency, \"--total-budget\"),\n runSchedule: runScheduleFromFlags(args),\n locale: parseLocaleFlag(args.locale),\n targetingCriteria: loadTargetingFileArg(args[\"targeting-file\"]),\n audienceExpansionEnabled: parseOnOffFlag(args[\"audience-expansion\"], \"--audience-expansion\"),\n offsiteDeliveryEnabled: parseOnOffFlag(args.lan, \"--lan\"),\n connectedTelevisionOnly: parseOnOffFlag(args.ctv, \"--ctv\"),\n creativeSelection: args[\"creative-selection\"] ? String(args[\"creative-selection\"]).toUpperCase() : undefined,\n associatedEntity: args[\"associated-entity\"],\n politicalIntent: args[\"political-intent\"] ? String(args[\"political-intent\"]).toUpperCase() : undefined,\n status: args.status ? String(args.status).toUpperCase() : undefined,\n };\n}\n\nconst POLITICAL_INTENT_HELP =\n 'NOT_DECLARED (default)|NOT_POLITICAL|POLITICAL — the advertiser\\'s own declaration. Pass NOT_POLITICAL only after the user confirms: \"I confirm this is not political advertising. None of my ads qualify as political advertising under the law of the targeted countries, including EU law for ads targeted to the EU.\"';\n\nconst campaignFlagArgs = {\n ...accountArgs,\n name: { type: \"string\", description: \"Campaign name (≤255 chars)\" },\n group: { type: \"string\", description: \"Campaign group id/URN, or li_temp_* ref staged in this chat\" },\n type: { type: \"string\", description: \"SPONSORED_UPDATES|TEXT_AD|SPONSORED_INMAILS|DYNAMIC\" },\n objective: { type: \"string\", description: \"e.g. LEAD_GENERATION, WEBSITE_VISIT, BRAND_AWARENESS\" },\n \"cost-type\": { type: \"string\", description: \"CPC|CPM|CPV\" },\n bid: { type: \"string\", description: \"Manual bid (unitCost) — playbook mandates manual bidding\" },\n \"daily-budget\": { type: \"string\", description: \"Daily budget amount\" },\n \"total-budget\": { type: \"string\", description: TOTAL_BUDGET_HELP },\n currency: { type: \"string\", description: \"3-letter currency code (defaults to the ad account currency)\" },\n start: { type: \"string\", description: \"Run schedule start (ISO date or epoch ms)\" },\n end: { type: \"string\", description: \"Run schedule end\" },\n locale: { type: \"string\", description: \"Profile locale like en_US\" },\n \"targeting-file\": { type: \"string\", description: \"JSON file with targetingCriteria (include.and[].or facets)\" },\n \"audience-expansion\": { type: \"string\", description: \"on|off (playbook: off)\" },\n lan: { type: \"string\", description: \"LinkedIn Audience Network on|off (playbook: off)\" },\n ctv: { type: \"string\", description: \"Connected TV on|off\" },\n \"creative-selection\": { type: \"string\", description: \"OPTIMIZED|ROUND_ROBIN\" },\n \"associated-entity\": { type: \"string\", description: \"Organization URN\" },\n \"political-intent\": { type: \"string\", description: POLITICAL_INTENT_HELP },\n status: { type: \"string\", description: \"DRAFT|ACTIVE|PAUSED — PAUSED needs a group that is not DRAFT\" },\n file: { type: \"string\", description: \"JSON file with the full payload; flags override file keys\" },\n} as const;\n\nexport const campaignsCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new campaign. ${STAGED_NOTE}\nTargeting goes in --targeting-file (facet URNs). --group accepts a li_temp_* ref from a campaign group staged in this chat.\nExample: baker ads linkedin campaigns create --name \"ABM Tier-1\" --group li_temp_x1 --objective WEBSITE_VISIT --type SPONSORED_UPDATES --cost-type CPC --bid 8.50 --daily-budget 75 --currency EUR --locale en_US --targeting-file targeting.json`,\n },\n args: campaignFlagArgs,\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const payload = mergePayload(loadJsonFileArg(args.file), campaignPayloadFromFlags(args as Record<string, unknown>));\n if (payload.locale === undefined) {\n payload.locale = { country: \"US\", language: \"en\" };\n }\n await stageOp({ kind: \"campaign.create\", accountId, payload });\n },\n});\n\n/**\n * `campaigns update`'s flags → payload. Create-only fields (campaignGroup/type/locale/\n * associatedEntity) are not updatable on a LIVE campaign, so they're stripped there; a\n * `li_temp_*` target amends the staged create in place, where those fields are still fair game\n * (the amend path re-validates the merged payload as a full create).\n */\nexport function campaignUpdatePayloadFromFlags(\n args: Record<string, unknown>,\n target: string,\n file: Record<string, unknown>,\n): Record<string, unknown> {\n const flags = campaignPayloadFromFlags(args);\n if (!target.startsWith(TEMP_REF_PREFIX)) {\n flags.campaignGroup = undefined;\n flags.type = undefined;\n flags.locale = undefined;\n flags.associatedEntity = undefined;\n }\n return mergePayload(file, flags);\n}\n\nexport const campaignsUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Stage changes to an existing campaign (budget, bid, targeting, flags, schedule, status). ${STAGED_NOTE}\nPass a li_temp_* ref to amend a campaign staged in this chat — fields merge into the staged create, and --group/--type/--locale/--associated-entity carry through too (they're create-only on a LIVE campaign, but fair game while it's still staged).\nExample: baker ads linkedin campaigns update 123456 --daily-budget 100 --currency EUR --audience-expansion off`,\n },\n args: {\n id: { type: \"positional\", description: \"Campaign id or URN\", required: true },\n ...campaignFlagArgs,\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const target = requireTarget(args as Record<string, unknown>, \"campaign\");\n const payload = campaignUpdatePayloadFromFlags(args as Record<string, unknown>, target, loadJsonFileArg(args.file));\n await stageOp({ kind: \"campaign.update\", accountId, target, payload });\n },\n});\n\nfunction commaList(value: unknown): string[] {\n return typeof value === \"string\"\n ? value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n : [];\n}\n\n/** `--org` takes the bare ids `companies`/`top-companies` print, or full organization URNs. */\nexport function excludeCompaniesPayload(args: Record<string, unknown>): {\n add: { employers?: string[]; segments?: string[] };\n} {\n const employers = commaList(args.org).map((org) => (org.startsWith(\"urn:\") ? org : `urn:li:organization:${org}`));\n const segments = commaList(args.segment);\n return {\n add: {\n ...(employers.length > 0 ? { employers } : {}),\n ...(segments.length > 0 ? { segments } : {}),\n },\n };\n}\n\nconst EXCLUSION_FLAG_BY_FIELD: Record<string, string> = { employers: \"--org\", segments: \"--segment\" };\n\n/**\n * Why these flags cannot stage, in the flags' own words — `--org: 0 is not a\n * LinkedIn company id …` rather than the contract path `payload.add.employers.1`\n * and a pointer at the capabilities catalogue, which is for unknown fields.\n */\nexport function excludeCompaniesRefusal(args: Record<string, unknown>): string | undefined {\n const payload = excludeCompaniesPayload(args);\n if (!payload.add.employers && !payload.add.segments) {\n return \"pass --org and/or --segment — the companies or audiences this ad set should stop reaching\";\n }\n const parsed = campaignExcludeCompaniesSchema.safeParse(payload);\n if (parsed.success) {\n return undefined;\n }\n return parsed.error.issues\n .map((issue) => {\n const flag = EXCLUSION_FLAG_BY_FIELD[String(issue.path[1])];\n return flag ? `${flag}: ${issue.message}` : issue.message;\n })\n .join(\"; \");\n}\n\nexport const campaignsExcludeCompaniesCommand = defineCommand({\n meta: {\n name: \"exclude-companies\",\n description: `Stop an ad set reaching some companies — customers, open deals, competitors. ${STAGED_NOTE}\nAdd-only: adds to the ad set's exclusions and never removes one. At publish Baker re-reads the ad set and merges into its targeting as it stands then, so audience, locations and existing exclusions are kept.\n--org takes company ids (as \\`companies\\` / \\`top-companies\\` print them) or urn:li:organization URNs, comma-separated, up to 200 per call. For a longer list, upload it as a company-list audience and pass it to --segment (an urn:li:dmpSegment/adSegment URN, or a li_temp_* audience staged in this chat).\nExample: baker ads linkedin campaigns exclude-companies 123456 --org 1035,1441`,\n },\n args: {\n id: {\n type: \"positional\",\n description: \"Ad set (campaign) id or URN — must already be on LinkedIn\",\n required: true,\n },\n ...accountArgs,\n org: { type: \"string\", description: \"Company ids or urn:li:organization URNs to exclude, comma-separated\" },\n segment: {\n type: \"string\",\n description:\n \"Matched audiences to exclude, comma-separated: urn:li:dmpSegment:N / urn:li:adSegment:N or a li_temp_* ref\",\n },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const target = requireTarget(args as Record<string, unknown>, \"campaign\");\n const refusal = excludeCompaniesRefusal(args as Record<string, unknown>);\n if (refusal) {\n failWriteValidation(refusal);\n }\n const payload = excludeCompaniesPayload(args as Record<string, unknown>);\n await stageOp({ kind: \"campaign.excludeCompanies\", accountId, target, payload });\n },\n});\n\nfunction statusSugarCommand(\n entity: \"campaign-groups\" | \"campaigns\" | \"creatives\",\n kind: \"campaignGroup.update\" | \"campaign.update\" | \"creative.update\",\n name: \"pause\" | \"resume\" | \"archive\",\n) {\n const status = name === \"pause\" ? \"PAUSED\" : name === \"resume\" ? \"ACTIVE\" : \"ARCHIVED\";\n return defineCommand({\n meta: {\n name,\n description: `Stage a status change to ${status}, for one id or many. ${STAGED_NOTE}\nExamples:\n baker ads linkedin ${entity} ${name} 123456\n baker ads linkedin ${entity} ${name} 123456,123457,123458\n baker ads linkedin ${entity} ${name} --ids-file ids.txt`,\n },\n args: {\n id: { type: \"positional\", description: \"Entity id or URN — comma-separate several\", required: false },\n \"ids-file\": { type: \"string\", description: \"File of ids, one per line or comma-separated\" },\n ...accountArgs,\n },\n run: async ({ args }) => {\n await stageStatusChange({\n kind,\n accountId: bareAccountId(args as Record<string, unknown>),\n targets: requireTargets(args as Record<string, unknown>, entity.replace(/-/g, \" \").replace(/s$/, \"\")),\n status,\n });\n },\n });\n}\n\n// --- Ad set URL tracking parameters ---\n\n/**\n * `--param`/`--dynamic` accept a repeated flag, an `&`-joined query string, or\n * both — agents reach for all three, and the parsed result is identical.\n */\nfunction trackingPairs(value: unknown, flag: string): Array<[string, string]> {\n const raw = value === undefined ? [] : Array.isArray(value) ? value : [value];\n return raw.flatMap((entry) =>\n String(entry)\n .split(\"&\")\n .filter((pair) => pair.length > 0)\n .map((pair): [string, string] => {\n const at = pair.indexOf(\"=\");\n if (at < 1 || at === pair.length - 1) {\n failWriteValidation(`${flag} expects key=value pairs — got \"${pair}\"`);\n }\n return [pair.slice(0, at).trim(), pair.slice(at + 1).trim()];\n }),\n );\n}\n\n/** A value that names one of LinkedIn's placeholders, however the agent wrote it. */\nfunction asDynamicValue(value: string): LinkedinTrackingParamDynamicValue | undefined {\n const bare = value.replace(/^\\{+|\\}+$/g, \"\").toUpperCase();\n return (TRACKING_PARAM_DYNAMIC_VALUES as readonly string[]).includes(bare)\n ? (bare as LinkedinTrackingParamDynamicValue)\n : undefined;\n}\n\n/**\n * `rawArgs` is the command line, and it is what the repeatable flags are read\n * from: citty keeps only a repeated flag's LAST value, so `--param a=1 --param\n * b=2` arrives here as `\"b=2\"`. Since this write REPLACES the entity's whole\n * parameter set, taking it from `args` would stage one pair, report success,\n * and delete the rest at publish.\n */\nexport function trackingParamsPayload(\n args: Record<string, unknown>,\n rawArgs?: readonly string[],\n): Record<string, unknown> {\n if (args.clear) {\n return { dynamicValueParameters: {}, customValueParameters: {} };\n }\n const customValueParameters: Record<string, string> = {};\n for (const [key, value] of trackingPairs(repeatedValues(rawArgs, \"param\", args.param), \"--param\")) {\n if (asDynamicValue(value)) {\n failWriteValidation(\n `--param ${key}=${value} names a value LinkedIn fills in per ad — pass it as --dynamic ${key}=${value.replace(/^\\{+|\\}+$/g, \"\").toUpperCase()}`,\n );\n }\n customValueParameters[key] = value;\n }\n const dynamicValueParameters: Record<string, string> = {};\n for (const [key, value] of trackingPairs(repeatedValues(rawArgs, \"dynamic\", args.dynamic), \"--dynamic\")) {\n const resolved = asDynamicValue(value);\n if (!resolved) {\n failWriteValidation(\n `--dynamic ${key}=${value} is not a value LinkedIn can fill in — use one of ${TRACKING_PARAM_DYNAMIC_VALUES.join(\", \")}, or pass a fixed value with --param`,\n );\n }\n dynamicValueParameters[key] = resolved;\n }\n return mergePayload(loadJsonFileArg(args.file), {\n customValueParameters: Object.keys(customValueParameters).length > 0 ? customValueParameters : undefined,\n dynamicValueParameters: Object.keys(dynamicValueParameters).length > 0 ? dynamicValueParameters : undefined,\n });\n}\n\nexport const campaignsUrlParamsCommand = defineCommand({\n meta: {\n name: \"url-params\",\n description: `Stage the URL tracking parameters on an ad set — LinkedIn appends them to the link of EVERY ad in it, including ads already running. ${STAGED_NOTE}\n\nStart here: set UTMs at this level, not per ad. A per-ad landing URL is only for a genuinely different destination — LinkedIn appends the ad set's parameters on top of whatever the ad's own URL carries, so the same key set in both places lands twice.\n\nThis REPLACES the ad set's whole parameter set — LinkedIn does not merge. Read what it carries first (\\`baker ads linkedin url-params --campaign-ids <ad-set-id>\\`) and re-send every pair that should survive; the drop is otherwise silent until traffic stops being attributable.\n\nValues LinkedIn fills in per ad (--dynamic): ACCOUNT_ID, ACCOUNT_NAME, CAMPAIGN_GROUP_ID, CAMPAIGN_GROUP_NAME, CAMPAIGN_ID, CAMPAIGN_NAME, CREATIVE_ID, CREATIVE_NAME.\n\nExamples:\n baker ads linkedin campaigns url-params 123456 --param \"utm_source=linkedin&utm_medium=paid-social\" --dynamic utm_campaign=CAMPAIGN_NAME --dynamic utm_content=CREATIVE_ID\n baker ads linkedin campaigns url-params 123456 --param utm_agency=baker\n baker ads linkedin campaigns url-params 123456 --clear`,\n },\n args: {\n id: { type: \"positional\", description: \"Ad set (campaign) id or URN\", required: true },\n ...accountArgs,\n param: {\n type: \"string\",\n description: 'Fixed key=value, repeatable or &-joined (e.g. --param \"utm_source=linkedin&utm_medium=paid\")',\n },\n dynamic: {\n type: \"string\",\n description: \"key=PLACEHOLDER LinkedIn fills in per ad, repeatable (e.g. --dynamic utm_campaign=CAMPAIGN_NAME)\",\n },\n clear: { type: \"boolean\", description: \"Remove every tracking parameter from this ad set\" },\n file: { type: \"string\", description: \"JSON file with the full payload; flags override file keys\" },\n },\n run: async ({ args, rawArgs }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n await stageOp({\n kind: \"trackingParams.set\",\n accountId,\n target: requireTarget(args as Record<string, unknown>, \"ad set\"),\n payload: trackingParamsPayload(args as Record<string, unknown>, rawArgs),\n });\n },\n});\n\n/**\n * The same parameters, one level up. The target is built from the RESOLVED\n * account rather than taken as a positional: `trackingParamsLevel` reads a bare\n * numeric id as an ad set, so an account id typed bare would silently stage an\n * ad-set write — and this command has no ad set to name.\n */\n/**\n * The op target for an account-level set. Built from the account the command\n * already resolved, never from a positional: `--account-id` accepts the URN\n * form too, so composing the prefix without stripping it first would produce\n * `urn:li:sponsoredAccount:urn:li:sponsoredAccount:N` and 400 at publish.\n */\nexport function accountTrackingTarget(args: Record<string, unknown>): { accountId: string; target: string } {\n const accountId = bareAccountId(args);\n return { accountId, target: `urn:li:sponsoredAccount:${accountId}` };\n}\n\nexport const accountUrlParamsCommand = defineCommand({\n meta: {\n name: \"url-params\",\n description: `Stage the URL tracking parameters on the whole AD ACCOUNT — LinkedIn appends them to the link of every ad in every ad set, including ads already running. ${STAGED_NOTE}\n\nUse this for the parameters that never vary across the account (utm_source, utm_medium, an agency tag). Anything that identifies a specific ad set belongs on the ad set (\\`campaigns url-params\\`) — LinkedIn appends BOTH levels, so a key set in both places lands in the URL twice.\n\nThis REPLACES the account's whole parameter set — LinkedIn does not merge. Read what it carries first with \\`baker ads linkedin url-params\\` and re-send every pair that should survive.\n\nValues LinkedIn fills in per ad (--dynamic): ACCOUNT_ID, ACCOUNT_NAME, CAMPAIGN_GROUP_ID, CAMPAIGN_GROUP_NAME, CAMPAIGN_ID, CAMPAIGN_NAME, CREATIVE_ID, CREATIVE_NAME.\n\nExamples:\n baker ads linkedin account url-params --param \"utm_source=linkedin&utm_medium=paid_social\"\n baker ads linkedin account url-params --param utm_source=linkedin --dynamic utm_campaign=CAMPAIGN_NAME\n baker ads linkedin account url-params --clear`,\n },\n args: {\n ...accountArgs,\n param: {\n type: \"string\",\n description: 'Fixed key=value, repeatable or &-joined (e.g. --param \"utm_source=linkedin&utm_medium=paid\")',\n },\n dynamic: {\n type: \"string\",\n description: \"key=PLACEHOLDER LinkedIn fills in per ad, repeatable (e.g. --dynamic utm_campaign=CAMPAIGN_NAME)\",\n },\n clear: { type: \"boolean\", description: \"Remove every tracking parameter set on the ad account\" },\n file: { type: \"string\", description: \"JSON file with the full payload; flags override file keys\" },\n },\n run: async ({ args, rawArgs }) => {\n const { accountId, target } = accountTrackingTarget(args as Record<string, unknown>);\n await stageOp({\n kind: \"trackingParams.set\",\n accountId,\n target,\n payload: trackingParamsPayload(args as Record<string, unknown>, rawArgs),\n });\n },\n});\n\nexport const campaignsPauseCommand = statusSugarCommand(\"campaigns\", \"campaign.update\", \"pause\");\nexport const campaignsResumeCommand = statusSugarCommand(\"campaigns\", \"campaign.update\", \"resume\");\nexport const campaignsArchiveCommand = statusSugarCommand(\"campaigns\", \"campaign.update\", \"archive\");\nexport const campaignGroupsPauseCommand = statusSugarCommand(\"campaign-groups\", \"campaignGroup.update\", \"pause\");\nexport const campaignGroupsResumeCommand = statusSugarCommand(\"campaign-groups\", \"campaignGroup.update\", \"resume\");\nexport const creativesPauseCommand = statusSugarCommand(\"creatives\", \"creative.update\", \"pause\");\nexport const creativesResumeCommand = statusSugarCommand(\"creatives\", \"creative.update\", \"resume\");\n\nfunction duplicateCommand(entity: \"campaignGroup\" | \"campaign\" | \"creative\", cliGroup: string) {\n return defineCommand({\n meta: {\n name: \"duplicate\",\n description: `Stage a copy of an existing ${entity} as a new DRAFT create (playbook: duplicate, never link-to-original). ${STAGED_NOTE}\nExample: baker ads linkedin ${cliGroup} duplicate 123456 --name \"New variant\"`,\n },\n args: {\n id: { type: \"positional\", description: \"Source id or URN\", required: true },\n ...accountArgs,\n name: { type: \"string\", description: \"Name for the copy\" },\n file: { type: \"string\", description: \"JSON file with field overrides for the copy\" },\n },\n run: async ({ args }) => {\n try {\n const chatId = requireChatId();\n const overrides = mergePayload(loadJsonFileArg(args.file), { name: args.name });\n const response = await apiPost<{ ok: true; data: LinkedinDraftStageResponse }>(\n \"/api/ads/linkedin/draft/duplicate\",\n {\n chatId,\n accountId: bareAccountId(args as Record<string, unknown>),\n entity,\n sourceId: requireTarget(args as Record<string, unknown>, entity),\n ...(Object.keys(overrides).length > 0 ? { overrides } : {}),\n },\n );\n writeJsonEnvelope(response);\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n });\n}\n\nexport const campaignsDuplicateCommand = duplicateCommand(\"campaign\", \"campaigns\");\nexport const campaignGroupsDuplicateCommand = duplicateCommand(\"campaignGroup\", \"campaign-groups\");\n\nexport const creativesDuplicateCommand = defineCommand({\n meta: {\n name: \"duplicate\",\n description: `Stage a copy of an existing ad, optionally with new content. ${STAGED_NOTE}\nContent flags only apply to direct-content ads (text|spotlight|follower|jobs) — LinkedIn makes their content immutable, so a copy is how their copy/media/URL changes. Post-based ads (image|video|carousel|document|article|event|tla) sponsor a post that owns the copy, media and destination: a copy re-sponsors the SAME post, so content flags are rejected — stage \\`creatives create\\` with the new content instead, then pause the old ad.\n--replace also pauses the original once the new ad publishes (skipped if the new ad fails).\nExamples:\n baker ads linkedin creatives duplicate 1458413484 --headline \"10x Demos, Same Team\" --description \"AI handles every demo request.\" --replace\n baker ads linkedin creatives duplicate urn:li:sponsoredCreative:789 --campaign 799305464`,\n },\n args: {\n id: { type: \"positional\", description: \"Source creative id or URN\", required: true },\n ...accountArgs,\n campaign: { type: \"string\", description: \"Stage the copy under a different ad set (id/URN or li_temp_*)\" },\n \"intended-status\": {\n type: \"string\",\n description: \"Status for the copy (default DRAFT; with --replace, the source's status)\",\n },\n replace: {\n type: \"boolean\",\n description: \"Also pause the original once the new ad publishes; the copy inherits the source's status\",\n },\n intro: { type: \"string\", description: \"New commentary / intro text\" },\n headline: { type: \"string\", description: \"New headline\" },\n description: { type: \"string\", description: \"New description (text/spotlight ads)\" },\n \"landing-url\": {\n type: \"string\",\n description: \"New https destination URL (direct-content ads only — a post-based ad's URL lives in its post)\",\n },\n cta: { type: \"string\", description: \"New CTA (LEARN_MORE|REQUEST_DEMO|…)\" },\n \"cta-label\": { type: \"string\", description: \"Spotlight custom CTA label\" },\n \"image-id\": { type: \"string\", description: \"Baker image library id\" },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\" },\n \"video-id\": { type: \"string\", description: \"Baker video library id\" },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\" },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for the logo\" },\n title: { type: \"string\", description: \"Media title\" },\n file: { type: \"string\", description: \"JSON file with field overrides for the copy\" },\n },\n run: async ({ args }) => {\n try {\n const chatId = requireChatId();\n const file = loadJsonFileArg(args.file);\n const fileContent =\n file.content !== null && typeof file.content === \"object\" && !Array.isArray(file.content)\n ? (file.content as Record<string, unknown>)\n : {};\n const content = { ...fileContent, ...creativeContentPatch(args as Record<string, unknown>) };\n const overrides = mergePayload(file, {\n campaign: args.campaign,\n intendedStatus: args[\"intended-status\"] ? String(args[\"intended-status\"]).toUpperCase() : undefined,\n content: Object.keys(content).length > 0 ? content : undefined,\n });\n const response = await apiPost<{ ok: true; data: LinkedinDraftStageResponse }>(\n \"/api/ads/linkedin/draft/duplicate\",\n {\n chatId,\n accountId: bareAccountId(args as Record<string, unknown>),\n entity: \"creative\",\n sourceId: requireTarget(args as Record<string, unknown>, \"creative\"),\n ...(Object.keys(overrides).length > 0 ? { overrides } : {}),\n ...(args.replace ? { replace: true } : {}),\n },\n );\n writeJsonEnvelope(response);\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\n// --- Creatives ---\n\nconst CREATIVE_FORMATS = [\n \"image\",\n \"video\",\n \"text\",\n \"spotlight\",\n \"follower\",\n \"document\",\n \"carousel\",\n \"conversation\",\n \"tla\",\n \"jobs\",\n \"event\",\n \"article\",\n] as const;\n\nexport const creativesCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new creative (ad). ${STAGED_NOTE}\nFormats: ${CREATIVE_FORMATS.join(\"|\")}. Media comes from the Baker library (--image-id / --video-id from \\`baker images\\`/\\`baker videos\\`) or as LinkedIn URNs. Complex formats (carousel, jobs) take --file with the full content object. Conversation ads take --file with the message flow ({message: {subject, body, buttons[]}} — buttons NESTED|LANDING_PAGE, nested messages recurse).\nExamples:\n baker ads linkedin creatives create --campaign li_temp_x2 --format image --image-id <bakerImageId> --intro \"Meet the platform…\" --headline \"Book a demo\" --landing-url https://example.com/demo --cta REQUEST_DEMO\n baker ads linkedin creatives create --campaign 123456 --format tla --post-urn urn:li:ugcPost:789`,\n },\n args: {\n ...accountArgs,\n campaign: { type: \"string\", description: \"Campaign id/URN, or li_temp_* ref staged in this chat\" },\n format: { type: \"string\", description: CREATIVE_FORMATS.join(\"|\") },\n \"image-id\": { type: \"string\", description: \"Baker image library id (uploaded to LinkedIn at publish)\" },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\" },\n \"video-id\": { type: \"string\", description: \"Baker video library id\" },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\" },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for logo (text/spotlight/follower/jobs)\" },\n intro: { type: \"string\", description: \"Commentary / intro text (≤600 chars before feed truncation)\" },\n headline: { type: \"string\", description: \"Headline (≤70; text ads ≤25)\" },\n description: { type: \"string\", description: \"Description (text ads ≤75, spotlight ≤70)\" },\n \"landing-url\": { type: \"string\", description: \"https destination URL\" },\n cta: { type: \"string\", description: \"LEARN_MORE|REQUEST_DEMO|SIGN_UP|REGISTER|DOWNLOAD|…\" },\n \"cta-label\": { type: \"string\", description: \"Spotlight custom CTA label (≤18 chars)\" },\n \"post-urn\": { type: \"string\", description: \"TLA: existing post to sponsor (urn:li:share|ugcPost:*)\" },\n \"event-urn\": { type: \"string\", description: \"Event ads: the LinkedIn event to sponsor (urn:li:event:*)\" },\n \"article-url\": { type: \"string\", description: \"Article ads: https URL of the article/newsletter to sponsor\" },\n \"thumbnail-image-id\": { type: \"string\", description: \"Article ads: Baker image id for the link thumbnail\" },\n \"thumbnail-urn\": { type: \"string\", description: \"Article ads: existing urn:li:image:* thumbnail\" },\n \"intended-status\": { type: \"string\", description: \"DRAFT|ACTIVE|PAUSED (default DRAFT)\" },\n title: { type: \"string\", description: \"Media title (image/video) or article title\" },\n file: { type: \"string\", description: \"JSON file with the full content object; flags override\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n if (!args.campaign) {\n failWriteValidation(\"--campaign is required (id, URN, or li_temp_* ref)\");\n }\n const format = args.format ? String(args.format) : undefined;\n if (!format || !CREATIVE_FORMATS.includes(format as (typeof CREATIVE_FORMATS)[number])) {\n failWriteValidation(`--format must be one of ${CREATIVE_FORMATS.join(\"|\")}`);\n }\n const content = mergePayload(loadJsonFileArg(args.file), {\n format,\n commentary: args.intro,\n imageId: args[\"image-id\"],\n imageUrn: args[\"image-urn\"],\n videoId: args[\"video-id\"],\n videoUrn: args[\"video-urn\"],\n logoImageId: args[\"logo-image-id\"],\n headline: args.headline,\n description: args.description,\n landingUrl: args[\"landing-url\"],\n cta: args.cta ? String(args.cta).toUpperCase() : undefined,\n ctaLabel: args[\"cta-label\"],\n postUrn: args[\"post-urn\"],\n eventUrn: args[\"event-urn\"],\n source: args[\"article-url\"],\n thumbnailImageId: args[\"thumbnail-image-id\"],\n thumbnailUrn: args[\"thumbnail-urn\"],\n mediaTitle: args.title,\n title: args.title,\n });\n await stageOp({\n kind: \"creative.create\",\n accountId,\n payload: {\n campaign: args.campaign,\n intendedStatus: args[\"intended-status\"] ? String(args[\"intended-status\"]).toUpperCase() : undefined,\n content,\n },\n });\n },\n});\n\n/** Content fields `creatives update` can amend on a li_temp_* staged creative. */\nconst CREATIVE_AMEND_CONTENT_FLAGS = [\n [\"intro\", \"commentary\"],\n [\"headline\", \"headline\"],\n [\"description\", \"description\"],\n [\"landing-url\", \"landingUrl\"],\n [\"cta-label\", \"ctaLabel\"],\n [\"image-id\", \"imageId\"],\n [\"image-urn\", \"imageUrn\"],\n [\"video-id\", \"videoId\"],\n [\"video-urn\", \"videoUrn\"],\n [\"logo-image-id\", \"logoImageId\"],\n [\"thumbnail-image-id\", \"thumbnailImageId\"],\n [\"thumbnail-urn\", \"thumbnailUrn\"],\n [\"title\", \"title\"],\n] as const;\n\nfunction creativeContentPatch(args: Record<string, unknown>): Record<string, unknown> {\n const patch: Record<string, unknown> = {};\n for (const [flag, key] of CREATIVE_AMEND_CONTENT_FLAGS) {\n if (args[flag] !== undefined) {\n patch[key] = args[flag];\n }\n }\n if (args.cta !== undefined) {\n patch.cta = String(args.cta).toUpperCase();\n }\n return patch;\n}\n\nexport const creativesUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Stage changes to an existing creative, or amend a creative staged in this chat by passing its li_temp_* ref. ${STAGED_NOTE}\nDirect-content ads (text/spotlight/follower/jobs) update copy/media/URL IN PLACE — changed fields merge into the ad's current content. Post-based ads (image/video/carousel/…) sponsor a post that owns the copy, media and destination: neither this command nor \\`creatives duplicate\\` can change it — stage \\`creatives create\\` with the new content, then pause the old ad. Staged creatives (li_temp_*) accept all content flags and re-validate.\nApplies the same change to several ads at once: comma-separate the ids, or pass --ids-file. All of them stage together or none does. Live ids only — a li_temp_* amend has to be its own call.\n--campaign re-parents the ad to a different ad set — LinkedIn has no in-place move API, so this only works while the creative is still staged (li_temp_*); passing it against a live creative id/URN is rejected at stage time.\nExamples:\n baker ads linkedin creatives update 1458423674 --headline \"Sharper headline\" --description \"New copy.\"\n baker ads linkedin creatives update urn:li:sponsoredCreative:789 --intended-status PAUSED\n baker ads linkedin creatives update 1458423674,1458423675,1458423676 --intended-status PAUSED\n baker ads linkedin creatives update --ids-file ads.txt --intended-status PAUSED\n baker ads linkedin creatives update li_temp_x3 --campaign li_temp_x2`,\n },\n args: {\n id: {\n type: \"positional\",\n description:\n \"Creative id/URN — comma-separate several. A li_temp_* ref amends what this chat staged and must be passed on its own.\",\n required: false,\n },\n \"ids-file\": { type: \"string\", description: \"File of creative ids, one per line or comma-separated\" },\n ...accountArgs,\n \"intended-status\": { type: \"string\", description: \"ACTIVE|PAUSED|ARCHIVED|DRAFT\" },\n name: { type: \"string\", description: \"New creative name\" },\n campaign: {\n type: \"string\",\n description: \"Re-parent to a different ad set (id/URN or li_temp_*) — staged creatives only\",\n },\n intro: { type: \"string\", description: \"Commentary / intro text\" },\n headline: { type: \"string\", description: \"New headline\" },\n description: { type: \"string\", description: \"Description (text/spotlight ads)\" },\n \"landing-url\": { type: \"string\", description: \"New https destination URL\" },\n cta: { type: \"string\", description: \"New CTA (LEARN_MORE|REQUEST_DEMO|…)\" },\n \"cta-label\": { type: \"string\", description: \"Spotlight custom CTA label\" },\n \"image-id\": { type: \"string\", description: \"Baker image library id\" },\n \"image-urn\": { type: \"string\", description: \"Existing urn:li:image:*\" },\n \"video-id\": { type: \"string\", description: \"Baker video library id\" },\n \"video-urn\": { type: \"string\", description: \"Existing urn:li:video:*\" },\n \"logo-image-id\": { type: \"string\", description: \"Baker image id for the logo\" },\n \"thumbnail-image-id\": { type: \"string\", description: \"Baker image id for the article thumbnail\" },\n \"thumbnail-urn\": { type: \"string\", description: \"Existing urn:li:image:* thumbnail\" },\n title: { type: \"string\", description: \"Media or article title\" },\n file: { type: \"string\", description: \"JSON file with fields to change; flags override file keys\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const targets = requireTargets(args as Record<string, unknown>, \"creative\");\n const file = loadJsonFileArg(args.file);\n const contentPatch = creativeContentPatch(args as Record<string, unknown>);\n const intendedStatus = args[\"intended-status\"] ? String(args[\"intended-status\"]).toUpperCase() : undefined;\n const fileContent =\n file.content !== null && typeof file.content === \"object\" && !Array.isArray(file.content)\n ? (file.content as Record<string, unknown>)\n : {};\n const content = { ...fileContent, ...contentPatch };\n const payload = mergePayload(file, {\n intendedStatus,\n name: args.name,\n campaign: args.campaign,\n content: Object.keys(content).length > 0 ? content : undefined,\n });\n await stageLinkedinOps(targets.map((target) => ({ kind: \"creative.update\", accountId, target, payload })));\n },\n});\n\n// --- Audiences ---\n\nconst AUDIENCE_TYPES = [\"company-list\", \"user-list\", \"retargeting\", \"engagement\"] as const;\nconst INLINE_ROWS_MAX = 10_000;\n\nconst audiencesCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new matched audience. ${STAGED_NOTE}\nList audiences take --list-file (CSV: companyName,domain,organizationUrn for companies — organizationUrn matches the company page exactly; email,… for contacts — emails are SHA-256 hashed locally). LinkedIn needs 300+ MATCHED members to serve.\nExample: baker ads linkedin audiences create --name \"ABM Tier-1\" --type company-list --list-file accounts.csv`,\n },\n args: {\n ...accountArgs,\n name: { type: \"string\", description: \"Audience name (≤100 chars)\" },\n type: { type: \"string\", description: AUDIENCE_TYPES.join(\"|\") },\n \"list-file\": { type: \"string\", description: \"CSV file with the list rows (header row required)\" },\n file: {\n type: \"string\",\n description:\n 'JSON file with a raw source config (retargeting/engagement) — sourcePlatform, type USER and at least one engagementRules entry, e.g. {\"sourcePlatform\":\"VIDEO_ADS\",\"type\":\"USER\",\"engagementRules\":[{\"engagementSource\":\"urn:li:sponsoredCampaign:123\",\"engagementTrigger\":\"urn:li:dmpEngagementTrigger:(urn:li:dmpEngagementSourceType:VIDEO_ADS,FIRST_QUARTILE)\",\"timeFrame\":{\"timeSpan\":{\"duration\":90,\"unit\":\"DAY\"}}}]}',\n },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const list = parseListFileArg(args[\"list-file\"], INLINE_ROWS_MAX);\n const raw = args.file ? loadJsonFileArg(args.file) : undefined;\n await stageOp({\n kind: \"audience.create\",\n accountId,\n payload: {\n name: args.name,\n audienceType: args.type,\n ...(list ? { listColumns: list.columns, listRows: list.rows } : {}),\n ...(raw ? { raw } : {}),\n },\n });\n },\n});\n\nconst audiencesUploadCommand = defineCommand({\n meta: {\n name: \"upload\",\n description: `Stage a list upload into an existing audience segment. ${STAGED_NOTE}\nExample: baker ads linkedin audiences upload urn:li:dmpSegment:42 --list-file more-accounts.csv`,\n },\n args: {\n id: { type: \"positional\", description: \"Segment URN/id, or li_temp_* ref staged in this chat\", required: true },\n ...accountArgs,\n \"list-file\": { type: \"string\", description: \"CSV file with the rows to add\", required: true },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const list = parseListFileArg(args[\"list-file\"], INLINE_ROWS_MAX);\n if (!list) {\n failWriteValidation(\"--list-file is required\");\n }\n await stageOp({\n kind: \"audience.uploadList\",\n accountId,\n payload: {\n segment: requireTarget(args as Record<string, unknown>, \"audience segment\"),\n listColumns: list.columns,\n listRows: list.rows,\n },\n });\n },\n});\n\nexport const audiencesCommand = defineCommand({\n meta: {\n name: \"audiences\",\n description:\n \"Stage LinkedIn matched-audience changes (create lists, upload rows). Staged until publish — never hits the API directly.\",\n },\n subCommands: {\n create: audiencesCreateCommand,\n upload: audiencesUploadCommand,\n },\n});\n\n// --- Conversions ---\n\nexport const conversionsCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new conversion rule. ${STAGED_NOTE}\nExample: baker ads linkedin conversions create --name \"Demo booked\" --type LEAD --method INSIGHT_TAG --post-click-window 30 --view-window 7`,\n },\n args: {\n ...accountArgs,\n name: { type: \"string\", description: \"Conversion rule name\" },\n type: {\n type: \"string\",\n description:\n \"Conversion type. Common: LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, SIGN_UP, DOWNLOAD, PURCHASE, KEY_PAGE_VIEW, ADD_TO_CART, BOOK_APPOINTMENT, SUBMIT_APPLICATION, OTHER — `baker schema ads.linkedin.conversions.create` lists all 34\",\n },\n method: { type: \"string\", description: \"INSIGHT_TAG|CONVERSIONS_API\" },\n \"post-click-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days (playbook default 30); 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n },\n \"view-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days (playbook default 7); 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n },\n \"attribution-type\": { type: \"string\", description: \"LAST_TOUCH_BY_CAMPAIGN|LAST_TOUCH_BY_CONVERSION\" },\n \"associate-all-campaigns\": { type: \"boolean\", description: \"Auto-associate with active campaigns\" },\n file: { type: \"string\", description: \"JSON file with the full payload (e.g. urlMatchRuleExpression)\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n type: args.type ? String(args.type).toUpperCase() : undefined,\n conversionMethod: args.method ? String(args.method).toUpperCase() : undefined,\n postClickAttributionWindowSize: args[\"post-click-window\"] ? Number(args[\"post-click-window\"]) : undefined,\n viewThroughAttributionWindowSize: args[\"view-window\"] ? Number(args[\"view-window\"]) : undefined,\n attributionType: args[\"attribution-type\"] ? String(args[\"attribution-type\"]).toUpperCase() : undefined,\n associateAllCampaigns: args[\"associate-all-campaigns\"] === true ? true : undefined,\n });\n await stageOp({ kind: \"conversion.create\", accountId, payload });\n },\n});\n\nexport const conversionsUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Stage changes to a conversion rule (windows, name, enabled). ${STAGED_NOTE}\nExample: baker ads linkedin conversions update 104988516 --post-click-window 30 --view-window 7`,\n },\n args: {\n id: { type: \"positional\", description: \"Conversion rule id or URN\", required: true },\n ...accountArgs,\n name: { type: \"string\", description: \"New name\" },\n \"post-click-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n },\n \"view-window\": {\n type: \"string\",\n description:\n \"1|7|30|90 days; 180|365 only for LEAD, QUALIFIED_LEAD, MARKETING_QUALIFIED_LEAD, SALES_QUALIFIED_LEAD, PURCHASE, ADD_TO_CART, SUBMIT_APPLICATION\",\n },\n \"attribution-type\": { type: \"string\", description: \"LAST_TOUCH_BY_CAMPAIGN|LAST_TOUCH_BY_CONVERSION\" },\n enabled: { type: \"string\", description: \"on|off\" },\n file: { type: \"string\", description: \"JSON file with fields to change\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const payload = mergePayload(loadJsonFileArg(args.file), {\n name: args.name,\n postClickAttributionWindowSize: args[\"post-click-window\"] ? Number(args[\"post-click-window\"]) : undefined,\n viewThroughAttributionWindowSize: args[\"view-window\"] ? Number(args[\"view-window\"]) : undefined,\n attributionType: args[\"attribution-type\"] ? String(args[\"attribution-type\"]).toUpperCase() : undefined,\n enabled: parseOnOffFlag(args.enabled, \"--enabled\"),\n });\n await stageOp({\n kind: \"conversion.update\",\n accountId,\n target: requireTarget(args as Record<string, unknown>, \"conversion rule\"),\n payload,\n });\n },\n});\n\nconst CONVERSION_CAMPAIGN_EXPLAINER = `Which ad sets a conversion rule counts for is a separate LinkedIn record, not a field on the rule — \\`conversions update\\` cannot change it, and \\`--associate-all-campaigns\\` only exists on create.`;\n\nfunction conversionCampaignArgs() {\n return {\n id: { type: \"positional\" as const, description: \"Conversion rule id or URN\", required: true },\n ...accountArgs,\n campaign: { type: \"string\" as const, description: \"Ad set (campaign) id or URN\", required: true },\n };\n}\n\nfunction requireCampaignArg(args: Record<string, unknown>): string {\n const campaign = args.campaign;\n if (typeof campaign !== \"string\" || campaign.length === 0) {\n failWriteValidation(\"--campaign is required — pass the ad set id or URN this conversion should count for\");\n }\n return campaign as string;\n}\n\nexport const conversionsAssociateCommand = defineCommand({\n meta: {\n name: \"associate-campaign\",\n description: `Count an existing conversion rule for one ad set. ${STAGED_NOTE}\n${CONVERSION_CAMPAIGN_EXPLAINER}\nExample: baker ads linkedin conversions associate-campaign 104988516 --campaign 337643194`,\n },\n args: conversionCampaignArgs(),\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n await stageOp({\n kind: \"conversion.associateCampaign\",\n accountId,\n target: requireTarget(args as Record<string, unknown>, \"conversion rule\"),\n payload: { campaign: requireCampaignArg(args as Record<string, unknown>) },\n });\n },\n});\n\nexport const conversionsDissociateCommand = defineCommand({\n meta: {\n name: \"dissociate-campaign\",\n description: `Stop counting an existing conversion rule for one ad set. ${STAGED_NOTE}\n${CONVERSION_CAMPAIGN_EXPLAINER}\nExample: baker ads linkedin conversions dissociate-campaign 104988516 --campaign 337643194`,\n },\n args: conversionCampaignArgs(),\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n await stageOp({\n kind: \"conversion.dissociateCampaign\",\n accountId,\n target: requireTarget(args as Record<string, unknown>, \"conversion rule\"),\n payload: { campaign: requireCampaignArg(args as Record<string, unknown>) },\n });\n },\n});\n\n// --- Lead gen forms (file-first — deeply nested) ---\n\nconst leadFormsCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new Lead Gen Form from a JSON file. ${STAGED_NOTE}\nRequired: name, headline (≤60), privacyPolicyUrl, questions[] (≤12; playbook: ≤4 for completion).\nEach question is a predefined profile field ({ name, predefinedField: \"EMAIL\" }) or a custom question ({ name, questionType: \"MULTIPLE_CHOICE\", options: [...] }; ≤3 custom).\nBest-practice fields the preview will nudge for if missing: 1-3 qualifying questions, consents[] (disclosure checkboxes), thankYou.message + thankYou.landingUrl|appointmentUrl.\nAlso supported: locale, formImageId|formImageUrn, hiddenFields[], legalDisclaimer, thankYou.cta. Example: baker ads linkedin lead-forms create --file form.json`,\n },\n args: {\n ...accountArgs,\n file: { type: \"string\", description: \"JSON file with the form definition\", required: true },\n name: { type: \"string\", description: \"Override the form name\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const payload = mergePayload(loadJsonFileArg(args.file), { name: args.name });\n await stageOp({ kind: \"leadForm.create\", accountId, payload });\n },\n});\n\nconst leadFormsUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Stage changes to a Lead Gen Form from a JSON file. ${STAGED_NOTE}`,\n },\n args: {\n id: { type: \"positional\", description: \"Lead form id or URN\", required: true },\n ...accountArgs,\n file: { type: \"string\", description: \"JSON file with the fields to change\", required: true },\n name: { type: \"string\", description: \"New form name\" },\n },\n run: async ({ args }) => {\n const accountId = bareAccountId(args as Record<string, unknown>);\n const payload = mergePayload({ raw: loadJsonFileArg(args.file) }, { name: args.name });\n await stageOp({\n kind: \"leadForm.update\",\n accountId,\n target: requireTarget(args as Record<string, unknown>, \"lead form\"),\n payload,\n });\n },\n});\n\nexport const leadFormsCommand = defineCommand({\n meta: {\n name: \"lead-forms\",\n description:\n \"Stage LinkedIn Lead Gen Form changes (file-first). Staged until publish — never hits the API directly.\",\n },\n subCommands: {\n create: leadFormsCreateCommand,\n update: leadFormsUpdateCommand,\n },\n});\n"],"mappings":"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","names":[]}