@koda-sl/baker-cli 0.533.0 → 0.534.0

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.
Files changed (65) hide show
  1. package/README.md +1 -1
  2. package/dist/{canvas-G4QXNPPE.js → canvas-U7MZXZKR.js} +11 -11
  3. package/dist/{catalog-PTVQSATT.js → catalog-FLWVVX2U.js} +3 -2
  4. package/dist/{catalog-PTVQSATT.js.map → catalog-FLWVVX2U.js.map} +1 -1
  5. package/dist/{chunk-PE4ZP7MX.js → chunk-I3LRC33M.js} +520 -3963
  6. package/dist/chunk-I3LRC33M.js.map +1 -0
  7. package/dist/chunk-MIRPLAFD.js +1902 -0
  8. package/dist/chunk-MIRPLAFD.js.map +1 -0
  9. package/dist/chunk-NZUMNTAT.js +3510 -0
  10. package/dist/chunk-NZUMNTAT.js.map +1 -0
  11. package/dist/{chunk-JARRF5VX.js → chunk-PV2JVXFM.js} +2 -2
  12. package/dist/{chunk-N6WHUUFH.js → chunk-R6WEPF63.js} +2 -2
  13. package/dist/{chunk-NA5Q473J.js → chunk-RQB4XLSF.js} +90 -1749
  14. package/dist/chunk-RQB4XLSF.js.map +1 -0
  15. package/dist/{chunk-DJTWY7GL.js → chunk-T33M3PK7.js} +6 -18
  16. package/dist/chunk-T33M3PK7.js.map +1 -0
  17. package/dist/{chunk-VV6FDIP5.js → chunk-TNKKK7XD.js} +2 -2
  18. package/dist/{chunk-7GGLZOQN.js → chunk-TNOOWNN7.js} +2 -2
  19. package/dist/{chunk-SEYCF446.js → chunk-UAB4CYBH.js} +3 -3
  20. package/dist/cli.js +2 -2
  21. package/dist/{creatives-ADH6HCCA.js → creatives-NTAKM5TG.js} +5 -5
  22. package/dist/engine/index.js +2 -1
  23. package/dist/{feedback-MORAVN52.js → feedback-I5FZZAJR.js} +8 -4
  24. package/dist/{feedback-MORAVN52.js.map → feedback-I5FZZAJR.js.map} +1 -1
  25. package/dist/{feedback-record-M3RB7H2C.js → feedback-record-U2O24ITU.js} +8 -4
  26. package/dist/{feedback-record-M3RB7H2C.js.map → feedback-record-U2O24ITU.js.map} +1 -1
  27. package/dist/{make-7CIVNW77.js → make-JPXGF44U.js} +6 -5
  28. package/dist/{make-7CIVNW77.js.map → make-JPXGF44U.js.map} +1 -1
  29. package/dist/{rerun-ON6YCJAL.js → rerun-HCGLAUYW.js} +8 -7
  30. package/dist/{rerun-ON6YCJAL.js.map → rerun-HCGLAUYW.js.map} +1 -1
  31. package/dist/{run-YORKHK6S.js → run-2CSG6NIY.js} +8 -7
  32. package/dist/{scaffold-ad-RHSHBCVV.js → scaffold-ad-AQK4PX7C.js} +4 -3
  33. package/dist/{scaffold-ad-RHSHBCVV.js.map → scaffold-ad-AQK4PX7C.js.map} +1 -1
  34. package/dist/{scaffold-static-ad-XNOGCMPF.js → scaffold-static-ad-ORMMKUWY.js} +9 -8
  35. package/dist/{scaffold-static-ad-XNOGCMPF.js.map → scaffold-static-ad-ORMMKUWY.js.map} +1 -1
  36. package/dist/{scaffold-video-XEVJQ7QZ.js → scaffold-video-525OYZYI.js} +4 -3
  37. package/dist/{scaffold-video-XEVJQ7QZ.js.map → scaffold-video-525OYZYI.js.map} +1 -1
  38. package/dist/{select-BXBNFGVL.js → select-XAC7G4ZT.js} +7 -3
  39. package/dist/{select-BXBNFGVL.js.map → select-XAC7G4ZT.js.map} +1 -1
  40. package/dist/{set-prompt-JJWBB23C.js → set-prompt-H3UEDJWS.js} +3 -2
  41. package/dist/{set-prompt-JJWBB23C.js.map → set-prompt-H3UEDJWS.js.map} +1 -1
  42. package/dist/stale-TPLB2P4E.js +90 -0
  43. package/dist/stale-TPLB2P4E.js.map +1 -0
  44. package/dist/{sync-definition-7NBT6LTK.js → sync-definition-K5TJORL5.js} +4 -3
  45. package/dist/{translate-VMQHPX4B.js → translate-R2DXDXUY.js} +8 -5
  46. package/dist/{translate-VMQHPX4B.js.map → translate-R2DXDXUY.js.map} +1 -1
  47. package/dist/{validate-NB6PS5PF.js → validate-FGETFHYN.js} +7 -4
  48. package/dist/{validate-NB6PS5PF.js.map → validate-FGETFHYN.js.map} +1 -1
  49. package/package.json +1 -1
  50. package/dist/chunk-DJTWY7GL.js.map +0 -1
  51. package/dist/chunk-NA5Q473J.js.map +0 -1
  52. package/dist/chunk-OPUEQSKM.js +0 -122
  53. package/dist/chunk-OPUEQSKM.js.map +0 -1
  54. package/dist/chunk-PE4ZP7MX.js.map +0 -1
  55. package/dist/stale-SK2SDGOT.js +0 -76
  56. package/dist/stale-SK2SDGOT.js.map +0 -1
  57. /package/dist/{canvas-G4QXNPPE.js.map → canvas-U7MZXZKR.js.map} +0 -0
  58. /package/dist/{chunk-JARRF5VX.js.map → chunk-PV2JVXFM.js.map} +0 -0
  59. /package/dist/{chunk-N6WHUUFH.js.map → chunk-R6WEPF63.js.map} +0 -0
  60. /package/dist/{chunk-VV6FDIP5.js.map → chunk-TNKKK7XD.js.map} +0 -0
  61. /package/dist/{chunk-7GGLZOQN.js.map → chunk-TNOOWNN7.js.map} +0 -0
  62. /package/dist/{chunk-SEYCF446.js.map → chunk-UAB4CYBH.js.map} +0 -0
  63. /package/dist/{creatives-ADH6HCCA.js.map → creatives-NTAKM5TG.js.map} +0 -0
  64. /package/dist/{run-YORKHK6S.js.map → run-2CSG6NIY.js.map} +0 -0
  65. /package/dist/{sync-definition-7NBT6LTK.js.map → sync-definition-K5TJORL5.js.map} +0 -0
