@nodetool-ai/agents 0.8.1 → 0.8.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 (361) hide show
  1. package/dist/.nodetool-build-stamp +1 -1
  2. package/dist/analysis/audio-dsp.d.ts +3 -2
  3. package/dist/analysis/audio-dsp.d.ts.map +1 -1
  4. package/dist/analysis/audio-dsp.js +11 -8
  5. package/dist/analysis/audio-dsp.js.map +1 -1
  6. package/dist/analysis/media-decode.d.ts +13 -0
  7. package/dist/analysis/media-decode.d.ts.map +1 -1
  8. package/dist/analysis/media-decode.js +33 -6
  9. package/dist/analysis/media-decode.js.map +1 -1
  10. package/dist/author-graph.d.ts +2 -3
  11. package/dist/author-graph.d.ts.map +1 -1
  12. package/dist/author-graph.js +3 -5
  13. package/dist/author-graph.js.map +1 -1
  14. package/dist/browser-gate.d.ts +2 -2
  15. package/dist/browser-gate.js +2 -2
  16. package/dist/capabilities/GamePublishRequest.d.ts +14 -0
  17. package/dist/capabilities/GamePublishRequest.d.ts.map +1 -0
  18. package/dist/capabilities/GamePublishRequest.js +2 -0
  19. package/dist/capabilities/GamePublishRequest.js.map +1 -0
  20. package/dist/capabilities/adapters.d.ts +4 -13
  21. package/dist/capabilities/adapters.d.ts.map +1 -1
  22. package/dist/capabilities/adapters.js +9 -14
  23. package/dist/capabilities/adapters.js.map +1 -1
  24. package/dist/capabilities/agent-activity.d.ts +27 -0
  25. package/dist/capabilities/agent-activity.d.ts.map +1 -0
  26. package/dist/capabilities/agent-activity.js +103 -0
  27. package/dist/capabilities/agent-activity.js.map +1 -0
  28. package/dist/capabilities/agentic-storyboard-finish.d.ts +67 -0
  29. package/dist/capabilities/agentic-storyboard-finish.d.ts.map +1 -0
  30. package/dist/capabilities/agentic-storyboard-finish.js +1321 -0
  31. package/dist/capabilities/agentic-storyboard-finish.js.map +1 -0
  32. package/dist/capabilities/agents.d.ts +5 -2
  33. package/dist/capabilities/agents.d.ts.map +1 -1
  34. package/dist/capabilities/agents.js +14 -4
  35. package/dist/capabilities/agents.js.map +1 -1
  36. package/dist/capabilities/agents.specs.d.ts +3 -0
  37. package/dist/capabilities/agents.specs.d.ts.map +1 -1
  38. package/dist/capabilities/agents.specs.js +71 -1
  39. package/dist/capabilities/agents.specs.js.map +1 -1
  40. package/dist/capabilities/analysis.d.ts.map +1 -1
  41. package/dist/capabilities/analysis.js +33 -22
  42. package/dist/capabilities/analysis.js.map +1 -1
  43. package/dist/capabilities/analysis.specs.js +2 -2
  44. package/dist/capabilities/analysis.specs.js.map +1 -1
  45. package/dist/capabilities/apps.d.ts.map +1 -1
  46. package/dist/capabilities/apps.js +5 -3
  47. package/dist/capabilities/apps.js.map +1 -1
  48. package/dist/capabilities/args.d.ts +2 -5
  49. package/dist/capabilities/args.d.ts.map +1 -1
  50. package/dist/capabilities/args.js +2 -5
  51. package/dist/capabilities/args.js.map +1 -1
  52. package/dist/capabilities/browser.d.ts +1 -1
  53. package/dist/capabilities/browser.js +1 -1
  54. package/dist/capabilities/browser.specs.d.ts +1 -1
  55. package/dist/capabilities/browser.specs.js +1 -1
  56. package/dist/capabilities/code.d.ts +5 -0
  57. package/dist/capabilities/code.d.ts.map +1 -1
  58. package/dist/capabilities/code.js +128 -89
  59. package/dist/capabilities/code.js.map +1 -1
  60. package/dist/capabilities/errors.d.ts +19 -0
  61. package/dist/capabilities/errors.d.ts.map +1 -0
  62. package/dist/capabilities/errors.js +109 -0
  63. package/dist/capabilities/errors.js.map +1 -0
  64. package/dist/capabilities/errors.specs.d.ts +11 -0
  65. package/dist/capabilities/errors.specs.d.ts.map +1 -0
  66. package/dist/capabilities/errors.specs.js +100 -0
  67. package/dist/capabilities/errors.specs.js.map +1 -0
  68. package/dist/capabilities/example-timelines.d.ts.map +1 -1
  69. package/dist/capabilities/example-timelines.js +52 -10
  70. package/dist/capabilities/example-timelines.js.map +1 -1
  71. package/dist/capabilities/example-timelines.specs.d.ts +1 -0
  72. package/dist/capabilities/example-timelines.specs.d.ts.map +1 -1
  73. package/dist/capabilities/example-timelines.specs.js +21 -3
  74. package/dist/capabilities/example-timelines.specs.js.map +1 -1
  75. package/dist/capabilities/finish-storyboard.d.ts +5 -0
  76. package/dist/capabilities/finish-storyboard.d.ts.map +1 -0
  77. package/dist/capabilities/finish-storyboard.js +278 -0
  78. package/dist/capabilities/finish-storyboard.js.map +1 -0
  79. package/dist/capabilities/game-asset-source.js +1 -1
  80. package/dist/capabilities/game-asset-source.js.map +1 -1
  81. package/dist/capabilities/game.d.ts +14 -2
  82. package/dist/capabilities/game.d.ts.map +1 -1
  83. package/dist/capabilities/game.js +209 -39
  84. package/dist/capabilities/game.js.map +1 -1
  85. package/dist/capabilities/game.specs.d.ts +2 -0
  86. package/dist/capabilities/game.specs.d.ts.map +1 -1
  87. package/dist/capabilities/game.specs.js +25 -11
  88. package/dist/capabilities/game.specs.js.map +1 -1
  89. package/dist/capabilities/game3d.d.ts +17 -0
  90. package/dist/capabilities/game3d.d.ts.map +1 -0
  91. package/dist/capabilities/game3d.js +433 -0
  92. package/dist/capabilities/game3d.js.map +1 -0
  93. package/dist/capabilities/gate-from-context.d.ts +1 -1
  94. package/dist/capabilities/gate-from-context.js +1 -1
  95. package/dist/capabilities/generations.d.ts +2 -0
  96. package/dist/capabilities/generations.d.ts.map +1 -1
  97. package/dist/capabilities/generations.js +7 -2
  98. package/dist/capabilities/generations.js.map +1 -1
  99. package/dist/capabilities/index.d.ts +2 -2
  100. package/dist/capabilities/index.d.ts.map +1 -1
  101. package/dist/capabilities/index.js +2 -2
  102. package/dist/capabilities/index.js.map +1 -1
  103. package/dist/capabilities/invoke.d.ts +14 -25
  104. package/dist/capabilities/invoke.d.ts.map +1 -1
  105. package/dist/capabilities/invoke.js +72 -35
  106. package/dist/capabilities/invoke.js.map +1 -1
  107. package/dist/capabilities/jobs.d.ts.map +1 -1
  108. package/dist/capabilities/jobs.js +47 -3
  109. package/dist/capabilities/jobs.js.map +1 -1
  110. package/dist/capabilities/jobs.specs.d.ts.map +1 -1
  111. package/dist/capabilities/jobs.specs.js +3 -1
  112. package/dist/capabilities/jobs.specs.js.map +1 -1
  113. package/dist/capabilities/js-scripts.d.ts +19 -1
  114. package/dist/capabilities/js-scripts.d.ts.map +1 -1
  115. package/dist/capabilities/js-scripts.js +109 -2
  116. package/dist/capabilities/js-scripts.js.map +1 -1
  117. package/dist/capabilities/js-scripts.specs.d.ts +2 -0
  118. package/dist/capabilities/js-scripts.specs.d.ts.map +1 -1
  119. package/dist/capabilities/js-scripts.specs.js +50 -0
  120. package/dist/capabilities/js-scripts.specs.js.map +1 -1
  121. package/dist/capabilities/lazy-tool.d.ts +23 -24
  122. package/dist/capabilities/lazy-tool.d.ts.map +1 -1
  123. package/dist/capabilities/lazy-tool.js +29 -35
  124. package/dist/capabilities/lazy-tool.js.map +1 -1
  125. package/dist/capabilities/legacy-tools.d.ts +15 -0
  126. package/dist/capabilities/legacy-tools.d.ts.map +1 -0
  127. package/dist/capabilities/legacy-tools.js +98 -0
  128. package/dist/capabilities/legacy-tools.js.map +1 -0
  129. package/dist/capabilities/media.d.ts +0 -9
  130. package/dist/capabilities/media.d.ts.map +1 -1
  131. package/dist/capabilities/media.js +301 -260
  132. package/dist/capabilities/media.js.map +1 -1
  133. package/dist/capabilities/models.d.ts +2 -2
  134. package/dist/capabilities/models.d.ts.map +1 -1
  135. package/dist/capabilities/models.js +5 -3
  136. package/dist/capabilities/models.js.map +1 -1
  137. package/dist/capabilities/registry.d.ts +2 -0
  138. package/dist/capabilities/registry.d.ts.map +1 -1
  139. package/dist/capabilities/registry.js +28 -0
  140. package/dist/capabilities/registry.js.map +1 -1
  141. package/dist/capabilities/run-agent.d.ts +19 -0
  142. package/dist/capabilities/run-agent.d.ts.map +1 -0
  143. package/dist/capabilities/run-agent.js +183 -0
  144. package/dist/capabilities/run-agent.js.map +1 -0
  145. package/dist/capabilities/runs.d.ts +9 -0
  146. package/dist/capabilities/runs.d.ts.map +1 -0
  147. package/dist/capabilities/runs.js +46 -0
  148. package/dist/capabilities/runs.js.map +1 -0
  149. package/dist/capabilities/runs.specs.d.ts +39 -0
  150. package/dist/capabilities/runs.specs.d.ts.map +1 -0
  151. package/dist/capabilities/runs.specs.js +52 -0
  152. package/dist/capabilities/runs.specs.js.map +1 -0
  153. package/dist/capabilities/scripts.d.ts.map +1 -1
  154. package/dist/capabilities/scripts.js +11 -5
  155. package/dist/capabilities/scripts.js.map +1 -1
  156. package/dist/capabilities/sketches.d.ts.map +1 -1
  157. package/dist/capabilities/sketches.js +4 -2
  158. package/dist/capabilities/sketches.js.map +1 -1
  159. package/dist/capabilities/skills.d.ts.map +1 -1
  160. package/dist/capabilities/skills.js +22 -2
  161. package/dist/capabilities/skills.js.map +1 -1
  162. package/dist/capabilities/storyboard-layout-check.d.ts +33 -0
  163. package/dist/capabilities/storyboard-layout-check.d.ts.map +1 -0
  164. package/dist/capabilities/storyboard-layout-check.js +229 -0
  165. package/dist/capabilities/storyboard-layout-check.js.map +1 -0
  166. package/dist/capabilities/storyboard-measured-sources.d.ts +10 -0
  167. package/dist/capabilities/storyboard-measured-sources.d.ts.map +1 -0
  168. package/dist/capabilities/storyboard-measured-sources.js +67 -0
  169. package/dist/capabilities/storyboard-measured-sources.js.map +1 -0
  170. package/dist/capabilities/storyboard-review-times.d.ts +4 -0
  171. package/dist/capabilities/storyboard-review-times.d.ts.map +1 -0
  172. package/dist/capabilities/storyboard-review-times.js +39 -0
  173. package/dist/capabilities/storyboard-review-times.js.map +1 -0
  174. package/dist/capabilities/storyboards.d.ts +2 -18
  175. package/dist/capabilities/storyboards.d.ts.map +1 -1
  176. package/dist/capabilities/storyboards.js +315 -94
  177. package/dist/capabilities/storyboards.js.map +1 -1
  178. package/dist/capabilities/storyboards.specs.d.ts +3 -0
  179. package/dist/capabilities/storyboards.specs.d.ts.map +1 -1
  180. package/dist/capabilities/storyboards.specs.js +42 -3
  181. package/dist/capabilities/storyboards.specs.js.map +1 -1
  182. package/dist/capabilities/timeline-bridge.d.ts +359 -0
  183. package/dist/capabilities/timeline-bridge.d.ts.map +1 -0
  184. package/dist/capabilities/timeline-bridge.js +1016 -0
  185. package/dist/capabilities/timeline-bridge.js.map +1 -0
  186. package/dist/capabilities/timeline-clip-frames.d.ts +17 -0
  187. package/dist/capabilities/timeline-clip-frames.d.ts.map +1 -0
  188. package/dist/capabilities/timeline-clip-frames.js +84 -0
  189. package/dist/capabilities/timeline-clip-frames.js.map +1 -0
  190. package/dist/capabilities/timeline-media-edit.d.ts +8 -0
  191. package/dist/capabilities/timeline-media-edit.d.ts.map +1 -0
  192. package/dist/capabilities/timeline-media-edit.js +94 -0
  193. package/dist/capabilities/timeline-media-edit.js.map +1 -0
  194. package/dist/capabilities/timeline-native-media.d.ts.map +1 -1
  195. package/dist/capabilities/timeline-native-media.js +40 -0
  196. package/dist/capabilities/timeline-native-media.js.map +1 -1
  197. package/dist/capabilities/timelines.d.ts +64 -4
  198. package/dist/capabilities/timelines.d.ts.map +1 -1
  199. package/dist/capabilities/timelines.js +566 -67
  200. package/dist/capabilities/timelines.js.map +1 -1
  201. package/dist/capabilities/timelines.specs.d.ts +8 -0
  202. package/dist/capabilities/timelines.specs.d.ts.map +1 -1
  203. package/dist/capabilities/timelines.specs.js +173 -8
  204. package/dist/capabilities/timelines.specs.js.map +1 -1
  205. package/dist/capabilities/types.d.ts +3 -1
  206. package/dist/capabilities/types.d.ts.map +1 -1
  207. package/dist/capabilities/types.js.map +1 -1
  208. package/dist/capabilities/ui.d.ts.map +1 -1
  209. package/dist/capabilities/ui.js +24 -2
  210. package/dist/capabilities/ui.js.map +1 -1
  211. package/dist/capabilities/workflows.d.ts.map +1 -1
  212. package/dist/capabilities/workflows.js +53 -26
  213. package/dist/capabilities/workflows.js.map +1 -1
  214. package/dist/capabilities/workflows.specs.d.ts.map +1 -1
  215. package/dist/capabilities/workflows.specs.js +7 -1
  216. package/dist/capabilities/workflows.specs.js.map +1 -1
  217. package/dist/codeact/action-diagnostics.d.ts.map +1 -1
  218. package/dist/codeact/action-diagnostics.js +51 -1
  219. package/dist/codeact/action-diagnostics.js.map +1 -1
  220. package/dist/codeact/codeact-executor.d.ts.map +1 -1
  221. package/dist/codeact/codeact-executor.js +16 -8
  222. package/dist/codeact/codeact-executor.js.map +1 -1
  223. package/dist/codeact/compact-ids.d.ts.map +1 -1
  224. package/dist/codeact/compact-ids.js +5 -1
  225. package/dist/codeact/compact-ids.js.map +1 -1
  226. package/dist/codeact/graph-model.d.ts +1 -1
  227. package/dist/codeact/graph-model.d.ts.map +1 -1
  228. package/dist/codeact/graph-model.js +2 -3
  229. package/dist/codeact/graph-model.js.map +1 -1
  230. package/dist/codeact/nodetool-api.d.ts +1 -1
  231. package/dist/codeact/nodetool-api.d.ts.map +1 -1
  232. package/dist/codeact/nodetool-api.js +202 -284
  233. package/dist/codeact/nodetool-api.js.map +1 -1
  234. package/dist/codeact/tool-api.d.ts +6 -3
  235. package/dist/codeact/tool-api.d.ts.map +1 -1
  236. package/dist/codeact/tool-api.js +22 -15
  237. package/dist/codeact/tool-api.js.map +1 -1
  238. package/dist/evals/codeact-api-cases.d.ts.map +1 -1
  239. package/dist/evals/codeact-api-cases.js +2 -0
  240. package/dist/evals/codeact-api-cases.js.map +1 -1
  241. package/dist/evals/codeact-api-runs.d.ts +3 -0
  242. package/dist/evals/codeact-api-runs.d.ts.map +1 -0
  243. package/dist/evals/codeact-api-runs.js +33 -0
  244. package/dist/evals/codeact-api-runs.js.map +1 -0
  245. package/dist/evals/surfaces/sketch.d.ts +2 -0
  246. package/dist/evals/surfaces/sketch.d.ts.map +1 -1
  247. package/dist/evals/surfaces/sketch.js +11 -3
  248. package/dist/evals/surfaces/sketch.js.map +1 -1
  249. package/dist/evals/surfaces/timeline.d.ts +4 -357
  250. package/dist/evals/surfaces/timeline.d.ts.map +1 -1
  251. package/dist/evals/surfaces/timeline.js +9 -2621
  252. package/dist/evals/surfaces/timeline.js.map +1 -1
  253. package/dist/evals/tool-loop-bridge.d.ts +4 -0
  254. package/dist/evals/tool-loop-bridge.d.ts.map +1 -1
  255. package/dist/evals/tool-loop-bridge.js.map +1 -1
  256. package/dist/evals/tool-loop-eval.d.ts +2 -0
  257. package/dist/evals/tool-loop-eval.d.ts.map +1 -1
  258. package/dist/evals/tool-loop-eval.js +6 -1
  259. package/dist/evals/tool-loop-eval.js.map +1 -1
  260. package/dist/evals/tool-loop-permission.d.ts +1 -15
  261. package/dist/evals/tool-loop-permission.d.ts.map +1 -1
  262. package/dist/evals/tool-loop-permission.js +23 -41
  263. package/dist/evals/tool-loop-permission.js.map +1 -1
  264. package/dist/game-authoring.d.ts +4737 -0
  265. package/dist/game-authoring.d.ts.map +1 -0
  266. package/dist/game-authoring.js +146 -0
  267. package/dist/game-authoring.js.map +1 -0
  268. package/dist/game-code-bake.d.ts +26 -0
  269. package/dist/game-code-bake.d.ts.map +1 -0
  270. package/dist/game-code-bake.js +98 -0
  271. package/dist/game-code-bake.js.map +1 -0
  272. package/dist/game-examples.d.ts +872 -16
  273. package/dist/game-examples.d.ts.map +1 -1
  274. package/dist/game-examples.js +5 -4
  275. package/dist/game-examples.js.map +1 -1
  276. package/dist/index.d.ts +15 -4
  277. package/dist/index.d.ts.map +1 -1
  278. package/dist/index.js +13 -3
  279. package/dist/index.js.map +1 -1
  280. package/dist/js-sandbox-worker/engine.d.ts +4 -0
  281. package/dist/js-sandbox-worker/engine.d.ts.map +1 -0
  282. package/dist/js-sandbox-worker/engine.js +45 -0
  283. package/dist/js-sandbox-worker/engine.js.map +1 -0
  284. package/dist/js-sandbox-worker/host.js +1 -1
  285. package/dist/js-sandbox-worker/host.js.map +1 -1
  286. package/dist/js-sandbox-worker/interpreter.d.ts +1 -1
  287. package/dist/js-sandbox-worker/interpreter.d.ts.map +1 -1
  288. package/dist/js-sandbox-worker/interpreter.js +94 -2
  289. package/dist/js-sandbox-worker/interpreter.js.map +1 -1
  290. package/dist/js-sandbox-worker/worker-entry.d.ts.map +1 -1
  291. package/dist/js-sandbox-worker/worker-entry.js +3 -2
  292. package/dist/js-sandbox-worker/worker-entry.js.map +1 -1
  293. package/dist/js-sandbox.d.ts +2 -0
  294. package/dist/js-sandbox.d.ts.map +1 -1
  295. package/dist/js-sandbox.js +56 -11
  296. package/dist/js-sandbox.js.map +1 -1
  297. package/dist/js-script-app-runner.d.ts +2 -0
  298. package/dist/js-script-app-runner.d.ts.map +1 -1
  299. package/dist/js-script-app-runner.js +8 -3
  300. package/dist/js-script-app-runner.js.map +1 -1
  301. package/dist/js-script-sandbox.d.ts +12 -18
  302. package/dist/js-script-sandbox.d.ts.map +1 -1
  303. package/dist/js-script-sandbox.js +3 -49
  304. package/dist/js-script-sandbox.js.map +1 -1
  305. package/dist/prompts/product-knowledge.d.ts +1 -1
  306. package/dist/prompts/product-knowledge.d.ts.map +1 -1
  307. package/dist/prompts/product-knowledge.js +82 -41
  308. package/dist/prompts/product-knowledge.js.map +1 -1
  309. package/dist/sandbox-pack-resolution.d.ts +21 -0
  310. package/dist/sandbox-pack-resolution.d.ts.map +1 -0
  311. package/dist/sandbox-pack-resolution.js +42 -0
  312. package/dist/sandbox-pack-resolution.js.map +1 -0
  313. package/dist/sandbox-toolbelt.d.ts +3 -1
  314. package/dist/sandbox-toolbelt.d.ts.map +1 -1
  315. package/dist/sandbox-toolbelt.js +8 -2
  316. package/dist/sandbox-toolbelt.js.map +1 -1
  317. package/dist/skill-prompt.d.ts +11 -1
  318. package/dist/skill-prompt.d.ts.map +1 -1
  319. package/dist/skill-prompt.js +17 -6
  320. package/dist/skill-prompt.js.map +1 -1
  321. package/dist/system-skills.d.ts +7 -1
  322. package/dist/system-skills.d.ts.map +1 -1
  323. package/dist/system-skills.js +2 -2
  324. package/dist/system-skills.js.map +1 -1
  325. package/dist/timeline-capture.d.ts +21 -0
  326. package/dist/timeline-capture.d.ts.map +1 -0
  327. package/dist/timeline-capture.js +564 -0
  328. package/dist/timeline-capture.js.map +1 -0
  329. package/dist/timeline-code-bake.d.ts +75 -0
  330. package/dist/timeline-code-bake.d.ts.map +1 -0
  331. package/dist/timeline-code-bake.js +327 -0
  332. package/dist/timeline-code-bake.js.map +1 -0
  333. package/dist/timeline-preview/frames.d.ts +26 -0
  334. package/dist/timeline-preview/frames.d.ts.map +1 -1
  335. package/dist/timeline-preview/frames.js +155 -70
  336. package/dist/timeline-preview/frames.js.map +1 -1
  337. package/dist/tools/base-tool.d.ts +1 -0
  338. package/dist/tools/base-tool.d.ts.map +1 -1
  339. package/dist/tools/base-tool.js +1 -1
  340. package/dist/tools/base-tool.js.map +1 -1
  341. package/dist/tools/builtin-tools.d.ts.map +1 -1
  342. package/dist/tools/builtin-tools.js +13 -0
  343. package/dist/tools/builtin-tools.js.map +1 -1
  344. package/dist/tools/external-capability-tools.d.ts +1 -1
  345. package/dist/tools/external-capability-tools.js +1 -1
  346. package/dist/tools/mcp-tool-support.d.ts +10 -9
  347. package/dist/tools/mcp-tool-support.d.ts.map +1 -1
  348. package/dist/tools/mcp-tool-support.js +14 -13
  349. package/dist/tools/mcp-tool-support.js.map +1 -1
  350. package/dist/tools/mcp-tools.d.ts +6 -4
  351. package/dist/tools/mcp-tools.d.ts.map +1 -1
  352. package/dist/tools/mcp-tools.js +65 -62
  353. package/dist/tools/mcp-tools.js.map +1 -1
  354. package/dist/tools/tool-permissions.d.ts +1 -1
  355. package/dist/tools/tool-permissions.js +1 -1
  356. package/package.json +24 -22
  357. package/dist/capabilities/gate-tools.d.ts +0 -18
  358. package/dist/capabilities/gate-tools.d.ts.map +0 -1
  359. package/dist/capabilities/gate-tools.js +0 -66
  360. package/dist/capabilities/gate-tools.js.map +0 -1
  361. package/dist/tsconfig.tests.tmp.tsbuildinfo +0 -1
