@adminide-stack/yantra-mobile 12.0.121 → 12.0.123

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 (175) hide show
  1. package/lib/features/apps/appArt.js +1 -1
  2. package/lib/features/apps/appArt.js.map +1 -1
  3. package/lib/features/apps/mobileAppCatalog.js +15 -11
  4. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  5. package/lib/features/canvas/CanvasAgentChatPane.js +82 -20
  6. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  7. package/lib/features/canvas/CanvasBoardsGrid.js +291 -100
  8. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  9. package/lib/features/canvas/CanvasEditToolsPanel.js +105 -12
  10. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  11. package/lib/features/canvas/CanvasExperience.js +266 -68
  12. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  13. package/lib/features/canvas/CanvasGeneratePanel.js +204 -66
  14. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  15. package/lib/features/canvas/CanvasLibrarySheet.js +31 -13
  16. package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
  17. package/lib/features/canvas/CanvasModelPicker.js +176 -0
  18. package/lib/features/canvas/CanvasModelPicker.js.map +1 -0
  19. package/lib/features/canvas/CanvasTasksPanel.js +325 -29
  20. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  21. package/lib/features/canvas/CanvasTemplatesPanel.js +5 -4
  22. package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
  23. package/lib/features/canvas/CanvasToolDock.js +137 -61
  24. package/lib/features/canvas/CanvasToolDock.js.map +1 -1
  25. package/lib/features/canvas/FrameExtractorExperience.js +33 -2
  26. package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
  27. package/lib/features/canvas/GeneratorReferenceSlots.js +197 -0
  28. package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -0
  29. package/lib/features/canvas/NativeCanvasViewer.js +89 -11
  30. package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
  31. package/lib/features/canvas/PromoContextFields.js +55 -2
  32. package/lib/features/canvas/PromoContextFields.js.map +1 -1
  33. package/lib/features/canvas/SetStudioExperience.js +323 -13
  34. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  35. package/lib/features/canvas/VideoEditExperience.js +1 -53
  36. package/lib/features/canvas/VideoEditExperience.js.map +1 -1
  37. package/lib/features/canvas/VideoEditorExperience.js +697 -506
  38. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  39. package/lib/features/canvas/VideoGeneratorExperience.js +22 -5
  40. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  41. package/lib/features/canvas/canvasAgentChat.js +125 -11
  42. package/lib/features/canvas/canvasAgentChat.js.map +1 -1
  43. package/lib/features/canvas/canvasCore.js +117 -12
  44. package/lib/features/canvas/canvasCore.js.map +1 -1
  45. package/lib/features/canvas/canvasEditOps.js +148 -111
  46. package/lib/features/canvas/canvasEditOps.js.map +1 -1
  47. package/lib/features/canvas/canvasTaskSync.js +235 -0
  48. package/lib/features/canvas/canvasTaskSync.js.map +1 -0
  49. package/lib/features/canvas/canvasTasks.js +98 -11
  50. package/lib/features/canvas/canvasTasks.js.map +1 -1
  51. package/lib/features/canvas/createTiles.js +247 -0
  52. package/lib/features/canvas/createTiles.js.map +1 -0
  53. package/lib/features/canvas/deepLinks.js +83 -0
  54. package/lib/features/canvas/deepLinks.js.map +1 -0
  55. package/lib/features/canvas/frameExtract.js +13 -1
  56. package/lib/features/canvas/frameExtract.js.map +1 -1
  57. package/lib/features/canvas/generationModels.js +36 -8
  58. package/lib/features/canvas/generationModels.js.map +1 -1
  59. package/lib/features/canvas/generatorCommands.js +106 -0
  60. package/lib/features/canvas/generatorCommands.js.map +1 -0
  61. package/lib/features/canvas/generatorReferences.js +82 -0
  62. package/lib/features/canvas/generatorReferences.js.map +1 -0
  63. package/lib/features/canvas/homeWork.js +74 -0
  64. package/lib/features/canvas/homeWork.js.map +1 -0
  65. package/lib/features/canvas/linksRpc.js +130 -0
  66. package/lib/features/canvas/linksRpc.js.map +1 -0
  67. package/lib/features/canvas/mediaRecheck.js +176 -0
  68. package/lib/features/canvas/mediaRecheck.js.map +1 -0
  69. package/lib/features/canvas/mediaUrls.js +258 -0
  70. package/lib/features/canvas/mediaUrls.js.map +1 -0
  71. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  72. package/lib/features/canvas/promoProjectImport.js +80 -13
  73. package/lib/features/canvas/promoProjectImport.js.map +1 -1
  74. package/lib/features/canvas/promoVideo.js +106 -15
  75. package/lib/features/canvas/promoVideo.js.map +1 -1
  76. package/lib/features/canvas/reframe.js +228 -0
  77. package/lib/features/canvas/reframe.js.map +1 -0
  78. package/lib/features/canvas/serverTasks.js +697 -0
  79. package/lib/features/canvas/serverTasks.js.map +1 -0
  80. package/lib/features/canvas/set/SetViewportWebView.js +207 -28
  81. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  82. package/lib/features/canvas/set/agent/prompt.js +66 -0
  83. package/lib/features/canvas/set/agent/prompt.js.map +1 -0
  84. package/lib/features/canvas/set/agent/setOps.js +203 -0
  85. package/lib/features/canvas/set/agent/setOps.js.map +1 -0
  86. package/lib/features/canvas/set/agent/setTurn.js +128 -0
  87. package/lib/features/canvas/set/agent/setTurn.js.map +1 -0
  88. package/lib/features/canvas/set/agent/snapshot.js +43 -0
  89. package/lib/features/canvas/set/agent/snapshot.js.map +1 -0
  90. package/lib/features/canvas/set/agent/tools.js +580 -0
  91. package/lib/features/canvas/set/agent/tools.js.map +1 -0
  92. package/lib/features/canvas/set/setProject.js +43 -4
  93. package/lib/features/canvas/set/setProject.js.map +1 -1
  94. package/lib/features/canvas/set/supplyLibrary.js +397 -0
  95. package/lib/features/canvas/set/supplyLibrary.js.map +1 -0
  96. package/lib/features/canvas/storageLibrary.js +113 -52
  97. package/lib/features/canvas/storageLibrary.js.map +1 -1
  98. package/lib/features/canvas/studioCatalog.js +15 -2
  99. package/lib/features/canvas/studioCatalog.js.map +1 -1
  100. package/lib/features/canvas/studioLooks.js +1 -8
  101. package/lib/features/canvas/studioLooks.js.map +1 -1
  102. package/lib/features/canvas/useBoardMediaRefresh.js +66 -0
  103. package/lib/features/canvas/useBoardMediaRefresh.js.map +1 -0
  104. package/lib/features/canvas/useMediaSource.js +84 -0
  105. package/lib/features/canvas/useMediaSource.js.map +1 -0
  106. package/lib/features/canvas/video3d.js +11 -10
  107. package/lib/features/canvas/video3d.js.map +1 -1
  108. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +46 -0
  109. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -0
  110. package/lib/features/canvas/videoEditor/ExportTaskCard.js +134 -0
  111. package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -0
  112. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +45 -7
  113. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  114. package/lib/features/canvas/videoEditor/agent/agentLoop.js +4 -2
  115. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  116. package/lib/features/canvas/videoEditor/agent/attachments.js +304 -0
  117. package/lib/features/canvas/videoEditor/agent/attachments.js.map +1 -0
  118. package/lib/features/canvas/videoEditor/agent/brainClient.js +3 -2
  119. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  120. package/lib/features/canvas/videoEditor/agent/cutTools.js +207 -7
  121. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  122. package/lib/features/canvas/videoEditor/blurBox.js +34 -0
  123. package/lib/features/canvas/videoEditor/blurBox.js.map +1 -0
  124. package/lib/features/canvas/videoEditor/compileTimeline.js +668 -0
  125. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -0
  126. package/lib/features/canvas/videoEditor/editorModel.js +56 -22
  127. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  128. package/lib/features/canvas/videoEditor/exportPipeline.js +77 -0
  129. package/lib/features/canvas/videoEditor/exportPipeline.js.map +1 -0
  130. package/lib/features/canvas/videoEditor/exportRenderer.js +19 -12
  131. package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -1
  132. package/lib/features/canvas/videoEditor/exportTask.js +216 -0
  133. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -0
  134. package/lib/features/canvas/videoEditor/formWidgets.js +142 -0
  135. package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -0
  136. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +195 -0
  137. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -0
  138. package/lib/features/canvas/videoEditor/produce/produceScenes.js +158 -0
  139. package/lib/features/canvas/videoEditor/produce/produceScenes.js.map +1 -0
  140. package/lib/features/canvas/videoEditor/remoteMediaClient.js +17 -5
  141. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  142. package/lib/features/canvas/videoEditor/renderTimeline.js +207 -0
  143. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -0
  144. package/lib/features/canvas/videoEditor/renewLinks.js +64 -0
  145. package/lib/features/canvas/videoEditor/renewLinks.js.map +1 -0
  146. package/lib/features/canvas/videoEditor/sceneLayers.js +101 -0
  147. package/lib/features/canvas/videoEditor/sceneLayers.js.map +1 -0
  148. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +283 -0
  149. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -0
  150. package/lib/features/canvas/videoEditor/tools/catalog.js +576 -0
  151. package/lib/features/canvas/videoEditor/tools/catalog.js.map +1 -0
  152. package/lib/features/canvas/videoEditor/videoProjectsStore.js +27 -3
  153. package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -1
  154. package/lib/features/webbuilder/WebBuilderExperience.js +29 -1
  155. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  156. package/lib/features/webbuilder/buildFragments.js +8 -4
  157. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  158. package/lib/features/webbuilder/codezenHandoff.js +108 -0
  159. package/lib/features/webbuilder/codezenHandoff.js.map +1 -0
  160. package/lib/features/webbuilder/workflow.js.map +1 -1
  161. package/lib/hooks/useChatApi.js +1 -2
  162. package/lib/hooks/useChatApi.js.map +1 -1
  163. package/lib/screens/CanvasBoard/index.js +12 -1
  164. package/lib/screens/CanvasBoard/index.js.map +1 -1
  165. package/lib/screens/Home/HomeScreen.js.map +1 -1
  166. package/lib/screens/Home/components/HomeSuggestions.js +3 -3
  167. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
  168. package/lib/screens/WebBuilder/index.js +4 -2
  169. package/lib/screens/WebBuilder/index.js.map +1 -1
  170. package/lib/screens/WebBuilderNative/index.js +29 -2
  171. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  172. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +30 -6
  173. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  174. package/package.json +3 -3
  175. /package/lib/assets/apps/{paper2poster.webp → poster.webp} +0 -0
@@ -1,4 +1,4 @@
1
- import {DEFAULT_IMAGE_SEC,emptyTimeline}from'./videoEditor/editorModel.js';var __defProp = Object.defineProperty;
1
+ import {solidColorSrc,emptyTimeline,DEFAULT_IMAGE_SEC}from'./videoEditor/editorModel.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -17,13 +17,25 @@ var __spreadValues = (a, b) => {
17
17
  return a;
18
18
  };
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __objRest = (source, exclude) => {
21
+ var target = {};
22
+ for (var prop in source)
23
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
24
+ target[prop] = source[prop];
25
+ if (source != null && __getOwnPropSymbols)
26
+ for (var prop of __getOwnPropSymbols(source)) {
27
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
28
+ target[prop] = source[prop];
29
+ }
30
+ return target;
31
+ };
20
32
  const MICRO = 1e6;
21
33
  function microsToSec(us) {
22
34
  if (typeof us !== "number" || !Number.isFinite(us)) return 0;
23
35
  return Math.max(0, us / MICRO);
24
36
  }
25
37
  function promoProjectToTimeline(project, title) {
26
- var _a, _b, _c, _d, _e;
38
+ var _a, _b, _c, _d, _e, _f, _g;
27
39
  const clipsMap = project.clips && typeof project.clips === "object" ? project.clips : {};
28
40
  const tracks = Array.isArray(project.tracks) ? project.tracks : [];
29
41
  const orderedIds = [];
@@ -44,7 +56,13 @@ function promoProjectToTimeline(project, title) {
44
56
  });
45
57
  const mediaClips = [];
46
58
  const texts = [];
59
+ const nativeId = /* @__PURE__ */ new Map();
47
60
  let counter = 0;
