@koda-sl/baker-cli 0.280.0-dev.1f1c09c80 → 0.281.1-dev.1f1c09c80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -110,7 +110,7 @@ import {
110
110
  } from "./chunk-WFWU3CHS.js";
111
111
 
112
112
  // src/cli.ts
113
- import { defineCommand as defineCommand228, runMain } from "citty";
113
+ import { defineCommand as defineCommand229, runMain } from "citty";
114
114
 
115
115
  // src/cache-flag.ts
116
116
  var NO_CACHE_ARG = {
@@ -3722,6 +3722,26 @@ var avatarsListRequestSchema = z7.object({
3722
3722
  limit: z7.coerce.number().int().positive().max(100).optional()
3723
3723
  });
3724
3724
  var avatarsListResponseSchema = z7.object({ avatars: z7.array(avatarSummarySchema) });
3725
+ var avatarsVoicesRequestSchema = z7.object({
3726
+ /** Free-text brief — "Spanish woman, warm, 40" — ranked the same way a render casts. */
3727
+ search: z7.string().trim().max(300).optional(),
3728
+ gender: z7.string().trim().max(40).optional(),
3729
+ language: z7.string().trim().max(40).optional(),
3730
+ limit: z7.coerce.number().int().positive().max(50).optional()
3731
+ });
3732
+ var avatarVoiceSchema = z7.object({
3733
+ voiceId: z7.string(),
3734
+ name: z7.string(),
3735
+ /** The provider's own labels — age and accent are what a casting call turns on. */
3736
+ age: z7.string().optional(),
3737
+ accent: z7.string().optional(),
3738
+ gender: z7.string().optional(),
3739
+ language: z7.string().optional(),
3740
+ useCase: z7.string().optional(),
3741
+ description: z7.string().optional(),
3742
+ previewUrl: z7.string().optional()
3743
+ });
3744
+ var avatarsVoicesResponseSchema = z7.object({ voices: z7.array(avatarVoiceSchema) });
3725
3745
  var avatarsGetRequestSchema = z7.object({
3726
3746
  handle: z7.string().min(1, "Missing handle parameter"),
3727
3747
  full: z7.coerce.boolean().optional()
@@ -24454,7 +24474,7 @@ Full guide: __tooling__/docs/tools/baker/analytics.md`
24454
24474
  });
24455
24475
 
24456
24476
  // src/commands/avatars/index.ts
24457
- import { defineCommand as defineCommand94 } from "citty";
24477
+ import { defineCommand as defineCommand95 } from "citty";
24458
24478
 
24459
24479
  // src/commands/avatars/create.ts
24460
24480
  import { defineCommand as defineCommand89 } from "citty";
@@ -25102,11 +25122,72 @@ var updateCommand2 = defineCommand93({
25102
25122
  }
25103
25123
  });
25104
25124
 
25125
+ // src/commands/avatars/voices.ts
25126
+ import { defineCommand as defineCommand94 } from "citty";
25127
+ registerSchema({
25128
+ command: "avatars.voices",
25129
+ description: 'List the voices an avatar can be given, ranked by the same scorer a render uses to cast one. Start here whenever an avatar has no voice: an avatar is a face AND a voice, and one without a voice cannot be shown speaking \u2014 its lines would be read by whoever the renderer happened to pick, which on screen is dubbing. Pass a brief (--search "mujer espanola calida, 40") plus --gender/--language to narrow it, then pin the winner with `baker avatars update --handle <handle> --voice-id <id>`. Rows carry the provider\'s own age and accent labels, which is what a casting call actually turns on.',
25130
+ args: {
25131
+ search: { type: "string", description: 'Brief to rank by, e.g. "Spanish woman, warm, 40"', required: false },
25132
+ gender: { type: "string", description: "Hard filter: female|male", required: false },
25133
+ language: { type: "string", description: "Hard filter, e.g. spanish|english", required: false },
25134
+ limit: { type: "number", description: "Max voices to return (1-50, default 10)", required: false }
25135
+ }
25136
+ });
25137
+ var voicesCommand = defineCommand94({
25138
+ meta: {
25139
+ name: "voices",
25140
+ description: 'List voices an avatar can be pinned to. Example: baker avatars voices --search "mujer espanola calida" --gender female --language spanish'
25141
+ },
25142
+ args: {
25143
+ search: { type: "string", description: "Brief to rank by", required: false },
25144
+ gender: { type: "string", description: "Hard filter: female|male", required: false },
25145
+ language: { type: "string", description: "Hard filter, e.g. spanish", required: false },
25146
+ limit: { type: "string", description: "Max voices to return (1-50)", required: false },
25147
+ output: { type: "string", description: "Output format: json|files|md", required: false, default: "json" },
25148
+ fields: { type: "string", description: "Comma-separated field names to include", required: false }
25149
+ },
25150
+ run: async ({ args }) => {
25151
+ try {
25152
+ const params = {};
25153
+ for (const key of ["search", "gender", "language", "limit"]) {
25154
+ const value = args[key];
25155
+ if (value !== void 0 && value !== "") params[key] = value;
25156
+ }
25157
+ const data = await readAvatars("/api/avatars/voices", params);
25158
+ const hints = [];
25159
+ if (data.voices.length === 0) {
25160
+ hints.push("No voice matched. Drop --gender/--language and rank on the brief alone.");
25161
+ } else {
25162
+ const first = data.voices[0];
25163
+ if (first) {
25164
+ hints.push(
25165
+ `Pin one: baker avatars update --handle <handle> --voice-id ${first.voiceId} --voice-description "<how it should sound>"`
25166
+ );
25167
+ }
25168
+ const ages = new Set(data.voices.map((v) => v.age).filter(Boolean));
25169
+ if (ages.size === 1) {
25170
+ hints.push(`Every match is labelled \`${[...ages][0]}\` \u2014 the account stocks no other age for this filter.`);
25171
+ }
25172
+ }
25173
+ const format = args.output || "json";
25174
+ const fields = args.fields ? args.fields.split(",") : void 0;
25175
+ if (format === "json") {
25176
+ writeJson({ ok: true, data: { voices: data.voices }, meta: { count: data.voices.length }, hints });
25177
+ return;
25178
+ }
25179
+ writeOutput({ ok: true, data: data.voices }, format, fields, false);
25180
+ } catch (err) {
25181
+ failAvatarApi(err);
25182
+ }
25183
+ }
25184
+ });
25185
+
25105
25186
  // src/commands/avatars/index.ts
