@koda-sl/baker-cli 0.39.29-dev.994437bd → 0.66.2

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 (323) hide show
  1. package/README.md +1754 -7
  2. package/canvas/avocado-tutorial.json +89 -0
  3. package/canvas/hello-world-composition/index.html +83 -0
  4. package/canvas/hello-world-composition/meta.json +41 -0
  5. package/canvas/hello-world-overlay.json +37 -0
  6. package/canvas/phone-scroll-composition/index.html +141 -0
  7. package/canvas/phone-scroll-composition/meta.json +39 -0
  8. package/canvas/tiktok-captions-composition/index.html +126 -0
  9. package/canvas/tiktok-captions-composition/meta.json +46 -0
  10. package/canvas/video-overlay-composition/index.html +239 -0
  11. package/canvas/video-overlay-composition/meta.json +29 -0
  12. package/dist/cli.js +2 -0
  13. package/dist/cli.js.map +1 -1
  14. package/dist/commands/ads/meta/creatives.js +1 -1
  15. package/dist/commands/canvas/catalog.d.ts +2 -0
  16. package/dist/commands/canvas/catalog.d.ts.map +1 -0
  17. package/dist/commands/canvas/catalog.js +13 -0
  18. package/dist/commands/canvas/catalog.js.map +1 -0
  19. package/dist/commands/canvas/index.d.ts +2 -0
  20. package/dist/commands/canvas/index.d.ts.map +1 -0
  21. package/dist/commands/canvas/index.js +32 -0
  22. package/dist/commands/canvas/index.js.map +1 -0
  23. package/dist/commands/canvas/inspect.d.ts +16 -0
  24. package/dist/commands/canvas/inspect.d.ts.map +1 -0
  25. package/dist/commands/canvas/inspect.js +115 -0
  26. package/dist/commands/canvas/inspect.js.map +1 -0
  27. package/dist/commands/canvas/run.d.ts +24 -0
  28. package/dist/commands/canvas/run.d.ts.map +1 -0
  29. package/dist/commands/canvas/run.js +56 -0
  30. package/dist/commands/canvas/run.js.map +1 -0
  31. package/dist/commands/canvas/scaffold-static-ad.d.ts +40 -0
  32. package/dist/commands/canvas/scaffold-static-ad.d.ts.map +1 -0
  33. package/dist/commands/canvas/scaffold-static-ad.js +265 -0
  34. package/dist/commands/canvas/scaffold-static-ad.js.map +1 -0
  35. package/dist/commands/canvas/scaffold-video.d.ts +44 -0
  36. package/dist/commands/canvas/scaffold-video.d.ts.map +1 -0
  37. package/dist/commands/canvas/scaffold-video.js +235 -0
  38. package/dist/commands/canvas/scaffold-video.js.map +1 -0
  39. package/dist/commands/canvas/validate.d.ts +8 -0
  40. package/dist/commands/canvas/validate.d.ts.map +1 -0
  41. package/dist/commands/canvas/validate.js +37 -0
  42. package/dist/commands/canvas/validate.js.map +1 -0
  43. package/dist/commands/images/find.d.ts +1 -1
  44. package/dist/commands/images/find.d.ts.map +1 -1
  45. package/dist/commands/images/find.js +12 -3
  46. package/dist/commands/images/find.js.map +1 -1
  47. package/dist/commands/images/google.d.ts +1 -1
  48. package/dist/commands/images/google.d.ts.map +1 -1
  49. package/dist/commands/images/google.js +12 -3
  50. package/dist/commands/images/google.js.map +1 -1
  51. package/dist/commands/images/stock.d.ts +1 -1
  52. package/dist/commands/images/stock.d.ts.map +1 -1
  53. package/dist/commands/images/stock.js +7 -3
  54. package/dist/commands/images/stock.js.map +1 -1
  55. package/dist/commands/testimonials/list.d.ts.map +1 -1
  56. package/dist/commands/testimonials/list.js +21 -6
  57. package/dist/commands/testimonials/list.js.map +1 -1
  58. package/dist/commands/testimonials/search.d.ts.map +1 -1
  59. package/dist/commands/testimonials/search.js +21 -6
  60. package/dist/commands/testimonials/search.js.map +1 -1
  61. package/dist/commands/testimonials/search.test.js +3 -3
  62. package/dist/commands/testimonials/search.test.js.map +1 -1
  63. package/dist/engine/client/backend-client.d.ts +50 -0
  64. package/dist/engine/client/backend-client.d.ts.map +1 -0
  65. package/dist/engine/client/backend-client.js +20 -0
  66. package/dist/engine/client/backend-client.js.map +1 -0
  67. package/dist/engine/client/env.d.ts +7 -0
  68. package/dist/engine/client/env.d.ts.map +1 -0
  69. package/dist/engine/client/env.js +18 -0
  70. package/dist/engine/client/env.js.map +1 -0
  71. package/dist/engine/client/http.d.ts +56 -0
  72. package/dist/engine/client/http.d.ts.map +1 -0
  73. package/dist/engine/client/http.js +168 -0
  74. package/dist/engine/client/http.js.map +1 -0
  75. package/dist/engine/engine/cache-key.d.ts +19 -0
  76. package/dist/engine/engine/cache-key.d.ts.map +1 -0
  77. package/dist/engine/engine/cache-key.js +33 -0
  78. package/dist/engine/engine/cache-key.js.map +1 -0
  79. package/dist/engine/engine/canonical.d.ts +14 -0
  80. package/dist/engine/engine/canonical.d.ts.map +1 -0
  81. package/dist/engine/engine/canonical.js +53 -0
  82. package/dist/engine/engine/canonical.js.map +1 -0
  83. package/dist/engine/engine/composition-hash.d.ts +14 -0
  84. package/dist/engine/engine/composition-hash.d.ts.map +1 -0
  85. package/dist/engine/engine/composition-hash.js +51 -0
  86. package/dist/engine/engine/composition-hash.js.map +1 -0
  87. package/dist/engine/engine/composition-meta.d.ts +77 -0
  88. package/dist/engine/engine/composition-meta.d.ts.map +1 -0
  89. package/dist/engine/engine/composition-meta.js +199 -0
  90. package/dist/engine/engine/composition-meta.js.map +1 -0
  91. package/dist/engine/engine/context.d.ts +16 -0
  92. package/dist/engine/engine/context.d.ts.map +1 -0
  93. package/dist/engine/engine/context.js +2 -0
  94. package/dist/engine/engine/context.js.map +1 -0
  95. package/dist/engine/engine/define.d.ts +69 -0
  96. package/dist/engine/engine/define.d.ts.map +1 -0
  97. package/dist/engine/engine/define.js +9 -0
  98. package/dist/engine/engine/define.js.map +1 -0
  99. package/dist/engine/engine/didyoumean.d.ts +2 -0
  100. package/dist/engine/engine/didyoumean.d.ts.map +1 -0
  101. package/dist/engine/engine/didyoumean.js +58 -0
  102. package/dist/engine/engine/didyoumean.js.map +1 -0
  103. package/dist/engine/engine/errors.d.ts +41 -0
  104. package/dist/engine/engine/errors.d.ts.map +1 -0
  105. package/dist/engine/engine/errors.js +45 -0
  106. package/dist/engine/engine/errors.js.map +1 -0
  107. package/dist/engine/engine/executor.d.ts +72 -0
  108. package/dist/engine/engine/executor.d.ts.map +1 -0
  109. package/dist/engine/engine/executor.js +445 -0
  110. package/dist/engine/engine/executor.js.map +1 -0
  111. package/dist/engine/engine/refs.d.ts +12 -0
  112. package/dist/engine/engine/refs.d.ts.map +1 -0
  113. package/dist/engine/engine/refs.js +48 -0
  114. package/dist/engine/engine/refs.js.map +1 -0
  115. package/dist/engine/engine/registry.d.ts +11 -0
  116. package/dist/engine/engine/registry.d.ts.map +1 -0
  117. package/dist/engine/engine/registry.js +26 -0
  118. package/dist/engine/engine/registry.js.map +1 -0
  119. package/dist/engine/engine/scheduler.d.ts +10 -0
  120. package/dist/engine/engine/scheduler.d.ts.map +1 -0
  121. package/dist/engine/engine/scheduler.js +89 -0
  122. package/dist/engine/engine/scheduler.js.map +1 -0
  123. package/dist/engine/engine/validator.d.ts +31 -0
  124. package/dist/engine/engine/validator.d.ts.map +1 -0
  125. package/dist/engine/engine/validator.js +501 -0
  126. package/dist/engine/engine/validator.js.map +1 -0
  127. package/dist/engine/index.d.ts +33 -0
  128. package/dist/engine/index.d.ts.map +1 -0
  129. package/dist/engine/index.js +104 -0
  130. package/dist/engine/index.js.map +1 -0
  131. package/dist/engine/lib/ulid.d.ts +3 -0
  132. package/dist/engine/lib/ulid.d.ts.map +1 -0
  133. package/dist/engine/lib/ulid.js +36 -0
  134. package/dist/engine/lib/ulid.js.map +1 -0
  135. package/dist/engine/models/canvas-ad-params.test.d.ts +2 -0
  136. package/dist/engine/models/canvas-ad-params.test.d.ts.map +1 -0
  137. package/dist/engine/models/canvas-ad-params.test.js +60 -0
  138. package/dist/engine/models/canvas-ad-params.test.js.map +1 -0
  139. package/dist/engine/models/registry.d.ts +63 -0
  140. package/dist/engine/models/registry.d.ts.map +1 -0
  141. package/dist/engine/models/registry.js +432 -0
  142. package/dist/engine/models/registry.js.map +1 -0
  143. package/dist/engine/models/validateParams.d.ts +38 -0
  144. package/dist/engine/models/validateParams.d.ts.map +1 -0
  145. package/dist/engine/models/validateParams.js +166 -0
  146. package/dist/engine/models/validateParams.js.map +1 -0
  147. package/dist/engine/nodes/ingest.d.ts +113 -0
  148. package/dist/engine/nodes/ingest.d.ts.map +1 -0
  149. package/dist/engine/nodes/ingest.js +555 -0
  150. package/dist/engine/nodes/ingest.js.map +1 -0
  151. package/dist/engine/nodes/ingest.svg.test.d.ts +2 -0
  152. package/dist/engine/nodes/ingest.svg.test.d.ts.map +1 -0
  153. package/dist/engine/nodes/ingest.svg.test.js +30 -0
  154. package/dist/engine/nodes/ingest.svg.test.js.map +1 -0
  155. package/dist/engine/nodes/local/audioTimeline.d.ts +82 -0
  156. package/dist/engine/nodes/local/audioTimeline.d.ts.map +1 -0
  157. package/dist/engine/nodes/local/audioTimeline.js +97 -0
  158. package/dist/engine/nodes/local/audioTimeline.js.map +1 -0
  159. package/dist/engine/nodes/local/ffmpeg.d.ts +56 -0
  160. package/dist/engine/nodes/local/ffmpeg.d.ts.map +1 -0
  161. package/dist/engine/nodes/local/ffmpeg.js +50 -0
  162. package/dist/engine/nodes/local/ffmpeg.js.map +1 -0
  163. package/dist/engine/nodes/local/fontSpecimen.d.ts +50 -0
  164. package/dist/engine/nodes/local/fontSpecimen.d.ts.map +1 -0
  165. package/dist/engine/nodes/local/fontSpecimen.js +198 -0
  166. package/dist/engine/nodes/local/fontSpecimen.js.map +1 -0
  167. package/dist/engine/nodes/local/hyperframe-snapshot.d.ts +116 -0
  168. package/dist/engine/nodes/local/hyperframe-snapshot.d.ts.map +1 -0
  169. package/dist/engine/nodes/local/hyperframe-snapshot.js +230 -0
  170. package/dist/engine/nodes/local/hyperframe-snapshot.js.map +1 -0
  171. package/dist/engine/nodes/local/hyperframe.d.ts +123 -0
  172. package/dist/engine/nodes/local/hyperframe.d.ts.map +1 -0
  173. package/dist/engine/nodes/local/hyperframe.js +367 -0
  174. package/dist/engine/nodes/local/hyperframe.js.map +1 -0
  175. package/dist/engine/nodes/local/imagemagick.d.ts +56 -0
  176. package/dist/engine/nodes/local/imagemagick.d.ts.map +1 -0
  177. package/dist/engine/nodes/local/imagemagick.js +71 -0
  178. package/dist/engine/nodes/local/imagemagick.js.map +1 -0
  179. package/dist/engine/nodes/local/lib/assets.d.ts +20 -0
  180. package/dist/engine/nodes/local/lib/assets.d.ts.map +1 -0
  181. package/dist/engine/nodes/local/lib/assets.js +40 -0
  182. package/dist/engine/nodes/local/lib/assets.js.map +1 -0
  183. package/dist/engine/nodes/local/lib/cli-runner.d.ts +78 -0
  184. package/dist/engine/nodes/local/lib/cli-runner.d.ts.map +1 -0
  185. package/dist/engine/nodes/local/lib/cli-runner.js +254 -0
  186. package/dist/engine/nodes/local/lib/cli-runner.js.map +1 -0
  187. package/dist/engine/nodes/local/lib/ffmpeg.d.ts +23 -0
  188. package/dist/engine/nodes/local/lib/ffmpeg.d.ts.map +1 -0
  189. package/dist/engine/nodes/local/lib/ffmpeg.js +75 -0
  190. package/dist/engine/nodes/local/lib/ffmpeg.js.map +1 -0
  191. package/dist/engine/nodes/local/lib/hyperframe-errors.d.ts +2 -0
  192. package/dist/engine/nodes/local/lib/hyperframe-errors.d.ts.map +1 -0
  193. package/dist/engine/nodes/local/lib/hyperframe-errors.js +47 -0
  194. package/dist/engine/nodes/local/lib/hyperframe-errors.js.map +1 -0
  195. package/dist/engine/nodes/local/lib/templating.d.ts +22 -0
  196. package/dist/engine/nodes/local/lib/templating.d.ts.map +1 -0
  197. package/dist/engine/nodes/local/lib/templating.js +85 -0
  198. package/dist/engine/nodes/local/lib/templating.js.map +1 -0
  199. package/dist/engine/nodes/local/text.d.ts +6 -0
  200. package/dist/engine/nodes/local/text.d.ts.map +1 -0
  201. package/dist/engine/nodes/local/text.js +15 -0
  202. package/dist/engine/nodes/local/text.js.map +1 -0
  203. package/dist/engine/nodes/remote/delegate.d.ts +25 -0
  204. package/dist/engine/nodes/remote/delegate.d.ts.map +1 -0
  205. package/dist/engine/nodes/remote/delegate.js +160 -0
  206. package/dist/engine/nodes/remote/delegate.js.map +1 -0
  207. package/dist/engine/nodes/remote/dialogue.d.ts +34 -0
  208. package/dist/engine/nodes/remote/dialogue.d.ts.map +1 -0
  209. package/dist/engine/nodes/remote/dialogue.js +54 -0
  210. package/dist/engine/nodes/remote/dialogue.js.map +1 -0
  211. package/dist/engine/nodes/remote/image.d.ts +42 -0
  212. package/dist/engine/nodes/remote/image.d.ts.map +1 -0
  213. package/dist/engine/nodes/remote/image.js +43 -0
  214. package/dist/engine/nodes/remote/image.js.map +1 -0
  215. package/dist/engine/nodes/remote/imageAspectAdapt.d.ts +30 -0
  216. package/dist/engine/nodes/remote/imageAspectAdapt.d.ts.map +1 -0
  217. package/dist/engine/nodes/remote/imageAspectAdapt.js +42 -0
  218. package/dist/engine/nodes/remote/imageAspectAdapt.js.map +1 -0
  219. package/dist/engine/nodes/remote/imageBackgroundRemove.d.ts +39 -0
  220. package/dist/engine/nodes/remote/imageBackgroundRemove.d.ts.map +1 -0
  221. package/dist/engine/nodes/remote/imageBackgroundRemove.js +37 -0
  222. package/dist/engine/nodes/remote/imageBackgroundRemove.js.map +1 -0
  223. package/dist/engine/nodes/remote/imageDescribe.d.ts +29 -0
  224. package/dist/engine/nodes/remote/imageDescribe.d.ts.map +1 -0
  225. package/dist/engine/nodes/remote/imageDescribe.js +25 -0
  226. package/dist/engine/nodes/remote/imageDescribe.js.map +1 -0
  227. package/dist/engine/nodes/remote/imageReferenceSheet.d.ts +34 -0
  228. package/dist/engine/nodes/remote/imageReferenceSheet.d.ts.map +1 -0
  229. package/dist/engine/nodes/remote/imageReferenceSheet.js +38 -0
  230. package/dist/engine/nodes/remote/imageReferenceSheet.js.map +1 -0
  231. package/dist/engine/nodes/remote/imageSearch.d.ts +18 -0
  232. package/dist/engine/nodes/remote/imageSearch.d.ts.map +1 -0
  233. package/dist/engine/nodes/remote/imageSearch.js +22 -0
  234. package/dist/engine/nodes/remote/imageSearch.js.map +1 -0
  235. package/dist/engine/nodes/remote/imageSelect.d.ts +39 -0
  236. package/dist/engine/nodes/remote/imageSelect.d.ts.map +1 -0
  237. package/dist/engine/nodes/remote/imageSelect.js +45 -0
  238. package/dist/engine/nodes/remote/imageSelect.js.map +1 -0
  239. package/dist/engine/nodes/remote/music.d.ts +45 -0
  240. package/dist/engine/nodes/remote/music.d.ts.map +1 -0
  241. package/dist/engine/nodes/remote/music.js +73 -0
  242. package/dist/engine/nodes/remote/music.js.map +1 -0
  243. package/dist/engine/nodes/remote/soundEffect.d.ts +21 -0
  244. package/dist/engine/nodes/remote/soundEffect.d.ts.map +1 -0
  245. package/dist/engine/nodes/remote/soundEffect.js +41 -0
  246. package/dist/engine/nodes/remote/soundEffect.js.map +1 -0
  247. package/dist/engine/nodes/remote/textGenerate.d.ts +21 -0
  248. package/dist/engine/nodes/remote/textGenerate.d.ts.map +1 -0
  249. package/dist/engine/nodes/remote/textGenerate.js +27 -0
  250. package/dist/engine/nodes/remote/textGenerate.js.map +1 -0
  251. package/dist/engine/nodes/remote/tts.d.ts +45 -0
  252. package/dist/engine/nodes/remote/tts.d.ts.map +1 -0
  253. package/dist/engine/nodes/remote/tts.js +66 -0
  254. package/dist/engine/nodes/remote/tts.js.map +1 -0
  255. package/dist/engine/nodes/remote/video.d.ts +58 -0
  256. package/dist/engine/nodes/remote/video.d.ts.map +1 -0
  257. package/dist/engine/nodes/remote/video.js +44 -0
  258. package/dist/engine/nodes/remote/video.js.map +1 -0
  259. package/dist/engine/nodes/remote/videoBackgroundRemove.d.ts +30 -0
  260. package/dist/engine/nodes/remote/videoBackgroundRemove.d.ts.map +1 -0
  261. package/dist/engine/nodes/remote/videoBackgroundRemove.js +29 -0
  262. package/dist/engine/nodes/remote/videoBackgroundRemove.js.map +1 -0
  263. package/dist/engine/nodes/remote/videoDeconstruct.d.ts +61 -0
  264. package/dist/engine/nodes/remote/videoDeconstruct.d.ts.map +1 -0
  265. package/dist/engine/nodes/remote/videoDeconstruct.js +40 -0
  266. package/dist/engine/nodes/remote/videoDeconstruct.js.map +1 -0
  267. package/dist/engine/nodes/remote/videoLipsync.d.ts +37 -0
  268. package/dist/engine/nodes/remote/videoLipsync.d.ts.map +1 -0
  269. package/dist/engine/nodes/remote/videoLipsync.js +26 -0
  270. package/dist/engine/nodes/remote/videoLipsync.js.map +1 -0
  271. package/dist/engine/nodes/remote/videoTranscribe.d.ts +116 -0
  272. package/dist/engine/nodes/remote/videoTranscribe.d.ts.map +1 -0
  273. package/dist/engine/nodes/remote/videoTranscribe.js +123 -0
  274. package/dist/engine/nodes/remote/videoTranscribe.js.map +1 -0
  275. package/dist/engine/nodes/remote/voiceSelect.d.ts +28 -0
  276. package/dist/engine/nodes/remote/voiceSelect.d.ts.map +1 -0
  277. package/dist/engine/nodes/remote/voiceSelect.js +25 -0
  278. package/dist/engine/nodes/remote/voiceSelect.js.map +1 -0
  279. package/dist/engine/scaffold/staticAd.d.ts +44 -0
  280. package/dist/engine/scaffold/staticAd.d.ts.map +1 -0
  281. package/dist/engine/scaffold/staticAd.js +243 -0
  282. package/dist/engine/scaffold/staticAd.js.map +1 -0
  283. package/dist/engine/scaffold/video.d.ts +56 -0
  284. package/dist/engine/scaffold/video.d.ts.map +1 -0
  285. package/dist/engine/scaffold/video.js +709 -0
  286. package/dist/engine/scaffold/video.js.map +1 -0
  287. package/dist/engine/schema/canvas.d.ts +41 -0
  288. package/dist/engine/schema/canvas.d.ts.map +1 -0
  289. package/dist/engine/schema/canvas.js +67 -0
  290. package/dist/engine/schema/canvas.js.map +1 -0
  291. package/dist/engine/schema/catalog.d.ts +25 -0
  292. package/dist/engine/schema/catalog.d.ts.map +1 -0
  293. package/dist/engine/schema/catalog.js +48 -0
  294. package/dist/engine/schema/catalog.js.map +1 -0
  295. package/dist/engine/schema/primitives.d.ts +6 -0
  296. package/dist/engine/schema/primitives.d.ts.map +1 -0
  297. package/dist/engine/schema/primitives.js +4 -0
  298. package/dist/engine/schema/primitives.js.map +1 -0
  299. package/dist/engine/schema/prompts.d.ts +4 -0
  300. package/dist/engine/schema/prompts.d.ts.map +1 -0
  301. package/dist/engine/schema/prompts.js +23 -0
  302. package/dist/engine/schema/prompts.js.map +1 -0
  303. package/dist/engine/schema/refs.d.ts +113 -0
  304. package/dist/engine/schema/refs.d.ts.map +1 -0
  305. package/dist/engine/schema/refs.js +35 -0
  306. package/dist/engine/schema/refs.js.map +1 -0
  307. package/dist/engine/storage/asset-store.d.ts +48 -0
  308. package/dist/engine/storage/asset-store.d.ts.map +1 -0
  309. package/dist/engine/storage/asset-store.js +166 -0
  310. package/dist/engine/storage/asset-store.js.map +1 -0
  311. package/dist/engine/storage/cache-store.d.ts +21 -0
  312. package/dist/engine/storage/cache-store.d.ts.map +1 -0
  313. package/dist/engine/storage/cache-store.js +31 -0
  314. package/dist/engine/storage/cache-store.js.map +1 -0
  315. package/dist/engine/storage/output-writer.d.ts +18 -0
  316. package/dist/engine/storage/output-writer.d.ts.map +1 -0
  317. package/dist/engine/storage/output-writer.js +52 -0
  318. package/dist/engine/storage/output-writer.js.map +1 -0
  319. package/dist/engine/storage/sha256.d.ts +2 -0
  320. package/dist/engine/storage/sha256.d.ts.map +1 -0
  321. package/dist/engine/storage/sha256.js +7 -0
  322. package/dist/engine/storage/sha256.js.map +1 -0
  323. package/package.json +15 -3
