@koda-sl/baker-cli 0.279.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 } : {},
@@ -33126,6 +33255,9 @@ async function readBrandFromWorkspace(root = ".") {
33126
33255
  }
33127
33256
  return found;
33128
33257
  }
33258
+ function svgIsLiveText(svg) {
33259
+ return /<text[\s>]/i.test(svg);
33260
+ }
33129
33261
 
33130
33262
  // src/commands/canvas/composition-path.ts
33131
33263
  import { existsSync as existsSync4 } from "fs";
@@ -33173,7 +33305,7 @@ registerSchema({
33173
33305
  }
33174
33306
  }
33175
33307
  });
33176
- var scaffoldAdCommand = defineCommand104({
33308
+ var scaffoldAdCommand = defineCommand105({
33177
33309
  meta: {
33178
33310
  name: "scaffold-ad",
33179
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>'
@@ -33265,6 +33397,20 @@ var scaffoldAdCommand = defineCommand104({
33265
33397
  ...filledPalette ? { palette: filledPalette } : {}
33266
33398
  };
33267
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
+ }
33268
33414
  const speaksOnCamera = spec.data.beats.some((beat) => beat.on_camera === true);
33269
33415
  if (avatar && !avatar.voiceId && speaksOnCamera) {
33270
33416
  writeJson({
@@ -33272,7 +33418,7 @@ var scaffoldAdCommand = defineCommand104({
33272
33418
  error: {
33273
33419
  code: "VALIDATION_ERROR",
33274
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.`,
33275
- 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.`
33276
33422
  }
33277
33423
  });
33278
33424
  process.exit(1);
@@ -33292,6 +33438,21 @@ var scaffoldAdCommand = defineCommand104({
33292
33438
  process.exit(1);
33293
33439
  return;
33294
33440
  }
33441
+ if (resolvedLogo?.toLowerCase().endsWith(".svg")) {
33442
+ const svg = await readFile16(resolvedLogo, "utf-8").catch(() => "");
33443
+ if (svg && svgIsLiveText(svg)) {
33444
+ writeJson({
33445
+ ok: false,
33446
+ error: {
33447
+ code: "VALIDATION_ERROR",
33448
+ message: `The mark at \`${resolvedLogo}\` draws its wordmark with live \`<text>\`, not outlines. That is a typed stand-in, not a logo: it renders in whatever font the machine happens to have, and the one that shipped this way came out reading "greenle\xE1" in every frame.`,
33449
+ fix: `Ask the client for their real logo file and put it in \`${BRAND_DIR}/logos/\` \u2014 an outlined SVG, or a PNG at 1000px or wider. Do not redraw it.`
33450
+ }
33451
+ });
33452
+ process.exit(1);
33453
+ return;
33454
+ }
33455
+ }
33295
33456
  const blueprint = adSpecToBlueprint(spec.data);
33296
33457
  const slug = args.slug ?? path24.basename(specPath).replace(/\.[^.]+$/, "");
33297
33458
  const outPath = args.out ?? (args.slug ? path24.join("src/creatives", slug, `${slug}.canvas.json`) : path24.join(path24.dirname(specPath), `${slug}.canvas.json`));
@@ -33424,7 +33585,7 @@ var scaffoldAdCommand = defineCommand104({
33424
33585
  import { access as access2, cp as cp2, mkdir as mkdir8, readFile as readFile19, rm as rm7, writeFile as writeFile10 } from "fs/promises";
33425
33586
  import { tmpdir as tmpdir3 } from "os";
33426
33587
  import path26 from "path";
33427
- import { defineCommand as defineCommand105 } from "citty";
33588
+ import { defineCommand as defineCommand106 } from "citty";
33428
33589
 
33429
33590
  // src/engine/scaffold/lib/model-router.ts
33430
33591
  var SEEDANCE = "bytedance/seedance-2.0";
@@ -33869,7 +34030,7 @@ async function runAnalysisPasses(deconstructCanvas, selectModel) {
33869
34030
  return fail4("deconstruct", e instanceof Error ? e.message : String(e));
33870
34031
  }
33871
34032
  }
33872
- var scaffoldVideoCommand = defineCommand105({
34033
+ var scaffoldVideoCommand = defineCommand106({
33873
34034
  meta: {
33874
34035
  name: "scaffold-video",
33875
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`."
@@ -34179,7 +34340,7 @@ var scaffoldVideoCommand = defineCommand105({
34179
34340
  // src/commands/canvas/set-prompt.ts
34180
34341
  import { readFile as readFile20, writeFile as writeFile11 } from "fs/promises";
34181
34342
  import path27 from "path";
34182
- import { defineCommand as defineCommand106 } from "citty";
34343
+ import { defineCommand as defineCommand107 } from "citty";
34183
34344
  function setNodePrompt(canvas, nodeId, text2) {
34184
34345
  const nodes = canvas?.nodes;
34185
34346
  if (!Array.isArray(nodes)) throw new Error("canvas has no nodes array");
@@ -34194,7 +34355,7 @@ function setNodePrompt(canvas, nodeId, text2) {
34194
34355
  newNodes[idx] = newNode;
34195
34356
  return { ...canvas, nodes: newNodes };
34196
34357
  }
34197
- var setPromptCommand = defineCommand106({
34358
+ var setPromptCommand = defineCommand107({
34198
34359
  meta: {
34199
34360
  name: "set-prompt",
34200
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."
@@ -34254,8 +34415,8 @@ var setPromptCommand = defineCommand106({
34254
34415
  // src/commands/canvas/validate.ts
34255
34416
  import { readFile as readFile21 } from "fs/promises";
34256
34417
  import path28 from "path";
34257
- import { defineCommand as defineCommand107 } from "citty";
34258
- var validateCommand = defineCommand107({
34418
+ import { defineCommand as defineCommand108 } from "citty";
34419
+ var validateCommand = defineCommand108({
34259
34420
  meta: {
34260
34421
  name: "validate",
34261
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)."
@@ -34328,7 +34489,7 @@ var validateCommand = defineCommand107({
34328
34489
  });
34329
34490
 
34330
34491
  // src/commands/canvas/index.ts
34331
- var canvasCommand = defineCommand108({
34492
+ var canvasCommand = defineCommand109({
34332
34493
  meta: {
34333
34494
  name: "canvas",
34334
34495
  description: `Run Baker creative canvas JSON files locally. Local nodes execute in-process; remote nodes POST to the Convex backend gateway.
@@ -34364,7 +34525,7 @@ Full guide: __tooling__/docs/tools/baker/canvas.md`
34364
34525
  });
34365
34526
 
34366
34527
  // src/commands/capabilities/index.ts
34367
- import { defineCommand as defineCommand109 } from "citty";
34528
+ import { defineCommand as defineCommand110 } from "citty";
34368
34529
  registerSchema({
34369
34530
  command: "capabilities",
34370
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.",
@@ -34407,7 +34568,7 @@ function capabilityHints(surfaces) {
34407
34568
  }
34408
34569
  return hints;
34409
34570
  }
34410
- var runCapabilities = defineCommand109({
34571
+ var runCapabilities = defineCommand110({
34411
34572
  meta: {
34412
34573
  name: "capabilities",
34413
34574
  description: `What Baker can and cannot do for this company, before any work starts.
@@ -34463,7 +34624,7 @@ Full guide: __tooling__/docs/tools/baker/capabilities.md`
34463
34624
  var capabilitiesCommand = runCapabilities;
34464
34625
 
34465
34626
  // src/commands/chats/index.ts
34466
- import { defineCommand as defineCommand110 } from "citty";
34627
+ import { defineCommand as defineCommand111 } from "citty";
34467
34628
  var STATUS_GROUPS = ["active", "archived", "all"];
34468
34629
  var REPO_SURFACES = ["knowledge", "company", "brand", "landings", "flows", "creatives"];
34469
34630
  function parseBoundedInt(raw, name, min, max) {
@@ -34485,7 +34646,7 @@ registerSchema({
34485
34646
  full: { type: "boolean", description: "Include each Session's full change list", required: false, default: false }
34486
34647
  }
34487
34648
  });
34488
- var listCommand11 = defineCommand110({
34649
+ var listCommand11 = defineCommand111({
34489
34650
  meta: { name: "list", description: "List other Sessions on this account, newest first." },
34490
34651
  args: {
34491
34652
  status: { type: "string", description: "Filter: active|archived|all (default: all)", required: false },
@@ -34540,7 +34701,7 @@ registerSchema({
34540
34701
  }
34541
34702
  }
34542
34703
  });
34543
- var viewCommand = defineCommand110({
34704
+ var viewCommand = defineCommand111({
34544
34705
  meta: {
34545
34706
  name: "view",
34546
34707
  description: "Inspect one Session's full effects \u2014 git content + actions/tags/ads, kickoff, commits."
@@ -34584,7 +34745,7 @@ registerSchema({
34584
34745
  }
34585
34746
  }
34586
34747
  });
34587
- var transcriptCommand = defineCommand110({
34748
+ var transcriptCommand = defineCommand111({
34588
34749
  meta: { name: "transcript", description: "Read another Session's conversation." },
34589
34750
  args: {
34590
34751
  id: { type: "positional", description: "The Session id", required: true },
@@ -34636,7 +34797,7 @@ registerSchema({
34636
34797
  }
34637
34798
  }
34638
34799
  });
34639
- var diffCommand = defineCommand110({
34800
+ var diffCommand = defineCommand111({
34640
34801
  meta: { name: "diff", description: "See a published Session's real file-level changes." },
34641
34802
  args: {
34642
34803
  id: { type: "positional", description: "The Session id", required: true },
@@ -34680,7 +34841,7 @@ var diffCommand = defineCommand110({
34680
34841
  }
34681
34842
  }
34682
34843
  });
34683
- var chatsCommand = defineCommand110({
34844
+ var chatsCommand = defineCommand111({
34684
34845
  meta: {
34685
34846
  name: "chats",
34686
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.
@@ -34695,10 +34856,10 @@ Full guide: __tooling__/docs/tools/baker/chats.md`
34695
34856
  });
34696
34857
 
34697
34858
  // src/commands/creatives/index.ts
34698
- import { defineCommand as defineCommand112 } from "citty";
34859
+ import { defineCommand as defineCommand113 } from "citty";
34699
34860
 
34700
34861
  // src/commands/creatives/publish.ts
34701
- import { defineCommand as defineCommand111 } from "citty";
34862
+ import { defineCommand as defineCommand112 } from "citty";
34702
34863
 
34703
34864
  // src/commands/images/api.ts
34704
34865
  import { readFile as readFile22 } from "fs/promises";
@@ -34845,7 +35006,7 @@ async function publishCreative(args, deps = defaultImageApiDeps) {
34845
35006
  chatId: chatIdFromEnv2()
34846
35007
  });
34847
35008
  }
34848
- var publishCommand = defineCommand111({
35009
+ var publishCommand = defineCommand112({
34849
35010
  meta: {
34850
35011
  name: "publish",
34851
35012
  description: "Publish a final static creative image to Baker Creatives and print the creative reference JSON."
@@ -34903,7 +35064,7 @@ var publishCommand = defineCommand111({
34903
35064
  });
34904
35065
 
34905
35066
  // src/commands/creatives/index.ts
34906
- var creativesCommand3 = defineCommand112({
35067
+ var creativesCommand3 = defineCommand113({
34907
35068
  meta: {
34908
35069
  name: "creatives",
34909
35070
  description: `Publish static ad creatives as first-class Baker outputs.
@@ -34920,11 +35081,11 @@ Full guide: __tooling__/docs/tools/baker/creatives.md`
34920
35081
  });
34921
35082
 
34922
35083
  // src/commands/flows/index.ts
34923
- import { defineCommand as defineCommand117 } from "citty";
35084
+ import { defineCommand as defineCommand118 } from "citty";
34924
35085
 
34925
35086
  // src/commands/flows/add.ts
34926
35087
  import { randomUUID } from "crypto";
34927
- import { defineCommand as defineCommand113 } from "citty";
35088
+ import { defineCommand as defineCommand114 } from "citty";
34928
35089
 
34929
35090
  // src/commands/flows/shared.ts
34930
35091
  import { existsSync as existsSync5, readdirSync as readdirSync2, readFileSync as readFileSync9, writeFileSync as writeFileSync3 } from "fs";
@@ -35134,7 +35295,7 @@ registerSchema({
35134
35295
  parent: { type: "string", description: "Parent node id. Omit to append to the root's children.", required: false }
35135
35296
  }
35136
35297
  });
35137
- var addNodeCommand = defineCommand113({
35298
+ var addNodeCommand = defineCommand114({
35138
35299
  meta: {
35139
35300
  name: "add-node",
35140
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"'
@@ -35230,7 +35391,7 @@ registerSchema({
35230
35391
  }
35231
35392
  }
35232
35393
  });
35233
- var addSideEffectCommand = defineCommand113({
35394
+ var addSideEffectCommand = defineCommand114({
35234
35395
  meta: {
35235
35396
  name: "add-side-effect",
35236
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"
@@ -35312,7 +35473,7 @@ var addSideEffectCommand = defineCommand113({
35312
35473
 
35313
35474
  // src/commands/flows/map.ts
35314
35475
  import { readFileSync as readFileSync11 } from "fs";
35315
- import { defineCommand as defineCommand114 } from "citty";
35476
+ import { defineCommand as defineCommand115 } from "citty";
35316
35477
 
35317
35478
  // src/commands/flows/value-expression.ts
35318
35479
  import { existsSync as existsSync6, readFileSync as readFileSync10 } from "fs";
@@ -36085,7 +36246,7 @@ async function mapOptions(args, fromFile, into) {
36085
36246
  destinationFields: hubspotForm ? await hubspotFieldCatalog(hubspotForm) : void 0
36086
36247
  };
36087
36248
  }
36088
- var mapCommand2 = defineCommand114({
36249
+ var mapCommand2 = defineCommand115({
36089
36250
  meta: {
36090
36251
  name: "map",
36091
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"
@@ -36183,7 +36344,7 @@ var mapCommand2 = defineCommand114({
36183
36344
  });
36184
36345
 
36185
36346
  // src/commands/flows/normalize.ts
36186
- import { defineCommand as defineCommand115 } from "citty";
36347
+ import { defineCommand as defineCommand116 } from "citty";
36187
36348
  var OPTIONAL_STRINGS = ["oauthProviderId"];
36188
36349
  var ARRAY_FIELDS = [
36189
36350
  "fieldMapping",
@@ -36252,7 +36413,7 @@ registerSchema({
36252
36413
  }
36253
36414
  }
36254
36415
  });
36255
- var normalizeCommand = defineCommand115({
36416
+ var normalizeCommand = defineCommand116({
36256
36417
  meta: {
36257
36418
  name: "normalize",
36258
36419
  description: "Repair the shapes a form file is allowed to get slightly wrong. Example: baker flows normalize contact --write"
@@ -36283,7 +36444,7 @@ var normalizeCommand = defineCommand115({
36283
36444
  });
36284
36445
 
36285
36446
  // src/commands/flows/schema.ts
36286
- import { defineCommand as defineCommand116 } from "citty";
36447
+ import { defineCommand as defineCommand117 } from "citty";
36287
36448
  registerSchema({
36288
36449
  command: "flows.schema",
36289
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.",
@@ -36308,7 +36469,7 @@ function triggerHints(triggers) {
36308
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(", ")}.` : "")
36309
36470
  ];
36310
36471
  }
36311
- var schemaCommand = defineCommand116({
36472
+ var schemaCommand = defineCommand117({
36312
36473
  meta: {
36313
36474
  name: "schema",
36314
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)"
@@ -36442,7 +36603,7 @@ function displayName(slug) {
36442
36603
  const name = tree.displayName;
36443
36604
  return typeof name === "string" && name.trim() ? name.trim() : slug;
36444
36605
  }
36445
- var listCommand12 = defineCommand117({
36606
+ var listCommand12 = defineCommand118({
36446
36607
  meta: {
36447
36608
  name: "list",
36448
36609
  description: "List Forms in this workspace with the count of confidential fields still needing setup. Example: baker flows list"
@@ -36463,7 +36624,7 @@ var listCommand12 = defineCommand117({
36463
36624
  });
36464
36625
  }
36465
36626
  });
36466
- var showCommand3 = defineCommand117({
36627
+ var showCommand3 = defineCommand118({
36467
36628
  meta: {
36468
36629
  name: "show",
36469
36630
  description: "Show a Form's confidential fields and their configuration status (never secret values). Example: baker flows show contact"
@@ -36491,7 +36652,7 @@ var showCommand3 = defineCommand117({
36491
36652
  });
36492
36653
  }
36493
36654
  });
36494
- var flowsCommand = defineCommand117({
36655
+ var flowsCommand = defineCommand118({
36495
36656
  meta: {
36496
36657
  name: "flows",
36497
36658
  description: `Read and shape this workspace's Forms (flows).
@@ -36525,10 +36686,10 @@ Full guide: __tooling__/docs/tools/baker/flows.md`
36525
36686
  });
36526
36687
 
36527
36688
  // src/commands/ga4/index.ts
36528
- import { defineCommand as defineCommand124 } from "citty";
36689
+ import { defineCommand as defineCommand125 } from "citty";
36529
36690
 
36530
36691
  // src/commands/ga4/audit.ts
36531
- import { defineCommand as defineCommand118 } from "citty";
36692
+ import { defineCommand as defineCommand119 } from "citty";
36532
36693
 
36533
36694
  // src/commands/ga4/resolve.ts
36534
36695
  async function fetchProperties(useCache = true) {
@@ -36594,7 +36755,7 @@ registerSchema({
36594
36755
  "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false }
36595
36756
  }
36596
36757
  });
36597
- var auditCommand2 = defineCommand118({
36758
+ var auditCommand2 = defineCommand119({
36598
36759
  meta: {
36599
36760
  name: "audit",
36600
36761
  description: `Run all GA4 admin health checks. Returns property config with playbook warnings.
@@ -36649,7 +36810,7 @@ Examples:
36649
36810
  });
36650
36811
 
36651
36812
  // src/commands/ga4/config.ts
36652
- import { defineCommand as defineCommand119 } from "citty";
36813
+ import { defineCommand as defineCommand120 } from "citty";
36653
36814
 
36654
36815
  // src/commands/ga4/shared.ts
36655
36816
  import { readFileSync as readFileSync12 } from "fs";
@@ -36845,7 +37006,7 @@ function configHints(config) {
36845
37006
  }
36846
37007
  return hints;
36847
37008
  }
36848
- var configCommand = defineCommand119({
37009
+ var configCommand = defineCommand120({
36849
37010
  meta: {
36850
37011
  name: "config",
36851
37012
  description: `Read how the property is configured to measure \u2014 key events, custom definitions, custom events, retention
@@ -36877,7 +37038,7 @@ Examples:
36877
37038
  });
36878
37039
 
36879
37040
  // src/commands/ga4/draft.ts
36880
- import { defineCommand as defineCommand120 } from "citty";
37041
+ import { defineCommand as defineCommand121 } from "citty";
36881
37042
  registerSchema({
36882
37043
  command: "ga4.draft",
36883
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.",
@@ -36886,13 +37047,13 @@ registerSchema({
36886
37047
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
36887
37048
  }
36888
37049
  });
36889
- var draftCommand3 = defineCommand120({
37050
+ var draftCommand3 = defineCommand121({
36890
37051
  meta: {
36891
37052
  name: "draft",
36892
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."
36893
37054
  },
36894
37055
  subCommands: {
36895
- list: defineCommand120({
37056
+ list: defineCommand121({
36896
37057
  meta: { name: "list", description: "Review everything staged on this chat (--json for the raw envelope)" },
36897
37058
  args: {
36898
37059
  json: { type: "boolean", description: "Print the raw JSON envelope", required: false },
@@ -36902,7 +37063,7 @@ var draftCommand3 = defineCommand120({
36902
37063
  await draftList(args.json === true, args.chat);
36903
37064
  }
36904
37065
  }),
36905
- show: defineCommand120({
37066
+ show: defineCommand121({
36906
37067
  meta: {
36907
37068
  name: "show",
36908
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)."
@@ -36919,7 +37080,7 @@ var draftCommand3 = defineCommand120({
36919
37080
  );
36920
37081
  }
36921
37082
  }),
36922
- amend: defineCommand120({
37083
+ amend: defineCommand121({
36923
37084
  meta: {
36924
37085
  name: "amend",
36925
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."
@@ -36936,7 +37097,7 @@ var draftCommand3 = defineCommand120({
36936
37097
  });
36937
37098
  }
36938
37099
  }),
36939
- remove: defineCommand120({
37100
+ remove: defineCommand121({
36940
37101
  meta: { name: "remove", description: "Remove one staged change" },
36941
37102
  args: { ref: { type: "positional", description: "Staged ref or target id", required: false } },
36942
37103
  run: async ({ args }) => {
@@ -36945,7 +37106,7 @@ var draftCommand3 = defineCommand120({
36945
37106
  });
36946
37107
  }
36947
37108
  }),
36948
- clear: defineCommand120({
37109
+ clear: defineCommand121({
36949
37110
  meta: { name: "clear", description: "Discard all Google Analytics changes staged on this chat" },
36950
37111
  run: async () => {
36951
37112
  await draftAction2("/api/ga4/draft/clear", {});
@@ -36955,7 +37116,7 @@ var draftCommand3 = defineCommand120({
36955
37116
  });
36956
37117
 
36957
37118
  // src/commands/ga4/properties.ts
36958
- import { defineCommand as defineCommand121 } from "citty";
37119
+ import { defineCommand as defineCommand122 } from "citty";
36959
37120
  registerSchema({
36960
37121
  command: "ga4.properties",
36961
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.",
@@ -36971,7 +37132,7 @@ function propertyHints(properties) {
36971
37132
  resources: properties.map((property) => ({ id: property.externalId, label: property.name }))
36972
37133
  });
36973
37134
  }
36974
- var propertiesCommand = defineCommand121({
37135
+ var propertiesCommand = defineCommand122({
36975
37136
  meta: {
36976
37137
  name: "properties",
36977
37138
  description: `List accessible GA4 properties.
@@ -37021,7 +37182,7 @@ Examples:
37021
37182
  // src/commands/ga4/query.ts
37022
37183
  import { appendFileSync as appendFileSync2, existsSync as existsSync7, readFileSync as readFileSync13, writeFileSync as writeFileSync4 } from "fs";
37023
37184
  import { resolve as resolve2 } from "path";
37024
- import { defineCommand as defineCommand122 } from "citty";
37185
+ import { defineCommand as defineCommand123 } from "citty";
37025
37186
 
37026
37187
  // src/commands/ga4/presets.ts
37027
37188
  var GA4_PRESETS = [
@@ -37156,7 +37317,7 @@ function handleError3(err) {
37156
37317
  });
37157
37318
  process.exit(1);
37158
37319
  }
37159
- var queryCommand2 = defineCommand122({
37320
+ var queryCommand2 = defineCommand123({
37160
37321
  meta: {
37161
37322
  name: "query",
37162
37323
  description: `Run GA4 Data API reports. Preset-first with free-form escape hatch.
@@ -37227,7 +37388,7 @@ Free-form (escape hatch):
37227
37388
  });
37228
37389
 
37229
37390
  // src/commands/ga4/write-commands.ts
37230
- import { defineCommand as defineCommand123 } from "citty";
37391
+ import { defineCommand as defineCommand124 } from "citty";
37231
37392
  var PROPERTY_ARG_DESCRIPTION = "GA4 property id (optional only when one property is connected \u2014 run `baker ga4 properties`)";
37232
37393
  var propertyArg = { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false };
37233
37394
  function createJsonDescription(noun) {
@@ -37245,7 +37406,7 @@ registerSchema({
37245
37406
  "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
37246
37407
  }
37247
37408
  });
37248
- var keyEventCommand = defineCommand123({
37409
+ var keyEventCommand = defineCommand124({
37249
37410
  meta: {
37250
37411
  name: "key-event",
37251
37412
  description: `Stage key-event (conversion) changes
@@ -37258,7 +37419,7 @@ Examples:
37258
37419
  baker ga4 key-event delete 4185`
37259
37420
  },
37260
37421
  subCommands: {
37261
- create: defineCommand123({
37422
+ create: defineCommand124({
37262
37423
  meta: {
37263
37424
  name: "create",
37264
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."
@@ -37279,7 +37440,7 @@ Examples:
37279
37440
  );
37280
37441
  }
37281
37442
  }),
37282
- update: defineCommand123({
37443
+ update: defineCommand124({
37283
37444
  meta: {
37284
37445
  name: "update",
37285
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."
@@ -37299,7 +37460,7 @@ Examples:
37299
37460
  });
37300
37461
  }
37301
37462
  }),
37302
- delete: defineCommand123({
37463
+ delete: defineCommand124({
37303
37464
  meta: {
37304
37465
  name: "delete",
37305
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."
@@ -37347,7 +37508,7 @@ for (const { kind, noun, createHint } of DEFINITIONS) {
37347
37508
  }
37348
37509
  function definitionCommand(definition) {
37349
37510
  const { command, kind, noun, example } = definition;
37350
- return defineCommand123({
37511
+ return defineCommand124({
37351
37512
  meta: {
37352
37513
  name: command,
37353
37514
  description: `Stage ${noun} changes
@@ -37359,7 +37520,7 @@ Examples:
37359
37520
  baker ga4 ${command} archive 12`
37360
37521
  },
37361
37522
  subCommands: {
37362
- create: defineCommand123({
37523
+ create: defineCommand124({
37363
37524
  meta: { name: "create", description: `Stage a new ${noun} (or a JSON array of them, staged together)` },
37364
37525
  args: {
37365
37526
  json: { type: "string", description: createJsonDescription(noun), required: false },
@@ -37377,7 +37538,7 @@ Examples:
37377
37538
  );
37378
37539
  }
37379
37540
  }),
37380
- update: defineCommand123({
37541
+ update: defineCommand124({
37381
37542
  meta: {
37382
37543
  name: "update",
37383
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.`
@@ -37397,7 +37558,7 @@ Examples:
37397
37558
  });
37398
37559
  }
37399
37560
  }),
37400
- archive: defineCommand123({
37561
+ archive: defineCommand124({
37401
37562
  meta: {
37402
37563
  name: "archive",
37403
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.`
@@ -37442,7 +37603,7 @@ var dataStreamArg = {
37442
37603
  function withStream(args) {
37443
37604
  return typeof args["data-stream"] === "string" ? { dataStream: args["data-stream"] } : {};
37444
37605
  }
37445
- var customEventCommand = defineCommand123({
37606
+ var customEventCommand = defineCommand124({
37446
37607
  meta: {
37447
37608
  name: "custom-event",
37448
37609
  description: `Stage custom events \u2014 new events built from events the site already sends
@@ -37453,7 +37614,7 @@ Examples:
37453
37614
  baker ga4 custom-event delete 7`
37454
37615
  },
37455
37616
  subCommands: {
37456
- create: defineCommand123({
37617
+ create: defineCommand124({
37457
37618
  meta: {
37458
37619
  name: "create",
37459
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."
@@ -37476,7 +37637,7 @@ Examples:
37476
37637
  );
37477
37638
  }
37478
37639
  }),
37479
- update: defineCommand123({
37640
+ update: defineCommand124({
37480
37641
  meta: { name: "update", description: "Stage a change to an existing custom event (pass its id)" },
37481
37642
  args: {
37482
37643
  id: { type: "positional", description: "Custom event rule id", required: false },
@@ -37495,7 +37656,7 @@ Examples:
37495
37656
  });
37496
37657
  }
37497
37658
  }),
37498
- delete: defineCommand123({
37659
+ delete: defineCommand124({
37499
37660
  meta: {
37500
37661
  name: "delete",
37501
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."
@@ -37550,7 +37711,7 @@ function booleanArg(input, flag) {
37550
37711
  if (input === "false") return false;
37551
37712
  return failValidation3(`--${flag} must be true or false`);
37552
37713
  }
37553
- var dataRetentionCommand = defineCommand123({
37714
+ var dataRetentionCommand = defineCommand124({
37554
37715
  meta: {
37555
37716
  name: "data-retention",
37556
37717
  description: `Stage a change to how long Google Analytics keeps data
@@ -37560,7 +37721,7 @@ Examples:
37560
37721
  baker ga4 data-retention set --event-data 14 --user-data 14 --reset-on-activity true`
37561
37722
  },
37562
37723
  subCommands: {
37563
- set: defineCommand123({
37724
+ set: defineCommand124({
37564
37725
  meta: { name: "set", description: "Stage the retention window (months)" },
37565
37726
  args: {
37566
37727
  "event-data": { type: "string", description: "2, 14, 26, 38 or 50", required: false },
@@ -37596,7 +37757,7 @@ registerSchema({
37596
37757
  "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
37597
37758
  }
37598
37759
  });
37599
- var audienceCommand = defineCommand123({
37760
+ var audienceCommand = defineCommand124({
37600
37761
  meta: {
37601
37762
  name: "audience",
37602
37763
  description: `Stage audience changes (saved groups of users, for retargeting and analysis)
@@ -37628,7 +37789,7 @@ Examples:
37628
37789
  baker ga4 audience archive 8813`
37629
37790
  },
37630
37791
  subCommands: {
37631
- create: defineCommand123({
37792
+ create: defineCommand124({
37632
37793
  meta: { name: "create", description: createJsonDescription("audience") },
37633
37794
  args: {
37634
37795
  json: { type: "string", description: createJsonDescription("audience"), required: false },
@@ -37646,7 +37807,7 @@ Examples:
37646
37807
  );
37647
37808
  }
37648
37809
  }),
37649
- update: defineCommand123({
37810
+ update: defineCommand124({
37650
37811
  meta: {
37651
37812
  name: "update",
37652
37813
  description: "Stage a new name or description (pass the audience id). Who is in it cannot be changed."
@@ -37667,7 +37828,7 @@ Examples:
37667
37828
  });
37668
37829
  }
37669
37830
  }),
37670
- archive: defineCommand123({
37831
+ archive: defineCommand124({
37671
37832
  meta: {
37672
37833
  name: "archive",
37673
37834
  description: "Stage retiring an audience. Cannot be undone \u2014 the users it gathered do not come back."
@@ -37696,7 +37857,7 @@ registerSchema({
37696
37857
  "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
37697
37858
  }
37698
37859
  });
37699
- var propertyCommand = defineCommand123({
37860
+ var propertyCommand = defineCommand124({
37700
37861
  meta: {
37701
37862
  name: "property",
37702
37863
  description: `Stage a change to the property's own settings
@@ -37706,7 +37867,7 @@ Examples:
37706
37867
  baker ga4 property set --name "Acme \u2014 Web" --industry REAL_ESTATE`
37707
37868
  },
37708
37869
  subCommands: {
37709
- set: defineCommand123({
37870
+ set: defineCommand124({
37710
37871
  meta: { name: "set", description: "Stage the property name and/or industry category" },
37711
37872
  args: {
37712
37873
  name: { type: "string", description: "New property display name", required: false },
@@ -37746,7 +37907,7 @@ registerSchema({
37746
37907
  "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
37747
37908
  }
37748
37909
  });
37749
- var adsLinkCommand = defineCommand123({
37910
+ var adsLinkCommand = defineCommand124({
37750
37911
  meta: {
37751
37912
  name: "ads-link",
37752
37913
  description: `Stage linking this property to a Google Ads account
@@ -37761,7 +37922,7 @@ Examples:
37761
37922
  baker ga4 ads-link delete L1234`
37762
37923
  },
37763
37924
  subCommands: {
37764
- create: defineCommand123({
37925
+ create: defineCommand124({
37765
37926
  meta: { name: "create", description: "Stage linking the property to a Google Ads account" },
37766
37927
  args: {
37767
37928
  "customer-id": { type: "string", description: "Google Ads customer id (123-456-7890)", required: false },
@@ -37780,7 +37941,7 @@ Examples:
37780
37941
  await stageOp3({ kind: "ga4.googleAdsLink.create", payload, ...withProperty(args) });
37781
37942
  }
37782
37943
  }),
37783
- update: defineCommand123({
37944
+ update: defineCommand124({
37784
37945
  meta: {
37785
37946
  name: "update",
37786
37947
  description: "Stage the ads-personalisation setting on an existing link (pass its id)"
@@ -37802,7 +37963,7 @@ Examples:
37802
37963
  });
37803
37964
  }
37804
37965
  }),
37805
- delete: defineCommand123({
37966
+ delete: defineCommand124({
37806
37967
  meta: {
37807
37968
  name: "delete",
37808
37969
  description: "Stage unlinking. Stops conversion imports and strands every audience on this property."
@@ -37853,7 +38014,7 @@ var MEASUREMENT_FLAGS = {
37853
38014
  "page-changes": "pageChangesEnabled",
37854
38015
  "form-interactions": "formInteractionsEnabled"
37855
38016
  };
37856
- var enhancedMeasurementCommand = defineCommand123({
38017
+ var enhancedMeasurementCommand = defineCommand124({
37857
38018
  meta: {
37858
38019
  name: "enhanced-measurement",
37859
38020
  description: `Stage the automatic events GA4 collects on a website stream
@@ -37867,7 +38028,7 @@ Examples:
37867
38028
  baker ga4 enhanced-measurement set --video false`
37868
38029
  },
37869
38030
  subCommands: {
37870
- set: defineCommand123({
38031
+ set: defineCommand124({
37871
38032
  meta: { name: "set", description: "Stage which automatic events the website stream collects" },
37872
38033
  args: {
37873
38034
  scrolls: { type: "string", description: "true|false", required: false },
@@ -37910,7 +38071,7 @@ Examples:
37910
38071
  });
37911
38072
 
37912
38073
  // src/commands/ga4/index.ts
37913
- var ga4Command = defineCommand124({
38074
+ var ga4Command = defineCommand125({
37914
38075
  meta: {
37915
38076
  name: "ga4",
37916
38077
  description: `Google Analytics 4. Report on a property, audit its config, and change what it measures.
@@ -37959,12 +38120,12 @@ Full guide: __tooling__/docs/tools/baker/ga4.md`
37959
38120
  });
37960
38121
 
37961
38122
  // src/commands/gsc/index.ts
37962
- import { defineCommand as defineCommand128 } from "citty";
38123
+ import { defineCommand as defineCommand129 } from "citty";
37963
38124
 
37964
38125
  // src/commands/gsc/query.ts
37965
38126
  import { appendFileSync as appendFileSync3, existsSync as existsSync8, readFileSync as readFileSync14, writeFileSync as writeFileSync5 } from "fs";
37966
38127
  import { resolve as resolve3 } from "path";
37967
- import { defineCommand as defineCommand125 } from "citty";
38128
+ import { defineCommand as defineCommand126 } from "citty";
37968
38129
 
37969
38130
  // src/commands/gsc/presets.ts
37970
38131
  var GSC_PRESETS = [
@@ -38158,7 +38319,7 @@ function handleError4(err) {
38158
38319
  });
38159
38320
  process.exit(1);
38160
38321
  }
38161
- var queryCommand3 = defineCommand125({
38322
+ var queryCommand3 = defineCommand126({
38162
38323
  meta: {
38163
38324
  name: "query",
38164
38325
  description: `Run GSC Search Analytics queries. Preset-first with free-form escape hatch.
@@ -38236,7 +38397,7 @@ Free-form (escape hatch):
38236
38397
  });
38237
38398
 
38238
38399
  // src/commands/gsc/sitemaps.ts
38239
- import { defineCommand as defineCommand126 } from "citty";
38400
+ import { defineCommand as defineCommand127 } from "citty";
38240
38401
  registerSchema({
38241
38402
  command: "gsc.sitemaps",
38242
38403
  description: "List sitemaps for a Search Console site. Check sitemap health and errors.",
@@ -38245,7 +38406,7 @@ registerSchema({
38245
38406
  "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false }
38246
38407
  }
38247
38408
  });
38248
- var sitemapsCommand = defineCommand126({
38409
+ var sitemapsCommand = defineCommand127({
38249
38410
  meta: {
38250
38411
  name: "sitemaps",
38251
38412
  description: `List sitemaps for a site. Check health and errors.
@@ -38298,7 +38459,7 @@ Examples:
38298
38459
  });
38299
38460
 
38300
38461
  // src/commands/gsc/sites.ts
38301
- import { defineCommand as defineCommand127 } from "citty";
38462
+ import { defineCommand as defineCommand128 } from "citty";
38302
38463
  registerSchema({
38303
38464
  command: "gsc.sites",
38304
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.",
@@ -38314,7 +38475,7 @@ function siteHints(sites) {
38314
38475
  resources: sites.map((site) => ({ id: site.siteUrl, label: site.permissionLevel }))
38315
38476
  });
38316
38477
  }
38317
- var sitesCommand = defineCommand127({
38478
+ var sitesCommand = defineCommand128({
38318
38479
  meta: {
38319
38480
  name: "sites",
38320
38481
  description: `List verified Search Console sites.
@@ -38362,7 +38523,7 @@ Examples:
38362
38523
  });
38363
38524
 
38364
38525
  // src/commands/gsc/index.ts
38365
- var gscCommand = defineCommand128({
38526
+ var gscCommand = defineCommand129({
38366
38527
  meta: {
38367
38528
  name: "gsc",
38368
38529
  description: `Google Search Console commands. PPC-SEO arbitrage, brand halo analysis, negative keyword discovery.
@@ -38386,7 +38547,7 @@ Full guide: __tooling__/docs/tools/baker/gsc.md`
38386
38547
  });
38387
38548
 
38388
38549
  // src/commands/history/index.ts
38389
- import { defineCommand as defineCommand129 } from "citty";
38550
+ import { defineCommand as defineCommand130 } from "citty";
38390
38551
  registerSchema({
38391
38552
  command: "history.list",
38392
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.",
@@ -38441,7 +38602,7 @@ function parseBoundedInt2(raw, name, min, max) {
38441
38602
  }
38442
38603
  return value;
38443
38604
  }
38444
- var listCommand13 = defineCommand129({
38605
+ var listCommand13 = defineCommand130({
38445
38606
  meta: {
38446
38607
  name: "list",
38447
38608
  description: "List recent account changes (unified audit log), newest first."
@@ -38487,7 +38648,7 @@ var listCommand13 = defineCommand129({
38487
38648
  }
38488
38649
  }
38489
38650
  });
38490
- var historyCommand = defineCommand129({
38651
+ var historyCommand = defineCommand130({
38491
38652
  meta: {
38492
38653
  name: "history",
38493
38654
  description: `Unified account history (audit log): what changed, who did it, and when.
@@ -38497,7 +38658,7 @@ Full guide: __tooling__/docs/tools/baker/history.md`
38497
38658
  });
38498
38659
 
38499
38660
  // src/commands/hubspot/index.ts
38500
- import { defineCommand as defineCommand130 } from "citty";
38661
+ import { defineCommand as defineCommand131 } from "citty";
38501
38662
  var EMBED_TYPES = ["legacy", "v4", "unknown"];
38502
38663
  function failNotConnected(err) {
38503
38664
  if (err instanceof ApiError && err.code === "FORBIDDEN" && err.message.includes(HUBSPOT_MISSING_GRANT_MARKER)) {
@@ -38651,7 +38812,7 @@ registerSchema({
38651
38812
  }
38652
38813
  }
38653
38814
  });
38654
- var formsListCommand = defineCommand130({
38815
+ var formsListCommand = defineCommand131({
38655
38816
  meta: {
38656
38817
  name: "list",
38657
38818
  description: "List HubSpot forms with embed type and post-submit action. Example: baker hubspot forms list --redirecting-only"
@@ -38696,7 +38857,7 @@ var formsListCommand = defineCommand130({
38696
38857
  }
38697
38858
  }
38698
38859
  });
38699
- var formsViewCommand = defineCommand130({
38860
+ var formsViewCommand = defineCommand131({
38700
38861
  meta: {
38701
38862
  name: "view",
38702
38863
  description: "Show one HubSpot form's fields and configuration. Example: baker hubspot forms view 1a2b3c"
@@ -38748,7 +38909,7 @@ var formsViewCommand = defineCommand130({
38748
38909
  }
38749
38910
  }
38750
38911
  });
38751
- var meetingsListCommand = defineCommand130({
38912
+ var meetingsListCommand = defineCommand131({
38752
38913
  meta: {
38753
38914
  name: "list",
38754
38915
  description: "List HubSpot meeting links (calendars). Example: baker hubspot meetings list"
@@ -38790,7 +38951,7 @@ var meetingsListCommand = defineCommand130({
38790
38951
  }
38791
38952
  }
38792
38953
  });
38793
- var meetingsViewCommand = defineCommand130({
38954
+ var meetingsViewCommand = defineCommand131({
38794
38955
  meta: {
38795
38956
  name: "view",
38796
38957
  description: "Show one HubSpot meeting link's booking fields. Example: baker hubspot meetings view discovery-call"
@@ -38834,7 +38995,7 @@ var meetingsViewCommand = defineCommand130({
38834
38995
  }
38835
38996
  }
38836
38997
  });
38837
- var formsSubmissionsCommand = defineCommand130({
38998
+ var formsSubmissionsCommand = defineCommand131({
38838
38999
  meta: {
38839
39000
  name: "submissions",
38840
39001
  description: "How many leads a form received, and when. Example: baker hubspot forms submissions <formId> --days 30"
@@ -38883,7 +39044,7 @@ var formsSubmissionsCommand = defineCommand130({
38883
39044
  }
38884
39045
  }
38885
39046
  });
38886
- var workflowsListCommand = defineCommand130({
39047
+ var workflowsListCommand = defineCommand131({
38887
39048
  meta: {
38888
39049
  name: "list",
38889
39050
  description: "List HubSpot workflows. Example: baker hubspot workflows list --enabled-only"
@@ -38948,7 +39109,7 @@ function workflowViewHints(workflow) {
38948
39109
  }
38949
39110
  return hints;
38950
39111
  }
38951
- var workflowsViewCommand = defineCommand130({
39112
+ var workflowsViewCommand = defineCommand131({
38952
39113
  meta: {
38953
39114
  name: "view",
38954
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"
@@ -38975,7 +39136,7 @@ var workflowsViewCommand = defineCommand130({
38975
39136
  }
38976
39137
  }
38977
39138
  });
38978
- var pipelinesListCommand = defineCommand130({
39139
+ var pipelinesListCommand = defineCommand131({
38979
39140
  meta: {
38980
39141
  name: "list",
38981
39142
  description: "List HubSpot deal pipelines and their stages. Example: baker hubspot pipelines list"
@@ -38992,7 +39153,7 @@ var pipelinesListCommand = defineCommand130({
38992
39153
  }
38993
39154
  }
38994
39155
  });
38995
- var contactsSummaryCommand = defineCommand130({
39156
+ var contactsSummaryCommand = defineCommand131({
38996
39157
  meta: {
38997
39158
  name: "summary",
38998
39159
  description: "Whether recent leads are being worked, as counts. Example: baker hubspot contacts summary --days 30"
@@ -39062,7 +39223,7 @@ function contactLookupHints(data) {
39062
39223
  }
39063
39224
  return hints;
39064
39225
  }
39065
- var contactsLookupCommand = defineCommand130({
39226
+ var contactsLookupCommand = defineCommand131({
39066
39227
  meta: {
39067
39228
  name: "lookup",
39068
39229
  description: "Find one contact by email and see whether it was worked. Example: baker hubspot contacts lookup a@b.com"
@@ -39086,27 +39247,27 @@ var contactsLookupCommand = defineCommand130({
39086
39247
  }
39087
39248
  }
39088
39249
  });
39089
- var contactsCommand = defineCommand130({
39250
+ var contactsCommand = defineCommand131({
39090
39251
  meta: { name: "contacts", description: "Contacts on the connected HubSpot account." },
39091
39252
  subCommands: { summary: contactsSummaryCommand, lookup: contactsLookupCommand }
39092
39253
  });
39093
- var formsCommand = defineCommand130({
39254
+ var formsCommand = defineCommand131({
39094
39255
  meta: { name: "forms", description: "HubSpot forms on the connected account." },
39095
39256
  subCommands: { list: formsListCommand, view: formsViewCommand, submissions: formsSubmissionsCommand }
39096
39257
  });
39097
- var workflowsCommand = defineCommand130({
39258
+ var workflowsCommand = defineCommand131({
39098
39259
  meta: { name: "workflows", description: "HubSpot workflows on the connected account." },
39099
39260
  subCommands: { list: workflowsListCommand, view: workflowsViewCommand }
39100
39261
  });
39101
- var pipelinesCommand = defineCommand130({
39262
+ var pipelinesCommand = defineCommand131({
39102
39263
  meta: { name: "pipelines", description: "HubSpot deal pipelines on the connected account." },
39103
39264
  subCommands: { list: pipelinesListCommand }
39104
39265
  });
39105
- var meetingsCommand = defineCommand130({
39266
+ var meetingsCommand = defineCommand131({
39106
39267
  meta: { name: "meetings", description: "HubSpot meeting links (calendars) on the connected account." },
39107
39268
  subCommands: { list: meetingsListCommand, view: meetingsViewCommand }
39108
39269
  });
39109
- var hubspotCommand = defineCommand130({
39270
+ var hubspotCommand = defineCommand131({
39110
39271
  meta: {
39111
39272
  name: "hubspot",
39112
39273
  description: `Read the connected HubSpot account \u2014 forms, the leads they received, workflows, deal pipelines and
@@ -39144,10 +39305,10 @@ Full guide: __tooling__/docs/tools/baker/hubspot.md`
39144
39305
  });
39145
39306
 
39146
39307
  // src/commands/images/index.ts
39147
- import { defineCommand as defineCommand156 } from "citty";
39308
+ import { defineCommand as defineCommand157 } from "citty";
39148
39309
 
39149
39310
  // src/commands/images/crop.ts
39150
- import { defineCommand as defineCommand131 } from "citty";
39311
+ import { defineCommand as defineCommand132 } from "citty";
39151
39312
 
39152
39313
  // src/lib/image/crop-sprite.ts
39153
39314
  import sharp from "sharp";
@@ -39269,7 +39430,7 @@ function emitError2(err) {
39269
39430
  }
39270
39431
  process.exit(1);
39271
39432
  }
39272
- var cropCommand = defineCommand131({
39433
+ var cropCommand = defineCommand132({
39273
39434
  meta: {
39274
39435
  name: "crop",
39275
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"
@@ -39305,7 +39466,7 @@ var cropCommand = defineCommand131({
39305
39466
  });
39306
39467
 
39307
39468
  // src/commands/images/delete.ts
39308
- import { defineCommand as defineCommand132 } from "citty";
39469
+ import { defineCommand as defineCommand133 } from "citty";
39309
39470
  registerSchema({
39310
39471
  command: "images.delete",
39311
39472
  description: "Delete an image by ID",
@@ -39319,7 +39480,7 @@ registerSchema({
39319
39480
  }
39320
39481
  }
39321
39482
  });
39322
- var deleteCommand2 = defineCommand132({
39483
+ var deleteCommand2 = defineCommand133({
39323
39484
  meta: {
39324
39485
  name: "delete",
39325
39486
  description: "Delete an image by ID. Use --dry-run to preview. Example: baker images delete j571abc123 --dry-run"
@@ -39360,7 +39521,7 @@ var deleteCommand2 = defineCommand132({
39360
39521
  });
39361
39522
 
39362
39523
  // src/commands/images/dimensions.ts
39363
- import { defineCommand as defineCommand133 } from "citty";
39524
+ import { defineCommand as defineCommand134 } from "citty";
39364
39525
 
39365
39526
  // src/lib/image/dimensions.ts
39366
39527
  import { imageSize } from "image-size";
@@ -39389,7 +39550,7 @@ registerSchema({
39389
39550
  }
39390
39551
  }
39391
39552
  });
39392
- var dimensionsCommand = defineCommand133({
39553
+ var dimensionsCommand = defineCommand134({
39393
39554
  meta: {
39394
39555
  name: "dimensions",
39395
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"
@@ -39445,7 +39606,7 @@ var dimensionsCommand = defineCommand133({
39445
39606
  });
39446
39607
 
39447
39608
  // src/commands/images/download.ts
39448
- import { defineCommand as defineCommand134 } from "citty";
39609
+ import { defineCommand as defineCommand135 } from "citty";
39449
39610
 
39450
39611
  // src/commands/images/downloadPaths.ts
39451
39612
  import { basename as basename2, extname as extname3, join as join6 } from "path";
@@ -39670,7 +39831,7 @@ function emitError3(err) {
39670
39831
  writeJson({ ok: false, error: { code: "INTERNAL_ERROR", message: "Unexpected error" } });
39671
39832
  process.exit(1);
39672
39833
  }
39673
- var downloadCommand = defineCommand134({
39834
+ var downloadCommand = defineCommand135({
39674
39835
  meta: {
39675
39836
  name: "download",
39676
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"
@@ -39703,7 +39864,7 @@ var downloadCommand = defineCommand134({
39703
39864
  });
39704
39865
 
39705
39866
  // src/commands/images/extract.ts
39706
- import { defineCommand as defineCommand135 } from "citty";
39867
+ import { defineCommand as defineCommand136 } from "citty";
39707
39868
 
39708
39869
  // src/commands/images/autoIngest.ts
39709
39870
  var AUTO_INGEST_MAX = {
@@ -39750,7 +39911,7 @@ registerSchema({
39750
39911
  }
39751
39912
  }
39752
39913
  });
39753
- var extractCommand = defineCommand135({
39914
+ var extractCommand = defineCommand136({
39754
39915
  meta: {
39755
39916
  name: "extract",
39756
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"
@@ -39805,7 +39966,7 @@ var extractCommand = defineCommand135({
39805
39966
  });
39806
39967
 
39807
39968
  // src/commands/images/find.ts
39808
- import { defineCommand as defineCommand136 } from "citty";
39969
+ import { defineCommand as defineCommand137 } from "citty";
39809
39970
 
39810
39971
  // src/commands/images/providerHits.ts
39811
39972
  function asRecord3(value) {
@@ -39943,7 +40104,7 @@ registerSchema({
39943
40104
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
39944
40105
  }
39945
40106
  });
39946
- var findCommand = defineCommand136({
40107
+ var findCommand = defineCommand137({
39947
40108
  meta: {
39948
40109
  name: "find",
39949
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"
@@ -40016,7 +40177,7 @@ var findCommand = defineCommand136({
40016
40177
  });
40017
40178
 
40018
40179
  // src/commands/images/get.ts
40019
- import { defineCommand as defineCommand137 } from "citty";
40180
+ import { defineCommand as defineCommand138 } from "citty";
40020
40181
  registerSchema({
40021
40182
  command: "images.get",
40022
40183
  description: "Get a single image by ID",
@@ -40024,7 +40185,7 @@ registerSchema({
40024
40185
  id: { type: "string", description: "Image ID", required: true }
40025
40186
  }
40026
40187
  });
40027
- var getCommand3 = defineCommand137({
40188
+ var getCommand3 = defineCommand138({
40028
40189
  meta: { name: "get", description: "Get a single image by ID. Example: baker images get j571abc123" },
40029
40190
  args: {
40030
40191
  id: { type: "positional", description: "Image ID", required: false },
@@ -40060,7 +40221,7 @@ var getCommand3 = defineCommand137({
40060
40221
  });
40061
40222
 
40062
40223
  // src/commands/images/gif.ts
40063
- import { defineCommand as defineCommand138 } from "citty";
40224
+ import { defineCommand as defineCommand139 } from "citty";
40064
40225
  registerSchema({
40065
40226
  command: "images.gif",
40066
40227
  description: "Search Giphy for GIFs / reaction memes (paid social creative).",
@@ -40092,7 +40253,7 @@ registerSchema({
40092
40253
  }
40093
40254
  }
40094
40255
  });
40095
- var gifCommand = defineCommand138({
40256
+ var gifCommand = defineCommand139({
40096
40257
  meta: {
40097
40258
  name: "gif",
40098
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"
@@ -40139,7 +40300,7 @@ var gifCommand = defineCommand138({
40139
40300
  });
40140
40301
 
40141
40302
  // src/commands/images/google.ts
40142
- import { defineCommand as defineCommand139 } from "citty";
40303
+ import { defineCommand as defineCommand140 } from "citty";
40143
40304
  var GOOGLE_ERROR_FIX = {
40144
40305
  action: "use_different_resource",
40145
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."
@@ -40179,7 +40340,7 @@ registerSchema({
40179
40340
  }
40180
40341
  }
40181
40342
  });
40182
- var googleCommand2 = defineCommand139({
40343
+ var googleCommand2 = defineCommand140({
40183
40344
  meta: {
40184
40345
  name: "google",
40185
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"
@@ -40252,7 +40413,7 @@ var googleCommand2 = defineCommand139({
40252
40413
  });
40253
40414
 
40254
40415
  // src/commands/images/group.ts
40255
- import { defineCommand as defineCommand140 } from "citty";
40416
+ import { defineCommand as defineCommand141 } from "citty";
40256
40417
 
40257
40418
  // src/commands/mediaGroup.ts
40258
40419
  async function runMediaGroupLookup(input) {
@@ -40305,7 +40466,7 @@ registerSchema({
40305
40466
  "group-key": { type: "string", description: "The set key directly, when you already have it", required: false }
40306
40467
  }
40307
40468
  });
40308
- var groupCommand = defineCommand140({
40469
+ var groupCommand = defineCommand141({
40309
40470
  meta: {
40310
40471
  name: "group",
40311
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>"
@@ -40325,7 +40486,7 @@ var groupCommand = defineCommand140({
40325
40486
  });
40326
40487
 
40327
40488
  // src/commands/images/icon.ts
40328
- import { defineCommand as defineCommand141 } from "citty";
40489
+ import { defineCommand as defineCommand142 } from "citty";
40329
40490
 
40330
40491
  // src/commands/images/brandVerification.ts
40331
40492
  function brandToken(domain) {
@@ -40422,7 +40583,7 @@ registerSchema({
40422
40583
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
40423
40584
  }
40424
40585
  });
40425
- var iconCommand = defineCommand141({
40586
+ var iconCommand = defineCommand142({
40426
40587
  meta: {
40427
40588
  name: "icon",
40428
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'"
@@ -40492,7 +40653,7 @@ var iconCommand = defineCommand141({
40492
40653
  });
40493
40654
 
40494
40655
  // src/commands/images/ingest.ts
40495
- import { defineCommand as defineCommand142 } from "citty";
40656
+ import { defineCommand as defineCommand143 } from "citty";
40496
40657
  var SOURCE_VALUES = imageSourceSchema.options.join(" | ");
40497
40658
  registerSchema({
40498
40659
  command: "images.ingest",
@@ -40507,7 +40668,7 @@ registerSchema({
40507
40668
  fields: { type: "string", description: "Comma-separated field names to include", required: false }
40508
40669
  }
40509
40670
  });
40510
- var ingestCommand = defineCommand142({
40671
+ var ingestCommand = defineCommand143({
40511
40672
  meta: {
40512
40673
  name: "ingest",
40513
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"
@@ -40576,7 +40737,7 @@ var ingestCommand = defineCommand142({
40576
40737
  });
40577
40738
 
40578
40739
  // src/commands/images/layerize.ts
40579
- import { defineCommand as defineCommand143 } from "citty";
40740
+ import { defineCommand as defineCommand144 } from "citty";
40580
40741
  registerSchema({
40581
40742
  command: "images.layerize",
40582
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.",
@@ -40640,7 +40801,7 @@ async function pollUntilSettled(imageId, maxWait) {
40640
40801
  }
40641
40802
  return null;
40642
40803
  }
40643
- var layerizeCommand = defineCommand143({
40804
+ var layerizeCommand = defineCommand144({
40644
40805
  meta: {
40645
40806
  name: "layerize",
40646
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'"
@@ -40709,7 +40870,7 @@ registerSchema({
40709
40870
  full: { type: "boolean", description: "Include geometry and typography for every layer", required: false }
40710
40871
  }
40711
40872
  });
40712
- var layersCommand = defineCommand143({
40873
+ var layersCommand = defineCommand144({
40713
40874
  meta: {
40714
40875
  name: "layers",
40715
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"
@@ -40749,7 +40910,7 @@ var layersCommand = defineCommand143({
40749
40910
  });
40750
40911
 
40751
40912
  // src/commands/images/library.ts
40752
- import { defineCommand as defineCommand144 } from "citty";
40913
+ import { defineCommand as defineCommand145 } from "citty";
40753
40914
  registerSchema({
40754
40915
  command: "images.library",
40755
40916
  description: "Search the company image library. Returns only ready images.",
@@ -40775,7 +40936,7 @@ registerSchema({
40775
40936
  }
40776
40937
  }
40777
40938
  });
40778
- var libraryCommand = defineCommand144({
40939
+ var libraryCommand = defineCommand145({
40779
40940
  meta: {
40780
40941
  name: "library",
40781
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"
@@ -40838,7 +40999,7 @@ var libraryCommand = defineCommand144({
40838
40999
  });
40839
41000
 
40840
41001
  // src/commands/images/logo.ts
40841
- import { defineCommand as defineCommand145 } from "citty";
41002
+ import { defineCommand as defineCommand146 } from "citty";
40842
41003
  registerSchema({
40843
41004
  command: "images.logo",
40844
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.",
@@ -40866,7 +41027,7 @@ registerSchema({
40866
41027
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
40867
41028
  }
40868
41029
  });
40869
- var logoCommand = defineCommand145({
41030
+ var logoCommand = defineCommand146({
40870
41031
  meta: {
40871
41032
  name: "logo",
40872
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"
@@ -40939,7 +41100,7 @@ var logoCommand = defineCommand145({
40939
41100
  });
40940
41101
 
40941
41102
  // src/commands/images/normalize.ts
40942
- import { defineCommand as defineCommand146 } from "citty";
41103
+ import { defineCommand as defineCommand147 } from "citty";
40943
41104
 
40944
41105
  // src/lib/image/color-changer.ts
40945
41106
  import quantize from "quantize";
@@ -41671,7 +41832,7 @@ function coerceRawArgs(args) {
41671
41832
  "dry-run": bool(args["dry-run"])
41672
41833
  };
41673
41834
  }
41674
- var normalizeCommand2 = defineCommand146({
41835
+ var normalizeCommand2 = defineCommand147({
41675
41836
  meta: {
41676
41837
  name: "normalize",
41677
41838
  description: `Normalize logos / images: declarative recolor + bg removal + trim + resize. Operates on local files; writes in-place by default.
@@ -41726,7 +41887,7 @@ Examples:
41726
41887
  });
41727
41888
 
41728
41889
  // src/commands/images/pinterest.ts
41729
- import { defineCommand as defineCommand147 } from "citty";
41890
+ import { defineCommand as defineCommand148 } from "citty";
41730
41891
  registerSchema({
41731
41892
  command: "images.pinterest",
41732
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.",
@@ -41746,7 +41907,7 @@ registerSchema({
41746
41907
  }
41747
41908
  }
41748
41909
  });
41749
- var pinterestCommand = defineCommand147({
41910
+ var pinterestCommand = defineCommand148({
41750
41911
  meta: {
41751
41912
  name: "pinterest",
41752
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'"
@@ -41803,7 +41964,7 @@ var pinterestCommand = defineCommand147({
41803
41964
  });
41804
41965
 
41805
41966
  // src/commands/images/screenshot.ts
41806
- import { defineCommand as defineCommand148 } from "citty";
41967
+ import { defineCommand as defineCommand149 } from "citty";
41807
41968
  registerSchema({
41808
41969
  command: "images.screenshot",
41809
41970
  description: "Capture a website screenshot via ScreenshotOne. Auto-ingests on success.",
@@ -41822,7 +41983,7 @@ registerSchema({
41822
41983
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
41823
41984
  }
41824
41985
  });
41825
- var screenshotCommand = defineCommand148({
41986
+ var screenshotCommand = defineCommand149({
41826
41987
  meta: {
41827
41988
  name: "screenshot",
41828
41989
  description: "Screenshot a URL via ScreenshotOne. $0.009/capture. Auto-ingests to library.\n\nExample: baker images screenshot https://stripe.com --full-page"
@@ -41886,7 +42047,7 @@ var screenshotCommand = defineCommand148({
41886
42047
  });
41887
42048
 
41888
42049
  // src/commands/images/search.ts
41889
- import { defineCommand as defineCommand149 } from "citty";
42050
+ import { defineCommand as defineCommand150 } from "citty";
41890
42051
  registerSchema({
41891
42052
  command: "images.search",
41892
42053
  description: "Search images by text query. Only returns ready images.",
@@ -41902,7 +42063,7 @@ registerSchema({
41902
42063
  tags: { type: "string", description: "Comma-separated tags to filter by", required: false }
41903
42064
  }
41904
42065
  });
41905
- var searchCommand = defineCommand149({
42066
+ var searchCommand = defineCommand150({
41906
42067
  meta: {
41907
42068
  name: "search",
41908
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"
@@ -41962,7 +42123,7 @@ var searchCommand = defineCommand149({
41962
42123
  });
41963
42124
 
41964
42125
  // src/commands/images/sticker.ts
41965
- import { defineCommand as defineCommand150 } from "citty";
42126
+ import { defineCommand as defineCommand151 } from "citty";
41966
42127
  registerSchema({
41967
42128
  command: "images.sticker",
41968
42129
  description: "Search Giphy stickers \u2014 transparent-background overlays for ad creative.",
@@ -41994,7 +42155,7 @@ registerSchema({
41994
42155
  }
41995
42156
  }
41996
42157
  });
41997
- var stickerCommand = defineCommand150({
42158
+ var stickerCommand = defineCommand151({
41998
42159
  meta: {
41999
42160
  name: "sticker",
42000
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"
@@ -42041,7 +42202,7 @@ var stickerCommand = defineCommand150({
42041
42202
  });
42042
42203
 
42043
42204
  // src/commands/images/stock.ts
42044
- import { defineCommand as defineCommand151 } from "citty";
42205
+ import { defineCommand as defineCommand152 } from "citty";
42045
42206
  var STOCK_ERROR_FIX = {
42046
42207
  action: "use_different_resource",
42047
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."
@@ -42118,7 +42279,7 @@ function buildStockRequest(query, args) {
42118
42279
  if (args.context) body.descriptionContext = args.context;
42119
42280
  return body;
42120
42281
  }
42121
- var stockCommand = defineCommand151({
42282
+ var stockCommand = defineCommand152({
42122
42283
  meta: {
42123
42284
  name: "stock",
42124
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"
@@ -42191,7 +42352,7 @@ var stockCommand = defineCommand151({
42191
42352
  });
42192
42353
 
42193
42354
  // src/lib/tags-command.ts
42194
- import { defineCommand as defineCommand152 } from "citty";
42355
+ import { defineCommand as defineCommand153 } from "citty";
42195
42356
  function makeTagsCommand(command, label, endpoint) {
42196
42357
  registerSchema({
42197
42358
  command: `${command}.tags`,
@@ -42200,7 +42361,7 @@ function makeTagsCommand(command, label, endpoint) {
42200
42361
  output: { type: "string", description: "Output format: md|json", required: false, default: "md" }
42201
42362
  }
42202
42363
  });
42203
- return defineCommand152({
42364
+ return defineCommand153({
42204
42365
  meta: {
42205
42366
  name: "tags",
42206
42367
  description: `List the available ${label} tag names (defaults + company custom tags). Use before filtering with --tags. Example: baker ${command} tags`
@@ -42236,7 +42397,7 @@ function makeTagsCommand(command, label, endpoint) {
42236
42397
  var tagsCommand3 = makeTagsCommand("images", "image", "/api/images/tags");
42237
42398
 
42238
42399
  // src/commands/images/upload.ts
42239
- import { defineCommand as defineCommand153 } from "citty";
42400
+ import { defineCommand as defineCommand154 } from "citty";
42240
42401
  registerSchema({
42241
42402
  command: "images.upload",
42242
42403
  description: "Upload an image to the library \u2014 local file path or remote http(s) URL.",
@@ -42274,7 +42435,7 @@ registerSchema({
42274
42435
  function isRemoteUrl2(value) {
42275
42436
  return /^https?:\/\//i.test(value);
42276
42437
  }
42277
- var uploadCommand = defineCommand153({
42438
+ var uploadCommand = defineCommand154({
42278
42439
  meta: {
42279
42440
  name: "upload",
42280
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'"
@@ -42367,7 +42528,7 @@ async function uploadLocal(target, args) {
42367
42528
  }
42368
42529
 
42369
42530
  // src/commands/images/upscale.ts
42370
- import { defineCommand as defineCommand154 } from "citty";
42531
+ import { defineCommand as defineCommand155 } from "citty";
42371
42532
  registerSchema({
42372
42533
  command: "images.upscale",
42373
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).",
@@ -42382,7 +42543,7 @@ registerSchema({
42382
42543
  }
42383
42544
  });
42384
42545
  var POLL_INTERVAL_MS4 = 1500;
42385
- var upscaleCommand = defineCommand154({
42546
+ var upscaleCommand = defineCommand155({
42386
42547
  meta: {
42387
42548
  name: "upscale",
42388
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"
@@ -42437,7 +42598,7 @@ var upscaleCommand = defineCommand154({
42437
42598
  });
42438
42599
 
42439
42600
  // src/commands/images/use.ts
42440
- import { defineCommand as defineCommand155 } from "citty";
42601
+ import { defineCommand as defineCommand156 } from "citty";
42441
42602
  registerSchema({
42442
42603
  command: "images.use",
42443
42604
  description: "Ingest a URL and wait for the library record to be ready.",
@@ -42466,7 +42627,7 @@ function emitReady(ingestResult, doc, args) {
42466
42627
  args.full === true
42467
42628
  );
42468
42629
  }
42469
- var useCommand = defineCommand155({
42630
+ var useCommand = defineCommand156({
42470
42631
  meta: {
42471
42632
  name: "use",
42472
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"
@@ -42515,7 +42676,7 @@ var useCommand = defineCommand155({
42515
42676
  });
42516
42677
 
42517
42678
  // src/commands/images/index.ts
42518
- var imagesCommand = defineCommand156({
42679
+ var imagesCommand = defineCommand157({
42519
42680
  meta: {
42520
42681
  name: "images",
42521
42682
  description: `Find, source, and normalize images. Subcommands route by provider so cost + license are explicit.
@@ -42593,12 +42754,12 @@ Full guide: __tooling__/docs/tools/baker/images.md`
42593
42754
  });
42594
42755
 
42595
42756
  // src/commands/landing/index.ts
42596
- import { defineCommand as defineCommand167 } from "citty";
42757
+ import { defineCommand as defineCommand168 } from "citty";
42597
42758
 
42598
42759
  // src/commands/landing/critique.ts
42599
42760
  import { readdir as readdir11, stat as stat7 } from "fs/promises";
42600
42761
  import path31 from "path";
42601
- import { defineCommand as defineCommand157 } from "citty";
42762
+ import { defineCommand as defineCommand158 } from "citty";
42602
42763
 
42603
42764
  // src/engine/landing/lib/constants.ts
42604
42765
  var OVERUSED_FONTS = /* @__PURE__ */ new Set([
@@ -43667,7 +43828,7 @@ function fail5(code, message, fix) {
43667
43828
  );
43668
43829
  process.exit(2);
43669
43830
  }
43670
- var critiqueCommand2 = defineCommand157({
43831
+ var critiqueCommand2 = defineCommand158({
43671
43832
  meta: {
43672
43833
  name: "critique",
43673
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."
@@ -43776,10 +43937,10 @@ async function isDir(p) {
43776
43937
  }
43777
43938
 
43778
43939
  // src/commands/landing/inspiration/index.ts
43779
- import { defineCommand as defineCommand166 } from "citty";
43940
+ import { defineCommand as defineCommand167 } from "citty";
43780
43941
 
43781
43942
  // src/commands/landing/inspiration/add.ts
43782
- import { defineCommand as defineCommand158 } from "citty";
43943
+ import { defineCommand as defineCommand159 } from "citty";
43783
43944
 
43784
43945
  // src/commands/landing/inspiration/shared.ts
43785
43946
  var INSPIRATION_HINTS = {
@@ -43861,7 +44022,7 @@ registerSchema({
43861
44022
  note: { type: "string", description: "Why this page is worth keeping", required: false }
43862
44023
  }
43863
44024
  });
43864
- var addCommand = defineCommand158({
44025
+ var addCommand = defineCommand159({
43865
44026
  meta: {
43866
44027
  name: "add",
43867
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'"
@@ -43903,7 +44064,7 @@ var addCommand = defineCommand158({
43903
44064
  // src/commands/landing/inspiration/code.ts
43904
44065
  import { mkdir as mkdir10, writeFile as writeFile14 } from "fs/promises";
43905
44066
  import path32 from "path";
43906
- import { defineCommand as defineCommand159 } from "citty";
44067
+ import { defineCommand as defineCommand160 } from "citty";
43907
44068
  registerSchema({
43908
44069
  command: "landing.inspiration.code",
43909
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.",
@@ -43912,7 +44073,7 @@ registerSchema({
43912
44073
  full: { type: "boolean", description: "Print the markup inline as well as writing it", required: false }
43913
44074
  }
43914
44075
  });
43915
- var codeCommand = defineCommand159({
44076
+ var codeCommand = defineCommand160({
43916
44077
  meta: {
43917
44078
  name: "code",
43918
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."
@@ -43958,7 +44119,7 @@ var codeCommand = defineCommand159({
43958
44119
  });
43959
44120
 
43960
44121
  // src/commands/landing/inspiration/favorites.ts
43961
- import { defineCommand as defineCommand160 } from "citty";
44122
+ import { defineCommand as defineCommand161 } from "citty";
43962
44123
  registerSchema({
43963
44124
  command: "landing.inspiration.favorites",
43964
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.",
@@ -43972,7 +44133,7 @@ registerSchema({
43972
44133
  }
43973
44134
  }
43974
44135
  });
43975
- var favoritesCommand = defineCommand160({
44136
+ var favoritesCommand = defineCommand161({
43976
44137
  meta: {
43977
44138
  name: "favorites",
43978
44139
  description: "List this company's saved reference sections. Example: baker landing inspiration favorites --type hero,pricing"
@@ -44052,7 +44213,7 @@ registerSchema({
44052
44213
  note: { type: "string", description: "Why this is worth keeping", required: false }
44053
44214
  }
44054
44215
  });
44055
- var favoriteCommand = defineCommand160({
44216
+ var favoriteCommand = defineCommand161({
44056
44217
  meta: {
44057
44218
  name: "favorite",
44058
44219
  description: "Save a reference section to this company. Example: baker landing inspiration favorite k57abc\u2026"
@@ -44090,7 +44251,7 @@ registerSchema({
44090
44251
  page: { type: "boolean", description: "Treat the id as a page rather than a section", required: false }
44091
44252
  }
44092
44253
  });
44093
- var unfavoriteCommand = defineCommand160({
44254
+ var unfavoriteCommand = defineCommand161({
44094
44255
  meta: {
44095
44256
  name: "unfavorite",
44096
44257
  description: "Remove a reference section from this company's saved set. Example: baker landing inspiration unfavorite k57abc\u2026"
@@ -44112,7 +44273,7 @@ var unfavoriteCommand = defineCommand160({
44112
44273
  });
44113
44274
 
44114
44275
  // src/commands/landing/inspiration/page.ts
44115
- import { defineCommand as defineCommand161 } from "citty";
44276
+ import { defineCommand as defineCommand162 } from "citty";
44116
44277
  registerSchema({
44117
44278
  command: "landing.inspiration.page",
44118
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.",
@@ -44129,7 +44290,7 @@ registerSchema({
44129
44290
  }
44130
44291
  }
44131
44292
  });
44132
- var pageCommand2 = defineCommand161({
44293
+ var pageCommand2 = defineCommand162({
44133
44294
  meta: {
44134
44295
  name: "page",
44135
44296
  description: "Show how a reference page sequences its sections. Example: baker landing inspiration page j91xyz\u2026 \u2014 the blueprint, not the pixels."
@@ -44192,7 +44353,7 @@ var pageCommand2 = defineCommand161({
44192
44353
  });
44193
44354
 
44194
44355
  // src/commands/landing/inspiration/scrape.ts
44195
- import { defineCommand as defineCommand162 } from "citty";
44356
+ import { defineCommand as defineCommand163 } from "citty";
44196
44357
 
44197
44358
  // src/engine/landing-library/proxyFailure.ts
44198
44359
  var PROXY_STATUS = 407;
@@ -46332,7 +46493,7 @@ registerSchema({
46332
46493
  report: { type: "boolean", description: "Write report.html. `--no-report` to skip", required: false }
46333
46494
  }
46334
46495
  });
46335
- var scrapeCommand = defineCommand162({
46496
+ var scrapeCommand = defineCommand163({
46336
46497
  meta: {
46337
46498
  name: "scrape",
46338
46499
  description: "Capture a landing page to a directory, now. Example: baker landing inspiration scrape https://linear.app --out .baker/inspiration/linear.app"
@@ -46441,7 +46602,7 @@ var scrapeCommand = defineCommand162({
46441
46602
 
46442
46603
  // src/commands/landing/inspiration/search.ts
46443
46604
  import path37 from "path";
46444
- import { defineCommand as defineCommand163 } from "citty";
46605
+ import { defineCommand as defineCommand164 } from "citty";
46445
46606
 
46446
46607
  // src/commands/landing/inspiration/shot.ts
46447
46608
  import { mkdir as mkdir12, writeFile as writeFile17 } from "fs/promises";
@@ -46578,7 +46739,7 @@ async function downloadShots(results) {
46578
46739
  );
46579
46740
  return saved;
46580
46741
  }
46581
- var searchCommand2 = defineCommand163({
46742
+ var searchCommand2 = defineCommand164({
46582
46743
  meta: {
46583
46744
  name: "search",
46584
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"
@@ -46676,7 +46837,7 @@ var searchCommand2 = defineCommand163({
46676
46837
  });
46677
46838
 
46678
46839
  // src/commands/landing/inspiration/sequences.ts
46679
- import { defineCommand as defineCommand164 } from "citty";
46840
+ import { defineCommand as defineCommand165 } from "citty";
46680
46841
  var COMPACT_TRANSITIONS = 12;
46681
46842
  var COMPACT_ENDS = 5;
46682
46843
  var MAX_PAGES = 50;
@@ -46750,7 +46911,7 @@ function sequencesHints(data, { scope, full }) {
46750
46911
  if (scope === "favorites") hints.push(...favoritesScopeHints(data.favoritesHealth, data.pagesReturned));
46751
46912
  return hints;
46752
46913
  }
46753
- var sequencesCommand = defineCommand164({
46914
+ var sequencesCommand = defineCommand165({
46754
46915
  meta: {
46755
46916
  name: "sequences",
46756
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."
@@ -46800,7 +46961,7 @@ var sequencesCommand = defineCommand164({
46800
46961
 
46801
46962
  // src/commands/landing/inspiration/view.ts
46802
46963
  import path38 from "path";
46803
- import { defineCommand as defineCommand165 } from "citty";
46964
+ import { defineCommand as defineCommand166 } from "citty";
46804
46965
  registerSchema({
46805
46966
  command: "landing.inspiration.view",
46806
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.",
@@ -46813,7 +46974,7 @@ registerSchema({
46813
46974
  }
46814
46975
  }
46815
46976
  });
46816
- var viewCommand2 = defineCommand165({
46977
+ var viewCommand2 = defineCommand166({
46817
46978
  meta: {
46818
46979
  name: "view",
46819
46980
  description: "Full detail for one reference section. Example: baker landing inspiration view k57abc\u2026 \u2014 read the screenshots it saves before you build."
@@ -46897,7 +47058,7 @@ var viewCommand2 = defineCommand165({
46897
47058
  });
46898
47059
 
46899
47060
  // src/commands/landing/inspiration/index.ts
46900
- var inspirationCommand = defineCommand166({
47061
+ var inspirationCommand = defineCommand167({
46901
47062
  meta: {
46902
47063
  name: "inspiration",
46903
47064
  description: `Reference library of real landing-page sections \u2014 look at how good pages actually solve a problem before you design one.
@@ -46942,7 +47103,7 @@ Full guide: __tooling__/docs/tools/baker/landing.md`
46942
47103
  });
46943
47104
 
46944
47105
  // src/commands/landing/index.ts
46945
- var landingCommand = defineCommand167({
47106
+ var landingCommand = defineCommand168({
46946
47107
  meta: {
46947
47108
  name: "landing",
46948
47109
  description: `Design-quality tools for landing pages (src/pages/<slug>/).
@@ -46960,7 +47121,7 @@ Subcommands:
46960
47121
  });
46961
47122
 
46962
47123
  // src/commands/mcp/index.ts
46963
- import { defineCommand as defineCommand168 } from "citty";
47124
+ import { defineCommand as defineCommand169 } from "citty";
46964
47125
 
46965
47126
  // src/commands/mcp/platforms.ts
46966
47127
  function readsKey(label) {
@@ -47029,7 +47190,7 @@ registerSchema({
47029
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.",
47030
47191
  args: {}
47031
47192
  });
47032
- var connectedCommand = defineCommand168({
47193
+ var connectedCommand = defineCommand169({
47033
47194
  meta: {
47034
47195
  name: "connected",
47035
47196
  description: `Everything this chat can reach \u2014 managed integrations, custom MCP servers, and connected platforms.
@@ -47088,7 +47249,7 @@ registerSchema({
47088
47249
  description: "List the custom MCP servers this company's chats see (org + company + your own user scope).",
47089
47250
  args: {}
47090
47251
  });
47091
- var listCommand14 = defineCommand168({
47252
+ var listCommand14 = defineCommand169({
47092
47253
  meta: { name: "list", description: "List custom MCP servers visible to this company's chats." },
47093
47254
  run: async () => {
47094
47255
  try {
@@ -47125,7 +47286,7 @@ registerSchema({
47125
47286
  header: { type: "string", description: 'Auth header "Key: Value" (repeatable)', required: false }
47126
47287
  }
47127
47288
  });
47128
- var addCommand2 = defineCommand168({
47289
+ var addCommand2 = defineCommand169({
47129
47290
  meta: {
47130
47291
  name: "add",
47131
47292
  description: `Register a custom MCP server. Tools appear as mcp__<name>__* on the NEXT message.
@@ -47177,7 +47338,7 @@ registerSchema({
47177
47338
  description: "Remove a company custom MCP server by name.",
47178
47339
  args: { name: { type: "string", description: "Server name to remove", required: true } }
47179
47340
  });
47180
- var removeCommand4 = defineCommand168({
47341
+ var removeCommand4 = defineCommand169({
47181
47342
  meta: {
47182
47343
  name: "remove",
47183
47344
  description: `Remove a company custom MCP server by name.
@@ -47199,7 +47360,7 @@ Example:
47199
47360
  }
47200
47361
  }
47201
47362
  });
47202
- var mcpCommand = defineCommand168({
47363
+ var mcpCommand = defineCommand169({
47203
47364
  meta: {
47204
47365
  name: "mcp",
47205
47366
  description: `Third-party tools for this company \u2014 see what's connected, register custom HTTPS MCP endpoints.
@@ -47225,10 +47386,10 @@ Full guide: __tooling__/docs/tools/baker/mcp.md`
47225
47386
  });
47226
47387
 
47227
47388
  // src/commands/research/index.ts
47228
- import { defineCommand as defineCommand180 } from "citty";
47389
+ import { defineCommand as defineCommand181 } from "citty";
47229
47390
 
47230
47391
  // src/commands/research/advertisers.ts
47231
- import { defineCommand as defineCommand169 } from "citty";
47392
+ import { defineCommand as defineCommand170 } from "citty";
47232
47393
 
47233
47394
  // src/commands/research/hints.ts
47234
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.';
@@ -47411,7 +47572,7 @@ var FIELDS3 = {
47411
47572
  etv: "Estimated traffic value (USD)",
47412
47573
  visibility: "SERP visibility score (0-1)"
47413
47574
  };
47414
- var advertisersCommand = defineCommand169({
47575
+ var advertisersCommand = defineCommand170({
47415
47576
  meta: {
47416
47577
  name: "advertisers",
47417
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).
@@ -47467,7 +47628,7 @@ Examples:
47467
47628
  });
47468
47629
 
47469
47630
  // src/commands/research/autocomplete.ts
47470
- import { defineCommand as defineCommand170 } from "citty";
47631
+ import { defineCommand as defineCommand171 } from "citty";
47471
47632
  registerSchema({
47472
47633
  command: "research.autocomplete",
47473
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).",
@@ -47490,7 +47651,7 @@ registerSchema({
47490
47651
  var FIELDS4 = {
47491
47652
  suggestion: "Autocomplete suggestion from Google"
47492
47653
  };
47493
- var autocompleteCommand = defineCommand170({
47654
+ var autocompleteCommand = defineCommand171({
47494
47655
  meta: {
47495
47656
  name: "autocomplete",
47496
47657
  description: `Get Google Autocomplete suggestions for keyword expansion.
@@ -47545,7 +47706,7 @@ Examples:
47545
47706
  });
47546
47707
 
47547
47708
  // src/commands/research/countries.ts
47548
- import { defineCommand as defineCommand171 } from "citty";
47709
+ import { defineCommand as defineCommand172 } from "citty";
47549
47710
  registerSchema({
47550
47711
  command: "research.countries",
47551
47712
  description: "List all supported country codes for --location flag in research commands.",
@@ -47602,7 +47763,7 @@ var FIELDS5 = {
47602
47763
  code: "Country code to pass as --location",
47603
47764
  name: "Country name"
47604
47765
  };
47605
- var countriesCommand = defineCommand171({
47766
+ var countriesCommand = defineCommand172({
47606
47767
  meta: {
47607
47768
  name: "countries",
47608
47769
  description: "List all supported country codes for --location flag."
@@ -47613,7 +47774,7 @@ var countriesCommand = defineCommand171({
47613
47774
  });
47614
47775
 
47615
47776
  // src/commands/research/fetch.ts
47616
- import { defineCommand as defineCommand172 } from "citty";
47777
+ import { defineCommand as defineCommand173 } from "citty";
47617
47778
  var CONTENT_PREVIEW_CHARS = 2e4;
47618
47779
  var TIMEOUT_MS = 18e4;
47619
47780
  registerSchema({
@@ -47686,7 +47847,7 @@ function fetchFix(code) {
47686
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."
47687
47848
  };
47688
47849
  }
47689
- var fetchCommand = defineCommand172({
47850
+ var fetchCommand = defineCommand173({
47690
47851
  meta: {
47691
47852
  name: "fetch",
47692
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.
@@ -47763,7 +47924,7 @@ Examples:
47763
47924
  });
47764
47925
 
47765
47926
  // src/commands/research/intent.ts
47766
- import { defineCommand as defineCommand173 } from "citty";
47927
+ import { defineCommand as defineCommand174 } from "citty";
47767
47928
  registerSchema({
47768
47929
  command: "research.intent",
47769
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.",
@@ -47786,7 +47947,7 @@ var FIELDS7 = {
47786
47947
  intent: "Primary Google Search intent: informational, navigational, commercial, transactional",
47787
47948
  probability: "Confidence score 0.0-1.0"
47788
47949
  };
47789
- var intentCommand = defineCommand173({
47950
+ var intentCommand = defineCommand174({
47790
47951
  meta: {
47791
47952
  name: "intent",
47792
47953
  description: `Classify Google Search intent for keywords. Returns intent type and confidence.
@@ -47834,7 +47995,7 @@ Examples:
47834
47995
  });
47835
47996
 
47836
47997
  // src/commands/research/keyword-gap.ts
47837
- import { defineCommand as defineCommand174 } from "citty";
47998
+ import { defineCommand as defineCommand175 } from "citty";
47838
47999
  registerSchema({
47839
48000
  command: "research.keyword-gap",
47840
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.",
@@ -47863,7 +48024,7 @@ var FIELDS8 = {
47863
48024
  cpc: "Cost per click USD",
47864
48025
  their_position: "Competitor's ranking position"
47865
48026
  };
47866
- var keywordGapCommand = defineCommand174({
48027
+ var keywordGapCommand = defineCommand175({
47867
48028
  meta: {
47868
48029
  name: "keyword-gap",
47869
48030
  description: `Find keywords a competitor has that you don't. Supports pagination via --offset.
@@ -47938,7 +48099,7 @@ Examples:
47938
48099
  });
47939
48100
 
47940
48101
  // src/commands/research/keywords-for-site.ts
47941
- import { defineCommand as defineCommand175 } from "citty";
48102
+ import { defineCommand as defineCommand176 } from "citty";
47942
48103
  registerSchema({
47943
48104
  command: "research.keywords-for-site",
47944
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.",
@@ -47971,7 +48132,7 @@ var FIELDS9 = {
47971
48132
  competition: "LOW, MEDIUM, or HIGH",
47972
48133
  competition_index: "Competition score 0-100"
47973
48134
  };
47974
- var keywordsForSiteCommand = defineCommand175({
48135
+ var keywordsForSiteCommand = defineCommand176({
47975
48136
  meta: {
47976
48137
  name: "keywords-for-site",
47977
48138
  description: `Get keywords a competitor targets in Google. Use --type to filter paid/organic.
@@ -48033,7 +48194,7 @@ Examples:
48033
48194
  });
48034
48195
 
48035
48196
  // src/commands/research/languages.ts
48036
- import { defineCommand as defineCommand176 } from "citty";
48197
+ import { defineCommand as defineCommand177 } from "citty";
48037
48198
  registerSchema({
48038
48199
  command: "research.languages",
48039
48200
  description: "List all supported language codes for --language flag in research commands.",
@@ -48063,7 +48224,7 @@ var FIELDS10 = {
48063
48224
  code: "Language code to pass as --language",
48064
48225
  name: "Language name (also accepted by --language)"
48065
48226
  };
48066
- var languagesCommand2 = defineCommand176({
48227
+ var languagesCommand2 = defineCommand177({
48067
48228
  meta: {
48068
48229
  name: "languages",
48069
48230
  description: "List all supported language codes for --language flag."
@@ -48074,7 +48235,7 @@ var languagesCommand2 = defineCommand176({
48074
48235
  });
48075
48236
 
48076
48237
  // src/commands/research/lighthouse.ts
48077
- import { defineCommand as defineCommand177 } from "citty";
48238
+ import { defineCommand as defineCommand178 } from "citty";
48078
48239
  registerSchema({
48079
48240
  command: "research.lighthouse",
48080
48241
  description: "Landing page performance audit. Returns metrics that affect Google Ads Quality Score and CPC.",
@@ -48093,7 +48254,7 @@ var FIELDS11 = {
48093
48254
  speed_index_ms: "Speed Index in ms (good: < 3400)",
48094
48255
  interactive_ms: "Time to Interactive in ms (good: < 3800)"
48095
48256
  };
48096
- var lighthouseCommand = defineCommand177({
48257
+ var lighthouseCommand = defineCommand178({
48097
48258
  meta: {
48098
48259
  name: "lighthouse",
48099
48260
  description: `Landing page performance audit. Metrics affecting Google Ads Quality Score.
@@ -48131,7 +48292,7 @@ Examples:
48131
48292
  });
48132
48293
 
48133
48294
  // src/commands/research/relevant-pages.ts
48134
- import { defineCommand as defineCommand178 } from "citty";
48295
+ import { defineCommand as defineCommand179 } from "citty";
48135
48296
  registerSchema({
48136
48297
  command: "research.relevant-pages",
48137
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).",
@@ -48157,7 +48318,7 @@ var FIELDS12 = {
48157
48318
  keywords: "Total organic keywords the page ranks for",
48158
48319
  top_10: "Keywords in positions 1-10"
48159
48320
  };
48160
- var relevantPagesCommand = defineCommand178({
48321
+ var relevantPagesCommand = defineCommand179({
48161
48322
  meta: {
48162
48323
  name: "relevant-pages",
48163
48324
  description: `Get the top pages of a competitor domain with traffic data.
@@ -48204,7 +48365,7 @@ Examples:
48204
48365
  });
48205
48366
 
48206
48367
  // src/commands/research/web.ts
48207
- import { defineCommand as defineCommand179 } from "citty";
48368
+ import { defineCommand as defineCommand180 } from "citty";
48208
48369
  registerSchema({
48209
48370
  command: "research.web",
48210
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).",
@@ -48255,7 +48416,7 @@ async function runDeepResearch(question) {
48255
48416
  }
48256
48417
  throw new Error("Deep research timed out");
48257
48418
  }
48258
- var webCommand = defineCommand179({
48419
+ var webCommand = defineCommand180({
48259
48420
  meta: {
48260
48421
  name: "web",
48261
48422
  description: `Search the web with AI to answer any open-ended marketing question. Uses live internet data via Google Search.
@@ -48317,7 +48478,7 @@ Examples:
48317
48478
  });
48318
48479
 
48319
48480
  // src/commands/research/index.ts
48320
- var researchCommand = defineCommand180({
48481
+ var researchCommand = defineCommand181({
48321
48482
  meta: {
48322
48483
  name: "research",
48323
48484
  description: `Competitive intelligence and AI-powered research commands.
@@ -48361,10 +48522,10 @@ Full guide: __tooling__/docs/tools/baker/research.md`
48361
48522
  });
48362
48523
 
48363
48524
  // src/commands/scheduled-actions/index.ts
48364
- import { defineCommand as defineCommand188 } from "citty";
48525
+ import { defineCommand as defineCommand189 } from "citty";
48365
48526
 
48366
48527
  // src/commands/scheduled-actions/create.ts
48367
- import { defineCommand as defineCommand181 } from "citty";
48528
+ import { defineCommand as defineCommand182 } from "citty";
48368
48529
 
48369
48530
  // src/commands/scheduled-actions/shared.ts
48370
48531
  var TEMP_SCHEDULED_ACTION_PREFIX = "temp_sched_";
@@ -48511,7 +48672,7 @@ registerSchema({
48511
48672
  }
48512
48673
  }
48513
48674
  });
48514
- var createCommand3 = defineCommand181({
48675
+ var createCommand3 = defineCommand182({
48515
48676
  meta: {
48516
48677
  name: "create",
48517
48678
  description: 'Stage a scheduled action. Example: baker scheduled-actions create --name "Weekly report" --description "..." --cron "0 9 * * MON"'
@@ -48570,7 +48731,7 @@ var createCommand3 = defineCommand181({
48570
48731
  });
48571
48732
 
48572
48733
  // src/commands/scheduled-actions/delete.ts
48573
- import { defineCommand as defineCommand182 } from "citty";
48734
+ import { defineCommand as defineCommand183 } from "citty";
48574
48735
  registerSchema({
48575
48736
  command: "scheduled-actions.delete",
48576
48737
  description: "Stage deletion of a published scheduled action or cancellation of a temp_sched_* draft creation.",
@@ -48578,7 +48739,7 @@ registerSchema({
48578
48739
  id: { type: "string", description: "Published scheduled action ID or temp_sched_* draft ID", required: true }
48579
48740
  }
48580
48741
  });
48581
- var deleteCommand3 = defineCommand182({
48742
+ var deleteCommand3 = defineCommand183({
48582
48743
  meta: {
48583
48744
  name: "delete",
48584
48745
  description: "Stage scheduled action deletion. Example: baker scheduled-actions delete <id-or-temp_sched_id>"
@@ -48607,7 +48768,7 @@ var deleteCommand3 = defineCommand182({
48607
48768
  });
48608
48769
 
48609
48770
  // src/commands/scheduled-actions/get.ts
48610
- import { defineCommand as defineCommand183 } from "citty";
48771
+ import { defineCommand as defineCommand184 } from "citty";
48611
48772
  registerSchema({
48612
48773
  command: "scheduled-actions.get",
48613
48774
  description: "Get a published scheduled action or a temp_sched_* draft-created scheduled action.",
@@ -48616,7 +48777,7 @@ registerSchema({
48616
48777
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
48617
48778
  }
48618
48779
  });
48619
- var getCommand4 = defineCommand183({
48780
+ var getCommand4 = defineCommand184({
48620
48781
  meta: {
48621
48782
  name: "get",
48622
48783
  description: "Get a scheduled action. Example: baker scheduled-actions get <id-or-temp_sched_id>"
@@ -48655,7 +48816,7 @@ var getCommand4 = defineCommand183({
48655
48816
  });
48656
48817
 
48657
48818
  // src/commands/scheduled-actions/list.ts
48658
- import { defineCommand as defineCommand184 } from "citty";
48819
+ import { defineCommand as defineCommand185 } from "citty";
48659
48820
  registerSchema({
48660
48821
  command: "scheduled-actions.list",
48661
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.",
@@ -48663,7 +48824,7 @@ registerSchema({
48663
48824
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
48664
48825
  }
48665
48826
  });
48666
- var listCommand15 = defineCommand184({
48827
+ var listCommand15 = defineCommand185({
48667
48828
  meta: {
48668
48829
  name: "list",
48669
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."
@@ -48688,7 +48849,7 @@ var listCommand15 = defineCommand184({
48688
48849
  // src/commands/scheduled-actions/templates.ts
48689
48850
  import { readFile as readFile25 } from "fs/promises";
48690
48851
  import path39 from "path";
48691
- import { defineCommand as defineCommand185 } from "citty";
48852
+ import { defineCommand as defineCommand186 } from "citty";
48692
48853
  registerSchema({
48693
48854
  command: "scheduled-actions.templates",
48694
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.",
@@ -48743,7 +48904,7 @@ registerSchema({
48743
48904
  }
48744
48905
  }
48745
48906
  });
48746
- var templatesCommand = defineCommand185({
48907
+ var templatesCommand = defineCommand186({
48747
48908
  meta: {
48748
48909
  name: "templates",
48749
48910
  description: `The recipes this company can run \u2014 Baker's own plus theirs, with what each one produces.
@@ -48835,7 +48996,7 @@ Full guide: __tooling__/docs/tools/baker/scheduled-actions.md`
48835
48996
  });
48836
48997
 
48837
48998
  // src/commands/scheduled-actions/trigger.ts
48838
- import { defineCommand as defineCommand186 } from "citty";
48999
+ import { defineCommand as defineCommand187 } from "citty";
48839
49000
  registerSchema({
48840
49001
  command: "scheduled-actions.trigger",
48841
49002
  description: "Immediately trigger a published scheduled action. Does not require BAKER_CHAT_ID and rejects temp_sched_* IDs.",
@@ -48843,7 +49004,7 @@ registerSchema({
48843
49004
  id: { type: "string", description: "Published scheduled action ID", required: true }
48844
49005
  }
48845
49006
  });
48846
- var triggerCommand = defineCommand186({
49007
+ var triggerCommand = defineCommand187({
48847
49008
  meta: {
48848
49009
  name: "trigger",
48849
49010
  description: "Immediately trigger a published scheduled action. Example: baker scheduled-actions trigger <id>"
@@ -48880,7 +49041,7 @@ var triggerCommand = defineCommand186({
48880
49041
  });
48881
49042
 
48882
49043
  // src/commands/scheduled-actions/update.ts
48883
- import { defineCommand as defineCommand187 } from "citty";
49044
+ import { defineCommand as defineCommand188 } from "citty";
48884
49045
  registerSchema({
48885
49046
  command: "scheduled-actions.update",
48886
49047
  description: "Stage an update to a published scheduled action or temp_sched_* draft-created scheduled action.",
@@ -48911,7 +49072,7 @@ registerSchema({
48911
49072
  prompt: { type: "string", description: "Replacement additional spawned-agent instructions", required: false }
48912
49073
  }
48913
49074
  });
48914
- var updateCommand3 = defineCommand187({
49075
+ var updateCommand3 = defineCommand188({
48915
49076
  meta: {
48916
49077
  name: "update",
48917
49078
  description: "Stage a scheduled action update. Examples: baker scheduled-actions update <id> --enabled false | baker scheduled-actions update <id> --mode publish"
@@ -48989,7 +49150,7 @@ var updateCommand3 = defineCommand187({
48989
49150
  });
48990
49151
 
48991
49152
  // src/commands/scheduled-actions/index.ts
48992
- var scheduledActionsCommand = defineCommand188({
49153
+ var scheduledActionsCommand = defineCommand189({
48993
49154
  meta: {
48994
49155
  name: "scheduled-actions",
48995
49156
  description: `Manage Scheduled Actions. Subcommands: list, get, create, update, delete, trigger, templates.
@@ -49018,14 +49179,14 @@ Full guide: __tooling__/docs/tools/baker/scheduled-actions.md`
49018
49179
  });
49019
49180
 
49020
49181
  // src/commands/schema.ts
49021
- import { defineCommand as defineCommand189 } from "citty";
49182
+ import { defineCommand as defineCommand190 } from "citty";
49022
49183
  function narrowToFamily(commandName, available) {
49023
49184
  const segments = commandName.split(".");
49024
49185
  const prefix = segments[0] === "ads" && segments[1] ? `ads.${segments[1]}.` : `${segments[0]}.`;
49025
49186
  const siblings = available.filter((name) => name.startsWith(prefix));
49026
49187
  return siblings.length > 0 ? siblings : available;
49027
49188
  }
49028
- var schemaCommand2 = defineCommand189({
49189
+ var schemaCommand2 = defineCommand190({
49029
49190
  meta: {
49030
49191
  name: "schema",
49031
49192
  description: "Inspect command argument schemas (for AI agent introspection). Lists all commands if no argument given. Example: baker schema images.search"
@@ -49069,10 +49230,10 @@ var schemaCommand2 = defineCommand189({
49069
49230
  });
49070
49231
 
49071
49232
  // src/commands/studio/index.ts
49072
- import { defineCommand as defineCommand198 } from "citty";
49233
+ import { defineCommand as defineCommand199 } from "citty";
49073
49234
 
49074
49235
  // src/commands/studio/animate.ts
49075
- import { defineCommand as defineCommand190 } from "citty";
49236
+ import { defineCommand as defineCommand191 } from "citty";
49076
49237
 
49077
49238
  // src/commands/studio/batch.ts
49078
49239
  function projectBatch(generation, full) {
@@ -49523,7 +49684,7 @@ function costHintsFor(body) {
49523
49684
  }
49524
49685
  return hints;
49525
49686
  }
49526
- var animateCommand = defineCommand190({
49687
+ var animateCommand = defineCommand191({
49527
49688
  meta: {
49528
49689
  name: "animate",
49529
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"
@@ -49647,7 +49808,7 @@ var animateCommand = defineCommand190({
49647
49808
  });
49648
49809
 
49649
49810
  // src/commands/studio/generate.ts
49650
- import { defineCommand as defineCommand191 } from "citty";
49811
+ import { defineCommand as defineCommand192 } from "citty";
49651
49812
  var MODEL_LIST2 = IMAGE_MODEL_IDS;
49652
49813
  var DEFAULT_MAX_WAIT_MS2 = 24e4;
49653
49814
  registerSchema({
@@ -49783,7 +49944,7 @@ function buildGenerateBody(args, prompt) {
49783
49944
  }
49784
49945
  return body;
49785
49946
  }
49786
- var generateCommand = defineCommand191({
49947
+ var generateCommand = defineCommand192({
49787
49948
  meta: {
49788
49949
  name: "generate",
49789
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]]'"
@@ -49866,7 +50027,7 @@ var generateCommand = defineCommand191({
49866
50027
  });
49867
50028
 
49868
50029
  // src/commands/studio/get.ts
49869
- import { defineCommand as defineCommand192 } from "citty";
50030
+ import { defineCommand as defineCommand193 } from "citty";
49870
50031
  registerSchema({
49871
50032
  command: "studio.get",
49872
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.",
@@ -49875,7 +50036,7 @@ registerSchema({
49875
50036
  full: { type: "boolean", description: "Include settings, references and attribution", required: false }
49876
50037
  }
49877
50038
  });
49878
- var getCommand5 = defineCommand192({
50039
+ var getCommand5 = defineCommand193({
49879
50040
  meta: {
49880
50041
  name: "get",
49881
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"
@@ -49904,7 +50065,7 @@ var getCommand5 = defineCommand192({
49904
50065
  });
49905
50066
 
49906
50067
  // src/commands/studio/improve.ts
49907
- import { defineCommand as defineCommand193 } from "citty";
50068
+ import { defineCommand as defineCommand194 } from "citty";
49908
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.";
49909
50070
  registerSchema({
49910
50071
  command: "studio.improve",
@@ -49929,7 +50090,7 @@ registerSchema({
49929
50090
  }
49930
50091
  }
49931
50092
  });
49932
- var improveCommand = defineCommand193({
50093
+ var improveCommand = defineCommand194({
49933
50094
  meta: {
49934
50095
  name: "improve",
49935
50096
  description: `${DESCRIPTION}
@@ -49973,7 +50134,7 @@ Examples:
49973
50134
  });
49974
50135
 
49975
50136
  // src/commands/studio/keep.ts
49976
- import { defineCommand as defineCommand194 } from "citty";
50137
+ import { defineCommand as defineCommand195 } from "citty";
49977
50138
  registerSchema({
49978
50139
  command: "studio.keep",
49979
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.",
@@ -49983,7 +50144,7 @@ registerSchema({
49983
50144
  undo: { type: "boolean", description: "Un-star an image, or take a kept clip back out", required: false }
49984
50145
  }
49985
50146
  });
49986
- var keepCommand = defineCommand194({
50147
+ var keepCommand = defineCommand195({
49987
50148
  meta: {
49988
50149
  name: "keep",
49989
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"
@@ -50034,7 +50195,7 @@ var keepCommand = defineCommand194({
50034
50195
  });
50035
50196
 
50036
50197
  // src/commands/studio/list.ts
50037
- import { defineCommand as defineCommand195 } from "citty";
50198
+ import { defineCommand as defineCommand196 } from "citty";
50038
50199
  registerSchema({
50039
50200
  command: "studio.list",
50040
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.",
@@ -50045,7 +50206,7 @@ registerSchema({
50045
50206
  full: { type: "boolean", description: "Include settings, references and attribution", required: false }
50046
50207
  }
50047
50208
  });
50048
- var listCommand16 = defineCommand195({
50209
+ var listCommand16 = defineCommand196({
50049
50210
  meta: {
50050
50211
  name: "list",
50051
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"
@@ -50079,7 +50240,7 @@ var listCommand16 = defineCommand195({
50079
50240
  });
50080
50241
 
50081
50242
  // src/commands/studio/models.ts
50082
- import { defineCommand as defineCommand196 } from "citty";
50243
+ import { defineCommand as defineCommand197 } from "citty";
50083
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.";
50084
50245
  registerSchema({
50085
50246
  command: "studio.models",
@@ -50166,7 +50327,7 @@ function buildModelCards(kind, model) {
50166
50327
  const selected = model ? ids.filter((id) => id === model) : ids;
50167
50328
  return selected.map((id) => build(id));
50168
50329
  }
50169
- var modelsCommand = defineCommand196({
50330
+ var modelsCommand = defineCommand197({
50170
50331
  meta: {
50171
50332
  name: "models",
50172
50333
  description: `${DESCRIPTION2}
@@ -50213,13 +50374,13 @@ Examples:
50213
50374
  });
50214
50375
 
50215
50376
  // src/commands/studio/skills.ts
50216
- import { defineCommand as defineCommand197 } from "citty";
50377
+ import { defineCommand as defineCommand198 } from "citty";
50217
50378
  registerSchema({
50218
50379
  command: "studio.skills",
50219
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.",
50220
50381
  args: {}
50221
50382
  });
50222
- var skillsCommand = defineCommand197({
50383
+ var skillsCommand = defineCommand198({
50223
50384
  meta: {
50224
50385
  name: "skills",
50225
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"
@@ -50243,7 +50404,7 @@ var skillsCommand = defineCommand197({
50243
50404
  });
50244
50405
 
50245
50406
  // src/commands/studio/index.ts
50246
- var studioCommand = defineCommand198({
50407
+ var studioCommand = defineCommand199({
50247
50408
  meta: {
50248
50409
  name: "studio",
50249
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.
@@ -50286,10 +50447,10 @@ Full guide: __tooling__/docs/tools/baker/studio.md`
50286
50447
  });
50287
50448
 
50288
50449
  // src/commands/tag-manager/index.ts
50289
- import { defineCommand as defineCommand202 } from "citty";
50450
+ import { defineCommand as defineCommand203 } from "citty";
50290
50451
 
50291
50452
  // src/commands/tag-manager/draft.ts
50292
- import { defineCommand as defineCommand199 } from "citty";
50453
+ import { defineCommand as defineCommand200 } from "citty";
50293
50454
 
50294
50455
  // src/commands/tag-manager/shared.ts
50295
50456
  import { readFileSync as readFileSync15 } from "fs";
@@ -50412,13 +50573,13 @@ registerSchema({
50412
50573
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
50413
50574
  }
50414
50575
  });
50415
- var draftCommand4 = defineCommand199({
50576
+ var draftCommand4 = defineCommand200({
50416
50577
  meta: {
50417
50578
  name: "draft",
50418
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."
50419
50580
  },
50420
50581
  subCommands: {
50421
- list: defineCommand199({
50582
+ list: defineCommand200({
50422
50583
  meta: {
50423
50584
  name: "list",
50424
50585
  description: "Review everything staged on this chat (--json for the raw envelope)"
@@ -50431,7 +50592,7 @@ var draftCommand4 = defineCommand199({
50431
50592
  await draftList2(args.json === true, args.chat);
50432
50593
  }
50433
50594
  }),
50434
- show: defineCommand199({
50595
+ show: defineCommand200({
50435
50596
  meta: {
50436
50597
  name: "show",
50437
50598
  description: "Print the full staged payload for one change \u2014 the receipt to verify it looks right before publish (never truncated)."
@@ -50448,7 +50609,7 @@ var draftCommand4 = defineCommand199({
50448
50609
  );
50449
50610
  }
50450
50611
  }),
50451
- amend: defineCommand199({
50612
+ amend: defineCommand200({
50452
50613
  meta: {
50453
50614
  name: "amend",
50454
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."
@@ -50465,7 +50626,7 @@ var draftCommand4 = defineCommand199({
50465
50626
  });
50466
50627
  }
50467
50628
  }),
50468
- remove: defineCommand199({
50629
+ remove: defineCommand200({
50469
50630
  meta: { name: "remove", description: "Remove one staged change (cascades to anything depending on it)" },
50470
50631
  args: { ref: { type: "positional", description: "Staged ref (gtm_temp_*) or target", required: false } },
50471
50632
  run: async ({ args }) => {
@@ -50474,7 +50635,7 @@ var draftCommand4 = defineCommand199({
50474
50635
  });
50475
50636
  }
50476
50637
  }),
50477
- clear: defineCommand199({
50638
+ clear: defineCommand200({
50478
50639
  meta: { name: "clear", description: "Discard all Tag Manager changes staged on this chat" },
50479
50640
  run: async () => {
50480
50641
  await draftAction3("/api/tag-manager/draft/clear", {});
@@ -50484,7 +50645,7 @@ var draftCommand4 = defineCommand199({
50484
50645
  });
50485
50646
 
50486
50647
  // src/commands/tag-manager/read.ts
50487
- import { defineCommand as defineCommand200 } from "citty";
50648
+ import { defineCommand as defineCommand201 } from "citty";
50488
50649
  registerSchema({
50489
50650
  command: "tagManager.containers",
50490
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.",
@@ -50525,7 +50686,7 @@ function containersHints(containers) {
50525
50686
  }))
50526
50687
  });
50527
50688
  }
50528
- var containersCommand = defineCommand200({
50689
+ var containersCommand = defineCommand201({
50529
50690
  meta: {
50530
50691
  name: "containers",
50531
50692
  description: `List Tag Manager containers reachable by this company's connection.
@@ -50542,7 +50703,7 @@ Start here:
50542
50703
  }
50543
50704
  }
50544
50705
  });
50545
- var readCommand = defineCommand200({
50706
+ var readCommand = defineCommand201({
50546
50707
  meta: {
50547
50708
  name: "read",
50548
50709
  description: `Read the current contents of the Tag Manager container \u2014 always do this before staging changes.
@@ -50584,7 +50745,7 @@ Examples:
50584
50745
  });
50585
50746
 
50586
50747
  // src/commands/tag-manager/write-commands.ts
50587
- import { defineCommand as defineCommand201 } from "citty";
50748
+ import { defineCommand as defineCommand202 } from "citty";
50588
50749
  var CONTAINER_ARG_DESCRIPTION = "Numeric container id (optional only when one container is connected \u2014 run `baker tag-manager containers`)";
50589
50750
  var ENTITIES = [
50590
50751
  {
@@ -50640,10 +50801,10 @@ for (const { entity, noun, createHint } of ENTITIES) {
50640
50801
  });
50641
50802
  }
50642
50803
  function entityCommand(entity, noun, example) {
50643
- return defineCommand201({
50804
+ return defineCommand202({
50644
50805
  meta: { name: entity, description: `Stage ${noun} changes on this chat's Tag Manager draft` },
50645
50806
  subCommands: {
50646
- create: defineCommand201({
50807
+ create: defineCommand202({
50647
50808
  meta: {
50648
50809
  name: "create",
50649
50810
  description: `Stage a new ${noun}
@@ -50665,7 +50826,7 @@ Examples:
50665
50826
  });
50666
50827
  }
50667
50828
  }),
50668
- update: defineCommand201({
50829
+ update: defineCommand202({
50669
50830
  meta: {
50670
50831
  name: "update",
50671
50832
  description: `Stage an update to an existing ${noun} (pass its id or path)`
@@ -50685,7 +50846,7 @@ Examples:
50685
50846
  });
50686
50847
  }
50687
50848
  }),
50688
- delete: defineCommand201({
50849
+ delete: defineCommand202({
50689
50850
  meta: { name: "delete", description: `Stage the deletion of a ${noun} (pass its id or path)` },
50690
50851
  args: {
50691
50852
  id: { type: "positional", description: `${noun} id or path`, required: false },
@@ -50726,7 +50887,7 @@ function builtinTypes(args) {
50726
50887
  }
50727
50888
  return raw.split(",").map((entry) => entry.trim());
50728
50889
  }
50729
- var builtinCommand = defineCommand201({
50890
+ var builtinCommand = defineCommand202({
50730
50891
  meta: {
50731
50892
  name: "builtin",
50732
50893
  description: `Enable or disable built-in variables
@@ -50736,7 +50897,7 @@ Examples:
50736
50897
  baker tag-manager builtin disable --types formId`
50737
50898
  },
50738
50899
  subCommands: {
50739
- enable: defineCommand201({
50900
+ enable: defineCommand202({
50740
50901
  meta: { name: "enable", description: "Stage enabling built-in variables" },
50741
50902
  args: {
50742
50903
  types: { type: "string", description: "Comma-separated types", required: false },
@@ -50750,7 +50911,7 @@ Examples:
50750
50911
  });
50751
50912
  }
50752
50913
  }),
50753
- disable: defineCommand201({
50914
+ disable: defineCommand202({
50754
50915
  meta: { name: "disable", description: "Stage disabling built-in variables" },
50755
50916
  args: {
50756
50917
  types: { type: "string", description: "Comma-separated types", required: false },
@@ -50768,7 +50929,7 @@ Examples:
50768
50929
  });
50769
50930
 
50770
50931
  // src/commands/tag-manager/index.ts
50771
- var tagManagerCommand = defineCommand202({
50932
+ var tagManagerCommand = defineCommand203({
50772
50933
  meta: {
50773
50934
  name: "tag-manager",
50774
50935
  description: `Read and change what lives inside the client's Google Tag Manager container \u2014 tags, triggers, variables, folders and built-in variables.
@@ -50805,7 +50966,7 @@ Full guide: __tooling__/docs/tools/baker/tag-manager.md`
50805
50966
  });
50806
50967
 
50807
50968
  // src/commands/tags/index.ts
50808
- import { defineCommand as defineCommand203 } from "citty";
50969
+ import { defineCommand as defineCommand204 } from "citty";
50809
50970
 
50810
50971
  // src/commands/tags/shared.ts
50811
50972
  function failApi3(err) {
@@ -50874,7 +51035,7 @@ async function listTags(json) {
50874
51035
  var listArgs9 = {
50875
51036
  json: { type: "boolean", description: "Print the raw JSON envelope instead of the readable list" }
50876
51037
  };
50877
- var listCommand17 = defineCommand203({
51038
+ var listCommand17 = defineCommand204({
50878
51039
  meta: {
50879
51040
  name: "list",
50880
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"
@@ -50893,7 +51054,7 @@ async function listDraft3(chat) {
50893
51054
  failApi3(err);
50894
51055
  }
50895
51056
  }
50896
- var draftCommand5 = defineCommand203({
51057
+ var draftCommand5 = defineCommand204({
50897
51058
  meta: {
50898
51059
  name: "draft",
50899
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."
@@ -50903,7 +51064,7 @@ var draftCommand5 = defineCommand203({
50903
51064
  await listDraft3(args.chat);
50904
51065
  }
50905
51066
  });
50906
- var tagsCommand4 = defineCommand203({
51067
+ var tagsCommand4 = defineCommand204({
50907
51068
  meta: {
50908
51069
  name: "tags",
50909
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.
@@ -50932,10 +51093,10 @@ Full guide: __tooling__/docs/tools/baker/tags.md`
50932
51093
  });
50933
51094
 
50934
51095
  // src/commands/testimonials/index.ts
50935
- import { defineCommand as defineCommand207 } from "citty";
51096
+ import { defineCommand as defineCommand208 } from "citty";
50936
51097
 
50937
51098
  // src/commands/testimonials/get.ts
50938
- import { defineCommand as defineCommand204 } from "citty";
51099
+ import { defineCommand as defineCommand205 } from "citty";
50939
51100
  registerSchema({
50940
51101
  command: "testimonials.get",
50941
51102
  description: "Get a single testimonial by ID",
@@ -50943,7 +51104,7 @@ registerSchema({
50943
51104
  id: { type: "string", description: "Testimonial ID", required: true }
50944
51105
  }
50945
51106
  });
50946
- var getCommand6 = defineCommand204({
51107
+ var getCommand6 = defineCommand205({
50947
51108
  meta: { name: "get", description: "Get a single testimonial by ID. Example: baker testimonials get j571abc123" },
50948
51109
  args: {
50949
51110
  id: { type: "positional", description: "Testimonial ID", required: false },
@@ -50980,7 +51141,7 @@ var getCommand6 = defineCommand204({
50980
51141
  });
50981
51142
 
50982
51143
  // src/commands/testimonials/list.ts
50983
- import { defineCommand as defineCommand205 } from "citty";
51144
+ import { defineCommand as defineCommand206 } from "citty";
50984
51145
 
50985
51146
  // src/commands/testimonials/emptyCorpusHints.ts
50986
51147
  function resolveEmptyReason({
@@ -51115,7 +51276,7 @@ function buildListParams(args) {
51115
51276
  }
51116
51277
  return params;
51117
51278
  }
51118
- var listCommand18 = defineCommand205({
51279
+ var listCommand18 = defineCommand206({
51119
51280
  meta: {
51120
51281
  name: "list",
51121
51282
  description: "List testimonials with optional filters. Example: baker testimonials list --source google --sentiment positive"
@@ -51167,7 +51328,7 @@ var listCommand18 = defineCommand205({
51167
51328
  });
51168
51329
 
51169
51330
  // src/commands/testimonials/search.ts
51170
- import { defineCommand as defineCommand206 } from "citty";
51331
+ import { defineCommand as defineCommand207 } from "citty";
51171
51332
  var FILTER_FLAGS2 = ["source", "rating-min", "rating-max", "status", "sentiment", "language", "tags"];
51172
51333
  function languageBiasHint(results, requestedLanguage) {
51173
51334
  if (requestedLanguage) {
@@ -51246,7 +51407,7 @@ function buildSearchRequest(query, args) {
51246
51407
  }
51247
51408
  return body;
51248
51409
  }
51249
- var searchCommand3 = defineCommand206({
51410
+ var searchCommand3 = defineCommand207({
51250
51411
  meta: {
51251
51412
  name: "search",
51252
51413
  description: "Semantic search testimonials by text query. Uses hybrid BM25 + vector + reranking. Example: baker testimonials search 'great service' --rating-min 4"
@@ -51310,7 +51471,7 @@ var searchCommand3 = defineCommand206({
51310
51471
  var tagsCommand5 = makeTagsCommand("testimonials", "testimonial", "/api/testimonials/tags");
51311
51472
 
51312
51473
  // src/commands/testimonials/index.ts
51313
- var testimonialsCommand = defineCommand207({
51474
+ var testimonialsCommand = defineCommand208({
51314
51475
  meta: {
51315
51476
  name: "testimonials",
51316
51477
  description: `Find and browse testimonials in Baker. Subcommands: search, get, list, tags.
@@ -51332,10 +51493,10 @@ Full guide: __tooling__/docs/tools/baker/testimonials.md`
51332
51493
  });
51333
51494
 
51334
51495
  // src/commands/videos/index.ts
51335
- import { defineCommand as defineCommand214 } from "citty";
51496
+ import { defineCommand as defineCommand215 } from "citty";
51336
51497
 
51337
51498
  // src/commands/videos/delete.ts
51338
- import { defineCommand as defineCommand208 } from "citty";
51499
+ import { defineCommand as defineCommand209 } from "citty";
51339
51500
  registerSchema({
51340
51501
  command: "videos.delete",
51341
51502
  description: "Delete a video by ID",
@@ -51349,7 +51510,7 @@ registerSchema({
51349
51510
  }
51350
51511
  }
51351
51512
  });
51352
- var deleteCommand4 = defineCommand208({
51513
+ var deleteCommand4 = defineCommand209({
51353
51514
  meta: {
51354
51515
  name: "delete",
51355
51516
  description: "Delete a video by ID. Use --dry-run to preview. Example: baker videos delete j571abc123 --dry-run"
@@ -51390,7 +51551,7 @@ var deleteCommand4 = defineCommand208({
51390
51551
  });
51391
51552
 
51392
51553
  // src/commands/videos/get.ts
51393
- import { defineCommand as defineCommand209 } from "citty";
51554
+ import { defineCommand as defineCommand210 } from "citty";
51394
51555
  registerSchema({
51395
51556
  command: "videos.get",
51396
51557
  description: "Get a single video by ID",
@@ -51398,7 +51559,7 @@ registerSchema({
51398
51559
  id: { type: "string", description: "Video ID", required: true }
51399
51560
  }
51400
51561
  });
51401
- var getCommand7 = defineCommand209({
51562
+ var getCommand7 = defineCommand210({
51402
51563
  meta: { name: "get", description: "Get a single video by ID. Example: baker videos get j571abc123" },
51403
51564
  args: {
51404
51565
  id: { type: "positional", description: "Video ID", required: false },
@@ -51435,7 +51596,7 @@ var getCommand7 = defineCommand209({
51435
51596
  });
51436
51597
 
51437
51598
  // src/commands/videos/group.ts
51438
- import { defineCommand as defineCommand210 } from "citty";
51599
+ import { defineCommand as defineCommand211 } from "citty";
51439
51600
  registerSchema({
51440
51601
  command: "videos.group",
51441
51602
  description: "List every clip and image that arrived in the same set as this video (carousel slides, one page)",
@@ -51444,7 +51605,7 @@ registerSchema({
51444
51605
  "group-key": { type: "string", description: "The set key directly, when you already have it", required: false }
51445
51606
  }
51446
51607
  });
51447
- var groupCommand2 = defineCommand210({
51608
+ var groupCommand2 = defineCommand211({
51448
51609
  meta: {
51449
51610
  name: "group",
51450
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>"
@@ -51467,7 +51628,7 @@ var groupCommand2 = defineCommand210({
51467
51628
  import { mkdtemp as mkdtemp3, rm as rm8, stat as stat8 } from "fs/promises";
51468
51629
  import { tmpdir as tmpdir4 } from "os";
51469
51630
  import path40 from "path";
51470
- import { defineCommand as defineCommand211 } from "citty";
51631
+ import { defineCommand as defineCommand212 } from "citty";
51471
51632
 
51472
51633
  // src/lib/streamUpload.ts
51473
51634
  import { createHash as createHash2 } from "crypto";
@@ -51631,7 +51792,7 @@ registerSchema({
51631
51792
  "dry-run": { type: "boolean", description: "Preview the operation without executing", required: false }
51632
51793
  }
51633
51794
  });
51634
- var ingestCommand2 = defineCommand211({
51795
+ var ingestCommand2 = defineCommand212({
51635
51796
  meta: {
51636
51797
  name: "ingest",
51637
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"
@@ -51893,7 +52054,7 @@ async function uploadToAssetStore(filePath, sizeBytes) {
51893
52054
  }
51894
52055
 
51895
52056
  // src/commands/videos/search.ts
51896
- import { defineCommand as defineCommand212 } from "citty";
52057
+ import { defineCommand as defineCommand213 } from "citty";
51897
52058
  registerSchema({
51898
52059
  command: "videos.search",
51899
52060
  description: "Search videos by text query. Only returns ready videos.",
@@ -51903,7 +52064,7 @@ registerSchema({
51903
52064
  tags: { type: "string", description: "Comma-separated tags to filter by", required: false }
51904
52065
  }
51905
52066
  });
51906
- var searchCommand4 = defineCommand212({
52067
+ var searchCommand4 = defineCommand213({
51907
52068
  meta: {
51908
52069
  name: "search",
51909
52070
  description: "Semantic search videos by text query. Uses hybrid BM25 + vector + reranking. Example: baker videos search 'product demo' --tags tutorial"
@@ -51955,7 +52116,7 @@ var tagsCommand6 = makeTagsCommand("videos", "video", "/api/videos/tags");
51955
52116
  // src/commands/videos/upload.ts
51956
52117
  import { readFile as readFile26, stat as stat9 } from "fs/promises";
51957
52118
  import { basename as basename3, extname as extname4 } from "path";
51958
- import { defineCommand as defineCommand213 } from "citty";
52119
+ import { defineCommand as defineCommand214 } from "citty";
51959
52120
  var MIME_MAP = {
51960
52121
  ".mp4": "video/mp4",
51961
52122
  ".mov": "video/quicktime",
@@ -51997,7 +52158,7 @@ function detectContentType(filePath) {
51997
52158
  function isRemoteUrl3(value) {
51998
52159
  return /^https?:\/\//i.test(value);
51999
52160
  }
52000
- var uploadCommand2 = defineCommand213({
52161
+ var uploadCommand2 = defineCommand214({
52001
52162
  meta: {
52002
52163
  name: "upload",
52003
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"
@@ -52081,7 +52242,7 @@ var uploadCommand2 = defineCommand213({
52081
52242
  });
52082
52243
 
52083
52244
  // src/commands/videos/index.ts
52084
- var videosCommand = defineCommand214({
52245
+ var videosCommand = defineCommand215({
52085
52246
  meta: {
52086
52247
  name: "videos",
52087
52248
  description: `Find and manage videos in Baker. Subcommands: search, get, upload, ingest, delete, tags.
@@ -52108,10 +52269,10 @@ Full guide: __tooling__/docs/tools/baker/videos.md`
52108
52269
  });
52109
52270
 
52110
52271
  // src/commands/winning-ads/index.ts
52111
- import { defineCommand as defineCommand227 } from "citty";
52272
+ import { defineCommand as defineCommand228 } from "citty";
52112
52273
 
52113
52274
  // src/commands/winning-ads/advertisers.ts
52114
- import { defineCommand as defineCommand215 } from "citty";
52275
+ import { defineCommand as defineCommand216 } from "citty";
52115
52276
 
52116
52277
  // src/commands/winning-ads/shared.ts
52117
52278
  function splitList2(value) {
@@ -52164,7 +52325,7 @@ function advertiserNormalizer(record, full) {
52164
52325
  last_synced_at: record.last_synced_at ?? null
52165
52326
  };
52166
52327
  }
52167
- var advertisersCommand2 = defineCommand215({
52328
+ var advertisersCommand2 = defineCommand216({
52168
52329
  meta: {
52169
52330
  name: "advertisers",
52170
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'
@@ -52222,7 +52383,7 @@ var advertisersCommand2 = defineCommand215({
52222
52383
  });
52223
52384
 
52224
52385
  // src/commands/winning-ads/brief.ts
52225
- import { defineCommand as defineCommand216 } from "citty";
52386
+ import { defineCommand as defineCommand217 } from "citty";
52226
52387
  registerSchema({
52227
52388
  command: "winning-ads.brief",
52228
52389
  description: "Generate a creative brief grounded in strategically-similar winning ads. Optionally describe the target creative with --dna (JSON) and steer with --notes.",
@@ -52268,7 +52429,7 @@ function parseDna(raw) {
52268
52429
  }
52269
52430
  return parsed;
52270
52431
  }
52271
- var briefCommand = defineCommand216({
52432
+ var briefCommand = defineCommand217({
52272
52433
  meta: {
52273
52434
  name: "brief",
52274
52435
  description: `Generate a creative brief from winning references. Example: baker winning-ads brief --dna '{"angle":"cost savings"}' --notes "B2B, LinkedIn video" --k 8`
@@ -52304,7 +52465,7 @@ var briefCommand = defineCommand216({
52304
52465
  });
52305
52466
 
52306
52467
  // src/commands/winning-ads/content.ts
52307
- import { defineCommand as defineCommand217 } from "citty";
52468
+ import { defineCommand as defineCommand218 } from "citty";
52308
52469
  registerSchema({
52309
52470
  command: "winning-ads.content",
52310
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.",
@@ -52317,7 +52478,7 @@ registerSchema({
52317
52478
  }
52318
52479
  }
52319
52480
  });
52320
- var contentCommand = defineCommand217({
52481
+ var contentCommand = defineCommand218({
52321
52482
  meta: {
52322
52483
  name: "content",
52323
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"
@@ -52366,7 +52527,7 @@ var contentCommand = defineCommand217({
52366
52527
  });
52367
52528
 
52368
52529
  // src/commands/winning-ads/feed.ts
52369
- import { defineCommand as defineCommand218 } from "citty";
52530
+ import { defineCommand as defineCommand219 } from "citty";
52370
52531
  function buildFeedParams(input) {
52371
52532
  const params = {};
52372
52533
  const advertiser = splitList2(input.advertiser);
@@ -52418,7 +52579,7 @@ registerSchema({
52418
52579
  format: { type: "string", description: "Comma-separated formats to include (e.g. static,video)", required: false }
52419
52580
  }
52420
52581
  });
52421
- var feedCommand = defineCommand218({
52582
+ var feedCommand = defineCommand219({
52422
52583
  meta: {
52423
52584
  name: "feed",
52424
52585
  description: "Winners across every brand you follow (browse, then trim per advertiser). Example: baker winning-ads feed --per-advertiser 5 --output md"
@@ -52503,7 +52664,7 @@ var feedCommand = defineCommand218({
52503
52664
  });
52504
52665
 
52505
52666
  // src/commands/winning-ads/follow.ts
52506
- import { defineCommand as defineCommand219 } from "citty";
52667
+ import { defineCommand as defineCommand220 } from "citty";
52507
52668
  var PLATFORMS = ["meta", "linkedin"];
52508
52669
  registerSchema({
52509
52670
  command: "winning-ads.follow",
@@ -52518,7 +52679,7 @@ registerSchema({
52518
52679
  label: { type: "string", description: "Optional display label (defaults to the resolved name)", required: false }
52519
52680
  }
52520
52681
  });
52521
- var followCommand = defineCommand219({
52682
+ var followCommand = defineCommand220({
52522
52683
  meta: {
52523
52684
  name: "follow",
52524
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'
@@ -52565,7 +52726,7 @@ var followCommand = defineCommand219({
52565
52726
  });
52566
52727
 
52567
52728
  // src/commands/winning-ads/follow-competitors.ts
52568
- import { defineCommand as defineCommand220 } from "citty";
52729
+ import { defineCommand as defineCommand221 } from "citty";
52569
52730
  var PLATFORMS2 = ["meta", "linkedin"];
52570
52731
  var BATCH_TIMEOUT_MS = 3e5;
52571
52732
  function buildFollowBatchBody(input) {
@@ -52598,7 +52759,7 @@ registerSchema({
52598
52759
  }
52599
52760
  }
52600
52761
  });
52601
- var followCompetitorsCommand = defineCommand220({
52762
+ var followCompetitorsCommand = defineCommand221({
52602
52763
  meta: {
52603
52764
  name: "follow-competitors",
52604
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"'
@@ -52673,7 +52834,7 @@ var followCompetitorsCommand = defineCommand220({
52673
52834
  });
52674
52835
 
52675
52836
  // src/commands/winning-ads/following.ts
52676
- import { defineCommand as defineCommand221 } from "citty";
52837
+ import { defineCommand as defineCommand222 } from "citty";
52677
52838
  registerSchema({
52678
52839
  command: "winning-ads.following",
52679
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.",
@@ -52727,7 +52888,7 @@ function followingNormalizer(record, full) {
52727
52888
  platforms: Array.isArray(record.platforms) ? record.platforms : []
52728
52889
  };
52729
52890
  }
52730
- var followingCommand = defineCommand221({
52891
+ var followingCommand = defineCommand222({
52731
52892
  meta: {
52732
52893
  name: "following",
52733
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"
@@ -52763,7 +52924,7 @@ var followingCommand = defineCommand221({
52763
52924
  });
52764
52925
 
52765
52926
  // src/commands/winning-ads/patterns.ts
52766
- import { defineCommand as defineCommand222 } from "citty";
52927
+ import { defineCommand as defineCommand223 } from "citty";
52767
52928
  registerSchema({
52768
52929
  command: "winning-ads.patterns",
52769
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.",
@@ -52802,7 +52963,7 @@ function discriminatorRow(record) {
52802
52963
  top_values_duds: Array.isArray(record.top_values_b) ? record.top_values_b.join(", ") : ""
52803
52964
  };
52804
52965
  }
52805
- var patternsCommand = defineCommand222({
52966
+ var patternsCommand = defineCommand223({
52806
52967
  meta: {
52807
52968
  name: "patterns",
52808
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"
@@ -52858,7 +53019,7 @@ var patternsCommand = defineCommand222({
52858
53019
  });
52859
53020
 
52860
53021
  // src/commands/winning-ads/search.ts
52861
- import { defineCommand as defineCommand223 } from "citty";
53022
+ import { defineCommand as defineCommand224 } from "citty";
52862
53023
  registerSchema({
52863
53024
  command: "winning-ads.search",
52864
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.",
@@ -52966,7 +53127,7 @@ function buildSearchBody2(args) {
52966
53127
  }
52967
53128
  return body;
52968
53129
  }
52969
- var searchCommand5 = defineCommand223({
53130
+ var searchCommand5 = defineCommand224({
52970
53131
  meta: {
52971
53132
  name: "search",
52972
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"
@@ -53081,7 +53242,7 @@ var searchCommand5 = defineCommand223({
53081
53242
  });
53082
53243
 
53083
53244
  // src/commands/winning-ads/seeds.ts
53084
- import { defineCommand as defineCommand224 } from "citty";
53245
+ import { defineCommand as defineCommand225 } from "citty";
53085
53246
  function leanRow(r) {
53086
53247
  return {
53087
53248
  key: r.key,
@@ -53109,7 +53270,7 @@ function makeSeedCommand(opts) {
53109
53270
  limit: { type: "number", description: "Max keys 1-100 (default 20)", required: false, default: 20 }
53110
53271
  }
53111
53272
  });
53112
- return defineCommand224({
53273
+ return defineCommand225({
53113
53274
  meta: { name: opts.name, description: opts.description },
53114
53275
  args: {
53115
53276
  platform: { type: "string", description: "Single platform to segment on", required: false },
@@ -53158,7 +53319,7 @@ var formatsCommand = makeSeedCommand({
53158
53319
  });
53159
53320
 
53160
53321
  // src/commands/winning-ads/unfollow.ts
53161
- import { defineCommand as defineCommand225 } from "citty";
53322
+ import { defineCommand as defineCommand226 } from "citty";
53162
53323
  registerSchema({
53163
53324
  command: "winning-ads.unfollow",
53164
53325
  description: "Stop following a brand \u2014 removes it from your ad-dna library by advertiser id.",
@@ -53166,7 +53327,7 @@ registerSchema({
53166
53327
  advertiser: { type: "string", description: "Advertiser id to unfollow", required: true }
53167
53328
  }
53168
53329
  });
53169
- var unfollowCommand = defineCommand225({
53330
+ var unfollowCommand = defineCommand226({
53170
53331
  meta: {
53171
53332
  name: "unfollow",
53172
53333
  description: "Stop following a brand by advertiser id. Example: baker winning-ads unfollow adv_123"
@@ -53187,7 +53348,7 @@ var unfollowCommand = defineCommand225({
53187
53348
  });
53188
53349
 
53189
53350
  // src/commands/winning-ads/winners.ts
53190
- import { defineCommand as defineCommand226 } from "citty";
53351
+ import { defineCommand as defineCommand227 } from "citty";
53191
53352
  registerSchema({
53192
53353
  command: "winning-ads.winners",
53193
53354
  description: "Top winning ads for one advertiser id (from `advertisers` or `following`). Returns lean winner cards; add --full for DNA + longevity.",
@@ -53197,7 +53358,7 @@ registerSchema({
53197
53358
  platform: { type: "string", description: "Filter to a single platform: meta|linkedin", required: false }
53198
53359
  }
53199
53360
  });
53200
- var winnersCommand = defineCommand226({
53361
+ var winnersCommand = defineCommand227({
53201
53362
  meta: {
53202
53363
  name: "winners",
53203
53364
  description: "Top winning ads for a specific advertiser id. Example: baker winning-ads winners adv_123 --top 15 --output md"
@@ -53247,7 +53408,7 @@ var winnersCommand = defineCommand226({
53247
53408
  });
53248
53409
 
53249
53410
  // src/commands/winning-ads/index.ts
53250
- var winningAdsCommand = defineCommand227({
53411
+ var winningAdsCommand = defineCommand228({
53251
53412
  meta: {
53252
53413
  name: "winning-ads",
53253
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.
@@ -53485,7 +53646,7 @@ function getCliVersion() {
53485
53646
  }
53486
53647
 
53487
53648
  // src/cli.ts
53488
- var main = defineCommand228({
53649
+ var main = defineCommand229({
53489
53650
  meta: {
53490
53651
  name: "baker",
53491
53652
  version: getCliVersion(),