@koda-sl/baker-cli 0.122.0 → 0.123.0-dev.31b784126

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.
@@ -15,6 +15,10 @@ type ExecRequest = {
15
15
  /** Run-scoped dedupe key: the backend replays the stored response for a
16
16
  * repeated key instead of re-dispatching to the provider (and re-charging). */
17
17
  idempotency_key?: string;
18
+ /** Run + node identity, so a completed async job can be mapped back to its
19
+ * frozen run's node by the backend stale-run reconciliation sweep. */
20
+ canvas_run_id?: string;
21
+ node_id?: string;
18
22
  };
19
23
  type ExecResponse = {
20
24
  outputs: Record<string, RawAssetOutput | RawAssetOutput[] | unknown>;
@@ -47,6 +51,19 @@ declare class BackendClient$1 {
47
51
  putUrl: string;
48
52
  publicUrl: string;
49
53
  }>;
54
+ /** Remote cache lookup. A miss (404) — or an old backend without the route — returns null. */
55
+ getCacheEntry<T>(cacheKey: string, signal?: AbortSignal): Promise<T | null>;
56
+ putCacheEntry(entry: {
57
+ cacheKey: string;
58
+ }, signal?: AbortSignal): Promise<void>;
59
+ /** Durable run-history record — POST /api/canvas/runs (idempotent server-side on runId). */
60
+ recordRun(payload: unknown, signal?: AbortSignal): Promise<void>;
61
+ /**
62
+ * Chat-scoped blueprint sync — POST /api/creatives/definition. Lets the
63
+ * dashboard draw a scaffolded creative's workflow graph BEFORE the first run.
64
+ * Additive on the backend (never archives siblings, never sets definitionPath).
65
+ */
66
+ syncCreativeDefinition(payload: unknown, signal?: AbortSignal): Promise<void>;
50
67
  getArtifact(kind: string, name: string, version?: string, signal?: AbortSignal): Promise<ArtifactResponse>;
51
68
  }
52
69
 
@@ -120,6 +137,7 @@ declare const CanvasSchema: z.ZodObject<{
120
137
  inputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
121
138
  params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
122
139
  when: z.ZodOptional<z.ZodUnknown>;
140
+ regenerate: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
123
141
  }, z.core.$strict>>;