@@ -0,0 +1,56 @@
1
+ type HttpError = {
2
+ kind: "unauthorized";
3
+ status: number;
4
+ message: string;
5
+ } | {
6
+ kind: "validation";
7
+ status: number;
8
+ message: string;
9
+ details?: unknown;
10
+ } | {
11
+ kind: "provider";
12
+ status: number;
13
+ provider?: string;
14
+ code: string;
15
+ message: string;
16
+ retryable: boolean;
17
+ } | {
18
+ kind: "timeout";
19
+ provider?: string;
20
+ message: string;
21
+ } | {
22
+ kind: "server";
23
+ status: number;
24
+ message: string;
25
+ } | {
26
+ kind: "network";
27
+ cause: unknown;
28
+ };
29
+ export declare class BackendHttpError extends Error {
30
+ detail: HttpError;
31
+ constructor(detail: HttpError);
32
+ }
33
+ type HttpClientOpts = {
34
+ baseUrl: string;
35
+ apiKey: string;
36
+ timeoutMs?: number;
37
+ maxRetries?: number;
38
+ fetchFn?: typeof fetch;
39
+ sleepFn?: (ms: number) => Promise<void>;
40
+ };
41
+ export declare class HttpClient {
42
+ private readonly baseUrl;
43
+ private readonly apiKey;
44
+ private readonly timeoutMs;
45
+ private readonly maxRetries;
46
+ private readonly fetchFn;
47
+ private readonly sleepFn;
48
+ constructor(opts: HttpClientOpts);
49
+ postJson<T>(path: string, body: unknown, signal?: AbortSignal): Promise<T>;
50
+ getJson<T>(path: string, signal?: AbortSignal): Promise<T>;
51
+ private requestJson;
52
+ private attempt;
53
+ private handleAttemptException;
54
+ }
55
+ export {};
56
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/engine/client/http.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GACV;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAC1G;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAExC,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,MAAM,EAAE,SAAS,CAAC;gBACN,MAAM,EAAE,SAAS;CAK9B;AAuBD,KAAK,cAAc,GAAG;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC,CAAC;AAEF,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;gBAE5C,IAAI,EAAE,cAAc;IAS1B,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1E,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;YAIlD,WAAW;YAcX,OAAO;IAoCrB,OAAO,CAAC,sBAAsB;CAsB/B"}
@@ -0,0 +1,168 @@
1
+ export class BackendHttpError extends Error {
2
+ detail;
3
+ constructor(detail) {
4
+ super(describe(detail));
5
+ this.name = "BackendHttpError";
6
+ this.detail = detail;
7
+ }
8
+ }
9
+ function describe(d) {
10
+ switch (d.kind) {
11
+ case "unauthorized":
12
+ return `unauthorized: ${d.message}`;
13
+ case "validation":
14
+ return `invalid request: ${d.message}`;
15
+ case "provider":
16
+ return `provider error${d.provider ? ` (${d.provider})` : ""}: ${d.message}`;
17
+ case "timeout":
18
+ return `provider timeout${d.provider ? ` (${d.provider})` : ""}: ${d.message}`;
19
+ case "server":
20
+ return `server error ${d.status}: ${d.message}`;
21
+ case "network":
22
+ return d.cause instanceof Error ? `network: ${d.cause.message}` : "network error";
23
+ default: {
24
+ const _ex = d;
25
+ return String(_ex);
26
+ }
27
+ }
28
+ }
29
+ export class HttpClient {
30
+ baseUrl;
31
+ apiKey;
32
+ timeoutMs;
33
+ maxRetries;
34
+ fetchFn;
35
+ sleepFn;
36
+ constructor(opts) {
37
+ this.baseUrl = opts.baseUrl.replace(/\/+$/, "");
38
+ this.apiKey = opts.apiKey;
39
+ this.timeoutMs = opts.timeoutMs ?? 10 * 60 * 1000;
40
+ this.maxRetries = opts.maxRetries ?? 3;
41
+ this.fetchFn = opts.fetchFn ?? fetch;
42
+ this.sleepFn = opts.sleepFn ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
43
+ }
44
+ async postJson(path, body, signal) {
45
+ return await this.requestJson("POST", path, body, signal);
46
+ }
47
+ async getJson(path, signal) {
48
+ return await this.requestJson("GET", path, undefined, signal);
49
+ }
50
+ async requestJson(method, path, body, signal) {
51
+ const url = `${this.baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
52
+ for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
53
+ const outcome = await this.attempt(method, url, body, attempt, signal);
54
+ if (outcome.kind === "value")
55
+ return outcome.value;
56
+ if (outcome.kind === "retry") {
57
+ await this.sleepFn(backoffMs(attempt));
58
+ continue;
59
+ }
60
+ throw outcome.error;
61
+ }
62
+ throw new BackendHttpError({ kind: "server", status: 0, message: "retries exhausted" });
63
+ }
64
+ async attempt(method, url, body, attempt, signal) {
65
+ const controller = new AbortController();
66
+ const onAbort = () => controller.abort(signal?.reason);
67
+ if (signal) {
68
+ if (signal.aborted)
69
+ controller.abort(signal.reason);
70
+ else
71
+ signal.addEventListener("abort", onAbort, { once: true });
72
+ }
73
+ const timer = setTimeout(() => controller.abort(new Error("timeout")), this.timeoutMs);
74
+ try {
75
+ const res = await this.fetchFn(url, {
76
+ method,
77
+ headers: method === "POST"
78
+ ? { "Content-Type": "application/json", Authorization: `Bearer ${this.apiKey}` }
79
+ : { Authorization: `Bearer ${this.apiKey}` },
80
+ body: method === "POST" ? JSON.stringify(body) : undefined,
81
+ signal: controller.signal,
82
+ });
83
+ if (res.ok)
84
+ return { kind: "value", value: (await res.json()) };
85
+ const err = await parseErrorBody(res);
86
+ if (attempt < this.maxRetries && shouldRetry(err))
87
+ return { kind: "retry" };
88
+ return { kind: "throw", error: new BackendHttpError(err) };
89
+ }
90
+ catch (e) {
91
+ return this.handleAttemptException(e, attempt, signal, method);
92
+ }
93
+ finally {
94
+ clearTimeout(timer);
95
+ if (signal)
96
+ signal.removeEventListener("abort", onAbort);
97
+ }
98
+ }
99
+ handleAttemptException(e, attempt, signal, method) {
100
+ if (e instanceof BackendHttpError)
101
+ return { kind: "throw", error: e };
102
+ const aborted = e.name === "AbortError";
103
+ if (aborted && signal?.aborted) {
104
+ return { kind: "throw", error: new BackendHttpError({ kind: "network", cause: signal.reason ?? e }) };
105
+ }
106
+ // Internal timeout: retrying a POST re-dispatches a non-idempotent provider
107
+ // call (the backend only replays *completed* responses, and a timeout means
108
+ // nothing was stored), so only GETs auto-retry — a POST fails terminally
109
+ // rather than risk a double charge.
110
+ if (aborted) {
111
+ if (method === "GET" && attempt < this.maxRetries)
112
+ return { kind: "retry" };
113
+ return { kind: "throw", error: new BackendHttpError({ kind: "timeout", message: "request timed out" }) };
114
+ }
115
+ if (attempt < this.maxRetries)
116
+ return { kind: "retry" };
117
+ return { kind: "throw", error: new BackendHttpError({ kind: "network", cause: e }) };
118
+ }
119
+ }
120
+ async function parseErrorBody(res) {
121
+ let body = {};
122
+ try {
123
+ body = (await res.json());
124
+ }
125
+ catch {
126
+ // ignore parse errors
127
+ }
128
+ const errObj = body.error ?? {};
129
+ return classifyHttpError(res.status, errObj, errObj.message ?? `HTTP ${res.status}`);
130
+ }
131
+ function classifyHttpError(status, errObj, message) {
132
+ if (status === 401 || status === 403) {
133
+ return { kind: "unauthorized", status, message };
134
+ }
135
+ if (status === 400 || status === 422) {
136
+ return { kind: "validation", status, message, details: errObj.details };
137
+ }
138
+ if (status === 502 || status === 504) {
139
+ if (errObj.code === "provider_timeout" || status === 504) {
140
+ return { kind: "timeout", provider: errObj.provider, message };
141
+ }
142
+ return {
143
+ kind: "provider",
144
+ status,
145
+ provider: errObj.provider,
146
+ code: errObj.code ?? "provider_error",
147
+ message,
148
+ retryable: errObj.retryable ?? true,
149
+ };
150
+ }
151
+ if (status >= 500 || status === 429) {
152
+ return { kind: "server", status, message };
153
+ }
154
+ // Remaining 4xx (404, 405, 409, …): the request itself is wrong, so a retry
155
+ // can't help — and re-dispatching a POST risks a double provider charge.
156
+ return { kind: "validation", status, message, details: errObj.details };
157
+ }
158
+ function backoffMs(attempt) {
159
+ return 1000 * 2 ** attempt;
160
+ }
161
+ function shouldRetry(err) {
162
+ if (err.kind === "server")
163
+ return true;
164
+ if (err.kind === "provider" && err.retryable)
165
+ return true;
166
+ return false;
167
+ }
168
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/engine/client/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ type CacheKeyInputs = {
2
+ node_id: string;
3
+ node_version: string;
4
+ params: unknown;
5
+ input_hashes: Record<string, string | string[]>;
6
+ cache_salt?: string;
7
+ /**
8
+ * Extra string fields folded into the cache key alongside `params`. Used
9
+ * by nodes whose output depends on external content not captured by params
10
+ * — e.g. `hyperframe_render` adds `composition_content_sha` so editing a
11
+ * composition's HTML or CSS invalidates the cache automatically.
12
+ *
13
+ * Keys are sorted before hashing to keep the key stable.
14
+ */
15
+ extras?: Record<string, string>;
16
+ };
17
+ export declare function computeCacheKey(inputs: CacheKeyInputs): string;
18
+ export {};
19
+ //# sourceMappingURL=cache-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-key.d.ts","sourceRoot":"","sources":["../../../src/engine/engine/cache-key.ts"],"names":[],"mappings":"AAGA,KAAK,cAAc,GAAG;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA2B9D"}
@@ -0,0 +1,33 @@
1
+ import { sha256Hex } from "../storage/sha256.js";
2
+ import { canonicalize } from "./canonical.js";
3
+ export function computeCacheKey(inputs) {
4
+ // Sort the input_hashes keys explicitly — canonicalize sorts, but we also
5
+ // freeze the input shape so callers can pass any record without surprises.
6
+ const sortedInputs = {};
7
+ for (const key of Object.keys(inputs.input_hashes).sort()) {
8
+ const v = inputs.input_hashes[key];
9
+ if (v === undefined)
10
+ continue;
11
+ sortedInputs[key] = Array.isArray(v) ? [...v] : v;
12
+ }
13
+ let sortedExtras;
14
+ if (inputs.extras && Object.keys(inputs.extras).length > 0) {
15
+ sortedExtras = {};
16
+ for (const key of Object.keys(inputs.extras).sort()) {
17
+ const v = inputs.extras[key];
18
+ if (v === undefined)
19
+ continue;
20
+ sortedExtras[key] = v;
21
+ }
22
+ }
23
+ const payload = {
24
+ node_id: inputs.node_id,
25
+ node_version: inputs.node_version,
26
+ params: inputs.params,
27
+ input_hashes: sortedInputs,
28
+ cache_salt: inputs.cache_salt,
29
+ extras: sortedExtras,
30
+ };
31
+ return sha256Hex(canonicalize(payload));
32
+ }
33
+ //# sourceMappingURL=cache-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-key.js","sourceRoot":"","sources":["../../../src/engine/engine/cache-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAmB9C,MAAM,UAAU,eAAe,CAAC,MAAsB;IACpD,0EAA0E;IAC1E,2EAA2E;IAC3E,MAAM,YAAY,GAAsC,EAAE,CAAC;IAC3D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,SAAS;YAAE,SAAS;QAC9B,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,YAAgD,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3D,YAAY,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACpD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,SAAS;gBAAE,SAAS;YAC9B,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG;QACd,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,YAAY,EAAE,YAAY;QAC1B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,MAAM,EAAE,YAAY;KACrB,CAAC;IACF,OAAO,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Deterministic JSON encoding for cache keys.
3
+ *
4
+ * Rules (locked — drift breaks all caches):
5
+ * 1. Object keys sorted alphabetically (codepoint order, locale-independent).
6
+ * 2. No whitespace.
7
+ * 3. `undefined` values and entries are dropped (not serialized as null).
8
+ * 4. Strings are NFC-normalized before encoding.
9
+ * 5. Numbers use the shortest representation (V8 default; we don't post-process).
10
+ * 6. `NaN` and `±Infinity` throw — explicit reject, never silently encode.
11
+ * 7. Arrays preserve order.
12
+ */
13
+ export declare function canonicalize(value: unknown): string;
14
+ //# sourceMappingURL=canonical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../../src/engine/engine/canonical.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOnD"}
@@ -0,0 +1,53 @@
1
+ import stableStringify from "safe-stable-stringify";
2
+ /**
3
+ * Deterministic JSON encoding for cache keys.
4
+ *
5
+ * Rules (locked — drift breaks all caches):
6
+ * 1. Object keys sorted alphabetically (codepoint order, locale-independent).
7
+ * 2. No whitespace.
8
+ * 3. `undefined` values and entries are dropped (not serialized as null).
9
+ * 4. Strings are NFC-normalized before encoding.
10
+ * 5. Numbers use the shortest representation (V8 default; we don't post-process).
11
+ * 6. `NaN` and `±Infinity` throw — explicit reject, never silently encode.
12
+ * 7. Arrays preserve order.
13
+ */
14
+ export function canonicalize(value) {
15
+ const normalized = normalizeForCanonical(value);
16
+ const out = stableStringify(normalized);
17
+ if (out === undefined) {
18
+ throw new Error("canonicalize: value serialized to undefined (top-level undefined?)");
19
+ }
20
+ return out;
21
+ }
22
+ function normalizeForCanonical(value) {
23
+ if (value === null)
24
+ return null;
25
+ if (typeof value === "string")
26
+ return value.normalize("NFC");
27
+ if (typeof value === "number") {
28
+ if (!Number.isFinite(value)) {
29
+ throw new Error(`canonicalize: non-finite number ${value}`);
30
+ }
31
+ return value;
32
+ }
33
+ if (typeof value === "boolean")
34
+ return value;
35
+ if (typeof value === "bigint") {
36
+ throw new Error("canonicalize: bigint not supported");
37
+ }
38
+ if (Array.isArray(value)) {
39
+ return value.map(normalizeForCanonical);
40
+ }
41
+ if (typeof value === "object") {
42
+ const out = {};
43
+ for (const [k, v] of Object.entries(value)) {
44
+ if (v === undefined)
45
+ continue;
46
+ out[k.normalize("NFC")] = normalizeForCanonical(v);
47
+ }
48
+ return out;
49
+ }
50
+ // undefined, function, symbol — drop
51
+ return undefined;
52
+ }
53
+ //# sourceMappingURL=canonical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../../src/engine/engine/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,uBAAuB,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,SAAS;gBAAE,SAAS;YAC9B,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,qCAAqC;IACrC,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Compute a deterministic content-addressed hash of every relevant file under
3
+ * `dir`. Hash layout:
4
+ *
5
+ * sha256("<rel/path>\0<file-sha256>\n<rel/path>\0<file-sha256>\n...")
6
+ *
7
+ * Entries are sorted by relative path so the result is stable regardless of
8
+ * filesystem-walk order. Returns a hex sha256 string.
9
+ *
10
+ * Used by the executor to fold composition content into the cache key — any
11
+ * edit to a tracked file invalidates the hyperframe_render cache entry.
12
+ */
13
+ export declare function hashCompositionDir(dir: string): Promise<string>;
14
+ //# sourceMappingURL=composition-hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition-hash.d.ts","sourceRoot":"","sources":["../../../src/engine/engine/composition-hash.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKrE"}
@@ -0,0 +1,51 @@
1
+ import { readdir, readFile, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { sha256Hex } from "../storage/sha256.js";
4
+ // Skip transient/build artefacts when hashing — these aren't part of the
5
+ // composition's source-of-truth and would either thrash the cache (.cache,
6
+ // node_modules) or pollute the hash with editor noise (.DS_Store, .swp).
7
+ const SKIP_DIRS = new Set([".cache", ".git", "node_modules", "dist", "build", ".next", ".turbo"]);
8
+ function isSkippedName(name) {
9
+ if (name.startsWith("."))
10
+ return true; // .DS_Store, dotfiles
11
+ return SKIP_DIRS.has(name);
12
+ }
13
+ /**
14
+ * Compute a deterministic content-addressed hash of every relevant file under
15
+ * `dir`. Hash layout:
16
+ *
17
+ * sha256("<rel/path>\0<file-sha256>\n<rel/path>\0<file-sha256>\n...")
18
+ *
19
+ * Entries are sorted by relative path so the result is stable regardless of
20
+ * filesystem-walk order. Returns a hex sha256 string.
21
+ *
22
+ * Used by the executor to fold composition content into the cache key — any
23
+ * edit to a tracked file invalidates the hyperframe_render cache entry.
24
+ */
25
+ export async function hashCompositionDir(dir) {
26
+ const entries = await collectFiles(dir, dir);
27
+ entries.sort((a, b) => a.relPath.localeCompare(b.relPath));
28
+ const manifest = entries.map((e) => `${e.relPath}\0${e.contentSha}`).join("\n");
29
+ return sha256Hex(manifest);
30
+ }
31
+ async function collectFiles(root, current) {
32
+ const out = [];
33
+ const names = await readdir(current);
34
+ for (const name of names) {
35
+ if (isSkippedName(name))
36
+ continue;
37
+ const abs = path.join(current, name);
38
+ const s = await stat(abs);
39
+ if (s.isDirectory()) {
40
+ out.push(...(await collectFiles(root, abs)));
41
+ continue;
42
+ }
43
+ if (!s.isFile())
44
+ continue;
45
+ const bytes = await readFile(abs);
46
+ const relPath = path.relative(root, abs).split(path.sep).join("/");
47
+ out.push({ relPath, contentSha: sha256Hex(bytes) });
48
+ }
49
+ return out;
50
+ }
51
+ //# sourceMappingURL=composition-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition-hash.js","sourceRoot":"","sources":["../../../src/engine/engine/composition-hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,yEAAyE;AACzE,2EAA2E;AAC3E,yEAAyE;AACzE,MAAM,SAAS,GAAwB,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEvH,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,sBAAsB;IAC7D,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAID;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAW;IAClD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,OAAe;IACvD,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,aAAa,CAAC,IAAI,CAAC;YAAE,SAAS;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7C,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;YAAE,SAAS;QAC1B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnE,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,77 @@
1
+ import { z } from "zod";
2
+ export declare const CompositionMetaSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ title: z.ZodString;
5
+ description: z.ZodOptional<z.ZodString>;
6
+ width: z.ZodNumber;
7
+ height: z.ZodNumber;
8
+ fps: z.ZodDefault<z.ZodNumber>;
9
+ default_duration: z.ZodDefault<z.ZodNumber>;
10
+ inputs: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
11
+ kind: z.ZodEnum<{
12
+ json: "json";
13
+ video: "video";
14
+ image: "image";
15
+ audio: "audio";
16
+ }>;
17
+ required: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
18
+ staged_as: z.ZodOptional<z.ZodString>;
19
+ description: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$strict>>>;
21
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
22
+ kind: z.ZodLiteral<"string">;
23
+ default: z.ZodOptional<z.ZodString>;
24
+ enum: z.ZodOptional<z.ZodArray<z.ZodString>>;
25
+ required: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
26
+ description: z.ZodOptional<z.ZodString>;
27
+ }, z.core.$strict>, z.ZodObject<{
28
+ kind: z.ZodLiteral<"integer">;
29
+ default: z.ZodOptional<z.ZodNumber>;
30
+ min: z.ZodOptional<z.ZodNumber>;
31
+ max: z.ZodOptional<z.ZodNumber>;
32
+ required: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
33
+ description: z.ZodOptional<z.ZodString>;
34
+ }, z.core.$strict>, z.ZodObject<{
35
+ kind: z.ZodLiteral<"number">;
36
+ default: z.ZodOptional<z.ZodNumber>;
37
+ min: z.ZodOptional<z.ZodNumber>;
38
+ max: z.ZodOptional<z.ZodNumber>;
39
+ required: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
40
+ description: z.ZodOptional<z.ZodString>;
41
+ }, z.core.$strict>, z.ZodObject<{
42
+ kind: z.ZodLiteral<"boolean">;
43
+ default: z.ZodOptional<z.ZodBoolean>;
44
+ required: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
45
+ description: z.ZodOptional<z.ZodString>;
46
+ }, z.core.$strict>, z.ZodObject<{
47
+ kind: z.ZodLiteral<"color">;
48
+ default: z.ZodOptional<z.ZodString>;
49
+ required: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
50
+ description: z.ZodOptional<z.ZodString>;
51
+ }, z.core.$strict>, z.ZodObject<{
52
+ kind: z.ZodLiteral<"image">;
53
+ default: z.ZodOptional<z.ZodString>;
54
+ required: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
55
+ description: z.ZodOptional<z.ZodString>;
56
+ }, z.core.$strict>, z.ZodObject<{
57
+ kind: z.ZodLiteral<"json">;
58
+ schema: z.ZodOptional<z.ZodUnknown>;
59
+ default: z.ZodOptional<z.ZodUnknown>;
60
+ required: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
61
+ description: z.ZodOptional<z.ZodString>;
62
+ }, z.core.$strict>], "kind">>>;
63
+ }, z.core.$strict>;
64
+ export type CompositionMeta = z.infer<typeof CompositionMetaSchema>;
65
+ export declare function loadCompositionMeta(compositionDir: string): Promise<CompositionMeta>;
66
+ /**
67
+ * Build a Zod schema for the params declared in `meta.json`. Used to validate
68
+ * the canvas's `params` payload at validate-time and execute-time.
69
+ *
70
+ * Output schema is a `z.object().strict()` — unknown keys are rejected so
71
+ * typos surface immediately. Params with a `default` are made optional and
72
+ * Zod fills the default; required params without defaults must be provided.
73
+ */
74
+ export declare function buildParamsSchema(meta: CompositionMeta): z.ZodObject;
75
+ /** Default filename for an input — the composition can override via `staged_as`. */
76
+ export declare function defaultFilenameForInput(key: string, kind: "video" | "image" | "audio" | "json"): string;
77
+ //# sourceMappingURL=composition-meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition-meta.d.ts","sourceRoot":"","sources":["../../../src/engine/engine/composition-meta.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqGxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAYvB,CAAC;AAEZ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,wBAAsB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAoB1F;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,CAAC,CAAC,SAAS,CAMpE;AAmDD,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAKvG"}