@koda-sl/baker-cli 0.280.0-dev.1f1c09c80 → 0.281.0-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";
@@ -32821,6 +32909,10 @@ var ASKS_FOR_LEGIBLE = /\b(focus on the (number|amount|total|price|figure|text)|
32821
32909
  function briefWantsLegibleText(show) {
32822
32910
  return ASKS_FOR_LEGIBLE.test(show);
32823
32911
  }
32912
+ 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ÁÉÍÓÚÑ]/;
32913
+ function lineIntroducesSpeaker(line) {
32914
+ return SELF_INTRODUCTION.test(line);
32915
+ }
32824
32916
  function endCardWanted(spec) {
32825
32917
  if (spec.end_card === false) return false;
32826
32918
  return Boolean(spec.brand?.name || spec.brand?.logo);
@@ -32832,6 +32924,7 @@ function endCardCta(spec) {
32832
32924
  const closing = (spec.beats[spec.beats.length - 1]?.say ?? "").trim().toLowerCase();
32833
32925
  return declared.toLowerCase().replace(/[.!?]$/, "") === closing.replace(/[.!?]$/, "") ? null : declared;
32834
32926
  }
32927
+ var AD_CAST_ID = "customer";
32835
32928
  function adSpecCastElements(spec, avatar) {
32836
32929
  const description = (avatar?.subjectDescription ?? spec.cast?.description)?.trim();
32837
32930
  if (!description) return [];
@@ -32842,7 +32935,10 @@ function adSpecCastElements(spec, avatar) {
32842
32935
  return [
32843
32936
  {
32844
32937
  type: "person",
32845
- label: "customer",
32938
+ label: AD_CAST_ID,
32939
+ // Same id the dialogue names as speaker: that pairing is what lets the engine see
32940
+ // the presenter as present in a scene and route it to native audio.
32941
+ cast_id: AD_CAST_ID,
32846
32942
  description,
32847
32943
  scenes,
32848
32944
  // An avatar's identity sheet IS the turnaround the engine would otherwise render,
@@ -32877,6 +32973,39 @@ function staticTranscript(spec) {
32877
32973
  }
32878
32974
  return out;
32879
32975
  }
32976
+ function wantsNativeSpeech(spec, closesOnCard) {
32977
+ if (!spec.cast || spec.voiceover === false) return false;
32978
+ const last = spec.beats.length - 1;
32979
+ const speaking = spec.beats.filter((_, i) => !(closesOnCard && i === last));
32980
+ return speaking.length > 0 && speaking.every((beat) => beat.on_camera === true && beat.cast !== false);
32981
+ }
32982
+ function beatDialogue(spec, beat, window2) {
32983
+ if (spec.voiceover === false) return [];
32984
+ return [
32985
+ {
32986
+ line: beat.say,
32987
+ start_s: window2.start,
32988
+ end_s: window2.end,
32989
+ // `on_camera` is the engine's own switch for "this line is narration" — absent, it
32990
+ // guesses from who is in frame, which is how a still photograph once got lip-synced.
32991
+ // Never true on the closing plate: it is a flat colour card with no one in it, and
32992
+ // saying someone is on camera there sent the engine looking for a mouth to lip-sync
32993
+ // on a picture that has no person.
32994
+ on_camera: beat.on_camera === true && !window2.isClosingCard,
32995
+ // Naming the CAST as speaker is the other half of what sends this beat down the
32996
+ // native path. Left unnamed, the speaker defaults to "voiceover" — a narrator, who is
32997
+ // by definition never on camera — so every beat took the dubbed path: a clip generated
32998
+ // with one mouth and a separate ElevenLabs track laid over it. That is the mismatch
32999
+ // behind every "the mouth does not match" in this ad's history.
33000
+ ...window2.nativeSpeech && !window2.isClosingCard ? { speaker: AD_CAST_ID } : {},
33001
+ ...spec.voice?.description ? { voice_description: spec.voice.description } : {}
33002
+ }
33003
+ ];
33004
+ }
33005
+ function voiceoverMode(spec, nativeSpeech) {
33006
+ if (spec.voiceover === false) return "none";
33007
+ return nativeSpeech ? "on_camera" : "voiceover";
33008
+ }
32880
33009
  function adSpecToBlueprint(spec) {
32881
33010
  const total = spec.beats.length;
32882
33011
  const market = marketFor(spec);
@@ -32884,6 +33013,7 @@ function adSpecToBlueprint(spec) {
32884
33013
  const currency = market ? CURRENCY_BY_MARKET[market.toLowerCase()] : void 0;
32885
33014
  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
33015
  const closesOnCard = endCardWanted(spec);
33016
+ const nativeSpeech = wantsNativeSpeech(spec, closesOnCard);
32887
33017
  let clock = 0;
32888
33018
  const scenes = spec.beats.map((beat, i) => {
32889
33019
  const isClosingCard = closesOnCard && i === total - 1;
@@ -32908,18 +33038,12 @@ function adSpecToBlueprint(spec) {
32908
33038
  // length to what the provider accepts. An ad emitted none of these until now,
32909
33039
  // so every one shipped with a music bed and no sound design at all.
32910
33040
  ...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
- ],
33041
+ dialogue: beatDialogue(spec, beat, {
33042
+ start: Math.round(start * 100) / 100,
33043
+ end: Math.round(clock * 100) / 100,
33044
+ isClosingCard,
33045
+ nativeSpeech
33046
+ }),
32923
33047
  motion_prompt: motionPrompt(beat, isClosingCard, place, physics),
32924
33048
  start_frame_prompt: isClosingCard ? BRAND_PLATE : `${beat.show}${place}${physics}`
32925
33049
  };
@@ -32929,12 +33053,17 @@ function adSpecToBlueprint(spec) {
32929
33053
  global: {
32930
33054
  transcript: spec.beats.map((b) => b.say).join(" "),
32931
33055
  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",
33056
+ mode: voiceoverMode(spec, nativeSpeech),
32936
33057
  ...spec.voice?.description ? { voice_description: spec.voice.description } : {}
32937
33058
  },
33059
+ ...spec.cast ? {
33060
+ cast: [
33061
+ {
33062
+ id: AD_CAST_ID,
33063
+ description: (spec.cast.description ?? "the ad's recurring person").trim()
33064
+ }
33065
+ ]
33066
+ } : {},
32938
33067
  ...spec.brand?.name || spec.brand?.logo ? {
32939
33068
  branding: {
32940
33069
  ...spec.brand?.name ? { name: spec.brand.name } : {},
@@ -33176,7 +33305,7 @@ registerSchema({
33176
33305
  }
33177
33306
  }
33178
33307
  });
33179
- var scaffoldAdCommand = defineCommand104({
33308
+ var scaffoldAdCommand = defineCommand105({
33180
33309
  meta: {
33181
33310
  name: "scaffold-ad",
33182
33311
  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 +33397,20 @@ var scaffoldAdCommand = defineCommand104({
33268
33397
  ...filledPalette ? { palette: filledPalette } : {}
33269
33398
  };
33270
33399
  }
33400
+ const introducesOffCamera = spec.data.beats.map((beat, i) => ({ i, beat })).filter(({ beat }) => beat.on_camera !== true && lineIntroducesSpeaker(beat.say));
33401
+ if (introducesOffCamera.length > 0) {
33402
+ const first = introducesOffCamera[0];
33403
+ writeJson({
33404
+ ok: false,
33405
+ error: {
33406
+ code: "VALIDATION_ERROR",
33407
+ 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.`,
33408
+ 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".'
33409
+ }
33410
+ });
33411
+ process.exit(1);
33412
+ return;
33413
+ }
33271
33414
  const speaksOnCamera = spec.data.beats.some((beat) => beat.on_camera === true);
33272
33415
  if (avatar && !avatar.voiceId && speaksOnCamera) {
33273
33416
  writeJson({
@@ -33275,7 +33418,7 @@ var scaffoldAdCommand = defineCommand104({
33275
33418
  error: {
33276
33419
  code: "VALIDATION_ERROR",
33277
33420
  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.`
33421
+ 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
33422
  }
33280
33423
  });
33281
33424
  process.exit(1);
@@ -33442,7 +33585,7 @@ var scaffoldAdCommand = defineCommand104({
33442
33585
  import { access as access2, cp as cp2, mkdir as mkdir8, readFile as readFile19, rm as rm7, writeFile as writeFile10 } from "fs/promises";
33443
33586
  import { tmpdir as tmpdir3 } from "os";
33444
33587
  import path26 from "path";
33445
- import { defineCommand as defineCommand105 } from "citty";
33588
+ import { defineCommand as defineCommand106 } from "citty";
33446
33589
 
33447
33590
  // src/engine/scaffold/lib/model-router.ts
33448
33591
  var SEEDANCE = "bytedance/seedance-2.0";
@@ -33887,7 +34030,7 @@ async function runAnalysisPasses(deconstructCanvas, selectModel) {
33887
34030
  return fail4("deconstruct", e instanceof Error ? e.message : String(e));
33888
34031
  }
33889
34032
  }
33890
- var scaffoldVideoCommand = defineCommand105({
34033
+ var scaffoldVideoCommand = defineCommand106({
33891
34034
  meta: {
33892
34035
  name: "scaffold-video",
33893
34036
  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 +34340,7 @@ var scaffoldVideoCommand = defineCommand105({
34197
34340
  // src/commands/canvas/set-prompt.ts
34198
34341
  import { readFile as readFile20, writeFile as writeFile11 } from "fs/promises";
34199
34342
  import path27 from "path";
34200
- import { defineCommand as defineCommand106 } from "citty";
34343
+ import { defineCommand as defineCommand107 } from "citty";
34201
34344
  function setNodePrompt(canvas, nodeId, text2) {
34202
34345
  const nodes = canvas?.nodes;
34203
34346
  if (!Array.isArray(nodes)) throw new Error("canvas has no nodes array");
@@ -34212,7 +34355,7 @@ function setNodePrompt(canvas, nodeId, text2) {
34212
34355
  newNodes[idx] = newNode;
34213
34356
  return { ...canvas, nodes: newNodes };
34214
34357
  }
34215
- var setPromptCommand = defineCommand106({
34358
+ var setPromptCommand = defineCommand107({
34216
34359
  meta: {
34217
34360
  name: "set-prompt",
34218
34361
  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 +34415,8 @@ var setPromptCommand = defineCommand106({
34272
34415
  // src/commands/canvas/validate.ts
34273
34416
  import { readFile as readFile21 } from "fs/promises";
34274
34417
  import path28 from "path";
34275
- import { defineCommand as defineCommand107 } from "citty";
34276
- var validateCommand = defineCommand107({
34418
+ import { defineCommand as defineCommand108 } from "citty";
34419
+ var validateCommand = defineCommand108({
34277
34420
  meta: {
34278
34421
  name: "validate",
34279
34422
  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 +34489,7 @@ var validateCommand = defineCommand107({
34346
34489
  });
34347
34490
 
34348
34491
  // src/commands/canvas/index.ts
34349
- var canvasCommand = defineCommand108({
34492
+ var canvasCommand = defineCommand109({
34350
34493
  meta: {
34351
34494
  name: "canvas",
34352
34495
  description: `Run Baker creative canvas JSON files locally. Local nodes execute in-process; remote nodes POST to the Convex backend gateway.
@@ -34382,7 +34525,7 @@ Full guide: __tooling__/docs/tools/baker/canvas.md`
34382
34525
  });
34383
34526
 
34384
34527
  // src/commands/capabilities/index.ts
34385
- import { defineCommand as defineCommand109 } from "citty";
34528
+ import { defineCommand as defineCommand110 } from "citty";
34386
34529
  registerSchema({
34387
34530
  command: "capabilities",
34388
34531
  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 +34568,7 @@ function capabilityHints(surfaces) {
34425
34568
  }
34426
34569
  return hints;
34427
34570
  }
34428
- var runCapabilities = defineCommand109({
34571
+ var runCapabilities = defineCommand110({
34429
34572
  meta: {
34430
34573
  name: "capabilities",
34431
34574
  description: `What Baker can and cannot do for this company, before any work starts.
@@ -34481,7 +34624,7 @@ Full guide: __tooling__/docs/tools/baker/capabilities.md`
34481
34624
  var capabilitiesCommand = runCapabilities;
34482
34625
 
34483
34626
  // src/commands/chats/index.ts
34484
- import { defineCommand as defineCommand110 } from "citty";
34627
+ import { defineCommand as defineCommand111 } from "citty";
34485
34628
  var STATUS_GROUPS = ["active", "archived", "all"];
34486
34629
  var REPO_SURFACES = ["knowledge", "company", "brand", "landings", "flows", "creatives"];
34487
34630
  function parseBoundedInt(raw, name, min, max) {
@@ -34503,7 +34646,7 @@ registerSchema({
34503
34646
  full: { type: "boolean", description: "Include each Session's full change list", required: false, default: false }
34504
34647
  }
34505
34648
  });
34506
- var listCommand11 = defineCommand110({
34649
+ var listCommand11 = defineCommand111({
34507
34650
  meta: { name: "list", description: "List other Sessions on this account, newest first." },
34508
34651
  args: {
34509
34652
  status: { type: "string", description: "Filter: active|archived|all (default: all)", required: false },
@@ -34558,7 +34701,7 @@ registerSchema({
34558
34701
  }
34559
34702
  }
34560
34703
  });
34561
- var viewCommand = defineCommand110({
34704
+ var viewCommand = defineCommand111({
34562
34705
  meta: {
34563
34706
  name: "view",
34564
34707
  description: "Inspect one Session's full effects \u2014 git content + actions/tags/ads, kickoff, commits."
@@ -34602,7 +34745,7 @@ registerSchema({
34602
34745
  }
34603
34746
  }
34604
34747
  });
34605
- var transcriptCommand = defineCommand110({
34748
+ var transcriptCommand = defineCommand111({
34606
34749
  meta: { name: "transcript", description: "Read another Session's conversation." },
34607
34750
  args: {
34608
34751
  id: { type: "positional", description: "The Session id", required: true },
@@ -34654,7 +34797,7 @@ registerSchema({
34654
34797
  }
34655
34798
  }
34656
34799
  });
34657
- var diffCommand = defineCommand110({
34800
+ var diffCommand = defineCommand111({
34658
34801
  meta: { name: "diff", description: "See a published Session's real file-level changes." },
34659
34802
  args: {
34660
34803
  id: { type: "positional", description: "The Session id", required: true },
@@ -34698,7 +34841,7 @@ var diffCommand = defineCommand110({
34698
34841
  }
34699
34842
  }
34700
34843
  });
34701
- var chatsCommand = defineCommand110({
34844
+ var chatsCommand = defineCommand111({
34702
34845
  meta: {
34703
34846
  name: "chats",
34704
34847
  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 +34856,10 @@ Full guide: __tooling__/docs/tools/baker/chats.md`
34713
34856
  });
34714
34857
 
34715
34858
  // src/commands/creatives/index.ts
34716
- import { defineCommand as defineCommand112 } from "citty";
34859
+ import { defineCommand as defineCommand113 } from "citty";
34717
34860
 
34718
34861
  // src/commands/creatives/publish.ts
34719
- import { defineCommand as defineCommand111 } from "citty";
34862
+ import { defineCommand as defineCommand112 } from "citty";
34720
34863
 
34721
34864
  // src/commands/images/api.ts
34722
34865
  import { readFile as readFile22 } from "fs/promises";
@@ -34863,7 +35006,7 @@ async function publishCreative(args, deps = defaultImageApiDeps) {
34863
35006
  chatId: chatIdFromEnv2()
34864
35007
  });
34865
35008
  }
34866
- var publishCommand = defineCommand111({
35009
+ var publishCommand = defineCommand112({
34867
35010
  meta: {
34868
35011
  name: "publish",
34869
35012
  description: "Publish a final static creative image to Baker Creatives and print the creative reference JSON."
@@ -34921,7 +35064,7 @@ var publishCommand = defineCommand111({
34921
35064
  });
34922
35065
 
34923
35066
  // src/commands/creatives/index.ts
34924
- var creativesCommand3 = defineCommand112({
35067
+ var creativesCommand3 = defineCommand113({
34925
35068
  meta: {
34926
35069
  name: "creatives",
34927
35070
  description: `Publish static ad creatives as first-class Baker outputs.
@@ -34938,11 +35081,11 @@ Full guide: __tooling__/docs/tools/baker/creatives.md`
34938
35081
  });
34939
35082
 
34940
35083
  // src/commands/flows/index.ts
34941
- import { defineCommand as defineCommand117 } from "citty";
35084
+ import { defineCommand as defineCommand118 } from "citty";
34942
35085
 
34943
35086
  // src/commands/flows/add.ts
34944
35087
  import { randomUUID } from "crypto";
34945
- import { defineCommand as defineCommand113 } from "citty";
35088
+ import { defineCommand as defineCommand114 } from "citty";
34946
35089
 
34947
35090
  // src/commands/flows/shared.ts
34948
35091
  import { existsSync as existsSync5, readdirSync as readdirSync2, readFileSync as readFileSync9, writeFileSync as writeFileSync3 } from "fs";
@@ -35152,7 +35295,7 @@ registerSchema({
35152
35295
  parent: { type: "string", description: "Parent node id. Omit to append to the root's children.", required: false }
35153
35296
  }
35154
35297
  });
35155
- var addNodeCommand = defineCommand113({
35298
+ var addNodeCommand = defineCommand114({
35156
35299
  meta: {
35157
35300
  name: "add-node",
35158
35301
  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 +35391,7 @@ registerSchema({
35248
35391
  }
35249
35392
  }
35250
35393
  });
35251
- var addSideEffectCommand = defineCommand113({
35394
+ var addSideEffectCommand = defineCommand114({
35252
35395
  meta: {
35253
35396
  name: "add-side-effect",
35254
35397
  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 +35473,7 @@ var addSideEffectCommand = defineCommand113({
35330
35473
 
35331
35474
  // src/commands/flows/map.ts
35332
35475
  import { readFileSync as readFileSync11 } from "fs";
35333
- import { defineCommand as defineCommand114 } from "citty";
35476
+ import { defineCommand as defineCommand115 } from "citty";
35334
35477
 
35335
35478
  // src/commands/flows/value-expression.ts
35336
35479
  import { existsSync as existsSync6, readFileSync as readFileSync10 } from "fs";
@@ -36103,7 +36246,7 @@ async function mapOptions(args, fromFile, into) {
36103
36246
  destinationFields: hubspotForm ? await hubspotFieldCatalog(hubspotForm) : void 0
36104
36247
  };
36105
36248
  }
36106
- var mapCommand2 = defineCommand114({
36249
+ var mapCommand2 = defineCommand115({
36107
36250
  meta: {
36108
36251
  name: "map",
36109
36252
  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 +36344,7 @@ var mapCommand2 = defineCommand114({
36201
36344
  });
36202
36345
 
36203
36346
  // src/commands/flows/normalize.ts
36204
- import { defineCommand as defineCommand115 } from "citty";
36347
+ import { defineCommand as defineCommand116 } from "citty";
36205
36348
  var OPTIONAL_STRINGS = ["oauthProviderId"];
36206
36349
  var ARRAY_FIELDS = [
36207
36350
  "fieldMapping",
@@ -36270,7 +36413,7 @@ registerSchema({
36270
36413
  }
36271
36414
  }
36272
36415
  });
36273
- var normalizeCommand = defineCommand115({
36416
+ var normalizeCommand = defineCommand116({
36274
36417
  meta: {
36275
36418
  name: "normalize",
36276
36419
  description: "Repair the shapes a form file is allowed to get slightly wrong. Example: baker flows normalize contact --write"
@@ -36301,7 +36444,7 @@ var normalizeCommand = defineCommand115({
36301
36444
  });
36302
36445
 
36303
36446
  // src/commands/flows/schema.ts
36304
- import { defineCommand as defineCommand116 } from "citty";
36447
+ import { defineCommand as defineCommand117 } from "citty";
36305
36448
  registerSchema({
36306
36449
  command: "flows.schema",
36307
36450
  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 +36469,7 @@ function triggerHints(triggers) {
36326
36469
  `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
36470
  ];
36328
36471
  }
36329
- var schemaCommand = defineCommand116({
36472
+ var schemaCommand = defineCommand117({
36330
36473
  meta: {
36331
36474
  name: "schema",
36332
36475
  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 +36603,7 @@ function displayName(slug) {
36460
36603
  const name = tree.displayName;
36461
36604
  return typeof name === "string" && name.trim() ? name.trim() : slug;
36462
36605
  }
36463
- var listCommand12 = defineCommand117({
36606
+ var listCommand12 = defineCommand118({
36464
36607
  meta: {
36465
36608
  name: "list",
36466
36609
  description: "List Forms in this workspace with the count of confidential fields still needing setup. Example: baker flows list"
@@ -36481,7 +36624,7 @@ var listCommand12 = defineCommand117({
36481
36624
  });
36482
36625
  }
36483
36626
  });
36484
- var showCommand3 = defineCommand117({
36627
+ var showCommand3 = defineCommand118({
36485
36628
  meta: {
36486
36629
  name: "show",
36487
36630
  description: "Show a Form's confidential fields and their configuration status (never secret values). Example: baker flows show contact"
@@ -36509,7 +36652,7 @@ var showCommand3 = defineCommand117({
36509
36652
  });
36510
36653
  }
36511
36654
  });
36512
- var flowsCommand = defineCommand117({
36655
+ var flowsCommand = defineCommand118({
36513
36656
  meta: {
36514
36657
  name: "flows",
36515
36658
  description: `Read and shape this workspace's Forms (flows).
@@ -36543,10 +36686,10 @@ Full guide: __tooling__/docs/tools/baker/flows.md`
36543
36686
  });
36544
36687
 
36545
36688
  // src/commands/ga4/index.ts
36546
- import { defineCommand as defineCommand124 } from "citty";
36689
+ import { defineCommand as defineCommand125 } from "citty";
36547
36690
 
36548
36691
  // src/commands/ga4/audit.ts
36549
- import { defineCommand as defineCommand118 } from "citty";
36692
+ import { defineCommand as defineCommand119 } from "citty";
36550
36693
 
36551
36694
  // src/commands/ga4/resolve.ts
36552
36695
  async function fetchProperties(useCache = true) {
@@ -36612,7 +36755,7 @@ registerSchema({
36612
36755
  "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false }
36613
36756
  }
36614
36757
  });
36615
- var auditCommand2 = defineCommand118({
36758
+ var auditCommand2 = defineCommand119({
36616
36759
  meta: {
36617
36760
  name: "audit",
36618
36761
  description: `Run all GA4 admin health checks. Returns property config with playbook warnings.
@@ -36667,7 +36810,7 @@ Examples:
36667
36810
  });
36668
36811
 
36669
36812
  // src/commands/ga4/config.ts
36670
- import { defineCommand as defineCommand119 } from "citty";
36813
+ import { defineCommand as defineCommand120 } from "citty";
36671
36814
 
36672
36815
  // src/commands/ga4/shared.ts
36673
36816
  import { readFileSync as readFileSync12 } from "fs";
@@ -36863,7 +37006,7 @@ function configHints(config) {
36863
37006
  }
36864
37007
  return hints;
36865
37008
  }
36866
- var configCommand = defineCommand119({
37009
+ var configCommand = defineCommand120({
36867
37010
  meta: {
36868
37011
  name: "config",
36869
37012
  description: `Read how the property is configured to measure \u2014 key events, custom definitions, custom events, retention
@@ -36895,7 +37038,7 @@ Examples:
36895
37038
  });
36896
37039
 
36897
37040
  // src/commands/ga4/draft.ts
36898
- import { defineCommand as defineCommand120 } from "citty";
37041
+ import { defineCommand as defineCommand121 } from "citty";
36899
37042
  registerSchema({
36900
37043
  command: "ga4.draft",
36901
37044
  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 +37047,13 @@ registerSchema({
36904
37047
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
36905
37048
  }
36906
37049
  });
36907
- var draftCommand3 = defineCommand120({
37050
+ var draftCommand3 = defineCommand121({
36908
37051
  meta: {
36909
37052
  name: "draft",
36910
37053
  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
37054
  },
36912
37055
  subCommands: {
36913
- list: defineCommand120({
37056
+ list: defineCommand121({
36914
37057
  meta: { name: "list", description: "Review everything staged on this chat (--json for the raw envelope)" },
36915
37058
  args: {
36916
37059
  json: { type: "boolean", description: "Print the raw JSON envelope", required: false },
@@ -36920,7 +37063,7 @@ var draftCommand3 = defineCommand120({
36920
37063
  await draftList(args.json === true, args.chat);
36921
37064
  }
36922
37065
  }),
36923
- show: defineCommand120({
37066
+ show: defineCommand121({
36924
37067
  meta: {
36925
37068
  name: "show",
36926
37069
  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 +37080,7 @@ var draftCommand3 = defineCommand120({
36937
37080
  );
36938
37081
  }
36939
37082
  }),
36940
- amend: defineCommand120({
37083
+ amend: defineCommand121({
36941
37084
  meta: {
36942
37085
  name: "amend",
36943
37086
  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 +37097,7 @@ var draftCommand3 = defineCommand120({
36954
37097
  });
36955
37098
  }
36956
37099
  }),
36957
- remove: defineCommand120({
37100
+ remove: defineCommand121({
36958
37101
  meta: { name: "remove", description: "Remove one staged change" },
36959
37102
  args: { ref: { type: "positional", description: "Staged ref or target id", required: false } },
36960
37103
  run: async ({ args }) => {
@@ -36963,7 +37106,7 @@ var draftCommand3 = defineCommand120({
36963
37106
  });
36964
37107
  }
36965
37108
  }),
36966
- clear: defineCommand120({
37109
+ clear: defineCommand121({
36967
37110
  meta: { name: "clear", description: "Discard all Google Analytics changes staged on this chat" },
36968
37111
  run: async () => {
36969
37112
  await draftAction2("/api/ga4/draft/clear", {});
@@ -36973,7 +37116,7 @@ var draftCommand3 = defineCommand120({
36973
37116
  });
36974
37117
 
36975
37118
  // src/commands/ga4/properties.ts
36976
- import { defineCommand as defineCommand121 } from "citty";
37119
+ import { defineCommand as defineCommand122 } from "citty";
36977
37120
  registerSchema({
36978
37121
  command: "ga4.properties",
36979
37122
  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 +37132,7 @@ function propertyHints(properties) {
36989
37132
  resources: properties.map((property) => ({ id: property.externalId, label: property.name }))
36990
37133
  });
36991
37134
  }
36992
- var propertiesCommand = defineCommand121({
37135
+ var propertiesCommand = defineCommand122({
36993
37136
  meta: {
36994
37137
  name: "properties",
36995
37138
  description: `List accessible GA4 properties.
@@ -37039,7 +37182,7 @@ Examples:
37039
37182
  // src/commands/ga4/query.ts
37040
37183
  import { appendFileSync as appendFileSync2, existsSync as existsSync7, readFileSync as readFileSync13, writeFileSync as writeFileSync4 } from "fs";
37041
37184
  import { resolve as resolve2 } from "path";
37042
- import { defineCommand as defineCommand122 } from "citty";
37185
+ import { defineCommand as defineCommand123 } from "citty";
37043
37186
 
37044
37187
  // src/commands/ga4/presets.ts
37045
37188
  var GA4_PRESETS = [
@@ -37174,7 +37317,7 @@ function handleError3(err) {
37174
37317
  });
37175
37318
  process.exit(1);
37176
37319
  }
37177
- var queryCommand2 = defineCommand122({
37320
+ var queryCommand2 = defineCommand123({
37178
37321
  meta: {
37179
37322
  name: "query",
37180
37323
  description: `Run GA4 Data API reports. Preset-first with free-form escape hatch.
@@ -37245,7 +37388,7 @@ Free-form (escape hatch):
37245
37388
  });
37246
37389
 
37247
37390
  // src/commands/ga4/write-commands.ts
37248
- import { defineCommand as defineCommand123 } from "citty";
37391
+ import { defineCommand as defineCommand124 } from "citty";
37249
37392
  var PROPERTY_ARG_DESCRIPTION = "GA4 property id (optional only when one property is connected \u2014 run `baker ga4 properties`)";
37250
37393
  var propertyArg = { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false };
37251
37394
  function createJsonDescription(noun) {
@@ -37263,7 +37406,7 @@ registerSchema({
37263
37406
  "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
37264
37407
  }
37265
37408
  });
37266
- var keyEventCommand = defineCommand123({
37409
+ var keyEventCommand = defineCommand124({
37267
37410
  meta: {
37268
37411
  name: "key-event",
37269
37412
  description: `Stage key-event (conversion) changes
@@ -37276,7 +37419,7 @@ Examples:
37276
37419
  baker ga4 key-event delete 4185`
37277
37420
  },
37278
37421
  subCommands: {
37279
- create: defineCommand123({
37422
+ create: defineCommand124({
37280
37423
  meta: {
37281
37424
  name: "create",
37282
37425
  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 +37440,7 @@ Examples:
37297
37440
  );
37298
37441
  }
37299
37442
  }),
37300
- update: defineCommand123({
37443
+ update: defineCommand124({
37301
37444
  meta: {
37302
37445
  name: "update",
37303
37446
  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 +37460,7 @@ Examples:
37317
37460
  });
37318
37461
  }
37319
37462
  }),
37320
- delete: defineCommand123({
37463
+ delete: defineCommand124({
37321
37464
  meta: {
37322
37465
  name: "delete",
37323
37466
  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 +37508,7 @@ for (const { kind, noun, createHint } of DEFINITIONS) {
37365
37508
  }
37366
37509
  function definitionCommand(definition) {
37367
37510
  const { command, kind, noun, example } = definition;
37368
- return defineCommand123({
37511
+ return defineCommand124({
37369
37512
  meta: {
37370
37513
  name: command,
37371
37514
  description: `Stage ${noun} changes
@@ -37377,7 +37520,7 @@ Examples:
37377
37520
  baker ga4 ${command} archive 12`
37378
37521
  },
37379
37522
  subCommands: {
37380
- create: defineCommand123({
37523
+ create: defineCommand124({
37381
37524
  meta: { name: "create", description: `Stage a new ${noun} (or a JSON array of them, staged together)` },
37382
37525
  args: {
37383
37526
  json: { type: "string", description: createJsonDescription(noun), required: false },
@@ -37395,7 +37538,7 @@ Examples:
37395
37538
  );
37396
37539
  }
37397
37540
  }),
37398
- update: defineCommand123({
37541
+ update: defineCommand124({
37399
37542
  meta: {
37400
37543
  name: "update",
37401
37544
  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 +37558,7 @@ Examples:
37415
37558
  });
37416
37559
  }
37417
37560
  }),
37418
- archive: defineCommand123({
37561
+ archive: defineCommand124({
37419
37562
  meta: {
37420
37563
  name: "archive",
37421
37564
  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 +37603,7 @@ var dataStreamArg = {
37460
37603
  function withStream(args) {
37461
37604
  return typeof args["data-stream"] === "string" ? { dataStream: args["data-stream"] } : {};
37462
37605
  }
37463
- var customEventCommand = defineCommand123({
37606
+ var customEventCommand = defineCommand124({
37464
37607
  meta: {
37465
37608
  name: "custom-event",
37466
37609
  description: `Stage custom events \u2014 new events built from events the site already sends
@@ -37471,7 +37614,7 @@ Examples:
37471
37614
  baker ga4 custom-event delete 7`
37472
37615
  },
37473
37616
  subCommands: {
37474
- create: defineCommand123({
37617
+ create: defineCommand124({
37475
37618
  meta: {
37476
37619
  name: "create",
37477
37620
  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 +37637,7 @@ Examples:
37494
37637
  );
37495
37638
  }
37496
37639
  }),
37497
- update: defineCommand123({
37640
+ update: defineCommand124({
37498
37641
  meta: { name: "update", description: "Stage a change to an existing custom event (pass its id)" },
37499
37642
  args: {
37500
37643
  id: { type: "positional", description: "Custom event rule id", required: false },
@@ -37513,7 +37656,7 @@ Examples:
37513
37656
  });
37514
37657
  }
37515
37658
  }),
37516
- delete: defineCommand123({
37659
+ delete: defineCommand124({
37517
37660
  meta: {
37518
37661
  name: "delete",
37519
37662
  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 +37711,7 @@ function booleanArg(input, flag) {
37568
37711
  if (input === "false") return false;
37569
37712
  return failValidation3(`--${flag} must be true or false`);
37570
37713
  }
37571
- var dataRetentionCommand = defineCommand123({
37714
+ var dataRetentionCommand = defineCommand124({
37572
37715
  meta: {
37573
37716
  name: "data-retention",
37574
37717
  description: `Stage a change to how long Google Analytics keeps data
@@ -37578,7 +37721,7 @@ Examples:
37578
37721
  baker ga4 data-retention set --event-data 14 --user-data 14 --reset-on-activity true`
37579
37722
  },
37580
37723
  subCommands: {
37581
- set: defineCommand123({
37724
+ set: defineCommand124({
37582
37725
  meta: { name: "set", description: "Stage the retention window (months)" },
37583
37726
  args: {
37584
37727
  "event-data": { type: "string", description: "2, 14, 26, 38 or 50", required: false },
@@ -37614,7 +37757,7 @@ registerSchema({
37614
37757
  "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
37615
37758
  }
37616
37759
  });
37617
- var audienceCommand = defineCommand123({
37760
+ var audienceCommand = defineCommand124({
37618
37761
  meta: {
37619
37762
  name: "audience",
37620
37763
  description: `Stage audience changes (saved groups of users, for retargeting and analysis)
@@ -37646,7 +37789,7 @@ Examples:
37646
37789
  baker ga4 audience archive 8813`
37647
37790
  },
37648
37791
  subCommands: {
37649
- create: defineCommand123({
37792
+ create: defineCommand124({
37650
37793
  meta: { name: "create", description: createJsonDescription("audience") },
37651
37794
  args: {
37652
37795
  json: { type: "string", description: createJsonDescription("audience"), required: false },
@@ -37664,7 +37807,7 @@ Examples:
37664
37807
  );
37665
37808
  }
37666
37809
  }),
37667
- update: defineCommand123({
37810
+ update: defineCommand124({
37668
37811
  meta: {
37669
37812
  name: "update",
37670
37813
  description: "Stage a new name or description (pass the audience id). Who is in it cannot be changed."
@@ -37685,7 +37828,7 @@ Examples:
37685
37828
  });
37686
37829
  }
37687
37830
  }),
37688
- archive: defineCommand123({
37831
+ archive: defineCommand124({
37689
37832
  meta: {
37690
37833
  name: "archive",
37691
37834
  description: "Stage retiring an audience. Cannot be undone \u2014 the users it gathered do not come back."
@@ -37714,7 +37857,7 @@ registerSchema({
37714
37857
  "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
37715
37858
  }
37716
37859
  });
37717
- var propertyCommand = defineCommand123({
37860
+ var propertyCommand = defineCommand124({
37718
37861
  meta: {
37719
37862
  name: "property",
37720
37863
  description: `Stage a change to the property's own settings
@@ -37724,7 +37867,7 @@ Examples:
37724
37867
  baker ga4 property set --name "Acme \u2014 Web" --industry REAL_ESTATE`
37725
37868
  },
37726
37869
  subCommands: {
37727
- set: defineCommand123({
37870
+ set: defineCommand124({
37728
37871
  meta: { name: "set", description: "Stage the property name and/or industry category" },
37729
37872
  args: {
37730
37873
  name: { type: "string", description: "New property display name", required: false },
@@ -37764,7 +37907,7 @@ registerSchema({
37764
37907
  "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
37765
37908
  }
37766
37909
  });
37767
- var adsLinkCommand = defineCommand123({
37910
+ var adsLinkCommand = defineCommand124({
37768
37911
  meta: {
37769
37912
  name: "ads-link",
37770
37913
  description: `Stage linking this property to a Google Ads account
@@ -37779,7 +37922,7 @@ Examples:
37779
37922
  baker ga4 ads-link delete L1234`
37780
37923
  },
37781
37924
  subCommands: {
37782
- create: defineCommand123({
37925
+ create: defineCommand124({
37783
37926
  meta: { name: "create", description: "Stage linking the property to a Google Ads account" },
37784
37927
  args: {
37785
37928
  "customer-id": { type: "string", description: "Google Ads customer id (123-456-7890)", required: false },
@@ -37798,7 +37941,7 @@ Examples:
37798
37941
  await stageOp3({ kind: "ga4.googleAdsLink.create", payload, ...withProperty(args) });
37799
37942
  }
37800
37943
  }),
37801
- update: defineCommand123({
37944
+ update: defineCommand124({
37802
37945
  meta: {
37803
37946
  name: "update",
37804
37947
  description: "Stage the ads-personalisation setting on an existing link (pass its id)"
@@ -37820,7 +37963,7 @@ Examples:
37820
37963
  });
37821
37964
  }
37822
37965
  }),
37823
- delete: defineCommand123({
37966
+ delete: defineCommand124({
37824
37967
  meta: {
37825
37968
  name: "delete",
37826
37969
  description: "Stage unlinking. Stops conversion imports and strands every audience on this property."
@@ -37871,7 +38014,7 @@ var MEASUREMENT_FLAGS = {
37871
38014
  "page-changes": "pageChangesEnabled",
37872
38015
  "form-interactions": "formInteractionsEnabled"
37873
38016
  };
37874
- var enhancedMeasurementCommand = defineCommand123({
38017
+ var enhancedMeasurementCommand = defineCommand124({
37875
38018
  meta: {
37876
38019
  name: "enhanced-measurement",
37877
38020
  description: `Stage the automatic events GA4 collects on a website stream
@@ -37885,7 +38028,7 @@ Examples:
37885
38028
  baker ga4 enhanced-measurement set --video false`
37886
38029
  },
37887
38030
  subCommands: {
37888
- set: defineCommand123({
38031
+ set: defineCommand124({
37889
38032
  meta: { name: "set", description: "Stage which automatic events the website stream collects" },
37890
38033
  args: {
37891
38034
  scrolls: { type: "string", description: "true|false", required: false },
@@ -37928,7 +38071,7 @@ Examples:
37928
38071
  });
37929
38072
 
37930
38073
  // src/commands/ga4/index.ts
37931
- var ga4Command = defineCommand124({
38074
+ var ga4Command = defineCommand125({
37932
38075
  meta: {
37933
38076
  name: "ga4",
37934
38077
  description: `Google Analytics 4. Report on a property, audit its config, and change what it measures.
@@ -37977,12 +38120,12 @@ Full guide: __tooling__/docs/tools/baker/ga4.md`
37977
38120
  });
37978
38121
 
37979
38122
  // src/commands/gsc/index.ts
37980
- import { defineCommand as defineCommand128 } from "citty";
38123
+ import { defineCommand as defineCommand129 } from "citty";
37981
38124
 
37982
38125
  // src/commands/gsc/query.ts
37983
38126
  import { appendFileSync as appendFileSync3, existsSync as existsSync8, readFileSync as readFileSync14, writeFileSync as writeFileSync5 } from "fs";
37984
38127
  import { resolve as resolve3 } from "path";
37985
- import { defineCommand as defineCommand125 } from "citty";
38128
+ import { defineCommand as defineCommand126 } from "citty";
37986
38129
 
37987
38130
  // src/commands/gsc/presets.ts
37988
38131
  var GSC_PRESETS = [
@@ -38176,7 +38319,7 @@ function handleError4(err) {
38176
38319
  });
38177
38320
  process.exit(1);
38178
38321
  }
38179
- var queryCommand3 = defineCommand125({
38322
+ var queryCommand3 = defineCommand126({
38180
38323
  meta: {
38181
38324
  name: "query",
38182
38325
  description: `Run GSC Search Analytics queries. Preset-first with free-form escape hatch.
@@ -38254,7 +38397,7 @@ Free-form (escape hatch):
38254
38397
  });
38255
38398
 
38256
38399
  // src/commands/gsc/sitemaps.ts
38257
- import { defineCommand as defineCommand126 } from "citty";
38400
+ import { defineCommand as defineCommand127 } from "citty";
38258
38401
  registerSchema({
38259
38402
  command: "gsc.sitemaps",
38260
38403
  description: "List sitemaps for a Search Console site. Check sitemap health and errors.",
@@ -38263,7 +38406,7 @@ registerSchema({
38263
38406
  "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false }
38264
38407
  }
38265
38408
  });
38266
- var sitemapsCommand = defineCommand126({
38409
+ var sitemapsCommand = defineCommand127({
38267
38410
  meta: {
38268
38411
  name: "sitemaps",
38269
38412
  description: `List sitemaps for a site. Check health and errors.
@@ -38316,7 +38459,7 @@ Examples:
38316
38459
  });
38317
38460
 
38318
38461
  // src/commands/gsc/sites.ts
38319
- import { defineCommand as defineCommand127 } from "citty";
38462
+ import { defineCommand as defineCommand128 } from "citty";
38320
38463
  registerSchema({
38321
38464
  command: "gsc.sites",
38322
38465
  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 +38475,7 @@ function siteHints(sites) {
38332
38475
  resources: sites.map((site) => ({ id: site.siteUrl, label: site.permissionLevel }))
38333
38476
  });
38334
38477
  }
38335
- var sitesCommand = defineCommand127({
38478
+ var sitesCommand = defineCommand128({
38336
38479
  meta: {
38337
38480
  name: "sites",
38338
38481
  description: `List verified Search Console sites.
@@ -38380,7 +38523,7 @@ Examples:
38380
38523
  });
38381
38524
 
38382
38525
  // src/commands/gsc/index.ts
38383
- var gscCommand = defineCommand128({
38526
+ var gscCommand = defineCommand129({
38384
38527
  meta: {
38385
38528
  name: "gsc",
38386
38529
  description: `Google Search Console commands. PPC-SEO arbitrage, brand halo analysis, negative keyword discovery.
@@ -38404,7 +38547,7 @@ Full guide: __tooling__/docs/tools/baker/gsc.md`
38404
38547
  });
38405
38548
 
38406
38549
  // src/commands/history/index.ts
38407
- import { defineCommand as defineCommand129 } from "citty";
38550
+ import { defineCommand as defineCommand130 } from "citty";
38408
38551
  registerSchema({
38409
38552
  command: "history.list",
38410
38553
  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 +38602,7 @@ function parseBoundedInt2(raw, name, min, max) {
38459
38602
  }
38460
38603
  return value;
38461
38604
  }
38462
- var listCommand13 = defineCommand129({
38605
+ var listCommand13 = defineCommand130({
38463
38606
  meta: {
38464
38607
  name: "list",
38465
38608
  description: "List recent account changes (unified audit log), newest first."
@@ -38505,7 +38648,7 @@ var listCommand13 = defineCommand129({
38505
38648
  }
38506
38649
  }
38507
38650
  });
38508
- var historyCommand = defineCommand129({
38651
+ var historyCommand = defineCommand130({
38509
38652
  meta: {
38510
38653
  name: "history",
38511
38654
  description: `Unified account history (audit log): what changed, who did it, and when.
@@ -38515,7 +38658,7 @@ Full guide: __tooling__/docs/tools/baker/history.md`
38515
38658
  });
38516
38659
 
38517
38660
  // src/commands/hubspot/index.ts
38518
- import { defineCommand as defineCommand130 } from "citty";
38661
+ import { defineCommand as defineCommand131 } from "citty";
38519
38662
  var EMBED_TYPES = ["legacy", "v4", "unknown"];
38520
38663
  function failNotConnected(err) {
38521
38664
  if (err instanceof ApiError && err.code === "FORBIDDEN" && err.message.includes(HUBSPOT_MISSING_GRANT_MARKER)) {
@@ -38669,7 +38812,7 @@ registerSchema({
38669
38812
  }
38670
38813
  }
38671
38814
  });
38672
- var formsListCommand = defineCommand130({
38815
+ var formsListCommand = defineCommand131({
38673
38816
  meta: {
38674
38817
  name: "list",
38675
38818
  description: "List HubSpot forms with embed type and post-submit action. Example: baker hubspot forms list --redirecting-only"
@@ -38714,7 +38857,7 @@ var formsListCommand = defineCommand130({
38714
38857
  }
38715
38858
  }
38716
38859
  });
38717
- var formsViewCommand = defineCommand130({
38860
+ var formsViewCommand = defineCommand131({
38718
38861
  meta: {
38719
38862
  name: "view",
38720
38863
  description: "Show one HubSpot form's fields and configuration. Example: baker hubspot forms view 1a2b3c"
@@ -38766,7 +38909,7 @@ var formsViewCommand = defineCommand130({
38766
38909
  }
38767
38910
  }
38768
38911
  });
38769
- var meetingsListCommand = defineCommand130({
38912
+ var meetingsListCommand = defineCommand131({
38770
38913
  meta: {
38771
38914
  name: "list",
38772
38915
  description: "List HubSpot meeting links (calendars). Example: baker hubspot meetings list"
@@ -38808,7 +38951,7 @@ var meetingsListCommand = defineCommand130({
38808
38951
  }
38809
38952
  }
38810
38953
  });
38811
- var meetingsViewCommand = defineCommand130({
38954
+ var meetingsViewCommand = defineCommand131({
38812
38955
  meta: {
38813
38956
  name: "view",
38814
38957
  description: "Show one HubSpot meeting link's booking fields. Example: baker hubspot meetings view discovery-call"
@@ -38852,7 +38995,7 @@ var meetingsViewCommand = defineCommand130({
38852
38995
  }
38853
38996
  }
38854
38997
  });
38855
- var formsSubmissionsCommand = defineCommand130({
38998
+ var formsSubmissionsCommand = defineCommand131({
38856
38999
  meta: {
38857
39000
  name: "submissions",
38858
39001
  description: "How many leads a form received, and when. Example: baker hubspot forms submissions <formId> --days 30"
@@ -38901,7 +39044,7 @@ var formsSubmissionsCommand = defineCommand130({
38901
39044
  }
38902
39045
  }
38903
39046
  });
38904
- var workflowsListCommand = defineCommand130({
39047
+ var workflowsListCommand = defineCommand131({
38905
39048
  meta: {
38906
39049
  name: "list",
38907
39050
  description: "List HubSpot workflows. Example: baker hubspot workflows list --enabled-only"
@@ -38966,7 +39109,7 @@ function workflowViewHints(workflow) {
38966
39109
  }
38967
39110
  return hints;
38968
39111
  }
38969
- var workflowsViewCommand = defineCommand130({
39112
+ var workflowsViewCommand = defineCommand131({
38970
39113
  meta: {
38971
39114
  name: "view",
38972
39115
  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 +39136,7 @@ var workflowsViewCommand = defineCommand130({
38993
39136
  }
38994
39137
  }
38995
39138
  });
38996
- var pipelinesListCommand = defineCommand130({
39139
+ var pipelinesListCommand = defineCommand131({
38997
39140
  meta: {
38998
39141
  name: "list",
38999
39142
  description: "List HubSpot deal pipelines and their stages. Example: baker hubspot pipelines list"
@@ -39010,7 +39153,7 @@ var pipelinesListCommand = defineCommand130({
39010
39153
  }
39011
39154
  }
39012
39155
  });
39013
- var contactsSummaryCommand = defineCommand130({
39156
+ var contactsSummaryCommand = defineCommand131({
39014
39157
  meta: {
39015
39158
  name: "summary",
39016
39159
  description: "Whether recent leads are being worked, as counts. Example: baker hubspot contacts summary --days 30"
@@ -39080,7 +39223,7 @@ function contactLookupHints(data) {
39080
39223
  }
39081
39224
  return hints;
39082
39225
  }
39083
- var contactsLookupCommand = defineCommand130({
39226
+ var contactsLookupCommand = defineCommand131({
39084
39227
  meta: {
39085
39228
  name: "lookup",
39086
39229
  description: "Find one contact by email and see whether it was worked. Example: baker hubspot contacts lookup a@b.com"
@@ -39104,27 +39247,27 @@ var contactsLookupCommand = defineCommand130({
39104
39247
  }
39105
39248
  }
39106
39249
  });
39107
- var contactsCommand = defineCommand130({
39250
+ var contactsCommand = defineCommand131({
39108
39251
  meta: { name: "contacts", description: "Contacts on the connected HubSpot account." },
39109
39252
  subCommands: { summary: contactsSummaryCommand, lookup: contactsLookupCommand }
39110
39253
  });
39111
- var formsCommand = defineCommand130({
39254
+ var formsCommand = defineCommand131({
39112
39255
  meta: { name: "forms", description: "HubSpot forms on the connected account." },
39113
39256
  subCommands: { list: formsListCommand, view: formsViewCommand, submissions: formsSubmissionsCommand }
39114
39257
  });
39115
- var workflowsCommand = defineCommand130({
39258
+ var workflowsCommand = defineCommand131({
39116
39259
  meta: { name: "workflows", description: "HubSpot workflows on the connected account." },
39117
39260
  subCommands: { list: workflowsListCommand, view: workflowsViewCommand }
39118
39261
  });
39119
- var pipelinesCommand = defineCommand130({
39262
+ var pipelinesCommand = defineCommand131({
39120
39263
  meta: { name: "pipelines", description: "HubSpot deal pipelines on the connected account." },
39121
39264
  subCommands: { list: pipelinesListCommand }
39122
39265
  });
39123
- var meetingsCommand = defineCommand130({
39266
+ var meetingsCommand = defineCommand131({
39124
39267
  meta: { name: "meetings", description: "HubSpot meeting links (calendars) on the connected account." },
39125
39268
  subCommands: { list: meetingsListCommand, view: meetingsViewCommand }
39126
39269
  });
39127
- var hubspotCommand = defineCommand130({
39270
+ var hubspotCommand = defineCommand131({
39128
39271
  meta: {
39129
39272
  name: "hubspot",
39130
39273
  description: `Read the connected HubSpot account \u2014 forms, the leads they received, workflows, deal pipelines and
@@ -39162,10 +39305,10 @@ Full guide: __tooling__/docs/tools/baker/hubspot.md`
39162
39305
  });
39163
39306
 
39164
39307
  // src/commands/images/index.ts
39165
- import { defineCommand as defineCommand156 } from "citty";
39308
+ import { defineCommand as defineCommand157 } from "citty";
39166
39309
 
39167
39310
  // src/commands/images/crop.ts
39168
- import { defineCommand as defineCommand131 } from "citty";
39311
+ import { defineCommand as defineCommand132 } from "citty";
39169
39312
 
39170
39313
  // src/lib/image/crop-sprite.ts
39171
39314
  import sharp from "sharp";
@@ -39287,7 +39430,7 @@ function emitError2(err) {
39287
39430
  }
39288
39431
  process.exit(1);
39289
39432
  }
39290
- var cropCommand = defineCommand131({
39433
+ var cropCommand = defineCommand132({
39291
39434
  meta: {
39292
39435
  name: "crop",
39293
39436
  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 +39466,7 @@ var cropCommand = defineCommand131({
39323
39466
  });
39324
39467
 
39325
39468
  // src/commands/images/delete.ts
39326
- import { defineCommand as defineCommand132 } from "citty";
39469
+ import { defineCommand as defineCommand133 } from "citty";
39327
39470
  registerSchema({
39328
39471
  command: "images.delete",
39329
39472
  description: "Delete an image by ID",
@@ -39337,7 +39480,7 @@ registerSchema({
39337
39480
  }
39338
39481
  }
39339
39482
  });
39340
- var deleteCommand2 = defineCommand132({
39483
+ var deleteCommand2 = defineCommand133({
39341
39484
  meta: {
39342
39485
  name: "delete",
39343
39486
  description: "Delete an image by ID. Use --dry-run to preview. Example: baker images delete j571abc123 --dry-run"
@@ -39378,7 +39521,7 @@ var deleteCommand2 = defineCommand132({
39378
39521
  });
39379
39522
 
39380
39523
  // src/commands/images/dimensions.ts
39381
- import { defineCommand as defineCommand133 } from "citty";
39524
+ import { defineCommand as defineCommand134 } from "citty";
39382
39525
 
39383
39526
  // src/lib/image/dimensions.ts
39384
39527
  import { imageSize } from "image-size";
@@ -39407,7 +39550,7 @@ registerSchema({
39407
39550
  }
39408
39551
  }
39409
39552
  });
39410
- var dimensionsCommand = defineCommand133({
39553
+ var dimensionsCommand = defineCommand134({
39411
39554
  meta: {
39412
39555
  name: "dimensions",
39413
39556
  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 +39606,7 @@ var dimensionsCommand = defineCommand133({
39463
39606
  });
39464
39607
 
39465
39608
  // src/commands/images/download.ts
39466
- import { defineCommand as defineCommand134 } from "citty";
39609
+ import { defineCommand as defineCommand135 } from "citty";
39467
39610
 
39468
39611
  // src/commands/images/downloadPaths.ts
39469
39612
  import { basename as basename2, extname as extname3, join as join6 } from "path";
@@ -39688,7 +39831,7 @@ function emitError3(err) {
39688
39831
  writeJson({ ok: false, error: { code: "INTERNAL_ERROR", message: "Unexpected error" } });
39689
39832
  process.exit(1);
39690
39833
  }
39691
- var downloadCommand = defineCommand134({
39834
+ var downloadCommand = defineCommand135({
39692
39835
  meta: {
39693
39836
  name: "download",
39694
39837
  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 +39864,7 @@ var downloadCommand = defineCommand134({
39721
39864
  });
39722
39865
 
39723
39866
  // src/commands/images/extract.ts
39724
- import { defineCommand as defineCommand135 } from "citty";
39867
+ import { defineCommand as defineCommand136 } from "citty";
39725
39868
 
39726
39869
  // src/commands/images/autoIngest.ts
39727
39870
  var AUTO_INGEST_MAX = {
@@ -39768,7 +39911,7 @@ registerSchema({
39768
39911
  }
39769
39912
  }
39770
39913
  });
39771
- var extractCommand = defineCommand135({
39914
+ var extractCommand = defineCommand136({
39772
39915
  meta: {
39773
39916
  name: "extract",
39774
39917
  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 +39966,7 @@ var extractCommand = defineCommand135({
39823
39966
  });
39824
39967
 
39825
39968
  // src/commands/images/find.ts
39826
- import { defineCommand as defineCommand136 } from "citty";
39969
+ import { defineCommand as defineCommand137 } from "citty";
39827
39970
 
39828
39971
  // src/commands/images/providerHits.ts
39829
39972
  function asRecord3(value) {
@@ -39961,7 +40104,7 @@ registerSchema({
39961
40104
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
39962
40105
  }
39963
40106
  });
39964
- var findCommand = defineCommand136({
40107
+ var findCommand = defineCommand137({
39965
40108
  meta: {
39966
40109
  name: "find",
39967
40110
  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 +40177,7 @@ var findCommand = defineCommand136({
40034
40177
  });
40035
40178
 
40036
40179
  // src/commands/images/get.ts
40037
- import { defineCommand as defineCommand137 } from "citty";
40180
+ import { defineCommand as defineCommand138 } from "citty";
40038
40181
  registerSchema({
40039
40182
  command: "images.get",
40040
40183
  description: "Get a single image by ID",
@@ -40042,7 +40185,7 @@ registerSchema({
40042
40185
  id: { type: "string", description: "Image ID", required: true }
40043
40186
  }
40044
40187
  });
40045
- var getCommand3 = defineCommand137({
40188
+ var getCommand3 = defineCommand138({
40046
40189
  meta: { name: "get", description: "Get a single image by ID. Example: baker images get j571abc123" },
40047
40190
  args: {
40048
40191
  id: { type: "positional", description: "Image ID", required: false },
@@ -40078,7 +40221,7 @@ var getCommand3 = defineCommand137({
40078
40221
  });
40079
40222
 
40080
40223
  // src/commands/images/gif.ts
40081
- import { defineCommand as defineCommand138 } from "citty";
40224
+ import { defineCommand as defineCommand139 } from "citty";
40082
40225
  registerSchema({
40083
40226
  command: "images.gif",
40084
40227
  description: "Search Giphy for GIFs / reaction memes (paid social creative).",
@@ -40110,7 +40253,7 @@ registerSchema({
40110
40253
  }
40111
40254
  }
40112
40255
  });
40113
- var gifCommand = defineCommand138({
40256
+ var gifCommand = defineCommand139({
40114
40257
  meta: {
40115
40258
  name: "gif",
40116
40259
  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 +40300,7 @@ var gifCommand = defineCommand138({
40157
40300
  });
40158
40301
 
40159
40302
  // src/commands/images/google.ts
40160
- import { defineCommand as defineCommand139 } from "citty";
40303
+ import { defineCommand as defineCommand140 } from "citty";
40161
40304
  var GOOGLE_ERROR_FIX = {
40162
40305
  action: "use_different_resource",
40163
40306
  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 +40340,7 @@ registerSchema({
40197
40340
  }
40198
40341
  }
40199
40342
  });
40200
- var googleCommand2 = defineCommand139({
40343
+ var googleCommand2 = defineCommand140({
40201
40344
  meta: {
40202
40345
  name: "google",
40203
40346
  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 +40413,7 @@ var googleCommand2 = defineCommand139({
40270
40413
  });
40271
40414
 
40272
40415
  // src/commands/images/group.ts
40273
- import { defineCommand as defineCommand140 } from "citty";
40416
+ import { defineCommand as defineCommand141 } from "citty";
40274
40417
 
40275
40418
  // src/commands/mediaGroup.ts
40276
40419
  async function runMediaGroupLookup(input) {
@@ -40323,7 +40466,7 @@ registerSchema({
40323
40466
  "group-key": { type: "string", description: "The set key directly, when you already have it", required: false }
40324
40467
  }
40325
40468
  });
40326
- var groupCommand = defineCommand140({
40469
+ var groupCommand = defineCommand141({
40327
40470
  meta: {
40328
40471
  name: "group",
40329
40472
  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 +40486,7 @@ var groupCommand = defineCommand140({
40343
40486
  });
40344
40487
 
40345
40488
  // src/commands/images/icon.ts
40346
- import { defineCommand as defineCommand141 } from "citty";
40489
+ import { defineCommand as defineCommand142 } from "citty";
40347
40490
 
40348
40491
  // src/commands/images/brandVerification.ts
40349
40492
  function brandToken(domain) {
@@ -40440,7 +40583,7 @@ registerSchema({
40440
40583
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
40441
40584
  }
40442
40585
  });
40443
- var iconCommand = defineCommand141({
40586
+ var iconCommand = defineCommand142({
40444
40587
  meta: {
40445
40588
  name: "icon",
40446
40589
  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 +40653,7 @@ var iconCommand = defineCommand141({
40510
40653
  });
40511
40654
 
40512
40655
  // src/commands/images/ingest.ts
40513
- import { defineCommand as defineCommand142 } from "citty";
40656
+ import { defineCommand as defineCommand143 } from "citty";
40514
40657
  var SOURCE_VALUES = imageSourceSchema.options.join(" | ");
40515
40658
  registerSchema({
40516
40659
  command: "images.ingest",
@@ -40525,7 +40668,7 @@ registerSchema({
40525
40668
  fields: { type: "string", description: "Comma-separated field names to include", required: false }
40526
40669
  }
40527
40670
  });
40528
- var ingestCommand = defineCommand142({
40671
+ var ingestCommand = defineCommand143({
40529
40672
  meta: {
40530
40673
  name: "ingest",
40531
40674
  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 +40737,7 @@ var ingestCommand = defineCommand142({
40594
40737
  });
40595
40738
 
40596
40739
  // src/commands/images/layerize.ts
40597
- import { defineCommand as defineCommand143 } from "citty";
40740
+ import { defineCommand as defineCommand144 } from "citty";
40598
40741
  registerSchema({
40599
40742
  command: "images.layerize",
40600
40743
  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 +40801,7 @@ async function pollUntilSettled(imageId, maxWait) {
40658
40801
  }
40659
40802
  return null;
40660
40803
  }
40661
- var layerizeCommand = defineCommand143({
40804
+ var layerizeCommand = defineCommand144({
40662
40805
  meta: {
40663
40806
  name: "layerize",
40664
40807
  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 +40870,7 @@ registerSchema({
40727
40870
  full: { type: "boolean", description: "Include geometry and typography for every layer", required: false }
40728
40871
  }
40729
40872
  });
40730
- var layersCommand = defineCommand143({
40873
+ var layersCommand = defineCommand144({
40731
40874
  meta: {
40732
40875
  name: "layers",
40733
40876
  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 +40910,7 @@ var layersCommand = defineCommand143({
40767
40910
  });
40768
40911
 
40769
40912
  // src/commands/images/library.ts
40770
- import { defineCommand as defineCommand144 } from "citty";
40913
+ import { defineCommand as defineCommand145 } from "citty";
40771
40914
  registerSchema({
40772
40915
  command: "images.library",
40773
40916
  description: "Search the company image library. Returns only ready images.",
@@ -40793,7 +40936,7 @@ registerSchema({
40793
40936
  }
40794
40937
  }
40795
40938
  });
40796
- var libraryCommand = defineCommand144({
40939
+ var libraryCommand = defineCommand145({
40797
40940
  meta: {
40798
40941
  name: "library",
40799
40942
  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 +40999,7 @@ var libraryCommand = defineCommand144({
40856
40999
  });
40857
41000
 
40858
41001
  // src/commands/images/logo.ts
40859
- import { defineCommand as defineCommand145 } from "citty";
41002
+ import { defineCommand as defineCommand146 } from "citty";
40860
41003
  registerSchema({
40861
41004
  command: "images.logo",
40862
41005
  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 +41027,7 @@ registerSchema({
40884
41027
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
40885
41028
  }
40886
41029
  });
40887
- var logoCommand = defineCommand145({
41030
+ var logoCommand = defineCommand146({
40888
41031
  meta: {
40889
41032
  name: "logo",
40890
41033
  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 +41100,7 @@ var logoCommand = defineCommand145({
40957
41100
  });
40958
41101
 
40959
41102
  // src/commands/images/normalize.ts
40960
- import { defineCommand as defineCommand146 } from "citty";
41103
+ import { defineCommand as defineCommand147 } from "citty";
40961
41104
 
40962
41105
  // src/lib/image/color-changer.ts
40963
41106
  import quantize from "quantize";
@@ -41689,7 +41832,7 @@ function coerceRawArgs(args) {
41689
41832
  "dry-run": bool(args["dry-run"])
41690
41833
  };
41691
41834
  }
41692
- var normalizeCommand2 = defineCommand146({
41835
+ var normalizeCommand2 = defineCommand147({
41693
41836
  meta: {
41694
41837
  name: "normalize",
41695
41838
  description: `Normalize logos / images: declarative recolor + bg removal + trim + resize. Operates on local files; writes in-place by default.
@@ -41744,7 +41887,7 @@ Examples:
41744
41887
  });
41745
41888
 
41746
41889
  // src/commands/images/pinterest.ts
41747
- import { defineCommand as defineCommand147 } from "citty";
41890
+ import { defineCommand as defineCommand148 } from "citty";
41748
41891
  registerSchema({
41749
41892
  command: "images.pinterest",
41750
41893
  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 +41907,7 @@ registerSchema({
41764
41907
  }
41765
41908
  }
41766
41909
  });
41767
- var pinterestCommand = defineCommand147({
41910
+ var pinterestCommand = defineCommand148({
41768
41911
  meta: {
41769
41912
  name: "pinterest",
41770
41913
  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 +41964,7 @@ var pinterestCommand = defineCommand147({
41821
41964
  });
41822
41965
 
41823
41966
  // src/commands/images/screenshot.ts
41824
- import { defineCommand as defineCommand148 } from "citty";
41967
+ import { defineCommand as defineCommand149 } from "citty";
41825
41968
  registerSchema({
41826
41969
  command: "images.screenshot",
41827
41970
  description: "Capture a website screenshot via ScreenshotOne. Auto-ingests on success.",
@@ -41840,7 +41983,7 @@ registerSchema({
41840
41983
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
41841
41984
  }
41842
41985
  });
41843
- var screenshotCommand = defineCommand148({
41986
+ var screenshotCommand = defineCommand149({
41844
41987
  meta: {
41845
41988
  name: "screenshot",
41846
41989
  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 +42047,7 @@ var screenshotCommand = defineCommand148({
41904
42047
  });
41905
42048
 
41906
42049
  // src/commands/images/search.ts
41907
- import { defineCommand as defineCommand149 } from "citty";
42050
+ import { defineCommand as defineCommand150 } from "citty";
41908
42051
  registerSchema({
41909
42052
  command: "images.search",
41910
42053
  description: "Search images by text query. Only returns ready images.",
@@ -41920,7 +42063,7 @@ registerSchema({
41920
42063
  tags: { type: "string", description: "Comma-separated tags to filter by", required: false }
41921
42064
  }
41922
42065
  });
41923
- var searchCommand = defineCommand149({
42066
+ var searchCommand = defineCommand150({
41924
42067
  meta: {
41925
42068
  name: "search",
41926
42069
  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 +42123,7 @@ var searchCommand = defineCommand149({
41980
42123
  });
41981
42124
 
41982
42125
  // src/commands/images/sticker.ts
41983
- import { defineCommand as defineCommand150 } from "citty";
42126
+ import { defineCommand as defineCommand151 } from "citty";
41984
42127
  registerSchema({
41985
42128
  command: "images.sticker",
41986
42129
  description: "Search Giphy stickers \u2014 transparent-background overlays for ad creative.",
@@ -42012,7 +42155,7 @@ registerSchema({
42012
42155
  }
42013
42156
  }
42014
42157
  });
42015
- var stickerCommand = defineCommand150({
42158
+ var stickerCommand = defineCommand151({
42016
42159
  meta: {
42017
42160
  name: "sticker",
42018
42161
  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 +42202,7 @@ var stickerCommand = defineCommand150({
42059
42202
  });
42060
42203
 
42061
42204
  // src/commands/images/stock.ts
42062
- import { defineCommand as defineCommand151 } from "citty";
42205
+ import { defineCommand as defineCommand152 } from "citty";
42063
42206
  var STOCK_ERROR_FIX = {
42064
42207
  action: "use_different_resource",
42065
42208
  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 +42279,7 @@ function buildStockRequest(query, args) {
42136
42279
  if (args.context) body.descriptionContext = args.context;
42137
42280
  return body;
42138
42281
  }
42139
- var stockCommand = defineCommand151({
42282
+ var stockCommand = defineCommand152({
42140
42283
  meta: {
42141
42284
  name: "stock",
42142
42285
  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 +42352,7 @@ var stockCommand = defineCommand151({
42209
42352
  });
42210
42353
 
42211
42354
  // src/lib/tags-command.ts
42212
- import { defineCommand as defineCommand152 } from "citty";
42355
+ import { defineCommand as defineCommand153 } from "citty";
42213
42356
  function makeTagsCommand(command, label, endpoint) {
42214
42357
  registerSchema({
42215
42358
  command: `${command}.tags`,
@@ -42218,7 +42361,7 @@ function makeTagsCommand(command, label, endpoint) {
42218
42361
  output: { type: "string", description: "Output format: md|json", required: false, default: "md" }
42219
42362
  }
42220
42363
  });
42221
- return defineCommand152({
42364
+ return defineCommand153({
42222
42365
  meta: {
42223
42366
  name: "tags",
42224
42367
  description: `List the available ${label} tag names (defaults + company custom tags). Use before filtering with --tags. Example: baker ${command} tags`
@@ -42254,7 +42397,7 @@ function makeTagsCommand(command, label, endpoint) {
42254
42397
  var tagsCommand3 = makeTagsCommand("images", "image", "/api/images/tags");
42255
42398
 
42256
42399
  // src/commands/images/upload.ts
42257
- import { defineCommand as defineCommand153 } from "citty";
42400
+ import { defineCommand as defineCommand154 } from "citty";
42258
42401
  registerSchema({
42259
42402
  command: "images.upload",
42260
42403
  description: "Upload an image to the library \u2014 local file path or remote http(s) URL.",
@@ -42292,7 +42435,7 @@ registerSchema({
42292
42435
  function isRemoteUrl2(value) {
42293
42436
  return /^https?:\/\//i.test(value);
42294
42437
  }
42295
- var uploadCommand = defineCommand153({
42438
+ var uploadCommand = defineCommand154({
42296
42439
  meta: {
42297
42440
  name: "upload",
42298
42441
  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 +42528,7 @@ async function uploadLocal(target, args) {
42385
42528
  }
42386
42529
 
42387
42530
  // src/commands/images/upscale.ts
42388
- import { defineCommand as defineCommand154 } from "citty";
42531
+ import { defineCommand as defineCommand155 } from "citty";
42389
42532
  registerSchema({
42390
42533
  command: "images.upscale",
42391
42534
  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 +42543,7 @@ registerSchema({
42400
42543
  }
42401
42544
  });
42402
42545
  var POLL_INTERVAL_MS4 = 1500;
42403
- var upscaleCommand = defineCommand154({
42546
+ var upscaleCommand = defineCommand155({
42404
42547
  meta: {
42405
42548
  name: "upscale",
42406
42549
  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 +42598,7 @@ var upscaleCommand = defineCommand154({
42455
42598
  });
42456
42599
 
42457
42600
  // src/commands/images/use.ts
42458
- import { defineCommand as defineCommand155 } from "citty";
42601
+ import { defineCommand as defineCommand156 } from "citty";
42459
42602
  registerSchema({
42460
42603
  command: "images.use",
42461
42604
  description: "Ingest a URL and wait for the library record to be ready.",
@@ -42484,7 +42627,7 @@ function emitReady(ingestResult, doc, args) {
42484
42627
  args.full === true
42485
42628
  );
42486
42629
  }
42487
- var useCommand = defineCommand155({
42630
+ var useCommand = defineCommand156({
42488
42631
  meta: {
42489
42632
  name: "use",
42490
42633
  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 +42676,7 @@ var useCommand = defineCommand155({
42533
42676
  });
42534
42677
 
42535
42678
  // src/commands/images/index.ts
42536
- var imagesCommand = defineCommand156({
42679
+ var imagesCommand = defineCommand157({
42537
42680
  meta: {
42538
42681
  name: "images",
42539
42682
  description: `Find, source, and normalize images. Subcommands route by provider so cost + license are explicit.
@@ -42611,12 +42754,12 @@ Full guide: __tooling__/docs/tools/baker/images.md`
42611
42754
  });
42612
42755
 
42613
42756
  // src/commands/landing/index.ts
42614
- import { defineCommand as defineCommand167 } from "citty";
42757
+ import { defineCommand as defineCommand168 } from "citty";
42615
42758
 
42616
42759
  // src/commands/landing/critique.ts
42617
42760
  import { readdir as readdir11, stat as stat7 } from "fs/promises";
42618
42761
  import path31 from "path";
42619
- import { defineCommand as defineCommand157 } from "citty";
42762
+ import { defineCommand as defineCommand158 } from "citty";
42620
42763
 
42621
42764
  // src/engine/landing/lib/constants.ts
42622
42765
  var OVERUSED_FONTS = /* @__PURE__ */ new Set([
@@ -43685,7 +43828,7 @@ function fail5(code, message, fix) {
43685
43828
  );
43686
43829
  process.exit(2);
43687
43830
  }
43688
- var critiqueCommand2 = defineCommand157({
43831
+ var critiqueCommand2 = defineCommand158({
43689
43832
  meta: {
43690
43833
  name: "critique",
43691
43834
  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 +43937,10 @@ async function isDir(p) {
43794
43937
  }
43795
43938
 
43796
43939
  // src/commands/landing/inspiration/index.ts
43797
- import { defineCommand as defineCommand166 } from "citty";
43940
+ import { defineCommand as defineCommand167 } from "citty";
43798
43941
 
43799
43942
  // src/commands/landing/inspiration/add.ts
43800
- import { defineCommand as defineCommand158 } from "citty";
43943
+ import { defineCommand as defineCommand159 } from "citty";
43801
43944
 
43802
43945
  // src/commands/landing/inspiration/shared.ts
43803
43946
  var INSPIRATION_HINTS = {
@@ -43879,7 +44022,7 @@ registerSchema({
43879
44022
  note: { type: "string", description: "Why this page is worth keeping", required: false }
43880
44023
  }
43881
44024
  });
43882
- var addCommand = defineCommand158({
44025
+ var addCommand = defineCommand159({
43883
44026
  meta: {
43884
44027
  name: "add",
43885
44028
  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 +44064,7 @@ var addCommand = defineCommand158({
43921
44064
  // src/commands/landing/inspiration/code.ts
43922
44065
  import { mkdir as mkdir10, writeFile as writeFile14 } from "fs/promises";
43923
44066
  import path32 from "path";
43924
- import { defineCommand as defineCommand159 } from "citty";
44067
+ import { defineCommand as defineCommand160 } from "citty";
43925
44068
  registerSchema({
43926
44069
  command: "landing.inspiration.code",
43927
44070
  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 +44073,7 @@ registerSchema({
43930
44073
  full: { type: "boolean", description: "Print the markup inline as well as writing it", required: false }
43931
44074
  }
43932
44075
  });
43933
- var codeCommand = defineCommand159({
44076
+ var codeCommand = defineCommand160({
43934
44077
  meta: {
43935
44078
  name: "code",
43936
44079
  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 +44119,7 @@ var codeCommand = defineCommand159({
43976
44119
  });
43977
44120
 
43978
44121
  // src/commands/landing/inspiration/favorites.ts
43979
- import { defineCommand as defineCommand160 } from "citty";
44122
+ import { defineCommand as defineCommand161 } from "citty";
43980
44123
  registerSchema({
43981
44124
  command: "landing.inspiration.favorites",
43982
44125
  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 +44133,7 @@ registerSchema({
43990
44133
  }
43991
44134
  }
43992
44135
  });
43993
- var favoritesCommand = defineCommand160({
44136
+ var favoritesCommand = defineCommand161({
43994
44137
  meta: {
43995
44138
  name: "favorites",
43996
44139
  description: "List this company's saved reference sections. Example: baker landing inspiration favorites --type hero,pricing"
@@ -44070,7 +44213,7 @@ registerSchema({
44070
44213
  note: { type: "string", description: "Why this is worth keeping", required: false }
44071
44214
  }
44072
44215
  });
44073
- var favoriteCommand = defineCommand160({
44216
+ var favoriteCommand = defineCommand161({
44074
44217
  meta: {
44075
44218
  name: "favorite",
44076
44219
  description: "Save a reference section to this company. Example: baker landing inspiration favorite k57abc\u2026"
@@ -44108,7 +44251,7 @@ registerSchema({
44108
44251
  page: { type: "boolean", description: "Treat the id as a page rather than a section", required: false }
44109
44252
  }
44110
44253
  });
44111
- var unfavoriteCommand = defineCommand160({
44254
+ var unfavoriteCommand = defineCommand161({
44112
44255
  meta: {
44113
44256
  name: "unfavorite",
44114
44257
  description: "Remove a reference section from this company's saved set. Example: baker landing inspiration unfavorite k57abc\u2026"
@@ -44130,7 +44273,7 @@ var unfavoriteCommand = defineCommand160({
44130
44273
  });
44131
44274
 
44132
44275
  // src/commands/landing/inspiration/page.ts
44133
- import { defineCommand as defineCommand161 } from "citty";
44276
+ import { defineCommand as defineCommand162 } from "citty";
44134
44277
  registerSchema({
44135
44278
  command: "landing.inspiration.page",
44136
44279
  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 +44290,7 @@ registerSchema({
44147
44290
  }
44148
44291
  }
44149
44292
  });
44150
- var pageCommand2 = defineCommand161({
44293
+ var pageCommand2 = defineCommand162({
44151
44294
  meta: {
44152
44295
  name: "page",
44153
44296
  description: "Show how a reference page sequences its sections. Example: baker landing inspiration page j91xyz\u2026 \u2014 the blueprint, not the pixels."
@@ -44210,7 +44353,7 @@ var pageCommand2 = defineCommand161({
44210
44353
  });
44211
44354
 
44212
44355
  // src/commands/landing/inspiration/scrape.ts
44213
- import { defineCommand as defineCommand162 } from "citty";
44356
+ import { defineCommand as defineCommand163 } from "citty";
44214
44357
 
44215
44358
  // src/engine/landing-library/proxyFailure.ts
44216
44359
  var PROXY_STATUS = 407;
@@ -46350,7 +46493,7 @@ registerSchema({
46350
46493
  report: { type: "boolean", description: "Write report.html. `--no-report` to skip", required: false }
46351
46494
  }
46352
46495
  });
46353
- var scrapeCommand = defineCommand162({
46496
+ var scrapeCommand = defineCommand163({
46354
46497
  meta: {
46355
46498
  name: "scrape",
46356
46499
  description: "Capture a landing page to a directory, now. Example: baker landing inspiration scrape https://linear.app --out .baker/inspiration/linear.app"
@@ -46459,7 +46602,7 @@ var scrapeCommand = defineCommand162({
46459
46602
 
46460
46603
  // src/commands/landing/inspiration/search.ts
46461
46604
  import path37 from "path";
46462
- import { defineCommand as defineCommand163 } from "citty";
46605
+ import { defineCommand as defineCommand164 } from "citty";
46463
46606
 
46464
46607
  // src/commands/landing/inspiration/shot.ts
46465
46608
  import { mkdir as mkdir12, writeFile as writeFile17 } from "fs/promises";
@@ -46596,7 +46739,7 @@ async function downloadShots(results) {
46596
46739
  );
46597
46740
  return saved;
46598
46741
  }
46599
- var searchCommand2 = defineCommand163({
46742
+ var searchCommand2 = defineCommand164({
46600
46743
  meta: {
46601
46744
  name: "search",
46602
46745
  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 +46837,7 @@ var searchCommand2 = defineCommand163({
46694
46837
  });
46695
46838
 
46696
46839
  // src/commands/landing/inspiration/sequences.ts
46697
- import { defineCommand as defineCommand164 } from "citty";
46840
+ import { defineCommand as defineCommand165 } from "citty";
46698
46841
  var COMPACT_TRANSITIONS = 12;
46699
46842
  var COMPACT_ENDS = 5;
46700
46843
  var MAX_PAGES = 50;
@@ -46768,7 +46911,7 @@ function sequencesHints(data, { scope, full }) {
46768
46911
  if (scope === "favorites") hints.push(...favoritesScopeHints(data.favoritesHealth, data.pagesReturned));
46769
46912
  return hints;
46770
46913
  }
46771
- var sequencesCommand = defineCommand164({
46914
+ var sequencesCommand = defineCommand165({
46772
46915
  meta: {
46773
46916
  name: "sequences",
46774
46917
  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 +46961,7 @@ var sequencesCommand = defineCommand164({
46818
46961
 
46819
46962
  // src/commands/landing/inspiration/view.ts
46820
46963
  import path38 from "path";
46821
- import { defineCommand as defineCommand165 } from "citty";
46964
+ import { defineCommand as defineCommand166 } from "citty";
46822
46965
  registerSchema({
46823
46966
  command: "landing.inspiration.view",
46824
46967
  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 +46974,7 @@ registerSchema({
46831
46974
  }
46832
46975
  }
46833
46976
  });
46834
- var viewCommand2 = defineCommand165({
46977
+ var viewCommand2 = defineCommand166({
46835
46978
  meta: {
46836
46979
  name: "view",
46837
46980
  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 +47058,7 @@ var viewCommand2 = defineCommand165({
46915
47058
  });
46916
47059
 
46917
47060
  // src/commands/landing/inspiration/index.ts
46918
- var inspirationCommand = defineCommand166({
47061
+ var inspirationCommand = defineCommand167({
46919
47062
  meta: {
46920
47063
  name: "inspiration",
46921
47064
  description: `Reference library of real landing-page sections \u2014 look at how good pages actually solve a problem before you design one.
@@ -46960,7 +47103,7 @@ Full guide: __tooling__/docs/tools/baker/landing.md`
46960
47103
  });
46961
47104
 
46962
47105
  // src/commands/landing/index.ts
46963
- var landingCommand = defineCommand167({
47106
+ var landingCommand = defineCommand168({
46964
47107
  meta: {
46965
47108
  name: "landing",
46966
47109
  description: `Design-quality tools for landing pages (src/pages/<slug>/).
@@ -46978,7 +47121,7 @@ Subcommands:
46978
47121
  });
46979
47122
 
46980
47123
  // src/commands/mcp/index.ts
46981
- import { defineCommand as defineCommand168 } from "citty";
47124
+ import { defineCommand as defineCommand169 } from "citty";
46982
47125
 
46983
47126
  // src/commands/mcp/platforms.ts
46984
47127
  function readsKey(label) {
@@ -47047,7 +47190,7 @@ registerSchema({
47047
47190
  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
47191
  args: {}
47049
47192
  });
47050
- var connectedCommand = defineCommand168({
47193
+ var connectedCommand = defineCommand169({
47051
47194
  meta: {
47052
47195
  name: "connected",
47053
47196
  description: `Everything this chat can reach \u2014 managed integrations, custom MCP servers, and connected platforms.
@@ -47106,7 +47249,7 @@ registerSchema({
47106
47249
  description: "List the custom MCP servers this company's chats see (org + company + your own user scope).",
47107
47250
  args: {}
47108
47251
  });
47109
- var listCommand14 = defineCommand168({
47252
+ var listCommand14 = defineCommand169({
47110
47253
  meta: { name: "list", description: "List custom MCP servers visible to this company's chats." },
47111
47254
  run: async () => {
47112
47255
  try {
@@ -47143,7 +47286,7 @@ registerSchema({
47143
47286
  header: { type: "string", description: 'Auth header "Key: Value" (repeatable)', required: false }
47144
47287
  }
47145
47288
  });
47146
- var addCommand2 = defineCommand168({
47289
+ var addCommand2 = defineCommand169({
47147
47290
  meta: {
47148
47291
  name: "add",
47149
47292
  description: `Register a custom MCP server. Tools appear as mcp__<name>__* on the NEXT message.
@@ -47195,7 +47338,7 @@ registerSchema({
47195
47338
  description: "Remove a company custom MCP server by name.",
47196
47339
  args: { name: { type: "string", description: "Server name to remove", required: true } }
47197
47340
  });
47198
- var removeCommand4 = defineCommand168({
47341
+ var removeCommand4 = defineCommand169({
47199
47342
  meta: {
47200
47343
  name: "remove",
47201
47344
  description: `Remove a company custom MCP server by name.
@@ -47217,7 +47360,7 @@ Example:
47217
47360
  }
47218
47361
  }
47219
47362
  });
47220
- var mcpCommand = defineCommand168({
47363
+ var mcpCommand = defineCommand169({
47221
47364
  meta: {
47222
47365
  name: "mcp",
47223
47366
  description: `Third-party tools for this company \u2014 see what's connected, register custom HTTPS MCP endpoints.
@@ -47243,10 +47386,10 @@ Full guide: __tooling__/docs/tools/baker/mcp.md`
47243
47386
  });
47244
47387
 
47245
47388
  // src/commands/research/index.ts
47246
- import { defineCommand as defineCommand180 } from "citty";
47389
+ import { defineCommand as defineCommand181 } from "citty";
47247
47390
 
47248
47391
  // src/commands/research/advertisers.ts
47249
- import { defineCommand as defineCommand169 } from "citty";
47392
+ import { defineCommand as defineCommand170 } from "citty";
47250
47393
 
47251
47394
  // src/commands/research/hints.ts
47252
47395
  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 +47572,7 @@ var FIELDS3 = {
47429
47572
  etv: "Estimated traffic value (USD)",
47430
47573
  visibility: "SERP visibility score (0-1)"
47431
47574
  };
47432
- var advertisersCommand = defineCommand169({
47575
+ var advertisersCommand = defineCommand170({
47433
47576
  meta: {
47434
47577
  name: "advertisers",
47435
47578
  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 +47628,7 @@ Examples:
47485
47628
  });
47486
47629
 
47487
47630
  // src/commands/research/autocomplete.ts
47488
- import { defineCommand as defineCommand170 } from "citty";
47631
+ import { defineCommand as defineCommand171 } from "citty";
47489
47632
  registerSchema({
47490
47633
  command: "research.autocomplete",
47491
47634
  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 +47651,7 @@ registerSchema({
47508
47651
  var FIELDS4 = {
47509
47652
  suggestion: "Autocomplete suggestion from Google"
47510
47653
  };
47511
- var autocompleteCommand = defineCommand170({
47654
+ var autocompleteCommand = defineCommand171({
47512
47655
  meta: {
47513
47656
  name: "autocomplete",
47514
47657
  description: `Get Google Autocomplete suggestions for keyword expansion.
@@ -47563,7 +47706,7 @@ Examples:
47563
47706
  });
47564
47707
 
47565
47708
  // src/commands/research/countries.ts
47566
- import { defineCommand as defineCommand171 } from "citty";
47709
+ import { defineCommand as defineCommand172 } from "citty";
47567
47710
  registerSchema({
47568
47711
  command: "research.countries",
47569
47712
  description: "List all supported country codes for --location flag in research commands.",
@@ -47620,7 +47763,7 @@ var FIELDS5 = {
47620
47763
  code: "Country code to pass as --location",
47621
47764
  name: "Country name"
47622
47765
  };
47623
- var countriesCommand = defineCommand171({
47766
+ var countriesCommand = defineCommand172({
47624
47767
  meta: {
47625
47768
  name: "countries",
47626
47769
  description: "List all supported country codes for --location flag."
@@ -47631,7 +47774,7 @@ var countriesCommand = defineCommand171({
47631
47774
  });
47632
47775
 
47633
47776
  // src/commands/research/fetch.ts
47634
- import { defineCommand as defineCommand172 } from "citty";
47777
+ import { defineCommand as defineCommand173 } from "citty";
47635
47778
  var CONTENT_PREVIEW_CHARS = 2e4;
47636
47779
  var TIMEOUT_MS = 18e4;
47637
47780
  registerSchema({
@@ -47704,7 +47847,7 @@ function fetchFix(code) {
47704
47847
  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
47848
  };
47706
47849
  }
47707
- var fetchCommand = defineCommand172({
47850
+ var fetchCommand = defineCommand173({
47708
47851
  meta: {
47709
47852
  name: "fetch",
47710
47853
  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 +47924,7 @@ Examples:
47781
47924
  });
47782
47925
 
47783
47926
  // src/commands/research/intent.ts
47784
- import { defineCommand as defineCommand173 } from "citty";
47927
+ import { defineCommand as defineCommand174 } from "citty";
47785
47928
  registerSchema({
47786
47929
  command: "research.intent",
47787
47930
  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 +47947,7 @@ var FIELDS7 = {
47804
47947
  intent: "Primary Google Search intent: informational, navigational, commercial, transactional",
47805
47948
  probability: "Confidence score 0.0-1.0"
47806
47949
  };
47807
- var intentCommand = defineCommand173({
47950
+ var intentCommand = defineCommand174({
47808
47951
  meta: {
47809
47952
  name: "intent",
47810
47953
  description: `Classify Google Search intent for keywords. Returns intent type and confidence.
@@ -47852,7 +47995,7 @@ Examples:
47852
47995
  });
47853
47996
 
47854
47997
  // src/commands/research/keyword-gap.ts
47855
- import { defineCommand as defineCommand174 } from "citty";
47998
+ import { defineCommand as defineCommand175 } from "citty";
47856
47999
  registerSchema({
47857
48000
  command: "research.keyword-gap",
47858
48001
  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 +48024,7 @@ var FIELDS8 = {
47881
48024
  cpc: "Cost per click USD",
47882
48025
  their_position: "Competitor's ranking position"
47883
48026
  };
47884
- var keywordGapCommand = defineCommand174({
48027
+ var keywordGapCommand = defineCommand175({
47885
48028
  meta: {
47886
48029
  name: "keyword-gap",
47887
48030
  description: `Find keywords a competitor has that you don't. Supports pagination via --offset.
@@ -47956,7 +48099,7 @@ Examples:
47956
48099
  });
47957
48100
 
47958
48101
  // src/commands/research/keywords-for-site.ts
47959
- import { defineCommand as defineCommand175 } from "citty";
48102
+ import { defineCommand as defineCommand176 } from "citty";
47960
48103
  registerSchema({
47961
48104
  command: "research.keywords-for-site",
47962
48105
  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 +48132,7 @@ var FIELDS9 = {
47989
48132
  competition: "LOW, MEDIUM, or HIGH",
47990
48133
  competition_index: "Competition score 0-100"
47991
48134
  };
47992
- var keywordsForSiteCommand = defineCommand175({
48135
+ var keywordsForSiteCommand = defineCommand176({
47993
48136
  meta: {
47994
48137
  name: "keywords-for-site",
47995
48138
  description: `Get keywords a competitor targets in Google. Use --type to filter paid/organic.
@@ -48051,7 +48194,7 @@ Examples:
48051
48194
  });
48052
48195
 
48053
48196
  // src/commands/research/languages.ts
48054
- import { defineCommand as defineCommand176 } from "citty";
48197
+ import { defineCommand as defineCommand177 } from "citty";
48055
48198
  registerSchema({
48056
48199
  command: "research.languages",
48057
48200
  description: "List all supported language codes for --language flag in research commands.",
@@ -48081,7 +48224,7 @@ var FIELDS10 = {
48081
48224
  code: "Language code to pass as --language",
48082
48225
  name: "Language name (also accepted by --language)"
48083
48226
  };
48084
- var languagesCommand2 = defineCommand176({
48227
+ var languagesCommand2 = defineCommand177({
48085
48228
  meta: {
48086
48229
  name: "languages",
48087
48230
  description: "List all supported language codes for --language flag."
@@ -48092,7 +48235,7 @@ var languagesCommand2 = defineCommand176({
48092
48235
  });
48093
48236
 
48094
48237
  // src/commands/research/lighthouse.ts
48095
- import { defineCommand as defineCommand177 } from "citty";
48238
+ import { defineCommand as defineCommand178 } from "citty";
48096
48239
  registerSchema({
48097
48240
  command: "research.lighthouse",
48098
48241
  description: "Landing page performance audit. Returns metrics that affect Google Ads Quality Score and CPC.",
@@ -48111,7 +48254,7 @@ var FIELDS11 = {
48111
48254
  speed_index_ms: "Speed Index in ms (good: < 3400)",
48112
48255
  interactive_ms: "Time to Interactive in ms (good: < 3800)"
48113
48256
  };
48114
- var lighthouseCommand = defineCommand177({
48257
+ var lighthouseCommand = defineCommand178({
48115
48258
  meta: {
48116
48259
  name: "lighthouse",
48117
48260
  description: `Landing page performance audit. Metrics affecting Google Ads Quality Score.
@@ -48149,7 +48292,7 @@ Examples:
48149
48292
  });
48150
48293
 
48151
48294
  // src/commands/research/relevant-pages.ts
48152
- import { defineCommand as defineCommand178 } from "citty";
48295
+ import { defineCommand as defineCommand179 } from "citty";
48153
48296
  registerSchema({
48154
48297
  command: "research.relevant-pages",
48155
48298
  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 +48318,7 @@ var FIELDS12 = {
48175
48318
  keywords: "Total organic keywords the page ranks for",
48176
48319
  top_10: "Keywords in positions 1-10"
48177
48320
  };
48178
- var relevantPagesCommand = defineCommand178({
48321
+ var relevantPagesCommand = defineCommand179({
48179
48322
  meta: {
48180
48323
  name: "relevant-pages",
48181
48324
  description: `Get the top pages of a competitor domain with traffic data.
@@ -48222,7 +48365,7 @@ Examples:
48222
48365
  });
48223
48366
 
48224
48367
  // src/commands/research/web.ts
48225
- import { defineCommand as defineCommand179 } from "citty";
48368
+ import { defineCommand as defineCommand180 } from "citty";
48226
48369
  registerSchema({
48227
48370
  command: "research.web",
48228
48371
  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 +48416,7 @@ async function runDeepResearch(question) {
48273
48416
  }
48274
48417
  throw new Error("Deep research timed out");
48275
48418
  }
48276
- var webCommand = defineCommand179({
48419
+ var webCommand = defineCommand180({
48277
48420
  meta: {
48278
48421
  name: "web",
48279
48422
  description: `Search the web with AI to answer any open-ended marketing question. Uses live internet data via Google Search.
@@ -48335,7 +48478,7 @@ Examples:
48335
48478
  });
48336
48479
 
48337
48480
  // src/commands/research/index.ts
48338
- var researchCommand = defineCommand180({
48481
+ var researchCommand = defineCommand181({
48339
48482
  meta: {
48340
48483
  name: "research",
48341
48484
  description: `Competitive intelligence and AI-powered research commands.
@@ -48379,10 +48522,10 @@ Full guide: __tooling__/docs/tools/baker/research.md`
48379
48522
  });
48380
48523
 
48381
48524
  // src/commands/scheduled-actions/index.ts
48382
- import { defineCommand as defineCommand188 } from "citty";
48525
+ import { defineCommand as defineCommand189 } from "citty";
48383
48526
 
48384
48527
  // src/commands/scheduled-actions/create.ts
48385
- import { defineCommand as defineCommand181 } from "citty";
48528
+ import { defineCommand as defineCommand182 } from "citty";
48386
48529
 
48387
48530
  // src/commands/scheduled-actions/shared.ts
48388
48531
  var TEMP_SCHEDULED_ACTION_PREFIX = "temp_sched_";
@@ -48529,7 +48672,7 @@ registerSchema({
48529
48672
  }
48530
48673
  }
48531
48674
  });
48532
- var createCommand3 = defineCommand181({
48675
+ var createCommand3 = defineCommand182({
48533
48676
  meta: {
48534
48677
  name: "create",
48535
48678
  description: 'Stage a scheduled action. Example: baker scheduled-actions create --name "Weekly report" --description "..." --cron "0 9 * * MON"'
@@ -48588,7 +48731,7 @@ var createCommand3 = defineCommand181({
48588
48731
  });
48589
48732
 
48590
48733
  // src/commands/scheduled-actions/delete.ts
48591
- import { defineCommand as defineCommand182 } from "citty";
48734
+ import { defineCommand as defineCommand183 } from "citty";
48592
48735
  registerSchema({
48593
48736
  command: "scheduled-actions.delete",
48594
48737
  description: "Stage deletion of a published scheduled action or cancellation of a temp_sched_* draft creation.",
@@ -48596,7 +48739,7 @@ registerSchema({
48596
48739
  id: { type: "string", description: "Published scheduled action ID or temp_sched_* draft ID", required: true }
48597
48740
  }
48598
48741
  });
48599
- var deleteCommand3 = defineCommand182({
48742
+ var deleteCommand3 = defineCommand183({
48600
48743
  meta: {
48601
48744
  name: "delete",
48602
48745
  description: "Stage scheduled action deletion. Example: baker scheduled-actions delete <id-or-temp_sched_id>"
@@ -48625,7 +48768,7 @@ var deleteCommand3 = defineCommand182({
48625
48768
  });
48626
48769
 
48627
48770
  // src/commands/scheduled-actions/get.ts
48628
- import { defineCommand as defineCommand183 } from "citty";
48771
+ import { defineCommand as defineCommand184 } from "citty";
48629
48772
  registerSchema({
48630
48773
  command: "scheduled-actions.get",
48631
48774
  description: "Get a published scheduled action or a temp_sched_* draft-created scheduled action.",
@@ -48634,7 +48777,7 @@ registerSchema({
48634
48777
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
48635
48778
  }
48636
48779
  });
48637
- var getCommand4 = defineCommand183({
48780
+ var getCommand4 = defineCommand184({
48638
48781
  meta: {
48639
48782
  name: "get",
48640
48783
  description: "Get a scheduled action. Example: baker scheduled-actions get <id-or-temp_sched_id>"
@@ -48673,7 +48816,7 @@ var getCommand4 = defineCommand183({
48673
48816
  });
48674
48817
 
48675
48818
  // src/commands/scheduled-actions/list.ts
48676
- import { defineCommand as defineCommand184 } from "citty";
48819
+ import { defineCommand as defineCommand185 } from "citty";
48677
48820
  registerSchema({
48678
48821
  command: "scheduled-actions.list",
48679
48822
  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 +48824,7 @@ registerSchema({
48681
48824
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
48682
48825
  }
48683
48826
  });
48684
- var listCommand15 = defineCommand184({
48827
+ var listCommand15 = defineCommand185({
48685
48828
  meta: {
48686
48829
  name: "list",
48687
48830
  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 +48849,7 @@ var listCommand15 = defineCommand184({
48706
48849
  // src/commands/scheduled-actions/templates.ts
48707
48850
  import { readFile as readFile25 } from "fs/promises";
48708
48851
  import path39 from "path";
48709
- import { defineCommand as defineCommand185 } from "citty";
48852
+ import { defineCommand as defineCommand186 } from "citty";
48710
48853
  registerSchema({
48711
48854
  command: "scheduled-actions.templates",
48712
48855
  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 +48904,7 @@ registerSchema({
48761
48904
  }
48762
48905
  }
48763
48906
  });
48764
- var templatesCommand = defineCommand185({
48907
+ var templatesCommand = defineCommand186({
48765
48908
  meta: {
48766
48909
  name: "templates",
48767
48910
  description: `The recipes this company can run \u2014 Baker's own plus theirs, with what each one produces.
@@ -48853,7 +48996,7 @@ Full guide: __tooling__/docs/tools/baker/scheduled-actions.md`
48853
48996
  });
48854
48997
 
48855
48998
  // src/commands/scheduled-actions/trigger.ts
48856
- import { defineCommand as defineCommand186 } from "citty";
48999
+ import { defineCommand as defineCommand187 } from "citty";
48857
49000
  registerSchema({
48858
49001
  command: "scheduled-actions.trigger",
48859
49002
  description: "Immediately trigger a published scheduled action. Does not require BAKER_CHAT_ID and rejects temp_sched_* IDs.",
@@ -48861,7 +49004,7 @@ registerSchema({
48861
49004
  id: { type: "string", description: "Published scheduled action ID", required: true }
48862
49005
  }
48863
49006
  });
48864
- var triggerCommand = defineCommand186({
49007
+ var triggerCommand = defineCommand187({
48865
49008
  meta: {
48866
49009
  name: "trigger",
48867
49010
  description: "Immediately trigger a published scheduled action. Example: baker scheduled-actions trigger <id>"
@@ -48898,7 +49041,7 @@ var triggerCommand = defineCommand186({
48898
49041
  });
48899
49042
 
48900
49043
  // src/commands/scheduled-actions/update.ts
48901
- import { defineCommand as defineCommand187 } from "citty";
49044
+ import { defineCommand as defineCommand188 } from "citty";
48902
49045
  registerSchema({
48903
49046
  command: "scheduled-actions.update",
48904
49047
  description: "Stage an update to a published scheduled action or temp_sched_* draft-created scheduled action.",
@@ -48929,7 +49072,7 @@ registerSchema({
48929
49072
  prompt: { type: "string", description: "Replacement additional spawned-agent instructions", required: false }
48930
49073
  }
48931
49074
  });
48932
- var updateCommand3 = defineCommand187({
49075
+ var updateCommand3 = defineCommand188({
48933
49076
  meta: {
48934
49077
  name: "update",
48935
49078
  description: "Stage a scheduled action update. Examples: baker scheduled-actions update <id> --enabled false | baker scheduled-actions update <id> --mode publish"
@@ -49007,7 +49150,7 @@ var updateCommand3 = defineCommand187({
49007
49150
  });
49008
49151
 
49009
49152
  // src/commands/scheduled-actions/index.ts
49010
- var scheduledActionsCommand = defineCommand188({
49153
+ var scheduledActionsCommand = defineCommand189({
49011
49154
  meta: {
49012
49155
  name: "scheduled-actions",
49013
49156
  description: `Manage Scheduled Actions. Subcommands: list, get, create, update, delete, trigger, templates.
@@ -49036,14 +49179,14 @@ Full guide: __tooling__/docs/tools/baker/scheduled-actions.md`
49036
49179
  });
49037
49180
 
49038
49181
  // src/commands/schema.ts
49039
- import { defineCommand as defineCommand189 } from "citty";
49182
+ import { defineCommand as defineCommand190 } from "citty";
49040
49183
  function narrowToFamily(commandName, available) {
49041
49184
  const segments = commandName.split(".");
49042
49185
  const prefix = segments[0] === "ads" && segments[1] ? `ads.${segments[1]}.` : `${segments[0]}.`;
49043
49186
  const siblings = available.filter((name) => name.startsWith(prefix));
49044
49187
  return siblings.length > 0 ? siblings : available;
49045
49188
  }
49046
- var schemaCommand2 = defineCommand189({
49189
+ var schemaCommand2 = defineCommand190({
49047
49190
  meta: {
49048
49191
  name: "schema",
49049
49192
  description: "Inspect command argument schemas (for AI agent introspection). Lists all commands if no argument given. Example: baker schema images.search"
@@ -49087,10 +49230,10 @@ var schemaCommand2 = defineCommand189({
49087
49230
  });
49088
49231
 
49089
49232
  // src/commands/studio/index.ts
49090
- import { defineCommand as defineCommand198 } from "citty";
49233
+ import { defineCommand as defineCommand199 } from "citty";
49091
49234
 
49092
49235
  // src/commands/studio/animate.ts
49093
- import { defineCommand as defineCommand190 } from "citty";
49236
+ import { defineCommand as defineCommand191 } from "citty";
49094
49237
 
49095
49238
  // src/commands/studio/batch.ts
49096
49239
  function projectBatch(generation, full) {
@@ -49541,7 +49684,7 @@ function costHintsFor(body) {
49541
49684
  }
49542
49685
  return hints;
49543
49686
  }
49544
- var animateCommand = defineCommand190({
49687
+ var animateCommand = defineCommand191({
49545
49688
  meta: {
49546
49689
  name: "animate",
49547
49690
  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 +49808,7 @@ var animateCommand = defineCommand190({
49665
49808
  });
49666
49809
 
49667
49810
  // src/commands/studio/generate.ts
49668
- import { defineCommand as defineCommand191 } from "citty";
49811
+ import { defineCommand as defineCommand192 } from "citty";
49669
49812
  var MODEL_LIST2 = IMAGE_MODEL_IDS;
49670
49813
  var DEFAULT_MAX_WAIT_MS2 = 24e4;
49671
49814
  registerSchema({
@@ -49801,7 +49944,7 @@ function buildGenerateBody(args, prompt) {
49801
49944
  }
49802
49945
  return body;
49803
49946
  }
49804
- var generateCommand = defineCommand191({
49947
+ var generateCommand = defineCommand192({
49805
49948
  meta: {
49806
49949
  name: "generate",
49807
49950
  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 +50027,7 @@ var generateCommand = defineCommand191({
49884
50027
  });
49885
50028
 
49886
50029
  // src/commands/studio/get.ts
49887
- import { defineCommand as defineCommand192 } from "citty";
50030
+ import { defineCommand as defineCommand193 } from "citty";
49888
50031
  registerSchema({
49889
50032
  command: "studio.get",
49890
50033
  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 +50036,7 @@ registerSchema({
49893
50036
  full: { type: "boolean", description: "Include settings, references and attribution", required: false }
49894
50037
  }
49895
50038
  });
49896
- var getCommand5 = defineCommand192({
50039
+ var getCommand5 = defineCommand193({
49897
50040
  meta: {
49898
50041
  name: "get",
49899
50042
  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 +50065,7 @@ var getCommand5 = defineCommand192({
49922
50065
  });
49923
50066
 
49924
50067
  // src/commands/studio/improve.ts
49925
- import { defineCommand as defineCommand193 } from "citty";
50068
+ import { defineCommand as defineCommand194 } from "citty";
49926
50069
  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
50070
  registerSchema({
49928
50071
  command: "studio.improve",
@@ -49947,7 +50090,7 @@ registerSchema({
49947
50090
  }
49948
50091
  }
49949
50092
  });
49950
- var improveCommand = defineCommand193({
50093
+ var improveCommand = defineCommand194({
49951
50094
  meta: {
49952
50095
  name: "improve",
49953
50096
  description: `${DESCRIPTION}
@@ -49991,7 +50134,7 @@ Examples:
49991
50134
  });
49992
50135
 
49993
50136
  // src/commands/studio/keep.ts
49994
- import { defineCommand as defineCommand194 } from "citty";
50137
+ import { defineCommand as defineCommand195 } from "citty";
49995
50138
  registerSchema({
49996
50139
  command: "studio.keep",
49997
50140
  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 +50144,7 @@ registerSchema({
50001
50144
  undo: { type: "boolean", description: "Un-star an image, or take a kept clip back out", required: false }
50002
50145
  }
50003
50146
  });
50004
- var keepCommand = defineCommand194({
50147
+ var keepCommand = defineCommand195({
50005
50148
  meta: {
50006
50149
  name: "keep",
50007
50150
  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 +50195,7 @@ var keepCommand = defineCommand194({
50052
50195
  });
50053
50196
 
50054
50197
  // src/commands/studio/list.ts
50055
- import { defineCommand as defineCommand195 } from "citty";
50198
+ import { defineCommand as defineCommand196 } from "citty";
50056
50199
  registerSchema({
50057
50200
  command: "studio.list",
50058
50201
  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 +50206,7 @@ registerSchema({
50063
50206
  full: { type: "boolean", description: "Include settings, references and attribution", required: false }
50064
50207
  }
50065
50208
  });
50066
- var listCommand16 = defineCommand195({
50209
+ var listCommand16 = defineCommand196({
50067
50210
  meta: {
50068
50211
  name: "list",
50069
50212
  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 +50240,7 @@ var listCommand16 = defineCommand195({
50097
50240
  });
50098
50241
 
50099
50242
  // src/commands/studio/models.ts
50100
- import { defineCommand as defineCommand196 } from "citty";
50243
+ import { defineCommand as defineCommand197 } from "citty";
50101
50244
  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
50245
  registerSchema({
50103
50246
  command: "studio.models",
@@ -50184,7 +50327,7 @@ function buildModelCards(kind, model) {
50184
50327
  const selected = model ? ids.filter((id) => id === model) : ids;
50185
50328
  return selected.map((id) => build(id));
50186
50329
  }
50187
- var modelsCommand = defineCommand196({
50330
+ var modelsCommand = defineCommand197({
50188
50331
  meta: {
50189
50332
  name: "models",
50190
50333
  description: `${DESCRIPTION2}
@@ -50231,13 +50374,13 @@ Examples:
50231
50374
  });
50232
50375
 
50233
50376
  // src/commands/studio/skills.ts
50234
- import { defineCommand as defineCommand197 } from "citty";
50377
+ import { defineCommand as defineCommand198 } from "citty";
50235
50378
  registerSchema({
50236
50379
  command: "studio.skills",
50237
50380
  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
50381
  args: {}
50239
50382
  });
50240
- var skillsCommand = defineCommand197({
50383
+ var skillsCommand = defineCommand198({
50241
50384
  meta: {
50242
50385
  name: "skills",
50243
50386
  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 +50404,7 @@ var skillsCommand = defineCommand197({
50261
50404
  });
50262
50405
 
50263
50406
  // src/commands/studio/index.ts
50264
- var studioCommand = defineCommand198({
50407
+ var studioCommand = defineCommand199({
50265
50408
  meta: {
50266
50409
  name: "studio",
50267
50410
  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 +50447,10 @@ Full guide: __tooling__/docs/tools/baker/studio.md`
50304
50447
  });
50305
50448
 
50306
50449
  // src/commands/tag-manager/index.ts
50307
- import { defineCommand as defineCommand202 } from "citty";
50450
+ import { defineCommand as defineCommand203 } from "citty";
50308
50451
 
50309
50452
  // src/commands/tag-manager/draft.ts
50310
- import { defineCommand as defineCommand199 } from "citty";
50453
+ import { defineCommand as defineCommand200 } from "citty";
50311
50454
 
50312
50455
  // src/commands/tag-manager/shared.ts
50313
50456
  import { readFileSync as readFileSync15 } from "fs";
@@ -50430,13 +50573,13 @@ registerSchema({
50430
50573
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
50431
50574
  }
50432
50575
  });
50433
- var draftCommand4 = defineCommand199({
50576
+ var draftCommand4 = defineCommand200({
50434
50577
  meta: {
50435
50578
  name: "draft",
50436
50579
  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
50580
  },
50438
50581
  subCommands: {
50439
- list: defineCommand199({
50582
+ list: defineCommand200({
50440
50583
  meta: {
50441
50584
  name: "list",
50442
50585
  description: "Review everything staged on this chat (--json for the raw envelope)"
@@ -50449,7 +50592,7 @@ var draftCommand4 = defineCommand199({
50449
50592
  await draftList2(args.json === true, args.chat);
50450
50593
  }
50451
50594
  }),
50452
- show: defineCommand199({
50595
+ show: defineCommand200({
50453
50596
  meta: {
50454
50597
  name: "show",
50455
50598
  description: "Print the full staged payload for one change \u2014 the receipt to verify it looks right before publish (never truncated)."
@@ -50466,7 +50609,7 @@ var draftCommand4 = defineCommand199({
50466
50609
  );
50467
50610
  }
50468
50611
  }),
50469
- amend: defineCommand199({
50612
+ amend: defineCommand200({
50470
50613
  meta: {
50471
50614
  name: "amend",
50472
50615
  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 +50626,7 @@ var draftCommand4 = defineCommand199({
50483
50626
  });
50484
50627
  }
50485
50628
  }),
50486
- remove: defineCommand199({
50629
+ remove: defineCommand200({
50487
50630
  meta: { name: "remove", description: "Remove one staged change (cascades to anything depending on it)" },
50488
50631
  args: { ref: { type: "positional", description: "Staged ref (gtm_temp_*) or target", required: false } },
50489
50632
  run: async ({ args }) => {
@@ -50492,7 +50635,7 @@ var draftCommand4 = defineCommand199({
50492
50635
  });
50493
50636
  }
50494
50637
  }),
50495
- clear: defineCommand199({
50638
+ clear: defineCommand200({
50496
50639
  meta: { name: "clear", description: "Discard all Tag Manager changes staged on this chat" },
50497
50640
  run: async () => {
50498
50641
  await draftAction3("/api/tag-manager/draft/clear", {});
@@ -50502,7 +50645,7 @@ var draftCommand4 = defineCommand199({
50502
50645
  });
50503
50646
 
50504
50647
  // src/commands/tag-manager/read.ts
50505
- import { defineCommand as defineCommand200 } from "citty";
50648
+ import { defineCommand as defineCommand201 } from "citty";
50506
50649
  registerSchema({
50507
50650
  command: "tagManager.containers",
50508
50651
  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 +50686,7 @@ function containersHints(containers) {
50543
50686
  }))
50544
50687
  });
50545
50688
  }
50546
- var containersCommand = defineCommand200({
50689
+ var containersCommand = defineCommand201({
50547
50690
  meta: {
50548
50691
  name: "containers",
50549
50692
  description: `List Tag Manager containers reachable by this company's connection.
@@ -50560,7 +50703,7 @@ Start here:
50560
50703
  }
50561
50704
  }
50562
50705
  });
50563
- var readCommand = defineCommand200({
50706
+ var readCommand = defineCommand201({
50564
50707
  meta: {
50565
50708
  name: "read",
50566
50709
  description: `Read the current contents of the Tag Manager container \u2014 always do this before staging changes.
@@ -50602,7 +50745,7 @@ Examples:
50602
50745
  });
50603
50746
 
50604
50747
  // src/commands/tag-manager/write-commands.ts
50605
- import { defineCommand as defineCommand201 } from "citty";
50748
+ import { defineCommand as defineCommand202 } from "citty";
50606
50749
  var CONTAINER_ARG_DESCRIPTION = "Numeric container id (optional only when one container is connected \u2014 run `baker tag-manager containers`)";
50607
50750
  var ENTITIES = [
50608
50751
  {
@@ -50658,10 +50801,10 @@ for (const { entity, noun, createHint } of ENTITIES) {
50658
50801
  });
50659
50802
  }
50660
50803
  function entityCommand(entity, noun, example) {
50661
- return defineCommand201({
50804
+ return defineCommand202({
50662
50805
  meta: { name: entity, description: `Stage ${noun} changes on this chat's Tag Manager draft` },
50663
50806
  subCommands: {
50664
- create: defineCommand201({
50807
+ create: defineCommand202({
50665
50808
  meta: {
50666
50809
  name: "create",
50667
50810
  description: `Stage a new ${noun}
@@ -50683,7 +50826,7 @@ Examples:
50683
50826
  });
50684
50827
  }
50685
50828
  }),
50686
- update: defineCommand201({
50829
+ update: defineCommand202({
50687
50830
  meta: {
50688
50831
  name: "update",
50689
50832
  description: `Stage an update to an existing ${noun} (pass its id or path)`
@@ -50703,7 +50846,7 @@ Examples:
50703
50846
  });
50704
50847
  }
50705
50848
  }),
50706
- delete: defineCommand201({
50849
+ delete: defineCommand202({
50707
50850
  meta: { name: "delete", description: `Stage the deletion of a ${noun} (pass its id or path)` },
50708
50851
  args: {
50709
50852
  id: { type: "positional", description: `${noun} id or path`, required: false },
@@ -50744,7 +50887,7 @@ function builtinTypes(args) {
50744
50887
  }
50745
50888
  return raw.split(",").map((entry) => entry.trim());
50746
50889
  }
50747
- var builtinCommand = defineCommand201({
50890
+ var builtinCommand = defineCommand202({
50748
50891
  meta: {
50749
50892
  name: "builtin",
50750
50893
  description: `Enable or disable built-in variables
@@ -50754,7 +50897,7 @@ Examples:
50754
50897
  baker tag-manager builtin disable --types formId`
50755
50898
  },
50756
50899
  subCommands: {
50757
- enable: defineCommand201({
50900
+ enable: defineCommand202({
50758
50901
  meta: { name: "enable", description: "Stage enabling built-in variables" },
50759
50902
  args: {
50760
50903
  types: { type: "string", description: "Comma-separated types", required: false },
@@ -50768,7 +50911,7 @@ Examples:
50768
50911
  });
50769
50912
  }
50770
50913
  }),
50771
- disable: defineCommand201({
50914
+ disable: defineCommand202({
50772
50915
  meta: { name: "disable", description: "Stage disabling built-in variables" },
50773
50916
  args: {
50774
50917
  types: { type: "string", description: "Comma-separated types", required: false },
@@ -50786,7 +50929,7 @@ Examples:
50786
50929
  });
50787
50930
 
50788
50931
  // src/commands/tag-manager/index.ts
50789
- var tagManagerCommand = defineCommand202({
50932
+ var tagManagerCommand = defineCommand203({
50790
50933
  meta: {
50791
50934
  name: "tag-manager",
50792
50935
  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 +50966,7 @@ Full guide: __tooling__/docs/tools/baker/tag-manager.md`
50823
50966
  });
50824
50967
 
50825
50968
  // src/commands/tags/index.ts
50826
- import { defineCommand as defineCommand203 } from "citty";
50969
+ import { defineCommand as defineCommand204 } from "citty";
50827
50970
 
50828
50971
  // src/commands/tags/shared.ts
50829
50972
  function failApi3(err) {
@@ -50892,7 +51035,7 @@ async function listTags(json) {
50892
51035
  var listArgs9 = {
50893
51036
  json: { type: "boolean", description: "Print the raw JSON envelope instead of the readable list" }
50894
51037
  };
50895
- var listCommand17 = defineCommand203({
51038
+ var listCommand17 = defineCommand204({
50896
51039
  meta: {
50897
51040
  name: "list",
50898
51041
  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 +51054,7 @@ async function listDraft3(chat) {
50911
51054
  failApi3(err);
50912
51055
  }
50913
51056
  }
50914
- var draftCommand5 = defineCommand203({
51057
+ var draftCommand5 = defineCommand204({
50915
51058
  meta: {
50916
51059
  name: "draft",
50917
51060
  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 +51064,7 @@ var draftCommand5 = defineCommand203({
50921
51064
  await listDraft3(args.chat);
50922
51065
  }
50923
51066
  });
50924
- var tagsCommand4 = defineCommand203({
51067
+ var tagsCommand4 = defineCommand204({
50925
51068
  meta: {
50926
51069
  name: "tags",
50927
51070
  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 +51093,10 @@ Full guide: __tooling__/docs/tools/baker/tags.md`
50950
51093
  });
50951
51094
 
50952
51095
  // src/commands/testimonials/index.ts
50953
- import { defineCommand as defineCommand207 } from "citty";
51096
+ import { defineCommand as defineCommand208 } from "citty";
50954
51097
 
50955
51098
  // src/commands/testimonials/get.ts
50956
- import { defineCommand as defineCommand204 } from "citty";
51099
+ import { defineCommand as defineCommand205 } from "citty";
50957
51100
  registerSchema({
50958
51101
  command: "testimonials.get",
50959
51102
  description: "Get a single testimonial by ID",
@@ -50961,7 +51104,7 @@ registerSchema({
50961
51104
  id: { type: "string", description: "Testimonial ID", required: true }
50962
51105
  }
50963
51106
  });
50964
- var getCommand6 = defineCommand204({
51107
+ var getCommand6 = defineCommand205({
50965
51108
  meta: { name: "get", description: "Get a single testimonial by ID. Example: baker testimonials get j571abc123" },
50966
51109
  args: {
50967
51110
  id: { type: "positional", description: "Testimonial ID", required: false },
@@ -50998,7 +51141,7 @@ var getCommand6 = defineCommand204({
50998
51141
  });
50999
51142
 
51000
51143
  // src/commands/testimonials/list.ts
51001
- import { defineCommand as defineCommand205 } from "citty";
51144
+ import { defineCommand as defineCommand206 } from "citty";
51002
51145
 
51003
51146
  // src/commands/testimonials/emptyCorpusHints.ts
51004
51147
  function resolveEmptyReason({
@@ -51133,7 +51276,7 @@ function buildListParams(args) {
51133
51276
  }
51134
51277
  return params;
51135
51278
  }
51136
- var listCommand18 = defineCommand205({
51279
+ var listCommand18 = defineCommand206({
51137
51280
  meta: {
51138
51281
  name: "list",
51139
51282
  description: "List testimonials with optional filters. Example: baker testimonials list --source google --sentiment positive"
@@ -51185,7 +51328,7 @@ var listCommand18 = defineCommand205({
51185
51328
  });
51186
51329
 
51187
51330
  // src/commands/testimonials/search.ts
51188
- import { defineCommand as defineCommand206 } from "citty";
51331
+ import { defineCommand as defineCommand207 } from "citty";
51189
51332
  var FILTER_FLAGS2 = ["source", "rating-min", "rating-max", "status", "sentiment", "language", "tags"];
51190
51333
  function languageBiasHint(results, requestedLanguage) {
51191
51334
  if (requestedLanguage) {
@@ -51264,7 +51407,7 @@ function buildSearchRequest(query, args) {
51264
51407
  }
51265
51408
  return body;
51266
51409
  }
51267
- var searchCommand3 = defineCommand206({
51410
+ var searchCommand3 = defineCommand207({
51268
51411
  meta: {
51269
51412
  name: "search",
51270
51413
  description: "Semantic search testimonials by text query. Uses hybrid BM25 + vector + reranking. Example: baker testimonials search 'great service' --rating-min 4"
@@ -51328,7 +51471,7 @@ var searchCommand3 = defineCommand206({
51328
51471
  var tagsCommand5 = makeTagsCommand("testimonials", "testimonial", "/api/testimonials/tags");
51329
51472
 
51330
51473
  // src/commands/testimonials/index.ts
51331
- var testimonialsCommand = defineCommand207({
51474
+ var testimonialsCommand = defineCommand208({
51332
51475
  meta: {
51333
51476
  name: "testimonials",
51334
51477
  description: `Find and browse testimonials in Baker. Subcommands: search, get, list, tags.
@@ -51350,10 +51493,10 @@ Full guide: __tooling__/docs/tools/baker/testimonials.md`
51350
51493
  });
51351
51494
 
51352
51495
  // src/commands/videos/index.ts
51353
- import { defineCommand as defineCommand214 } from "citty";
51496
+ import { defineCommand as defineCommand215 } from "citty";
51354
51497
 
51355
51498
  // src/commands/videos/delete.ts
51356
- import { defineCommand as defineCommand208 } from "citty";
51499
+ import { defineCommand as defineCommand209 } from "citty";
51357
51500
  registerSchema({
51358
51501
  command: "videos.delete",
51359
51502
  description: "Delete a video by ID",
@@ -51367,7 +51510,7 @@ registerSchema({
51367
51510
  }
51368
51511
  }
51369
51512
  });
51370
- var deleteCommand4 = defineCommand208({
51513
+ var deleteCommand4 = defineCommand209({
51371
51514
  meta: {
51372
51515
  name: "delete",
51373
51516
  description: "Delete a video by ID. Use --dry-run to preview. Example: baker videos delete j571abc123 --dry-run"
@@ -51408,7 +51551,7 @@ var deleteCommand4 = defineCommand208({
51408
51551
  });
51409
51552
 
51410
51553
  // src/commands/videos/get.ts
51411
- import { defineCommand as defineCommand209 } from "citty";
51554
+ import { defineCommand as defineCommand210 } from "citty";
51412
51555
  registerSchema({
51413
51556
  command: "videos.get",
51414
51557
  description: "Get a single video by ID",
@@ -51416,7 +51559,7 @@ registerSchema({
51416
51559
  id: { type: "string", description: "Video ID", required: true }
51417
51560
  }
51418
51561
  });
51419
- var getCommand7 = defineCommand209({
51562
+ var getCommand7 = defineCommand210({
51420
51563
  meta: { name: "get", description: "Get a single video by ID. Example: baker videos get j571abc123" },
51421
51564
  args: {
51422
51565
  id: { type: "positional", description: "Video ID", required: false },
@@ -51453,7 +51596,7 @@ var getCommand7 = defineCommand209({
51453
51596
  });
51454
51597
 
51455
51598
  // src/commands/videos/group.ts
51456
- import { defineCommand as defineCommand210 } from "citty";
51599
+ import { defineCommand as defineCommand211 } from "citty";
51457
51600
  registerSchema({
51458
51601
  command: "videos.group",
51459
51602
  description: "List every clip and image that arrived in the same set as this video (carousel slides, one page)",
@@ -51462,7 +51605,7 @@ registerSchema({
51462
51605
  "group-key": { type: "string", description: "The set key directly, when you already have it", required: false }
51463
51606
  }
51464
51607
  });
51465
- var groupCommand2 = defineCommand210({
51608
+ var groupCommand2 = defineCommand211({
51466
51609
  meta: {
51467
51610
  name: "group",
51468
51611
  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 +51628,7 @@ var groupCommand2 = defineCommand210({
51485
51628
  import { mkdtemp as mkdtemp3, rm as rm8, stat as stat8 } from "fs/promises";
51486
51629
  import { tmpdir as tmpdir4 } from "os";
51487
51630
  import path40 from "path";
51488
- import { defineCommand as defineCommand211 } from "citty";
51631
+ import { defineCommand as defineCommand212 } from "citty";
51489
51632
 
51490
51633
  // src/lib/streamUpload.ts
51491
51634
  import { createHash as createHash2 } from "crypto";
@@ -51649,7 +51792,7 @@ registerSchema({
51649
51792
  "dry-run": { type: "boolean", description: "Preview the operation without executing", required: false }
51650
51793
  }
51651
51794
  });
51652
- var ingestCommand2 = defineCommand211({
51795
+ var ingestCommand2 = defineCommand212({
51653
51796
  meta: {
51654
51797
  name: "ingest",
51655
51798
  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 +52054,7 @@ async function uploadToAssetStore(filePath, sizeBytes) {
51911
52054
  }
51912
52055
 
51913
52056
  // src/commands/videos/search.ts
51914
- import { defineCommand as defineCommand212 } from "citty";
52057
+ import { defineCommand as defineCommand213 } from "citty";
51915
52058
  registerSchema({
51916
52059
  command: "videos.search",
51917
52060
  description: "Search videos by text query. Only returns ready videos.",
@@ -51921,7 +52064,7 @@ registerSchema({
51921
52064
  tags: { type: "string", description: "Comma-separated tags to filter by", required: false }
51922
52065
  }
51923
52066
  });
51924
- var searchCommand4 = defineCommand212({
52067
+ var searchCommand4 = defineCommand213({
51925
52068
  meta: {
51926
52069
  name: "search",
51927
52070
  description: "Semantic search videos by text query. Uses hybrid BM25 + vector + reranking. Example: baker videos search 'product demo' --tags tutorial"
@@ -51973,7 +52116,7 @@ var tagsCommand6 = makeTagsCommand("videos", "video", "/api/videos/tags");
51973
52116
  // src/commands/videos/upload.ts
51974
52117
  import { readFile as readFile26, stat as stat9 } from "fs/promises";
51975
52118
  import { basename as basename3, extname as extname4 } from "path";
51976
- import { defineCommand as defineCommand213 } from "citty";
52119
+ import { defineCommand as defineCommand214 } from "citty";
51977
52120
  var MIME_MAP = {
51978
52121
  ".mp4": "video/mp4",
51979
52122
  ".mov": "video/quicktime",
@@ -52015,7 +52158,7 @@ function detectContentType(filePath) {
52015
52158
  function isRemoteUrl3(value) {
52016
52159
  return /^https?:\/\//i.test(value);
52017
52160
  }
52018
- var uploadCommand2 = defineCommand213({
52161
+ var uploadCommand2 = defineCommand214({
52019
52162
  meta: {
52020
52163
  name: "upload",
52021
52164
  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 +52242,7 @@ var uploadCommand2 = defineCommand213({
52099
52242
  });
52100
52243
 
52101
52244
  // src/commands/videos/index.ts
52102
- var videosCommand = defineCommand214({
52245
+ var videosCommand = defineCommand215({
52103
52246
  meta: {
52104
52247
  name: "videos",
52105
52248
  description: `Find and manage videos in Baker. Subcommands: search, get, upload, ingest, delete, tags.
@@ -52126,10 +52269,10 @@ Full guide: __tooling__/docs/tools/baker/videos.md`
52126
52269
  });
52127
52270
 
52128
52271
  // src/commands/winning-ads/index.ts
52129
- import { defineCommand as defineCommand227 } from "citty";
52272
+ import { defineCommand as defineCommand228 } from "citty";
52130
52273
 
52131
52274
  // src/commands/winning-ads/advertisers.ts
52132
- import { defineCommand as defineCommand215 } from "citty";
52275
+ import { defineCommand as defineCommand216 } from "citty";
52133
52276
 
52134
52277
  // src/commands/winning-ads/shared.ts
52135
52278
  function splitList2(value) {
@@ -52182,7 +52325,7 @@ function advertiserNormalizer(record, full) {
52182
52325
  last_synced_at: record.last_synced_at ?? null
52183
52326
  };
52184
52327
  }
52185
- var advertisersCommand2 = defineCommand215({
52328
+ var advertisersCommand2 = defineCommand216({
52186
52329
  meta: {
52187
52330
  name: "advertisers",
52188
52331
  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 +52383,7 @@ var advertisersCommand2 = defineCommand215({
52240
52383
  });
52241
52384
 
52242
52385
  // src/commands/winning-ads/brief.ts
52243
- import { defineCommand as defineCommand216 } from "citty";
52386
+ import { defineCommand as defineCommand217 } from "citty";
52244
52387
  registerSchema({
52245
52388
  command: "winning-ads.brief",
52246
52389
  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 +52429,7 @@ function parseDna(raw) {
52286
52429
  }
52287
52430
  return parsed;
52288
52431
  }
52289
- var briefCommand = defineCommand216({
52432
+ var briefCommand = defineCommand217({
52290
52433
  meta: {
52291
52434
  name: "brief",
52292
52435
  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 +52465,7 @@ var briefCommand = defineCommand216({
52322
52465
  });
52323
52466
 
52324
52467
  // src/commands/winning-ads/content.ts
52325
- import { defineCommand as defineCommand217 } from "citty";
52468
+ import { defineCommand as defineCommand218 } from "citty";
52326
52469
  registerSchema({
52327
52470
  command: "winning-ads.content",
52328
52471
  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 +52478,7 @@ registerSchema({
52335
52478
  }
52336
52479
  }
52337
52480
  });
52338
- var contentCommand = defineCommand217({
52481
+ var contentCommand = defineCommand218({
52339
52482
  meta: {
52340
52483
  name: "content",
52341
52484
  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 +52527,7 @@ var contentCommand = defineCommand217({
52384
52527
  });
52385
52528
 
52386
52529
  // src/commands/winning-ads/feed.ts
52387
- import { defineCommand as defineCommand218 } from "citty";
52530
+ import { defineCommand as defineCommand219 } from "citty";
52388
52531
  function buildFeedParams(input) {
52389
52532
  const params = {};
52390
52533
  const advertiser = splitList2(input.advertiser);
@@ -52436,7 +52579,7 @@ registerSchema({
52436
52579
  format: { type: "string", description: "Comma-separated formats to include (e.g. static,video)", required: false }
52437
52580
  }
52438
52581
  });
52439
- var feedCommand = defineCommand218({
52582
+ var feedCommand = defineCommand219({
52440
52583
  meta: {
52441
52584
  name: "feed",
52442
52585
  description: "Winners across every brand you follow (browse, then trim per advertiser). Example: baker winning-ads feed --per-advertiser 5 --output md"
@@ -52521,7 +52664,7 @@ var feedCommand = defineCommand218({
52521
52664
  });
52522
52665
 
52523
52666
  // src/commands/winning-ads/follow.ts
52524
- import { defineCommand as defineCommand219 } from "citty";
52667
+ import { defineCommand as defineCommand220 } from "citty";
52525
52668
  var PLATFORMS = ["meta", "linkedin"];
52526
52669
  registerSchema({
52527
52670
  command: "winning-ads.follow",
@@ -52536,7 +52679,7 @@ registerSchema({
52536
52679
  label: { type: "string", description: "Optional display label (defaults to the resolved name)", required: false }
52537
52680
  }
52538
52681
  });
52539
- var followCommand = defineCommand219({
52682
+ var followCommand = defineCommand220({
52540
52683
  meta: {
52541
52684
  name: "follow",
52542
52685
  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 +52726,7 @@ var followCommand = defineCommand219({
52583
52726
  });
52584
52727
 
52585
52728
  // src/commands/winning-ads/follow-competitors.ts
52586
- import { defineCommand as defineCommand220 } from "citty";
52729
+ import { defineCommand as defineCommand221 } from "citty";
52587
52730
  var PLATFORMS2 = ["meta", "linkedin"];
52588
52731
  var BATCH_TIMEOUT_MS = 3e5;
52589
52732
  function buildFollowBatchBody(input) {
@@ -52616,7 +52759,7 @@ registerSchema({
52616
52759
  }
52617
52760
  }
52618
52761
  });
52619
- var followCompetitorsCommand = defineCommand220({
52762
+ var followCompetitorsCommand = defineCommand221({
52620
52763
  meta: {
52621
52764
  name: "follow-competitors",
52622
52765
  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 +52834,7 @@ var followCompetitorsCommand = defineCommand220({
52691
52834
  });
52692
52835
 
52693
52836
  // src/commands/winning-ads/following.ts
52694
- import { defineCommand as defineCommand221 } from "citty";
52837
+ import { defineCommand as defineCommand222 } from "citty";
52695
52838
  registerSchema({
52696
52839
  command: "winning-ads.following",
52697
52840
  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 +52888,7 @@ function followingNormalizer(record, full) {
52745
52888
  platforms: Array.isArray(record.platforms) ? record.platforms : []
52746
52889
  };
52747
52890
  }
52748
- var followingCommand = defineCommand221({
52891
+ var followingCommand = defineCommand222({
52749
52892
  meta: {
52750
52893
  name: "following",
52751
52894
  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 +52924,7 @@ var followingCommand = defineCommand221({
52781
52924
  });
52782
52925
 
52783
52926
  // src/commands/winning-ads/patterns.ts
52784
- import { defineCommand as defineCommand222 } from "citty";
52927
+ import { defineCommand as defineCommand223 } from "citty";
52785
52928
  registerSchema({
52786
52929
  command: "winning-ads.patterns",
52787
52930
  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 +52963,7 @@ function discriminatorRow(record) {
52820
52963
  top_values_duds: Array.isArray(record.top_values_b) ? record.top_values_b.join(", ") : ""
52821
52964
  };
52822
52965
  }
52823
- var patternsCommand = defineCommand222({
52966
+ var patternsCommand = defineCommand223({
52824
52967
  meta: {
52825
52968
  name: "patterns",
52826
52969
  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 +53019,7 @@ var patternsCommand = defineCommand222({
52876
53019
  });
52877
53020
 
52878
53021
  // src/commands/winning-ads/search.ts
52879
- import { defineCommand as defineCommand223 } from "citty";
53022
+ import { defineCommand as defineCommand224 } from "citty";
52880
53023
  registerSchema({
52881
53024
  command: "winning-ads.search",
52882
53025
  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 +53127,7 @@ function buildSearchBody2(args) {
52984
53127
  }
52985
53128
  return body;
52986
53129
  }
52987
- var searchCommand5 = defineCommand223({
53130
+ var searchCommand5 = defineCommand224({
52988
53131
  meta: {
52989
53132
  name: "search",
52990
53133
  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 +53242,7 @@ var searchCommand5 = defineCommand223({
53099
53242
  });
53100
53243
 
53101
53244
  // src/commands/winning-ads/seeds.ts
53102
- import { defineCommand as defineCommand224 } from "citty";
53245
+ import { defineCommand as defineCommand225 } from "citty";
53103
53246
  function leanRow(r) {
53104
53247
  return {
53105
53248
  key: r.key,
@@ -53127,7 +53270,7 @@ function makeSeedCommand(opts) {
53127
53270
  limit: { type: "number", description: "Max keys 1-100 (default 20)", required: false, default: 20 }
53128
53271
  }
53129
53272
  });
53130
- return defineCommand224({
53273
+ return defineCommand225({
53131
53274
  meta: { name: opts.name, description: opts.description },
53132
53275
  args: {
53133
53276
  platform: { type: "string", description: "Single platform to segment on", required: false },
@@ -53176,7 +53319,7 @@ var formatsCommand = makeSeedCommand({
53176
53319
  });
53177
53320
 
53178
53321
  // src/commands/winning-ads/unfollow.ts
53179
- import { defineCommand as defineCommand225 } from "citty";
53322
+ import { defineCommand as defineCommand226 } from "citty";
53180
53323
  registerSchema({
53181
53324
  command: "winning-ads.unfollow",
53182
53325
  description: "Stop following a brand \u2014 removes it from your ad-dna library by advertiser id.",
@@ -53184,7 +53327,7 @@ registerSchema({
53184
53327
  advertiser: { type: "string", description: "Advertiser id to unfollow", required: true }
53185
53328
  }
53186
53329
  });
53187
- var unfollowCommand = defineCommand225({
53330
+ var unfollowCommand = defineCommand226({
53188
53331
  meta: {
53189
53332
  name: "unfollow",
53190
53333
  description: "Stop following a brand by advertiser id. Example: baker winning-ads unfollow adv_123"
@@ -53205,7 +53348,7 @@ var unfollowCommand = defineCommand225({
53205
53348
  });
53206
53349
 
53207
53350
  // src/commands/winning-ads/winners.ts
53208
- import { defineCommand as defineCommand226 } from "citty";
53351
+ import { defineCommand as defineCommand227 } from "citty";
53209
53352
  registerSchema({
53210
53353
  command: "winning-ads.winners",
53211
53354
  description: "Top winning ads for one advertiser id (from `advertisers` or `following`). Returns lean winner cards; add --full for DNA + longevity.",
@@ -53215,7 +53358,7 @@ registerSchema({
53215
53358
  platform: { type: "string", description: "Filter to a single platform: meta|linkedin", required: false }
53216
53359
  }
53217
53360
  });
53218
- var winnersCommand = defineCommand226({
53361
+ var winnersCommand = defineCommand227({
53219
53362
  meta: {
53220
53363
  name: "winners",
53221
53364
  description: "Top winning ads for a specific advertiser id. Example: baker winning-ads winners adv_123 --top 15 --output md"
@@ -53265,7 +53408,7 @@ var winnersCommand = defineCommand226({
53265
53408
  });
53266
53409
 
53267
53410
  // src/commands/winning-ads/index.ts
53268
- var winningAdsCommand = defineCommand227({
53411
+ var winningAdsCommand = defineCommand228({
53269
53412
  meta: {
53270
53413
  name: "winning-ads",
53271
53414
  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 +53646,7 @@ function getCliVersion() {
53503
53646
  }
53504
53647
 
53505
53648
  // src/cli.ts
53506
- var main = defineCommand228({
53649
+ var main = defineCommand229({
53507
53650
  meta: {
53508
53651
  name: "baker",
53509
53652
  version: getCliVersion(),