@@ -0,0 +1,33 @@
1
+ import { type TimelineClip, type TimelineSequence } from "@nodetool-ai/timeline";
2
+ /** A collision between copy and another layer, or between copy and the frame edge. */
3
+ export interface LayoutDefect {
4
+ shotId: string;
5
+ timeMs: number;
6
+ clipIds: string[];
7
+ message: string;
8
+ }
9
+ export interface ShotWindow {
10
+ shotId: string;
11
+ start: number;
12
+ duration: number;
13
+ }
14
+ /**
15
+ * The settled moment of a shot: midway between the last entrance finishing and
16
+ * the first exit starting. That is the frame a viewer reads the shot at.
17
+ */
18
+ export declare function shotHoldTimes(clips: readonly TimelineClip[], windows: readonly ShotWindow[], width: number, height: number): Map<string, number>;
19
+ /**
20
+ * Render every visible layer of each shot alone at the shot's hold frame and
21
+ * compare the boxes of the pixels each one draws. Copy that crosses an image
22
+ * edge, crowds another layer or reaches the frame edge is a defect no
23
+ * reference frame can approve. Copy set wholly inside a plate or image is a
24
+ * deliberate overlay and passes.
25
+ */
26
+ export declare function findLayoutDefects(options: {
27
+ sequence: TimelineSequence;
28
+ windows: readonly ShotWindow[];
29
+ holds: ReadonlyMap<string, number>;
30
+ loadAsset: (assetId: string) => Promise<Uint8Array | null>;
31
+ signal?: AbortSignal;
32
+ }): Promise<LayoutDefect[]>;
33
+ //# sourceMappingURL=storyboard-layout-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storyboard-layout-check.d.ts","sourceRoot":"","sources":["../../src/capabilities/storyboard-layout-check.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAG/B,sFAAsF;AACtF,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AA4CD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA2BrB;AAqDD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IAC/B,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC3D,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA2I1B"}
@@ -0,0 +1,229 @@
1
+ import { createCanvas, loadImage } from "@napi-rs/canvas";
2
+ import { compileClipAnimations, makeClip, makeTrack } from "@nodetool-ai/timeline";
3
+ import { renderTimelineFrames } from "../timeline-preview/frames.js";
4
+ /** Copy keeps this clearance from other layers and the frame edge, as a fraction of frame height. */
5
+ const CLEARANCE = 0.012;
6
+ /** Summed RGBA difference that counts a pixel as drawn by the layer. */
7
+ const CHANGE_THRESHOLD = 48;
8
+ /** A layer covering this much of the frame is a backdrop, and copy sits on it by design. */
9
+ const BACKDROP_COVERAGE = 0.9;
10
+ const CHECK_WIDTH = 540;
11
+ const BACKDROP_FILLS = ["#000000", "#FFFFFF"];
12
+ const LAYOUT_MEDIA = new Set(["text", "image", "video", "shape"]);
13
+ const intersects = (a, b) => a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom;
14
+ const expand = (box, by) => ({
15
+ left: box.left - by,
16
+ top: box.top - by,
17
+ right: box.right + by,
18
+ bottom: box.bottom + by
19
+ });
20
+ const contains = (outer, inner) => inner.left >= outer.left &&
21
+ inner.top >= outer.top &&
22
+ inner.right <= outer.right &&
23
+ inner.bottom <= outer.bottom;
24
+ /**
25
+ * The settled moment of a shot: midway between the last entrance finishing and
26
+ * the first exit starting. That is the frame a viewer reads the shot at.
27
+ */
28
+ export function shotHoldTimes(clips, windows, width, height) {
29
+ const holds = new Map();
30
+ for (const window of windows) {
31
+ const end = window.start + window.duration;
32
+ let settled = window.start;
33
+ let exit = end;
34
+ for (const clip of clips) {
35
+ if (clip.mediaType === "audio" || clip.startMs < window.start || clip.startMs >= end) {
36
+ continue;
37
+ }
38
+ for (const animation of compileClipAnimations(clip.animations, clip.durationMs, { width, height })) {
39
+ if (animation.loop) {
40
+ continue;
41
+ }
42
+ if (animation.role === "in") {
43
+ settled = Math.max(settled, clip.startMs + animation.windowEndMs);
44
+ }
45
+ else if (animation.role === "out") {
46
+ exit = Math.min(exit, clip.startMs + animation.windowStartMs);
47
+ }
48
+ }
49
+ }
50
+ holds.set(window.shotId, Math.round(settled < exit ? (settled + exit) / 2 : window.start + window.duration / 2));
51
+ }
52
+ return holds;
53
+ }
54
+ async function decodePixels(png) {
55
+ const image = await loadImage(Buffer.from(png));
56
+ const canvas = createCanvas(image.width, image.height);
57
+ const context = canvas.getContext("2d");
58
+ context.drawImage(image, 0, 0);
59
+ return {
60
+ data: context.getImageData(0, 0, image.width, image.height).data,
61
+ width: image.width,
62
+ height: image.height
63
+ };
64
+ }
65
+ const changed = (layer, empty, i) => Math.abs(layer.data[i] - empty.data[i]) +
66
+ Math.abs(layer.data[i + 1] - empty.data[i + 1]) +
67
+ Math.abs(layer.data[i + 2] - empty.data[i + 2]) +
68
+ Math.abs(layer.data[i + 3] - empty.data[i + 3]) >=
69
+ CHANGE_THRESHOLD;
70
+ /**
71
+ * The box of every pixel a layer changed over either backdrop. One backdrop
72
+ * hides the layer's pixels that share its colour, so a dark product edge on
73
+ * black or white copy on white is caught by the other one.
74
+ */
75
+ function changedBox(renders) {
76
+ const { width, height } = renders[0].layer;
77
+ let left = width;
78
+ let top = height;
79
+ let right = -1;
80
+ let bottom = -1;
81
+ let covered = 0;
82
+ for (let y = 0; y < height; y += 1) {
83
+ for (let x = 0; x < width; x += 1) {
84
+ const i = (y * width + x) * 4;
85
+ if (!renders.some(({ layer, empty }) => changed(layer, empty, i))) {
86
+ continue;
87
+ }
88
+ covered += 1;
89
+ left = Math.min(left, x);
90
+ right = Math.max(right, x + 1);
91
+ top = Math.min(top, y);
92
+ bottom = Math.max(bottom, y + 1);
93
+ }
94
+ }
95
+ return right < 0
96
+ ? null
97
+ : { box: { left, top, right, bottom }, coverage: covered / (width * height) };
98
+ }
99
+ /**
100
+ * Render every visible layer of each shot alone at the shot's hold frame and
101
+ * compare the boxes of the pixels each one draws. Copy that crosses an image
102
+ * edge, crowds another layer or reaches the frame edge is a defect no
103
+ * reference frame can approve. Copy set wholly inside a plate or image is a
104
+ * deliberate overlay and passes.
105
+ */
106
+ export async function findLayoutDefects(options) {
107
+ const { sequence, windows, holds } = options;
108
+ const defects = [];
109
+ for (const window of windows) {
110
+ const timeMs = holds.get(window.shotId);
111
+ if (timeMs === undefined) {
112
+ continue;
113
+ }
114
+ // A layer is what it changes over a solid backdrop beneath every track.
115
+ const backdropTrack = makeTrack({
116
+ type: "overlay",
117
+ name: "Layout check backdrop",
118
+ index: Math.max(-1, ...sequence.tracks.map((track) => track.index)) + 1
119
+ });
120
+ const backdrops = BACKDROP_FILLS.map((fill) => {
121
+ const clip = makeClip({
122
+ trackId: backdropTrack.id,
123
+ name: "Layout check backdrop",
124
+ mediaType: "shape",
125
+ sourceType: "imported",
126
+ status: "generated",
127
+ startMs: 0,
128
+ durationMs: timeMs + 1,
129
+ shapeStyle: { kind: "rect", fill, x: 0, y: 0, width: 1, height: 1 }
130
+ });
131
+ return {
132
+ clipId: clip.id,
133
+ sequence: {
134
+ ...sequence,
135
+ tracks: [...sequence.tracks, backdropTrack],
136
+ clips: [...sequence.clips, clip]
137
+ }
138
+ };
139
+ });
140
+ const render = async (backdrop, clipId) => {
141
+ options.signal?.throwIfAborted();
142
+ const frame = (await renderTimelineFrames({
143
+ sequence: backdrop.sequence,
144
+ timesMs: [timeMs],
145
+ width: CHECK_WIDTH,
146
+ onlyClipIds: clipId ? [backdrop.clipId, clipId] : [backdrop.clipId],
147
+ loadAsset: options.loadAsset
148
+ })).frames[0];
149
+ return frame ? decodePixels(frame.png) : null;
150
+ };
151
+ const empties = [];
152
+ for (const backdrop of backdrops) {
153
+ const pixels = await render(backdrop);
154
+ if (pixels) {
155
+ empties.push(pixels);
156
+ }
157
+ }
158
+ if (empties.length !== backdrops.length) {
159
+ continue;
160
+ }
161
+ const empty = empties[0];
162
+ const footprints = [];
163
+ for (const clip of sequence.clips) {
164
+ if (!LAYOUT_MEDIA.has(clip.mediaType) ||
165
+ clip.hidden ||
166
+ clip.startMs > timeMs ||
167
+ timeMs >= clip.startMs + clip.durationMs) {
168
+ continue;
169
+ }
170
+ const renders = [];
171
+ for (const [index, backdrop] of backdrops.entries()) {
172
+ const layer = await render(backdrop, clip.id);
173
+ if (layer) {
174
+ renders.push({ layer, empty: empties[index] });
175
+ }
176
+ }
177
+ const measured = renders.length === backdrops.length ? changedBox(renders) : null;
178
+ if (measured && measured.coverage < BACKDROP_COVERAGE) {
179
+ footprints.push({ clip, box: measured.box });
180
+ }
181
+ }
182
+ // Report in sequence pixels, the unit set_clip_params takes.
183
+ const toSequence = (sequence.width || empty.width) / empty.width;
184
+ const px = (value) => Math.round(value * toSequence);
185
+ const clearance = Math.max(1, Math.round(CLEARANCE * empty.height));
186
+ const label = (clip) => clip.mediaType === "text"
187
+ ? `"${clip.textStyle?.text?.trim() ?? clip.name}" (${clip.name}, ${clip.id})`
188
+ : `${clip.name} (${clip.id})`;
189
+ const safeArea = expand({ left: 0, top: 0, right: empty.width, bottom: empty.height }, -clearance);
190
+ const texts = footprints.filter((layer) => layer.clip.mediaType === "text");
191
+ for (const text of texts) {
192
+ if (!contains(safeArea, text.box)) {
193
+ defects.push({
194
+ shotId: window.shotId,
195
+ timeMs,
196
+ clipIds: [text.clip.id],
197
+ message: `Copy ${label(text.clip)} reaches within ${px(clearance)}px of the frame edge at ${timeMs}ms. Keep all copy inside the safe area.`
198
+ });
199
+ }
200
+ for (const other of footprints) {
201
+ if (other === text) {
202
+ continue;
203
+ }
204
+ const otherIsText = other.clip.mediaType === "text";
205
+ // Report each pair of copy layers once.
206
+ if (otherIsText && texts.indexOf(other) < texts.indexOf(text)) {
207
+ continue;
208
+ }
209
+ if (!intersects(expand(text.box, clearance), other.box)) {
210
+ continue;
211
+ }
212
+ if (!otherIsText && contains(expand(other.box, -clearance), text.box)) {
213
+ continue;
214
+ }
215
+ const gap = Math.max(other.box.top - text.box.bottom, text.box.top - other.box.bottom, other.box.left - text.box.right, text.box.left - other.box.right, 0);
216
+ defects.push({
217
+ shotId: window.shotId,
218
+ timeMs,
219
+ clipIds: [text.clip.id, other.clip.id],
220
+ message: intersects(text.box, other.box)
221
+ ? `Copy ${label(text.clip)} overlaps ${label(other.clip)} at ${timeMs}ms. Move or resize one so they keep at least ${px(clearance)}px apart.`
222
+ : `Copy ${label(text.clip)} is ${px(gap)}px from ${label(other.clip)} at ${timeMs}ms. Keep at least ${px(clearance)}px apart.`
223
+ });
224
+ }
225
+ }
226
+ }
227
+ return defects;
228
+ }
229
+ //# sourceMappingURL=storyboard-layout-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storyboard-layout-check.js","sourceRoot":"","sources":["../../src/capabilities/storyboard-layout-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Shot } from "@nodetool-ai/protocol";
2
+ import type { ProcessingContext } from "@nodetool-ai/runtime";
3
+ /** Use measured source length consistently for assembly, design preview and finishing. */
4
+ export declare function measureStoryboardSources(shots: Shot[], context: ProcessingContext, signal?: AbortSignal): Promise<Shot[]>;
5
+ /** Pixel size of every graphics image, so finishing can fit it between its copy. */
6
+ export declare function measureStoryboardAssetSizes(shots: readonly Shot[], context: ProcessingContext, signal?: AbortSignal): Promise<Record<string, {
7
+ width: number;
8
+ height: number;
9
+ }>>;
10
+ //# sourceMappingURL=storyboard-measured-sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storyboard-measured-sources.d.ts","sourceRoot":"","sources":["../../src/capabilities/storyboard-measured-sources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,0FAA0F;AAC1F,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,GAAE,WAA4D,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAoB/K;AAED,oFAAoF;AACpF,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,GAAE,WAA4D,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CA2BtO"}
@@ -0,0 +1,67 @@
1
+ import { clampConcurrency, mapWithConcurrency } from "./concurrency.js";
2
+ /** Use measured source length consistently for assembly, design preview and finishing. */
3
+ export async function measureStoryboardSources(shots, context, signal = context.signal ?? new AbortController().signal) {
4
+ const { loadMediaRefBytes, probeVideoDurationSeconds } = await import("@nodetool-ai/runtime");
5
+ const { applyMeasuredShotClipDurations, resolveShotSource } = await import("@nodetool-ai/timeline");
6
+ signal.throwIfAborted();
7
+ const measurements = await mapWithConcurrency(shots, clampConcurrency(undefined), async (shot) => {
8
+ const clip = shot.clip;
9
+ const assetId = clip?.asset_id;
10
+ if (shot.status !== "rendered" || !assetId || resolveShotSource(shot)?.kind !== "video") {
11
+ return null;
12
+ }
13
+ try {
14
+ const bytes = await loadMediaRefBytes(clip, context);
15
+ const seconds = bytes?.length ? await probeVideoDurationSeconds(bytes, signal) : null;
16
+ return seconds === null ? null : [assetId, seconds];
17
+ }
18
+ catch (error) {
19
+ if (signal.aborted) {
20
+ throw error;
21
+ }
22
+ // Unmeasurable sources retain their stored duration, as canonical assembly does.
23
+ return null;
24
+ }
25
+ });
26
+ signal.throwIfAborted();
27
+ return applyMeasuredShotClipDurations(shots, new Map(measurements.flatMap((value) => value ? [value] : [])));
28
+ }
29
+ /** Pixel size of every graphics image, so finishing can fit it between its copy. */
30
+ export async function measureStoryboardAssetSizes(shots, context, signal = context.signal ?? new AbortController().signal) {
31
+ const { loadMediaRefBytes } = await import("@nodetool-ai/runtime");
32
+ const { loadImage } = await import("@napi-rs/canvas");
33
+ const assetIds = new Set();
34
+ for (const shot of shots) {
35
+ for (const element of shot.graphics?.elements ?? []) {
36
+ if (element.kind === "asset" && element.asset_id) {
37
+ assetIds.add(element.asset_id);
38
+ }
39
+ }
40
+ for (const protection of shot.production?.protected_inputs ?? []) {
41
+ if (protection.asset_id) {
42
+ assetIds.add(protection.asset_id);
43
+ }
44
+ }
45
+ }
46
+ signal.throwIfAborted();
47
+ const sizes = await mapWithConcurrency([...assetIds], clampConcurrency(undefined), async (assetId) => {
48
+ try {
49
+ const bytes = await loadMediaRefBytes({ asset_id: assetId }, context);
50
+ if (!bytes?.length) {
51
+ return null;
52
+ }
53
+ const image = await loadImage(Buffer.from(bytes));
54
+ return image.width > 0 && image.height > 0 ? [assetId, { width: image.width, height: image.height }] : null;
55
+ }
56
+ catch (error) {
57
+ if (signal.aborted) {
58
+ throw error;
59
+ }
60
+ // An unreadable image keeps the default slot; validation reports a missing asset.
61
+ return null;
62
+ }
63
+ });
64
+ signal.throwIfAborted();
65
+ return Object.fromEntries(sizes.flatMap((value) => value ? [value] : []));
66
+ }
67
+ //# sourceMappingURL=storyboard-measured-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storyboard-measured-sources.js","sourceRoot":"","sources":["../../src/capabilities/storyboard-measured-sources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type TimelineClip } from "@nodetool-ai/timeline";
2
+ /** Sample holds, cut boundaries and authored motion events in timeline time. */
3
+ export declare function storyboardReviewTimes(clips: readonly TimelineClip[], width: number, height: number, fps: number): number[];
4
+ //# sourceMappingURL=storyboard-review-times.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storyboard-review-times.d.ts","sourceRoot":"","sources":["../../src/capabilities/storyboard-review-times.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE7F,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAiC1H"}
@@ -0,0 +1,39 @@
1
+ import { compileClipAnimations, sourceRate } from "@nodetool-ai/timeline";
2
+ /** Sample holds, cut boundaries and authored motion events in timeline time. */
3
+ export function storyboardReviewTimes(clips, width, height, fps) {
4
+ const times = new Set();
5
+ const frameMs = 1000 / fps;
6
+ for (const clip of clips) {
7
+ if (clip.mediaType === "audio" || clip.durationMs <= 0) {
8
+ continue;
9
+ }
10
+ const last = Math.max(0, clip.durationMs - frameMs);
11
+ const add = (local) => { times.add(Math.round(clip.startMs + Math.max(0, Math.min(last, local)))); };
12
+ add(0);
13
+ add(clip.durationMs / 2);
14
+ add(last);
15
+ if (clip.transitionIn) {
16
+ add(clip.transitionIn.durationMs / 2);
17
+ add(clip.transitionIn.durationMs);
18
+ }
19
+ for (const animation of compileClipAnimations(clip.animations, clip.durationMs, { width, height })) {
20
+ const start = animation.windowStartMs;
21
+ const end = animation.loop ? Math.min(animation.windowEndMs, start + (animation.periodMs ?? clip.durationMs)) : animation.windowEndMs;
22
+ add(start);
23
+ add((start + end) / 2);
24
+ add(end);
25
+ for (const curve of animation.curves) {
26
+ for (const keyframe of curve.keyframes) {
27
+ add(animation.timeBase === "source" && keyframe.sourceMs !== undefined
28
+ ? (keyframe.sourceMs - (clip.inPointMs ?? 0)) / sourceRate(clip)
29
+ : start + keyframe.t * (end - start));
30
+ }
31
+ }
32
+ }
33
+ }
34
+ if (times.size > 128) {
35
+ throw new Error(`Visual review requires ${times.size} event frames, exceeding the 128-frame limit. Split the cut or simplify motion before requesting reviewed finishing.`);
36
+ }
37
+ return [...times].sort((left, right) => left - right);
38
+ }
39
+ //# sourceMappingURL=storyboard-review-times.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storyboard-review-times.js","sourceRoot":"","sources":["../../src/capabilities/storyboard-review-times.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,4 @@
1
- /**
2
- * The `storyboards` capability module.
3
- *
4
- * Storyboard capabilities: list and create, render stills and clips, revise
5
- * one take, assemble a timeline, edit the shot list, extract a script, and
6
- * delete. The render path used to be seven `Tool` subclasses in
7
- * `../tools/storyboard-render-tools.ts`.
8
- *
9
- * Wire names, descriptions and schemas are unchanged. Prompt composition,
10
- * entity seasoning, and the shot → timeline mapping stay the editor's own
11
- * (`entitiesForShot` from `@nodetool-ai/protocol`, `buildStoryboardTimeline`
12
- * from `@nodetool-ai/timeline`), so a board rendered headlessly matches one
13
- * rendered in the UI. Every heavy dependency is imported inside the
14
- * implementation that needs it.
15
- *
16
- * Design: docs/tool-class-retirement-design.md § "Migration".
17
- */
1
+ import { finishStoryboard, layoutStoryboard, previewStoryboardDesign } from "./finish-storyboard.js";
18
2
  import type { VideoRef } from "@nodetool-ai/protocol";