@@ -1,122 +0,0 @@
1
- import {
2
- prepareCanvas,
3
- unsuppliedPlaceholderAssets
4
- } from "./chunk-3OSBCYKA.js";
5
- import {
6
- isSourceStale
7
- } from "./chunk-HVJJEQDQ.js";
8
-
9
- // src/commands/canvas/render-state.ts
10
- import { mkdir, readdir, readFile, rm, writeFile } from "fs/promises";
11
- import path from "path";
12
- var RENDER_STATE_DIR = ".rendered";
13
- function statePath(canvasRoot, slug) {
14
- return path.join(canvasRoot, RENDER_STATE_DIR, `${slug}.json`);
15
- }
16
- async function readRenderState(canvasRoot, slug) {
17
- try {
18
- const parsed = JSON.parse(await readFile(statePath(canvasRoot, slug), "utf8"));
19
- return parsed && typeof parsed === "object" ? parsed : {};
20
- } catch {
21
- return {};
22
- }
23
- }
24
- async function latestVersion(canvasRoot, slug) {
25
- return (await readRenderState(canvasRoot, slug)).rendered?.runId ?? null;
26
- }
27
- async function updateRenderState(canvasRoot, slug, patch) {
28
- try {
29
- const next = { ...await readRenderState(canvasRoot, slug), ...patch };
30
- await mkdir(path.join(canvasRoot, RENDER_STATE_DIR), { recursive: true });
31
- await writeFile(statePath(canvasRoot, slug), `${JSON.stringify(next, null, 2)}
32
- `, "utf8");
33
- } catch {
34
- }
35
- }
36
- async function recordRenderAttempt(canvasRoot, slug, sourceSha) {
37
- if (!sourceSha) return;
38
- await updateRenderState(canvasRoot, slug, { attempted: { sourceSha, at: Date.now() } });
39
- }
40
- async function recordRendered(canvasRoot, slug, sourceSha, runId, drawn = {}) {
41
- if (!sourceSha) return;
42
- await updateRenderState(canvasRoot, slug, {
43
- rendered: { sourceSha, runId, at: Date.now() },
44
- ...drawn.prompt !== void 0 ? { prompt: drawn.prompt } : {},
45
- ...drawn.anchor ? { anchor: drawn.anchor } : {},
46
- ...drawn.idea ? { idea: drawn.idea } : {},
47
- lastFix: drawn.lastFix,
48
- picture: drawn.picture,
49
- ...drawn.seriesLeadRun ? { seriesLeadRun: drawn.seriesLeadRun } : {}
50
- });
51
- }
52
- async function recordSeen(canvasRoot, slug, seen) {
53
- await updateRenderState(canvasRoot, slug, { seen });
54
- }
55
- async function recordIdeaLines(canvasRoot, slug, idea) {
56
- if ((await readRenderState(canvasRoot, slug)).idea) return;
57
- await updateRenderState(canvasRoot, slug, { idea });
58
- }
59
- async function recordReviewOutcome(canvasRoot, slug, outcome) {
60
- await updateRenderState(canvasRoot, slug, outcome);
61
- }
62
- async function recordSeriesLeadRun(canvasRoot, slug, leadRunId) {
63
- await updateRenderState(canvasRoot, slug, { seriesLeadRun: leadRunId });
64
- }
65
- async function recordSnapshot(canvasRoot, slug, snapshot) {
66
- await updateRenderState(canvasRoot, slug, { snapshot });
67
- }
68
- function isRenderStale(state, currentSourceSha) {
69
- if (!state.rendered) return false;
70
- if (!isSourceStale(currentSourceSha, state.rendered.sourceSha)) return false;
71
- return state.attempted?.sourceSha !== currentSourceSha;
72
- }
73
- async function staleCreatives(workspaceRoot) {
74
- const creativesDir = path.join(workspaceRoot, "src", "creatives");
75
- const canvasRoot = path.join(workspaceRoot, "canvas");
76
- let slugs;
77
- try {
78
- slugs = (await readdir(creativesDir, { withFileTypes: true })).filter((d) => d.isDirectory()).map((d) => d.name);
79
- } catch {
80
- return [];
81
- }
82
- const stale = [];
83
- for (const slug of slugs.sort()) {
84
- const state = await readRenderState(canvasRoot, slug);
85
- if (!state.rendered) continue;
86
- const canvasPath = path.join(creativesDir, slug, `${slug}.canvas.json`);
87
- let prepared;
88
- try {
89
- prepared = await prepareCanvas(canvasPath, { write: false });
90
- } catch {
91
- continue;
92
- }
93
- if (unsuppliedPlaceholderAssets(prepared.fileGraph).length > 0) continue;
94
- const current = prepared.sourceSha;
95
- if (!current || !isRenderStale(state, current)) continue;
96
- stale.push({
97
- slug,
98
- canvasPath: path.relative(workspaceRoot, canvasPath).split(path.sep).join("/"),
99
- renderedRunId: state.rendered.runId,
100
- sourceSha: current
101
- });
102
- }
103
- return stale;
104
- }
105
- async function clearLegacyDirtyMarker(canvasRoot, slug) {
106
- await rm(path.join(canvasRoot, ".dirty", `${slug}.json`), { force: true }).catch(() => void 0);
107
- }
108
-
109
- export {
110
- readRenderState,
111
- latestVersion,
112
- recordRenderAttempt,
113
- recordRendered,
114
- recordSeen,
115
- recordIdeaLines,
116
- recordReviewOutcome,
117
- recordSeriesLeadRun,
118
- recordSnapshot,
119
- staleCreatives,
120
- clearLegacyDirtyMarker
121
- };
122
- //# sourceMappingURL=chunk-OPUEQSKM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/canvas/render-state.ts"],"sourcesContent":["import { mkdir, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { isSourceStale } from \"@baker/api\";\nimport type { IdeaAnchor } from \"../../engine/creative-context/anchor.ts\";\nimport type { LastFix } from \"./static-edit.ts\";\nimport type { PictureRecord } from \"./static-fix.ts\";\nimport { unsuppliedPlaceholderAssets } from \"./placeholders.ts\";\nimport { type PreparedCanvas, prepareCanvas } from \"./prepare-canvas.ts\";\n\n/**\n * What this workspace last rendered, per creative: `canvas/.rendered/<slug>.json`.\n *\n * \"Edited since its last render\" is the source fingerprint (`computeSourceSha`) now,\n * compared with the fingerprint the last completed render recorded here. It replaces the\n * `canvas/.dirty` marker a PostToolUse hook used to drop, which only saw the Write and\n * Edit tools touching `*.canvas.json` / `prompt.json`: an edit to a scene file, a\n * composition, or anything made through the shell slipped past it, and the Stop hook and\n * the `validate-creative-renders` gate let a stale preview ship.\n *\n * Two facts are kept apart:\n * - `rendered`: the source a COMPLETED render drew, and its run id;\n * - `attempted`: the source the last `baker canvas run` started on, whatever came of it.\n * A render that fails on exactly this source is not asked for again until the source\n * moves, so a canvas that cannot render never loops the agent.\n *\n * Lives under the gitignored `canvas/` outputs root of the workspace the canvas belongs\n * to (never `--outputs-dir`), so the CLI and the scaffold hooks always agree on the path.\n * A fresh workspace has no record, and a creative with none is not stale: there is no\n * preview of it in this workspace to be out of date.\n */\nexport const RENDER_STATE_DIR = \".rendered\";\n\nexport type RenderState = {\n rendered?: { sourceSha: string; runId: string; at: number };\n attempted?: { sourceSha: string; at: number };\n /** The last portable run snapshot uploaded for this creative (see `run-snapshot.ts`). */\n snapshot?: { identity: string; url: string };\n /** A static ad's prompt.json as the completed render drew it: a later edit of only its words or colours renders as an edit of that version (`static-edit.ts`). */\n prompt?: unknown;\n /** The `--fix` (or edit) the completed render ran, and the blocking defects it left: the same fix is never run again. */\n lastFix?: LastFix;\n /** The blocking defects the review of the completed render named: what a fix of it is measured against. */\n blocking?: string[];\n /** How the completed render's picture came to be, where its canvas would not say (`static-fix.ts`). */\n picture?: PictureRecord;\n /**\n * An ad of a series: the version of its lead its last registered run was made from, finished or not\n * (`series-member.ts`). A run that fails after it is registered is not a new ask when retried.\n */\n seriesLeadRun?: string;\n /** The idea of the completed render (`anchor.ts`): what an edit of it keeps (`idea-gate.ts`). */\n anchor?: IdeaAnchor;\n /** The idea of the completed render in plain lines, for the per-message hook: the version the person sees. */\n idea?: string[];\n /**\n * What the person saw when the chat turn `turnId` started: every run in that turn is held to it, so\n * the agent's own renders in the turn never become the baseline. No `anchor`: the turn started with\n * nothing shown, and nothing in it is held.\n */\n seen?: { turnId: string; anchor?: IdeaAnchor };\n};\n\nfunction statePath(canvasRoot: string, slug: string): string {\n return path.join(canvasRoot, RENDER_STATE_DIR, `${slug}.json`);\n}\n\nexport async function readRenderState(canvasRoot: string, slug: string): Promise<RenderState> {\n try {\n const parsed = JSON.parse(await readFile(statePath(canvasRoot, slug), \"utf8\")) as RenderState;\n return parsed && typeof parsed === \"object\" ? parsed : {};\n } catch {\n return {};\n }\n}\n\n/** The version (run id) a creative shows in this workspace: its last completed render; null before one. */\nexport async function latestVersion(canvasRoot: string, slug: string): Promise<string | null> {\n return (await readRenderState(canvasRoot, slug)).rendered?.runId ?? null;\n}\n\n/** Merge `patch` into the record. Best-effort: freshness is advisory, a render never fails over it. */\nasync function updateRenderState(canvasRoot: string, slug: string, patch: Partial<RenderState>): Promise<void> {\n try {\n const next = { ...(await readRenderState(canvasRoot, slug)), ...patch };\n await mkdir(path.join(canvasRoot, RENDER_STATE_DIR), { recursive: true });\n await writeFile(statePath(canvasRoot, slug), `${JSON.stringify(next, null, 2)}\\n`, \"utf8\");\n } catch {\n // Ignore: at worst the Stop hook asks for one render too many or too few.\n }\n}\n\nexport async function recordRenderAttempt(canvasRoot: string, slug: string, sourceSha: string | undefined): Promise<void> {\n if (!sourceSha) return;\n await updateRenderState(canvasRoot, slug, { attempted: { sourceSha, at: Date.now() } });\n}\n\nexport async function recordRendered(\n canvasRoot: string,\n slug: string,\n sourceSha: string | undefined,\n runId: string,\n drawn: {\n prompt?: unknown;\n lastFix?: LastFix;\n picture?: PictureRecord;\n seriesLeadRun?: string;\n anchor?: IdeaAnchor;\n idea?: string[];\n } = {},\n): Promise<void> {\n if (!sourceSha) return;\n await updateRenderState(canvasRoot, slug, {\n rendered: { sourceSha, runId, at: Date.now() },\n ...(drawn.prompt !== undefined ? { prompt: drawn.prompt } : {}),\n ...(drawn.anchor ? { anchor: drawn.anchor } : {}),\n ...(drawn.idea ? { idea: drawn.idea } : {}),\n lastFix: drawn.lastFix,\n picture: drawn.picture,\n ...(drawn.seriesLeadRun ? { seriesLeadRun: drawn.seriesLeadRun } : {}),\n });\n}\n\n/** What the person saw when a chat turn started: every run in that turn is held to it (`idea-gate.ts`). */\nexport async function recordSeen(canvasRoot: string, slug: string, seen: NonNullable<RenderState[\"seen\"]>): Promise<void> {\n await updateRenderState(canvasRoot, slug, { seen });\n}\n\n/** The idea of the version shown in plain lines, for the per-message hook, when this workspace has none yet. */\nexport async function recordIdeaLines(canvasRoot: string, slug: string, idea: string[]): Promise<void> {\n if ((await readRenderState(canvasRoot, slug)).idea) return;\n await updateRenderState(canvasRoot, slug, { idea });\n}\n\n/** What the review of a completed render found blocking, and the fix the render ran, if one. */\nexport async function recordReviewOutcome(\n canvasRoot: string,\n slug: string,\n outcome: { blocking: string[]; lastFix?: LastFix },\n): Promise<void> {\n await updateRenderState(canvasRoot, slug, outcome);\n}\n\n/** The version of its lead a series ad's run was registered from: written before the run renders. */\nexport async function recordSeriesLeadRun(canvasRoot: string, slug: string, leadRunId: string): Promise<void> {\n await updateRenderState(canvasRoot, slug, { seriesLeadRun: leadRunId });\n}\n\nexport async function recordSnapshot(canvasRoot: string, slug: string, snapshot: RenderState[\"snapshot\"]): Promise<void> {\n await updateRenderState(canvasRoot, slug, { snapshot });\n}\n\n/**\n * Whether the preview in this workspace no longer shows the source: it was rendered, the\n * source has moved since (`isSourceStale`: a render fingerprinted by an older rule never\n * is), and no render of the source as it is now was attempted yet.\n */\nexport function isRenderStale(state: RenderState, currentSourceSha: string): boolean {\n if (!state.rendered) return false;\n if (!isSourceStale(currentSourceSha, state.rendered.sourceSha)) return false;\n return state.attempted?.sourceSha !== currentSourceSha;\n}\n\n/** `sourceSha` is the source as it stands now: what a render of it would record. */\nexport type StaleCreative = { slug: string; canvasPath: string; renderedRunId: string; sourceSha: string };\n\n/**\n * Every renderable creative in the workspace whose preview is stale. A canvas that still\n * has an unfilled `[TODO]` asset slot is skipped: the agent is mid-build, and a half-built\n * creative must never be pushed to render. The source is fingerprinted the way a render\n * and the dashboard sync fingerprint it (`prepareCanvas`, read-only), so the three never\n * disagree about what is stale. `canvasPath` is workspace-relative.\n */\nexport async function staleCreatives(workspaceRoot: string): Promise<StaleCreative[]> {\n const creativesDir = path.join(workspaceRoot, \"src\", \"creatives\");\n const canvasRoot = path.join(workspaceRoot, \"canvas\");\n let slugs: string[];\n try {\n slugs = (await readdir(creativesDir, { withFileTypes: true })).filter((d) => d.isDirectory()).map((d) => d.name);\n } catch {\n return [];\n }\n const stale: StaleCreative[] = [];\n for (const slug of slugs.sort()) {\n const state = await readRenderState(canvasRoot, slug);\n if (!state.rendered) continue;\n const canvasPath = path.join(creativesDir, slug, `${slug}.canvas.json`);\n let prepared: PreparedCanvas;\n try {\n prepared = await prepareCanvas(canvasPath, { write: false });\n } catch {\n continue; // Gone, renamed, or mid-edit invalid JSON: the next check reads it again.\n }\n if (unsuppliedPlaceholderAssets(prepared.fileGraph).length > 0) continue;\n const current = prepared.sourceSha;\n if (!current || !isRenderStale(state, current)) continue;\n stale.push({\n slug,\n canvasPath: path.relative(workspaceRoot, canvasPath).split(path.sep).join(\"/\"),\n renderedRunId: state.rendered.runId,\n sourceSha: current,\n });\n }\n return stale;\n}\n\n/**\n * Remove the `canvas/.dirty/<slug>.json` marker an older scaffold's PostToolUse hook wrote.\n * Nothing in a current scaffold reads it, but a client repo can run this CLI before its\n * scaffold sync lands, and there the old Stop hook and verify gate still read the marker:\n * clearing it on a render attempt, as the CLI always did, keeps that gate from blocking\n * forever. Delete once every client runs a scaffold without `nudge-canvas-rerender`.\n */\nexport async function clearLegacyDirtyMarker(canvasRoot: string, slug: string): Promise<void> {\n await rm(path.join(canvasRoot, \".dirty\", `${slug}.json`), { force: true }).catch(() => undefined);\n}\n"],"mappings":"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","names":[]}