61
+ const pct = (v, fallback) => typeof v === "number" && Number.isFinite(v) ? Math.min(1, Math.max(0, v / 100)) : fallback;
62
+ const transitionOf = (clip) => clip.transitionIn && typeof clip.transitionIn.effect === "string" && Number(clip.transitionIn.durationMs) > 0 ? {
63
+ effect: clip.transitionIn.effect,
64
+ durationMs: Number(clip.transitionIn.durationMs)
65
+ } : null;
48
66
  for (const {
49
67
  clip
50
68
  } of withStart) {
@@ -54,23 +72,56 @@ function promoProjectToTimeline(project, title) {
54
72
  const type = clip.type || "";
55
73
  if (type === "text" && typeof clip.text === "string" && clip.text.trim()) {
56
74
  counter += 1;
57
- texts.push({
75
+ texts.push(__spreadValues({
58
76
  id: `promo-text-${counter}`,
59
77
  text: clip.text.trim(),
60
78
  startSec: from,
61
79
  durationSec: span,
62
- x: 0.5,
63
- y: 0.5
64
- });
80
+ x: pct(clip.x, 0.5),
81
+ y: pct(clip.y, 0.5)
82
+ }, clip.sceneId ? {
83
+ sceneId: clip.sceneId
84
+ } : {}));
85
+ continue;
86
+ }
87
+ if (type === "scene") {
88
+ counter += 1;
89
+ const id = `promo-clip-${counter}`;
90
+ if (clip.id) nativeId.set(clip.id, id);
91
+ const fill = typeof clip.color === "string" && /^#[0-9a-f]{3,8}$/i.test(clip.color) ? clip.color : "#101014";
92
+ mediaClips.push(__spreadValues({
93
+ id,
94
+ itemId: clip.id || `promo-${counter}`,
95
+ type: "image",
96
+ src: solidColorSrc(fill),
97
+ name: (clip.name || "Scene").slice(0, 48),
98
+ durationSec: span,
99
+ trimStartSec: 0,
100
+ trimEndSec: null,
101
+ speed: 1,
102
+ speedCurve: "constant",
103
+ filter: "none",
104
+ transitionIn: transitionOf(clip),
105
+ volume: 1,
106
+ muted: false,
107
+ fillColor: fill
108
+ }, ((_d = clip.shot) == null ? void 0 : _d.trim()) ? {
109
+ shot: clip.shot.trim()
110
+ } : {}));
65
111
  continue;
66
112
  }
67
113
  if ((type === "video" || type === "image") && typeof clip.src === "string" && clip.src) {
68
114
  counter += 1;
69
- const trimFrom = microsToSec((_d = clip.trim) == null ? void 0 : _d.from);
70
- const trimTo = ((_e = clip.trim) == null ? void 0 : _e.to) != null ? microsToSec(clip.trim.to) : null;
71
- mediaClips.push({
115
+ const trimFrom = microsToSec((_e = clip.trim) == null ? void 0 : _e.from);
116
+ const trimTo = ((_f = clip.trim) == null ? void 0 : _f.to) != null ? microsToSec(clip.trim.to) : null;
117
+ if (clip.id) nativeId.set(clip.id, `promo-clip-${counter}`);
118
+ mediaClips.push(__spreadProps(__spreadValues({
72
119
  id: `promo-clip-${counter}`,
73
120
  itemId: clip.id || `promo-${counter}`,
121
+ transitionIn: transitionOf(clip)
122
+ }, ((_g = clip.shot) == null ? void 0 : _g.trim()) ? {
123
+ shot: clip.shot.trim()
124
+ } : {}), {
74
125
  type: type === "image" ? "image" : "video",
75
126
  src: clip.src,
76
127
  name: (clip.name || type).slice(0, 48),
@@ -83,15 +134,31 @@ function promoProjectToTimeline(project, title) {
83
134
  volume: typeof clip.volume === "number" ? clip.volume : 1,
84
135
  muted: Boolean(clip.muted),
85
136
  fillColor: type === "image" && typeof clip.color === "string" ? clip.color : null
86
- });
137
+ }));
87
138
  }
88
139
  }
140
+ const size = project.canvasSize;
141
+ const aspect = size && Number(size.width) > 0 && Number(size.height) > 0 ? `${Number(size.width)}:${Number(size.height)}` : void 0;
89
142
  const logo = project.logo;
90
143
  const logoSrc = typeof (logo == null ? void 0 : logo.src) === "string" && logo.src ? logo.src : null;
91
144
  return {
92
- timeline: __spreadProps(__spreadValues({}, emptyTimeline()), {
93
- clips: mediaClips,
94
- texts
145
+ timeline: __spreadProps(__spreadValues(__spreadProps(__spreadValues({}, emptyTimeline()), {
146
+ clips: mediaClips
147
+ }), aspect ? {
148
+ aspect
149
+ } : {}), {
150
+ // A layer whose scene did not come across turns global (missing sceneId = global).
151
+ texts: texts.map((_h) => {
152
+ var _i = _h, {
153
+ sceneId
154
+ } = _i, t = __objRest(_i, [
155
+ "sceneId"
156
+ ]);
157
+ const mapped = sceneId ? nativeId.get(sceneId) : void 0;
158
+ return mapped ? __spreadProps(__spreadValues({}, t), {
159
+ sceneId: mapped
160
+ }) : t;
161
+ })
95
162
  }),
96
163
  title: (title || "").trim() || "Designed promo",
97
164
  logoSrc
@@ -1 +1 @@
1
- {"version":3,"file":"promoProjectImport.js","sources":["../../../src/features/canvas/promoProjectImport.ts"],"sourcesContent":["/**\n * Convert a web video-editor project (DESIGN_PROJECT result) into the native\n * EditorTimeline. Web uses microseconds + tracks; native uses a flat clip list\n * in seconds — we keep media/text order by display.from.\n */\nimport {\n DEFAULT_IMAGE_SEC,\n emptyTimeline,\n type EditorClip,\n type EditorTimeline,\n type TextClip,\n} from './videoEditor/editorModel';\n\nconst MICRO = 1_000_000;\n\ntype WebClip = {\n id?: string;\n type?: string;\n src?: string;\n text?: string;\n name?: string;\n display?: { from?: number; to?: number };\n trim?: { from?: number; to?: number };\n volume?: number;\n muted?: boolean;\n color?: string;\n};\n\nexport type ImportedPromoProject = {\n timeline: EditorTimeline;\n title: string;\n logoSrc: string | null;\n};\n\nfunction microsToSec(us: number | undefined): number {\n if (typeof us !== 'number' || !Number.isFinite(us)) return 0;\n return Math.max(0, us / MICRO);\n}\n\n/** Best-effort map from web EditorProject JSON → native timeline. */\nexport function promoProjectToTimeline(project: Record<string, unknown>, title?: string): ImportedPromoProject {\n const clipsMap = (project.clips && typeof project.clips === 'object' ? project.clips : {}) as Record<\n string,\n WebClip\n >;\n const tracks = Array.isArray(project.tracks) ? (project.tracks as Array<{ clipIds?: string[] }>) : [];\n const orderedIds: string[] = [];\n for (const track of tracks) {\n for (const id of track.clipIds ?? []) {\n if (typeof id === 'string' && !orderedIds.includes(id)) orderedIds.push(id);\n }\n }\n for (const id of Object.keys(clipsMap)) {\n if (!orderedIds.includes(id)) orderedIds.push(id);\n }\n\n const withStart = orderedIds\n .map((id) => ({ id, clip: clipsMap[id] }))\n .filter((row) => row.clip)\n .sort((a, b) => microsToSec(a.clip.display?.from) - microsToSec(b.clip.display?.from));\n\n const mediaClips: EditorClip[] = [];\n const texts: TextClip[] = [];\n let counter = 0;\n\n for (const { clip } of withStart) {\n const from = microsToSec(clip.display?.from);\n const to = microsToSec(clip.display?.to);\n const span = Math.max(0.1, to > from ? to - from : DEFAULT_IMAGE_SEC);\n const type = clip.type || '';\n\n if (type === 'text' && typeof clip.text === 'string' && clip.text.trim()) {\n counter += 1;\n texts.push({\n id: `promo-text-${counter}`,\n text: clip.text.trim(),\n startSec: from,\n durationSec: span,\n x: 0.5,\n y: 0.5,\n });\n continue;\n }\n\n if ((type === 'video' || type === 'image') && typeof clip.src === 'string' && clip.src) {\n counter += 1;\n const trimFrom = microsToSec(clip.trim?.from);\n const trimTo = clip.trim?.to != null ? microsToSec(clip.trim.to) : null;\n mediaClips.push({\n id: `promo-clip-${counter}`,\n itemId: clip.id || `promo-${counter}`,\n type: type === 'image' ? 'image' : 'video',\n src: clip.src,\n name: (clip.name || type).slice(0, 48),\n durationSec: type === 'image' ? span : null,\n trimStartSec: trimFrom,\n trimEndSec: trimTo && trimTo > trimFrom ? trimTo : null,\n speed: 1,\n speedCurve: 'constant',\n filter: 'none',\n volume: typeof clip.volume === 'number' ? clip.volume : 1,\n muted: Boolean(clip.muted),\n fillColor: type === 'image' && typeof clip.color === 'string' ? clip.color : null,\n });\n }\n }\n\n const logo = project.logo as { src?: string } | null | undefined;\n const logoSrc = typeof logo?.src === 'string' && logo.src ? logo.src : null;\n\n return {\n timeline: {\n ...emptyTimeline(),\n clips: mediaClips,\n texts,\n },\n title: (title || '').trim() || 'Designed promo',\n logoSrc,\n };\n}\n"],"names":["_a","_b"],"mappings":";;;;;;;;;;;;;;;;;;;AAMA,MAAM,KAAQ,GAAA,GAAA;AAwBd,SAAS,YAAY,EAAgC,EAAA;AACnD,EAAI,IAAA,OAAO,OAAO,QAAY,IAAA,CAAC,OAAO,QAAS,CAAA,EAAE,GAAU,OAAA,CAAA;AAC3D,EAAA,OAAO,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,EAAA,GAAK,KAAK,CAAA;AAC/B;AAGgB,SAAA,sBAAA,CAAuB,SAAkC,KAAsC,EAAA;AApC/G,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAqCE,EAAM,MAAA,QAAA,GAAY,QAAQ,KAAS,IAAA,OAAO,QAAQ,KAAU,KAAA,QAAA,GAAW,OAAQ,CAAA,KAAA,GAAQ,EAAC;AACxF,EAAM,MAAA,MAAA,GAAS,MAAM,OAAQ,CAAA,OAAA,CAAQ,MAAM,CAAI,GAAA,OAAA,CAAQ,SAElD,EAAC;AACN,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,SAAS,MAAQ,EAAA;AAC1B,IAAA,KAAA,MAAW,EAAM,IAAA,CAAA,EAAA,GAAA,KAAA,CAAM,OAAN,KAAA,IAAA,GAAA,EAAA,GAAiB,EAAI,EAAA;AACpC,MAAI,IAAA,OAAO,EAAO,KAAA,QAAA,IAAY,CAAC,UAAA,CAAW,SAAS,EAAE,CAAA,EAAc,UAAA,CAAA,IAAA,CAAK,EAAE,CAAA;AAAA;AAC5E;AAEF,EAAA,KAAA,MAAW,EAAM,IAAA,MAAA,CAAO,IAAK,CAAA,QAAQ,CAAG,EAAA;AACtC,IAAA,IAAI,CAAC,UAAW,CAAA,QAAA,CAAS,EAAE,CAAG,EAAA,UAAA,CAAW,KAAK,EAAE,CAAA;AAAA;AAElD,EAAM,MAAA,SAAA,GAAY,UAAW,CAAA,GAAA,CAAI,CAAO,EAAA,MAAA;AAAA,IACtC,EAAA;AAAA,IACA,IAAA,EAAM,SAAS,EAAE;AAAA,GACnB,CAAE,CAAE,CAAA,MAAA,CAAO,CAAO,GAAA,KAAA,GAAA,CAAI,IAAI,CAAE,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAG,KAAA;AArD1C,IAAA,IAAAA,GAAAC,EAAAA,GAAAA;AAqD6C,IAAA,OAAA,WAAA,CAAA,CAAYD,GAAA,GAAA,CAAA,CAAE,IAAK,CAAA,OAAA,KAAP,gBAAAA,GAAgB,CAAA,IAAI,CAAI,GAAA,WAAA,CAAA,CAAYC,MAAA,CAAE,CAAA,IAAA,CAAK,OAAP,KAAA,IAAA,GAAA,MAAA,GAAAA,IAAgB,IAAI,CAAA;AAAA,GAAC,CAAA;AAChH,EAAA,MAAM,aAA2B,EAAC;AAClC,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,IAAI,OAAU,GAAA,CAAA;AACd,EAAW,KAAA,MAAA;AAAA,IACT;AAAA,OACG,SAAW,EAAA;AACd,IAAA,MAAM,IAAO,GAAA,WAAA,CAAA,CAAY,EAAK,GAAA,IAAA,CAAA,OAAA,KAAL,mBAAc,IAAI,CAAA;AAC3C,IAAA,MAAM,EAAK,GAAA,WAAA,CAAA,CAAY,EAAK,GAAA,IAAA,CAAA,OAAA,KAAL,mBAAc,EAAE,CAAA;AACvC,IAAM,MAAA,IAAA,GAAO,KAAK,GAAI,CAAA,GAAA,EAAK,KAAK,IAAO,GAAA,EAAA,GAAK,OAAO,iBAAiB,CAAA;AACpE,IAAM,MAAA,IAAA,GAAO,KAAK,IAAQ,IAAA,EAAA;AAC1B,IAAI,IAAA,IAAA,KAAS,UAAU,OAAO,IAAA,CAAK,SAAS,QAAY,IAAA,IAAA,CAAK,IAAK,CAAA,IAAA,EAAQ,EAAA;AACxE,MAAW,OAAA,IAAA,CAAA;AACX,MAAA,KAAA,CAAM,IAAK,CAAA;AAAA,QACT,EAAA,EAAI,cAAc,OAAO,CAAA,CAAA;AAAA,QACzB,IAAA,EAAM,IAAK,CAAA,IAAA,CAAK,IAAK,EAAA;AAAA,QACrB,QAAU,EAAA,IAAA;AAAA,QACV,WAAa,EAAA,IAAA;AAAA,QACb,CAAG,EAAA,GAAA;AAAA,QACH,CAAG,EAAA;AAAA,OACJ,CAAA;AACD,MAAA;AAAA;AAEF,IAAK,IAAA,CAAA,IAAA,KAAS,WAAW,IAAS,KAAA,OAAA,KAAY,OAAO,IAAK,CAAA,GAAA,KAAQ,QAAY,IAAA,IAAA,CAAK,GAAK,EAAA;AACtF,MAAW,OAAA,IAAA,CAAA;AACX,MAAA,MAAM,QAAW,GAAA,WAAA,CAAA,CAAY,EAAK,GAAA,IAAA,CAAA,IAAA,KAAL,mBAAW,IAAI,CAAA;AAC5C,MAAM,MAAA,MAAA,GAAA,CAAA,CAAS,EAAK,GAAA,IAAA,CAAA,IAAA,KAAL,IAAW,GAAA,MAAA,GAAA,EAAA,CAAA,EAAA,KAAM,OAAO,WAAY,CAAA,IAAA,CAAK,IAAK,CAAA,EAAE,CAAI,GAAA,IAAA;AACnE,MAAA,UAAA,CAAW,IAAK,CAAA;AAAA,QACd,EAAA,EAAI,cAAc,OAAO,CAAA,CAAA;AAAA,QACzB,MAAQ,EAAA,IAAA,CAAK,EAAM,IAAA,CAAA,MAAA,EAAS,OAAO,CAAA,CAAA;AAAA,QACnC,IAAA,EAAM,IAAS,KAAA,OAAA,GAAU,OAAU,GAAA,OAAA;AAAA,QACnC,KAAK,IAAK,CAAA,GAAA;AAAA,QACV,OAAO,IAAK,CAAA,IAAA,IAAQ,IAAM,EAAA,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,QACrC,WAAA,EAAa,IAAS,KAAA,OAAA,GAAU,IAAO,GAAA,IAAA;AAAA,QACvC,YAAc,EAAA,QAAA;AAAA,QACd,UAAY,EAAA,MAAA,IAAU,MAAS,GAAA,QAAA,GAAW,MAAS,GAAA,IAAA;AAAA,QACnD,KAAO,EAAA,CAAA;AAAA,QACP,UAAY,EAAA,UAAA;AAAA,QACZ,MAAQ,EAAA,MAAA;AAAA,QACR,QAAQ,OAAO,IAAA,CAAK,MAAW,KAAA,QAAA,GAAW,KAAK,MAAS,GAAA,CAAA;AAAA,QACxD,KAAA,EAAO,OAAQ,CAAA,IAAA,CAAK,KAAK,CAAA;AAAA,QACzB,SAAA,EAAW,SAAS,OAAW,IAAA,OAAO,KAAK,KAAU,KAAA,QAAA,GAAW,KAAK,KAAQ,GAAA;AAAA,OAC9E,CAAA;AAAA;AACH;AAEF,EAAA,MAAM,OAAO,OAAQ,CAAA,IAAA;AAGrB,EAAM,MAAA,OAAA,GAAU,QAAO,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,GAAA,CAAA,KAAQ,YAAY,IAAK,CAAA,GAAA,GAAM,KAAK,GAAM,GAAA,IAAA;AACvE,EAAO,OAAA;AAAA,IACL,QAAA,EAAU,aACL,CAAA,cAAA,CAAA,EAAA,EAAA,aAAA,EADK,CAAA,EAAA;AAAA,MAER,KAAO,EAAA,UAAA;AAAA,MACP;AAAA,KACF,CAAA;AAAA,IACA,KAAQ,EAAA,CAAA,KAAA,IAAS,EAAI,EAAA,IAAA,EAAU,IAAA,gBAAA;AAAA,IAC/B;AAAA,GACF;AACF"}
1
+ {"version":3,"file":"promoProjectImport.js","sources":["../../../src/features/canvas/promoProjectImport.ts"],"sourcesContent":["/**\n * Convert a web video-editor project (DESIGN_PROJECT result) into the native\n * EditorTimeline. Web uses microseconds + tracks; native uses a flat clip list\n * in seconds — we keep media/text order by display.from.\n */\nimport {\n DEFAULT_IMAGE_SEC,\n emptyTimeline,\n solidColorSrc,\n type EditorClip,\n type EditorTimeline,\n type TextClip,\n} from './videoEditor/editorModel';\n\nconst MICRO = 1_000_000;\n\ntype WebClip = {\n id?: string;\n type?: string;\n src?: string;\n text?: string;\n name?: string;\n display?: { from?: number; to?: number };\n trim?: { from?: number; to?: number };\n volume?: number;\n muted?: boolean;\n color?: string;\n /** Web scene-scoped layer: the id of the scene clip it belongs to. */\n sceneId?: string;\n /** On a designed scene: what to film for it (Produce video). */\n shot?: string;\n transitionIn?: { effect?: string; durationMs?: number } | null;\n /** Web text position, % of the canvas. */\n x?: number;\n y?: number;\n};\n\nexport type ImportedPromoProject = {\n timeline: EditorTimeline;\n title: string;\n logoSrc: string | null;\n};\n\nfunction microsToSec(us: number | undefined): number {\n if (typeof us !== 'number' || !Number.isFinite(us)) return 0;\n return Math.max(0, us / MICRO);\n}\n\n/** Best-effort map from web EditorProject JSON → native timeline. */\nexport function promoProjectToTimeline(project: Record<string, unknown>, title?: string): ImportedPromoProject {\n const clipsMap = (project.clips && typeof project.clips === 'object' ? project.clips : {}) as Record<\n string,\n WebClip\n >;\n const tracks = Array.isArray(project.tracks) ? (project.tracks as Array<{ clipIds?: string[] }>) : [];\n const orderedIds: string[] = [];\n for (const track of tracks) {\n for (const id of track.clipIds ?? []) {\n if (typeof id === 'string' && !orderedIds.includes(id)) orderedIds.push(id);\n }\n }\n for (const id of Object.keys(clipsMap)) {\n if (!orderedIds.includes(id)) orderedIds.push(id);\n }\n\n const withStart = orderedIds\n .map((id) => ({ id, clip: clipsMap[id] }))\n .filter((row) => row.clip)\n .sort((a, b) => microsToSec(a.clip.display?.from) - microsToSec(b.clip.display?.from));\n\n const mediaClips: EditorClip[] = [];\n const texts: TextClip[] = [];\n /** web scene/clip id -> native clip id, so stamped layers keep their scene. */\n const nativeId = new Map<string, string>();\n let counter = 0;\n const pct = (v: number | undefined, fallback: number) =>\n typeof v === 'number' && Number.isFinite(v) ? Math.min(1, Math.max(0, v / 100)) : fallback;\n const transitionOf = (clip: WebClip) =>\n clip.transitionIn && typeof clip.transitionIn.effect === 'string' && Number(clip.transitionIn.durationMs) > 0\n ? { effect: clip.transitionIn.effect, durationMs: Number(clip.transitionIn.durationMs) }\n : null;\n\n for (const { clip } of withStart) {\n const from = microsToSec(clip.display?.from);\n const to = microsToSec(clip.display?.to);\n const span = Math.max(0.1, to > from ? to - from : DEFAULT_IMAGE_SEC);\n const type = clip.type || '';\n\n if (type === 'text' && typeof clip.text === 'string' && clip.text.trim()) {\n counter += 1;\n texts.push({\n id: `promo-text-${counter}`,\n text: clip.text.trim(),\n startSec: from,\n durationSec: span,\n x: pct(clip.x, 0.5),\n y: pct(clip.y, 0.5),\n ...(clip.sceneId ? { sceneId: clip.sceneId } : {}),\n });\n continue;\n }\n\n if (type === 'scene') {\n // A designed scene: its flat colour now, footage once Produce films its shot.\n counter += 1;\n const id = `promo-clip-${counter}`;\n if (clip.id) nativeId.set(clip.id, id);\n const fill =\n typeof clip.color === 'string' && /^#[0-9a-f]{3,8}$/i.test(clip.color) ? clip.color : '#101014';\n mediaClips.push({\n id,\n itemId: clip.id || `promo-${counter}`,\n type: 'image',\n src: solidColorSrc(fill),\n name: (clip.name || 'Scene').slice(0, 48),\n durationSec: span,\n trimStartSec: 0,\n trimEndSec: null,\n speed: 1,\n speedCurve: 'constant',\n filter: 'none',\n transitionIn: transitionOf(clip),\n volume: 1,\n muted: false,\n fillColor: fill,\n ...(clip.shot?.trim() ? { shot: clip.shot.trim() } : {}),\n });\n continue;\n }\n\n if ((type === 'video' || type === 'image') && typeof clip.src === 'string' && clip.src) {\n counter += 1;\n const trimFrom = microsToSec(clip.trim?.from);\n const trimTo = clip.trim?.to != null ? microsToSec(clip.trim.to) : null;\n if (clip.id) nativeId.set(clip.id, `promo-clip-${counter}`);\n mediaClips.push({\n id: `promo-clip-${counter}`,\n itemId: clip.id || `promo-${counter}`,\n transitionIn: transitionOf(clip),\n ...(clip.shot?.trim() ? { shot: clip.shot.trim() } : {}),\n type: type === 'image' ? 'image' : 'video',\n src: clip.src,\n name: (clip.name || type).slice(0, 48),\n durationSec: type === 'image' ? span : null,\n trimStartSec: trimFrom,\n trimEndSec: trimTo && trimTo > trimFrom ? trimTo : null,\n speed: 1,\n speedCurve: 'constant',\n filter: 'none',\n volume: typeof clip.volume === 'number' ? clip.volume : 1,\n muted: Boolean(clip.muted),\n fillColor: type === 'image' && typeof clip.color === 'string' ? clip.color : null,\n });\n }\n }\n\n const size = project.canvasSize as { width?: number; height?: number } | undefined;\n const aspect =\n size && Number(size.width) > 0 && Number(size.height) > 0\n ? `${Number(size.width)}:${Number(size.height)}`\n : undefined;\n\n const logo = project.logo as { src?: string } | null | undefined;\n const logoSrc = typeof logo?.src === 'string' && logo.src ? logo.src : null;\n\n return {\n timeline: {\n ...emptyTimeline(),\n clips: mediaClips,\n ...(aspect ? { aspect } : {}),\n // A layer whose scene did not come across turns global (missing sceneId = global).\n texts: texts.map(({ sceneId, ...t }) => {\n const mapped = sceneId ? nativeId.get(sceneId) : undefined;\n return mapped ? { ...t, sceneId: mapped } : t;\n }),\n },\n title: (title || '').trim() || 'Designed promo',\n logoSrc,\n };\n}\n"],"names":["_a","_b"],"mappings":"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"}
@@ -33,42 +33,99 @@ const PROMO_CONNECTOR = "yantra-video-generation";
33
33
  const PRODUCE_SUBMIT_ACTION = "YANTRA_VIDEO_GENERATION_PRODUCE_SUBMIT";
34
34
  const PRODUCE_STATUS_ACTION = "YANTRA_VIDEO_GENERATION_PRODUCE_STATUS";
35
35
  const DESIGN_PROJECT_ACTION = "YANTRA_VIDEO_GENERATION_DESIGN_PROJECT";
36
+ const PROMO_QUALITIES = [{
37
+ id: "standard",
38
+ name: "Standard",
39
+ description: "One pass: a finished cut in about half an hour."
40
+ }, {
41
+ id: "studio",
42
+ name: "Studio",
43
+ description: "Directed like a film: three concepts written and judged, characters and narrator cast, keyframes first, the top video models tested on the hardest shots. Takes longer and uses more credits."
44
+ }];
45
+ const PROMO_NARRATORS = [{
46
+ id: "",
47
+ name: "Cast for the script"
48
+ }, {
49
+ id: "deadpan-documentary",
50
+ name: "Deadpan documentary, male"
51
+ }, {
52
+ id: "warm-storyteller-male",
53
+ name: "Warm storyteller, male"
54
+ }, {
55
+ id: "warm-storyteller-female",
56
+ name: "Warm storyteller, female"
57
+ }, {
58
+ id: "confident-announcer-male",
59
+ name: "Confident announcer, male"
60
+ }, {
61
+ id: "confident-announcer-female",
62
+ name: "Confident announcer, female"
63
+ }, {
64
+ id: "friendly-conversational",
65
+ name: "Friendly, conversational"
66
+ }, {
67
+ id: "calm-expert",
68
+ name: "Calm expert"
69
+ }];
70
+ const PROMO_DESIGN_MODELS = [{
71
+ id: "",
72
+ name: "Default",
73
+ description: "The connector\u2019s own design model."
74
+ }, {
75
+ id: "claude-opus-5-5",
76
+ name: "Claude Opus 5.5",
77
+ description: "Most capable, for long and complex work."
78
+ }];
36
79
  const PROMO_PRESETS = [{
80
+ id: "launch-film",
81
+ name: "Launch film",
82
+ description: "Story-led launch film: a cold open with a laugh, the reveal, then the product doing real jobs.",
83
+ defaultDurationSeconds: 90,
84
+ needsSourceVideo: false,
85
+ defaultQuality: "studio",
86
+ produceOnly: true
87
+ }, {
37
88
  id: "product-teaser",
38
89
  name: "Product teaser",
39
90
  description: "Cinematic launch teaser: hero shots, a reveal, one closing line.",
40
91
  defaultDurationSeconds: 30,
41
- needsSourceVideo: false
92
+ needsSourceVideo: false,
93
+ defaultQuality: "standard"
42
94
  }, {
43
95
  id: "brand-film",
44
96
  name: "Brand film",
45
97
  description: "Mood-led brand piece: story, atmosphere, music-first.",
46
98
  defaultDurationSeconds: 60,
47
- needsSourceVideo: false
99
+ needsSourceVideo: false,
100
+ defaultQuality: "standard"
48
101
  }, {
49
102
  id: "motion-promo",
50
103
  name: "Motion promo",
51
104
  description: "Kinetic type and motion graphics for a feature, offer or launch.",
52
105
  defaultDurationSeconds: 30,
53
- needsSourceVideo: false
106
+ needsSourceVideo: false,
107
+ defaultQuality: "standard"
54
108
  }, {
55
109
  id: "explainer",
56
110
  name: "Explainer",
57
111
  description: "Narrated explainer with captions: what, why, how.",
58
112
  defaultDurationSeconds: 60,
59
- needsSourceVideo: false
113
+ needsSourceVideo: false,
114
+ defaultQuality: "standard"
60
115
  }, {
61
116
  id: "social-hook",
62
117
  name: "Social hook",
63
118
  description: "Vertical scroll-stopper: instant hook, big captions, one message.",
64
119
  defaultDurationSeconds: 15,
65
- needsSourceVideo: false
120
+ needsSourceVideo: false,
121
+ defaultQuality: "standard"
66
122
  }, {
67
123
  id: "footage-remix",
68
124
  name: "Remix footage",
69
125
  description: "Cut a video already on the canvas into a promo with graphics and music.",
70
126
  defaultDurationSeconds: 30,
71
- needsSourceVideo: true
127
+ needsSourceVideo: true,
128
+ defaultQuality: "standard"
72
129
  }];
73
130
  const PROMO_PLAYBOOKS = [{
74
131
  id: "",
@@ -97,9 +154,25 @@ const PROMO_DURATIONS = [15, 30, 45, 60, 90];
97
154
  const PROMO_ASPECT_RATIOS = ["16:9", "9:16", "1:1"];
98
155
  const PROMO_POLL_EVERY_MS = 2e4;
99
156
  const PROMO_POLL_MAX_MS = 75 * 6e4;
157
+ const PROMO_STUDIO_POLL_MAX_MS = 120 * 6e4;
158
+ const PROMO_RUN_TIMEOUT_MS = 55 * 6e4;
159
+ const PROMO_STUDIO_RUN_TIMEOUT_MS = 100 * 6e4;
100
160
  function lookupPromoPreset(id) {
101
161
  var _a;
102
- return (_a = PROMO_PRESETS.find((p) => p.id === id)) != null ? _a : PROMO_PRESETS[0];
162
+ return (_a = PROMO_PRESETS.find((p) => p.id === id)) != null ? _a : PROMO_PRESETS.find((p) => p.id === DEFAULT_PROMO_PRESET);
163
+ }
164
+ function defaultPromoQuality(presetId) {
165
+ return lookupPromoPreset(presetId).defaultQuality;
166
+ }
167
+ function promoQualityOf(opts) {
168
+ var _a;
169
+ return (_a = opts.quality) != null ? _a : defaultPromoQuality(opts.preset);
170
+ }
171
+ function promoRunTimeoutMs(opts) {
172
+ return promoQualityOf(opts) === "studio" ? PROMO_STUDIO_RUN_TIMEOUT_MS : PROMO_RUN_TIMEOUT_MS;
173
+ }
174
+ function promoPollMaxMs(opts) {
175
+ return promoQualityOf(opts) === "studio" ? PROMO_STUDIO_POLL_MAX_MS : PROMO_POLL_MAX_MS;
103
176
  }
104
177
  const EMPTY_PROMO_CONTEXT = {
105
178
  onScreenText: "",
@@ -124,9 +197,9 @@ function readBrandColors(raw) {
124
197
  return out.slice(0, 6);
125
198
  }
126
199
  function buildPromoRunParams(opts) {
127
- var _a, _b, _c, _d, _e, _f, _g;
200
+ var _a, _b, _c, _d, _e, _f, _g, _h;
128
201
  const referenceImageUrls = ((_a = opts.referenceImageUrls) != null ? _a : []).filter((u) => /^https?:\/\//i.test(u));
129
- return __spreadProps(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
202
+ return __spreadProps(__spreadValues(__spreadValues(__spreadProps(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
130
203
  prompt: opts.prompt,
131
204
  preset: opts.preset,
132
205
  durationSeconds: opts.durationSeconds,
@@ -160,7 +233,14 @@ function buildPromoRunParams(opts) {
160
233
  } : {}), opts.stylePlaybook ? {
161
234
  stylePlaybook: opts.stylePlaybook
162
235
  } : {}), {
163
- timeoutMs: 55 * 6e4
236
+ // Always sent: the timeout below has to agree with whichever quality runs.
237
+ quality: promoQualityOf(opts)
238
+ }), opts.narratorVoice ? {
239
+ narratorVoice: opts.narratorVoice
240
+ } : {}), ((_h = opts.useCases) == null ? void 0 : _h.trim()) ? {
241
+ useCases: opts.useCases
242
+ } : {}), {
243
+ timeoutMs: promoRunTimeoutMs(opts)
164
244
  });
165
245
  }
166
246
  function parsePromoRunResult(result) {
@@ -226,7 +306,7 @@ async function producePromoVideo(run, opts, onProgress, sleep = (ms) => new Prom
226
306
  const submit = await run(PRODUCE_SUBMIT_ACTION, buildPromoRunParams(opts));
227
307
  const handle = parseSubmitResult(submit);
228
308
  if (!handle) throw new Error("Could not start the production (no handle returned)");
229
- const deadline = Date.now() + PROMO_POLL_MAX_MS;
309
+ const deadline = Date.now() + promoPollMaxMs(opts);
230
310
  let lastProgress = "";
231
311
  let pollErrors = 0;
232
312
  while (Date.now() < deadline) {
@@ -259,15 +339,26 @@ function buildDesignParams(opts) {
259
339
  const _a = opts, {
260
340
  captions: _c,
261
341
  narration: _n,
262
- stylePlaybook: _p
342
+ stylePlaybook: _p,
343
+ quality: _q,
344
+ narratorVoice: _v,
345
+ useCases: _u,
346
+ model
263
347
  } = _a, rest = __objRest(_a, [
264
348
  "captions",
265
349
  "narration",
266
- "stylePlaybook"
350
+ "stylePlaybook",
351
+ "quality",
352
+ "narratorVoice",
353
+ "useCases",
354
+ "model"
267
355
  ]);
268
356
  const base = buildPromoRunParams(rest);
269
357
  delete base.timeoutMs;
270
- return __spreadValues(__spreadValues(__spreadValues({}, base), opts.sourceVideoSeconds && opts.sourceVideoSeconds > 0 ? {
358
+ delete base.quality;
359
+ return __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, base), (model == null ? void 0 : model.trim()) ? {
360
+ model: model.trim()
361
+ } : {}), opts.sourceVideoSeconds && opts.sourceVideoSeconds > 0 ? {
271
362
  sourceVideoSeconds: opts.sourceVideoSeconds
272
363
  } : {}), opts.musicUrl && /^https?:\/\//i.test(opts.musicUrl) ? {
273
364
  musicUrl: opts.musicUrl
@@ -309,4 +400,4 @@ async function designPromoProject(run, opts) {
309
400
  const designed = parseDesignResult(raw);
310
401
  if (!designed) throw new Error("Could not design the video (no project returned)");
311
402
  return designed;
312
- }export{DEFAULT_PROMO_PRESET,DESIGN_PROJECT_ACTION,EMPTY_PROMO_CONTEXT,PRODUCE_STATUS_ACTION,PRODUCE_SUBMIT_ACTION,PROMO_ASPECT_RATIOS,PROMO_CONNECTOR,PROMO_DURATIONS,PROMO_PLAYBOOKS,PROMO_POLL_EVERY_MS,PROMO_POLL_MAX_MS,PROMO_PRESETS,buildDesignParams,buildPromoRunParams,defaultNarration,designPromoProject,hasPromoContext,lookupPromoPreset,parseDesignResult,parsePollResult,parsePromoRunResult,parseSubmitResult,producePromoVideo,readBrandColors};//# sourceMappingURL=promoVideo.js.map
403
+ }export{DEFAULT_PROMO_PRESET,DESIGN_PROJECT_ACTION,EMPTY_PROMO_CONTEXT,PRODUCE_STATUS_ACTION,PRODUCE_SUBMIT_ACTION,PROMO_ASPECT_RATIOS,PROMO_CONNECTOR,PROMO_DESIGN_MODELS,PROMO_DURATIONS,PROMO_NARRATORS,PROMO_PLAYBOOKS,PROMO_POLL_EVERY_MS,PROMO_POLL_MAX_MS,PROMO_PRESETS,PROMO_QUALITIES,PROMO_RUN_TIMEOUT_MS,PROMO_STUDIO_POLL_MAX_MS,PROMO_STUDIO_RUN_TIMEOUT_MS,buildDesignParams,buildPromoRunParams,defaultNarration,defaultPromoQuality,designPromoProject,hasPromoContext,lookupPromoPreset,parseDesignResult,parsePollResult,parsePromoRunResult,parseSubmitResult,producePromoVideo,promoPollMaxMs,promoQualityOf,promoRunTimeoutMs,readBrandColors};//# sourceMappingURL=promoVideo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"promoVideo.js","sources":["../../../src/features/canvas/promoVideo.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `rpc/promoVideoRpc` — catalog + submit/poll\n * envelope. Transport stays `RunMediaAction` (host or remote exec).\n */\n\nexport const PROMO_CONNECTOR = 'yantra-video-generation';\nexport const PRODUCE_SUBMIT_ACTION = 'YANTRA_VIDEO_GENERATION_PRODUCE_SUBMIT';\nexport const PRODUCE_STATUS_ACTION = 'YANTRA_VIDEO_GENERATION_PRODUCE_STATUS';\n/** Design lane: brief → editable studio project (no render). */\nexport const DESIGN_PROJECT_ACTION = 'YANTRA_VIDEO_GENERATION_DESIGN_PROJECT';\nexport const DESIGN_TIMEOUT_MS = 4 * 60_000;\n\nexport interface PromoPreset {\n id: string;\n name: string;\n description: string;\n defaultDurationSeconds: number;\n needsSourceVideo: boolean;\n}\n\nexport const PROMO_PRESETS: readonly PromoPreset[] = [\n {\n id: 'product-teaser',\n name: 'Product teaser',\n description: 'Cinematic launch teaser: hero shots, a reveal, one closing line.',\n defaultDurationSeconds: 30,\n needsSourceVideo: false,\n },\n {\n id: 'brand-film',\n name: 'Brand film',\n description: 'Mood-led brand piece: story, atmosphere, music-first.',\n defaultDurationSeconds: 60,\n needsSourceVideo: false,\n },\n {\n id: 'motion-promo',\n name: 'Motion promo',\n description: 'Kinetic type and motion graphics for a feature, offer or launch.',\n defaultDurationSeconds: 30,\n needsSourceVideo: false,\n },\n {\n id: 'explainer',\n name: 'Explainer',\n description: 'Narrated explainer with captions: what, why, how.',\n defaultDurationSeconds: 60,\n needsSourceVideo: false,\n },\n {\n id: 'social-hook',\n name: 'Social hook',\n description: 'Vertical scroll-stopper: instant hook, big captions, one message.',\n defaultDurationSeconds: 15,\n needsSourceVideo: false,\n },\n {\n id: 'footage-remix',\n name: 'Remix footage',\n description: 'Cut a video already on the canvas into a promo with graphics and music.',\n defaultDurationSeconds: 30,\n needsSourceVideo: true,\n },\n];\n\nexport const PROMO_PLAYBOOKS: readonly { id: string; name: string }[] = [\n { id: '', name: 'Preset default' },\n { id: 'premium-minimalist', name: 'Premium minimalist' },\n { id: 'clean-professional', name: 'Clean professional' },\n { id: 'flat-motion-graphics', name: 'Flat motion graphics' },\n { id: 'minimalist-diagram', name: 'Minimalist diagram' },\n { id: 'anime-ghibli', name: 'Anime / Ghibli' },\n];\n\nexport function defaultNarration(presetId: string): boolean {\n return presetId !== 'brand-film' && presetId !== 'social-hook';\n}\n\nexport const DEFAULT_PROMO_PRESET = 'product-teaser';\nexport const PROMO_DURATIONS = [15, 30, 45, 60, 90] as const;\nexport const PROMO_ASPECT_RATIOS = ['16:9', '9:16', '1:1'] as const;\nexport const PROMO_POLL_EVERY_MS = 20_000;\nexport const PROMO_POLL_MAX_MS = 75 * 60_000;\n\nexport function lookupPromoPreset(id: string): PromoPreset {\n return PROMO_PRESETS.find((p) => p.id === id) ?? PROMO_PRESETS[0];\n}\n\nexport interface PromoContext {\n onScreenText: string;\n keyPoints: string;\n audience: string;\n tone: string;\n avoid: string;\n brandColors: string;\n}\n\nexport const EMPTY_PROMO_CONTEXT: PromoContext = {\n onScreenText: '',\n keyPoints: '',\n audience: '',\n tone: '',\n avoid: '',\n brandColors: '',\n};\n\nexport function hasPromoContext(value: PromoContext, logoUrl?: string | null): boolean {\n return Boolean(logoUrl) || Object.values(value).some((v) => v.trim().length > 0);\n}\n\n/** Hexes in a colours field — mirrors the connector parser. */\nexport function readBrandColors(raw: string): string[] {\n const out: string[] = [];\n for (const token of raw.split(/[\\s,]+/)) {\n const m = token.trim().match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);\n if (!m) continue;\n const h =\n m[1].length === 3\n ? m[1]\n .split('')\n .map((c) => c + c)\n .join('')\n : m[1];\n const hex = `#${h.toLowerCase()}`;\n if (!out.includes(hex)) out.push(hex);\n }\n return out.slice(0, 6);\n}\n\nexport interface PromoRunOptions {\n prompt: string;\n preset: string;\n durationSeconds: number;\n aspectRatio: string;\n referenceImageUrls?: string[];\n sourceVideoUrl?: string;\n brandName?: string;\n callToAction?: string;\n logoUrl?: string;\n onScreenText?: string;\n keyPoints?: string;\n audience?: string;\n tone?: string;\n avoid?: string;\n brandColors?: string;\n captions?: boolean;\n narration?: boolean;\n stylePlaybook?: string;\n}\n\nexport interface PromoRunResult {\n url: string;\n title: string;\n projectId: string;\n preset: string;\n pipeline: string;\n durationSeconds?: number;\n summary?: string;\n}\n\nexport function buildPromoRunParams(opts: PromoRunOptions): Record<string, unknown> {\n const referenceImageUrls = (opts.referenceImageUrls ?? []).filter((u) => /^https?:\\/\\//i.test(u));\n return {\n prompt: opts.prompt,\n preset: opts.preset,\n durationSeconds: opts.durationSeconds,\n aspectRatio: opts.aspectRatio,\n ...(referenceImageUrls.length ? { referenceImageUrls } : {}),\n ...(opts.sourceVideoUrl ? { sourceVideoUrl: opts.sourceVideoUrl } : {}),\n ...(opts.brandName ? { brandName: opts.brandName } : {}),\n ...(opts.callToAction ? { callToAction: opts.callToAction } : {}),\n ...(opts.logoUrl ? { logoUrl: opts.logoUrl } : {}),\n ...(opts.onScreenText?.trim() ? { onScreenText: opts.onScreenText } : {}),\n ...(opts.keyPoints?.trim() ? { keyPoints: opts.keyPoints } : {}),\n ...(opts.audience?.trim() ? { audience: opts.audience.trim() } : {}),\n ...(opts.tone?.trim() ? { tone: opts.tone.trim() } : {}),\n ...(opts.avoid?.trim() ? { avoid: opts.avoid.trim() } : {}),\n ...(opts.brandColors?.trim() ? { brandColors: opts.brandColors } : {}),\n ...(typeof opts.captions === 'boolean' ? { captions: opts.captions } : {}),\n ...(typeof opts.narration === 'boolean' ? { narration: opts.narration } : {}),\n ...(opts.stylePlaybook ? { stylePlaybook: opts.stylePlaybook } : {}),\n timeoutMs: 55 * 60_000,\n };\n}\n\nexport function parsePromoRunResult(result: Record<string, unknown>): PromoRunResult | null {\n const data = (result.data ?? result) as Record<string, unknown>;\n const samples = data.samples as Array<{ uri?: string }> | undefined;\n const url = (typeof data.videoUri === 'string' && data.videoUri) || samples?.find((s) => s?.uri)?.uri || '';\n if (!url) return null;\n const prod = (data.production ?? {}) as Record<string, unknown>;\n const s = (k: string) => (typeof prod[k] === 'string' ? (prod[k] as string) : undefined);\n const n = (k: string) => (typeof prod[k] === 'number' ? (prod[k] as number) : undefined);\n return {\n url,\n title: s('title') ?? 'Marketing video',\n projectId: s('projectId') ?? (typeof data.operationName === 'string' ? data.operationName : ''),\n preset: s('preset') ?? '',\n pipeline: s('pipeline') ?? '',\n durationSeconds: n('durationSeconds'),\n summary: s('summary'),\n };\n}\n\nexport interface PromoSubmitHandle {\n projectId: string;\n sandboxId: string;\n}\n\nexport function parseSubmitResult(result: Record<string, unknown>): PromoSubmitHandle | null {\n const d = (result.data ?? result) as Record<string, unknown>;\n const projectId = typeof d.projectId === 'string' ? d.projectId : '';\n const sandboxId = typeof d.sandboxId === 'string' ? d.sandboxId : '';\n return projectId && sandboxId ? { projectId, sandboxId } : null;\n}\n\nexport type PromoPollState = 'running' | 'succeeded' | 'failed';\n\nexport interface PromoPoll {\n state: PromoPollState;\n progress: string[];\n error?: string;\n result?: PromoRunResult;\n}\n\nexport function parsePollResult(result: Record<string, unknown>): PromoPoll {\n const d = (result.data ?? result) as Record<string, unknown>;\n const state: PromoPollState = d.state === 'succeeded' || d.state === 'failed' ? d.state : 'running';\n const progress = Array.isArray(d.progress) ? (d.progress.filter((x) => typeof x === 'string') as string[]) : [];\n if (state === 'succeeded') {\n const run = parsePromoRunResult(d);\n return run\n ? { state, progress, result: run }\n : { state: 'failed', progress, error: 'Production finished but returned no video' };\n }\n if (state === 'failed') {\n return { state, progress, error: typeof d.error === 'string' ? d.error : 'Marketing video production failed' };\n }\n return { state, progress };\n}\n\nexport async function producePromoVideo(\n run: (action: string, params: Record<string, unknown>) => Promise<Record<string, unknown>>,\n opts: PromoRunOptions,\n onProgress?: (msg: string) => void,\n sleep: (ms: number) => Promise<void> = (ms) => new Promise((r) => setTimeout(r, ms)),\n isCancelled?: () => boolean,\n): Promise<PromoRunResult> {\n onProgress?.('Starting the production…');\n const submit = await run(PRODUCE_SUBMIT_ACTION, buildPromoRunParams(opts));\n const handle = parseSubmitResult(submit);\n if (!handle) throw new Error('Could not start the production (no handle returned)');\n\n const deadline = Date.now() + PROMO_POLL_MAX_MS;\n let lastProgress = '';\n let pollErrors = 0;\n while (Date.now() < deadline) {\n if (isCancelled?.()) throw new Error('cancelled');\n await sleep(PROMO_POLL_EVERY_MS);\n if (isCancelled?.()) throw new Error('cancelled');\n let poll: PromoPoll;\n try {\n const raw = await run(PRODUCE_STATUS_ACTION, {\n projectId: handle.projectId,\n sandboxId: handle.sandboxId,\n });\n poll = parsePollResult(raw);\n pollErrors = 0;\n } catch (err) {\n if (++pollErrors >= 4) throw err instanceof Error ? err : new Error(String(err));\n continue;\n }\n const line = poll.progress.at(-1);\n if (line && line !== lastProgress) {\n lastProgress = line;\n onProgress?.(line);\n }\n if (poll.state === 'succeeded' && poll.result) return poll.result;\n if (poll.state === 'failed') throw new Error(poll.error || 'Marketing video production failed');\n }\n throw new Error('The production is taking longer than expected — check back shortly.');\n}\n\n// ── Design lane (web 0.43) ──────────────────────────────────────────────────\n\nexport interface DesignPromoOptions extends PromoRunOptions {\n sourceVideoSeconds?: number;\n musicUrl?: string;\n}\n\nexport interface DesignedPromo {\n project: Record<string, unknown>;\n title: string;\n card: { category: string; industry?: string; reason?: string };\n summary: {\n scenes: number;\n textLayers: number;\n mediaLayers: number;\n seconds: number;\n sceneNames: string[];\n aspect: string;\n };\n notes: string[];\n}\n\nexport function buildDesignParams(opts: DesignPromoOptions): Record<string, unknown> {\n const { captions: _c, narration: _n, stylePlaybook: _p, ...rest } = opts;\n const base = buildPromoRunParams(rest);\n delete base.timeoutMs;\n return {\n ...base,\n ...(opts.sourceVideoSeconds && opts.sourceVideoSeconds > 0\n ? { sourceVideoSeconds: opts.sourceVideoSeconds }\n : {}),\n ...(opts.musicUrl && /^https?:\\/\\//i.test(opts.musicUrl) ? { musicUrl: opts.musicUrl } : {}),\n };\n}\n\nexport function parseDesignResult(result: Record<string, unknown>): DesignedPromo | null {\n const body = (result?.data && typeof result.data === 'object' ? result.data : result) as Record<string, unknown>;\n const project = body?.project;\n if (!project || typeof project !== 'object' || !Array.isArray((project as Record<string, unknown>).tracks)) {\n return null;\n }\n const summary = (body.summary ?? {}) as Partial<DesignedPromo['summary']>;\n const card = (body.card ?? {}) as Partial<DesignedPromo['card']>;\n return {\n project: project as Record<string, unknown>,\n title: typeof body.title === 'string' && body.title.trim() ? body.title.trim() : 'Video project',\n card: {\n category: typeof card.category === 'string' ? card.category : 'Promos',\n ...(card.industry ? { industry: card.industry } : {}),\n ...(card.reason ? { reason: card.reason } : {}),\n },\n summary: {\n scenes: Number(summary.scenes) || 0,\n textLayers: Number(summary.textLayers) || 0,\n mediaLayers: Number(summary.mediaLayers) || 0,\n seconds: Number(summary.seconds) || 0,\n sceneNames: Array.isArray(summary.sceneNames) ? summary.sceneNames.map(String) : [],\n aspect: typeof summary.aspect === 'string' ? summary.aspect : 'auto',\n },\n notes: Array.isArray(body.notes) ? body.notes.map(String) : [],\n };\n}\n\nexport async function designPromoProject(\n run: (action: string, params: Record<string, unknown>) => Promise<Record<string, unknown>>,\n opts: DesignPromoOptions,\n): Promise<DesignedPromo> {\n const raw = await run(DESIGN_PROJECT_ACTION, buildDesignParams(opts));\n if (raw.successful === false) throw new Error((raw.error as string) || 'Could not design the video');\n const designed = parseDesignResult(raw);\n if (!designed) throw new Error('Could not design the video (no project returned)');\n return designed;\n}\n"],"names":["s"],"mappings":"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"}
1
+ {"version":3,"file":"promoVideo.js","sources":["../../../src/features/canvas/promoVideo.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `rpc/promoVideoRpc` — catalog + submit/poll\n * envelope. Transport stays `RunMediaAction` (host or remote exec).\n */\n\nexport const PROMO_CONNECTOR = 'yantra-video-generation';\nexport const PRODUCE_SUBMIT_ACTION = 'YANTRA_VIDEO_GENERATION_PRODUCE_SUBMIT';\nexport const PRODUCE_STATUS_ACTION = 'YANTRA_VIDEO_GENERATION_PRODUCE_STATUS';\n/** Design lane: brief → editable studio project (no render). */\nexport const DESIGN_PROJECT_ACTION = 'YANTRA_VIDEO_GENERATION_DESIGN_PROJECT';\nexport const DESIGN_TIMEOUT_MS = 4 * 60_000;\n\nexport interface PromoPreset {\n id: string;\n name: string;\n description: string;\n defaultDurationSeconds: number;\n needsSourceVideo: boolean;\n /** Quality when the user picks none. */\n defaultQuality: PromoQuality;\n /** Only the production makes it: the design lane's templates have no shape for it. */\n produceOnly?: boolean;\n}\n\n/** How a production is made (connector PRODUCTION_QUALITIES). */\nexport type PromoQuality = 'standard' | 'studio';\n\nexport const PROMO_QUALITIES: readonly { id: PromoQuality; name: string; description: string }[] = [\n { id: 'standard', name: 'Standard', description: 'One pass: a finished cut in about half an hour.' },\n {\n id: 'studio',\n name: 'Studio',\n description:\n 'Directed like a film: three concepts written and judged, characters and narrator cast, keyframes first, the top video models tested on the hardest shots. Takes longer and uses more credits.',\n },\n];\n\n/** Narrator casting notes (connector NARRATOR_STYLES). Empty id = cast for the script. */\nexport const PROMO_NARRATORS: readonly { id: string; name: string }[] = [\n { id: '', name: 'Cast for the script' },\n { id: 'deadpan-documentary', name: 'Deadpan documentary, male' },\n { id: 'warm-storyteller-male', name: 'Warm storyteller, male' },\n { id: 'warm-storyteller-female', name: 'Warm storyteller, female' },\n { id: 'confident-announcer-male', name: 'Confident announcer, male' },\n { id: 'confident-announcer-female', name: 'Confident announcer, female' },\n { id: 'friendly-conversational', name: 'Friendly, conversational' },\n { id: 'calm-expert', name: 'Calm expert' },\n];\n\n/**\n * The model that lays out a promo DESIGN. Empty id = the connector's default.\n * Design only: PRODUCE reads `model` as its rendering agent's model.\n */\nexport const PROMO_DESIGN_MODELS: readonly { id: string; name: string; description: string }[] = [\n { id: '', name: 'Default', description: 'The connector’s own design model.' },\n { id: 'claude-opus-5-5', name: 'Claude Opus 5.5', description: 'Most capable, for long and complex work.' },\n];\n\nexport const PROMO_PRESETS: readonly PromoPreset[] = [\n {\n id: 'launch-film',\n name: 'Launch film',\n description: 'Story-led launch film: a cold open with a laugh, the reveal, then the product doing real jobs.',\n defaultDurationSeconds: 90,\n needsSourceVideo: false,\n defaultQuality: 'studio',\n produceOnly: true,\n },\n {\n id: 'product-teaser',\n name: 'Product teaser',\n description: 'Cinematic launch teaser: hero shots, a reveal, one closing line.',\n defaultDurationSeconds: 30,\n needsSourceVideo: false,\n defaultQuality: 'standard',\n },\n {\n id: 'brand-film',\n name: 'Brand film',\n description: 'Mood-led brand piece: story, atmosphere, music-first.',\n defaultDurationSeconds: 60,\n needsSourceVideo: false,\n defaultQuality: 'standard',\n },\n {\n id: 'motion-promo',\n name: 'Motion promo',\n description: 'Kinetic type and motion graphics for a feature, offer or launch.',\n defaultDurationSeconds: 30,\n needsSourceVideo: false,\n defaultQuality: 'standard',\n },\n {\n id: 'explainer',\n name: 'Explainer',\n description: 'Narrated explainer with captions: what, why, how.',\n defaultDurationSeconds: 60,\n needsSourceVideo: false,\n defaultQuality: 'standard',\n },\n {\n id: 'social-hook',\n name: 'Social hook',\n description: 'Vertical scroll-stopper: instant hook, big captions, one message.',\n defaultDurationSeconds: 15,\n needsSourceVideo: false,\n defaultQuality: 'standard',\n },\n {\n id: 'footage-remix',\n name: 'Remix footage',\n description: 'Cut a video already on the canvas into a promo with graphics and music.',\n defaultDurationSeconds: 30,\n needsSourceVideo: true,\n defaultQuality: 'standard',\n },\n];\n\nexport const PROMO_PLAYBOOKS: readonly { id: string; name: string }[] = [\n { id: '', name: 'Preset default' },\n { id: 'premium-minimalist', name: 'Premium minimalist' },\n { id: 'clean-professional', name: 'Clean professional' },\n { id: 'flat-motion-graphics', name: 'Flat motion graphics' },\n { id: 'minimalist-diagram', name: 'Minimalist diagram' },\n { id: 'anime-ghibli', name: 'Anime / Ghibli' },\n];\n\nexport function defaultNarration(presetId: string): boolean {\n return presetId !== 'brand-film' && presetId !== 'social-hook';\n}\n\nexport const DEFAULT_PROMO_PRESET = 'product-teaser';\nexport const PROMO_DURATIONS = [15, 30, 45, 60, 90] as const;\nexport const PROMO_ASPECT_RATIOS = ['16:9', '9:16', '1:1'] as const;\nexport const PROMO_POLL_EVERY_MS = 20_000;\nexport const PROMO_POLL_MAX_MS = 75 * 60_000;\n/** The same margin past a studio production. */\nexport const PROMO_STUDIO_POLL_MAX_MS = 120 * 60_000;\n/** Production budget sent to the connector. */\nexport const PROMO_RUN_TIMEOUT_MS = 55 * 60_000;\n/** A studio production's budget: writers' room, casting and keyframes come first. */\nexport const PROMO_STUDIO_RUN_TIMEOUT_MS = 100 * 60_000;\n\nexport function lookupPromoPreset(id: string): PromoPreset {\n // The default, not the first: the first is the launch film, and an unknown\n // id must never turn into a studio production.\n return PROMO_PRESETS.find((p) => p.id === id) ?? PROMO_PRESETS.find((p) => p.id === DEFAULT_PROMO_PRESET)!;\n}\n\nexport function defaultPromoQuality(presetId: string): PromoQuality {\n return lookupPromoPreset(presetId).defaultQuality;\n}\n\n/** The quality a request will actually run at: its own, else its preset's. */\nexport function promoQualityOf(opts: { preset: string; quality?: PromoQuality }): PromoQuality {\n return opts.quality ?? defaultPromoQuality(opts.preset);\n}\n\nexport function promoRunTimeoutMs(opts: { preset: string; quality?: PromoQuality }): number {\n return promoQualityOf(opts) === 'studio' ? PROMO_STUDIO_RUN_TIMEOUT_MS : PROMO_RUN_TIMEOUT_MS;\n}\n\nexport function promoPollMaxMs(opts: { preset: string; quality?: PromoQuality }): number {\n return promoQualityOf(opts) === 'studio' ? PROMO_STUDIO_POLL_MAX_MS : PROMO_POLL_MAX_MS;\n}\n\nexport interface PromoContext {\n onScreenText: string;\n keyPoints: string;\n audience: string;\n tone: string;\n avoid: string;\n brandColors: string;\n}\n\nexport const EMPTY_PROMO_CONTEXT: PromoContext = {\n onScreenText: '',\n keyPoints: '',\n audience: '',\n tone: '',\n avoid: '',\n brandColors: '',\n};\n\nexport function hasPromoContext(value: PromoContext, logoUrl?: string | null): boolean {\n return Boolean(logoUrl) || Object.values(value).some((v) => v.trim().length > 0);\n}\n\n/** Hexes in a colours field — mirrors the connector parser. */\nexport function readBrandColors(raw: string): string[] {\n const out: string[] = [];\n for (const token of raw.split(/[\\s,]+/)) {\n const m = token.trim().match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);\n if (!m) continue;\n const h =\n m[1].length === 3\n ? m[1]\n .split('')\n .map((c) => c + c)\n .join('')\n : m[1];\n const hex = `#${h.toLowerCase()}`;\n if (!out.includes(hex)) out.push(hex);\n }\n return out.slice(0, 6);\n}\n\nexport interface PromoRunOptions {\n prompt: string;\n preset: string;\n durationSeconds: number;\n aspectRatio: string;\n referenceImageUrls?: string[];\n sourceVideoUrl?: string;\n brandName?: string;\n callToAction?: string;\n logoUrl?: string;\n onScreenText?: string;\n keyPoints?: string;\n audience?: string;\n tone?: string;\n avoid?: string;\n brandColors?: string;\n captions?: boolean;\n narration?: boolean;\n stylePlaybook?: string;\n /** How it is made. Absent = the preset's default. Production only. */\n quality?: PromoQuality;\n /** A PROMO_NARRATORS id to cast the narrator against. Production only. */\n narratorVoice?: string;\n /** Real jobs the product is shown doing, one per line, in order. Production only. */\n useCases?: string;\n}\n\nexport interface PromoRunResult {\n url: string;\n title: string;\n projectId: string;\n preset: string;\n pipeline: string;\n durationSeconds?: number;\n summary?: string;\n}\n\nexport function buildPromoRunParams(opts: PromoRunOptions): Record<string, unknown> {\n const referenceImageUrls = (opts.referenceImageUrls ?? []).filter((u) => /^https?:\\/\\//i.test(u));\n return {\n prompt: opts.prompt,\n preset: opts.preset,\n durationSeconds: opts.durationSeconds,\n aspectRatio: opts.aspectRatio,\n ...(referenceImageUrls.length ? { referenceImageUrls } : {}),\n ...(opts.sourceVideoUrl ? { sourceVideoUrl: opts.sourceVideoUrl } : {}),\n ...(opts.brandName ? { brandName: opts.brandName } : {}),\n ...(opts.callToAction ? { callToAction: opts.callToAction } : {}),\n ...(opts.logoUrl ? { logoUrl: opts.logoUrl } : {}),\n ...(opts.onScreenText?.trim() ? { onScreenText: opts.onScreenText } : {}),\n ...(opts.keyPoints?.trim() ? { keyPoints: opts.keyPoints } : {}),\n ...(opts.audience?.trim() ? { audience: opts.audience.trim() } : {}),\n ...(opts.tone?.trim() ? { tone: opts.tone.trim() } : {}),\n ...(opts.avoid?.trim() ? { avoid: opts.avoid.trim() } : {}),\n ...(opts.brandColors?.trim() ? { brandColors: opts.brandColors } : {}),\n ...(typeof opts.captions === 'boolean' ? { captions: opts.captions } : {}),\n ...(typeof opts.narration === 'boolean' ? { narration: opts.narration } : {}),\n ...(opts.stylePlaybook ? { stylePlaybook: opts.stylePlaybook } : {}),\n // Always sent: the timeout below has to agree with whichever quality runs.\n quality: promoQualityOf(opts),\n ...(opts.narratorVoice ? { narratorVoice: opts.narratorVoice } : {}),\n ...(opts.useCases?.trim() ? { useCases: opts.useCases } : {}),\n timeoutMs: promoRunTimeoutMs(opts),\n };\n}\n\nexport function parsePromoRunResult(result: Record<string, unknown>): PromoRunResult | null {\n const data = (result.data ?? result) as Record<string, unknown>;\n const samples = data.samples as Array<{ uri?: string }> | undefined;\n const url = (typeof data.videoUri === 'string' && data.videoUri) || samples?.find((s) => s?.uri)?.uri || '';\n if (!url) return null;\n const prod = (data.production ?? {}) as Record<string, unknown>;\n const s = (k: string) => (typeof prod[k] === 'string' ? (prod[k] as string) : undefined);\n const n = (k: string) => (typeof prod[k] === 'number' ? (prod[k] as number) : undefined);\n return {\n url,\n title: s('title') ?? 'Marketing video',\n projectId: s('projectId') ?? (typeof data.operationName === 'string' ? data.operationName : ''),\n preset: s('preset') ?? '',\n pipeline: s('pipeline') ?? '',\n durationSeconds: n('durationSeconds'),\n summary: s('summary'),\n };\n}\n\nexport interface PromoSubmitHandle {\n projectId: string;\n sandboxId: string;\n}\n\nexport function parseSubmitResult(result: Record<string, unknown>): PromoSubmitHandle | null {\n const d = (result.data ?? result) as Record<string, unknown>;\n const projectId = typeof d.projectId === 'string' ? d.projectId : '';\n const sandboxId = typeof d.sandboxId === 'string' ? d.sandboxId : '';\n return projectId && sandboxId ? { projectId, sandboxId } : null;\n}\n\nexport type PromoPollState = 'running' | 'succeeded' | 'failed';\n\nexport interface PromoPoll {\n state: PromoPollState;\n progress: string[];\n error?: string;\n result?: PromoRunResult;\n}\n\nexport function parsePollResult(result: Record<string, unknown>): PromoPoll {\n const d = (result.data ?? result) as Record<string, unknown>;\n const state: PromoPollState = d.state === 'succeeded' || d.state === 'failed' ? d.state : 'running';\n const progress = Array.isArray(d.progress) ? (d.progress.filter((x) => typeof x === 'string') as string[]) : [];\n if (state === 'succeeded') {\n const run = parsePromoRunResult(d);\n return run\n ? { state, progress, result: run }\n : { state: 'failed', progress, error: 'Production finished but returned no video' };\n }\n if (state === 'failed') {\n return { state, progress, error: typeof d.error === 'string' ? d.error : 'Marketing video production failed' };\n }\n return { state, progress };\n}\n\nexport async function producePromoVideo(\n run: (action: string, params: Record<string, unknown>) => Promise<Record<string, unknown>>,\n opts: PromoRunOptions,\n onProgress?: (msg: string) => void,\n sleep: (ms: number) => Promise<void> = (ms) => new Promise((r) => setTimeout(r, ms)),\n isCancelled?: () => boolean,\n): Promise<PromoRunResult> {\n onProgress?.('Starting the production…');\n const submit = await run(PRODUCE_SUBMIT_ACTION, buildPromoRunParams(opts));\n const handle = parseSubmitResult(submit);\n if (!handle) throw new Error('Could not start the production (no handle returned)');\n\n const deadline = Date.now() + promoPollMaxMs(opts);\n let lastProgress = '';\n let pollErrors = 0;\n while (Date.now() < deadline) {\n if (isCancelled?.()) throw new Error('cancelled');\n await sleep(PROMO_POLL_EVERY_MS);\n if (isCancelled?.()) throw new Error('cancelled');\n let poll: PromoPoll;\n try {\n const raw = await run(PRODUCE_STATUS_ACTION, {\n projectId: handle.projectId,\n sandboxId: handle.sandboxId,\n });\n poll = parsePollResult(raw);\n pollErrors = 0;\n } catch (err) {\n if (++pollErrors >= 4) throw err instanceof Error ? err : new Error(String(err));\n continue;\n }\n const line = poll.progress.at(-1);\n if (line && line !== lastProgress) {\n lastProgress = line;\n onProgress?.(line);\n }\n if (poll.state === 'succeeded' && poll.result) return poll.result;\n if (poll.state === 'failed') throw new Error(poll.error || 'Marketing video production failed');\n }\n throw new Error('The production is taking longer than expected — check back shortly.');\n}\n\n// ── Design lane (web 0.43) ──────────────────────────────────────────────────\n\nexport interface DesignPromoOptions extends PromoRunOptions {\n sourceVideoSeconds?: number;\n musicUrl?: string;\n /** A PROMO_DESIGN_MODELS id; empty = the connector's default. Never sent to PRODUCE. */\n model?: string;\n}\n\nexport interface DesignedPromo {\n project: Record<string, unknown>;\n title: string;\n card: { category: string; industry?: string; reason?: string };\n summary: {\n scenes: number;\n textLayers: number;\n mediaLayers: number;\n seconds: number;\n sceneNames: string[];\n aspect: string;\n };\n notes: string[];\n}\n\nexport function buildDesignParams(opts: DesignPromoOptions): Record<string, unknown> {\n const {\n captions: _c,\n narration: _n,\n stylePlaybook: _p,\n quality: _q,\n narratorVoice: _v,\n useCases: _u,\n model,\n ...rest\n } = opts;\n const base = buildPromoRunParams(rest);\n delete base.timeoutMs;\n delete base.quality;\n return {\n ...base,\n ...(model?.trim() ? { model: model.trim() } : {}),\n ...(opts.sourceVideoSeconds && opts.sourceVideoSeconds > 0\n ? { sourceVideoSeconds: opts.sourceVideoSeconds }\n : {}),\n ...(opts.musicUrl && /^https?:\\/\\//i.test(opts.musicUrl) ? { musicUrl: opts.musicUrl } : {}),\n };\n}\n\nexport function parseDesignResult(result: Record<string, unknown>): DesignedPromo | null {\n const body = (result?.data && typeof result.data === 'object' ? result.data : result) as Record<string, unknown>;\n const project = body?.project;\n if (!project || typeof project !== 'object' || !Array.isArray((project as Record<string, unknown>).tracks)) {\n return null;\n }\n const summary = (body.summary ?? {}) as Partial<DesignedPromo['summary']>;\n const card = (body.card ?? {}) as Partial<DesignedPromo['card']>;\n return {\n project: project as Record<string, unknown>,\n title: typeof body.title === 'string' && body.title.trim() ? body.title.trim() : 'Video project',\n card: {\n category: typeof card.category === 'string' ? card.category : 'Promos',\n ...(card.industry ? { industry: card.industry } : {}),\n ...(card.reason ? { reason: card.reason } : {}),\n },\n summary: {\n scenes: Number(summary.scenes) || 0,\n textLayers: Number(summary.textLayers) || 0,\n mediaLayers: Number(summary.mediaLayers) || 0,\n seconds: Number(summary.seconds) || 0,\n sceneNames: Array.isArray(summary.sceneNames) ? summary.sceneNames.map(String) : [],\n aspect: typeof summary.aspect === 'string' ? summary.aspect : 'auto',\n },\n notes: Array.isArray(body.notes) ? body.notes.map(String) : [],\n };\n}\n\nexport async function designPromoProject(\n run: (action: string, params: Record<string, unknown>) => Promise<Record<string, unknown>>,\n opts: DesignPromoOptions,\n): Promise<DesignedPromo> {\n const raw = await run(DESIGN_PROJECT_ACTION, buildDesignParams(opts));\n if (raw.successful === false) throw new Error((raw.error as string) || 'Could not design the video');\n const designed = parseDesignResult(raw);\n if (!designed) throw new Error('Could not design the video (no project returned)');\n return designed;\n}\n"],"names":["s"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKO,MAAM,eAAkB,GAAA;AACxB,MAAM,qBAAwB,GAAA;AAC9B,MAAM,qBAAwB,GAAA;AAE9B,MAAM,qBAAwB,GAAA;AAgB9B,MAAM,kBAIP,CAAC;AAAA,EACL,EAAI,EAAA,UAAA;AAAA,EACJ,IAAM,EAAA,UAAA;AAAA,EACN,WAAa,EAAA;AACf,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,QAAA;AAAA,EACJ,IAAM,EAAA,QAAA;AAAA,EACN,WAAa,EAAA;AACf,CAAC;AAGM,MAAM,kBAGP,CAAC;AAAA,EACL,EAAI,EAAA,EAAA;AAAA,EACJ,IAAM,EAAA;AACR,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,qBAAA;AAAA,EACJ,IAAM,EAAA;AACR,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,uBAAA;AAAA,EACJ,IAAM,EAAA;AACR,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,yBAAA;AAAA,EACJ,IAAM,EAAA;AACR,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,0BAAA;AAAA,EACJ,IAAM,EAAA;AACR,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,4BAAA;AAAA,EACJ,IAAM,EAAA;AACR,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,yBAAA;AAAA,EACJ,IAAM,EAAA;AACR,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,aAAA;AAAA,EACJ,IAAM,EAAA;AACR,CAAC;AAMM,MAAM,sBAIP,CAAC;AAAA,EACL,EAAI,EAAA,EAAA;AAAA,EACJ,IAAM,EAAA,SAAA;AAAA,EACN,WAAa,EAAA;AACf,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,iBAAA;AAAA,EACJ,IAAM,EAAA,iBAAA;AAAA,EACN,WAAa,EAAA;AACf,CAAC;AACM,MAAM,gBAAwC,CAAC;AAAA,EACpD,EAAI,EAAA,aAAA;AAAA,EACJ,IAAM,EAAA,aAAA;AAAA,EACN,WAAa,EAAA,gGAAA;AAAA,EACb,sBAAwB,EAAA,EAAA;AAAA,EACxB,gBAAkB,EAAA,KAAA;AAAA,EAClB,cAAgB,EAAA,QAAA;AAAA,EAChB,WAAa,EAAA;AACf,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,gBAAA;AAAA,EACJ,IAAM,EAAA,gBAAA;AAAA,EACN,WAAa,EAAA,kEAAA;AAAA,EACb,sBAAwB,EAAA,EAAA;AAAA,EACxB,gBAAkB,EAAA,KAAA;AAAA,EAClB,cAAgB,EAAA;AAClB,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,YAAA;AAAA,EACJ,IAAM,EAAA,YAAA;AAAA,EACN,WAAa,EAAA,uDAAA;AAAA,EACb,sBAAwB,EAAA,EAAA;AAAA,EACxB,gBAAkB,EAAA,KAAA;AAAA,EAClB,cAAgB,EAAA;AAClB,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,cAAA;AAAA,EACJ,IAAM,EAAA,cAAA;AAAA,EACN,WAAa,EAAA,kEAAA;AAAA,EACb,sBAAwB,EAAA,EAAA;AAAA,EACxB,gBAAkB,EAAA,KAAA;AAAA,EAClB,cAAgB,EAAA;AAClB,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,WAAA;AAAA,EACJ,IAAM,EAAA,WAAA;AAAA,EACN,WAAa,EAAA,mDAAA;AAAA,EACb,sBAAwB,EAAA,EAAA;AAAA,EACxB,gBAAkB,EAAA,KAAA;AAAA,EAClB,cAAgB,EAAA;AAClB,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,aAAA;AAAA,EACJ,IAAM,EAAA,aAAA;AAAA,EACN,WAAa,EAAA,mEAAA;AAAA,EACb,sBAAwB,EAAA,EAAA;AAAA,EACxB,gBAAkB,EAAA,KAAA;AAAA,EAClB,cAAgB,EAAA;AAClB,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,eAAA;AAAA,EACJ,IAAM,EAAA,eAAA;AAAA,EACN,WAAa,EAAA,yEAAA;AAAA,EACb,sBAAwB,EAAA,EAAA;AAAA,EACxB,gBAAkB,EAAA,IAAA;AAAA,EAClB,cAAgB,EAAA;AAClB,CAAC;AACM,MAAM,kBAGP,CAAC;AAAA,EACL,EAAI,EAAA,EAAA;AAAA,EACJ,IAAM,EAAA;AACR,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,oBAAA;AAAA,EACJ,IAAM,EAAA;AACR,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,oBAAA;AAAA,EACJ,IAAM,EAAA;AACR,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,sBAAA;AAAA,EACJ,IAAM,EAAA;AACR,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,oBAAA;AAAA,EACJ,IAAM,EAAA;AACR,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,cAAA;AAAA,EACJ,IAAM,EAAA;AACR,CAAC;AACM,SAAS,iBAAiB,QAA2B,EAAA;AAC1D,EAAO,OAAA,QAAA,KAAa,gBAAgB,QAAa,KAAA,aAAA;AACnD;AACO,MAAM,oBAAuB,GAAA;AAC7B,MAAM,kBAAkB,CAAC,EAAA,EAAI,EAAI,EAAA,EAAA,EAAI,IAAI,EAAE;AAC3C,MAAM,mBAAsB,GAAA,CAAC,MAAQ,EAAA,MAAA,EAAQ,KAAK;AAClD,MAAM,mBAAsB,GAAA;AAC5B,MAAM,oBAAoB,EAAK,GAAA;AAE/B,MAAM,2BAA2B,GAAM,GAAA;AAEvC,MAAM,uBAAuB,EAAK,GAAA;AAElC,MAAM,8BAA8B,GAAM,GAAA;AAC1C,SAAS,kBAAkB,EAAyB,EAAA;AA7K3D,EAAA,IAAA,EAAA;AAgLE,EAAA,OAAA,CAAO,EAAc,GAAA,aAAA,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,EAAO,KAAA,EAAE,CAAnC,KAAA,IAAA,GAAA,EAAA,GAAwC,aAAc,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,oBAAoB,CAAA;AACtG;AACO,SAAS,oBAAoB,QAAgC,EAAA;AAClE,EAAO,OAAA,iBAAA,CAAkB,QAAQ,CAAE,CAAA,cAAA;AACrC;AAGO,SAAS,eAAe,IAGd,EAAA;AA1LjB,EAAA,IAAA,EAAA;AA2LE,EAAA,OAAA,CAAO,EAAK,GAAA,IAAA,CAAA,OAAA,KAAL,IAAgB,GAAA,EAAA,GAAA,mBAAA,CAAoB,KAAK,MAAM,CAAA;AACxD;AACO,SAAS,kBAAkB,IAGvB,EAAA;AACT,EAAA,OAAO,cAAe,CAAA,IAAI,CAAM,KAAA,QAAA,GAAW,2BAA8B,GAAA,oBAAA;AAC3E;AACO,SAAS,eAAe,IAGpB,EAAA;AACT,EAAA,OAAO,cAAe,CAAA,IAAI,CAAM,KAAA,QAAA,GAAW,wBAA2B,GAAA,iBAAA;AACxE;AASO,MAAM,mBAAoC,GAAA;AAAA,EAC/C,YAAc,EAAA,EAAA;AAAA,EACd,SAAW,EAAA,EAAA;AAAA,EACX,QAAU,EAAA,EAAA;AAAA,EACV,IAAM,EAAA,EAAA;AAAA,EACN,KAAO,EAAA,EAAA;AAAA,EACP,WAAa,EAAA;AACf;AACgB,SAAA,eAAA,CAAgB,OAAqB,OAAkC,EAAA;AACrF,EAAA,OAAO,OAAQ,CAAA,OAAO,CAAK,IAAA,MAAA,CAAO,MAAO,CAAA,KAAK,CAAE,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,IAAK,EAAA,CAAE,SAAS,CAAC,CAAA;AAC/E;AAGO,SAAS,gBAAgB,GAAuB,EAAA;AACrD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,KAAS,IAAA,GAAA,CAAI,KAAM,CAAA,QAAQ,CAAG,EAAA;AACvC,IAAA,MAAM,CAAI,GAAA,KAAA,CAAM,IAAK,EAAA,CAAE,MAAM,gCAAgC,CAAA;AAC7D,IAAA,IAAI,CAAC,CAAG,EAAA;AACR,IAAM,MAAA,CAAA,GAAI,EAAE,CAAC,CAAA,CAAE,WAAW,CAAI,GAAA,CAAA,CAAE,CAAC,CAAE,CAAA,KAAA,CAAM,EAAE,CAAE,CAAA,GAAA,CAAI,OAAK,CAAI,GAAA,CAAC,EAAE,IAAK,CAAA,EAAE,CAAI,GAAA,CAAA,CAAE,CAAC,CAAA;AAC3E,IAAA,MAAM,GAAM,GAAA,CAAA,CAAA,EAAI,CAAE,CAAA,WAAA,EAAa,CAAA,CAAA;AAC/B,IAAA,IAAI,CAAC,GAAI,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA;AAEtC,EAAO,OAAA,GAAA,CAAI,KAAM,CAAA,CAAA,EAAG,CAAC,CAAA;AACvB;AAoCO,SAAS,oBAAoB,IAAgD,EAAA;AA5QpF,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA6QE,EAAM,MAAA,kBAAA,GAAA,CAAA,CAAsB,EAAK,GAAA,IAAA,CAAA,kBAAA,KAAL,IAA2B,GAAA,EAAA,GAAA,EAAI,EAAA,MAAA,CAAO,CAAK,CAAA,KAAA,eAAA,CAAgB,IAAK,CAAA,CAAC,CAAC,CAAA;AAC9F,EAAO,OAAA,aAAA,CAAA,cAAA,CAAA,cAAA,CAAA,aAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA;AAAA,IACL,QAAQ,IAAK,CAAA,MAAA;AAAA,IACb,QAAQ,IAAK,CAAA,MAAA;AAAA,IACb,iBAAiB,IAAK,CAAA,eAAA;AAAA,IACtB,aAAa,IAAK,CAAA;AAAA,GAAA,EACd,mBAAmB,MAAS,GAAA;AAAA,IAC9B;AAAA,GACE,GAAA,EACA,CAAA,EAAA,IAAA,CAAK,cAAiB,GAAA;AAAA,IACxB,gBAAgB,IAAK,CAAA;AAAA,GACnB,GAAA,EACA,CAAA,EAAA,IAAA,CAAK,SAAY,GAAA;AAAA,IACnB,WAAW,IAAK,CAAA;AAAA,GACd,GAAA,EACA,CAAA,EAAA,IAAA,CAAK,YAAe,GAAA;AAAA,IACtB,cAAc,IAAK,CAAA;AAAA,GACjB,GAAA,EACA,CAAA,EAAA,IAAA,CAAK,OAAU,GAAA;AAAA,IACjB,SAAS,IAAK,CAAA;AAAA,MACZ,EAAC,CAAA,EAAA,CAAA,CACD,EAAK,GAAA,IAAA,CAAA,YAAA,KAAL,mBAAmB,IAAS,EAAA,IAAA;AAAA,IAC9B,cAAc,IAAK,CAAA;AAAA,MACjB,EAAC,CAAA,EAAA,CAAA,CACD,EAAK,GAAA,IAAA,CAAA,SAAA,KAAL,mBAAgB,IAAS,EAAA,IAAA;AAAA,IAC3B,WAAW,IAAK,CAAA;AAAA,MACd,EAAC,CAAA,EAAA,CAAA,CACD,EAAK,GAAA,IAAA,CAAA,QAAA,KAAL,mBAAe,IAAS,EAAA,IAAA;AAAA,IAC1B,QAAA,EAAU,IAAK,CAAA,QAAA,CAAS,IAAK;AAAA,MAC3B,EAAC,CAAA,EAAA,CAAA,CACD,EAAK,GAAA,IAAA,CAAA,IAAA,KAAL,mBAAW,IAAS,EAAA,IAAA;AAAA,IACtB,IAAA,EAAM,IAAK,CAAA,IAAA,CAAK,IAAK;AAAA,MACnB,EAAC,CAAA,EAAA,CAAA,CACD,EAAK,GAAA,IAAA,CAAA,KAAA,KAAL,mBAAY,IAAS,EAAA,IAAA;AAAA,IACvB,KAAA,EAAO,IAAK,CAAA,KAAA,CAAM,IAAK;AAAA,MACrB,EAAC,CAAA,EAAA,CAAA,CACD,EAAK,GAAA,IAAA,CAAA,WAAA,KAAL,mBAAkB,IAAS,EAAA,IAAA;AAAA,IAC7B,aAAa,IAAK,CAAA;AAAA,MAChB,EAAC,CAAA,EACD,OAAO,IAAA,CAAK,aAAa,SAAY,GAAA;AAAA,IACvC,UAAU,IAAK,CAAA;AAAA,MACb,EAAC,CAAA,EACD,OAAO,IAAA,CAAK,cAAc,SAAY,GAAA;AAAA,IACxC,WAAW,IAAK,CAAA;AAAA,GACd,GAAA,EACA,CAAA,EAAA,IAAA,CAAK,aAAgB,GAAA;AAAA,IACvB,eAAe,IAAK,CAAA;AAAA,GACtB,GAAI,EA9CC,CAAA,EAAA;AAAA;AAAA,IAgDL,OAAA,EAAS,eAAe,IAAI;AAAA,GAAA,CAAA,EACxB,KAAK,aAAgB,GAAA;AAAA,IACvB,eAAe,IAAK,CAAA;AAAA,MAClB,EAAC,CAAA,EAAA,CAAA,CACD,EAAK,GAAA,IAAA,CAAA,QAAA,KAAL,mBAAe,IAAS,EAAA,IAAA;AAAA,IAC1B,UAAU,IAAK,CAAA;AAAA,GACjB,GAAI,EAtDC,CAAA,EAAA;AAAA,IAuDL,SAAA,EAAW,kBAAkB,IAAI;AAAA,GACnC,CAAA;AACF;AACO,SAAS,oBAAoB,MAAwD,EAAA;AAxU5F,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAyUE,EAAM,MAAA,IAAA,GAAA,CAAQ,EAAO,GAAA,MAAA,CAAA,IAAA,KAAP,IAAe,GAAA,EAAA,GAAA,MAAA;AAC7B,EAAA,MAAM,UAAU,IAAK,CAAA,OAAA;AAGrB,EAAA,MAAM,MAAM,OAAO,IAAA,CAAK,QAAa,KAAA,QAAA,IAAY,KAAK,QAAY,KAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,IAAK,CAAA,CAAAA,OAAKA,EAAA,IAAA,IAAA,GAAA,MAAA,GAAAA,EAAG,CAAA,GAAA,CAAA,KAAtB,mBAA4B,GAAO,CAAA,IAAA,EAAA;AACrG,EAAI,IAAA,CAAC,KAAY,OAAA,IAAA;AACjB,EAAA,MAAM,IAAQ,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,UAAL,KAAA,IAAA,GAAA,EAAA,GAAmB,EAAC;AAClC,EAAM,MAAA,CAAA,GAAI,CAAC,CAAA,KAAc,OAAO,IAAA,CAAK,CAAC,CAAM,KAAA,QAAA,GAAW,IAAK,CAAA,CAAC,CAAc,GAAA,MAAA;AAC3E,EAAM,MAAA,CAAA,GAAI,CAAC,CAAA,KAAc,OAAO,IAAA,CAAK,CAAC,CAAM,KAAA,QAAA,GAAW,IAAK,CAAA,CAAC,CAAc,GAAA,MAAA;AAC3E,EAAO,OAAA;AAAA,IACL,GAAA;AAAA,IACA,KAAO,EAAA,CAAA,EAAA,GAAA,CAAA,CAAE,OAAO,CAAA,KAAT,IAAc,GAAA,EAAA,GAAA,iBAAA;AAAA,IACrB,SAAA,EAAA,CAAW,EAAE,GAAA,CAAA,CAAA,WAAW,CAAb,KAAA,IAAA,GAAA,EAAA,GAAmB,OAAO,IAAK,CAAA,aAAA,KAAkB,QAAW,GAAA,IAAA,CAAK,aAAgB,GAAA,EAAA;AAAA,IAC5F,MAAQ,EAAA,CAAA,EAAA,GAAA,CAAA,CAAE,QAAQ,CAAA,KAAV,IAAe,GAAA,EAAA,GAAA,EAAA;AAAA,IACvB,QAAU,EAAA,CAAA,EAAA,GAAA,CAAA,CAAE,UAAU,CAAA,KAAZ,IAAiB,GAAA,EAAA,GAAA,EAAA;AAAA,IAC3B,eAAA,EAAiB,EAAE,iBAAiB,CAAA;AAAA,IACpC,OAAA,EAAS,EAAE,SAAS;AAAA,GACtB;AACF;AAKO,SAAS,kBAAkB,MAA2D,EAAA;AAhW7F,EAAA,IAAA,EAAA;AAiWE,EAAM,MAAA,CAAA,GAAA,CAAK,EAAO,GAAA,MAAA,CAAA,IAAA,KAAP,IAAe,GAAA,EAAA,GAAA,MAAA;AAC1B,EAAA,MAAM,YAAY,OAAO,CAAA,CAAE,SAAc,KAAA,QAAA,GAAW,EAAE,SAAY,GAAA,EAAA;AAClE,EAAA,MAAM,YAAY,OAAO,CAAA,CAAE,SAAc,KAAA,QAAA,GAAW,EAAE,SAAY,GAAA,EAAA;AAClE,EAAA,OAAO,aAAa,SAAY,GAAA;AAAA,IAC9B,SAAA;AAAA,IACA;AAAA,GACE,GAAA,IAAA;AACN;AAQO,SAAS,gBAAgB,MAA4C,EAAA;AAhX5E,EAAA,IAAA,EAAA;AAiXE,EAAM,MAAA,CAAA,GAAA,CAAK,EAAO,GAAA,MAAA,CAAA,IAAA,KAAP,IAAe,GAAA,EAAA,GAAA,MAAA;AAC1B,EAAM,MAAA,KAAA,GAAwB,EAAE,KAAU,KAAA,WAAA,IAAe,EAAE,KAAU,KAAA,QAAA,GAAW,EAAE,KAAQ,GAAA,SAAA;AAC1F,EAAA,MAAM,QAAW,GAAA,KAAA,CAAM,OAAQ,CAAA,CAAA,CAAE,QAAQ,CAAI,GAAA,CAAA,CAAE,QAAS,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,OAAO,CAAM,KAAA,QAAQ,IAAgB,EAAC;AAC1G,EAAA,IAAI,UAAU,WAAa,EAAA;AACzB,IAAM,MAAA,GAAA,GAAM,oBAAoB,CAAC,CAAA;AACjC,IAAA,OAAO,GAAM,GAAA;AAAA,MACX,KAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAQ,EAAA;AAAA,KACN,GAAA;AAAA,MACF,KAAO,EAAA,QAAA;AAAA,MACP,QAAA;AAAA,MACA,KAAO,EAAA;AAAA,KACT;AAAA;AAEF,EAAA,IAAI,UAAU,QAAU,EAAA;AACtB,IAAO,OAAA;AAAA,MACL,KAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAO,OAAO,CAAA,CAAE,KAAU,KAAA,QAAA,GAAW,EAAE,KAAQ,GAAA;AAAA,KACjD;AAAA;AAEF,EAAO,OAAA;AAAA,IACL,KAAA;AAAA,IACA;AAAA,GACF;AACF;AACA,eAAsB,iBAAkB,CAAA,GAAA,EAA4F,IAAuB,EAAA,UAAA,EAAoC,QAAuC,CAAM,EAAA,KAAA,IAAI,OAAQ,CAAA,CAAA,CAAA,KAAK,UAAW,CAAA,CAAA,EAAG,EAAE,CAAC,GAAG,WAAsD,EAAA;AACrU,EAAa,UAAA,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAA,+BAAA,CAAA;AACb,EAAA,MAAM,SAAS,MAAM,GAAA,CAAI,qBAAuB,EAAA,mBAAA,CAAoB,IAAI,CAAC,CAAA;AACzE,EAAM,MAAA,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,IAAI,CAAC,MAAA,EAAc,MAAA,IAAI,MAAM,qDAAqD,CAAA;AAClF,EAAA,MAAM,QAAW,GAAA,IAAA,CAAK,GAAI,EAAA,GAAI,eAAe,IAAI,CAAA;AACjD,EAAA,IAAI,YAAe,GAAA,EAAA;AACnB,EAAA,IAAI,UAAa,GAAA,CAAA;AACjB,EAAO,OAAA,IAAA,CAAK,GAAI,EAAA,GAAI,QAAU,EAAA;AAC5B,IAAA,IAAI,WAAiB,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,EAAA,EAAA,MAAM,IAAI,KAAA,CAAM,WAAW,CAAA;AAChD,IAAA,MAAM,MAAM,mBAAmB,CAAA;AAC/B,IAAA,IAAI,WAAiB,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,EAAA,EAAA,MAAM,IAAI,KAAA,CAAM,WAAW,CAAA;AAChD,IAAI,IAAA,IAAA;AACJ,IAAI,IAAA;AACF,MAAM,MAAA,GAAA,GAAM,MAAM,GAAA,CAAI,qBAAuB,EAAA;AAAA,QAC3C,WAAW,MAAO,CAAA,SAAA;AAAA,QAClB,WAAW,MAAO,CAAA;AAAA,OACnB,CAAA;AACD,MAAA,IAAA,GAAO,gBAAgB,GAAG,CAAA;AAC1B,MAAa,UAAA,GAAA,CAAA;AAAA,aACN,GAAK,EAAA;AACZ,MAAI,IAAA,EAAE,UAAc,IAAA,CAAA,EAAS,MAAA,GAAA,YAAe,KAAQ,GAAA,GAAA,GAAM,IAAI,KAAA,CAAM,MAAO,CAAA,GAAG,CAAC,CAAA;AAC/E,MAAA;AAAA;AAEF,IAAA,MAAM,IAAO,GAAA,IAAA,CAAK,QAAS,CAAA,EAAA,CAAG,EAAE,CAAA;AAChC,IAAI,IAAA,IAAA,IAAQ,SAAS,YAAc,EAAA;AACjC,MAAe,YAAA,GAAA,IAAA;AACf,MAAa,UAAA,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAA,IAAA,CAAA;AAAA;AAEf,IAAA,IAAI,KAAK,KAAU,KAAA,WAAA,IAAe,IAAK,CAAA,MAAA,SAAe,IAAK,CAAA,MAAA;AAC3D,IAAI,IAAA,IAAA,CAAK,UAAU,QAAU,EAAA,MAAM,IAAI,KAAM,CAAA,IAAA,CAAK,SAAS,mCAAmC,CAAA;AAAA;AAEhG,EAAM,MAAA,IAAI,MAAM,0EAAqE,CAAA;AACvF;AA4BO,SAAS,kBAAkB,IAAmD,EAAA;AACnF,EAAA,MASI,EARF,GAAA,IAAA,EAAA;AAAA,IAAU,QAAA,EAAA,EAAA;AAAA,IACV,SAAW,EAAA,EAAA;AAAA,IACX,aAAe,EAAA,EAAA;AAAA,IACf,OAAS,EAAA,EAAA;AAAA,IACT,aAAe,EAAA,EAAA;AAAA,IACf,QAAU,EAAA,EAAA;AAAA,IACV;AAAA,GAjdJ,GAmdM,EADC,EAAA,IAAA,GAAA,SAAA,CACD,EADC,EAAA;AAAA,IAPH,UAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGF,EAAM,MAAA,IAAA,GAAO,oBAAoB,IAAI,CAAA;AACrC,EAAA,OAAO,IAAK,CAAA,SAAA;AACZ,EAAA,OAAO,IAAK,CAAA,OAAA;AACZ,EAAO,OAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,EAAA,EACF,IACC,CAAA,EAAA,CAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,IAAS,EAAA,IAAA;AAAA,IAClB,KAAA,EAAO,MAAM,IAAK;AAAA,MAChB,EAAC,CAAA,EACD,KAAK,kBAAsB,IAAA,IAAA,CAAK,qBAAqB,CAAI,GAAA;AAAA,IAC3D,oBAAoB,IAAK,CAAA;AAAA,GAC3B,GAAI,EACA,CAAA,EAAA,IAAA,CAAK,YAAY,eAAgB,CAAA,IAAA,CAAK,IAAK,CAAA,QAAQ,CAAI,GAAA;AAAA,IACzD,UAAU,IAAK,CAAA;AAAA,MACb,EAAC,CAAA;AAET;AACO,SAAS,kBAAkB,MAAuD,EAAA;AApezF,EAAA,IAAA,EAAA,EAAA,EAAA;AAqeE,EAAM,MAAA,IAAA,GAAA,CAAQ,iCAAQ,IAAQ,KAAA,OAAO,OAAO,IAAS,KAAA,QAAA,GAAW,OAAO,IAAO,GAAA,MAAA;AAC9E,EAAA,MAAM,UAAU,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,OAAA;AACtB,EAAI,IAAA,CAAC,OAAW,IAAA,OAAO,OAAY,KAAA,QAAA,IAAY,CAAC,KAAM,CAAA,OAAA,CAAS,OAAoC,CAAA,MAAM,CAAG,EAAA;AAC1G,IAAO,OAAA,IAAA;AAAA;AAET,EAAA,MAAM,OAAW,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,OAAL,KAAA,IAAA,GAAA,EAAA,GAAgB,EAAC;AAClC,EAAA,MAAM,IAAQ,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,IAAL,KAAA,IAAA,GAAA,EAAA,GAAa,EAAC;AAC5B,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA,KAAO,EAAA,OAAO,IAAK,CAAA,KAAA,KAAU,QAAY,IAAA,IAAA,CAAK,KAAM,CAAA,IAAA,EAAS,GAAA,IAAA,CAAK,KAAM,CAAA,IAAA,EAAS,GAAA,eAAA;AAAA,IACjF,IAAM,EAAA,cAAA,CAAA,cAAA,CAAA;AAAA,MACJ,UAAU,OAAO,IAAA,CAAK,QAAa,KAAA,QAAA,GAAW,KAAK,QAAW,GAAA;AAAA,KAAA,EAC1D,KAAK,QAAW,GAAA;AAAA,MAClB,UAAU,IAAK,CAAA;AAAA,KACb,GAAA,EACA,CAAA,EAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MAChB,QAAQ,IAAK,CAAA;AAAA,QACX,EAAC,CAAA;AAAA,IAEP,OAAS,EAAA;AAAA,MACP,MAAQ,EAAA,MAAA,CAAO,OAAQ,CAAA,MAAM,CAAK,IAAA,CAAA;AAAA,MAClC,UAAY,EAAA,MAAA,CAAO,OAAQ,CAAA,UAAU,CAAK,IAAA,CAAA;AAAA,MAC1C,WAAa,EAAA,MAAA,CAAO,OAAQ,CAAA,WAAW,CAAK,IAAA,CAAA;AAAA,MAC5C,OAAS,EAAA,MAAA,CAAO,OAAQ,CAAA,OAAO,CAAK,IAAA,CAAA;AAAA,MACpC,UAAA,EAAY,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA,UAAU,CAAI,GAAA,OAAA,CAAQ,UAAW,CAAA,GAAA,CAAI,MAAM,CAAA,GAAI,EAAC;AAAA,MAClF,QAAQ,OAAO,OAAA,CAAQ,MAAW,KAAA,QAAA,GAAW,QAAQ,MAAS,GAAA;AAAA,KAChE;AAAA,IACA,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA,KAAK,CAAI,GAAA,IAAA,CAAK,KAAM,CAAA,GAAA,CAAI,MAAM,CAAA,GAAI;AAAC,GAC/D;AACF;AACsB,eAAA,kBAAA,CAAmB,KAA4F,IAAkD,EAAA;AACrL,EAAA,MAAM,MAAM,MAAM,GAAA,CAAI,qBAAuB,EAAA,iBAAA,CAAkB,IAAI,CAAC,CAAA;AACpE,EAAI,IAAA,GAAA,CAAI,eAAe,KAAO,EAAA,MAAM,IAAI,KAAM,CAAA,GAAA,CAAI,SAAmB,4BAA4B,CAAA;AACjG,EAAM,MAAA,QAAA,GAAW,kBAAkB,GAAG,CAAA;AACtC,EAAA,IAAI,CAAC,QAAA,EAAgB,MAAA,IAAI,MAAM,kDAAkD,CAAA;AACjF,EAAO,OAAA,QAAA;AACT"}