19
3
  import type { CapabilityExport, CapabilityModule } from "./types.js";
20
4
  /**
@@ -64,5 +48,5 @@ declare const extractScriptFromStoryboard: CapabilityExport;
64
48
  declare const deleteStoryboard: CapabilityExport;
65
49
  export declare const STORYBOARD_CAPABILITIES: readonly CapabilityExport[];
66
50
  export declare const module: CapabilityModule;
67
- export { listStoryboards, createStoryboard, getStoryboard, renderStoryboardStills, renderStoryboardClips, reviseStoryboardClip, assembleStoryboardTimeline, editStoryboard, directStoryboard, extractScriptFromStoryboard, deleteStoryboard };
51
+ export { finishStoryboard, layoutStoryboard, previewStoryboardDesign, listStoryboards, createStoryboard, getStoryboard, renderStoryboardStills, renderStoryboardClips, reviseStoryboardClip, assembleStoryboardTimeline, editStoryboard, directStoryboard, extractScriptFromStoryboard, deleteStoryboard };
68
52
  //# sourceMappingURL=storyboards.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storyboards.d.ts","sourceRoot":"","sources":["../../src/capabilities/storyboards.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAYH,OAAO,KAAK,EASV,QAAQ,EACT,MAAM,uBAAuB,CAAC;AAS/B,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AA8VpB;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG,QAAQ,CAYX;AAqBD,QAAA,MAAM,eAAe,EAAE,gBAuBtB,CAAC;AAmBF,QAAA,MAAM,gBAAgB,EAAE,gBAoDvB,CAAC;AAEF,QAAA,MAAM,aAAa,EAAE,gBA6CpB,CAAC;AA6GF,QAAA,MAAM,sBAAsB,EAAE,gBAgG7B,CAAC;AAEF,QAAA,MAAM,qBAAqB,EAAE,gBA4I5B,CAAC;AAEF,QAAA,MAAM,oBAAoB,EAAE,gBA6E3B,CAAC;AAMF,QAAA,MAAM,0BAA0B,EAAE,gBA+QjC,CAAC;AAcF,QAAA,MAAM,SAAS,YACb,UAAU,EACV,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,cAAc,EACd,cAAc,EACd,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,CACd,CAAC;AAEX,KAAK,WAAW,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AA6B9C,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,UAAW,MAAM,KAAG,WAAW,GAAG,IAIhE,CAAC;AA64BF,QAAA,MAAM,cAAc,EAAE,gBAmGrB,CAAC;AAQF;;;;;GAKG;AACH,QAAA,MAAM,gBAAgB,EAAE,gBAqKvB,CAAC;AAWF,QAAA,MAAM,2BAA2B,EAAE,gBA6JlC,CAAC;AAEF,6EAA6E;AAC7E;;;;;;;GAOG;AACH,QAAA,MAAM,gBAAgB,EAAE,gBAYvB,CAAC;AACF,eAAO,MAAM,uBAAuB,EAAE,SAAS,gBAAgB,EAY9D,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,gBAGpB,CAAC;AAEF,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC1B,cAAc,EACd,gBAAgB,EAChB,2BAA2B,EAC3B,gBAAgB,EACjB,CAAC"}
1
+ {"version":3,"file":"storyboards.d.ts","sourceRoot":"","sources":["../../src/capabilities/storyboards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAgCrG,OAAO,KAAK,EASV,QAAQ,EACT,MAAM,uBAAuB,CAAC;AAoB/B,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AA+VpB;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG,QAAQ,CAYX;AAqBD,QAAA,MAAM,eAAe,EAAE,gBAwBtB,CAAC;AAoBF,QAAA,MAAM,gBAAgB,EAAE,gBAoDvB,CAAC;AAEF,QAAA,MAAM,aAAa,EAAE,gBAiDpB,CAAC;AAoLF,QAAA,MAAM,sBAAsB,EAAE,gBA6G7B,CAAC;AAEF,QAAA,MAAM,qBAAqB,EAAE,gBAuI5B,CAAC;AAEF,QAAA,MAAM,oBAAoB,EAAE,gBA0F3B,CAAC;AAMF,QAAA,MAAM,0BAA0B,EAAE,gBAqPjC,CAAC;AAcF,QAAA,MAAM,SAAS,YACb,UAAU,EACV,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,cAAc,EACd,cAAc,EACd,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,CACd,CAAC;AAEX,KAAK,WAAW,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AA6B9C,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,UAAW,MAAM,KAAG,WAAW,GAAG,IAIhE,CAAC;AAygCF,QAAA,MAAM,cAAc,EAAE,gBA6GrB,CAAC;AAQF;;;;;GAKG;AACH,QAAA,MAAM,gBAAgB,EAAE,gBA4KvB,CAAC;AAWF,QAAA,MAAM,2BAA2B,EAAE,gBA6JlC,CAAC;AAEF,6EAA6E;AAC7E;;;;;;;GAOG;AACH,QAAA,MAAM,gBAAgB,EAAE,gBAYvB,CAAC;AACF,eAAO,MAAM,uBAAuB,EAAE,SAAS,gBAAgB,EAe9D,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,gBAGpB,CAAC;AAEF,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC1B,cAAc,EACd,gBAAgB,EAChB,2BAA2B,EAC3B,gBAAgB,EACjB,CAAC"}