124
142
  output: z.ZodOptional<z.ZodObject<{
125
143
  node: z.ZodString;
@@ -249,6 +267,14 @@ type ExecCtx = {
249
267
  /** Content-addressed cache key for this node execution. Remote delegation
250
268
  * derives its idempotency key from it so backend retries never double-charge. */
251
269
  cacheKey?: string;
270
+ /**
271
+ * Whether this node's outputs must be downloaded to the local content store.
272
+ * False when NO downstream consumer is a local (ffmpeg/magick) node — the
273
+ * backend already persisted the bytes to R2 with a durable sha256 URL, so the
274
+ * redundant R2→sandbox transfer is skipped and the ref is kept URL-only.
275
+ * Absent/true means download (the safe default for older call sites).
276
+ */
277
+ downloadOutputs?: boolean;
252
278
  client: BackendClient$1;
253
279
  assets: AssetStore;
254
280
  log: LogFn;
@@ -311,6 +337,12 @@ type NodeDefinition<I = unknown, P = unknown, O = unknown> = {
311
337
  outputs: z.ZodType<O>;
312
338
  /** "local" runs in-process; "remote" delegates to Convex via ctx.client */
313
339
  location: "local" | "remote";
340
+ /**
341
+ * Local node that only forwards asset refs and never reads their bytes
342
+ * (e.g. `collect`). Exempts its upstream producers from the forced R2→disk
343
+ * download local consumers otherwise trigger.
344
+ */
345
+ passthroughRefs?: true;
314
346
  cost?: CostFn<P>;
315
347
  validateExtra?: ValidateExtraFn;
316
348
  cacheKeyExtras?: CacheKeyExtrasFn;
@@ -339,6 +371,39 @@ type RunResult = {
339
371
  duration_ms: number;
340
372
  };
341
373
  outputs_dir: string;
374
+ node_runs: NodeRunRecord[];
375
+ };
376
+ type NodeRunRecord = {
377
+ node_id: string;
378
+ node_type: string;
379
+ cached: boolean;
380
+ duration_ms: number;
381
+ credits: number;
382
+ };
383
+ /**
384
+ * Live run telemetry: the plan (post-prune node list + dependency edges) fires
385
+ * once before any node executes, then start/settled/failed per node. Consumers
386
+ * stream these into run-history progress snapshots; a throwing consumer is
387
+ * swallowed — telemetry must never fail a paid run.
388
+ */
389
+ type RunProgressEvent = {
390
+ kind: "plan";
391
+ nodes: Array<{
392
+ node_id: string;
393
+ node_type: string;
394
+ deps: string[];
395
+ params: unknown;
396
+ }>;
397
+ } | {
398
+ kind: "node_start";
399
+ node_id: string;
400
+ } | {
401
+ kind: "node_settled";
402
+ run: NodeRunRecord;
403
+ outputs: Record<string, unknown>;
404
+ } | {
405
+ kind: "node_failed";
406
+ node_id: string;
342
407
  };
343
408
  type RunOptions = {
344
409
  signal?: AbortSignal;
@@ -346,6 +411,14 @@ type RunOptions = {
346
411
  cache_policy?: "read_write" | "bypass" | "read_only";
347
412
  /** Max nodes of one layer in flight at once; invalid or missing → 5. */
348
413
  concurrency?: number;
414
+ /**
415
+ * Node ids to force fresh for THIS run only (the `--regenerate` flag). Folds
416
+ * the run id into each named node's cache key so it re-renders regardless of
417
+ * the content cache, without editing the canvas. Persistent regeneration uses
418
+ * the per-node `regenerate` field instead.
419
+ */
420
+ regenerate?: ReadonlySet<string>;
421
+ onProgress?: (event: RunProgressEvent) => void;
349
422
  };
350
423
  type EngineOptions = {
351
424
  registry: NodeRegistry;
@@ -354,6 +427,13 @@ type EngineOptions = {
354
427
  cache: CacheStore;
355
428
  outputsDir: string;
356
429
  log?: LogFn;
430
+ /**
431
+ * Stamp durable canvas-assets URLs onto fresh node outputs before they are
432
+ * cached — the precondition for remote cache portability and run-history
433
+ * records. Best-effort: a failed upload logs a warning and keeps the entry
434
+ * local-only, never fails the node.
435
+ */
436
+ persistAssets?: boolean;
357
437
  };
358
438
  declare class Engine$1 {
359
439
  private readonly registry;
@@ -362,6 +442,7 @@ declare class Engine$1 {
362
442
  private readonly cache;
363
443
  private readonly outputsDir;
364
444
  private readonly log;
445
+ private readonly persistAssets;
365
446
  constructor(opts: EngineOptions);
366
447
  validate(canvas: unknown): {
367
448
  ok: true;
@@ -390,6 +471,8 @@ declare class Engine$1 {
390
471
  }>;
391
472
  run(input: unknown, opts?: RunOptions): Promise<RunResult>;
392
473
  private runLayers;
474
+ /** Progress consumers are observers only — an exception there must never fail the run. */
475
+ private emitProgress;
393
476
  /**
394
477
  * Dead-node elimination: when the canvas declares an `output`, execute only the
395
478
  * nodes that output transitively depends on. Orphaned nodes (left by an edit or
@@ -400,6 +483,13 @@ declare class Engine$1 {
400
483
  private writeFinal;
401
484
  private executeOne;
402
485
  private materializeNodeOutputs;
486
+ /**
487
+ * Download any URL-only asset ref reachable in a local node's inputs so the
488
+ * bytes are on disk before the local runner stages them. Returns a copy —
489
+ * refs are replaced, never mutated in place, so the producer's cached output
490
+ * (shared object) keeps its URL-only shape.
491
+ */
492
+ private materializeLocalInputs;
403
493
  }
404
494
 
405
495
  type ValidationResult = {
@@ -467,6 +557,13 @@ declare function createEngineFromEnv(opts?: {
467
557
  cacheDir?: string;
468
558
  outputsDir?: string;
469
559
  log?: (line: string) => void;
560
+ /**
561
+ * Layer the company-scoped remote cache over the local one (and stamp
562
+ * durable asset URLs onto fresh outputs) so a fresh sandbox re-runs an
563
+ * already-computed canvas at zero credits. Defaults to on; disable with
564
+ * `remoteCache: false` or env BAKER_CANVAS_REMOTE_CACHE=off.
565
+ */
566
+ remoteCache?: boolean;
470
567
  }): Engine$1;
471
568
 
472
569
  export { BackendClient, Engine, LocalAssetStore, LocalCacheStore, ValidationError, createEngineFromEnv, defaultRegistry, generateCatalog, validateCanvasDeep };
@@ -8,7 +8,7 @@ import {
8
8
  defaultRegistry,
9
9
  generateCatalog,
10
10
  validateCanvasDeep
11
- } from "../chunk-IWPAXJC3.js";
11
+ } from "../chunk-Q3K5TXC6.js";
12
12
  import "../chunk-5WRI5ZAA.js";
13
13
  export {
14
14
  BackendClient,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koda-sl/baker-cli",
3
- "version": "0.122.0",
3
+ "version": "0.123.0-dev.31b784126",
4
4
  "description": "AI-agent-first CLI for interacting with Baker, including the Baker creative canvas.",
5
5
  "type": "module",
6
6
  "bin": {