@koda-sl/baker-cli 0.306.2-dev.bb28562ac → 0.306.6-dev.368ebfa99

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3898,10 +3898,16 @@ paid for by the time it runs — and the findings come back as `review` and `hin
3898
3898
  Each per-frame finding names the **scene file** that produced that second, so a defect is
3899
3899
  an edit rather than a hunt — and re-running re-renders only the scenes you changed.
3900
3900
 
3901
- It needs `GEMINI_API_KEY` (the Runtime receives it automatically). Without one the run
3901
+ It needs `OPENROUTER_API_KEY` (the Runtime receives it automatically). Without one the run
3902
3902
  says the video was **not** reviewed rather than reporting it clean, and a frame that
3903
3903
  could not be read is reported as unchecked for the same reason.
3904
3904
 
3905
+ The review goes through OpenRouter like every other model call on the platform, so what
3906
+ it costs comes back with the answer and is billed against the run. The models float
3907
+ (`~google/gemini-flash-latest` watches, `~google/gemini-pro-latest` reads the stills) —
3908
+ safe to float precisely because nothing here holds a price list that could go stale
3909
+ against them.
3910
+
3905
3911
 
3906
3912
  > Scaffolded canvases use **workspace-relative** composition/asset paths and are validated
3907
3913
  > against the engine's hyperframe pre-render gate at `validate` time, so a broken overlay
@@ -6157,6 +6163,7 @@ Pushing to `main` with changes in `packages/cli/` triggers the GitHub Actions wo
6157
6163
 
6158
6164
  - **0.291.0**: **the image handover Task no longer depends on having uploaded the images.** It was built only from staged `asset.create` image ops, so a Session that audited a live account — found the brand campaign carrying 22 image extensions and the generic one carrying none, and reached for `assets attach` on assets that were *already in the library* — got Google's refusal and nothing else: no upload to hang a Task on, and a CLI hint telling the agent not to raise one by hand because "Baker stages it itself". The one step only the user can take reached them as a sentence in a chat that scrolls away. An image `assets attach` is now **skipped rather than refused**: it still never reaches Google (re-verified live with `validate_only` on v23 *and* v25 against 3865083115, against a control op that validates clean in the same request — `AD_IMAGE` → `UNSUPPORTED_FIELD_TYPE` at customer and campaign level, `MARKETING_IMAGE` → `FIELD_TYPE_INCOMPATIBLE_WITH_CAMPAIGN_TYPE`, `BUSINESS_LOGO` → `CUSTOMER_NOT_VERIFIED`, which is what proves the field type is the objection; **we are not on Google's allowlist for it**), but the skip carries the image and campaign names, recorded on the draft so the next staged op cannot recompute the Task away, and a batch that also carries sitelinks keeps them instead of failing whole. The schema stopped refusing the field type for the same reason: a boundary refusal has no chat to record a handover against.
6159
6165
 
6166
+ - **0.306.6**: the render review moved onto OpenRouter, where every other model call on this platform already goes. It was calling Gemini directly on the stated grounds that the watch pass uploads the finished mp4 inline and OpenRouter had no route that takes one — it does: a `video_url` content part accepts a base64 data URL, verified end to end (HTTP 200, video tokens counted, the model describing the clip it was sent). That one wrong premise had cost a hand-maintained price table in the backend, token counts round-tripping through the run record to be priced there, a second credential in every Runtime, and a model id pinned to `gemini-3.7-flash` so the table's key would not drift — which is also why the review had quietly stayed off `gemini-3.8-flash`. Now the reply carries `usage.cost`, the Runtime relays the gateway's figure instead of computing one, and the models float (`~google/gemini-flash-latest`, `~google/gemini-pro-latest`). The key it reads is `OPENROUTER_API_KEY`; `GEMINI_API_KEY` is still shipped for HyperFrames' own `snapshot --describe` pass, which is a third-party tool and reads that name.
6160
6167
  - **0.306.0**: review fixes across the avatar and ad paths. **A silent clip is 5 seconds again** — the 8s speaking floor was applied to every `studio animate` call, not just ones that cast an avatar, so plain b-roll was lengthened by three seconds and billed for them. **`scaffold-ad` validates the mark it will actually draw**: the logo gates read the path the spec named rather than the one `fetchClientLogo` had just put there, so a fetched mark either skipped both checks or was refused as unreadable. **The render review is told where the ad is set, who it is for and what the script says** — read off the blueprint beside the canvas; without them the watch pass judged an accent against nothing and still graded the verdict as blocking. **A beat is "too short" by its LINE, not by the clip floor** — the old test needed a 25-word clause, so it fired on all three beats of this command's own documented example. **A voiceover stays a voiceover** — a phrase nobody is shown speaking was being folded into the presenter's clip and said on camera, words that shot was never generated for; the fold now applies only where there is a mouth for the words to contradict. `--voice-id` / `--voice-description` are gone from `baker avatars create` (0.252.0 said so; the flags were still declared and still sent), `end_card.cta` is documented as having no default, and the dead Veo/Omni content-block fallbacks are removed.
6161
6168
 
6162
6169
  ### Testing a pre-release in sandboxes
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  ApiError,
3
3
  apiGet
4
- } from "./chunk-KDTHRRAC.js";
4
+ } from "./chunk-TTIGSGXE.js";
5
5
  import {
6
6
  getEnv
7
- } from "./chunk-WFWU3CHS.js";
7
+ } from "./chunk-UIQJZGBG.js";
8
8
 
9
9
  // src/error-handler.ts
10
10
  var REQUEST_CONNECTION_PLATFORM = {
@@ -294,4 +294,4 @@ export {
294
294
  writeAdsOutput,
295
295
  resolveCustomerId
296
296
  };
297
- //# sourceMappingURL=chunk-A2VZOTCV.js.map
297
+ //# sourceMappingURL=chunk-AEU5X443.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  debugLogSetting
3
- } from "./chunk-WFWU3CHS.js";
3
+ } from "./chunk-UIQJZGBG.js";
4
4
 
5
5
  // src/debugLog.ts
6
6
  import { appendFileSync, mkdirSync, renameSync, statSync } from "fs";
@@ -150,4 +150,4 @@ export {
150
150
  readBodyForLog,
151
151
  installStreamTaps
152
152
  };
153
- //# sourceMappingURL=chunk-2IUN3S3E.js.map
153
+ //# sourceMappingURL=chunk-FOWT5AS4.js.map
@@ -2,13 +2,13 @@ import {
2
2
  handleConnectionError,
3
3
  needsConnectionFix,
4
4
  writeAdsJson
5
- } from "./chunk-A2VZOTCV.js";
5
+ } from "./chunk-AEU5X443.js";
6
6
  import {
7
7
  ApiError
8
- } from "./chunk-KDTHRRAC.js";
8
+ } from "./chunk-TTIGSGXE.js";
9
9
  import {
10
10
  getEnv
11
- } from "./chunk-WFWU3CHS.js";
11
+ } from "./chunk-UIQJZGBG.js";
12
12
 
13
13
  // src/commands/ads/meta/shared.ts
14
14
  var DAY_MS = 864e5;
@@ -108,4 +108,4 @@ export {
108
108
  csvOrJson,
109
109
  resolveEffectiveStatus
110
110
  };
111
- //# sourceMappingURL=chunk-4YF56EGK.js.map
111
+ //# sourceMappingURL=chunk-KMQHIAYG.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  debugLogHttp,
3
3
  readBodyForLog
4
- } from "./chunk-2IUN3S3E.js";
4
+ } from "./chunk-FOWT5AS4.js";
5
5
  import {
6
6
  DIRECT_ROUTE,
7
7
  __commonJS,
@@ -15,11 +15,11 @@ import {
15
15
  plannedRoutes,
16
16
  refuseNonPublicUrl,
17
17
  shouldEscalate
18
- } from "./chunk-WFWU3CHS.js";
18
+ } from "./chunk-UIQJZGBG.js";
19
19
 
20
- // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/766ad107c42df28eeadaf0ac2f9089c8a9e200f6ba0b2b1a817b8d536cbdcc49/node_modules/safe-stable-stringify/index.js
20
+ // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/509a695c9237c6e3727f1f1f99169917f329e3ff3f7877be290b684e24bf153d/node_modules/safe-stable-stringify/index.js
21
21
  var require_safe_stable_stringify = __commonJS({
22
- "../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/766ad107c42df28eeadaf0ac2f9089c8a9e200f6ba0b2b1a817b8d536cbdcc49/node_modules/safe-stable-stringify/index.js"(exports, module) {
22
+ "../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/509a695c9237c6e3727f1f1f99169917f329e3ff3f7877be290b684e24bf153d/node_modules/safe-stable-stringify/index.js"(exports, module) {
23
23
  "use strict";
24
24
  var { hasOwnProperty } = Object.prototype;
25
25
  var stringify = configure2();
@@ -1111,7 +1111,7 @@ function resolveAdaptFormats(params) {
1111
1111
  return params.formats ?? [];
1112
1112
  }
1113
1113
 
1114
- // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/766ad107c42df28eeadaf0ac2f9089c8a9e200f6ba0b2b1a817b8d536cbdcc49/node_modules/safe-stable-stringify/esm/wrapper.js
1114
+ // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/509a695c9237c6e3727f1f1f99169917f329e3ff3f7877be290b684e24bf153d/node_modules/safe-stable-stringify/esm/wrapper.js
1115
1115
  var import__ = __toESM(require_safe_stable_stringify(), 1);
1116
1116
  var configure = import__.default.configure;
1117
1117
  var wrapper_default = import__.default;
@@ -2204,11 +2204,10 @@ function supportsParam(kind, model, param) {
2204
2204
  }
2205
2205
  var DEFAULT_CLIP_DURATION_S = 5;
2206
2206
  var SPOKEN_WORDS_PER_SECOND = 2.5;
2207
+ var SPOKEN_LINE = new RegExp(`(?<![\\p{L}\\p{N}])['"\\u201c\\u201d\\u2018\\u2019]((?:[^'"\\u201c\\u201d\\u2018\\u2019]|(?<=\\p{L})['\\u2019](?=\\p{L})){8,})['"\\u201c\\u201d\\u2018\\u2019](?![\\p{L}\\p{N}])`, "gu");
2207
2208
  function spokenWordsIn(prompt) {
2208
2209
  if (!prompt) return 0;
2209
- const quoted = [
2210
- ...prompt.matchAll(/['"\u201c\u201d\u2018\u2019]([^'"\u201c\u201d\u2018\u2019]{8,})['"\u201c\u201d\u2018\u2019]/g)
2211
- ].map((m) => m[1] ?? "");
2210
+ const quoted = [...prompt.matchAll(SPOKEN_LINE)].map((m) => m[1] ?? "");
2212
2211
  const text = quoted.join(" ").trim();
2213
2212
  return text ? text.split(/\s+/).filter(Boolean).length : 0;
2214
2213
  }
@@ -9662,4 +9661,4 @@ export {
9662
9661
  defaultRegistry,
9663
9662
  createEngineFromEnv
9664
9663
  };
9665
- //# sourceMappingURL=chunk-3TEVIAAV.js.map
9664
+ //# sourceMappingURL=chunk-PY7R67NE.js.map