25106
- var avatarsCommand = defineCommand94({
25187
+ var avatarsCommand = defineCommand95({
25107
25188
  meta: {
25108
25189
  name: "avatars",
25109
- description: `Reusable AI presenters this company can cast into images and video. An avatar holds one settled identity, so the same face can carry a whole campaign. Subcommands: list, get, create, update, delete.
25190
+ description: `Reusable AI presenters this company can cast into images and video. An avatar holds one settled identity, so the same face can carry a whole campaign. Subcommands: list, get, create, update, voices, delete.
25110
25191
 
25111
25192
  How casting works:
25112
25193
  1. baker avatars list See who this company already has (reuse before you create)
@@ -25115,11 +25196,17 @@ How casting works:
25115
25196
  Ground the render on the identity sheet, never on a source photo,
25116
25197
  and copy the subject description into the prompt VERBATIM
25117
25198
 
25199
+ An avatar is a face AND a voice. One with no pinned voice cannot be shown speaking \u2014 a
25200
+ video ad refuses rather than reading their lines in whoever the renderer picked:
25201
+ baker avatars voices --search "mujer espanola calida, 40" --gender female --language spanish
25202
+ baker avatars update marta --voice-id <id> --voice-description "how it should sound"
25203
+
25118
25204
  Examples:
25119
25205
  baker avatars list --status ready --output md
25120
25206
  baker avatars get marta --full
25121
25207
  baker avatars create --name "Marta" --subject "woman in her early 40s, shoulder-length dark hair, light olive skin"
25122
25208
  baker avatars update marta --subject "\u2026" --regenerate-sheet
25209
+ baker avatars voices --search "mujer espanola calida" --gender female --language spanish
25123
25210
  baker avatars delete marta --archive
25124
25211
  Full guide: __tooling__/docs/tools/baker/avatars.md`
25125
25212
  },
@@ -25128,17 +25215,18 @@ Full guide: __tooling__/docs/tools/baker/avatars.md`
25128
25215
  get: getCommand2,
25129
25216
  create: createCommand2,
25130
25217
  update: updateCommand2,
25218
+ voices: voicesCommand,
25131
25219
  delete: deleteCommand
25132
25220
  }
25133
25221
  });
25134
25222
 
25135
25223
  // src/commands/brand/index.ts
25136
- import { defineCommand as defineCommand96 } from "citty";
25224
+ import { defineCommand as defineCommand97 } from "citty";
25137
25225
 
25138
25226
  // src/commands/brand/fonts.ts
25139
25227
  import { mkdir, readdir, readFile as readFile2, writeFile } from "fs/promises";
25140
25228
  import path2 from "path";
25141
- import { defineCommand as defineCommand95 } from "citty";
25229
+ import { defineCommand as defineCommand96 } from "citty";
25142
25230
 
25143
25231
  // src/engine/brand/fonts.ts
25144
25232
  import { posix } from "path";
@@ -25982,7 +26070,7 @@ async function unresolvedAction(css, unresolved) {
25982
26070
  }
25983
26071
  return `Run \`baker brand fonts fetch "${unresolved[0]}"\` to self-host it, which writes the @font-face for you. For a face no catalogue carries, add an @font-face pointing at a file in ${FONTS_DIR}.`;
25984
26072
  }
25985
- var fontsCheckCommand = defineCommand95({
26073
+ var fontsCheckCommand = defineCommand96({
25986
26074
  meta: {
25987
26075
  name: "check",
25988
26076
  description: "Verify the brand's fonts really exist. First: every --font-* family in src/styles/global.css must be provided by a local @font-face, or it renders as a fallback on every page \u2014 a Google @import does not provide one here, the build drops it before the page loads. Then, for families still requested from Google, ask Google what it actually serves \u2014 a weight nobody serves is silently synthesized."
@@ -26034,7 +26122,7 @@ var fontsCheckCommand = defineCommand95({
26034
26122
  });
26035
26123
  }
26036
26124
  });
26037
- var fontsFetchCommand = defineCommand95({
26125
+ var fontsFetchCommand = defineCommand96({
26038
26126
  meta: {
26039
26127
  name: "fetch",
26040
26128
  description: "Download a font from Google Fonts or Fontsource into src/brand/fonts/ and write its @font-face into src/styles/global.css above @theme, so the family actually loads. Use when a brand font should be self-hosted rather than requested from a third party on every page load."
@@ -26135,7 +26223,7 @@ async function astroSources() {
26135
26223
  }
26136
26224
  return out;
26137
26225
  }
26138
- var fontsAdoptCommand = defineCommand95({
26226
+ var fontsAdoptCommand = defineCommand96({
26139
26227
  meta: {
26140
26228
  name: "adopt",
26141
26229
  description: "Move brand faces a page already self-hosts into src/styles/global.css, so every page loads them instead of just that one. Use when `check` reports a family as not loaded but the font files are already in src/brand/fonts/ \u2014 downloading it again would hand that page a different build of the same face."
@@ -26215,7 +26303,7 @@ var fontsAdoptCommand = defineCommand95({
26215
26303
  });
26216
26304
  }
26217
26305
  });
26218
- var fontsCommand = defineCommand95({
26306
+ var fontsCommand = defineCommand96({
26219
26307
  meta: {
26220
26308
  name: "fonts",
26221
26309
  description: `Verify and self-host the brand's typefaces.
@@ -26235,7 +26323,7 @@ Subcommands:
26235
26323
  });
26236
26324
 
26237
26325
  // src/commands/brand/index.ts
26238
- var brandCommand = defineCommand96({
26326
+ var brandCommand = defineCommand97({
26239
26327
  meta: {
26240
26328
  name: "brand",
26241
26329
  description: `Brand asset verification for src/brand/.
@@ -26251,11 +26339,11 @@ Subcommands:
26251
26339
  });
26252
26340
 
26253
26341
  // src/commands/canvas/index.ts
26254
- import { defineCommand as defineCommand108 } from "citty";
26342
+ import { defineCommand as defineCommand109 } from "citty";
26255
26343
 
26256
26344
  // src/commands/canvas/catalog.ts
26257
- import { defineCommand as defineCommand97 } from "citty";
26258
- var catalogCommand = defineCommand97({
26345
+ import { defineCommand as defineCommand98 } from "citty";
26346
+ var catalogCommand = defineCommand98({
26259
26347
  meta: {
26260
26348
  name: "catalog",
26261
26349
  description: "Print the agent-facing node catalog (JSON Schema). Includes every registered node grouped by category."
@@ -26270,7 +26358,7 @@ var catalogCommand = defineCommand97({
26270
26358
  // src/commands/canvas/critique.ts
26271
26359
  import { readFile as readFile3 } from "fs/promises";
26272
26360
  import path3 from "path";
26273
- import { defineCommand as defineCommand98 } from "citty";
26361
+ import { defineCommand as defineCommand99 } from "citty";
26274
26362
 
26275
26363
  // src/engine/scaffold/lib/critique.ts
26276
26364
  var VIBE_CUE = /\b(light|lighting|golden|moody|warm|cool|tone|grade|contrast|shadow|glow|rim|backlit|neon|soft)\b/i;
@@ -26390,7 +26478,7 @@ function critiqueCanvas(canvas) {
26390
26478
  }
26391
26479
 
26392
26480
  // src/commands/canvas/critique.ts
26393
- var critiqueCommand = defineCommand98({
26481
+ var critiqueCommand = defineCommand99({
26394
26482
  meta: {
26395
26483
  name: "critique",
26396
26484
  description: "Pre-spend creative critic (ADVISORY \u2014 never blocks). Scores a scaffolded creative BEFORE the billed render, so weak spots get fixed for free. A VIDEO creative is scored on hook strength, sound-off first-frame legibility, retention risk, and mechanism clarity; a STATIC ad on baked-text legibility risk, identity grounding, brand-type fidelity, and mechanism clarity. Ground a video hook against `baker winning-ads hooks` for a proven pattern."
@@ -26432,9 +26520,9 @@ import { execFile } from "child_process";
26432
26520
  import { readdir as readdir2, readFile as readFile4, stat } from "fs/promises";
26433
26521
  import path4 from "path";
26434
26522
  import { promisify } from "util";
26435
- import { defineCommand as defineCommand99 } from "citty";
26523
+ import { defineCommand as defineCommand100 } from "citty";
26436
26524
  var execFileAsync = promisify(execFile);
26437
- var inspectCommand = defineCommand99({
26525
+ var inspectCommand = defineCommand100({
26438
26526
  meta: {
26439
26527
  name: "inspect",
26440
26528
  description: "Dump a one-page summary of a canvas run: per-node duration + cache status, list of output files in the run dir, and optionally three thumbnail frames per video output. Pass either a run_id (resolved against --outputs-dir) or an absolute run directory."
@@ -26542,12 +26630,12 @@ async function probeDuration(filePath) {
26542
26630
 
26543
26631
  // src/commands/canvas/rerun.ts
26544
26632
  import path17 from "path";
26545
- import { defineCommand as defineCommand101 } from "citty";
26633
+ import { defineCommand as defineCommand102 } from "citty";
26546
26634
 
26547
26635
  // src/commands/canvas/run.ts
26548
26636
  import { readFile as readFile12 } from "fs/promises";
26549
26637
  import path16 from "path";
26550
- import { defineCommand as defineCommand100 } from "citty";
26638
+ import { defineCommand as defineCommand101 } from "citty";
26551
26639
 
26552
26640
  // src/commands/canvas/normalize-paths.ts
26553
26641
  import { existsSync as existsSync3, realpathSync } from "fs";
@@ -31200,7 +31288,7 @@ async function sceneWindowsBeside(canvasPath) {
31200
31288
  }
31201
31289
 
31202
31290
  // src/commands/canvas/run.ts
31203
- var runCommand = defineCommand100({
31291
+ var runCommand = defineCommand101({
31204
31292
  meta: { name: "run", description: "Validate and execute a canvas JSON file." },
31205
31293
  args: {
31206
31294
  file: { type: "positional", required: true, description: "Path to canvas JSON" },
@@ -31598,7 +31686,7 @@ async function postInitialRunRecord(client, payload) {
31598
31686
 
31599
31687
  // src/commands/canvas/rerun.ts
31600
31688
  var SLUG_PATTERN = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
31601
- var rerunCommand = defineCommand101({
31689
+ var rerunCommand = defineCommand102({
31602
31690
  meta: {
31603
31691
  name: "rerun",
31604
31692
  description: "Re-run a creative's latest recorded canvas. Restores its definition files from run history first, so it works in a fresh workspace that never had the source chat's files \u2014 an interrupted run resumes (in-flight jobs re-attach), a completed one re-renders from the cache."
@@ -31695,7 +31783,7 @@ async function fetchManifest(url) {
31695
31783
  // src/commands/canvas/scaffold-static-ad.ts
31696
31784
  import { access, mkdir as mkdir6, readFile as readFile14, writeFile as writeFile8 } from "fs/promises";
31697
31785
  import path21 from "path";
31698
- import { defineCommand as defineCommand103 } from "citty";
31786
+ import { defineCommand as defineCommand104 } from "citty";
31699
31787
 
31700
31788
  // src/engine/scaffold/staticAd.ts
31701
31789
  import { z as z29 } from "zod";
@@ -32045,7 +32133,7 @@ function isValidScaffoldSlug(slug) {
32045
32133
  // src/commands/canvas/sync-definition.ts
32046
32134
  import { readdir as readdir7, readFile as readFile13, stat as stat3 } from "fs/promises";
32047
32135
  import path20 from "path";
32048
- import { defineCommand as defineCommand102 } from "citty";
32136
+ import { defineCommand as defineCommand103 } from "citty";
32049
32137
 
32050
32138
  // src/commands/canvas/definition-graph.ts
32051
32139
  var MAX_NODES = 300;
@@ -32158,7 +32246,7 @@ async function resolveCanvasPath(inputPath) {
32158
32246
  const chosen = (slug ? canvases.find((name) => name === `${slug}.canvas.json`) : void 0) ?? canvases[0];
32159
32247
  return chosen ? path20.join(dir, chosen) : null;
32160
32248
  }
32161
- var syncDefinitionCommand = defineCommand102({
32249
+ var syncDefinitionCommand = defineCommand103({
32162
32250
  meta: {
32163
32251
  name: "sync-definition",
32164
32252
  description: "Push a creative's current node-graph + input thumbnails to the dashboard without rendering. Runs automatically when you edit a creative's canvas.json or prompt.json."
@@ -32388,7 +32476,7 @@ async function runVisionPasses(canvas) {
32388
32476
  return fail3("read_outputs", e instanceof Error ? e.message : String(e));
32389
32477
  }
32390
32478
  }
32391
- var scaffoldStaticAdCommand = defineCommand103({
32479
+ var scaffoldStaticAdCommand = defineCommand104({
32392
32480
  meta: {
32393
32481
  name: "scaffold-static-ad",
32394
32482
  description: "Turn a source/inspiration image into a runnable static-ad canvas. Runs billed passes \u2014 image_describe (the blueprint, baked to prompt.json as the editable 'prompt'), an AI selection of the image's MAIN identity elements, and a structured global-layout pass (the column/row grid with per-region bounds and text sizes) \u2014 then scaffolds a canvas that wires one [TODO] ingest slot per element (logo/product/subject/badge + brand font) into image_generate. By default it also fans the hero out to the platform's placement ratios (via image_aspect_adapt \u2014 the hero ratio is free, the rest are billed AI recompositions); pass --placements none for a single base ad, or a preset to pick the set. Edit prompt.json and drop the real assets, then `baker canvas run` it."
@@ -32576,7 +32664,7 @@ var scaffoldStaticAdCommand = defineCommand103({
32576
32664
  // src/commands/canvas/scaffold-ad.ts
32577
32665
  import { copyFile, cp, mkdir as mkdir7, readFile as readFile16, stat as stat4, writeFile as writeFile9 } from "fs/promises";
32578
32666
  import path24 from "path";
32579
- import { defineCommand as defineCommand104 } from "citty";
32667
+ import { defineCommand as defineCommand105 } from "citty";
32580
32668
 
32581
32669
  // src/engine/scaffold/ad-spec.ts
32582
32670
  import { z as z30 } from "zod";
@@ -32611,9 +32699,17 @@ var Beat = z30.object({
32611
32699
  */
32612
32700
  sound: z30.string().min(1).max(200).optional(),
32613
32701
  /**
32614
- * Set only when this beat's subject is talking to camera. Off by default, and
32615
- * the default is load-bearing: a person visibly speaking under a voice that is
32616
- * not theirs reads as bad dubbing, which is what sank the first cut of this.
32702
+ * Whether this beat's subject is talking to camera.
32703
+ *
32704
+ * Left unset it follows the cast: an ad that cast a presenter, in a shot they are in,
32705
+ * with a line, is that person speaking. Set it to FALSE for the exception — a cutaway,
32706
+ * a product shot, a beat you want a narrator to carry over.
32707
+ *
32708
+ * It used to be opt-in, back when the only route was dubbing and OFF was the safe
32709
+ * default. That inverted the moment on-camera started meaning the video model voices
32710
+ * the clip itself: measured on a real run, a brief that said "talking to camera all the
32711
+ * way through" produced an ad with her face on screen and a narrator cast from a prose
32712
+ * description reading her lines, because nothing set this flag.
32617
32713
  */
32618
32714
  on_camera: z30.boolean().optional(),
32619
32715
  /**
@@ -32821,6 +32917,10 @@ var ASKS_FOR_LEGIBLE = /\b(focus on the (number|amount|total|price|figure|text)|
32821
32917
  function briefWantsLegibleText(show) {
32822
32918
  return ASKS_FOR_LEGIBLE.test(show);
32823
32919
  }
32920
+ var SELF_INTRODUCTION = /\b([Ss]oy|[Mm]e llamo|[Mm]i nombre es|[Ss]ou|[Jj]e m'appelle|[Jj]e suis|[Mm]i chiamo|[Ss]ono|[Ii]ch bin|[Ii]'m|[Ii] am|[Mm]y name is)\s+[A-ZÁÉÍÓÚÑ]/;
32921
+ function lineIntroducesSpeaker(line) {
32922
+ return SELF_INTRODUCTION.test(line);
32923
+ }
32824
32924
  function endCardWanted(spec) {
32825
32925
  if (spec.end_card === false) return false;
32826
32926
  return Boolean(spec.brand?.name || spec.brand?.logo);
@@ -32832,6 +32932,7 @@ function endCardCta(spec) {
32832
32932
  const closing = (spec.beats[spec.beats.length - 1]?.say ?? "").trim().toLowerCase();
32833
32933
  return declared.toLowerCase().replace(/[.!?]$/, "") === closing.replace(/[.!?]$/, "") ? null : declared;
32834
32934
  }
32935
+ var AD_CAST_ID = "customer";
32835
32936
  function adSpecCastElements(spec, avatar) {
32836
32937
  const description = (avatar?.subjectDescription ?? spec.cast?.description)?.trim();
32837
32938
  if (!description) return [];
@@ -32842,7 +32943,10 @@ function adSpecCastElements(spec, avatar) {
32842
32943
  return [
32843
32944
  {
32844
32945
  type: "person",
32845
- label: "customer",
32946
+ label: AD_CAST_ID,
32947
+ // Same id the dialogue names as speaker: that pairing is what lets the engine see
32948
+ // the presenter as present in a scene and route it to native audio.
32949
+ cast_id: AD_CAST_ID,
32846
32950
  description,
32847
32951
  scenes,
32848
32952
  // An avatar's identity sheet IS the turnaround the engine would otherwise render,
@@ -32852,10 +32956,10 @@ function adSpecCastElements(spec, avatar) {
32852
32956
  }
32853
32957
  ];
32854
32958
  }
32855
- function motionPrompt(beat, isClosingCard, place, physics) {
32959
+ function motionPrompt(beat, toCamera, isClosingCard, place, physics) {
32856
32960
  if (isClosingCard) return BRAND_PLATE;
32857
32961
  const shot = `${beat.show}${place}${physics}`;
32858
- if (beat.on_camera) return shot;
32962
+ if (toCamera) return shot;
32859
32963
  return `${shot} Nobody in frame is speaking: mouths CLOSED and STILL throughout, no talking, no lip movement. Whoever is in shot is looking, reacting or working \u2014 never addressing the camera.`;
32860
32964
  }
32861
32965
  function staticTranscript(spec) {
@@ -32877,6 +32981,41 @@ function staticTranscript(spec) {
32877
32981
  }
32878
32982
  return out;
32879
32983
  }
32984
+ function beatToCamera(spec, beat, isClosingCard) {
32985
+ if (isClosingCard) return false;
32986
+ if (beat.on_camera !== void 0) return beat.on_camera;
32987
+ return Boolean(spec.cast) && beat.cast !== false;
32988
+ }
32989
+ function wantsNativeSpeech(spec, closesOnCard) {
32990
+ if (!spec.cast || spec.voiceover === false) return false;
32991
+ const last = spec.beats.length - 1;
32992
+ const speaking = spec.beats.filter((_, i) => !(closesOnCard && i === last));
32993
+ return speaking.length > 0 && speaking.every((beat) => beatToCamera(spec, beat, false) && beat.cast !== false);
32994
+ }
32995
+ function beatDialogue(spec, beat, window2) {
32996
+ if (spec.voiceover === false) return [];
32997
+ return [
32998
+ {
32999
+ line: beat.say,
33000
+ start_s: window2.start,
33001
+ end_s: window2.end,
33002
+ // Always stated, never left to the engine: absent, it guesses from who is in frame,
33003
+ // which is how a still photograph once got lip-synced.
33004
+ on_camera: beatToCamera(spec, beat, window2.isClosingCard),
33005
+ // Naming the CAST as speaker is the other half of what sends this beat down the
33006
+ // native path. Left unnamed, the speaker defaults to "voiceover" — a narrator, who is
33007
+ // by definition never on camera — so every beat took the dubbed path: a clip generated
33008
+ // with one mouth and a separate ElevenLabs track laid over it. That is the mismatch
33009
+ // behind every "the mouth does not match" in this ad's history.
33010
+ ...window2.nativeSpeech && !window2.isClosingCard ? { speaker: AD_CAST_ID } : {},
33011
+ ...spec.voice?.description ? { voice_description: spec.voice.description } : {}
33012
+ }
33013
+ ];
33014
+ }
33015
+ function voiceoverMode(spec, nativeSpeech) {
33016
+ if (spec.voiceover === false) return "none";
33017
+ return nativeSpeech ? "on_camera" : "voiceover";
33018
+ }
32880
33019
  function adSpecToBlueprint(spec) {
32881
33020
  const total = spec.beats.length;
32882
33021
  const market = marketFor(spec);
@@ -32884,6 +33023,7 @@ function adSpecToBlueprint(spec) {
32884
33023
  const currency = market ? CURRENCY_BY_MARKET[market.toLowerCase()] : void 0;
32885
33024
  const physics = " Everything obeys real-world physics: paper, card and screens are OPAQUE with nothing showing through from behind, every object is at believable real-world scale next to the people handling it, and every object has its real-world form and construction \u2014 a phone has ONE screen and it is on the front. NO readable text or numbers anywhere in frame \u2014 phone screens, documents and signage stay illegible or out of focus, because any figure the model invents will contradict the script. Hands are kept simple: no close-up of fingers manipulating small parts, no hand gripping the edge of an object, and each person has exactly TWO arms and TWO legs, all attached and all visible or all out of frame. Anyone working does so the way the trade actually does it: nobody stands or kneels on the equipment being installed, nothing is fitted overhanging an edge or floating unsupported, and every part rests on the structure that would really carry it." + (currency ? ` If a currency is unavoidably visible it is ${currency}.` : "");
32886
33025
  const closesOnCard = endCardWanted(spec);
33026
+ const nativeSpeech = wantsNativeSpeech(spec, closesOnCard);
32887
33027
  let clock = 0;
32888
33028
  const scenes = spec.beats.map((beat, i) => {
32889
33029
  const isClosingCard = closesOnCard && i === total - 1;
@@ -32908,19 +33048,13 @@ function adSpecToBlueprint(spec) {
32908
33048
  // length to what the provider accepts. An ad emitted none of these until now,
32909
33049
  // so every one shipped with a music bed and no sound design at all.
32910
33050
  ...beat.sound?.trim() ? { sfx: [{ sound_effect_prompt: beat.sound.trim(), duration_s: Math.min(duration, 30) }] } : {},
32911
- dialogue: spec.voiceover === false ? [] : [
32912
- {
32913
- line: beat.say,
32914
- start_s: Math.round(start * 100) / 100,
32915
- end_s: Math.round(clock * 100) / 100,
32916
- // Never on the closing plate: it is a flat colour card with no one in it, and
32917
- // saying someone is on camera there told the engine to look for a mouth to
32918
- // lip-sync on a picture that has no person.
32919
- on_camera: beat.on_camera === true && !isClosingCard,
32920
- ...spec.voice?.description ? { voice_description: spec.voice.description } : {}
32921
- }
32922
- ],
32923
- motion_prompt: motionPrompt(beat, isClosingCard, place, physics),
33051
+ dialogue: beatDialogue(spec, beat, {
33052
+ start: Math.round(start * 100) / 100,
33053
+ end: Math.round(clock * 100) / 100,
33054
+ isClosingCard,
33055
+ nativeSpeech
33056
+ }),
33057
+ motion_prompt: motionPrompt(beat, beatToCamera(spec, beat, isClosingCard), isClosingCard, place, physics),
32924
33058
  start_frame_prompt: isClosingCard ? BRAND_PLATE : `${beat.show}${place}${physics}`
32925
33059
  };
32926
33060
  });
@@ -32929,12 +33063,17 @@ function adSpecToBlueprint(spec) {
32929
33063
  global: {
32930
33064
  transcript: spec.beats.map((b) => b.say).join(" "),
32931
33065
  voiceover: {
32932
- // Narration over the picture. Never `on_camera`: that is what tells the
32933
- // engine a mouth is a lip-sync candidate. A music-led ad says `none`, which is
32934
- // what keeps a voice out of it entirely.
32935
- mode: spec.voiceover === false ? "none" : "voiceover",
33066
+ mode: voiceoverMode(spec, nativeSpeech),
32936
33067
  ...spec.voice?.description ? { voice_description: spec.voice.description } : {}
32937
33068
  },
33069
+ ...spec.cast ? {
33070
+ cast: [
33071
+ {
33072
+ id: AD_CAST_ID,
33073
+ description: (spec.cast.description ?? "the ad's recurring person").trim()
33074
+ }
33075
+ ]
33076
+ } : {},
32938
33077
  ...spec.brand?.name || spec.brand?.logo ? {
32939
33078
  branding: {
32940
33079
  ...spec.brand?.name ? { name: spec.brand.name } : {},
@@ -33176,7 +33315,7 @@ registerSchema({
33176
33315
  }
33177
33316
  }
33178
33317
  });
33179
- var scaffoldAdCommand = defineCommand104({
33318
+ var scaffoldAdCommand = defineCommand105({
33180
33319
  meta: {
33181
33320
  name: "scaffold-ad",
33182
33321
  description: 'Build a captioned vertical ad from a written spec, with no reference video to copy.\n\nA spec is a list of BEATS. One beat = one line the voice says + one shot on screen while it is said. That pairing is what keeps the ad honest: the caption card IS the line, so it can never end mid-sentence, and the picture can never drift from the read.\n\nTwo rules the spec enforces for you, both learned the expensive way:\n \u2022 `say` is ONE clause with its own punctuation. Two sentences in a beat is rejected.\n \u2022 Nobody in shot is speaking unless you set `on_camera` on that beat. A person visibly talking under a voice that is not theirs reads as bad dubbing.\n\nExample spec:\n { "beats": [\n { "say": "Mientras t\xFA sigues pagando la luz a precio de oro,", "show": "Aerial over Spanish rooftops at golden hour." },\n { "say": "Haz clic en el enlace y reserva tu estudio gratuito.", "show": "A couple walking home at sunset." } ] }\n\nWho is in it:\n `cast: { avatar: "marta" }` grounds every beat on that avatar\'s face \u2014 cast one with `baker avatars`.\n Without a cast, each beat invents its own person and the ad reads as a stock-footage collage.\n\nHow it ends: with a `brand`, the last beat closes on a flat brand plate carrying the mark and the CTA.\n\nThen: baker canvas run <the canvas it writes>'
@@ -33268,6 +33407,20 @@ var scaffoldAdCommand = defineCommand104({
33268
33407
  ...filledPalette ? { palette: filledPalette } : {}
33269
33408
  };
33270
33409
  }
33410
+ const introducesOffCamera = spec.data.beats.map((beat, i) => ({ i, beat })).filter(({ beat }) => beat.on_camera !== true && lineIntroducesSpeaker(beat.say));
33411
+ if (introducesOffCamera.length > 0) {
33412
+ const first = introducesOffCamera[0];
33413
+ writeJson({
33414
+ ok: false,
33415
+ error: {
33416
+ code: "VALIDATION_ERROR",
33417
+ message: `Beat ${(first?.i ?? 0) + 1} says "${first?.beat.say.trim()}" \u2014 the speaker introducing themselves \u2014 but nobody is on camera saying it. A voice from off screen introducing the person standing in shot reads as a mistake, the same way a moving mouth under someone else's voice does.`,
33418
+ fix: 'Either set `on_camera: true` on that beat so they say it themselves \u2014 which needs the avatar to have their own pinned voice \u2014 or rewrite the line as narration about them rather than by them: "Marta instal\xF3 placas en nueve d\xEDas", not "Hola, soy Marta".'
33419
+ }
33420
+ });
33421
+ process.exit(1);
33422
+ return;
33423
+ }
33271
33424
  const speaksOnCamera = spec.data.beats.some((beat) => beat.on_camera === true);
33272
33425
  if (avatar && !avatar.voiceId && speaksOnCamera) {
33273
33426
  writeJson({
@@ -33275,7 +33428,7 @@ var scaffoldAdCommand = defineCommand104({
33275
33428
  error: {
33276
33429
  code: "VALIDATION_ERROR",
33277
33430
  message: `Avatar \`${handle}\` has no pinned voice, and this ad has them speaking on camera. Their lines would be read by a voice cast from a description \u2014 a mouth moving under somebody else's voice, which is exactly what dubbing looks like.`,
33278
- fix: `Give \`${handle}\` a voice first, or drop \`on_camera\` from every beat so they appear without speaking and the narration carries the read. An avatar is a face AND a voice; casting one without the other is what puts the wrong voice in their mouth.`
33431
+ fix: `Pick a voice with \`baker avatars voices --search "<how they should sound>" --gender <g> --language <l>\`, then pin it: \`baker avatars update --handle ${handle} --voice-id <id> --voice-description "<how it should sound>"\`. Or drop \`on_camera\` from every beat so they appear without speaking and the narration carries the read. An avatar is a face AND a voice; casting one without the other is what puts the wrong voice in their mouth.`
33279
33432
  }
33280
33433
  });
33281
33434
  process.exit(1);
@@ -33442,7 +33595,7 @@ var scaffoldAdCommand = defineCommand104({
33442
33595
  import { access as access2, cp as cp2, mkdir as mkdir8, readFile as readFile19, rm as rm7, writeFile as writeFile10 } from "fs/promises";
33443
33596
  import { tmpdir as tmpdir3 } from "os";
33444
33597
  import path26 from "path";
33445
- import { defineCommand as defineCommand105 } from "citty";
33598
+ import { defineCommand as defineCommand106 } from "citty";
33446
33599
 
33447
33600
  // src/engine/scaffold/lib/model-router.ts
33448
33601
  var SEEDANCE = "bytedance/seedance-2.0";
@@ -33887,7 +34040,7 @@ async function runAnalysisPasses(deconstructCanvas, selectModel) {
33887
34040
  return fail4("deconstruct", e instanceof Error ? e.message : String(e));
33888
34041
  }
33889
34042
  }
33890
- var scaffoldVideoCommand = defineCommand105({
34043
+ var scaffoldVideoCommand = defineCommand106({
33891
34044
  meta: {
33892
34045
  name: "scaffold-video",
33893
34046
  description: "Turn a reference video into a runnable reproduction canvas in one command. Runs billed passes \u2014 video_deconstruct (the full scene-by-scene blueprint + transcript, baked to a split, editable blueprint: a global prompt.json plus one small scenes/sNN.json per scene) and an AI selection of the video's RECURRING identity elements (person/animal/product/logo) \u2014 then scaffolds a pipeline where every scene boundary is a static-ad-grade frame (the blueprint as target_blueprint, a reference legend, the real frame as anchor) and each recurring element gets ONE shared [TODO] ingest slot wired into every frame it appears in. The clips feed Seedance an ultra-detailed motion brief (action, camera, dialogue, transcript). Edit a scene's scenes/sNN.json (or prompt.json for global cast/palette/brand), drop the real source images, then `baker canvas run`."
@@ -34197,7 +34350,7 @@ var scaffoldVideoCommand = defineCommand105({
34197
34350
  // src/commands/canvas/set-prompt.ts
34198
34351
  import { readFile as readFile20, writeFile as writeFile11 } from "fs/promises";
34199
34352
  import path27 from "path";
34200
- import { defineCommand as defineCommand106 } from "citty";
34353
+ import { defineCommand as defineCommand107 } from "citty";
34201
34354
  function setNodePrompt(canvas, nodeId, text2) {
34202
34355
  const nodes = canvas?.nodes;
34203
34356
  if (!Array.isArray(nodes)) throw new Error("canvas has no nodes array");
@@ -34212,7 +34365,7 @@ function setNodePrompt(canvas, nodeId, text2) {
34212
34365
  newNodes[idx] = newNode;
34213
34366
  return { ...canvas, nodes: newNodes };
34214
34367
  }
34215
- var setPromptCommand = defineCommand106({
34368
+ var setPromptCommand = defineCommand107({
34216
34369
  meta: {
34217
34370
  name: "set-prompt",
34218
34371
  description: "Safely set a node's params.prompt (a frame description, motion prompt, etc.) without hand-editing the JSON. Prefer --text-file for multi-line/accented copy \u2014 it preserves UTF-8 exactly, unlike shell-quoted jq."
@@ -34272,8 +34425,8 @@ var setPromptCommand = defineCommand106({
34272
34425
  // src/commands/canvas/validate.ts
34273
34426
  import { readFile as readFile21 } from "fs/promises";
34274
34427
  import path28 from "path";
34275
- import { defineCommand as defineCommand107 } from "citty";
34276
- var validateCommand = defineCommand107({
34428
+ import { defineCommand as defineCommand108 } from "citty";
34429
+ var validateCommand = defineCommand108({
34277
34430
  meta: {
34278
34431
  name: "validate",
34279
34432
  description: "Validate a canvas JSON file (no execution). Includes a per-node cost preview and runs each node's deep validators (composition meta checks for hyperframe_render/_snapshot)."
@@ -34346,7 +34499,7 @@ var validateCommand = defineCommand107({
34346
34499
  });
34347
34500
 
34348
34501
  // src/commands/canvas/index.ts
34349
- var canvasCommand = defineCommand108({
34502
+ var canvasCommand = defineCommand109({
34350
34503
  meta: {
34351
34504
  name: "canvas",
34352
34505
  description: `Run Baker creative canvas JSON files locally. Local nodes execute in-process; remote nodes POST to the Convex backend gateway.
@@ -34382,7 +34535,7 @@ Full guide: __tooling__/docs/tools/baker/canvas.md`
34382
34535
  });
34383
34536
 
34384
34537
  // src/commands/capabilities/index.ts
34385
- import { defineCommand as defineCommand109 } from "citty";
34538
+ import { defineCommand as defineCommand110 } from "citty";
34386
34539
  registerSchema({
34387
34540
  command: "capabilities",
34388
34541
  description: "Start here, before promising the user anything on an ad platform, in Analytics, or in Tag Manager. Answers three questions in one call: what is connected and with what access, what a write on each surface actually does when it lands, and what CANNOT be done here and why. Run it with no arguments for every surface; name one surface to also get the exact fields every change on it accepts.",
@@ -34425,7 +34578,7 @@ function capabilityHints(surfaces) {
34425
34578
  }
34426
34579
  return hints;
34427
34580
  }
34428
- var runCapabilities = defineCommand109({
34581
+ var runCapabilities = defineCommand110({
34429
34582
  meta: {
34430
34583
  name: "capabilities",
34431
34584
  description: `What Baker can and cannot do for this company, before any work starts.
@@ -34481,7 +34634,7 @@ Full guide: __tooling__/docs/tools/baker/capabilities.md`
34481
34634
  var capabilitiesCommand = runCapabilities;
34482
34635
 
34483
34636
  // src/commands/chats/index.ts
34484
- import { defineCommand as defineCommand110 } from "citty";
34637
+ import { defineCommand as defineCommand111 } from "citty";
34485
34638
  var STATUS_GROUPS = ["active", "archived", "all"];
34486
34639
  var REPO_SURFACES = ["knowledge", "company", "brand", "landings", "flows", "creatives"];
34487
34640
  function parseBoundedInt(raw, name, min, max) {
@@ -34503,7 +34656,7 @@ registerSchema({
34503
34656
  full: { type: "boolean", description: "Include each Session's full change list", required: false, default: false }
34504
34657
  }
34505
34658
  });
34506
- var listCommand11 = defineCommand110({
34659
+ var listCommand11 = defineCommand111({
34507
34660
  meta: { name: "list", description: "List other Sessions on this account, newest first." },
34508
34661
  args: {
34509
34662
  status: { type: "string", description: "Filter: active|archived|all (default: all)", required: false },
@@ -34558,7 +34711,7 @@ registerSchema({
34558
34711
  }
34559
34712
  }
34560
34713
  });
34561
- var viewCommand = defineCommand110({
34714
+ var viewCommand = defineCommand111({
34562
34715
  meta: {
34563
34716
  name: "view",
34564
34717
  description: "Inspect one Session's full effects \u2014 git content + actions/tags/ads, kickoff, commits."
@@ -34602,7 +34755,7 @@ registerSchema({
34602
34755
  }
34603
34756
  }
34604
34757
  });
34605
- var transcriptCommand = defineCommand110({
34758
+ var transcriptCommand = defineCommand111({
34606
34759
  meta: { name: "transcript", description: "Read another Session's conversation." },
34607
34760
  args: {
34608
34761
  id: { type: "positional", description: "The Session id", required: true },
@@ -34654,7 +34807,7 @@ registerSchema({
34654
34807
  }
34655
34808
  }
34656
34809
  });
34657
- var diffCommand = defineCommand110({
34810
+ var diffCommand = defineCommand111({
34658
34811
  meta: { name: "diff", description: "See a published Session's real file-level changes." },
34659
34812
  args: {
34660
34813
  id: { type: "positional", description: "The Session id", required: true },
@@ -34698,7 +34851,7 @@ var diffCommand = defineCommand110({
34698
34851
  }
34699
34852
  }
34700
34853
  });
34701
- var chatsCommand = defineCommand110({
34854
+ var chatsCommand = defineCommand111({
34702
34855
  meta: {
34703
34856
  name: "chats",
34704
34857
  description: `Inspect other Sessions on this account (read-only): list them, view what they produced, read their conversation, and see their real file changes \u2014 so you can reuse past work for a new goal.
@@ -34713,10 +34866,10 @@ Full guide: __tooling__/docs/tools/baker/chats.md`
34713
34866
  });
34714
34867
 
34715
34868
  // src/commands/creatives/index.ts
34716
- import { defineCommand as defineCommand112 } from "citty";
34869
+ import { defineCommand as defineCommand113 } from "citty";
34717
34870
 
34718
34871
  // src/commands/creatives/publish.ts
34719
- import { defineCommand as defineCommand111 } from "citty";
34872
+ import { defineCommand as defineCommand112 } from "citty";
34720
34873
 
34721
34874
  // src/commands/images/api.ts
34722
34875
  import { readFile as readFile22 } from "fs/promises";
@@ -34863,7 +35016,7 @@ async function publishCreative(args, deps = defaultImageApiDeps) {
34863
35016
  chatId: chatIdFromEnv2()
34864
35017
  });
34865
35018
  }
34866
- var publishCommand = defineCommand111({
35019
+ var publishCommand = defineCommand112({
34867
35020
  meta: {
34868
35021
  name: "publish",
34869
35022
  description: "Publish a final static creative image to Baker Creatives and print the creative reference JSON."
@@ -34921,7 +35074,7 @@ var publishCommand = defineCommand111({
34921
35074
  });
34922
35075
 
34923
35076
  // src/commands/creatives/index.ts
34924
- var creativesCommand3 = defineCommand112({
35077
+ var creativesCommand3 = defineCommand113({
34925
35078
  meta: {
34926
35079
  name: "creatives",
34927
35080
  description: `Publish static ad creatives as first-class Baker outputs.
@@ -34938,11 +35091,11 @@ Full guide: __tooling__/docs/tools/baker/creatives.md`
34938
35091
  });
34939
35092
 
34940
35093
  // src/commands/flows/index.ts
34941
- import { defineCommand as defineCommand117 } from "citty";
35094
+ import { defineCommand as defineCommand118 } from "citty";
34942
35095
 
34943
35096
  // src/commands/flows/add.ts
34944
35097
  import { randomUUID } from "crypto";
34945
- import { defineCommand as defineCommand113 } from "citty";
35098
+ import { defineCommand as defineCommand114 } from "citty";
34946
35099
 
34947
35100
  // src/commands/flows/shared.ts
34948
35101
  import { existsSync as existsSync5, readdirSync as readdirSync2, readFileSync as readFileSync9, writeFileSync as writeFileSync3 } from "fs";
@@ -35152,7 +35305,7 @@ registerSchema({
35152
35305
  parent: { type: "string", description: "Parent node id. Omit to append to the root's children.", required: false }
35153
35306
  }
35154
35307
  });
35155
- var addNodeCommand = defineCommand113({
35308
+ var addNodeCommand = defineCommand114({
35156
35309
  meta: {
35157
35310
  name: "add-node",
35158
35311
  description: 'Add a step to a form, with the skeleton its type requires. Example: baker flows add-node contact --type customForm --name "Contact Info"'
@@ -35248,7 +35401,7 @@ registerSchema({
35248
35401
  }
35249
35402
  }
35250
35403
  });
35251
- var addSideEffectCommand = defineCommand113({
35404
+ var addSideEffectCommand = defineCommand114({
35252
35405
  meta: {
35253
35406
  name: "add-side-effect",
35254
35407
  description: "Add a side effect to a step, with the skeleton its type requires. Example: baker flows add-side-effect contact --node <id> --type googleSpreadsheet"
@@ -35330,7 +35483,7 @@ var addSideEffectCommand = defineCommand113({
35330
35483
 
35331
35484
  // src/commands/flows/map.ts
35332
35485
  import { readFileSync as readFileSync11 } from "fs";
35333
- import { defineCommand as defineCommand114 } from "citty";
35486
+ import { defineCommand as defineCommand115 } from "citty";
35334
35487
 
35335
35488
  // src/commands/flows/value-expression.ts
35336
35489
  import { existsSync as existsSync6, readFileSync as readFileSync10 } from "fs";
@@ -36103,7 +36256,7 @@ async function mapOptions(args, fromFile, into) {
36103
36256
  destinationFields: hubspotForm ? await hubspotFieldCatalog(hubspotForm) : void 0
36104
36257
  };
36105
36258
  }
36106
- var mapCommand2 = defineCommand114({
36259
+ var mapCommand2 = defineCommand115({
36107
36260
  meta: {
36108
36261
  name: "map",
36109
36262
  description: "Map form fields onto any value a side effect sends \u2014 never hand-write a mapping. Start here: baker flows map contact --from map.json --write"
@@ -36201,7 +36354,7 @@ var mapCommand2 = defineCommand114({
36201
36354
  });
36202
36355
 
36203
36356
  // src/commands/flows/normalize.ts
36204
- import { defineCommand as defineCommand115 } from "citty";
36357
+ import { defineCommand as defineCommand116 } from "citty";
36205
36358
  var OPTIONAL_STRINGS = ["oauthProviderId"];
36206
36359
  var ARRAY_FIELDS = [
36207
36360
  "fieldMapping",
@@ -36270,7 +36423,7 @@ registerSchema({
36270
36423
  }
36271
36424
  }
36272
36425
  });
36273
- var normalizeCommand = defineCommand115({
36426
+ var normalizeCommand = defineCommand116({
36274
36427
  meta: {
36275
36428
  name: "normalize",
36276
36429
  description: "Repair the shapes a form file is allowed to get slightly wrong. Example: baker flows normalize contact --write"
@@ -36301,7 +36454,7 @@ var normalizeCommand = defineCommand115({
36301
36454
  });
36302
36455
 
36303
36456
  // src/commands/flows/schema.ts
36304
- import { defineCommand as defineCommand116 } from "citty";
36457
+ import { defineCommand as defineCommand117 } from "citty";
36305
36458
  registerSchema({
36306
36459
  command: "flows.schema",
36307
36460
  description: "The shape of one node or side-effect type: a pasteable skeleton, who fills each part, and the reference file with the craft. Start here before authoring anything in a form's _data.json.",
@@ -36326,7 +36479,7 @@ function triggerHints(triggers) {
36326
36479
  `A side effect on this step carries \`triggerId: "${triggers.completion}"\`, and \`baker flows add-side-effect\` writes it for you. The trigger belongs to the STEP, not to the side-effect type: one that does not match is valid, ships, and never runs.` + (others.length > 0 ? ` Other moments this step raises: ${others.join(", ")}.` : "")
36327
36480
  ];
36328
36481
  }
36329
- var schemaCommand = defineCommand116({
36482
+ var schemaCommand = defineCommand117({
36330
36483
  meta: {
36331
36484
  name: "schema",
36332
36485
  description: "Show a node or side-effect type's shape. Start here: baker flows schema node customForm \xB7 baker flows schema side-effect googleSpreadsheet \xB7 baker flows schema (lists both)"
@@ -36460,7 +36613,7 @@ function displayName(slug) {
36460
36613
  const name = tree.displayName;
36461
36614
  return typeof name === "string" && name.trim() ? name.trim() : slug;
36462
36615
  }
36463
- var listCommand12 = defineCommand117({
36616
+ var listCommand12 = defineCommand118({
36464
36617
  meta: {
36465
36618
  name: "list",
36466
36619
  description: "List Forms in this workspace with the count of confidential fields still needing setup. Example: baker flows list"
@@ -36481,7 +36634,7 @@ var listCommand12 = defineCommand117({
36481
36634
  });
36482
36635
  }
36483
36636
  });
36484
- var showCommand3 = defineCommand117({
36637
+ var showCommand3 = defineCommand118({
36485
36638
  meta: {
36486
36639
  name: "show",
36487
36640
  description: "Show a Form's confidential fields and their configuration status (never secret values). Example: baker flows show contact"
@@ -36509,7 +36662,7 @@ var showCommand3 = defineCommand117({
36509
36662
  });
36510
36663
  }
36511
36664
  });
36512
- var flowsCommand = defineCommand117({
36665
+ var flowsCommand = defineCommand118({
36513
36666
  meta: {
36514
36667
  name: "flows",
36515
36668
  description: `Read and shape this workspace's Forms (flows).
@@ -36543,10 +36696,10 @@ Full guide: __tooling__/docs/tools/baker/flows.md`
36543
36696
  });
36544
36697
 
36545
36698
  // src/commands/ga4/index.ts
36546
- import { defineCommand as defineCommand124 } from "citty";
36699
+ import { defineCommand as defineCommand125 } from "citty";
36547
36700
 
36548
36701
  // src/commands/ga4/audit.ts
36549
- import { defineCommand as defineCommand118 } from "citty";
36702
+ import { defineCommand as defineCommand119 } from "citty";
36550
36703
 
36551
36704
  // src/commands/ga4/resolve.ts
36552
36705
  async function fetchProperties(useCache = true) {
@@ -36612,7 +36765,7 @@ registerSchema({
36612
36765
  "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false }
36613
36766
  }
36614
36767
  });
36615
- var auditCommand2 = defineCommand118({
36768
+ var auditCommand2 = defineCommand119({
36616
36769
  meta: {
36617
36770
  name: "audit",
36618
36771
  description: `Run all GA4 admin health checks. Returns property config with playbook warnings.
@@ -36667,7 +36820,7 @@ Examples:
36667
36820
  });
36668
36821
 
36669
36822
  // src/commands/ga4/config.ts
36670
- import { defineCommand as defineCommand119 } from "citty";
36823
+ import { defineCommand as defineCommand120 } from "citty";
36671
36824
 
36672
36825
  // src/commands/ga4/shared.ts
36673
36826
  import { readFileSync as readFileSync12 } from "fs";
@@ -36863,7 +37016,7 @@ function configHints(config) {
36863
37016
  }
36864
37017
  return hints;
36865
37018
  }
36866
- var configCommand = defineCommand119({
37019
+ var configCommand = defineCommand120({
36867
37020
  meta: {
36868
37021
  name: "config",
36869
37022
  description: `Read how the property is configured to measure \u2014 key events, custom definitions, custom events, retention
@@ -36895,7 +37048,7 @@ Examples:
36895
37048
  });
36896
37049
 
36897
37050
  // src/commands/ga4/draft.ts
36898
- import { defineCommand as defineCommand120 } from "citty";
37051
+ import { defineCommand as defineCommand121 } from "citty";
36899
37052
  registerSchema({
36900
37053
  command: "ga4.draft",
36901
37054
  description: "Review and undo the Google Analytics changes staged on this chat. Use `list` to see everything staged, `show` to inspect one change in full before the chat completes, `amend` to correct one in place, and `remove`/`clear` to drop them. `list` and `show` take --chat <id> to read an earlier chat's changes instead.",
@@ -36904,13 +37057,13 @@ registerSchema({
36904
37057
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
36905
37058
  }
36906
37059
  });
36907
- var draftCommand3 = defineCommand120({
37060
+ var draftCommand3 = defineCommand121({
36908
37061
  meta: {
36909
37062
  name: "draft",
36910
37063
  description: "List, show, amend, remove or clear the Google Analytics changes staged on this chat. `list` and `show` take --chat <id> to read an earlier chat's changes instead."
36911
37064
  },
36912
37065
  subCommands: {
36913
- list: defineCommand120({
37066
+ list: defineCommand121({
36914
37067
  meta: { name: "list", description: "Review everything staged on this chat (--json for the raw envelope)" },
36915
37068
  args: {
36916
37069
  json: { type: "boolean", description: "Print the raw JSON envelope", required: false },
@@ -36920,7 +37073,7 @@ var draftCommand3 = defineCommand120({
36920
37073
  await draftList(args.json === true, args.chat);
36921
37074
  }
36922
37075
  }),
36923
- show: defineCommand120({
37076
+ show: defineCommand121({
36924
37077
  meta: {
36925
37078
  name: "show",
36926
37079
  description: "Print the full staged payload for one change, alongside how the property looks today \u2014 the receipt to verify it before the chat completes (never truncated)."
@@ -36937,7 +37090,7 @@ var draftCommand3 = defineCommand120({
36937
37090
  );
36938
37091
  }
36939
37092
  }),
36940
- amend: defineCommand120({
37093
+ amend: defineCommand121({
36941
37094
  meta: {
36942
37095
  name: "amend",
36943
37096
  description: "Update a staged change in place \u2014 merges a JSON patch into its payload (objects deep-merge, null deletes a key, arrays/scalars replace) and re-runs every check. Use this instead of remove + re-create."
@@ -36954,7 +37107,7 @@ var draftCommand3 = defineCommand120({
36954
37107
  });
36955
37108
  }
36956
37109
  }),
36957
- remove: defineCommand120({
37110
+ remove: defineCommand121({
36958
37111
  meta: { name: "remove", description: "Remove one staged change" },
36959
37112
  args: { ref: { type: "positional", description: "Staged ref or target id", required: false } },
36960
37113
  run: async ({ args }) => {
@@ -36963,7 +37116,7 @@ var draftCommand3 = defineCommand120({
36963
37116
  });
36964
37117
  }
36965
37118
  }),
36966
- clear: defineCommand120({
37119
+ clear: defineCommand121({
36967
37120
  meta: { name: "clear", description: "Discard all Google Analytics changes staged on this chat" },
36968
37121
  run: async () => {
36969
37122
  await draftAction2("/api/ga4/draft/clear", {});
@@ -36973,7 +37126,7 @@ var draftCommand3 = defineCommand120({
36973
37126
  });
36974
37127
 
36975
37128
  // src/commands/ga4/properties.ts
36976
- import { defineCommand as defineCommand121 } from "citty";
37129
+ import { defineCommand as defineCommand122 } from "citty";
36977
37130
  registerSchema({
36978
37131
  command: "ga4.properties",
36979
37132
  description: "List the GA4 properties this company connected \u2014 there can be several, and every one of them is yours to query. Returns the property IDs the query and audit commands take. Run this first to find property IDs.",
@@ -36989,7 +37142,7 @@ function propertyHints(properties) {
36989
37142
  resources: properties.map((property) => ({ id: property.externalId, label: property.name }))
36990
37143
  });
36991
37144
  }
36992
- var propertiesCommand = defineCommand121({
37145
+ var propertiesCommand = defineCommand122({
36993
37146
  meta: {
36994
37147
  name: "properties",
36995
37148
  description: `List accessible GA4 properties.
@@ -37039,7 +37192,7 @@ Examples:
37039
37192
  // src/commands/ga4/query.ts
37040
37193
  import { appendFileSync as appendFileSync2, existsSync as existsSync7, readFileSync as readFileSync13, writeFileSync as writeFileSync4 } from "fs";
37041
37194
  import { resolve as resolve2 } from "path";
37042
- import { defineCommand as defineCommand122 } from "citty";
37195
+ import { defineCommand as defineCommand123 } from "citty";
37043
37196
 
37044
37197
  // src/commands/ga4/presets.ts
37045
37198
  var GA4_PRESETS = [
@@ -37174,7 +37327,7 @@ function handleError3(err) {
37174
37327
  });
37175
37328
  process.exit(1);
37176
37329
  }
37177
- var queryCommand2 = defineCommand122({
37330
+ var queryCommand2 = defineCommand123({
37178
37331
  meta: {
37179
37332
  name: "query",
37180
37333
  description: `Run GA4 Data API reports. Preset-first with free-form escape hatch.
@@ -37245,7 +37398,7 @@ Free-form (escape hatch):
37245
37398
  });
37246
37399
 
37247
37400
  // src/commands/ga4/write-commands.ts
37248
- import { defineCommand as defineCommand123 } from "citty";
37401
+ import { defineCommand as defineCommand124 } from "citty";
37249
37402
  var PROPERTY_ARG_DESCRIPTION = "GA4 property id (optional only when one property is connected \u2014 run `baker ga4 properties`)";
37250
37403
  var propertyArg = { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false };
37251
37404
  function createJsonDescription(noun) {
@@ -37263,7 +37416,7 @@ registerSchema({
37263
37416
  "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
37264
37417
  }
37265
37418
  });
37266
- var keyEventCommand = defineCommand123({
37419
+ var keyEventCommand = defineCommand124({
37267
37420
  meta: {
37268
37421
  name: "key-event",
37269
37422
  description: `Stage key-event (conversion) changes
@@ -37276,7 +37429,7 @@ Examples:
37276
37429
  baker ga4 key-event delete 4185`
37277
37430
  },
37278
37431
  subCommands: {
37279
- create: defineCommand123({
37432
+ create: defineCommand124({
37280
37433
  meta: {
37281
37434
  name: "create",
37282
37435
  description: "Stage a new key event. Needs eventName and countingMethod (ONCE_PER_EVENT or ONCE_PER_SESSION); defaultValue sets a monetary value when the event does not send one."
@@ -37297,7 +37450,7 @@ Examples:
37297
37450
  );
37298
37451
  }
37299
37452
  }),
37300
- update: defineCommand123({
37453
+ update: defineCommand124({
37301
37454
  meta: {
37302
37455
  name: "update",
37303
37456
  description: "Stage a change to an existing key event (pass its id). Only countingMethod and defaultValue can change \u2014 Google will not rename a key event."
@@ -37317,7 +37470,7 @@ Examples:
37317
37470
  });
37318
37471
  }
37319
37472
  }),
37320
- delete: defineCommand123({
37473
+ delete: defineCommand124({
37321
37474
  meta: {
37322
37475
  name: "delete",
37323
37476
  description: "Stage removing a key event, so the event stops counting as a conversion. The event itself keeps being collected. Irreversible once the chat completes \u2014 confirm with the user first."
@@ -37365,7 +37518,7 @@ for (const { kind, noun, createHint } of DEFINITIONS) {
37365
37518
  }
37366
37519
  function definitionCommand(definition) {
37367
37520
  const { command, kind, noun, example } = definition;
37368
- return defineCommand123({
37521
+ return defineCommand124({
37369
37522
  meta: {
37370
37523
  name: command,
37371
37524
  description: `Stage ${noun} changes
@@ -37377,7 +37530,7 @@ Examples:
37377
37530
  baker ga4 ${command} archive 12`
37378
37531
  },
37379
37532
  subCommands: {
37380
- create: defineCommand123({
37533
+ create: defineCommand124({
37381
37534
  meta: { name: "create", description: `Stage a new ${noun} (or a JSON array of them, staged together)` },
37382
37535
  args: {
37383
37536
  json: { type: "string", description: createJsonDescription(noun), required: false },
@@ -37395,7 +37548,7 @@ Examples:
37395
37548
  );
37396
37549
  }
37397
37550
  }),
37398
- update: defineCommand123({
37551
+ update: defineCommand124({
37399
37552
  meta: {
37400
37553
  name: "update",
37401
37554
  description: `Stage a change to an existing ${noun} (pass its id). The parameter name and scope cannot change \u2014 archive and recreate for that.`
@@ -37415,7 +37568,7 @@ Examples:
37415
37568
  });
37416
37569
  }
37417
37570
  }),
37418
- archive: defineCommand123({
37571
+ archive: defineCommand124({
37419
37572
  meta: {
37420
37573
  name: "archive",
37421
37574
  description: `Stage archiving a ${noun} (pass its id). It stops collecting and leaves reporting; past data stays. Irreversible once the chat completes \u2014 confirm with the user first.`
@@ -37460,7 +37613,7 @@ var dataStreamArg = {
37460
37613
  function withStream(args) {
37461
37614
  return typeof args["data-stream"] === "string" ? { dataStream: args["data-stream"] } : {};
37462
37615
  }
37463
- var customEventCommand = defineCommand123({
37616
+ var customEventCommand = defineCommand124({
37464
37617
  meta: {
37465
37618
  name: "custom-event",
37466
37619
  description: `Stage custom events \u2014 new events built from events the site already sends
@@ -37471,7 +37624,7 @@ Examples:
37471
37624
  baker ga4 custom-event delete 7`
37472
37625
  },
37473
37626
  subCommands: {
37474
- create: defineCommand123({
37627
+ create: defineCommand124({
37475
37628
  meta: {
37476
37629
  name: "create",
37477
37630
  description: "Stage a new custom event. Conditions match the source event: use field `event_name` to match the event itself, or any parameter name to match its value."
@@ -37494,7 +37647,7 @@ Examples:
37494
37647
  );
37495
37648
  }
37496
37649
  }),
37497
- update: defineCommand123({
37650
+ update: defineCommand124({
37498
37651
  meta: { name: "update", description: "Stage a change to an existing custom event (pass its id)" },
37499
37652
  args: {
37500
37653
  id: { type: "positional", description: "Custom event rule id", required: false },
@@ -37513,7 +37666,7 @@ Examples:
37513
37666
  });
37514
37667
  }
37515
37668
  }),
37516
- delete: defineCommand123({
37669
+ delete: defineCommand124({
37517
37670
  meta: {
37518
37671
  name: "delete",
37519
37672
  description: "Stage removing a custom event (pass its id). The event stops being created from then on; data already collected under it stays. Confirm with the user first."
@@ -37568,7 +37721,7 @@ function booleanArg(input, flag) {
37568
37721
  if (input === "false") return false;
37569
37722
  return failValidation3(`--${flag} must be true or false`);
37570
37723
  }
37571
- var dataRetentionCommand = defineCommand123({
37724
+ var dataRetentionCommand = defineCommand124({
37572
37725
  meta: {
37573
37726
  name: "data-retention",
37574
37727
  description: `Stage a change to how long Google Analytics keeps data
@@ -37578,7 +37731,7 @@ Examples:
37578
37731
  baker ga4 data-retention set --event-data 14 --user-data 14 --reset-on-activity true`
37579
37732
  },
37580
37733
  subCommands: {
37581
- set: defineCommand123({
37734
+ set: defineCommand124({
37582
37735
  meta: { name: "set", description: "Stage the retention window (months)" },
37583
37736
  args: {
37584
37737
  "event-data": { type: "string", description: "2, 14, 26, 38 or 50", required: false },
@@ -37614,7 +37767,7 @@ registerSchema({
37614
37767
  "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
37615
37768
  }
37616
37769
  });
37617
- var audienceCommand = defineCommand123({
37770
+ var audienceCommand = defineCommand124({
37618
37771
  meta: {
37619
37772
  name: "audience",
37620
37773
  description: `Stage audience changes (saved groups of users, for retargeting and analysis)
@@ -37646,7 +37799,7 @@ Examples:
37646
37799
  baker ga4 audience archive 8813`
37647
37800
  },
37648
37801
  subCommands: {
37649
- create: defineCommand123({
37802
+ create: defineCommand124({
37650
37803
  meta: { name: "create", description: createJsonDescription("audience") },
37651
37804
  args: {
37652
37805
  json: { type: "string", description: createJsonDescription("audience"), required: false },
@@ -37664,7 +37817,7 @@ Examples:
37664
37817
  );
37665
37818
  }
37666
37819
  }),
37667
- update: defineCommand123({
37820
+ update: defineCommand124({
37668
37821
  meta: {
37669
37822
  name: "update",
37670
37823
  description: "Stage a new name or description (pass the audience id). Who is in it cannot be changed."
@@ -37685,7 +37838,7 @@ Examples:
37685
37838
  });
37686
37839
  }
37687
37840
  }),
37688
- archive: defineCommand123({
37841
+ archive: defineCommand124({
37689
37842
  meta: {
37690
37843
  name: "archive",
37691
37844
  description: "Stage retiring an audience. Cannot be undone \u2014 the users it gathered do not come back."
@@ -37714,7 +37867,7 @@ registerSchema({
37714
37867
  "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
37715
37868
  }
37716
37869
  });
37717
- var propertyCommand = defineCommand123({
37870
+ var propertyCommand = defineCommand124({
37718
37871
  meta: {
37719
37872
  name: "property",
37720
37873
  description: `Stage a change to the property's own settings
@@ -37724,7 +37877,7 @@ Examples:
37724
37877
  baker ga4 property set --name "Acme \u2014 Web" --industry REAL_ESTATE`
37725
37878
  },
37726
37879
  subCommands: {
37727
- set: defineCommand123({
37880
+ set: defineCommand124({
37728
37881
  meta: { name: "set", description: "Stage the property name and/or industry category" },
37729
37882
  args: {
37730
37883
  name: { type: "string", description: "New property display name", required: false },
@@ -37764,7 +37917,7 @@ registerSchema({
37764
37917
  "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
37765
37918
  }
37766
37919
  });
37767
- var adsLinkCommand = defineCommand123({
37920
+ var adsLinkCommand = defineCommand124({
37768
37921
  meta: {
37769
37922
  name: "ads-link",
37770
37923
  description: `Stage linking this property to a Google Ads account
@@ -37779,7 +37932,7 @@ Examples:
37779
37932
  baker ga4 ads-link delete L1234`
37780
37933
  },
37781
37934
  subCommands: {
37782
- create: defineCommand123({
37935
+ create: defineCommand124({
37783
37936
  meta: { name: "create", description: "Stage linking the property to a Google Ads account" },
37784
37937
  args: {
37785
37938
  "customer-id": { type: "string", description: "Google Ads customer id (123-456-7890)", required: false },
@@ -37798,7 +37951,7 @@ Examples:
37798
37951
  await stageOp3({ kind: "ga4.googleAdsLink.create", payload, ...withProperty(args) });
37799
37952
  }
37800
37953
  }),
37801
- update: defineCommand123({
37954
+ update: defineCommand124({
37802
37955
  meta: {
37803
37956
  name: "update",
37804
37957
  description: "Stage the ads-personalisation setting on an existing link (pass its id)"
@@ -37820,7 +37973,7 @@ Examples:
37820
37973
  });
37821
37974
  }
37822
37975
  }),
37823
- delete: defineCommand123({
37976
+ delete: defineCommand124({
37824
37977
  meta: {
37825
37978
  name: "delete",
37826
37979
  description: "Stage unlinking. Stops conversion imports and strands every audience on this property."
@@ -37871,7 +38024,7 @@ var MEASUREMENT_FLAGS = {
37871
38024
  "page-changes": "pageChangesEnabled",
37872
38025
  "form-interactions": "formInteractionsEnabled"
37873
38026
  };
37874
- var enhancedMeasurementCommand = defineCommand123({
38027
+ var enhancedMeasurementCommand = defineCommand124({
37875
38028
  meta: {
37876
38029
  name: "enhanced-measurement",
37877
38030
  description: `Stage the automatic events GA4 collects on a website stream
@@ -37885,7 +38038,7 @@ Examples:
37885
38038
  baker ga4 enhanced-measurement set --video false`
37886
38039
  },
37887
38040
  subCommands: {
37888
- set: defineCommand123({
38041
+ set: defineCommand124({
37889
38042
  meta: { name: "set", description: "Stage which automatic events the website stream collects" },
37890
38043
  args: {
37891
38044
  scrolls: { type: "string", description: "true|false", required: false },
@@ -37928,7 +38081,7 @@ Examples:
37928
38081
  });
37929
38082
 
37930
38083
  // src/commands/ga4/index.ts
37931
- var ga4Command = defineCommand124({
38084
+ var ga4Command = defineCommand125({
37932
38085
  meta: {
37933
38086
  name: "ga4",
37934
38087
  description: `Google Analytics 4. Report on a property, audit its config, and change what it measures.
@@ -37977,12 +38130,12 @@ Full guide: __tooling__/docs/tools/baker/ga4.md`
37977
38130
  });
37978
38131
 
37979
38132
  // src/commands/gsc/index.ts
37980
- import { defineCommand as defineCommand128 } from "citty";
38133
+ import { defineCommand as defineCommand129 } from "citty";
37981
38134
 
37982
38135
  // src/commands/gsc/query.ts
37983
38136
  import { appendFileSync as appendFileSync3, existsSync as existsSync8, readFileSync as readFileSync14, writeFileSync as writeFileSync5 } from "fs";
37984
38137
  import { resolve as resolve3 } from "path";
37985
- import { defineCommand as defineCommand125 } from "citty";
38138
+ import { defineCommand as defineCommand126 } from "citty";
37986
38139
 
37987
38140
  // src/commands/gsc/presets.ts
37988
38141
  var GSC_PRESETS = [
@@ -38176,7 +38329,7 @@ function handleError4(err) {
38176
38329
  });
38177
38330
  process.exit(1);
38178
38331
  }
38179
- var queryCommand3 = defineCommand125({
38332
+ var queryCommand3 = defineCommand126({
38180
38333
  meta: {
38181
38334
  name: "query",
38182
38335
  description: `Run GSC Search Analytics queries. Preset-first with free-form escape hatch.
@@ -38254,7 +38407,7 @@ Free-form (escape hatch):
38254
38407
  });
38255
38408
 
38256
38409
  // src/commands/gsc/sitemaps.ts
38257
- import { defineCommand as defineCommand126 } from "citty";
38410
+ import { defineCommand as defineCommand127 } from "citty";
38258
38411
  registerSchema({
38259
38412
  command: "gsc.sitemaps",
38260
38413
  description: "List sitemaps for a Search Console site. Check sitemap health and errors.",
@@ -38263,7 +38416,7 @@ registerSchema({
38263
38416
  "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false }
38264
38417
  }
38265
38418
  });
38266
- var sitemapsCommand = defineCommand126({
38419
+ var sitemapsCommand = defineCommand127({
38267
38420
  meta: {
38268
38421
  name: "sitemaps",
38269
38422
  description: `List sitemaps for a site. Check health and errors.
@@ -38316,7 +38469,7 @@ Examples:
38316
38469
  });
38317
38470
 
38318
38471
  // src/commands/gsc/sites.ts
38319
- import { defineCommand as defineCommand127 } from "citty";
38472
+ import { defineCommand as defineCommand128 } from "citty";
38320
38473
  registerSchema({
38321
38474
  command: "gsc.sites",
38322
38475
  description: "List the Search Console sites this company connected \u2014 there can be several, and every one of them is yours to query. Returns the site URLs the query and sitemaps commands take.",
@@ -38332,7 +38485,7 @@ function siteHints(sites) {
38332
38485
  resources: sites.map((site) => ({ id: site.siteUrl, label: site.permissionLevel }))
38333
38486
  });
38334
38487
  }
38335
- var sitesCommand = defineCommand127({
38488
+ var sitesCommand = defineCommand128({
38336
38489
  meta: {
38337
38490
  name: "sites",
38338
38491
  description: `List verified Search Console sites.
@@ -38380,7 +38533,7 @@ Examples:
38380
38533
  });
38381
38534
 
38382
38535
  // src/commands/gsc/index.ts
38383
- var gscCommand = defineCommand128({
38536
+ var gscCommand = defineCommand129({
38384
38537
  meta: {
38385
38538
  name: "gsc",
38386
38539
  description: `Google Search Console commands. PPC-SEO arbitrage, brand halo analysis, negative keyword discovery.
@@ -38404,7 +38557,7 @@ Full guide: __tooling__/docs/tools/baker/gsc.md`
38404
38557
  });
38405
38558
 
38406
38559
  // src/commands/history/index.ts
38407
- import { defineCommand as defineCommand129 } from "citty";
38560
+ import { defineCommand as defineCommand130 } from "citty";
38408
38561
  registerSchema({
38409
38562
  command: "history.list",
38410
38563
  description: "Start here: unified account history (audit log) \u2014 everything that changed on this account, newest first: publishes, chat lifecycle, backlog actions, team changes, setup links, tags, schedules, ad-platform writes, followed advertisers, media, creatives, reports, domains, and integrations. Use it to see what happened recently before planning work. Compact by default; add --full for raw metadata per entry.",
@@ -38459,7 +38612,7 @@ function parseBoundedInt2(raw, name, min, max) {
38459
38612
  }
38460
38613
  return value;
38461
38614
  }
38462
- var listCommand13 = defineCommand129({
38615
+ var listCommand13 = defineCommand130({
38463
38616
  meta: {
38464
38617
  name: "list",
38465
38618
  description: "List recent account changes (unified audit log), newest first."
@@ -38505,7 +38658,7 @@ var listCommand13 = defineCommand129({
38505
38658
  }
38506
38659
  }
38507
38660
  });
38508
- var historyCommand = defineCommand129({
38661
+ var historyCommand = defineCommand130({
38509
38662
  meta: {
38510
38663
  name: "history",
38511
38664
  description: `Unified account history (audit log): what changed, who did it, and when.
@@ -38515,7 +38668,7 @@ Full guide: __tooling__/docs/tools/baker/history.md`
38515
38668
  });
38516
38669
 
38517
38670
  // src/commands/hubspot/index.ts
38518
- import { defineCommand as defineCommand130 } from "citty";
38671
+ import { defineCommand as defineCommand131 } from "citty";
38519
38672
  var EMBED_TYPES = ["legacy", "v4", "unknown"];
38520
38673
  function failNotConnected(err) {
38521
38674
  if (err instanceof ApiError && err.code === "FORBIDDEN" && err.message.includes(HUBSPOT_MISSING_GRANT_MARKER)) {
@@ -38669,7 +38822,7 @@ registerSchema({
38669
38822
  }
38670
38823
  }
38671
38824
  });
38672
- var formsListCommand = defineCommand130({
38825
+ var formsListCommand = defineCommand131({
38673
38826
  meta: {
38674
38827
  name: "list",
38675
38828
  description: "List HubSpot forms with embed type and post-submit action. Example: baker hubspot forms list --redirecting-only"
@@ -38714,7 +38867,7 @@ var formsListCommand = defineCommand130({
38714
38867
  }
38715
38868
  }
38716
38869
  });
38717
- var formsViewCommand = defineCommand130({
38870
+ var formsViewCommand = defineCommand131({
38718
38871
  meta: {
38719
38872
  name: "view",
38720
38873
  description: "Show one HubSpot form's fields and configuration. Example: baker hubspot forms view 1a2b3c"
@@ -38766,7 +38919,7 @@ var formsViewCommand = defineCommand130({
38766
38919
  }
38767
38920
  }
38768
38921
  });
38769
- var meetingsListCommand = defineCommand130({
38922
+ var meetingsListCommand = defineCommand131({
38770
38923
  meta: {
38771
38924
  name: "list",
38772
38925
  description: "List HubSpot meeting links (calendars). Example: baker hubspot meetings list"
@@ -38808,7 +38961,7 @@ var meetingsListCommand = defineCommand130({
38808
38961
  }
38809
38962
  }
38810
38963
  });
38811
- var meetingsViewCommand = defineCommand130({
38964
+ var meetingsViewCommand = defineCommand131({
38812
38965
  meta: {
38813
38966
  name: "view",
38814
38967
  description: "Show one HubSpot meeting link's booking fields. Example: baker hubspot meetings view discovery-call"
@@ -38852,7 +39005,7 @@ var meetingsViewCommand = defineCommand130({
38852
39005
  }
38853
39006
  }
38854
39007
  });
38855
- var formsSubmissionsCommand = defineCommand130({
39008
+ var formsSubmissionsCommand = defineCommand131({
38856
39009
  meta: {
38857
39010
  name: "submissions",
38858
39011
  description: "How many leads a form received, and when. Example: baker hubspot forms submissions <formId> --days 30"
@@ -38901,7 +39054,7 @@ var formsSubmissionsCommand = defineCommand130({
38901
39054
  }
38902
39055
  }
38903
39056
  });
38904
- var workflowsListCommand = defineCommand130({
39057
+ var workflowsListCommand = defineCommand131({
38905
39058
  meta: {
38906
39059
  name: "list",
38907
39060
  description: "List HubSpot workflows. Example: baker hubspot workflows list --enabled-only"
@@ -38966,7 +39119,7 @@ function workflowViewHints(workflow) {
38966
39119
  }
38967
39120
  return hints;
38968
39121
  }
38969
- var workflowsViewCommand = defineCommand130({
39122
+ var workflowsViewCommand = defineCommand131({
38970
39123
  meta: {
38971
39124
  name: "view",
38972
39125
  description: "Read one workflow's real configuration \u2014 enrolment, branches in order, and what each step writes. Example: baker hubspot workflows view 121183594 --full"
@@ -38993,7 +39146,7 @@ var workflowsViewCommand = defineCommand130({
38993
39146
  }
38994
39147
  }
38995
39148
  });
38996
- var pipelinesListCommand = defineCommand130({
39149
+ var pipelinesListCommand = defineCommand131({
38997
39150
  meta: {
38998
39151
  name: "list",
38999
39152
  description: "List HubSpot deal pipelines and their stages. Example: baker hubspot pipelines list"
@@ -39010,7 +39163,7 @@ var pipelinesListCommand = defineCommand130({
39010
39163
  }
39011
39164
  }
39012
39165
  });
39013
- var contactsSummaryCommand = defineCommand130({
39166
+ var contactsSummaryCommand = defineCommand131({
39014
39167
  meta: {
39015
39168
  name: "summary",
39016
39169
  description: "Whether recent leads are being worked, as counts. Example: baker hubspot contacts summary --days 30"
@@ -39080,7 +39233,7 @@ function contactLookupHints(data) {
39080
39233
  }
39081
39234
  return hints;
39082
39235
  }
39083
- var contactsLookupCommand = defineCommand130({
39236
+ var contactsLookupCommand = defineCommand131({
39084
39237
  meta: {
39085
39238
  name: "lookup",
39086
39239
  description: "Find one contact by email and see whether it was worked. Example: baker hubspot contacts lookup a@b.com"
@@ -39104,27 +39257,27 @@ var contactsLookupCommand = defineCommand130({
39104
39257
  }
39105
39258
  }
39106
39259
  });
39107
- var contactsCommand = defineCommand130({
39260
+ var contactsCommand = defineCommand131({
39108
39261
  meta: { name: "contacts", description: "Contacts on the connected HubSpot account." },
39109
39262
  subCommands: { summary: contactsSummaryCommand, lookup: contactsLookupCommand }
39110
39263
  });
39111
- var formsCommand = defineCommand130({
39264
+ var formsCommand = defineCommand131({
39112
39265
  meta: { name: "forms", description: "HubSpot forms on the connected account." },
39113
39266
  subCommands: { list: formsListCommand, view: formsViewCommand, submissions: formsSubmissionsCommand }
39114
39267
  });
39115
- var workflowsCommand = defineCommand130({
39268
+ var workflowsCommand = defineCommand131({
39116
39269
  meta: { name: "workflows", description: "HubSpot workflows on the connected account." },
39117
39270
  subCommands: { list: workflowsListCommand, view: workflowsViewCommand }
39118
39271
  });
39119
- var pipelinesCommand = defineCommand130({
39272
+ var pipelinesCommand = defineCommand131({
39120
39273
  meta: { name: "pipelines", description: "HubSpot deal pipelines on the connected account." },
39121
39274
  subCommands: { list: pipelinesListCommand }
39122
39275
  });
39123
- var meetingsCommand = defineCommand130({
39276
+ var meetingsCommand = defineCommand131({
39124
39277
  meta: { name: "meetings", description: "HubSpot meeting links (calendars) on the connected account." },
39125
39278
  subCommands: { list: meetingsListCommand, view: meetingsViewCommand }
39126
39279
  });
39127
- var hubspotCommand = defineCommand130({
39280
+ var hubspotCommand = defineCommand131({
39128
39281
  meta: {
39129
39282
  name: "hubspot",
39130
39283
  description: `Read the connected HubSpot account \u2014 forms, the leads they received, workflows, deal pipelines and
@@ -39162,10 +39315,10 @@ Full guide: __tooling__/docs/tools/baker/hubspot.md`
39162
39315
  });
39163
39316
 
39164
39317
  // src/commands/images/index.ts
39165
- import { defineCommand as defineCommand156 } from "citty";
39318
+ import { defineCommand as defineCommand157 } from "citty";
39166
39319
 
39167
39320
  // src/commands/images/crop.ts
39168
- import { defineCommand as defineCommand131 } from "citty";
39321
+ import { defineCommand as defineCommand132 } from "citty";
39169
39322
 
39170
39323
  // src/lib/image/crop-sprite.ts
39171
39324
  import sharp from "sharp";
@@ -39287,7 +39440,7 @@ function emitError2(err) {
39287
39440
  }
39288
39441
  process.exit(1);
39289
39442
  }
39290
- var cropCommand = defineCommand131({
39443
+ var cropCommand = defineCommand132({
39291
39444
  meta: {
39292
39445
  name: "crop",
39293
39446
  description: "Crop a rectangular region from an image.\n\nExample: baker images crop sprite.png --x 0 --y 0 --width 64 --height 64 --output icon.png"
@@ -39323,7 +39476,7 @@ var cropCommand = defineCommand131({
39323
39476
  });
39324
39477
 
39325
39478
  // src/commands/images/delete.ts
39326
- import { defineCommand as defineCommand132 } from "citty";
39479
+ import { defineCommand as defineCommand133 } from "citty";
39327
39480
  registerSchema({
39328
39481
  command: "images.delete",
39329
39482
  description: "Delete an image by ID",
@@ -39337,7 +39490,7 @@ registerSchema({
39337
39490
  }
39338
39491
  }
39339
39492
  });
39340
- var deleteCommand2 = defineCommand132({
39493
+ var deleteCommand2 = defineCommand133({
39341
39494
  meta: {
39342
39495
  name: "delete",
39343
39496
  description: "Delete an image by ID. Use --dry-run to preview. Example: baker images delete j571abc123 --dry-run"
@@ -39378,7 +39531,7 @@ var deleteCommand2 = defineCommand132({
39378
39531
  });
39379
39532
 
39380
39533
  // src/commands/images/dimensions.ts
39381
- import { defineCommand as defineCommand133 } from "citty";
39534
+ import { defineCommand as defineCommand134 } from "citty";
39382
39535
 
39383
39536
  // src/lib/image/dimensions.ts
39384
39537
  import { imageSize } from "image-size";
@@ -39407,7 +39560,7 @@ registerSchema({
39407
39560
  }
39408
39561
  }
39409
39562
  });
39410
- var dimensionsCommand = defineCommand133({
39563
+ var dimensionsCommand = defineCommand134({
39411
39564
  meta: {
39412
39565
  name: "dimensions",
39413
39566
  description: "Read image dimensions without decoding the full file.\n\nExample: baker images dimensions ./logo.png\nExample: baker images dimensions https://acme.com/hero.png"
@@ -39463,7 +39616,7 @@ var dimensionsCommand = defineCommand133({
39463
39616
  });
39464
39617
 
39465
39618
  // src/commands/images/download.ts
39466
- import { defineCommand as defineCommand134 } from "citty";
39619
+ import { defineCommand as defineCommand135 } from "citty";
39467
39620
 
39468
39621
  // src/commands/images/downloadPaths.ts
39469
39622
  import { basename as basename2, extname as extname3, join as join6 } from "path";
@@ -39688,7 +39841,7 @@ function emitError3(err) {
39688
39841
  writeJson({ ok: false, error: { code: "INTERNAL_ERROR", message: "Unexpected error" } });
39689
39842
  process.exit(1);
39690
39843
  }
39691
- var downloadCommand = defineCommand134({
39844
+ var downloadCommand = defineCommand135({
39692
39845
  meta: {
39693
39846
  name: "download",
39694
39847
  description: "Download image URLs and/or library images to local files \u2014 the missing first half of `source \u2192 download \u2192 normalize \u2192 place`. Never use `curl` for this.\n\nExamples:\n baker images download https://media.withbaker.com/\u2026/logo.webp\n baker images download j57abc123 j57def456 --out src/pages/pricing/_images/\n baker images download https://\u2026/hero.png --out ./hero.png"
@@ -39721,7 +39874,7 @@ var downloadCommand = defineCommand134({
39721
39874
  });
39722
39875
 
39723
39876
  // src/commands/images/extract.ts
39724
- import { defineCommand as defineCommand135 } from "citty";
39877
+ import { defineCommand as defineCommand136 } from "citty";
39725
39878
 
39726
39879
  // src/commands/images/autoIngest.ts
39727
39880
  var AUTO_INGEST_MAX = {
@@ -39768,7 +39921,7 @@ registerSchema({
39768
39921
  }
39769
39922
  }
39770
39923
  });
39771
- var extractCommand = defineCommand135({
39924
+ var extractCommand = defineCommand136({
39772
39925
  meta: {
39773
39926
  name: "extract",
39774
39927
  description: "Pull every image from a single URL via Firecrawl. ~$0.001/scrape. Cap auto-ingest at 20.\n\nExample: baker images extract https://stripe.com --auto-ingest 5"
@@ -39823,7 +39976,7 @@ var extractCommand = defineCommand135({
39823
39976
  });
39824
39977
 
39825
39978
  // src/commands/images/find.ts
39826
- import { defineCommand as defineCommand136 } from "citty";
39979
+ import { defineCommand as defineCommand137 } from "citty";
39827
39980
 
39828
39981
  // src/commands/images/providerHits.ts
39829
39982
  function asRecord3(value) {
@@ -39961,7 +40114,7 @@ registerSchema({
39961
40114
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
39962
40115
  }
39963
40116
  });
39964
- var findCommand = defineCommand136({
40117
+ var findCommand = defineCommand137({
39965
40118
  meta: {
39966
40119
  name: "find",
39967
40120
  description: "Library-first fanout image search. Opt in to providers with --sources. `--fallback` short-circuits to externals only when library is thin. With --auto-ingest, ingested external hits return Baker-owned URLs.\n\nExample: baker images find 'office' --sources library,magnific --limit 20"
@@ -40034,7 +40187,7 @@ var findCommand = defineCommand136({
40034
40187
  });
40035
40188
 
40036
40189
  // src/commands/images/get.ts
40037
- import { defineCommand as defineCommand137 } from "citty";
40190
+ import { defineCommand as defineCommand138 } from "citty";
40038
40191
  registerSchema({
40039
40192
  command: "images.get",
40040
40193
  description: "Get a single image by ID",
@@ -40042,7 +40195,7 @@ registerSchema({
40042
40195
  id: { type: "string", description: "Image ID", required: true }
40043
40196
  }
40044
40197
  });
40045
- var getCommand3 = defineCommand137({
40198
+ var getCommand3 = defineCommand138({
40046
40199
  meta: { name: "get", description: "Get a single image by ID. Example: baker images get j571abc123" },
40047
40200
  args: {
40048
40201
  id: { type: "positional", description: "Image ID", required: false },
@@ -40078,7 +40231,7 @@ var getCommand3 = defineCommand137({
40078
40231
  });
40079
40232
 
40080
40233
  // src/commands/images/gif.ts
40081
- import { defineCommand as defineCommand138 } from "citty";
40234
+ import { defineCommand as defineCommand139 } from "citty";
40082
40235
  registerSchema({
40083
40236
  command: "images.gif",
40084
40237
  description: "Search Giphy for GIFs / reaction memes (paid social creative).",
@@ -40110,7 +40263,7 @@ registerSchema({
40110
40263
  }
40111
40264
  }
40112
40265
  });
40113
- var gifCommand = defineCommand138({
40266
+ var gifCommand = defineCommand139({
40114
40267
  meta: {
40115
40268
  name: "gif",
40116
40269
  description: "Search Giphy for GIFs / reaction memes \u2014 built for paid-social creative (Meta, TikTok, LinkedIn, X). Free API. Each hit carries WebP + GIF + MP4 URLs in providerMeta so you can pick the right format per platform.\n\nExample: baker images gif 'this is fine' --limit 10\nExample: baker images gif 'office reaction' --rating pg --auto-ingest 2\nExample: baker images gif --trending --limit 25"
@@ -40157,7 +40310,7 @@ var gifCommand = defineCommand138({
40157
40310
  });
40158
40311
 
40159
40312
  // src/commands/images/google.ts
40160
- import { defineCommand as defineCommand139 } from "citty";
40313
+ import { defineCommand as defineCommand140 } from "citty";
40161
40314
  var GOOGLE_ERROR_FIX = {
40162
40315
  action: "use_different_resource",
40163
40316
  explanation: "Generate the asset instead of retrying Google. Google is the last-resort image provider. Run `baker studio generate` to make the asset. Never sleep-and-retry this command \u2014 the CLI already backs off on rate limits. If no image can be sourced, continue the rest of the task with a placeholder rather than aborting it."
@@ -40197,7 +40350,7 @@ registerSchema({
40197
40350
  }
40198
40351
  }
40199
40352
  });
40200
- var googleCommand2 = defineCommand139({
40353
+ var googleCommand2 = defineCommand140({
40201
40354
  meta: {
40202
40355
  name: "google",
40203
40356
  description: "Google Images via the official Custom Search JSON API ($0.005/query, free 100/day). \u26A0 Source unverified \u2014 watermarks, low-res, mislabeled results are common. Use as last resort. With --auto-ingest, ingested hits return Baker-owned URLs.\n\nExample: baker images google 'industrial workshop' --type photo --size large --limit 20"
@@ -40270,7 +40423,7 @@ var googleCommand2 = defineCommand139({
40270
40423
  });
40271
40424
 
40272
40425
  // src/commands/images/group.ts
40273
- import { defineCommand as defineCommand140 } from "citty";
40426
+ import { defineCommand as defineCommand141 } from "citty";
40274
40427
 
40275
40428
  // src/commands/mediaGroup.ts
40276
40429
  async function runMediaGroupLookup(input) {
@@ -40323,7 +40476,7 @@ registerSchema({
40323
40476
  "group-key": { type: "string", description: "The set key directly, when you already have it", required: false }
40324
40477
  }
40325
40478
  });
40326
- var groupCommand = defineCommand140({
40479
+ var groupCommand = defineCommand141({
40327
40480
  meta: {
40328
40481
  name: "group",
40329
40482
  description: "List every asset that arrived in the same set \u2014 the slides of one Instagram carousel, the images off one scraped page. Start here whenever a hit looks like part of a sequence: carousel slides are authored to be read in order and usually only make sense together. Takes an image or a video id, since one carousel can contain both. Example: baker images group <imageId>"
@@ -40343,7 +40496,7 @@ var groupCommand = defineCommand140({
40343
40496
  });
40344
40497
 
40345
40498
  // src/commands/images/icon.ts
40346
- import { defineCommand as defineCommand141 } from "citty";
40499
+ import { defineCommand as defineCommand142 } from "citty";
40347
40500
 
40348
40501
  // src/commands/images/brandVerification.ts
40349
40502
  function brandToken(domain) {
@@ -40440,7 +40593,7 @@ registerSchema({
40440
40593
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
40441
40594
  }
40442
40595
  });
40443
- var iconCommand = defineCommand141({
40596
+ var iconCommand = defineCommand142({
40444
40597
  meta: {
40445
40598
  name: "icon",
40446
40599
  description: "Icon via Iconify (simple-icons, logos, lucide, devicon, heroicons, tabler, phosphor, material-symbols, \u2026). Free CDN, no API key.\n\nExample: baker images icon react --set devicon\nExample: baker images icon lucide:check --color '#0a0a0a'"
@@ -40510,7 +40663,7 @@ var iconCommand = defineCommand141({
40510
40663
  });
40511
40664
 
40512
40665
  // src/commands/images/ingest.ts
40513
- import { defineCommand as defineCommand142 } from "citty";
40666
+ import { defineCommand as defineCommand143 } from "citty";
40514
40667
  var SOURCE_VALUES = imageSourceSchema.options.join(" | ");
40515
40668
  registerSchema({
40516
40669
  command: "images.ingest",
@@ -40525,7 +40678,7 @@ registerSchema({
40525
40678
  fields: { type: "string", description: "Comma-separated field names to include", required: false }
40526
40679
  }
40527
40680
  });
40528
- var ingestCommand = defineCommand142({
40681
+ var ingestCommand = defineCommand143({
40529
40682
  meta: {
40530
40683
  name: "ingest",
40531
40684
  description: "Download a remote URL and store it in the library. Hash-deduped on bytes + externalId.\n\nExample: baker images ingest https://img.freepik.com/free-photo/xyz.jpg --source magnific --external-id 12345"
@@ -40594,7 +40747,7 @@ var ingestCommand = defineCommand142({
40594
40747
  });
40595
40748
 
40596
40749
  // src/commands/images/layerize.ts
40597
- import { defineCommand as defineCommand143 } from "citty";
40750
+ import { defineCommand as defineCommand144 } from "citty";
40598
40751
  registerSchema({
40599
40752
  command: "images.layerize",
40600
40753
  description: "Split a library image into editable layers: transparent PNG cutouts for each element, plus any headline recovered as EDITABLE TEXT with its font, size, colour and position. Waits for completion by default. Costs credits.",
@@ -40658,7 +40811,7 @@ async function pollUntilSettled(imageId, maxWait) {
40658
40811
  }
40659
40812
  return null;
40660
40813
  }
40661
- var layerizeCommand = defineCommand143({
40814
+ var layerizeCommand = defineCommand144({
40662
40815
  meta: {
40663
40816
  name: "layerize",
40664
40817
  description: "Split a library image into editable layers \u2014 transparent cutouts per element, plus any baked-in headline recovered as editable text with its typography.\n\nStart here: baker images layerize j571abc123def\nExample: baker images layerize j571abc123def --full\nExample: baker images layerize j571abc123def --instructions 'keep the product and its shadow together'"
@@ -40727,7 +40880,7 @@ registerSchema({
40727
40880
  full: { type: "boolean", description: "Include geometry and typography for every layer", required: false }
40728
40881
  }
40729
40882
  });
40730
- var layersCommand = defineCommand143({
40883
+ var layersCommand = defineCommand144({
40731
40884
  meta: {
40732
40885
  name: "layers",
40733
40886
  description: "Read the layers of an image that has already been split. Free \u2014 no provider call.\n\nStart here: baker images layers j571abc123def\nExample: baker images layers j571abc123def --full"
@@ -40767,7 +40920,7 @@ var layersCommand = defineCommand143({
40767
40920
  });
40768
40921
 
40769
40922
  // src/commands/images/library.ts
40770
- import { defineCommand as defineCommand144 } from "citty";
40923
+ import { defineCommand as defineCommand145 } from "citty";
40771
40924
  registerSchema({
40772
40925
  command: "images.library",
40773
40926
  description: "Search the company image library. Returns only ready images.",
@@ -40793,7 +40946,7 @@ registerSchema({
40793
40946
  }
40794
40947
  }
40795
40948
  });
40796
- var libraryCommand = defineCommand144({
40949
+ var libraryCommand = defineCommand145({
40797
40950
  meta: {
40798
40951
  name: "library",
40799
40952
  description: "Search the company image library (hybrid BM25 + vector + Cohere rerank). Use this BEFORE any external provider.\n\nExample: baker images library 'hero banner' --aspect-ratio 16:9 --source magnific"
@@ -40856,7 +41009,7 @@ var libraryCommand = defineCommand144({
40856
41009
  });
40857
41010
 
40858
41011
  // src/commands/images/logo.ts
40859
- import { defineCommand as defineCommand145 } from "citty";
41012
+ import { defineCommand as defineCommand146 } from "citty";
40860
41013
  registerSchema({
40861
41014
  command: "images.logo",
40862
41015
  description: "Brand logo lookup via Brandfetch. Auto-ingests by default. Returns `brandMatch` \u2014 Brandfetch's own verdict on whose brand the domain is (confirmed | mismatch | unverified). Branch on it: `mismatch` means the mark is another company's, so do not place it. `confirmed` verifies the record, not the artwork \u2014 read the ingested row back to check the mark itself.",
@@ -40884,7 +41037,7 @@ registerSchema({
40884
41037
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
40885
41038
  }
40886
41039
  });
40887
- var logoCommand = defineCommand145({
41040
+ var logoCommand = defineCommand146({
40888
41041
  meta: {
40889
41042
  name: "logo",
40890
41043
  description: "Brand logo via Brandfetch. Returns up to 5 variants (icon, light/dark logo, light/dark symbol) plus `brandMatch`. Auto-ingests the first variant.\n\nStart here: check `brandMatch.verdict`.\n mismatch \u2192 the mark belongs to `brandMatch.name`, a different company. Do not place it.\n unverified \u2192 nothing confirmed whose logo this is. Treat as unchecked.\n confirmed \u2192 Brandfetch has this brand's record. That verifies the record, NOT the artwork \u2014 a confirmed domain has served another company's logo before.\n\n\u26A0 Whatever the verdict, read the ingested row back with `baker images get <imageId>` and check `textInImage`/`subject` before placing it. That is the only check that looks at the mark.\n\nExample: baker images logo stripe.com --variant logo"
@@ -40957,7 +41110,7 @@ var logoCommand = defineCommand145({
40957
41110
  });
40958
41111
 
40959
41112
  // src/commands/images/normalize.ts
40960
- import { defineCommand as defineCommand146 } from "citty";
41113
+ import { defineCommand as defineCommand147 } from "citty";
40961
41114
 
40962
41115
  // src/lib/image/color-changer.ts
40963
41116
  import quantize from "quantize";
@@ -41689,7 +41842,7 @@ function coerceRawArgs(args) {
41689
41842
  "dry-run": bool(args["dry-run"])
41690
41843
  };
41691
41844
  }
41692
- var normalizeCommand2 = defineCommand146({
41845
+ var normalizeCommand2 = defineCommand147({
41693
41846
  meta: {
41694
41847
  name: "normalize",
41695
41848
  description: `Normalize logos / images: declarative recolor + bg removal + trim + resize. Operates on local files; writes in-place by default.
@@ -41744,7 +41897,7 @@ Examples:
41744
41897
  });
41745
41898
 
41746
41899
  // src/commands/images/pinterest.ts
41747
- import { defineCommand as defineCommand147 } from "citty";
41900
+ import { defineCommand as defineCommand148 } from "citty";
41748
41901
  registerSchema({
41749
41902
  command: "images.pinterest",
41750
41903
  description: "Pinterest image search via ScrapeCreators. Reference-grade real-world photography, product styling, interiors, fashion, food, and aesthetic mood boards. Inspect before placing \u2014 Pinterest is unverified, trademark-bearing web content.",
@@ -41764,7 +41917,7 @@ registerSchema({
41764
41917
  }
41765
41918
  }
41766
41919
  });
41767
- var pinterestCommand = defineCommand147({
41920
+ var pinterestCommand = defineCommand148({
41768
41921
  meta: {
41769
41922
  name: "pinterest",
41770
41923
  description: "Pinterest image search via ScrapeCreators ($0.00188/request). Best for photo-realistic reference imagery \u2014 lifestyle, interiors, fashion, food, product styling, and mood boards to brief AI generation against. \u26A0 Unverified, trademark-bearing web content \u2014 inspect and respect rights before placing on a customer page. Browse first; auto-ingest only the pins you commit to.\n\nExamples:\n baker images pinterest 'scandinavian living room'\n baker images pinterest 'minimalist skincare product photography' --limit 20\n baker images pinterest 'cozy coffee shop interior' --auto-ingest 2 --context 'Mood reference for hero photography'"
@@ -41821,7 +41974,7 @@ var pinterestCommand = defineCommand147({
41821
41974
  });
41822
41975
 
41823
41976
  // src/commands/images/screenshot.ts
41824
- import { defineCommand as defineCommand148 } from "citty";
41977
+ import { defineCommand as defineCommand149 } from "citty";
41825
41978
  registerSchema({
41826
41979
  command: "images.screenshot",
41827
41980
  description: "Capture a website screenshot via ScreenshotOne. Auto-ingests on success.",
@@ -41840,7 +41993,7 @@ registerSchema({
41840
41993
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
41841
41994
  }
41842
41995
  });
41843
- var screenshotCommand = defineCommand148({
41996
+ var screenshotCommand = defineCommand149({
41844
41997
  meta: {
41845
41998
  name: "screenshot",
41846
41999
  description: "Screenshot a URL via ScreenshotOne. $0.009/capture. Auto-ingests to library.\n\nExample: baker images screenshot https://stripe.com --full-page"
@@ -41904,7 +42057,7 @@ var screenshotCommand = defineCommand148({
41904
42057
  });
41905
42058
 
41906
42059
  // src/commands/images/search.ts
41907
- import { defineCommand as defineCommand149 } from "citty";
42060
+ import { defineCommand as defineCommand150 } from "citty";
41908
42061
  registerSchema({
41909
42062
  command: "images.search",
41910
42063
  description: "Search images by text query. Only returns ready images.",
@@ -41920,7 +42073,7 @@ registerSchema({
41920
42073
  tags: { type: "string", description: "Comma-separated tags to filter by", required: false }
41921
42074
  }
41922
42075
  });
41923
- var searchCommand = defineCommand149({
42076
+ var searchCommand = defineCommand150({
41924
42077
  meta: {
41925
42078
  name: "search",
41926
42079
  description: "Semantic search images by text query. Uses hybrid BM25 + vector + reranking. Example: baker images search 'hero banner' --aspect-ratio 16:9 --tags logo"
@@ -41980,7 +42133,7 @@ var searchCommand = defineCommand149({
41980
42133
  });
41981
42134
 
41982
42135
  // src/commands/images/sticker.ts
41983
- import { defineCommand as defineCommand150 } from "citty";
42136
+ import { defineCommand as defineCommand151 } from "citty";
41984
42137
  registerSchema({
41985
42138
  command: "images.sticker",
41986
42139
  description: "Search Giphy stickers \u2014 transparent-background overlays for ad creative.",
@@ -42012,7 +42165,7 @@ registerSchema({
42012
42165
  }
42013
42166
  }
42014
42167
  });
42015
- var stickerCommand = defineCommand150({
42168
+ var stickerCommand = defineCommand151({
42016
42169
  meta: {
42017
42170
  name: "sticker",
42018
42171
  description: "Search Giphy's sticker corpus \u2014 transparent-background WebPs / GIFs ideal for overlaying on ad creative (Meta, TikTok, Stories). Same Giphy free API as `baker images gif`; results carry WebP + GIF + MP4 URLs in providerMeta.\n\nExample: baker images sticker 'thumbs up' --limit 10\nExample: baker images sticker celebration --rating g --auto-ingest 3\nExample: baker images sticker --trending --limit 25"
@@ -42059,7 +42212,7 @@ var stickerCommand = defineCommand150({
42059
42212
  });
42060
42213
 
42061
42214
  // src/commands/images/stock.ts
42062
- import { defineCommand as defineCommand151 } from "citty";
42215
+ import { defineCommand as defineCommand152 } from "citty";
42063
42216
  var STOCK_ERROR_FIX = {
42064
42217
  action: "use_different_resource",
42065
42218
  explanation: "Switch provider instead of retrying stock search. Stock search is one of several image sources. Run `baker images find <query> --sources library,pinterest,google` (`--sources` is required \u2014 `find` alone searches the library only) or `baker studio generate` to make the asset. Never sleep-and-retry this command \u2014 the CLI already backs off on rate limits. If no image can be sourced, continue the rest of the task with a placeholder rather than aborting it."
@@ -42136,7 +42289,7 @@ function buildStockRequest(query, args) {
42136
42289
  if (args.context) body.descriptionContext = args.context;
42137
42290
  return body;
42138
42291
  }
42139
- var stockCommand = defineCommand151({
42292
+ var stockCommand = defineCommand152({
42140
42293
  meta: {
42141
42294
  name: "stock",
42142
42295
  description: "Stock search via Magnific \u2014 Freepik's developer API (~250M assets: photos, vectors, illustrations, icons, PSDs). $0.002/req. With --auto-ingest, ingested hits return Baker-owned URLs.\n\nExamples:\n baker images stock 'minimalist office'\n baker images stock 'flat office workers' --type vector\n baker images stock 'hero photo of a kitchen' --type photo --orientation landscape --ai exclude\n baker images stock 'brand pattern' --color '#0a0a0a' --license freemium --auto-ingest 2"
@@ -42209,7 +42362,7 @@ var stockCommand = defineCommand151({
42209
42362
  });
42210
42363
 
42211
42364
  // src/lib/tags-command.ts
42212
- import { defineCommand as defineCommand152 } from "citty";
42365
+ import { defineCommand as defineCommand153 } from "citty";
42213
42366
  function makeTagsCommand(command, label, endpoint) {
42214
42367
  registerSchema({
42215
42368
  command: `${command}.tags`,
@@ -42218,7 +42371,7 @@ function makeTagsCommand(command, label, endpoint) {
42218
42371
  output: { type: "string", description: "Output format: md|json", required: false, default: "md" }
42219
42372
  }
42220
42373
  });
42221
- return defineCommand152({
42374
+ return defineCommand153({
42222
42375
  meta: {
42223
42376
  name: "tags",
42224
42377
  description: `List the available ${label} tag names (defaults + company custom tags). Use before filtering with --tags. Example: baker ${command} tags`
@@ -42254,7 +42407,7 @@ function makeTagsCommand(command, label, endpoint) {
42254
42407
  var tagsCommand3 = makeTagsCommand("images", "image", "/api/images/tags");
42255
42408
 
42256
42409
  // src/commands/images/upload.ts
42257
- import { defineCommand as defineCommand153 } from "citty";
42410
+ import { defineCommand as defineCommand154 } from "citty";
42258
42411
  registerSchema({
42259
42412
  command: "images.upload",
42260
42413
  description: "Upload an image to the library \u2014 local file path or remote http(s) URL.",
@@ -42292,7 +42445,7 @@ registerSchema({
42292
42445
  function isRemoteUrl2(value) {
42293
42446
  return /^https?:\/\//i.test(value);
42294
42447
  }
42295
- var uploadCommand = defineCommand153({
42448
+ var uploadCommand = defineCommand154({
42296
42449
  meta: {
42297
42450
  name: "upload",
42298
42451
  description: "Upload an image to the library \u2014 accepts a local file path OR a remote http(s) URL.\n\nLocal: reads bytes, sends to /api/images/upload, content-type auto-detected from extension.\nRemote: dispatches to /api/images/ingest with hash-dedup on bytes + externalId.\n\nExamples:\n baker images upload ./logo.png --source uploaded\n baker images upload ./cert.png --context 'ISO 27001 badge \u2014 enterprise tier'\n baker images upload https://acme.com/hero.png --source firecrawl --context 'Acme competitor pricing hero'"
@@ -42385,7 +42538,7 @@ async function uploadLocal(target, args) {
42385
42538
  }
42386
42539
 
42387
42540
  // src/commands/images/upscale.ts
42388
- import { defineCommand as defineCommand154 } from "citty";
42541
+ import { defineCommand as defineCommand155 } from "citty";
42389
42542
  registerSchema({
42390
42543
  command: "images.upscale",
42391
42544
  description: "Upscale a library image via the backend (Replicate, cost-tracked). Waits for completion by default. The image must be status 'ready' and raster (not SVG/AVIF).",
@@ -42400,7 +42553,7 @@ registerSchema({
42400
42553
  }
42401
42554
  });
42402
42555
  var POLL_INTERVAL_MS4 = 1500;
42403
- var upscaleCommand = defineCommand154({
42556
+ var upscaleCommand = defineCommand155({
42404
42557
  meta: {
42405
42558
  name: "upscale",
42406
42559
  description: "Upscale a library image via the Convex backend (Replicate, cost-tracked at $0.05/image). Waits for completion by default.\n\nExample: baker images upscale j571abc123def\nExample: baker images upscale j571abc123def --max-wait 0 # fire-and-forget"
@@ -42455,7 +42608,7 @@ var upscaleCommand = defineCommand154({
42455
42608
  });
42456
42609
 
42457
42610
  // src/commands/images/use.ts
42458
- import { defineCommand as defineCommand155 } from "citty";
42611
+ import { defineCommand as defineCommand156 } from "citty";
42459
42612
  registerSchema({
42460
42613
  command: "images.use",
42461
42614
  description: "Ingest a URL and wait for the library record to be ready.",
@@ -42484,7 +42637,7 @@ function emitReady(ingestResult, doc, args) {
42484
42637
  args.full === true
42485
42638
  );
42486
42639
  }
42487
- var useCommand = defineCommand155({
42640
+ var useCommand = defineCommand156({
42488
42641
  meta: {
42489
42642
  name: "use",
42490
42643
  description: "Sugar over `ingest`: download \u2192 store \u2192 wait until describe + embed complete \u2192 return ready library record.\n\nExample: baker images use https://cdn.example.com/hero.png --source uploaded"
@@ -42533,7 +42686,7 @@ var useCommand = defineCommand155({
42533
42686
  });
42534
42687
 
42535
42688
  // src/commands/images/index.ts
42536
- var imagesCommand = defineCommand156({
42689
+ var imagesCommand = defineCommand157({
42537
42690
  meta: {
42538
42691
  name: "images",
42539
42692
  description: `Find, source, and normalize images. Subcommands route by provider so cost + license are explicit.
@@ -42611,12 +42764,12 @@ Full guide: __tooling__/docs/tools/baker/images.md`
42611
42764
  });
42612
42765
 
42613
42766
  // src/commands/landing/index.ts
42614
- import { defineCommand as defineCommand167 } from "citty";
42767
+ import { defineCommand as defineCommand168 } from "citty";
42615
42768
 
42616
42769
  // src/commands/landing/critique.ts
42617
42770
  import { readdir as readdir11, stat as stat7 } from "fs/promises";
42618
42771
  import path31 from "path";
42619
- import { defineCommand as defineCommand157 } from "citty";
42772
+ import { defineCommand as defineCommand158 } from "citty";
42620
42773
 
42621
42774
  // src/engine/landing/lib/constants.ts
42622
42775
  var OVERUSED_FONTS = /* @__PURE__ */ new Set([
@@ -43685,7 +43838,7 @@ function fail5(code, message, fix) {
43685
43838
  );
43686
43839
  process.exit(2);
43687
43840
  }
43688
- var critiqueCommand2 = defineCommand157({
43841
+ var critiqueCommand2 = defineCommand158({
43689
43842
  meta: {
43690
43843
  name: "critique",
43691
43844
  description: "Start here: `baker landing critique <slug>` after building or editing a landing. Deterministic design-quality critic (ADVISORY \u2014 findings never fail it). Flags the known AI design tells (gradient text, overused fonts, side-tab borders, cream palettes, buzzword copy, broken images) tiered block/warn/advisory, respecting the client's BRAND.md as the allowlist. Also records the critique that publishing requires \u2014 run it before finishing a landing."
@@ -43794,10 +43947,10 @@ async function isDir(p) {
43794
43947
  }
43795
43948
 
43796
43949
  // src/commands/landing/inspiration/index.ts
43797
- import { defineCommand as defineCommand166 } from "citty";
43950
+ import { defineCommand as defineCommand167 } from "citty";
43798
43951
 
43799
43952
  // src/commands/landing/inspiration/add.ts
43800
- import { defineCommand as defineCommand158 } from "citty";
43953
+ import { defineCommand as defineCommand159 } from "citty";
43801
43954
 
43802
43955
  // src/commands/landing/inspiration/shared.ts
43803
43956
  var INSPIRATION_HINTS = {
@@ -43879,7 +44032,7 @@ registerSchema({
43879
44032
  note: { type: "string", description: "Why this page is worth keeping", required: false }
43880
44033
  }
43881
44034
  });
43882
- var addCommand = defineCommand158({
44035
+ var addCommand = defineCommand159({
43883
44036
  meta: {
43884
44037
  name: "add",
43885
44038
  description: "Add someone else's landing page to the reference library. Example: baker landing inspiration add https://linear.app --note 'the client likes this density'"
@@ -43921,7 +44074,7 @@ var addCommand = defineCommand158({
43921
44074
  // src/commands/landing/inspiration/code.ts
43922
44075
  import { mkdir as mkdir10, writeFile as writeFile14 } from "fs/promises";
43923
44076
  import path32 from "path";
43924
- import { defineCommand as defineCommand159 } from "citty";
44077
+ import { defineCommand as defineCommand160 } from "citty";
43925
44078
  registerSchema({
43926
44079
  command: "landing.inspiration.code",
43927
44080
  description: "Write a reference section's standalone HTML+CSS to .baker/inspiration/<id>/ so you can read how it is built. Reference only \u2014 the structure is the lesson, the words are not yours to reuse.",
@@ -43930,7 +44083,7 @@ registerSchema({
43930
44083
  full: { type: "boolean", description: "Print the markup inline as well as writing it", required: false }
43931
44084
  }
43932
44085
  });
43933
- var codeCommand = defineCommand159({
44086
+ var codeCommand = defineCommand160({
43934
44087
  meta: {
43935
44088
  name: "code",
43936
44089
  description: "Write one reference section's standalone markup to disk. Example: baker landing inspiration code k57abc\u2026 \u2014 read it for structure, then build your own."
@@ -43976,7 +44129,7 @@ var codeCommand = defineCommand159({
43976
44129
  });
43977
44130
 
43978
44131
  // src/commands/landing/inspiration/favorites.ts
43979
- import { defineCommand as defineCommand160 } from "citty";
44132
+ import { defineCommand as defineCommand161 } from "citty";
43980
44133
  registerSchema({
43981
44134
  command: "landing.inspiration.favorites",
43982
44135
  description: "List the reference sections this company has saved. This is what `search` looks at by default, so it is the client's own taste profile \u2014 read it before proposing a direction.",
@@ -43990,7 +44143,7 @@ registerSchema({
43990
44143
  }
43991
44144
  }
43992
44145
  });
43993
- var favoritesCommand = defineCommand160({
44146
+ var favoritesCommand = defineCommand161({
43994
44147
  meta: {
43995
44148
  name: "favorites",
43996
44149
  description: "List this company's saved reference sections. Example: baker landing inspiration favorites --type hero,pricing"
@@ -44070,7 +44223,7 @@ registerSchema({
44070
44223
  note: { type: "string", description: "Why this is worth keeping", required: false }
44071
44224
  }
44072
44225
  });
44073
- var favoriteCommand = defineCommand160({
44226
+ var favoriteCommand = defineCommand161({
44074
44227
  meta: {
44075
44228
  name: "favorite",
44076
44229
  description: "Save a reference section to this company. Example: baker landing inspiration favorite k57abc\u2026"
@@ -44108,7 +44261,7 @@ registerSchema({
44108
44261
  page: { type: "boolean", description: "Treat the id as a page rather than a section", required: false }
44109
44262
  }
44110
44263
  });
44111
- var unfavoriteCommand = defineCommand160({
44264
+ var unfavoriteCommand = defineCommand161({
44112
44265
  meta: {
44113
44266
  name: "unfavorite",
44114
44267
  description: "Remove a reference section from this company's saved set. Example: baker landing inspiration unfavorite k57abc\u2026"
@@ -44130,7 +44283,7 @@ var unfavoriteCommand = defineCommand160({
44130
44283
  });
44131
44284
 
44132
44285
  // src/commands/landing/inspiration/page.ts
44133
- import { defineCommand as defineCommand161 } from "citty";
44286
+ import { defineCommand as defineCommand162 } from "citty";
44134
44287
  registerSchema({
44135
44288
  command: "landing.inspiration.page",
44136
44289
  description: "Show a whole reference page as a sequence: every section top to bottom with its type and the idea behind it. This is the view to use when the question is how a good page is ORDERED rather than what one section looks like.",
@@ -44147,7 +44300,7 @@ registerSchema({
44147
44300
  }
44148
44301
  }
44149
44302
  });
44150
- var pageCommand2 = defineCommand161({
44303
+ var pageCommand2 = defineCommand162({
44151
44304
  meta: {
44152
44305
  name: "page",
44153
44306
  description: "Show how a reference page sequences its sections. Example: baker landing inspiration page j91xyz\u2026 \u2014 the blueprint, not the pixels."
@@ -44210,7 +44363,7 @@ var pageCommand2 = defineCommand161({
44210
44363
  });
44211
44364
 
44212
44365
  // src/commands/landing/inspiration/scrape.ts
44213
- import { defineCommand as defineCommand162 } from "citty";
44366
+ import { defineCommand as defineCommand163 } from "citty";
44214
44367
 
44215
44368
  // src/engine/landing-library/proxyFailure.ts
44216
44369
  var PROXY_STATUS = 407;
@@ -46350,7 +46503,7 @@ registerSchema({
46350
46503
  report: { type: "boolean", description: "Write report.html. `--no-report` to skip", required: false }
46351
46504
  }
46352
46505
  });
46353
- var scrapeCommand = defineCommand162({
46506
+ var scrapeCommand = defineCommand163({
46354
46507
  meta: {
46355
46508
  name: "scrape",
46356
46509
  description: "Capture a landing page to a directory, now. Example: baker landing inspiration scrape https://linear.app --out .baker/inspiration/linear.app"
@@ -46459,7 +46612,7 @@ var scrapeCommand = defineCommand162({
46459
46612
 
46460
46613
  // src/commands/landing/inspiration/search.ts
46461
46614
  import path37 from "path";
46462
- import { defineCommand as defineCommand163 } from "citty";
46615
+ import { defineCommand as defineCommand164 } from "citty";
46463
46616
 
46464
46617
  // src/commands/landing/inspiration/shot.ts
46465
46618
  import { mkdir as mkdir12, writeFile as writeFile17 } from "fs/promises";
@@ -46596,7 +46749,7 @@ async function downloadShots(results) {
46596
46749
  );
46597
46750
  return saved;
46598
46751
  }
46599
- var searchCommand2 = defineCommand163({
46752
+ var searchCommand2 = defineCommand164({
46600
46753
  meta: {
46601
46754
  name: "search",
46602
46755
  description: "Search real landing-page sections for reference. Example: baker landing inspiration search 'dark developer hero with a terminal' --register dev-tool-minimal --scope all"
@@ -46694,7 +46847,7 @@ var searchCommand2 = defineCommand163({
46694
46847
  });
46695
46848
 
46696
46849
  // src/commands/landing/inspiration/sequences.ts
46697
- import { defineCommand as defineCommand164 } from "citty";
46850
+ import { defineCommand as defineCommand165 } from "citty";
46698
46851
  var COMPACT_TRANSITIONS = 12;
46699
46852
  var COMPACT_ENDS = 5;
46700
46853
  var MAX_PAGES = 50;
@@ -46768,7 +46921,7 @@ function sequencesHints(data, { scope, full }) {
46768
46921
  if (scope === "favorites") hints.push(...favoritesScopeHints(data.favoritesHealth, data.pagesReturned));
46769
46922
  return hints;
46770
46923
  }
46771
- var sequencesCommand = defineCommand164({
46924
+ var sequencesCommand = defineCommand165({
46772
46925
  meta: {
46773
46926
  name: "sequences",
46774
46927
  description: "What section follows what, across many real pages at once. Example: baker landing inspiration sequences 'developer tool pricing page' --scope all \u2014 the evidence for how to order a page you are about to build."
@@ -46818,7 +46971,7 @@ var sequencesCommand = defineCommand164({
46818
46971
 
46819
46972
  // src/commands/landing/inspiration/view.ts
46820
46973
  import path38 from "path";
46821
- import { defineCommand as defineCommand165 } from "citty";
46974
+ import { defineCommand as defineCommand166 } from "citty";
46822
46975
  registerSchema({
46823
46976
  command: "landing.inspiration.view",
46824
46977
  description: "Everything known about one section: composition, motion, design tokens, the copy it uses, why it works, and what must change to make it yours. Downloads the desktop and mobile screenshots plus the motion filmstrip so you can look at them.",
@@ -46831,7 +46984,7 @@ registerSchema({
46831
46984
  }
46832
46985
  }
46833
46986
  });
46834
- var viewCommand2 = defineCommand165({
46987
+ var viewCommand2 = defineCommand166({
46835
46988
  meta: {
46836
46989
  name: "view",
46837
46990
  description: "Full detail for one reference section. Example: baker landing inspiration view k57abc\u2026 \u2014 read the screenshots it saves before you build."
@@ -46915,7 +47068,7 @@ var viewCommand2 = defineCommand165({
46915
47068
  });
46916
47069
 
46917
47070
  // src/commands/landing/inspiration/index.ts
46918
- var inspirationCommand = defineCommand166({
47071
+ var inspirationCommand = defineCommand167({
46919
47072
  meta: {
46920
47073
  name: "inspiration",
46921
47074
  description: `Reference library of real landing-page sections \u2014 look at how good pages actually solve a problem before you design one.
@@ -46960,7 +47113,7 @@ Full guide: __tooling__/docs/tools/baker/landing.md`
46960
47113
  });
46961
47114
 
46962
47115
  // src/commands/landing/index.ts
46963
- var landingCommand = defineCommand167({
47116
+ var landingCommand = defineCommand168({
46964
47117
  meta: {
46965
47118
  name: "landing",
46966
47119
  description: `Design-quality tools for landing pages (src/pages/<slug>/).
@@ -46978,7 +47131,7 @@ Subcommands:
46978
47131
  });
46979
47132
 
46980
47133
  // src/commands/mcp/index.ts
46981
- import { defineCommand as defineCommand168 } from "citty";
47134
+ import { defineCommand as defineCommand169 } from "citty";
46982
47135
 
46983
47136
  // src/commands/mcp/platforms.ts
46984
47137
  function readsKey(label) {
@@ -47047,7 +47200,7 @@ registerSchema({
47047
47200
  description: "List everything this chat can reach: managed integrations (Attio, Slack, Gmail, Google Sheets, \u2026), custom MCP servers, and the platforms the company signed in to (HubSpot, Google Ads, GA4, Search Console, Tag Manager) which you read through their own `baker` commands. Start here when the user mentions an external tool or platform.",
47048
47201
  args: {}
47049
47202
  });
47050
- var connectedCommand = defineCommand168({
47203
+ var connectedCommand = defineCommand169({
47051
47204
  meta: {
47052
47205
  name: "connected",
47053
47206
  description: `Everything this chat can reach \u2014 managed integrations, custom MCP servers, and connected platforms.
@@ -47106,7 +47259,7 @@ registerSchema({
47106
47259
  description: "List the custom MCP servers this company's chats see (org + company + your own user scope).",
47107
47260
  args: {}
47108
47261
  });
47109
- var listCommand14 = defineCommand168({
47262
+ var listCommand14 = defineCommand169({
47110
47263
  meta: { name: "list", description: "List custom MCP servers visible to this company's chats." },
47111
47264
  run: async () => {
47112
47265
  try {
@@ -47143,7 +47296,7 @@ registerSchema({
47143
47296
  header: { type: "string", description: 'Auth header "Key: Value" (repeatable)', required: false }
47144
47297
  }
47145
47298
  });
47146
- var addCommand2 = defineCommand168({
47299
+ var addCommand2 = defineCommand169({
47147
47300
  meta: {
47148
47301
  name: "add",
47149
47302
  description: `Register a custom MCP server. Tools appear as mcp__<name>__* on the NEXT message.
@@ -47195,7 +47348,7 @@ registerSchema({
47195
47348
  description: "Remove a company custom MCP server by name.",
47196
47349
  args: { name: { type: "string", description: "Server name to remove", required: true } }
47197
47350
  });
47198
- var removeCommand4 = defineCommand168({
47351
+ var removeCommand4 = defineCommand169({
47199
47352
  meta: {
47200
47353
  name: "remove",
47201
47354
  description: `Remove a company custom MCP server by name.
@@ -47217,7 +47370,7 @@ Example:
47217
47370
  }
47218
47371
  }
47219
47372
  });
47220
- var mcpCommand = defineCommand168({
47373
+ var mcpCommand = defineCommand169({
47221
47374
  meta: {
47222
47375
  name: "mcp",
47223
47376
  description: `Third-party tools for this company \u2014 see what's connected, register custom HTTPS MCP endpoints.
@@ -47243,10 +47396,10 @@ Full guide: __tooling__/docs/tools/baker/mcp.md`
47243
47396
  });
47244
47397
 
47245
47398
  // src/commands/research/index.ts
47246
- import { defineCommand as defineCommand180 } from "citty";
47399
+ import { defineCommand as defineCommand181 } from "citty";
47247
47400
 
47248
47401
  // src/commands/research/advertisers.ts
47249
- import { defineCommand as defineCommand169 } from "citty";
47402
+ import { defineCommand as defineCommand170 } from "citty";
47250
47403
 
47251
47404
  // src/commands/research/hints.ts
47252
47405
  var AD_COPY_ROUTE = 'This returns competing DOMAINS and their SERP economics \u2014 no ad copy, no headlines, no creative. For the actual copy of a competitor\'s ads: `baker winning-ads advertisers "<brand>"` \u2192 `baker winning-ads search "<brief>" --advertiser-id <id>` \u2192 `baker winning-ads content <adId>` (`primary_text` / `headline` / `cta`, plus the spoken transcript and on-screen text for video). That corpus is Meta and LinkedIn only \u2014 Google SERP ad copy is not available through any Baker command, so do not keep querying for it here.';
@@ -47429,7 +47582,7 @@ var FIELDS3 = {
47429
47582
  etv: "Estimated traffic value (USD)",
47430
47583
  visibility: "SERP visibility score (0-1)"
47431
47584
  };
47432
- var advertisersCommand = defineCommand169({
47585
+ var advertisersCommand = defineCommand170({
47433
47586
  meta: {
47434
47587
  name: "advertisers",
47435
47588
  description: `Domains competing for a keyword in Google SERPs, with position, relevance, traffic value and visibility. Returns NO ad copy \u2014 for a competitor's headlines and body copy use \`baker winning-ads content <adId>\` (Meta/LinkedIn only).
@@ -47485,7 +47638,7 @@ Examples:
47485
47638
  });
47486
47639
 
47487
47640
  // src/commands/research/autocomplete.ts
47488
- import { defineCommand as defineCommand170 } from "citty";
47641
+ import { defineCommand as defineCommand171 } from "citty";
47489
47642
  registerSchema({
47490
47643
  command: "research.autocomplete",
47491
47644
  description: "Get Google Autocomplete suggestions for a seed keyword. Useful for keyword expansion and discovering what people actually search for. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en).",
@@ -47508,7 +47661,7 @@ registerSchema({
47508
47661
  var FIELDS4 = {
47509
47662
  suggestion: "Autocomplete suggestion from Google"
47510
47663
  };
47511
- var autocompleteCommand = defineCommand170({
47664
+ var autocompleteCommand = defineCommand171({
47512
47665
  meta: {
47513
47666
  name: "autocomplete",
47514
47667
  description: `Get Google Autocomplete suggestions for keyword expansion.
@@ -47563,7 +47716,7 @@ Examples:
47563
47716
  });
47564
47717
 
47565
47718
  // src/commands/research/countries.ts
47566
- import { defineCommand as defineCommand171 } from "citty";
47719
+ import { defineCommand as defineCommand172 } from "citty";
47567
47720
  registerSchema({
47568
47721
  command: "research.countries",
47569
47722
  description: "List all supported country codes for --location flag in research commands.",
@@ -47620,7 +47773,7 @@ var FIELDS5 = {
47620
47773
  code: "Country code to pass as --location",
47621
47774
  name: "Country name"
47622
47775
  };
47623
- var countriesCommand = defineCommand171({
47776
+ var countriesCommand = defineCommand172({
47624
47777
  meta: {
47625
47778
  name: "countries",
47626
47779
  description: "List all supported country codes for --location flag."
@@ -47631,7 +47784,7 @@ var countriesCommand = defineCommand171({
47631
47784
  });
47632
47785
 
47633
47786
  // src/commands/research/fetch.ts
47634
- import { defineCommand as defineCommand172 } from "citty";
47787
+ import { defineCommand as defineCommand173 } from "citty";
47635
47788
  var CONTENT_PREVIEW_CHARS = 2e4;
47636
47789
  var TIMEOUT_MS = 18e4;
47637
47790
  registerSchema({
@@ -47704,7 +47857,7 @@ function fetchFix(code) {
47704
47857
  explanation: "This read failed. Don't build a retry ladder around it \u2014 finish the rest of the job with what you can reach and name this page as a gap."
47705
47858
  };
47706
47859
  }
47707
- var fetchCommand = defineCommand172({
47860
+ var fetchCommand = defineCommand173({
47708
47861
  meta: {
47709
47862
  name: "fetch",
47710
47863
  description: `Read a page an ordinary web fetch could not. Bot walls and JavaScript-rendered pages are resolved for you \u2014 you never have to retry, wait, or drive a browser yourself.
@@ -47781,7 +47934,7 @@ Examples:
47781
47934
  });
47782
47935
 
47783
47936
  // src/commands/research/intent.ts
47784
- import { defineCommand as defineCommand173 } from "citty";
47937
+ import { defineCommand as defineCommand174 } from "citty";
47785
47938
  registerSchema({
47786
47939
  command: "research.intent",
47787
47940
  description: "Classify Google Search intent for keywords. Determines if someone searching is looking to buy, research, or navigate. IMPORTANT: If --language is omitted, defaults to English (en). The response includes a query_context object showing which language was used.",
@@ -47804,7 +47957,7 @@ var FIELDS7 = {
47804
47957
  intent: "Primary Google Search intent: informational, navigational, commercial, transactional",
47805
47958
  probability: "Confidence score 0.0-1.0"
47806
47959
  };
47807
- var intentCommand = defineCommand173({
47960
+ var intentCommand = defineCommand174({
47808
47961
  meta: {
47809
47962
  name: "intent",
47810
47963
  description: `Classify Google Search intent for keywords. Returns intent type and confidence.
@@ -47852,7 +48005,7 @@ Examples:
47852
48005
  });
47853
48006
 
47854
48007
  // src/commands/research/keyword-gap.ts
47855
- import { defineCommand as defineCommand174 } from "citty";
48008
+ import { defineCommand as defineCommand175 } from "citty";
47856
48009
  registerSchema({
47857
48010
  command: "research.keyword-gap",
47858
48011
  description: "Find keywords a competitor ranks for (organic or paid) that you don't. Discovers expansion opportunities. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en). The response includes a query_context object showing which location/language were used.",
@@ -47881,7 +48034,7 @@ var FIELDS8 = {
47881
48034
  cpc: "Cost per click USD",
47882
48035
  their_position: "Competitor's ranking position"
47883
48036
  };
47884
- var keywordGapCommand = defineCommand174({
48037
+ var keywordGapCommand = defineCommand175({
47885
48038
  meta: {
47886
48039
  name: "keyword-gap",
47887
48040
  description: `Find keywords a competitor has that you don't. Supports pagination via --offset.
@@ -47956,7 +48109,7 @@ Examples:
47956
48109
  });
47957
48110
 
47958
48111
  // src/commands/research/keywords-for-site.ts
47959
- import { defineCommand as defineCommand175 } from "citty";
48112
+ import { defineCommand as defineCommand176 } from "citty";
47960
48113
  registerSchema({
47961
48114
  command: "research.keywords-for-site",
47962
48115
  description: "Get keywords a competitor targets in Google. Use --type paid to see only paid keywords, --type organic for organic only. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en). The response includes a query_context object showing which location/language were used.",
@@ -47989,7 +48142,7 @@ var FIELDS9 = {
47989
48142
  competition: "LOW, MEDIUM, or HIGH",
47990
48143
  competition_index: "Competition score 0-100"
47991
48144
  };
47992
- var keywordsForSiteCommand = defineCommand175({
48145
+ var keywordsForSiteCommand = defineCommand176({
47993
48146
  meta: {
47994
48147
  name: "keywords-for-site",
47995
48148
  description: `Get keywords a competitor targets in Google. Use --type to filter paid/organic.
@@ -48051,7 +48204,7 @@ Examples:
48051
48204
  });
48052
48205
 
48053
48206
  // src/commands/research/languages.ts
48054
- import { defineCommand as defineCommand176 } from "citty";
48207
+ import { defineCommand as defineCommand177 } from "citty";
48055
48208
  registerSchema({
48056
48209
  command: "research.languages",
48057
48210
  description: "List all supported language codes for --language flag in research commands.",
@@ -48081,7 +48234,7 @@ var FIELDS10 = {
48081
48234
  code: "Language code to pass as --language",
48082
48235
  name: "Language name (also accepted by --language)"
48083
48236
  };
48084
- var languagesCommand2 = defineCommand176({
48237
+ var languagesCommand2 = defineCommand177({
48085
48238
  meta: {
48086
48239
  name: "languages",
48087
48240
  description: "List all supported language codes for --language flag."
@@ -48092,7 +48245,7 @@ var languagesCommand2 = defineCommand176({
48092
48245
  });
48093
48246
 
48094
48247
  // src/commands/research/lighthouse.ts
48095
- import { defineCommand as defineCommand177 } from "citty";
48248
+ import { defineCommand as defineCommand178 } from "citty";
48096
48249
  registerSchema({
48097
48250
  command: "research.lighthouse",
48098
48251
  description: "Landing page performance audit. Returns metrics that affect Google Ads Quality Score and CPC.",
@@ -48111,7 +48264,7 @@ var FIELDS11 = {
48111
48264
  speed_index_ms: "Speed Index in ms (good: < 3400)",
48112
48265
  interactive_ms: "Time to Interactive in ms (good: < 3800)"
48113
48266
  };
48114
- var lighthouseCommand = defineCommand177({
48267
+ var lighthouseCommand = defineCommand178({
48115
48268
  meta: {
48116
48269
  name: "lighthouse",
48117
48270
  description: `Landing page performance audit. Metrics affecting Google Ads Quality Score.
@@ -48149,7 +48302,7 @@ Examples:
48149
48302
  });
48150
48303
 
48151
48304
  // src/commands/research/relevant-pages.ts
48152
- import { defineCommand as defineCommand178 } from "citty";
48305
+ import { defineCommand as defineCommand179 } from "citty";
48153
48306
  registerSchema({
48154
48307
  command: "research.relevant-pages",
48155
48308
  description: "Get the top pages of a competitor domain with organic traffic and ranking data. Shows which pages drive the most traffic. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en).",
@@ -48175,7 +48328,7 @@ var FIELDS12 = {
48175
48328
  keywords: "Total organic keywords the page ranks for",
48176
48329
  top_10: "Keywords in positions 1-10"
48177
48330
  };
48178
- var relevantPagesCommand = defineCommand178({
48331
+ var relevantPagesCommand = defineCommand179({
48179
48332
  meta: {
48180
48333
  name: "relevant-pages",
48181
48334
  description: `Get the top pages of a competitor domain with traffic data.
@@ -48222,7 +48375,7 @@ Examples:
48222
48375
  });
48223
48376
 
48224
48377
  // src/commands/research/web.ts
48225
- import { defineCommand as defineCommand179 } from "citty";
48378
+ import { defineCommand as defineCommand180 } from "citty";
48226
48379
  registerSchema({
48227
48380
  command: "research.web",
48228
48381
  description: "Search the web with AI to answer marketing questions \u2014 competitors, ICP, pricing, pain points, market trends. Three depth levels: medium (quick, default), high (thorough), xhigh (exhaustive deep research).",
@@ -48273,7 +48426,7 @@ async function runDeepResearch(question) {
48273
48426
  }
48274
48427
  throw new Error("Deep research timed out");
48275
48428
  }
48276
- var webCommand = defineCommand179({
48429
+ var webCommand = defineCommand180({
48277
48430
  meta: {
48278
48431
  name: "web",
48279
48432
  description: `Search the web with AI to answer any open-ended marketing question. Uses live internet data via Google Search.
@@ -48335,7 +48488,7 @@ Examples:
48335
48488
  });
48336
48489
 
48337
48490
  // src/commands/research/index.ts
48338
- var researchCommand = defineCommand180({
48491
+ var researchCommand = defineCommand181({
48339
48492
  meta: {
48340
48493
  name: "research",
48341
48494
  description: `Competitive intelligence and AI-powered research commands.
@@ -48379,10 +48532,10 @@ Full guide: __tooling__/docs/tools/baker/research.md`
48379
48532
  });
48380
48533
 
48381
48534
  // src/commands/scheduled-actions/index.ts
48382
- import { defineCommand as defineCommand188 } from "citty";
48535
+ import { defineCommand as defineCommand189 } from "citty";
48383
48536
 
48384
48537
  // src/commands/scheduled-actions/create.ts
48385
- import { defineCommand as defineCommand181 } from "citty";
48538
+ import { defineCommand as defineCommand182 } from "citty";
48386
48539
 
48387
48540
  // src/commands/scheduled-actions/shared.ts
48388
48541
  var TEMP_SCHEDULED_ACTION_PREFIX = "temp_sched_";
@@ -48529,7 +48682,7 @@ registerSchema({
48529
48682
  }
48530
48683
  }
48531
48684
  });
48532
- var createCommand3 = defineCommand181({
48685
+ var createCommand3 = defineCommand182({
48533
48686
  meta: {
48534
48687
  name: "create",
48535
48688
  description: 'Stage a scheduled action. Example: baker scheduled-actions create --name "Weekly report" --description "..." --cron "0 9 * * MON"'
@@ -48588,7 +48741,7 @@ var createCommand3 = defineCommand181({
48588
48741
  });
48589
48742
 
48590
48743
  // src/commands/scheduled-actions/delete.ts
48591
- import { defineCommand as defineCommand182 } from "citty";
48744
+ import { defineCommand as defineCommand183 } from "citty";
48592
48745
  registerSchema({
48593
48746
  command: "scheduled-actions.delete",
48594
48747
  description: "Stage deletion of a published scheduled action or cancellation of a temp_sched_* draft creation.",
@@ -48596,7 +48749,7 @@ registerSchema({
48596
48749
  id: { type: "string", description: "Published scheduled action ID or temp_sched_* draft ID", required: true }
48597
48750
  }
48598
48751
  });
48599
- var deleteCommand3 = defineCommand182({
48752
+ var deleteCommand3 = defineCommand183({
48600
48753
  meta: {
48601
48754
  name: "delete",
48602
48755
  description: "Stage scheduled action deletion. Example: baker scheduled-actions delete <id-or-temp_sched_id>"
@@ -48625,7 +48778,7 @@ var deleteCommand3 = defineCommand182({
48625
48778
  });
48626
48779
 
48627
48780
  // src/commands/scheduled-actions/get.ts
48628
- import { defineCommand as defineCommand183 } from "citty";
48781
+ import { defineCommand as defineCommand184 } from "citty";
48629
48782
  registerSchema({
48630
48783
  command: "scheduled-actions.get",
48631
48784
  description: "Get a published scheduled action or a temp_sched_* draft-created scheduled action.",
@@ -48634,7 +48787,7 @@ registerSchema({
48634
48787
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
48635
48788
  }
48636
48789
  });
48637
- var getCommand4 = defineCommand183({
48790
+ var getCommand4 = defineCommand184({
48638
48791
  meta: {
48639
48792
  name: "get",
48640
48793
  description: "Get a scheduled action. Example: baker scheduled-actions get <id-or-temp_sched_id>"
@@ -48673,7 +48826,7 @@ var getCommand4 = defineCommand183({
48673
48826
  });
48674
48827
 
48675
48828
  // src/commands/scheduled-actions/list.ts
48676
- import { defineCommand as defineCommand184 } from "citty";
48829
+ import { defineCommand as defineCommand185 } from "citty";
48677
48830
  registerSchema({
48678
48831
  command: "scheduled-actions.list",
48679
48832
  description: "List published scheduled actions. Includes draft state when BAKER_CHAT_ID is set, or --chat <id> to read an earlier chat's staged schedules instead.",
@@ -48681,7 +48834,7 @@ registerSchema({
48681
48834
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
48682
48835
  }
48683
48836
  });
48684
- var listCommand15 = defineCommand184({
48837
+ var listCommand15 = defineCommand185({
48685
48838
  meta: {
48686
48839
  name: "list",
48687
48840
  description: "List scheduled actions. Includes staged draft ops when BAKER_CHAT_ID is set, or --chat <id> to read an earlier chat's staged schedules instead."
@@ -48706,7 +48859,7 @@ var listCommand15 = defineCommand184({
48706
48859
  // src/commands/scheduled-actions/templates.ts
48707
48860
  import { readFile as readFile25 } from "fs/promises";
48708
48861
  import path39 from "path";
48709
- import { defineCommand as defineCommand185 } from "citty";
48862
+ import { defineCommand as defineCommand186 } from "citty";
48710
48863
  registerSchema({
48711
48864
  command: "scheduled-actions.templates",
48712
48865
  description: "The recipes available to this company: the ones Baker ships plus the ones they wrote themselves, each with its id, what it produces and how often it is meant to run. Read this before proposing a company's automation, so every recipe you name is one that exists. Also how a company gets a recipe of its own \u2014 save a brief, prove it runs, then publish it.",
@@ -48761,7 +48914,7 @@ registerSchema({
48761
48914
  }
48762
48915
  }
48763
48916
  });
48764
- var templatesCommand = defineCommand185({
48917
+ var templatesCommand = defineCommand186({
48765
48918
  meta: {
48766
48919
  name: "templates",
48767
48920
  description: `The recipes this company can run \u2014 Baker's own plus theirs, with what each one produces.
@@ -48853,7 +49006,7 @@ Full guide: __tooling__/docs/tools/baker/scheduled-actions.md`
48853
49006
  });
48854
49007
 
48855
49008
  // src/commands/scheduled-actions/trigger.ts
48856
- import { defineCommand as defineCommand186 } from "citty";
49009
+ import { defineCommand as defineCommand187 } from "citty";
48857
49010
  registerSchema({
48858
49011
  command: "scheduled-actions.trigger",
48859
49012
  description: "Immediately trigger a published scheduled action. Does not require BAKER_CHAT_ID and rejects temp_sched_* IDs.",
@@ -48861,7 +49014,7 @@ registerSchema({
48861
49014
  id: { type: "string", description: "Published scheduled action ID", required: true }
48862
49015
  }
48863
49016
  });
48864
- var triggerCommand = defineCommand186({
49017
+ var triggerCommand = defineCommand187({
48865
49018
  meta: {
48866
49019
  name: "trigger",
48867
49020
  description: "Immediately trigger a published scheduled action. Example: baker scheduled-actions trigger <id>"
@@ -48898,7 +49051,7 @@ var triggerCommand = defineCommand186({
48898
49051
  });
48899
49052
 
48900
49053
  // src/commands/scheduled-actions/update.ts
48901
- import { defineCommand as defineCommand187 } from "citty";
49054
+ import { defineCommand as defineCommand188 } from "citty";
48902
49055
  registerSchema({
48903
49056
  command: "scheduled-actions.update",
48904
49057
  description: "Stage an update to a published scheduled action or temp_sched_* draft-created scheduled action.",
@@ -48929,7 +49082,7 @@ registerSchema({
48929
49082
  prompt: { type: "string", description: "Replacement additional spawned-agent instructions", required: false }
48930
49083
  }
48931
49084
  });
48932
- var updateCommand3 = defineCommand187({
49085
+ var updateCommand3 = defineCommand188({
48933
49086
  meta: {
48934
49087
  name: "update",
48935
49088
  description: "Stage a scheduled action update. Examples: baker scheduled-actions update <id> --enabled false | baker scheduled-actions update <id> --mode publish"
@@ -49007,7 +49160,7 @@ var updateCommand3 = defineCommand187({
49007
49160
  });
49008
49161
 
49009
49162
  // src/commands/scheduled-actions/index.ts
49010
- var scheduledActionsCommand = defineCommand188({
49163
+ var scheduledActionsCommand = defineCommand189({
49011
49164
  meta: {
49012
49165
  name: "scheduled-actions",
49013
49166
  description: `Manage Scheduled Actions. Subcommands: list, get, create, update, delete, trigger, templates.
@@ -49036,14 +49189,14 @@ Full guide: __tooling__/docs/tools/baker/scheduled-actions.md`
49036
49189
  });
49037
49190
 
49038
49191
  // src/commands/schema.ts
49039
- import { defineCommand as defineCommand189 } from "citty";
49192
+ import { defineCommand as defineCommand190 } from "citty";
49040
49193
  function narrowToFamily(commandName, available) {
49041
49194
  const segments = commandName.split(".");
49042
49195
  const prefix = segments[0] === "ads" && segments[1] ? `ads.${segments[1]}.` : `${segments[0]}.`;
49043
49196
  const siblings = available.filter((name) => name.startsWith(prefix));
49044
49197
  return siblings.length > 0 ? siblings : available;
49045
49198
  }
49046
- var schemaCommand2 = defineCommand189({
49199
+ var schemaCommand2 = defineCommand190({
49047
49200
  meta: {
49048
49201
  name: "schema",
49049
49202
  description: "Inspect command argument schemas (for AI agent introspection). Lists all commands if no argument given. Example: baker schema images.search"
@@ -49087,10 +49240,10 @@ var schemaCommand2 = defineCommand189({
49087
49240
  });
49088
49241
 
49089
49242
  // src/commands/studio/index.ts
49090
- import { defineCommand as defineCommand198 } from "citty";
49243
+ import { defineCommand as defineCommand199 } from "citty";
49091
49244
 
49092
49245
  // src/commands/studio/animate.ts
49093
- import { defineCommand as defineCommand190 } from "citty";
49246
+ import { defineCommand as defineCommand191 } from "citty";
49094
49247
 
49095
49248
  // src/commands/studio/batch.ts
49096
49249
  function projectBatch(generation, full) {
@@ -49541,7 +49694,7 @@ function costHintsFor(body) {
49541
49694
  }
49542
49695
  return hints;
49543
49696
  }
49544
- var animateCommand = defineCommand190({
49697
+ var animateCommand = defineCommand191({
49545
49698
  meta: {
49546
49699
  name: "animate",
49547
49700
  description: "Render a clip. With an image the look is already fixed, so the prompt describes MOVEMENT \u2014 what the camera does, what the subject does, in what order. With --from text there is no image and the prompt is the whole shot.\n\nA rendered clip is NOT usable anywhere until you keep it: `baker studio keep <id> --slot N` is what puts it in the video library. Takes nobody keeps are never ingested, which is what makes a rejected batch cheap.\n\nFor anything longer than 15 seconds, or to build on footage that already exists, use --model bytedance/seedance-2.5: it renders 4-30s and is the only model that reads an existing clip or an existing soundtrack.\n\nExamples:\n baker studio animate 'slow push in, model turns to camera and smiles' --image j57abc123def456ghi789\n baker studio animate 'she looks to camera and says: \"Hola, soy Elena\"' --avatar elena --quality 720p --aspect-ratio 9:16\n baker studio animate 'handheld drift right, steam rising from the cup' --image './out/hero.png' --duration 6 --quality 1080p\n baker studio animate 'product rotates once on a turntable' --image j57abc\u2026,j57def\u2026 --from references\n baker studio animate 'she keeps walking, camera stays with her, then she stops and looks up' --image j57abc\u2026 --from references --from-clip j57batch\u2026:0 --model bytedance/seedance-2.5 --duration 20\n baker studio animate 'hold on the product, then a slow push-in' --from references --from-video j57vid\u2026 --model bytedance/seedance-2.5\n baker studio animate 'slow drone pull-back over a solar farm at golden hour, no people' --from text --model bytedance/seedance-2.5 --duration 12"
@@ -49665,7 +49818,7 @@ var animateCommand = defineCommand190({
49665
49818
  });
49666
49819
 
49667
49820
  // src/commands/studio/generate.ts
49668
- import { defineCommand as defineCommand191 } from "citty";
49821
+ import { defineCommand as defineCommand192 } from "citty";
49669
49822
  var MODEL_LIST2 = IMAGE_MODEL_IDS;
49670
49823
  var DEFAULT_MAX_WAIT_MS2 = 24e4;
49671
49824
  registerSchema({
@@ -49801,7 +49954,7 @@ function buildGenerateBody(args, prompt) {
49801
49954
  }
49802
49955
  return body;
49803
49956
  }
49804
- var generateCommand = defineCommand191({
49957
+ var generateCommand = defineCommand192({
49805
49958
  meta: {
49806
49959
  name: "generate",
49807
49960
  description: "Start here to make an image. Renders 1-8 takes of one brief, ingests each into the media library as it lands, and shows the batch in the dashboard Studio next to the ones the client ran.\n\nModel choice: google/gemini-3.1-flash-image-preview (default \u2014 fast, best at editing a reference and at extreme ratios), google/gemini-3-pro-image-preview (highest fidelity, slower), openai/gpt-image-2 (photoreal and the cleanest in-image text \u2014 no --image-size, no 4:5 / 5:4), recraft/recraft-v4.1-pro-vector (vector/flat marks with palette control).\n\n--reference is the biggest quality lever there is: a real logo, product shot, Pinterest pin or sandbox screenshot beats any amount of adjectives.\n\nExamples:\n baker studio generate 'matte black bottle on wet marble, hard studio light, 35mm' --aspect-ratio 3:2 --count 3\n baker studio generate 'this bottle on a sunlit kitchen counter' --reference './src/brand/product.png,https://\u2026/kitchen.jpg'\n baker studio generate 'founder-style selfie, kitchen background, natural light' --skill ugc-selfie-hook\n baker studio generate 'flat geometric mascot, brand palette' --model recraft/recraft-v4.1-pro-vector --rgb-colors '[[10,10,10],[255,80,0]]'"
@@ -49884,7 +50037,7 @@ var generateCommand = defineCommand191({
49884
50037
  });
49885
50038
 
49886
50039
  // src/commands/studio/get.ts
49887
- import { defineCommand as defineCommand192 } from "citty";
50040
+ import { defineCommand as defineCommand193 } from "citty";
49888
50041
  registerSchema({
49889
50042
  command: "studio.get",
49890
50043
  description: "Read one Studio batch: every take, where it lives, and why a take is missing. This is how you pick up a batch that was still rendering when the start command returned.",
@@ -49893,7 +50046,7 @@ registerSchema({
49893
50046
  full: { type: "boolean", description: "Include settings, references and attribution", required: false }
49894
50047
  }
49895
50048
  });
49896
- var getCommand5 = defineCommand192({
50049
+ var getCommand5 = defineCommand193({
49897
50050
  meta: {
49898
50051
  name: "get",
49899
50052
  description: "Read one Studio batch \u2014 the takes, their urls, whether each is in the library, and the reason for any that failed.\n\nExample: baker studio get j57abc123def456ghi789\nExample: baker studio get j57abc123def456ghi789 --full"
@@ -49922,7 +50075,7 @@ var getCommand5 = defineCommand192({
49922
50075
  });
49923
50076
 
49924
50077
  // src/commands/studio/improve.ts
49925
- import { defineCommand as defineCommand193 } from "citty";
50078
+ import { defineCommand as defineCommand194 } from "citty";
49926
50079
  var DESCRIPTION = "Sharpen a rough brief into directed art direction \u2014 the same rewrite the client gets from the wand in the Studio prompt bar. Reach for it when you are relaying the CLIENT's own words and want them shaped without substituting your voice; when you are writing the art direction yourself, just write it, because you will do a better job than this does.";
49927
50080
  registerSchema({
49928
50081
  command: "studio.improve",
@@ -49947,7 +50100,7 @@ registerSchema({
49947
50100
  }
49948
50101
  }
49949
50102
  });
49950
- var improveCommand = defineCommand193({
50103
+ var improveCommand = defineCommand194({
49951
50104
  meta: {
49952
50105
  name: "improve",
49953
50106
  description: `${DESCRIPTION}
@@ -49991,7 +50144,7 @@ Examples:
49991
50144
  });
49992
50145
 
49993
50146
  // src/commands/studio/keep.ts
49994
- import { defineCommand as defineCommand194 } from "citty";
50147
+ import { defineCommand as defineCommand195 } from "citty";
49995
50148
  registerSchema({
49996
50149
  command: "studio.keep",
49997
50150
  description: "Mark one take as the keeper. For an image this stars it, so the client reviewing the batch sees which one you used. For a CLIP it is the step that puts it in the video library \u2014 until then the clip cannot be used in a canvas, a landing, or an ad.",
@@ -50001,7 +50154,7 @@ registerSchema({
50001
50154
  undo: { type: "boolean", description: "Un-star an image, or take a kept clip back out", required: false }
50002
50155
  }
50003
50156
  });
50004
- var keepCommand = defineCommand194({
50157
+ var keepCommand = defineCommand195({
50005
50158
  meta: {
50006
50159
  name: "keep",
50007
50160
  description: "Mark one take as the keeper. An image gets starred (it was already in the library); a clip gets INGESTED into the video library, which is what makes it usable anywhere else.\n\nExample: baker studio keep j57abc123def456ghi789 --slot 2\nExample: baker studio keep j57abc123def456ghi789 --slot 2 --undo"
@@ -50052,7 +50205,7 @@ var keepCommand = defineCommand194({
50052
50205
  });
50053
50206
 
50054
50207
  // src/commands/studio/list.ts
50055
- import { defineCommand as defineCommand195 } from "citty";
50208
+ import { defineCommand as defineCommand196 } from "citty";
50056
50209
  registerSchema({
50057
50210
  command: "studio.list",
50058
50211
  description: "Recent Studio batches for THIS conversation, newest first \u2014 what you have already generated, so you re-use a take instead of paying for it twice. `--all` widens it to everything the company generated, including what people ran themselves in the dashboard.",
@@ -50063,7 +50216,7 @@ registerSchema({
50063
50216
  full: { type: "boolean", description: "Include settings, references and attribution", required: false }
50064
50217
  }
50065
50218
  });
50066
- var listCommand16 = defineCommand195({
50219
+ var listCommand16 = defineCommand196({
50067
50220
  meta: {
50068
50221
  name: "list",
50069
50222
  description: "Recent Studio batches, newest first. Scoped to this conversation unless you pass --all.\n\nExample: baker studio list\nExample: baker studio list --kind video --limit 5\nExample: baker studio list --all # includes batches the client ran in the dashboard"
@@ -50097,7 +50250,7 @@ var listCommand16 = defineCommand195({
50097
50250
  });
50098
50251
 
50099
50252
  // src/commands/studio/models.ts
50100
- import { defineCommand as defineCommand196 } from "citty";
50253
+ import { defineCommand as defineCommand197 } from "citty";
50101
50254
  var DESCRIPTION2 = "What each Studio model actually accepts: its shapes, resolutions, clip lengths, prompt character cap, how many reference images it takes, and which knobs it has. Read this before a batch you care about \u2014 the models disagree far more than they look like they do, and a setting the chosen model does not have is REFUSED, not ignored.";
50102
50255
  registerSchema({
50103
50256
  command: "studio.models",
@@ -50184,7 +50337,7 @@ function buildModelCards(kind, model) {
50184
50337
  const selected = model ? ids.filter((id) => id === model) : ids;
50185
50338
  return selected.map((id) => build(id));
50186
50339
  }
50187
- var modelsCommand = defineCommand196({
50340
+ var modelsCommand = defineCommand197({
50188
50341
  meta: {
50189
50342
  name: "models",
50190
50343
  description: `${DESCRIPTION2}
@@ -50231,13 +50384,13 @@ Examples:
50231
50384
  });
50232
50385
 
50233
50386
  // src/commands/studio/skills.ts
50234
- import { defineCommand as defineCommand197 } from "citty";
50387
+ import { defineCommand as defineCommand198 } from "citty";
50235
50388
  registerSchema({
50236
50389
  command: "studio.skills",
50237
50390
  description: "The craft directions `studio generate --skill <id>` accepts. Each one carries directed art direction plus the model, shape and take count it wants, so you pick a look by name instead of writing the boilerplate yourself.",
50238
50391
  args: {}
50239
50392
  });
50240
- var skillsCommand = defineCommand197({
50393
+ var skillsCommand = defineCommand198({
50241
50394
  meta: {
50242
50395
  name: "skills",
50243
50396
  description: "List the craft directions available to `baker studio generate --skill <id>` \u2014 what each one is for, whether it wants a reference image, and the model/shape/count it defaults to.\n\nExample: baker studio skills"
@@ -50261,7 +50414,7 @@ var skillsCommand = defineCommand197({
50261
50414
  });
50262
50415
 
50263
50416
  // src/commands/studio/index.ts
50264
- var studioCommand = defineCommand198({
50417
+ var studioCommand = defineCommand199({
50265
50418
  meta: {
50266
50419
  name: "studio",
50267
50420
  description: `Make new imagery and clips. Every batch is recorded and shows up in the dashboard Studio for the client to review, labelled with this conversation.
@@ -50304,10 +50457,10 @@ Full guide: __tooling__/docs/tools/baker/studio.md`
50304
50457
  });
50305
50458
 
50306
50459
  // src/commands/tag-manager/index.ts
50307
- import { defineCommand as defineCommand202 } from "citty";
50460
+ import { defineCommand as defineCommand203 } from "citty";
50308
50461
 
50309
50462
  // src/commands/tag-manager/draft.ts
50310
- import { defineCommand as defineCommand199 } from "citty";
50463
+ import { defineCommand as defineCommand200 } from "citty";
50311
50464
 
50312
50465
  // src/commands/tag-manager/shared.ts
50313
50466
  import { readFileSync as readFileSync15 } from "fs";
@@ -50430,13 +50583,13 @@ registerSchema({
50430
50583
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
50431
50584
  }
50432
50585
  });
50433
- var draftCommand4 = defineCommand199({
50586
+ var draftCommand4 = defineCommand200({
50434
50587
  meta: {
50435
50588
  name: "draft",
50436
50589
  description: "List, show, amend, remove, or clear staged Tag Manager changes for this chat. `list` and `show` take --chat <id> to read an earlier chat's changes instead."
50437
50590
  },
50438
50591
  subCommands: {
50439
- list: defineCommand199({
50592
+ list: defineCommand200({
50440
50593
  meta: {
50441
50594
  name: "list",
50442
50595
  description: "Review everything staged on this chat (--json for the raw envelope)"
@@ -50449,7 +50602,7 @@ var draftCommand4 = defineCommand199({
50449
50602
  await draftList2(args.json === true, args.chat);
50450
50603
  }
50451
50604
  }),
50452
- show: defineCommand199({
50605
+ show: defineCommand200({
50453
50606
  meta: {
50454
50607
  name: "show",
50455
50608
  description: "Print the full staged payload for one change \u2014 the receipt to verify it looks right before publish (never truncated)."
@@ -50466,7 +50619,7 @@ var draftCommand4 = defineCommand199({
50466
50619
  );
50467
50620
  }
50468
50621
  }),
50469
- amend: defineCommand199({
50622
+ amend: defineCommand200({
50470
50623
  meta: {
50471
50624
  name: "amend",
50472
50625
  description: "Update a staged change in place \u2014 merges a JSON patch into its payload (objects deep-merge, null deletes a key, arrays/scalars replace) and re-validates. Use this instead of remove + re-create."
@@ -50483,7 +50636,7 @@ var draftCommand4 = defineCommand199({
50483
50636
  });
50484
50637
  }
50485
50638
  }),
50486
- remove: defineCommand199({
50639
+ remove: defineCommand200({
50487
50640
  meta: { name: "remove", description: "Remove one staged change (cascades to anything depending on it)" },
50488
50641
  args: { ref: { type: "positional", description: "Staged ref (gtm_temp_*) or target", required: false } },
50489
50642
  run: async ({ args }) => {
@@ -50492,7 +50645,7 @@ var draftCommand4 = defineCommand199({
50492
50645
  });
50493
50646
  }
50494
50647
  }),
50495
- clear: defineCommand199({
50648
+ clear: defineCommand200({
50496
50649
  meta: { name: "clear", description: "Discard all Tag Manager changes staged on this chat" },
50497
50650
  run: async () => {
50498
50651
  await draftAction3("/api/tag-manager/draft/clear", {});
@@ -50502,7 +50655,7 @@ var draftCommand4 = defineCommand199({
50502
50655
  });
50503
50656
 
50504
50657
  // src/commands/tag-manager/read.ts
50505
- import { defineCommand as defineCommand200 } from "citty";
50658
+ import { defineCommand as defineCommand201 } from "citty";
50506
50659
  registerSchema({
50507
50660
  command: "tagManager.containers",
50508
50661
  description: "List the Google Tag Manager containers this company's connection can reach. Every container the company connected is flagged `connected: true` \u2014 there can be several, and Baker may read and change all of them. Start here to confirm which containers you are managing.",
@@ -50543,7 +50696,7 @@ function containersHints(containers) {
50543
50696
  }))
50544
50697
  });
50545
50698
  }
50546
- var containersCommand = defineCommand200({
50699
+ var containersCommand = defineCommand201({
50547
50700
  meta: {
50548
50701
  name: "containers",
50549
50702
  description: `List Tag Manager containers reachable by this company's connection.
@@ -50560,7 +50713,7 @@ Start here:
50560
50713
  }
50561
50714
  }
50562
50715
  });
50563
- var readCommand = defineCommand200({
50716
+ var readCommand = defineCommand201({
50564
50717
  meta: {
50565
50718
  name: "read",
50566
50719
  description: `Read the current contents of the Tag Manager container \u2014 always do this before staging changes.
@@ -50602,7 +50755,7 @@ Examples:
50602
50755
  });
50603
50756
 
50604
50757
  // src/commands/tag-manager/write-commands.ts
50605
- import { defineCommand as defineCommand201 } from "citty";
50758
+ import { defineCommand as defineCommand202 } from "citty";
50606
50759
  var CONTAINER_ARG_DESCRIPTION = "Numeric container id (optional only when one container is connected \u2014 run `baker tag-manager containers`)";
50607
50760
  var ENTITIES = [
50608
50761
  {
@@ -50658,10 +50811,10 @@ for (const { entity, noun, createHint } of ENTITIES) {
50658
50811
  });
50659
50812
  }
50660
50813
  function entityCommand(entity, noun, example) {
50661
- return defineCommand201({
50814
+ return defineCommand202({
50662
50815
  meta: { name: entity, description: `Stage ${noun} changes on this chat's Tag Manager draft` },
50663
50816
  subCommands: {
50664
- create: defineCommand201({
50817
+ create: defineCommand202({
50665
50818
  meta: {
50666
50819
  name: "create",
50667
50820
  description: `Stage a new ${noun}
@@ -50683,7 +50836,7 @@ Examples:
50683
50836
  });
50684
50837
  }
50685
50838
  }),
50686
- update: defineCommand201({
50839
+ update: defineCommand202({
50687
50840
  meta: {
50688
50841
  name: "update",
50689
50842
  description: `Stage an update to an existing ${noun} (pass its id or path)`
@@ -50703,7 +50856,7 @@ Examples:
50703
50856
  });
50704
50857
  }
50705
50858
  }),
50706
- delete: defineCommand201({
50859
+ delete: defineCommand202({
50707
50860
  meta: { name: "delete", description: `Stage the deletion of a ${noun} (pass its id or path)` },
50708
50861
  args: {
50709
50862
  id: { type: "positional", description: `${noun} id or path`, required: false },
@@ -50744,7 +50897,7 @@ function builtinTypes(args) {
50744
50897
  }
50745
50898
  return raw.split(",").map((entry) => entry.trim());
50746
50899
  }
50747
- var builtinCommand = defineCommand201({
50900
+ var builtinCommand = defineCommand202({
50748
50901
  meta: {
50749
50902
  name: "builtin",
50750
50903
  description: `Enable or disable built-in variables
@@ -50754,7 +50907,7 @@ Examples:
50754
50907
  baker tag-manager builtin disable --types formId`
50755
50908
  },
50756
50909
  subCommands: {
50757
- enable: defineCommand201({
50910
+ enable: defineCommand202({
50758
50911
  meta: { name: "enable", description: "Stage enabling built-in variables" },
50759
50912
  args: {
50760
50913
  types: { type: "string", description: "Comma-separated types", required: false },
@@ -50768,7 +50921,7 @@ Examples:
50768
50921
  });
50769
50922
  }
50770
50923
  }),
50771
- disable: defineCommand201({
50924
+ disable: defineCommand202({
50772
50925
  meta: { name: "disable", description: "Stage disabling built-in variables" },
50773
50926
  args: {
50774
50927
  types: { type: "string", description: "Comma-separated types", required: false },
@@ -50786,7 +50939,7 @@ Examples:
50786
50939
  });
50787
50940
 
50788
50941
  // src/commands/tag-manager/index.ts
50789
- var tagManagerCommand = defineCommand202({
50942
+ var tagManagerCommand = defineCommand203({
50790
50943
  meta: {
50791
50944
  name: "tag-manager",
50792
50945
  description: `Read and change what lives inside the client's Google Tag Manager container \u2014 tags, triggers, variables, folders and built-in variables.
@@ -50823,7 +50976,7 @@ Full guide: __tooling__/docs/tools/baker/tag-manager.md`
50823
50976
  });
50824
50977
 
50825
50978
  // src/commands/tags/index.ts
50826
- import { defineCommand as defineCommand203 } from "citty";
50979
+ import { defineCommand as defineCommand204 } from "citty";
50827
50980
 
50828
50981
  // src/commands/tags/shared.ts
50829
50982
  function failApi3(err) {
@@ -50892,7 +51045,7 @@ async function listTags(json) {
50892
51045
  var listArgs9 = {
50893
51046
  json: { type: "boolean", description: "Print the raw JSON envelope instead of the readable list" }
50894
51047
  };
50895
- var listCommand17 = defineCommand203({
51048
+ var listCommand17 = defineCommand204({
50896
51049
  meta: {
50897
51050
  name: "list",
50898
51051
  description: "Effective tags for this chat (production + staged), with each tag's full readable config (secrets excluded) \u2014 reuse a stored value to pre-fill a change rather than asking the user. Refs printed here are what flow side-effect tagIds should use. Example: baker tags list"
@@ -50911,7 +51064,7 @@ async function listDraft3(chat) {
50911
51064
  failApi3(err);
50912
51065
  }
50913
51066
  }
50914
- var draftCommand5 = defineCommand203({
51067
+ var draftCommand5 = defineCommand204({
50915
51068
  meta: {
50916
51069
  name: "draft",
50917
51070
  description: "Review the tag changes staged in this chat (read-only). Staged changes were approved via request_tag_input and apply when the chat is published; to amend or drop one, propose a follow-up change through the same tool (a delete on a tag_temp_* ref drops the staged create). Takes --chat <id> to read an earlier chat's staged changes instead."
@@ -50921,7 +51074,7 @@ var draftCommand5 = defineCommand203({
50921
51074
  await listDraft3(args.chat);
50922
51075
  }
50923
51076
  });
50924
- var tagsCommand4 = defineCommand203({
51077
+ var tagsCommand4 = defineCommand204({
50925
51078
  meta: {
50926
51079
  name: "tags",
50927
51080
  description: `Read the client's marketing/analytics tags (Meta pixel, GA4, Google Ads, GTM, Clarity, Hotjar, \u2026) \u2014 production tags plus the changes staged in this chat.
@@ -50950,10 +51103,10 @@ Full guide: __tooling__/docs/tools/baker/tags.md`
50950
51103
  });
50951
51104
 
50952
51105
  // src/commands/testimonials/index.ts
50953
- import { defineCommand as defineCommand207 } from "citty";
51106
+ import { defineCommand as defineCommand208 } from "citty";
50954
51107
 
50955
51108
  // src/commands/testimonials/get.ts
50956
- import { defineCommand as defineCommand204 } from "citty";
51109
+ import { defineCommand as defineCommand205 } from "citty";
50957
51110
  registerSchema({
50958
51111
  command: "testimonials.get",
50959
51112
  description: "Get a single testimonial by ID",
@@ -50961,7 +51114,7 @@ registerSchema({
50961
51114
  id: { type: "string", description: "Testimonial ID", required: true }
50962
51115
  }
50963
51116
  });
50964
- var getCommand6 = defineCommand204({
51117
+ var getCommand6 = defineCommand205({
50965
51118
  meta: { name: "get", description: "Get a single testimonial by ID. Example: baker testimonials get j571abc123" },
50966
51119
  args: {
50967
51120
  id: { type: "positional", description: "Testimonial ID", required: false },
@@ -50998,7 +51151,7 @@ var getCommand6 = defineCommand204({
50998
51151
  });
50999
51152
 
51000
51153
  // src/commands/testimonials/list.ts
51001
- import { defineCommand as defineCommand205 } from "citty";
51154
+ import { defineCommand as defineCommand206 } from "citty";
51002
51155
 
51003
51156
  // src/commands/testimonials/emptyCorpusHints.ts
51004
51157
  function resolveEmptyReason({
@@ -51133,7 +51286,7 @@ function buildListParams(args) {
51133
51286
  }
51134
51287
  return params;
51135
51288
  }
51136
- var listCommand18 = defineCommand205({
51289
+ var listCommand18 = defineCommand206({
51137
51290
  meta: {
51138
51291
  name: "list",
51139
51292
  description: "List testimonials with optional filters. Example: baker testimonials list --source google --sentiment positive"
@@ -51185,7 +51338,7 @@ var listCommand18 = defineCommand205({
51185
51338
  });
51186
51339
 
51187
51340
  // src/commands/testimonials/search.ts
51188
- import { defineCommand as defineCommand206 } from "citty";
51341
+ import { defineCommand as defineCommand207 } from "citty";
51189
51342
  var FILTER_FLAGS2 = ["source", "rating-min", "rating-max", "status", "sentiment", "language", "tags"];
51190
51343
  function languageBiasHint(results, requestedLanguage) {
51191
51344
  if (requestedLanguage) {
@@ -51264,7 +51417,7 @@ function buildSearchRequest(query, args) {
51264
51417
  }
51265
51418
  return body;
51266
51419
  }
51267
- var searchCommand3 = defineCommand206({
51420
+ var searchCommand3 = defineCommand207({
51268
51421
  meta: {
51269
51422
  name: "search",
51270
51423
  description: "Semantic search testimonials by text query. Uses hybrid BM25 + vector + reranking. Example: baker testimonials search 'great service' --rating-min 4"
@@ -51328,7 +51481,7 @@ var searchCommand3 = defineCommand206({
51328
51481
  var tagsCommand5 = makeTagsCommand("testimonials", "testimonial", "/api/testimonials/tags");
51329
51482
 
51330
51483
  // src/commands/testimonials/index.ts
51331
- var testimonialsCommand = defineCommand207({
51484
+ var testimonialsCommand = defineCommand208({
51332
51485
  meta: {
51333
51486
  name: "testimonials",
51334
51487
  description: `Find and browse testimonials in Baker. Subcommands: search, get, list, tags.
@@ -51350,10 +51503,10 @@ Full guide: __tooling__/docs/tools/baker/testimonials.md`
51350
51503
  });
51351
51504
 
51352
51505
  // src/commands/videos/index.ts
51353
- import { defineCommand as defineCommand214 } from "citty";
51506
+ import { defineCommand as defineCommand215 } from "citty";
51354
51507
 
51355
51508
  // src/commands/videos/delete.ts
51356
- import { defineCommand as defineCommand208 } from "citty";
51509
+ import { defineCommand as defineCommand209 } from "citty";
51357
51510
  registerSchema({
51358
51511
  command: "videos.delete",
51359
51512
  description: "Delete a video by ID",
@@ -51367,7 +51520,7 @@ registerSchema({
51367
51520
  }
51368
51521
  }
51369
51522
  });
51370
- var deleteCommand4 = defineCommand208({
51523
+ var deleteCommand4 = defineCommand209({
51371
51524
  meta: {
51372
51525
  name: "delete",
51373
51526
  description: "Delete a video by ID. Use --dry-run to preview. Example: baker videos delete j571abc123 --dry-run"
@@ -51408,7 +51561,7 @@ var deleteCommand4 = defineCommand208({
51408
51561
  });
51409
51562
 
51410
51563
  // src/commands/videos/get.ts
51411
- import { defineCommand as defineCommand209 } from "citty";
51564
+ import { defineCommand as defineCommand210 } from "citty";
51412
51565
  registerSchema({
51413
51566
  command: "videos.get",
51414
51567
  description: "Get a single video by ID",
@@ -51416,7 +51569,7 @@ registerSchema({
51416
51569
  id: { type: "string", description: "Video ID", required: true }
51417
51570
  }
51418
51571
  });
51419
- var getCommand7 = defineCommand209({
51572
+ var getCommand7 = defineCommand210({
51420
51573
  meta: { name: "get", description: "Get a single video by ID. Example: baker videos get j571abc123" },
51421
51574
  args: {
51422
51575
  id: { type: "positional", description: "Video ID", required: false },
@@ -51453,7 +51606,7 @@ var getCommand7 = defineCommand209({
51453
51606
  });
51454
51607
 
51455
51608
  // src/commands/videos/group.ts
51456
- import { defineCommand as defineCommand210 } from "citty";
51609
+ import { defineCommand as defineCommand211 } from "citty";
51457
51610
  registerSchema({
51458
51611
  command: "videos.group",
51459
51612
  description: "List every clip and image that arrived in the same set as this video (carousel slides, one page)",
@@ -51462,7 +51615,7 @@ registerSchema({
51462
51615
  "group-key": { type: "string", description: "The set key directly, when you already have it", required: false }
51463
51616
  }
51464
51617
  });
51465
- var groupCommand2 = defineCommand210({
51618
+ var groupCommand2 = defineCommand211({
51466
51619
  meta: {
51467
51620
  name: "group",
51468
51621
  description: "List every asset that arrived in the same set as this clip \u2014 the other slides of the Instagram post it came from, stills included. A carousel is authored to be read in order, so a clip pulled out of one is usually missing half its meaning. Example: baker videos group <videoId>"
@@ -51485,7 +51638,7 @@ var groupCommand2 = defineCommand210({
51485
51638
  import { mkdtemp as mkdtemp3, rm as rm8, stat as stat8 } from "fs/promises";
51486
51639
  import { tmpdir as tmpdir4 } from "os";
51487
51640
  import path40 from "path";
51488
- import { defineCommand as defineCommand211 } from "citty";
51641
+ import { defineCommand as defineCommand212 } from "citty";
51489
51642
 
51490
51643
  // src/lib/streamUpload.ts
51491
51644
  import { createHash as createHash2 } from "crypto";
@@ -51649,7 +51802,7 @@ registerSchema({
51649
51802
  "dry-run": { type: "boolean", description: "Preview the operation without executing", required: false }
51650
51803
  }
51651
51804
  });
51652
- var ingestCommand2 = defineCommand211({
51805
+ var ingestCommand2 = defineCommand212({
51653
51806
  meta: {
51654
51807
  name: "ingest",
51655
51808
  description: "Add a video to the library from a URL. A direct file URL is handed straight to Baker, which fetches it. A page URL (YouTube, TikTok, Vimeo, Instagram) is downloaded here first, then uploaded \u2014 and a direct URL that Baker cannot fetch falls back to that same path automatically.\n\nExample: baker videos ingest https://www.youtube.com/watch?v=abc123"
@@ -51911,7 +52064,7 @@ async function uploadToAssetStore(filePath, sizeBytes) {
51911
52064
  }
51912
52065
 
51913
52066
  // src/commands/videos/search.ts
51914
- import { defineCommand as defineCommand212 } from "citty";
52067
+ import { defineCommand as defineCommand213 } from "citty";
51915
52068
  registerSchema({
51916
52069
  command: "videos.search",
51917
52070
  description: "Search videos by text query. Only returns ready videos.",
@@ -51921,7 +52074,7 @@ registerSchema({
51921
52074
  tags: { type: "string", description: "Comma-separated tags to filter by", required: false }
51922
52075
  }
51923
52076
  });
51924
- var searchCommand4 = defineCommand212({
52077
+ var searchCommand4 = defineCommand213({
51925
52078
  meta: {
51926
52079
  name: "search",
51927
52080
  description: "Semantic search videos by text query. Uses hybrid BM25 + vector + reranking. Example: baker videos search 'product demo' --tags tutorial"
@@ -51973,7 +52126,7 @@ var tagsCommand6 = makeTagsCommand("videos", "video", "/api/videos/tags");
51973
52126
  // src/commands/videos/upload.ts
51974
52127
  import { readFile as readFile26, stat as stat9 } from "fs/promises";
51975
52128
  import { basename as basename3, extname as extname4 } from "path";
51976
- import { defineCommand as defineCommand213 } from "citty";
52129
+ import { defineCommand as defineCommand214 } from "citty";
51977
52130
  var MIME_MAP = {
51978
52131
  ".mp4": "video/mp4",
51979
52132
  ".mov": "video/quicktime",
@@ -52015,7 +52168,7 @@ function detectContentType(filePath) {
52015
52168
  function isRemoteUrl3(value) {
52016
52169
  return /^https?:\/\//i.test(value);
52017
52170
  }
52018
- var uploadCommand2 = defineCommand213({
52171
+ var uploadCommand2 = defineCommand214({
52019
52172
  meta: {
52020
52173
  name: "upload",
52021
52174
  description: "Upload a video to Baker \u2014 accepts a local file path OR a remote http(s) URL.\n\nLocal: auto-detects content type and uploads via Mux direct upload.\nRemote: hands off to `videos ingest` (direct fetch, or download-then-upload for a YouTube/TikTok/Vimeo page).\n\nExamples:\n baker videos upload ./demo.mp4\n baker videos upload https://www.youtube.com/watch?v=abc123"
@@ -52099,7 +52252,7 @@ var uploadCommand2 = defineCommand213({
52099
52252
  });
52100
52253
 
52101
52254
  // src/commands/videos/index.ts
52102
- var videosCommand = defineCommand214({
52255
+ var videosCommand = defineCommand215({
52103
52256
  meta: {
52104
52257
  name: "videos",
52105
52258
  description: `Find and manage videos in Baker. Subcommands: search, get, upload, ingest, delete, tags.
@@ -52126,10 +52279,10 @@ Full guide: __tooling__/docs/tools/baker/videos.md`
52126
52279
  });
52127
52280
 
52128
52281
  // src/commands/winning-ads/index.ts
52129
- import { defineCommand as defineCommand227 } from "citty";
52282
+ import { defineCommand as defineCommand228 } from "citty";
52130
52283
 
52131
52284
  // src/commands/winning-ads/advertisers.ts
52132
- import { defineCommand as defineCommand215 } from "citty";
52285
+ import { defineCommand as defineCommand216 } from "citty";
52133
52286
 
52134
52287
  // src/commands/winning-ads/shared.ts
52135
52288
  function splitList2(value) {
@@ -52182,7 +52335,7 @@ function advertiserNormalizer(record, full) {
52182
52335
  last_synced_at: record.last_synced_at ?? null
52183
52336
  };
52184
52337
  }
52185
- var advertisersCommand2 = defineCommand215({
52338
+ var advertisersCommand2 = defineCommand216({
52186
52339
  meta: {
52187
52340
  name: "advertisers",
52188
52341
  description: 'List corpus advertisers by name or domain. Find your own advertiser for --exclude-advertiser, or a competitor for --advertiser-id / winners. Example: baker winning-ads advertisers "Deel" --output md'
@@ -52240,7 +52393,7 @@ var advertisersCommand2 = defineCommand215({
52240
52393
  });
52241
52394
 
52242
52395
  // src/commands/winning-ads/brief.ts
52243
- import { defineCommand as defineCommand216 } from "citty";
52396
+ import { defineCommand as defineCommand217 } from "citty";
52244
52397
  registerSchema({
52245
52398
  command: "winning-ads.brief",
52246
52399
  description: "Generate a creative brief grounded in strategically-similar winning ads. Optionally describe the target creative with --dna (JSON) and steer with --notes.",
@@ -52286,7 +52439,7 @@ function parseDna(raw) {
52286
52439
  }
52287
52440
  return parsed;
52288
52441
  }
52289
- var briefCommand = defineCommand216({
52442
+ var briefCommand = defineCommand217({
52290
52443
  meta: {
52291
52444
  name: "brief",
52292
52445
  description: `Generate a creative brief from winning references. Example: baker winning-ads brief --dna '{"angle":"cost savings"}' --notes "B2B, LinkedIn video" --k 8`
@@ -52322,7 +52475,7 @@ var briefCommand = defineCommand216({
52322
52475
  });
52323
52476
 
52324
52477
  // src/commands/winning-ads/content.ts
52325
- import { defineCommand as defineCommand217 } from "citty";
52478
+ import { defineCommand as defineCommand218 } from "citty";
52326
52479
  registerSchema({
52327
52480
  command: "winning-ads.content",
52328
52481
  description: "Read what's INSIDE one winning ad: the spoken transcript, the on-screen text, and the ad copy. Use this after `search`/`winners`/`feed` return a shortlist \u2014 pass an ad_id to understand a reference before reproducing it. Add --full for speech, pacing, and soundtrack detail. Video ads carry the transcript/on-screen text; static ads carry only the copy.",
@@ -52335,7 +52488,7 @@ registerSchema({
52335
52488
  }
52336
52489
  }
52337
52490
  });
52338
- var contentCommand = defineCommand217({
52491
+ var contentCommand = defineCommand218({
52339
52492
  meta: {
52340
52493
  name: "content",
52341
52494
  description: "Read the transcript + on-screen text + copy of one winning ad. Example: baker winning-ads content adg_123 --platform meta --full --output md"
@@ -52384,7 +52537,7 @@ var contentCommand = defineCommand217({
52384
52537
  });
52385
52538
 
52386
52539
  // src/commands/winning-ads/feed.ts
52387
- import { defineCommand as defineCommand218 } from "citty";
52540
+ import { defineCommand as defineCommand219 } from "citty";
52388
52541
  function buildFeedParams(input) {
52389
52542
  const params = {};
52390
52543
  const advertiser = splitList2(input.advertiser);
@@ -52436,7 +52589,7 @@ registerSchema({
52436
52589
  format: { type: "string", description: "Comma-separated formats to include (e.g. static,video)", required: false }
52437
52590
  }
52438
52591
  });
52439
- var feedCommand = defineCommand218({
52592
+ var feedCommand = defineCommand219({
52440
52593
  meta: {
52441
52594
  name: "feed",
52442
52595
  description: "Winners across every brand you follow (browse, then trim per advertiser). Example: baker winning-ads feed --per-advertiser 5 --output md"
@@ -52521,7 +52674,7 @@ var feedCommand = defineCommand218({
52521
52674
  });
52522
52675
 
52523
52676
  // src/commands/winning-ads/follow.ts
52524
- import { defineCommand as defineCommand219 } from "citty";
52677
+ import { defineCommand as defineCommand220 } from "citty";
52525
52678
  var PLATFORMS = ["meta", "linkedin"];
52526
52679
  registerSchema({
52527
52680
  command: "winning-ads.follow",
@@ -52536,7 +52689,7 @@ registerSchema({
52536
52689
  label: { type: "string", description: "Optional display label (defaults to the resolved name)", required: false }
52537
52690
  }
52538
52691
  });
52539
- var followCommand = defineCommand219({
52692
+ var followCommand = defineCommand220({
52540
52693
  meta: {
52541
52694
  name: "follow",
52542
52695
  description: 'Follow a brand to track ALL its ads \u2014 every platform and country. --platform is how we read your input, not a limit. A domain tracks both Meta + LinkedIn. Example: baker winning-ads follow "deel.com" --platform meta'
@@ -52583,7 +52736,7 @@ var followCommand = defineCommand219({
52583
52736
  });
52584
52737
 
52585
52738
  // src/commands/winning-ads/follow-competitors.ts
52586
- import { defineCommand as defineCommand220 } from "citty";
52739
+ import { defineCommand as defineCommand221 } from "citty";
52587
52740
  var PLATFORMS2 = ["meta", "linkedin"];
52588
52741
  var BATCH_TIMEOUT_MS = 3e5;
52589
52742
  function buildFollowBatchBody(input) {
@@ -52616,7 +52769,7 @@ registerSchema({
52616
52769
  }
52617
52770
  }
52618
52771
  });
52619
- var followCompetitorsCommand = defineCommand220({
52772
+ var followCompetitorsCommand = defineCommand221({
52620
52773
  meta: {
52621
52774
  name: "follow-competitors",
52622
52775
  description: 'Follow many brands at once by domain \u2014 add every competitor in one call. Example: baker winning-ads follow-competitors "deel.com,notion.so,hubspot.com"'
@@ -52691,7 +52844,7 @@ var followCompetitorsCommand = defineCommand220({
52691
52844
  });
52692
52845
 
52693
52846
  // src/commands/winning-ads/following.ts
52694
- import { defineCommand as defineCommand221 } from "citty";
52847
+ import { defineCommand as defineCommand222 } from "citty";
52695
52848
  registerSchema({
52696
52849
  command: "winning-ads.following",
52697
52850
  description: "List the brands you follow in your ad-dna library, with each one's status (ready vs still adding) and cached ad counts. A brand still adding has counts that are a lie in progress; one with `discovery_failed` has counts that are short because we couldn't finish looking, which is not the same as it running no ads.",
@@ -52745,7 +52898,7 @@ function followingNormalizer(record, full) {
52745
52898
  platforms: Array.isArray(record.platforms) ? record.platforms : []
52746
52899
  };
52747
52900
  }
52748
- var followingCommand = defineCommand221({
52901
+ var followingCommand = defineCommand222({
52749
52902
  meta: {
52750
52903
  name: "following",
52751
52904
  description: "List brands you follow, with status (ready / adding\u2026) and cached counts. A brand's counts are only final once it is ready. Example: baker winning-ads following --output md"
@@ -52781,7 +52934,7 @@ var followingCommand = defineCommand221({
52781
52934
  });
52782
52935
 
52783
52936
  // src/commands/winning-ads/patterns.ts
52784
- import { defineCommand as defineCommand222 } from "citty";
52937
+ import { defineCommand as defineCommand223 } from "citty";
52785
52938
  registerSchema({
52786
52939
  command: "winning-ads.patterns",
52787
52940
  description: "Mine what separates two cohorts of ads: pass a comma-list of winning ad ids (--winners) and a comma-list of weaker ad ids (--duds). Returns the discriminating DNA fields.",
@@ -52820,7 +52973,7 @@ function discriminatorRow(record) {
52820
52973
  top_values_duds: Array.isArray(record.top_values_b) ? record.top_values_b.join(", ") : ""
52821
52974
  };
52822
52975
  }
52823
- var patternsCommand = defineCommand222({
52976
+ var patternsCommand = defineCommand223({
52824
52977
  meta: {
52825
52978
  name: "patterns",
52826
52979
  description: "Discover what separates winning ads from weak ones. Example: baker winning-ads patterns --winners a_1,a_2,a_3 --duds a_9,a_8 --output md"
@@ -52876,7 +53029,7 @@ var patternsCommand = defineCommand222({
52876
53029
  });
52877
53030
 
52878
53031
  // src/commands/winning-ads/search.ts
52879
- import { defineCommand as defineCommand223 } from "citty";
53032
+ import { defineCommand as defineCommand224 } from "citty";
52880
53033
  registerSchema({
52881
53034
  command: "winning-ads.search",
52882
53035
  description: "Search the ad-dna corpus of scored winning ads. Returns a lean shortlist (advertiser, summary, scores, media_url) to pick a reference to reproduce.",
@@ -52984,7 +53137,7 @@ function buildSearchBody2(args) {
52984
53137
  }
52985
53138
  return body;
52986
53139
  }
52987
- var searchCommand5 = defineCommand223({
53140
+ var searchCommand5 = defineCommand224({
52988
53141
  meta: {
52989
53142
  name: "search",
52990
53143
  description: "Search winning reference ads. Example: baker winning-ads search 'B2B SaaS before/after AI automation' --platform meta --format static --winner-category winner --exclude-advertiser adv_123 --output md"
@@ -53099,7 +53252,7 @@ var searchCommand5 = defineCommand223({
53099
53252
  });
53100
53253
 
53101
53254
  // src/commands/winning-ads/seeds.ts
53102
- import { defineCommand as defineCommand224 } from "citty";
53255
+ import { defineCommand as defineCommand225 } from "citty";
53103
53256
  function leanRow(r) {
53104
53257
  return {
53105
53258
  key: r.key,
@@ -53127,7 +53280,7 @@ function makeSeedCommand(opts) {
53127
53280
  limit: { type: "number", description: "Max keys 1-100 (default 20)", required: false, default: 20 }
53128
53281
  }
53129
53282
  });
53130
- return defineCommand224({
53283
+ return defineCommand225({
53131
53284
  meta: { name: opts.name, description: opts.description },
53132
53285
  args: {
53133
53286
  platform: { type: "string", description: "Single platform to segment on", required: false },
@@ -53176,7 +53329,7 @@ var formatsCommand = makeSeedCommand({
53176
53329
  });
53177
53330
 
53178
53331
  // src/commands/winning-ads/unfollow.ts
53179
- import { defineCommand as defineCommand225 } from "citty";
53332
+ import { defineCommand as defineCommand226 } from "citty";
53180
53333
  registerSchema({
53181
53334
  command: "winning-ads.unfollow",
53182
53335
  description: "Stop following a brand \u2014 removes it from your ad-dna library by advertiser id.",
@@ -53184,7 +53337,7 @@ registerSchema({
53184
53337
  advertiser: { type: "string", description: "Advertiser id to unfollow", required: true }
53185
53338
  }
53186
53339
  });
53187
- var unfollowCommand = defineCommand225({
53340
+ var unfollowCommand = defineCommand226({
53188
53341
  meta: {
53189
53342
  name: "unfollow",
53190
53343
  description: "Stop following a brand by advertiser id. Example: baker winning-ads unfollow adv_123"
@@ -53205,7 +53358,7 @@ var unfollowCommand = defineCommand225({
53205
53358
  });
53206
53359
 
53207
53360
  // src/commands/winning-ads/winners.ts
53208
- import { defineCommand as defineCommand226 } from "citty";
53361
+ import { defineCommand as defineCommand227 } from "citty";
53209
53362
  registerSchema({
53210
53363
  command: "winning-ads.winners",
53211
53364
  description: "Top winning ads for one advertiser id (from `advertisers` or `following`). Returns lean winner cards; add --full for DNA + longevity.",
@@ -53215,7 +53368,7 @@ registerSchema({
53215
53368
  platform: { type: "string", description: "Filter to a single platform: meta|linkedin", required: false }
53216
53369
  }
53217
53370
  });
53218
- var winnersCommand = defineCommand226({
53371
+ var winnersCommand = defineCommand227({
53219
53372
  meta: {
53220
53373
  name: "winners",
53221
53374
  description: "Top winning ads for a specific advertiser id. Example: baker winning-ads winners adv_123 --top 15 --output md"
@@ -53265,7 +53418,7 @@ var winnersCommand = defineCommand226({
53265
53418
  });
53266
53419
 
53267
53420
  // src/commands/winning-ads/index.ts
53268
- var winningAdsCommand = defineCommand227({
53421
+ var winningAdsCommand = defineCommand228({
53269
53422
  meta: {
53270
53423
  name: "winning-ads",
53271
53424
  description: `Search the ad-dna corpus of scored "winning" ads for reference creatives to reproduce, and manage the brands your library tracks. Proxied through the Baker backend (BAKER_API_KEY) \u2014 no separate token needed.
@@ -53503,7 +53656,7 @@ function getCliVersion() {
53503
53656
  }
53504
53657
 
53505
53658
  // src/cli.ts
53506
- var main = defineCommand228({
53659
+ var main = defineCommand229({
53507
53660
  meta: {
53508
53661
  name: "baker",
53509
53662
  version: getCliVersion(),