@crievo/omni 0.0.0-stage → 0.1.1

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 (708) hide show
  1. package/.env.example +41 -0
  2. package/README.md +2 -2
  3. package/bin/omni.mjs +18 -0
  4. package/docs/onboarding/clone-voice.png +0 -0
  5. package/docs/onboarding/getting-started.png +0 -0
  6. package/docs/onboarding/new-video.png +0 -0
  7. package/docs/onboarding/providers.png +0 -0
  8. package/docs/onboarding/publish.png +0 -0
  9. package/docs/onboarding/references.png +0 -0
  10. package/docs/onboarding.md +212 -0
  11. package/omnivideo.config.example.json +437 -0
  12. package/package.json +40 -4
  13. package/reference/captions.md +156 -0
  14. package/reference/carousel-contract.md +91 -0
  15. package/reference/cloud.md +96 -0
  16. package/reference/learnings.md +792 -0
  17. package/reference/omnichat.md +305 -0
  18. package/reference/premiere-mcp.md +91 -0
  19. package/reference/publish.md +305 -0
  20. package/reference/scenes-contract.md +109 -0
  21. package/reference/studio.md +666 -0
  22. package/reference/voicestudio.md +81 -0
  23. package/reference/writing-for-voice.md +67 -0
  24. package/requirements.txt +3 -0
  25. package/studio/api/app.ts +87 -0
  26. package/studio/api/lib/errors.ts +33 -0
  27. package/studio/api/lib/files.ts +41 -0
  28. package/studio/api/lib/hono.ts +9 -0
  29. package/studio/api/lib/result.ts +14 -0
  30. package/studio/api/lib/validate.ts +31 -0
  31. package/studio/api/lib/video.ts +10 -0
  32. package/studio/api/middleware/json-charset.ts +11 -0
  33. package/studio/api/middleware/local-only.ts +32 -0
  34. package/studio/api/middleware/no-timeout.ts +10 -0
  35. package/studio/api/routes/admin.ts +18 -0
  36. package/studio/api/routes/agent-cascade.ts +100 -0
  37. package/studio/api/routes/agent-history.ts +23 -0
  38. package/studio/api/routes/agent.ts +162 -0
  39. package/studio/api/routes/analytics.ts +31 -0
  40. package/studio/api/routes/approval.ts +60 -0
  41. package/studio/api/routes/archive.ts +12 -0
  42. package/studio/api/routes/captions.ts +28 -0
  43. package/studio/api/routes/carousel.ts +38 -0
  44. package/studio/api/routes/clone.ts +27 -0
  45. package/studio/api/routes/create.ts +19 -0
  46. package/studio/api/routes/events.ts +11 -0
  47. package/studio/api/routes/export.ts +14 -0
  48. package/studio/api/routes/media.ts +30 -0
  49. package/studio/api/routes/omnichat.ts +113 -0
  50. package/studio/api/routes/onboarding.ts +14 -0
  51. package/studio/api/routes/publish.ts +40 -0
  52. package/studio/api/routes/queue.ts +14 -0
  53. package/studio/api/routes/references.ts +40 -0
  54. package/studio/api/routes/runner.ts +17 -0
  55. package/studio/api/routes/schedule.ts +47 -0
  56. package/studio/api/routes/services.ts +11 -0
  57. package/studio/api/routes/sessions.ts +27 -0
  58. package/studio/api/routes/settings.ts +102 -0
  59. package/studio/api/routes/sound.ts +45 -0
  60. package/studio/api/routes/thumbnail.ts +18 -0
  61. package/studio/api/routes/usage.ts +13 -0
  62. package/studio/api/routes/videos.ts +41 -0
  63. package/studio/api/routes/voices.ts +71 -0
  64. package/studio/api/services/admin.ts +113 -0
  65. package/studio/api/services/agent-cascade.ts +975 -0
  66. package/studio/api/services/agent-claude.ts +47 -0
  67. package/studio/api/services/agent-history.ts +103 -0
  68. package/studio/api/services/agent-persona.ts +77 -0
  69. package/studio/api/services/agent-tools.ts +2237 -0
  70. package/studio/api/services/agent-ui-tools.ts +259 -0
  71. package/studio/api/services/agent-wait.ts +32 -0
  72. package/studio/api/services/agent.ts +553 -0
  73. package/studio/api/services/analytics.ts +92 -0
  74. package/studio/api/services/approval.ts +134 -0
  75. package/studio/api/services/archive.ts +38 -0
  76. package/studio/api/services/captions.ts +268 -0
  77. package/studio/api/services/carousel.ts +206 -0
  78. package/studio/api/services/classify.ts +196 -0
  79. package/studio/api/services/clone-phrases.ts +75 -0
  80. package/studio/api/services/clone.ts +722 -0
  81. package/studio/api/services/create.ts +421 -0
  82. package/studio/api/services/events.ts +215 -0
  83. package/studio/api/services/media.ts +32 -0
  84. package/studio/api/services/omnichat.ts +624 -0
  85. package/studio/api/services/onboarding.ts +77 -0
  86. package/studio/api/services/publish.ts +287 -0
  87. package/studio/api/services/queue.ts +150 -0
  88. package/studio/api/services/references.ts +269 -0
  89. package/studio/api/services/root.ts +60 -0
  90. package/studio/api/services/services.ts +114 -0
  91. package/studio/api/services/sessions.ts +1007 -0
  92. package/studio/api/services/settings.ts +983 -0
  93. package/studio/api/services/sound.ts +311 -0
  94. package/studio/api/services/thumbnail.ts +133 -0
  95. package/studio/api/services/usage.ts +27 -0
  96. package/studio/api/services/videos.ts +418 -0
  97. package/studio/api/services/voice-pause.ts +98 -0
  98. package/studio/api/services/voices.ts +324 -0
  99. package/studio/runner/runner.ts +244 -0
  100. package/studio/shared/omni-actions.ts +68 -0
  101. package/studio/shared/omni-admin.ts +52 -0
  102. package/studio/shared/omni-farewell.ts +48 -0
  103. package/studio/shared/omni-hotword.ts +20 -0
  104. package/studio/shared/omni-screens.ts +228 -0
  105. package/studio/shared/schemas/admin.ts +15 -0
  106. package/studio/shared/schemas/agent-cascade.ts +58 -0
  107. package/studio/shared/schemas/agent-history.ts +73 -0
  108. package/studio/shared/schemas/agent.ts +50 -0
  109. package/studio/shared/schemas/analytics.ts +6 -0
  110. package/studio/shared/schemas/approval.ts +22 -0
  111. package/studio/shared/schemas/captions.ts +19 -0
  112. package/studio/shared/schemas/carousel.ts +26 -0
  113. package/studio/shared/schemas/clone.ts +40 -0
  114. package/studio/shared/schemas/common.ts +16 -0
  115. package/studio/shared/schemas/omnichat.ts +54 -0
  116. package/studio/shared/schemas/onboarding.ts +5 -0
  117. package/studio/shared/schemas/publish.ts +45 -0
  118. package/studio/shared/schemas/references.ts +20 -0
  119. package/studio/shared/schemas/settings.ts +82 -0
  120. package/studio/shared/schemas/sound.ts +22 -0
  121. package/studio/shared/schemas/videos.ts +38 -0
  122. package/studio/shared/schemas/voices.ts +23 -0
  123. package/studio/shared/types/api.ts +1290 -0
  124. package/studio/studio.ts +148 -0
  125. package/studio/tsconfig.json +15 -0
  126. package/studio/web/assets/logos/cartesia.svg +4 -0
  127. package/studio/web/assets/logos/elevenlabs.svg +12 -0
  128. package/studio/web/assets/logos/fish.svg +24 -0
  129. package/studio/web/assets/logos/omni-black.png +0 -0
  130. package/studio/web/assets/logos/omni-white.png +0 -0
  131. package/studio/web/assets/logos/voicestudio.svg +21 -0
  132. package/studio/web/components/AgentMark.tsx +7 -0
  133. package/studio/web/components/AgentWalking.tsx +11 -0
  134. package/studio/web/components/ApiKeyField.tsx +104 -0
  135. package/studio/web/components/AppShell.tsx +64 -0
  136. package/studio/web/components/ApprovalNotice.tsx +65 -0
  137. package/studio/web/components/AvatarGroupIcon.tsx +22 -0
  138. package/studio/web/components/AvatarNameField.tsx +86 -0
  139. package/studio/web/components/AvatarPicker.tsx +84 -0
  140. package/studio/web/components/BrandLogo.tsx +16 -0
  141. package/studio/web/components/CartesiaPlanSetting.tsx +90 -0
  142. package/studio/web/components/ClaudeWalking.tsx +32 -0
  143. package/studio/web/components/CloneVoiceDialog/GuidedScript.tsx +39 -0
  144. package/studio/web/components/CloneVoiceDialog/LanguageBar.tsx +37 -0
  145. package/studio/web/components/CloneVoiceDialog/LevelMeter.tsx +31 -0
  146. package/studio/web/components/CloneVoiceDialog/ProviderChoice.tsx +81 -0
  147. package/studio/web/components/CloneVoiceDialog/QualityPanel.tsx +62 -0
  148. package/studio/web/components/CloneVoiceDialog/RecordStep.tsx +50 -0
  149. package/studio/web/components/CloneVoiceDialog/RecorderBar.tsx +79 -0
  150. package/studio/web/components/CloneVoiceDialog/RedoSummary.tsx +54 -0
  151. package/studio/web/components/CloneVoiceDialog/SaveStep.tsx +91 -0
  152. package/studio/web/components/CloneVoiceDialog/SourceBar.tsx +30 -0
  153. package/studio/web/components/CloneVoiceDialog/index.tsx +141 -0
  154. package/studio/web/components/CloneVoiceDialog/types.ts +28 -0
  155. package/studio/web/components/CloneVoiceDialog/useCloneVoice.ts +528 -0
  156. package/studio/web/components/ConnectionSignals.tsx +51 -0
  157. package/studio/web/components/EditVoiceDialog/EditVoiceFooter.tsx +72 -0
  158. package/studio/web/components/EditVoiceDialog/ProviderCards.tsx +81 -0
  159. package/studio/web/components/EditVoiceDialog/index.tsx +256 -0
  160. package/studio/web/components/ErrorBanner.tsx +115 -0
  161. package/studio/web/components/FinishedTask.tsx +41 -0
  162. package/studio/web/components/FishModelSetting.tsx +69 -0
  163. package/studio/web/components/FishPriceSetting.tsx +44 -0
  164. package/studio/web/components/HumanBanner.tsx +64 -0
  165. package/studio/web/components/Lightbox.tsx +41 -0
  166. package/studio/web/components/LogStream.tsx +42 -0
  167. package/studio/web/components/Markdown.tsx +21 -0
  168. package/studio/web/components/MissingDmsPanel/BatchSend.tsx +137 -0
  169. package/studio/web/components/MissingDmsPanel/CommentCard.tsx +168 -0
  170. package/studio/web/components/MissingDmsPanel/CommentFeed.tsx +45 -0
  171. package/studio/web/components/MissingDmsPanel/DmBubble.tsx +38 -0
  172. package/studio/web/components/MissingDmsPanel/ReplyComposer.tsx +63 -0
  173. package/studio/web/components/MissingDmsPanel/index.tsx +98 -0
  174. package/studio/web/components/NotFound.tsx +48 -0
  175. package/studio/web/components/Omni/OmniAvatarPicker.tsx +92 -0
  176. package/studio/web/components/Omni/OmniCards.tsx +202 -0
  177. package/studio/web/components/Omni/OmniGlow.tsx +183 -0
  178. package/studio/web/components/Omni/OmniHistory.tsx +119 -0
  179. package/studio/web/components/Omni/OmniHotword.tsx +40 -0
  180. package/studio/web/components/Omni/OmniMicSelect.tsx +92 -0
  181. package/studio/web/components/Omni/OmniVoiceSample.tsx +81 -0
  182. package/studio/web/components/Omni/OmniWidget.tsx +743 -0
  183. package/studio/web/components/Omni/PendingActions.tsx +200 -0
  184. package/studio/web/components/Omni/Transcript.tsx +127 -0
  185. package/studio/web/components/OmnichatAccountStatus.tsx +87 -0
  186. package/studio/web/components/OmnichatRulePanel/RuleConfig.tsx +150 -0
  187. package/studio/web/components/OmnichatRulePanel/RuleDryRun.tsx +15 -0
  188. package/studio/web/components/OmnichatRulePanel/RuleEnableConfirm.tsx +42 -0
  189. package/studio/web/components/OmnichatRulePanel/RuleSkeleton.tsx +18 -0
  190. package/studio/web/components/OmnichatRulePanel/RuleStatus.tsx +55 -0
  191. package/studio/web/components/OmnichatRulePanel/index.tsx +115 -0
  192. package/studio/web/components/OmnichatRulePanel/rule-steps.ts +67 -0
  193. package/studio/web/components/OmnichatRulePanel/steps/MessageStep.tsx +91 -0
  194. package/studio/web/components/OmnichatRulePanel/steps/RepliesStep.tsx +201 -0
  195. package/studio/web/components/OmnichatRulePanel/steps/TriggerStep.tsx +76 -0
  196. package/studio/web/components/OmnichatRulePanel/steps/types.ts +11 -0
  197. package/studio/web/components/Palette.tsx +17 -0
  198. package/studio/web/components/PlatformCard.tsx +109 -0
  199. package/studio/web/components/PlatformIcon.tsx +19 -0
  200. package/studio/web/components/ProviderCard.tsx +80 -0
  201. package/studio/web/components/ProviderDetail.tsx +367 -0
  202. package/studio/web/components/ProviderLogo.tsx +20 -0
  203. package/studio/web/components/QueuePanel.tsx +77 -0
  204. package/studio/web/components/ReferenceActions.tsx +89 -0
  205. package/studio/web/components/ReferencePicker.tsx +136 -0
  206. package/studio/web/components/ResultMessage.tsx +7 -0
  207. package/studio/web/components/RuleForm.tsx +138 -0
  208. package/studio/web/components/RuleLog.tsx +151 -0
  209. package/studio/web/components/RunningTask.tsx +23 -0
  210. package/studio/web/components/SampleList.tsx +55 -0
  211. package/studio/web/components/SessionPanel.tsx +352 -0
  212. package/studio/web/components/SettingRow.tsx +14 -0
  213. package/studio/web/components/SettingsCategorySkeleton.tsx +25 -0
  214. package/studio/web/components/SidePanel.tsx +77 -0
  215. package/studio/web/components/Sidebar.tsx +289 -0
  216. package/studio/web/components/StageStepper.tsx +87 -0
  217. package/studio/web/components/StudioOffline.tsx +80 -0
  218. package/studio/web/components/TaskName.tsx +17 -0
  219. package/studio/web/components/TopBanners.tsx +30 -0
  220. package/studio/web/components/VideoOmnichatPanel.tsx +287 -0
  221. package/studio/web/components/VoiceAvatar.tsx +33 -0
  222. package/studio/web/components/VoiceCarousel.tsx +196 -0
  223. package/studio/web/components/VoiceCategory.tsx +9 -0
  224. package/studio/web/components/VoiceModal.tsx +39 -0
  225. package/studio/web/components/VoiceProfileCard.tsx +75 -0
  226. package/studio/web/components/VoiceProfilePicker.tsx +107 -0
  227. package/studio/web/components/VoiceProfilesSettings.tsx +150 -0
  228. package/studio/web/components/VoiceProviderCard.tsx +118 -0
  229. package/studio/web/components/VoiceProvidersCard.tsx +26 -0
  230. package/studio/web/components/WaitList.tsx +21 -0
  231. package/studio/web/components/icons.tsx +247 -0
  232. package/studio/web/components/ui/accordion.tsx +47 -0
  233. package/studio/web/components/ui/badge.tsx +18 -0
  234. package/studio/web/components/ui/calendar.tsx +43 -0
  235. package/studio/web/components/ui/chart.tsx +229 -0
  236. package/studio/web/components/ui/checkbox.tsx +26 -0
  237. package/studio/web/components/ui/cx.ts +2 -0
  238. package/studio/web/components/ui/date-time-picker.tsx +84 -0
  239. package/studio/web/components/ui/panel.tsx +23 -0
  240. package/studio/web/components/ui/picker.tsx +58 -0
  241. package/studio/web/components/ui/popover.tsx +24 -0
  242. package/studio/web/components/ui/select.tsx +89 -0
  243. package/studio/web/components/ui/skeleton.tsx +10 -0
  244. package/studio/web/components/ui/slider.tsx +68 -0
  245. package/studio/web/components/ui/switch.tsx +13 -0
  246. package/studio/web/components/ui/tooltip.tsx +59 -0
  247. package/studio/web/hooks/useAccounts.ts +27 -0
  248. package/studio/web/hooks/useAdmin.ts +12 -0
  249. package/studio/web/hooks/useAnalytics.ts +21 -0
  250. package/studio/web/hooks/useAvatarAudioReactive.ts +87 -0
  251. package/studio/web/hooks/useBrowserConnect.ts +48 -0
  252. package/studio/web/hooks/useClonePlan.ts +14 -0
  253. package/studio/web/hooks/useConnected.ts +7 -0
  254. package/studio/web/hooks/useLiveQuery.ts +29 -0
  255. package/studio/web/hooks/useMenuCollapsed.ts +32 -0
  256. package/studio/web/hooks/useMicDevices.ts +53 -0
  257. package/studio/web/hooks/useMissingDms.ts +211 -0
  258. package/studio/web/hooks/useMissingSetupSteps.ts +26 -0
  259. package/studio/web/hooks/useNow.ts +11 -0
  260. package/studio/web/hooks/useOmniAgent.ts +278 -0
  261. package/studio/web/hooks/useOmniClaude.ts +124 -0
  262. package/studio/web/hooks/useOmniDock.ts +142 -0
  263. package/studio/web/hooks/useOmniGreeting.ts +60 -0
  264. package/studio/web/hooks/useOmniHotword.ts +128 -0
  265. package/studio/web/hooks/useOmnichat.ts +26 -0
  266. package/studio/web/hooks/useOnboarding.ts +27 -0
  267. package/studio/web/hooks/usePost.ts +23 -0
  268. package/studio/web/hooks/useQueue.ts +10 -0
  269. package/studio/web/hooks/useReferences.ts +20 -0
  270. package/studio/web/hooks/useRuleEditor.ts +101 -0
  271. package/studio/web/hooks/useRunner.ts +24 -0
  272. package/studio/web/hooks/useSaveAction.ts +23 -0
  273. package/studio/web/hooks/useSchedule.ts +11 -0
  274. package/studio/web/hooks/useServices.ts +10 -0
  275. package/studio/web/hooks/useSessions.ts +15 -0
  276. package/studio/web/hooks/useSettings.ts +11 -0
  277. package/studio/web/hooks/useSettingsSection.ts +30 -0
  278. package/studio/web/hooks/useSidePanel.ts +23 -0
  279. package/studio/web/hooks/useSound.ts +30 -0
  280. package/studio/web/hooks/useUsage.ts +11 -0
  281. package/studio/web/hooks/useVideoVoice.ts +36 -0
  282. package/studio/web/hooks/useVideos.ts +21 -0
  283. package/studio/web/hooks/useVoiceProfilePreview.ts +52 -0
  284. package/studio/web/hooks/useVoiceProfiles.ts +7 -0
  285. package/studio/web/hooks/useVoiceRunning.ts +10 -0
  286. package/studio/web/hooks/useVoiceStudioClosed.ts +8 -0
  287. package/studio/web/index.html +19 -0
  288. package/studio/web/lib/agent.ts +7 -0
  289. package/studio/web/lib/alerts.ts +210 -0
  290. package/studio/web/lib/analytics-metrics.ts +351 -0
  291. package/studio/web/lib/api.ts +70 -0
  292. package/studio/web/lib/audio.ts +39 -0
  293. package/studio/web/lib/avatars.ts +41 -0
  294. package/studio/web/lib/calendar.ts +218 -0
  295. package/studio/web/lib/caption-position.ts +249 -0
  296. package/studio/web/lib/carousel.ts +24 -0
  297. package/studio/web/lib/chime.ts +42 -0
  298. package/studio/web/lib/clone-voice.ts +55 -0
  299. package/studio/web/lib/export.ts +11 -0
  300. package/studio/web/lib/files.ts +8 -0
  301. package/studio/web/lib/format.ts +93 -0
  302. package/studio/web/lib/media.ts +29 -0
  303. package/studio/web/lib/mic-device.ts +72 -0
  304. package/studio/web/lib/missing-dms.ts +70 -0
  305. package/studio/web/lib/omni-cards.ts +42 -0
  306. package/studio/web/lib/omni-cascade.ts +1067 -0
  307. package/studio/web/lib/omni-greeting-audio.ts +24 -0
  308. package/studio/web/lib/omni-hotword.ts +231 -0
  309. package/studio/web/lib/omni-panel.ts +67 -0
  310. package/studio/web/lib/omni-realtime.ts +811 -0
  311. package/studio/web/lib/omni-ui.ts +402 -0
  312. package/studio/web/lib/omni-wait.ts +174 -0
  313. package/studio/web/lib/omnichat-api.ts +44 -0
  314. package/studio/web/lib/orb.ts +270 -0
  315. package/studio/web/lib/pcm-recorder.ts +115 -0
  316. package/studio/web/lib/platforms.ts +17 -0
  317. package/studio/web/lib/providers.ts +27 -0
  318. package/studio/web/lib/publish-draft.ts +52 -0
  319. package/studio/web/lib/publish-settings.ts +81 -0
  320. package/studio/web/lib/query-client.ts +122 -0
  321. package/studio/web/lib/references.ts +13 -0
  322. package/studio/web/lib/services.ts +40 -0
  323. package/studio/web/lib/sessions.ts +103 -0
  324. package/studio/web/lib/settings-categories.ts +58 -0
  325. package/studio/web/lib/sound-audio.ts +33 -0
  326. package/studio/web/lib/sound-timeline.ts +291 -0
  327. package/studio/web/lib/sse.ts +86 -0
  328. package/studio/web/lib/stage-history.ts +141 -0
  329. package/studio/web/lib/stages.ts +344 -0
  330. package/studio/web/lib/studio-offline.ts +60 -0
  331. package/studio/web/lib/upload.ts +24 -0
  332. package/studio/web/lib/video-tabs.ts +118 -0
  333. package/studio/web/lib/voice-profile-draft.ts +34 -0
  334. package/studio/web/lib/voice-profiles.ts +3 -0
  335. package/studio/web/main.tsx +14 -0
  336. package/studio/web/pages/AdminPage/index.tsx +123 -0
  337. package/studio/web/pages/AgentPage/components/Measurements.tsx +102 -0
  338. package/studio/web/pages/AgentPage/index.tsx +28 -0
  339. package/studio/web/pages/AnalyticsPage/components/About.tsx +52 -0
  340. package/studio/web/pages/AnalyticsPage/components/ChannelCards.tsx +106 -0
  341. package/studio/web/pages/AnalyticsPage/components/ChannelView.tsx +137 -0
  342. package/studio/web/pages/AnalyticsPage/components/CollectionStatus.tsx +46 -0
  343. package/studio/web/pages/AnalyticsPage/components/Comparison.tsx +68 -0
  344. package/studio/web/pages/AnalyticsPage/components/Diagnosis.tsx +50 -0
  345. package/studio/web/pages/AnalyticsPage/components/Highlights.tsx +49 -0
  346. package/studio/web/pages/AnalyticsPage/components/Hint.tsx +11 -0
  347. package/studio/web/pages/AnalyticsPage/components/HookVsBody.tsx +100 -0
  348. package/studio/web/pages/AnalyticsPage/components/HourlyWave.tsx +133 -0
  349. package/studio/web/pages/AnalyticsPage/components/Insights.tsx +70 -0
  350. package/studio/web/pages/AnalyticsPage/components/MetricCard.tsx +46 -0
  351. package/studio/web/pages/AnalyticsPage/components/PlanSection.tsx +40 -0
  352. package/studio/web/pages/AnalyticsPage/components/ProgressionChart.tsx +155 -0
  353. package/studio/web/pages/AnalyticsPage/components/ReelBarsChart.tsx +154 -0
  354. package/studio/web/pages/AnalyticsPage/components/ReelThumb.tsx +19 -0
  355. package/studio/web/pages/AnalyticsPage/components/ReelView.tsx +290 -0
  356. package/studio/web/pages/AnalyticsPage/components/ReelsTable.tsx +269 -0
  357. package/studio/web/pages/AnalyticsPage/components/RequestWithFocus.tsx +38 -0
  358. package/studio/web/pages/AnalyticsPage/components/SegmentedControl.tsx +35 -0
  359. package/studio/web/pages/AnalyticsPage/components/VsMedian.tsx +31 -0
  360. package/studio/web/pages/AnalyticsPage/index.tsx +17 -0
  361. package/studio/web/pages/GettingStartedPage/index.tsx +174 -0
  362. package/studio/web/pages/NewVideoPage/components/DeliverablesPicker.tsx +62 -0
  363. package/studio/web/pages/NewVideoPage/components/FormatPicker.tsx +33 -0
  364. package/studio/web/pages/NewVideoPage/index.tsx +133 -0
  365. package/studio/web/pages/NotFoundPage/index.tsx +9 -0
  366. package/studio/web/pages/OmnichatPage/components/NewFromLink.tsx +59 -0
  367. package/studio/web/pages/OmnichatPage/components/RuleListItem.tsx +64 -0
  368. package/studio/web/pages/OmnichatPage/components/RulePreview.tsx +14 -0
  369. package/studio/web/pages/OmnichatPage/components/RuleView.tsx +88 -0
  370. package/studio/web/pages/OmnichatPage/index.tsx +153 -0
  371. package/studio/web/pages/QueuePage/index.tsx +22 -0
  372. package/studio/web/pages/ReferencePage/components/ReferenceTexts.tsx +131 -0
  373. package/studio/web/pages/ReferencePage/index.tsx +216 -0
  374. package/studio/web/pages/ReferencesPage/components/NewReferenceForm.tsx +150 -0
  375. package/studio/web/pages/ReferencesPage/components/ReferenceCard.tsx +42 -0
  376. package/studio/web/pages/ReferencesPage/components/ReferenceGridSkeleton.tsx +31 -0
  377. package/studio/web/pages/ReferencesPage/index.tsx +67 -0
  378. package/studio/web/pages/SchedulePage/components/CalendarSkeleton.tsx +18 -0
  379. package/studio/web/pages/SchedulePage/components/DayView.tsx +177 -0
  380. package/studio/web/pages/SchedulePage/components/HourPicker.tsx +103 -0
  381. package/studio/web/pages/SchedulePage/components/MonthDayCell.tsx +111 -0
  382. package/studio/web/pages/SchedulePage/components/MonthView.tsx +47 -0
  383. package/studio/web/pages/SchedulePage/components/PlatformIcons.tsx +12 -0
  384. package/studio/web/pages/SchedulePage/components/PostThumb.tsx +15 -0
  385. package/studio/web/pages/SchedulePage/components/WeekColumn.tsx +75 -0
  386. package/studio/web/pages/SchedulePage/components/WeekView.tsx +35 -0
  387. package/studio/web/pages/SchedulePage/index.tsx +285 -0
  388. package/studio/web/pages/SettingsPage/components/AgentAccounts.tsx +263 -0
  389. package/studio/web/pages/SettingsPage/components/AgentCategory.tsx +20 -0
  390. package/studio/web/pages/SettingsPage/components/ModelPicker.tsx +49 -0
  391. package/studio/web/pages/SettingsPage/components/ModelsSettings.tsx +138 -0
  392. package/studio/web/pages/SettingsPage/components/PlatformsCategory.tsx +23 -0
  393. package/studio/web/pages/SettingsPage/components/PublishingCategory/AccountStatus.tsx +29 -0
  394. package/studio/web/pages/SettingsPage/components/PublishingCategory/AutoPublishPanel.tsx +90 -0
  395. package/studio/web/pages/SettingsPage/components/PublishingCategory/BrowserConnect.tsx +62 -0
  396. package/studio/web/pages/SettingsPage/components/PublishingCategory/CheckField.tsx +19 -0
  397. package/studio/web/pages/SettingsPage/components/PublishingCategory/InstagramPanel.tsx +113 -0
  398. package/studio/web/pages/SettingsPage/components/PublishingCategory/OmnichatSettingsPanel.tsx +146 -0
  399. package/studio/web/pages/SettingsPage/components/PublishingCategory/SaveBar.tsx +33 -0
  400. package/studio/web/pages/SettingsPage/components/PublishingCategory/SchedulePanel.tsx +132 -0
  401. package/studio/web/pages/SettingsPage/components/PublishingCategory/SettingsCard.tsx +47 -0
  402. package/studio/web/pages/SettingsPage/components/PublishingCategory/SettingsCardGroup.tsx +19 -0
  403. package/studio/web/pages/SettingsPage/components/PublishingCategory/TextPanel.tsx +55 -0
  404. package/studio/web/pages/SettingsPage/components/PublishingCategory/TiktokPanel.tsx +123 -0
  405. package/studio/web/pages/SettingsPage/components/PublishingCategory/YoutubePanel.tsx +100 -0
  406. package/studio/web/pages/SettingsPage/components/PublishingCategory/badges.tsx +15 -0
  407. package/studio/web/pages/SettingsPage/components/PublishingCategory/index.tsx +40 -0
  408. package/studio/web/pages/SettingsPage/components/PublishingCategory/types.ts +10 -0
  409. package/studio/web/pages/SettingsPage/components/UsageCategory.tsx +389 -0
  410. package/studio/web/pages/SettingsPage/components/VoiceProvidersCategory.tsx +97 -0
  411. package/studio/web/pages/SettingsPage/index.tsx +85 -0
  412. package/studio/web/pages/VideoPage/components/AudioPlayer.tsx +113 -0
  413. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/AxisField.tsx +50 -0
  414. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionList.tsx +56 -0
  415. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionListItem.tsx +92 -0
  416. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionMargins.tsx +57 -0
  417. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionStyleFields.tsx +70 -0
  418. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionTextForm.tsx +87 -0
  419. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/ColorField.tsx +37 -0
  420. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/MarginField.tsx +59 -0
  421. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/NumberField.tsx +57 -0
  422. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/PositionControls.tsx +140 -0
  423. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/captionEditor.ts +215 -0
  424. package/studio/web/pages/VideoPage/components/CaptionPositionEditor/useCaptionPosition.ts +154 -0
  425. package/studio/web/pages/VideoPage/components/CarouselChangeRequest.tsx +72 -0
  426. package/studio/web/pages/VideoPage/components/CarouselCompositionStage.tsx +80 -0
  427. package/studio/web/pages/VideoPage/components/CarouselCreate.tsx +63 -0
  428. package/studio/web/pages/VideoPage/components/CarouselMissing.tsx +19 -0
  429. package/studio/web/pages/VideoPage/components/CarouselPublishStage.tsx +173 -0
  430. package/studio/web/pages/VideoPage/components/CarouselScriptStage.tsx +82 -0
  431. package/studio/web/pages/VideoPage/components/CarouselSlideCard.tsx +49 -0
  432. package/studio/web/pages/VideoPage/components/CarouselViewer.tsx +55 -0
  433. package/studio/web/pages/VideoPage/components/ChangedVoices.tsx +53 -0
  434. package/studio/web/pages/VideoPage/components/CompositionStage.tsx +78 -0
  435. package/studio/web/pages/VideoPage/components/CoverPicker.tsx +32 -0
  436. package/studio/web/pages/VideoPage/components/EditorStage.tsx +53 -0
  437. package/studio/web/pages/VideoPage/components/LineTakes.tsx +160 -0
  438. package/studio/web/pages/VideoPage/components/LineTextEditor.tsx +124 -0
  439. package/studio/web/pages/VideoPage/components/LineVoicePicker.tsx +37 -0
  440. package/studio/web/pages/VideoPage/components/MediaImage.tsx +25 -0
  441. package/studio/web/pages/VideoPage/components/MotionScriptStage.tsx +39 -0
  442. package/studio/web/pages/VideoPage/components/NarrationStage.tsx +70 -0
  443. package/studio/web/pages/VideoPage/components/PublishForm.tsx +387 -0
  444. package/studio/web/pages/VideoPage/components/PublishStage.tsx +76 -0
  445. package/studio/web/pages/VideoPage/components/PublishText.tsx +149 -0
  446. package/studio/web/pages/VideoPage/components/ScenesApprovalPanel.tsx +278 -0
  447. package/studio/web/pages/VideoPage/components/ScheduledInfo.tsx +72 -0
  448. package/studio/web/pages/VideoPage/components/ScriptApprovalPanel.tsx +189 -0
  449. package/studio/web/pages/VideoPage/components/ScriptStage.tsx +17 -0
  450. package/studio/web/pages/VideoPage/components/SequencePlayer.tsx +146 -0
  451. package/studio/web/pages/VideoPage/components/SoundTimeline/AddSound.tsx +117 -0
  452. package/studio/web/pages/VideoPage/components/SoundTimeline/AreaSelection.tsx +74 -0
  453. package/studio/web/pages/VideoPage/components/SoundTimeline/BedPanel.tsx +94 -0
  454. package/studio/web/pages/VideoPage/components/SoundTimeline/BedRow.tsx +45 -0
  455. package/studio/web/pages/VideoPage/components/SoundTimeline/CaptionOverlay.tsx +44 -0
  456. package/studio/web/pages/VideoPage/components/SoundTimeline/CaptionSaveBar.tsx +32 -0
  457. package/studio/web/pages/VideoPage/components/SoundTimeline/CaptionsPanel.tsx +22 -0
  458. package/studio/web/pages/VideoPage/components/SoundTimeline/ClipBlock.tsx +111 -0
  459. package/studio/web/pages/VideoPage/components/SoundTimeline/ClipPanel.tsx +76 -0
  460. package/studio/web/pages/VideoPage/components/SoundTimeline/CutsPanel.tsx +44 -0
  461. package/studio/web/pages/VideoPage/components/SoundTimeline/EditorTabBar.tsx +73 -0
  462. package/studio/web/pages/VideoPage/components/SoundTimeline/EffectChoice.tsx +46 -0
  463. package/studio/web/pages/VideoPage/components/SoundTimeline/EffectItem.tsx +89 -0
  464. package/studio/web/pages/VideoPage/components/SoundTimeline/EffectPanel.tsx +232 -0
  465. package/studio/web/pages/VideoPage/components/SoundTimeline/EffectsRow.tsx +21 -0
  466. package/studio/web/pages/VideoPage/components/SoundTimeline/Lane.tsx +39 -0
  467. package/studio/web/pages/VideoPage/components/SoundTimeline/MarkerRow.tsx +40 -0
  468. package/studio/web/pages/VideoPage/components/SoundTimeline/MuteButton.tsx +36 -0
  469. package/studio/web/pages/VideoPage/components/SoundTimeline/NumberInput.tsx +37 -0
  470. package/studio/web/pages/VideoPage/components/SoundTimeline/PlanWarnings.tsx +19 -0
  471. package/studio/web/pages/VideoPage/components/SoundTimeline/PlayerResizeHandle.tsx +50 -0
  472. package/studio/web/pages/VideoPage/components/SoundTimeline/PreviewControls.tsx +51 -0
  473. package/studio/web/pages/VideoPage/components/SoundTimeline/SceneRow.tsx +54 -0
  474. package/studio/web/pages/VideoPage/components/SoundTimeline/SettingsPanel.tsx +65 -0
  475. package/studio/web/pages/VideoPage/components/SoundTimeline/SoundLibrary.tsx +99 -0
  476. package/studio/web/pages/VideoPage/components/SoundTimeline/SoundPreview.tsx +82 -0
  477. package/studio/web/pages/VideoPage/components/SoundTimeline/SpeedPanel.tsx +128 -0
  478. package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineDock.tsx +56 -0
  479. package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineFooter.tsx +26 -0
  480. package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineSkeleton.tsx +21 -0
  481. package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineToolbar.tsx +160 -0
  482. package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineTracks.tsx +121 -0
  483. package/studio/web/pages/VideoPage/components/SoundTimeline/TrackSidebar.tsx +30 -0
  484. package/studio/web/pages/VideoPage/components/SoundTimeline/VoiceRow.tsx +53 -0
  485. package/studio/web/pages/VideoPage/components/SoundTimeline/Waveform.tsx +97 -0
  486. package/studio/web/pages/VideoPage/components/SoundTimeline/clipActions.ts +50 -0
  487. package/studio/web/pages/VideoPage/components/SoundTimeline/effectActions.ts +161 -0
  488. package/studio/web/pages/VideoPage/components/SoundTimeline/index.tsx +161 -0
  489. package/studio/web/pages/VideoPage/components/SoundTimeline/timelineGeometry.ts +45 -0
  490. package/studio/web/pages/VideoPage/components/SoundTimeline/types.ts +43 -0
  491. package/studio/web/pages/VideoPage/components/SoundTimeline/useAutosave.ts +107 -0
  492. package/studio/web/pages/VideoPage/components/SoundTimeline/useEditorShortcuts.ts +168 -0
  493. package/studio/web/pages/VideoPage/components/SoundTimeline/useFitHeight.ts +40 -0
  494. package/studio/web/pages/VideoPage/components/SoundTimeline/useFollowPlayhead.ts +21 -0
  495. package/studio/web/pages/VideoPage/components/SoundTimeline/useListenMix.ts +43 -0
  496. package/studio/web/pages/VideoPage/components/SoundTimeline/usePlayback.ts +231 -0
  497. package/studio/web/pages/VideoPage/components/SoundTimeline/usePlayerWidth.ts +27 -0
  498. package/studio/web/pages/VideoPage/components/SoundTimeline/useSoundData.ts +124 -0
  499. package/studio/web/pages/VideoPage/components/SoundTimeline/useSoundTimeline.ts +511 -0
  500. package/studio/web/pages/VideoPage/components/StageDrawer/CompareVersions.tsx +111 -0
  501. package/studio/web/pages/VideoPage/components/StageDrawer/VersionCard.tsx +81 -0
  502. package/studio/web/pages/VideoPage/components/StageDrawer/VersionMedia.tsx +24 -0
  503. package/studio/web/pages/VideoPage/components/StageDrawer/VersionText.tsx +15 -0
  504. package/studio/web/pages/VideoPage/components/StageDrawer/index.tsx +109 -0
  505. package/studio/web/pages/VideoPage/components/StageProcess.tsx +126 -0
  506. package/studio/web/pages/VideoPage/components/StageResult.tsx +69 -0
  507. package/studio/web/pages/VideoPage/components/SwapReference.tsx +92 -0
  508. package/studio/web/pages/VideoPage/components/ThumbnailPanel.tsx +252 -0
  509. package/studio/web/pages/VideoPage/components/TimingPanel.tsx +89 -0
  510. package/studio/web/pages/VideoPage/components/VideoPlayer.tsx +18 -0
  511. package/studio/web/pages/VideoPage/components/VideoSkeleton.tsx +50 -0
  512. package/studio/web/pages/VideoPage/components/VideoVoiceInfo.tsx +33 -0
  513. package/studio/web/pages/VideoPage/components/VideoVoicePicker.tsx +165 -0
  514. package/studio/web/pages/VideoPage/components/VoicePauseBanner.tsx +56 -0
  515. package/studio/web/pages/VideoPage/components/WithLogo.tsx +10 -0
  516. package/studio/web/pages/VideoPage/index.tsx +295 -0
  517. package/studio/web/pages/VideosPage/components/PublishedOn.tsx +85 -0
  518. package/studio/web/pages/VideosPage/components/ServicesPanel.tsx +81 -0
  519. package/studio/web/pages/VideosPage/components/SessionsPanel.tsx +62 -0
  520. package/studio/web/pages/VideosPage/components/VideoListSkeleton.tsx +25 -0
  521. package/studio/web/pages/VideosPage/components/VideoRow.tsx +122 -0
  522. package/studio/web/pages/VideosPage/index.tsx +134 -0
  523. package/studio/web/pages/VoicePage/index.tsx +28 -0
  524. package/studio/web/router.tsx +201 -0
  525. package/studio/web/styles/base/elements.css +55 -0
  526. package/studio/web/styles/base/utilities.css +25 -0
  527. package/studio/web/styles/components/badge.css +33 -0
  528. package/studio/web/styles/components/claude-running.css +27 -0
  529. package/studio/web/styles/components/claude-session.css +212 -0
  530. package/studio/web/styles/components/claude-walking.css +92 -0
  531. package/studio/web/styles/components/clone-voice-save.css +136 -0
  532. package/studio/web/styles/components/clone-voice.css +379 -0
  533. package/studio/web/styles/components/controls.css +70 -0
  534. package/studio/web/styles/components/data-and-image.css +54 -0
  535. package/studio/web/styles/components/forms.css +132 -0
  536. package/studio/web/styles/components/human-banner.css +99 -0
  537. package/studio/web/styles/components/lightbox.css +50 -0
  538. package/studio/web/styles/components/markdown.css +68 -0
  539. package/studio/web/styles/components/modal.css +70 -0
  540. package/studio/web/styles/components/omni-cards.css +105 -0
  541. package/studio/web/styles/components/omni.css +859 -0
  542. package/studio/web/styles/components/omnichat.css +538 -0
  543. package/studio/web/styles/components/panel.css +115 -0
  544. package/studio/web/styles/components/platform-card.css +140 -0
  545. package/studio/web/styles/components/provider-card.css +132 -0
  546. package/studio/web/styles/components/queue.css +185 -0
  547. package/studio/web/styles/components/reference-actions.css +133 -0
  548. package/studio/web/styles/components/reference-picker.css +146 -0
  549. package/studio/web/styles/components/results-drawer.css +224 -0
  550. package/studio/web/styles/components/segmented.css +115 -0
  551. package/studio/web/styles/components/side-panel-tab.css +23 -0
  552. package/studio/web/styles/components/status-signals.css +66 -0
  553. package/studio/web/styles/components/stepper.css +208 -0
  554. package/studio/web/styles/components/table.css +19 -0
  555. package/studio/web/styles/components/tabs.css +24 -0
  556. package/studio/web/styles/components/ui/accordion.css +71 -0
  557. package/studio/web/styles/components/ui/chart.css +162 -0
  558. package/studio/web/styles/components/ui/checkbox.css +37 -0
  559. package/studio/web/styles/components/ui/date-picker.css +153 -0
  560. package/studio/web/styles/components/ui/select.css +110 -0
  561. package/studio/web/styles/components/ui/skeleton.css +25 -0
  562. package/studio/web/styles/components/ui/slider.css +81 -0
  563. package/studio/web/styles/components/ui/switch.css +41 -0
  564. package/studio/web/styles/components/ui/tooltip.css +24 -0
  565. package/studio/web/styles/components/voice-carousel.css +255 -0
  566. package/studio/web/styles/components/voice-editor.css +179 -0
  567. package/studio/web/styles/components/voice-grid.css +56 -0
  568. package/studio/web/styles/components/voice-profiles.css +192 -0
  569. package/studio/web/styles/design-system.md +136 -0
  570. package/studio/web/styles/index.css +116 -0
  571. package/studio/web/styles/layout/page.css +41 -0
  572. package/studio/web/styles/layout/sidebar-groups.css +39 -0
  573. package/studio/web/styles/layout/sidebar.css +111 -0
  574. package/studio/web/styles/pages/agent.css +26 -0
  575. package/studio/web/styles/pages/analytics/dashboard.css +614 -0
  576. package/studio/web/styles/pages/analytics/insights.css +48 -0
  577. package/studio/web/styles/pages/getting-started.css +166 -0
  578. package/studio/web/styles/pages/new-video/form.css +32 -0
  579. package/studio/web/styles/pages/not-found.css +59 -0
  580. package/studio/web/styles/pages/references.css +204 -0
  581. package/studio/web/styles/pages/schedule/calendar.css +541 -0
  582. package/studio/web/styles/pages/schedule/chip-states.css +60 -0
  583. package/studio/web/styles/pages/settings/models.css +72 -0
  584. package/studio/web/styles/pages/settings/shell.css +361 -0
  585. package/studio/web/styles/pages/settings/usage.css +63 -0
  586. package/studio/web/styles/pages/studio-offline.css +105 -0
  587. package/studio/web/styles/pages/video/caption-controls.css +194 -0
  588. package/studio/web/styles/pages/video/captions-grid.css +70 -0
  589. package/studio/web/styles/pages/video/captions.css +79 -0
  590. package/studio/web/styles/pages/video/editor-chat.css +103 -0
  591. package/studio/web/styles/pages/video/export.css +50 -0
  592. package/studio/web/styles/pages/video/frames.css +29 -0
  593. package/studio/web/styles/pages/video/fullscreen-stage.css +400 -0
  594. package/studio/web/styles/pages/video/instagram-carousel.css +309 -0
  595. package/studio/web/styles/pages/video/layout.css +285 -0
  596. package/studio/web/styles/pages/video/narration.css +138 -0
  597. package/studio/web/styles/pages/video/preview-overview.css +11 -0
  598. package/studio/web/styles/pages/video/processing-notice.css +34 -0
  599. package/studio/web/styles/pages/video/publish-when.css +76 -0
  600. package/studio/web/styles/pages/video/publish.css +97 -0
  601. package/studio/web/styles/pages/video/result.css +96 -0
  602. package/studio/web/styles/pages/video/scenes.css +167 -0
  603. package/studio/web/styles/pages/video/sound-timeline.css +672 -0
  604. package/studio/web/styles/pages/video/sound-toolbar.css +149 -0
  605. package/studio/web/styles/pages/video/take-player.css +100 -0
  606. package/studio/web/styles/pages/video/thumbnail.css +157 -0
  607. package/studio/web/styles/pages/video/timeline.css +117 -0
  608. package/studio/web/styles/pages/video/voice-picker.css +14 -0
  609. package/studio/web/styles/pages/video-list/active-row.css +27 -0
  610. package/studio/web/styles/pages/video-list/card-link.css +49 -0
  611. package/studio/web/styles/pages/video-list/list.css +86 -0
  612. package/studio/web/styles/theme/identity/details.css +204 -0
  613. package/studio/web/styles/theme/identity/shell.css +249 -0
  614. package/studio/web/styles/theme/identity/surfaces.css +183 -0
  615. package/studio/web/styles/theme/identity/titles-and-buttons.css +120 -0
  616. package/studio/web/styles/theme/no-borders/blocks.css +208 -0
  617. package/studio/web/styles/theme/no-borders/controls.css +256 -0
  618. package/studio/web/styles/tokens.css +245 -0
  619. package/studio/web/types/api.ts +2 -0
  620. package/studio/web/types/assets.d.ts +9 -0
  621. package/templates/brief.md +27 -0
  622. package/templates/captions.html +204 -0
  623. package/templates/carousel-composition.md +47 -0
  624. package/templates/carousel-script.md +60 -0
  625. package/templates/components/voiceavatar/README.md +87 -0
  626. package/templates/components/voiceavatar/demo.html +50 -0
  627. package/templates/components/voiceavatar/voiceavatar.js +415 -0
  628. package/templates/motion.md +80 -0
  629. package/templates/playbook.md +43 -0
  630. package/templates/reference.md +123 -0
  631. package/templates/scene.html +112 -0
  632. package/templates/scenes.example.json +96 -0
  633. package/templates/script.md +63 -0
  634. package/templates/slide.html +71 -0
  635. package/templates/wireframe.html +91 -0
  636. package/tools/analysis.mjs +300 -0
  637. package/tools/approval.mjs +442 -0
  638. package/tools/assemble.mjs +942 -0
  639. package/tools/build-motion.mjs +437 -0
  640. package/tools/captions.mjs +246 -0
  641. package/tools/carousel.mjs +558 -0
  642. package/tools/compose.mjs +307 -0
  643. package/tools/cuts.mjs +74 -0
  644. package/tools/editor.mjs +419 -0
  645. package/tools/epidemic-capture.js +54 -0
  646. package/tools/fanout.mjs +69 -0
  647. package/tools/history.mjs +70 -0
  648. package/tools/history.py +61 -0
  649. package/tools/job-queue.mjs +180 -0
  650. package/tools/job_queue.py +430 -0
  651. package/tools/lib/agents.mjs +412 -0
  652. package/tools/lib/channel.mjs +399 -0
  653. package/tools/lib/claude-settings.mjs +67 -0
  654. package/tools/lib/cli.mjs +9 -0
  655. package/tools/lib/fanout.mjs +234 -0
  656. package/tools/lib/http.mjs +94 -0
  657. package/tools/lib/index.js +14 -0
  658. package/tools/lib/mcp-server.mjs +69 -0
  659. package/tools/lib/metrics/metrics.mjs +204 -0
  660. package/tools/lib/narration.mjs +15 -0
  661. package/tools/lib/oauth-client.mjs +295 -0
  662. package/tools/lib/omnichat/config.mjs +139 -0
  663. package/tools/lib/omnichat/errors.mjs +42 -0
  664. package/tools/lib/omnichat/extract.mjs +82 -0
  665. package/tools/lib/omnichat/gate.mjs +151 -0
  666. package/tools/lib/omnichat/manual.mjs +166 -0
  667. package/tools/lib/omnichat/match.mjs +78 -0
  668. package/tools/lib/omnichat/pass.mjs +393 -0
  669. package/tools/lib/omnichat/record.mjs +208 -0
  670. package/tools/lib/omnichat/text.mjs +315 -0
  671. package/tools/lib/omnichat/webhook.mjs +166 -0
  672. package/tools/lib/pairing.mjs +99 -0
  673. package/tools/lib/paths.mjs +41 -0
  674. package/tools/lib/platforms/instagram.mjs +469 -0
  675. package/tools/lib/platforms/tiktok.mjs +343 -0
  676. package/tools/lib/platforms/youtube.mjs +228 -0
  677. package/tools/lib/publish/publish.mjs +244 -0
  678. package/tools/lib/schedule/schedule.mjs +191 -0
  679. package/tools/lib/service.mjs +134 -0
  680. package/tools/lib/skill-client.mjs +126 -0
  681. package/tools/lib/skills-release.mjs +196 -0
  682. package/tools/lib/testing.mjs +52 -0
  683. package/tools/lib/up.mjs +187 -0
  684. package/tools/metrics.mjs +415 -0
  685. package/tools/models.mjs +134 -0
  686. package/tools/narrate.mjs +257 -0
  687. package/tools/omni.mjs +298 -0
  688. package/tools/omni_paths.py +12 -0
  689. package/tools/omnichat.mjs +1577 -0
  690. package/tools/omnivideo.py +1122 -0
  691. package/tools/package.mjs +130 -0
  692. package/tools/platforms.mjs +236 -0
  693. package/tools/premiere.mjs +533 -0
  694. package/tools/publish.mjs +1496 -0
  695. package/tools/reference.mjs +1408 -0
  696. package/tools/render.mjs +426 -0
  697. package/tools/runner.mjs +156 -0
  698. package/tools/setup.mjs +466 -0
  699. package/tools/skills-release.mjs +93 -0
  700. package/tools/sound.mjs +1323 -0
  701. package/tools/soundtrack.mjs +217 -0
  702. package/tools/thumbnail.mjs +271 -0
  703. package/tools/timing.mjs +108 -0
  704. package/tools/usage.py +628 -0
  705. package/tools/voice-envelope.mjs +185 -0
  706. package/tools/voice.py +448 -0
  707. package/tools/voice_sample.py +75 -0
  708. package/tools/wireframe.mjs +230 -0
@@ -0,0 +1,305 @@
1
+ # Omnichat on Instagram comments
2
+
3
+ Like ManyChat: whoever comments the keyword on a post gets a DM with the link
4
+ (the comment's *private reply*) and a public reply on the comment ("te mandei
5
+ no direct"). Tool: `tools/omnichat.mjs`. Phase 1, no webhook: the launchd
6
+ agent polls the API every minute.
7
+
8
+ It works for any post in the account's feed: Reel, carousel (`CAROUSEL_ALBUM`) and
9
+ photo (`IMAGE`). Each rule lives in a target folder, the one with the
10
+ `publication.json` holding the media id:
11
+
12
+ | target | folder | who publishes |
13
+ |---|---|---|
14
+ | a video's Reel | `videos/<slug>/` | `publish.mjs` |
15
+ | the carousel of the same content | `videos/<slug>/carousel/` | `publish.mjs` (carousel); `published` enables the rule |
16
+ | a post from outside omnivideo (Reel, carousel or photo made by hand) | `.omnichat/posts/<code>/` | you; `post <link>` creates the folder |
17
+
18
+ The carousel finds the term in the slides' text, in the caption and in
19
+ `carousel/script.md`, and the link in the caption, in its script, in what the
20
+ content's video says (`publication.json`, `brief.md`, `source/request.md`) and,
21
+ last, in the video's omnichat rule: the carousel of a video that already delivers a
22
+ link delivers the same one.
23
+
24
+ ## First: the token with the new permissions
25
+
26
+ The `publish.mjs` token only publishes. Omnichat uses the same token, with two
27
+ more permissions:
28
+
29
+ 1. At [developers.facebook.com/apps](https://developers.facebook.com/apps) → your app →
30
+ Instagram → **API setup with Instagram login**, under "Generate access tokens",
31
+ generate the token again checking `instagram_business_basic`,
32
+ `instagram_business_content_publish`, `instagram_business_manage_comments` and
33
+ `instagram_business_manage_messages`.
34
+ 2. `node tools/publish.mjs auth instagram <token>` (or paste it in the studio under
35
+ Configurações (Settings) → Plataformas (Platforms) → Instagram).
36
+ 3. In the Instagram app, if the DM fails with a permission error: Configurações →
37
+ Mensagens e respostas ao story → Controles de mensagens → **Ferramentas
38
+ conectadas** → allow access to messages (Settings → Messages and story replies →
39
+ Message controls → Connected tools).
40
+ 4. `node tools/omnichat.mjs status` checks it: "comentários: lidos pela API"
41
+ (comments: read through the API).
42
+
43
+ 5. **The app must be published (Live).** In development mode the API hides the
44
+ comments of anyone without a role in the app: the Reel shows `comments_count` 23
45
+ and the list comes back empty, with no error. Publishing only asks for the
46
+ privacy policy URL (App settings → Basic; any public page of yours works, like a
47
+ gist with the policy) and the dashboard's Publish button. No App Review:
48
+ Standard Access is enough for your own account. The webhook (replies within
49
+ seconds, phase 3) is what requires Advanced Access and Business Verification.
50
+
51
+ ## Usage
52
+
53
+ ```bash
54
+ # an omnivideo video (the Reel) and its carousel
55
+ node tools/omnichat.mjs rule videos/<slug> --keyword QUERO --link https://…
56
+ node tools/omnichat.mjs rule videos/<slug>/carousel --keyword QUERO --link https://…
57
+ # a post that is already live (from outside omnivideo, or just the link): Reel, carousel or photo
58
+ node tools/omnichat.mjs post https://www.instagram.com/p/<code>/ --keyword QUERO --link https://…
59
+ node tools/omnichat.mjs post https://www.instagram.com/reel/<code>/ --keyword QUERO --link https://…
60
+
61
+ node tools/omnichat.mjs run <dir> --dry-run # reads the comments and shows what it would send
62
+ node tools/omnichat.mjs enable <dir> --confirm # starts replying
63
+ node tools/omnichat.mjs agent install # the agent that checks every minute
64
+ node tools/omnichat.mjs log <dir>
65
+ node tools/omnichat.mjs comments <dir> # reads the post now: who has no DM
66
+ node tools/omnichat.mjs delete <dir> <id> [<id>…] --confirm # deletes comments on Instagram (no way back)
67
+ node tools/omnichat.mjs send <dir> <id> [<id>…] --confirm # the rule's DM to these, by hand
68
+ node tools/omnichat.mjs send <dir> <id> --public-reply "Valeu, @{username}!" --confirm # with a written reply
69
+ node tools/omnichat.mjs send <dir> <id> --public-reply-only --public-reply "…" --confirm # comment only, no DM
70
+ ```
71
+
72
+ **By hand: who has no DM.** In the rule panel (Omnichat page), "Buscar comentários
73
+ sem DM" (Find comments without a DM) reads the Reel right away, without waiting
74
+ for the agent, and lists who didn't get the DM: what the rule skipped (you already
75
+ replied, Claude read it as something else), what it didn't catch (the comment
76
+ didn't have the term, or was read before the rule changed), what is queued and
77
+ what failed. Mark who gets it ("Marcar os que pedem" (Mark the ones asking) picks
78
+ the ones that trigger) and send: the saved rule's DM goes out, with the comment
79
+ reply if checked, even to people who didn't comment the term. It goes outward, in
80
+ the account's name: it asks for confirmation, and Claude only sends when the user
81
+ asks (`--confirm`). It runs at the agent's pace (`pause_between_s`, up to
82
+ `max_per_pass` at a time), with its lock and respecting the account pause. The
83
+ record stores `manual: true`, and nobody gets it twice. A comment older than 7
84
+ days gets no DM.
85
+
86
+ The comment reply can be written right there (`--public-reply`; `{username}`
87
+ becomes the @; the old `{usuario}` placeholder is still accepted): if empty, one
88
+ of the rule's replies goes, picked at random. The selector chooses what goes: DM
89
+ and reply, only the DM, or only the comment reply (`--public-reply-only`). Comment
90
+ only, without a DM, the reply must be written (the rule's ones say "te mandei no
91
+ direct"), needs no rule and also works for people past the 7 days. It goes once,
92
+ without going back to the queue; a comment that wasn't in the record yet enters
93
+ as skipped ("respondido à mão no comentário" (replied by hand on the comment)),
94
+ like the ones you answer through the app.
95
+
96
+ **The comments as a chat.** The panel ("Comentários") shows the post like Instagram's
97
+ thread: each comment is a ghost card (username, text, "Responder", status badges,
98
+ the DM icon and "Apagar") with its replies nested inside, the account's own
99
+ included (`comments --json` returns them as `thread`, next to `items`, the ones
100
+ without a DM). The account's loose comment that starts with `@person` nests under
101
+ that person's comment. The DM icon opens what was sent to that person; `dm.text`
102
+ is stored when the DM goes out, and older records show the rule's text as it
103
+ reads today (`exact: false`). "Sem DM" filters who didn't get it, and only there
104
+ do the checkboxes and the batch appear.
105
+
106
+ "Responder" opens the field right below the card (Esc closes, ⌘↩ replies). Writing
107
+ and clicking Responder is the request, without the batch confirmation; "Mandar
108
+ também a DM da regra" (Also send the rule's DM) adds the DM (within the 7 days,
109
+ with a rule). A reply can be answered too: Instagram threads two levels, so it goes
110
+ to the top-level comment with the person's `@` in front (and never with a DM).
111
+
112
+ "Apagar" (Delete) removes the comment on Instagram (`DELETE /{comment-id}`: a
113
+ person's on the post, or the account's own reply) and has no way back, so the card
114
+ asks a second click first; `delete --confirm` is that click. A comment the agent
115
+ still had queued stops waiting (`skipped`, "apagado por você"); with the cloud
116
+ answering, the cloud's record isn't touched from here.
117
+ Liking comments isn't available: the Instagram API with Instagram login (the one
118
+ the token uses, `graph.instagram.com`) doesn't like comments.
119
+
120
+ **On publish.** With `omnichat.instagram.enable_on_publish: true` (Configurações →
121
+ Publicação → Omnichat → Ao publicar (Settings → Publishing → Omnichat → On
122
+ publish); it is the permanent approval to reply without the enable click),
123
+ `publish.mjs` calls `omnichat.mjs published` right after the Reel (or the carousel:
124
+ `published videos/<slug>/carousel`) goes up, now or through the schedule, and its
125
+ rule turns on by itself:
126
+
127
+ - with no rule, it is born from the narration's ask: the word after "comenta" in
128
+ a sentence that promises to send something ("Comenta REA que eu te mando o
129
+ link", "Comente MUSE que te envio") becomes the term, with the generic phrases,
130
+ the default DM and replies, and the link found in the video (description,
131
+ `brief.md` or `source/request.md`; social networks don't count);
132
+ - a draft, saved and never enabled, is enabled as it is.
133
+
134
+ It doesn't enable a rule you disabled (the Publicar (Publish) stage switch turned
135
+ off before uploading records `disabled_at`, even without a rule), an any-comment
136
+ rule, or one that isn't complete: without the link the DM uses, it stays saved and
137
+ disabled, and the publish output says what is missing. With no ask in the
138
+ narration, nothing is enabled.
139
+
140
+ **The DM quotes the Reel.** The private reply is a single message and the Reel is
141
+ not a message in the conversation, so it can't be replied to the way a message
142
+ is. With `quote_post` in the rule, the Reel's link goes on the DM's first line:
143
+ Instagram shows its card on top and the message reads as a reply to it. `{post}`
144
+ in the DM puts the link somewhere else; a DM that already has the Reel's link
145
+ doesn't repeat it. A new rule follows `omnichat.instagram.quote_post` (on by
146
+ default); each rule changes it in the Omnichat panel or with `--quote-post` and
147
+ `--no-quote-post`. Meta says the private reply already carries a link to the
148
+ commented post: the card is so the reader gets it at once.
149
+
150
+ `post` finds the media by link among the account's posts. If it belongs to an
151
+ omnivideo video, it uses the video's folder; otherwise it creates
152
+ `.omnichat/posts/<code>/`, which works in every command that takes `videos/<slug>`.
153
+
154
+ **Retroactive.** Enabled on a post that is already running, the rule reads the
155
+ comments from the last 7 days and replies to the ones that trigger, 15 per pass.
156
+ Older than 7 days gets no DM: Meta only accepts the private reply up to 7 days
157
+ after the comment. A comment the account already answered by hand is skipped:
158
+ both a reply nested under the comment and a separate comment from the account
159
+ with `@someone` count (that's how the app usually replies).
160
+ `--answered send --answered-if "não consegui"` sends only to people you replied to
161
+ saying they couldn't. A DM sent by hand, with nothing on the comment, is invisible
162
+ to the API: that person gets it again.
163
+
164
+ ## Button and "only if you follow me" (phase 2)
165
+
166
+ Like ManyChat: the comment's DM comes with a button, and the link only goes out when the person taps it.
167
+ With `require_follow`, the tap also checks that the person follows the account; if not, they get
168
+ "follow and tap again" with a new button, and the link goes out on the next tap once they follow.
169
+
170
+ ```bash
171
+ node tools/omnichat.mjs rule videos/<slug> --button # link only after the tap
172
+ node tools/omnichat.mjs rule videos/<slug> --require-follow # and only for followers
173
+ node tools/omnichat.mjs rule videos/<slug> --button-label "Quero o link" --opening-dm "Oi, @{username}! Toca aqui 👇" \
174
+ --not-following-dm "Segue o perfil e volta no botão 👀" --retry-label "Pronto, já sigo!"
175
+ node tools/omnichat.mjs rule videos/<slug> --skip-dm "@{username}, aqui está! {link}" # message of "Receber sem seguir"
176
+ node tools/omnichat.mjs test videos/<slug> "QUERO" # shows opener and delivery
177
+ ```
178
+
179
+ Also in the studio, in the rule panel ("Entregar só quando a pessoa tocar num botão").
180
+
181
+ **What happens**
182
+
183
+ 1. The agent sends the private reply as a *button template* (text up to 640 characters, button title up to 20),
184
+ with the payload `omc1|<media>|<comment>`. If Instagram refuses the template for a private reply, the same
185
+ ask goes as quick replies (`gate.via` in the record says which). The public reply goes as always.
186
+ 2. The tap arrives at the webhook (`messaging_postbacks`, or `messages` for a quick reply) and opens the 24 h window.
187
+ 3. With `require_follow`, `GET /<igsid>?fields=is_user_follow_business` decides. A follower gets the rule's DM
188
+ (`dm`, with `{link}`); anyone else gets `not_following_dm` with the `retry_label` button.
189
+ Whoever taps again still without following gets a second button, `skip_label` ("Receber sem seguir"), and that
190
+ one delivers the link with `skip_dm` instead of `dm` (default: thanks and a soft ask to follow next time; same
191
+ `{username}`, `{link}`, `link_button` and `quote_post` rules as `dm`). `follow_skip: false` removes the button.
192
+ 4. The record keeps `gate`: `awaiting_tap` → `awaiting_follow` → `delivered`, the taps and the handled event ids
193
+ (`mids`, so an event Meta repeats never sends twice). A tap handled with an error answers 500 and Meta delivers it again.
194
+
195
+ **Likes cannot be a criterion.** The API does not say who liked a post (ManyChat can't either). What can be checked:
196
+ commented (the trigger), follows the account, tapped the button.
197
+
198
+ **One-time setup**
199
+
200
+ ```bash
201
+ node tools/omnichat.mjs webhook setup # creates INSTAGRAM_WEBHOOK_VERIFY_TOKEN and prints the steps
202
+ # put the app secret in .env: INSTAGRAM_APP_SECRET (Instagram → API setup with Instagram login → App secret)
203
+ node tools/omnichat.mjs webhook serve # listens on 127.0.0.1:5434/webhook
204
+ cloudflared tunnel --url http://127.0.0.1:5434 # the public HTTPS URL Meta needs
205
+ # Meta panel → Instagram → API setup → Configure webhooks: Callback URL = <tunnel>/webhook, Verify token = the one setup printed,
206
+ # fields messages and messaging_postbacks
207
+ node tools/omnichat.mjs webhook subscribe # signs the account up to those fields
208
+ node tools/omnichat.mjs webhook status
209
+ ```
210
+
211
+ - The app must be Live. To receive events from people with no role in the app, `instagram_business_manage_messages`
212
+ needs Advanced Access (and Business Verification); in development mode only the app's testers can tap.
213
+ - Meta checks the callback URL (handshake with the verify token) and signs every event with the app secret
214
+ (`X-Hub-Signature-256`); the server refuses anything unsigned.
215
+ - The tap is answered by the cloud Worker: the same `handleWebhook` (`tools/lib/omnichat/webhook.mjs`)
216
+ runs in a function with its own storage; `tools/lib/omnichat/gate.mjs` has the decision and the sends.
217
+ - The record is written under the pass lock, so the agent and the tap don't overwrite each other.
218
+ - Start `webhook serve` and the tunnel only when the user asks; enabling the rule is what authorizes the replies.
219
+
220
+ ## In the cloud (Cloudflare Worker + Postgres)
221
+
222
+ The same Worker also collects the Reel metrics every hour (`metrics.mjs cloud push`, `cloud.metrics`) and
223
+ publishes the schedule (`publish.mjs cloud push`, `cloud.schedule`, reference/publish.md). Which jobs it
224
+ does is the config's `cloud`: `{ url, omnichat, metrics, schedule }` (the old `omnichat.cloud` still reads).
225
+
226
+ `cloud/omnichat` is a Worker that answers instead of this machine, with the same core
227
+ (`tools/lib/omnichat`): Meta's webhook (taps, and new comments, which run that post's pass in seconds),
228
+ a fallback pass every 30 min, the token renewal once a day and an API for the CLI and the studio. The
229
+ rule and the record keep the shape of the local files, in Postgres (Neon, over HTTP). No LLM there: an
230
+ uncertain comment waits for a pass with Claude (the CLI).
231
+
232
+ ```bash
233
+ # once: accounts and the Worker
234
+ cd cloud/omnichat && bun install
235
+ npx wrangler login
236
+ psql "$DATABASE_URL" -f schema.sql # the Neon database (neon.com, free plan)
237
+ npx wrangler secret put DATABASE_URL # and TOKEN_KEY, SYNC_SECRET,
238
+ # INSTAGRAM_APP_SECRET, INSTAGRAM_WEBHOOK_VERIFY_TOKEN
239
+ npx wrangler deploy # prints https://omnichat.<you>.workers.dev
240
+ # here: cloud.url in the config, OMNICHAT_CLOUD_SECRET (= SYNC_SECRET) in .env
241
+ node tools/omnichat.mjs cloud push --records # config, account, rules and the local records
242
+ node tools/omnichat.mjs cloud status
243
+ # the switch: Meta's Callback URL → https://omnichat.<you>.workers.dev/webhook (fields messages,
244
+ # messaging_postbacks and comments), then cloud.omnichat: true, agent uninstall, stop webhook serve
245
+ ```
246
+
247
+ - With `owns: false` the cloud only receives; this machine keeps answering. With `owns: true` every saved
248
+ rule goes up on its own, `log`, `status` and `comments` read the cloud's record (mirrored into
249
+ omnichat-record.json for the studio), `send` goes through the cloud, `retry` is refused and the local
250
+ agent stops.
251
+ - Never both answering: two records would each think the other's DM was never sent.
252
+ - The free plans shape it: Neon stays asleep without traffic (a query every minute would burn its
253
+ 100 compute-hours), so the webhook drives and the cron is every 30 min. The Worker gets 10 ms of CPU
254
+ and 50 subrequests per run, so a cloud pass sends at most 5 DMs and reads 3 comment pages (the rest
255
+ on the next one). Workers Paid ($5/month) lifts both if a post gets more than that.
256
+ - `node cloud/omnichat/dev-local.mjs` runs the Worker here over an in-memory Postgres, and
257
+ `OMNICHAT_CLOUD_URL=http://127.0.0.1:8787 OMNICHAT_CLOUD_SECRET=dev` points the CLI at it.
258
+ `cd cloud/omnichat && bun run test` tests it against PGlite.
259
+
260
+ ## Generic phrases and context
261
+
262
+ Besides the keyword, generic phrases (`omnichat.instagram.generic_phrases` in the
263
+ config: "quero", "eu quero", "me manda", "manda", "me envia", "envia", "me passa",
264
+ "link") also trigger, by default. With context:
265
+
266
+ - a comment that is only the ask, with at most the filler words of `filler_words`
267
+ ("sim", "pfv", "o link", "no direct", emoji…), sends right away: "eu quero!!",
268
+ "me manda o link pfv", "quero no direct 🙏";
269
+ - an ask in the middle of a sentence is uncertain, and the agent (Claude with `context_model`,
270
+ on the agent accounts in rotation, `tools/lib/agents.mjs`) reads the comment with the post caption, the link and the
271
+ rule's `offer` before deciding: "eu quero que faça sol hoje" and "manda mais
272
+ vídeo assim" don't send; "quero muito testar isso" sends. When in doubt, it
273
+ doesn't send. What doesn't send stays in the log as `skipped`, with the reason.
274
+
275
+ `--no-generic` leaves the rule with only the keyword. `test <dir> "comment"`
276
+ shows the decision, including Claude's.
277
+
278
+ ## Meta rules that shape the flow
279
+
280
+ - One private reply per comment, up to 7 days after it.
281
+ - For people who don't follow the account, the DM lands in **Message requests**.
282
+ People who closed their messages may not get it: the comment becomes `failed`
283
+ and the public reply doesn't go (without a DM, "te mandei no direct" would be a
284
+ lie).
285
+ - The conversation only continues if the person replies or taps a button: that opens the 24 h
286
+ window. The button and "only if you follow me" are in the next section (they need the
287
+ messaging webhook); email collection is not built yet.
288
+ - DM text up to 1,000 bytes.
289
+
290
+ ## Files
291
+
292
+ - `omnichat.json` (in the video's, the carousel's or the post's folder): the rule. Born disabled.
293
+ - `omnichat-record.json`: what the tool did with each comment (`queued`,
294
+ `retry`, `done`, `failed`, `skipped`), the last one seen and the next check. With
295
+ more than 1,000 new comments at once (20 pages of 50), the pass stores where it
296
+ stopped (`resume`, without the token) and the next one continues from there,
297
+ without skipping the older ones.
298
+ - `.omnichat/`: the pass lock, `pause.json` (a Meta limit, a block or a token
299
+ without permission pause the account for `rate_limit_pause_min`) and the agent log.
300
+
301
+ Pace and limits in `omnichat.instagram` in the config: `interval_min` (post
302
+ younger than 48 h, first week, after), `max_per_pass`, `pause_between_s`,
303
+ `attempts`, `default_dm`, `default_public_replies`, `enable_on_publish`,
304
+ `quote_post`. `retry <dir>` puts back in the queue whatever failed without a DM
305
+ (after swapping the token, for example).
@@ -0,0 +1,91 @@
1
+ # Premiere through MCP
2
+
3
+ ## The pieces
4
+
5
+ | piece | where |
6
+ |---|---|
7
+ | MCP server | npm package `adobe-premiere-pro-mcp` v1.2.8, global on node v24.7.0 |
8
+ | Premiere extension | CEP `MCP Bridge (CEP)`, in `~/Library/Application Support/Adobe/CEP/extensions/MCPBridgeCEP` |
9
+ | channel between the two | files in `/tmp/premiere-mcp-bridge` (command, response, heartbeat) — no network port |
10
+ | registration in Claude Code | `premiere-pro` (user scope), stdio |
11
+ | omnivideo client | `tools/premiere.mjs` |
12
+
13
+ Premiere 2026 (26.5.2). The extension opens in Window → Extensions (Legacy) →
14
+ MCP Bridge (CEP). CEP debug mode (`PlayerDebugMode`) is on for CSXS versions
15
+ 10 to 12.
16
+
17
+ ## How to call it
18
+
19
+ The server announces only 5 tools: `verify_premiere_connection`,
20
+ `list_sequences`, `search_tools`, `get_tool_schema`, `invoke_tool`. The other
21
+ 278 live in the catalog: search with `search_tools`, read the schema with
22
+ `get_tool_schema` and call with `invoke_tool { name, arguments }`.
23
+ `tools/premiere.mjs` takes this detour by itself.
24
+
25
+ Tools from the expanded catalog respond `{ success, tool, data: {…} }`; the
26
+ domain tools return the fields directly. The client flattens both shapes.
27
+
28
+ ## Tools omnivideo uses
29
+
30
+ | tool | arguments | returns |
31
+ |---|---|---|
32
+ | `verify_premiere_connection` | — | `status`, `premiere.version`, `project`, `activeSequence` |
33
+ | `create_bin` | `name`, `parentBinName?` | `binId` |
34
+ | `import_media` | `filePath` (absolute) | the item `id` — **ignores `binName`** |
35
+ | `move_item_to_bin` | `projectItemId`, `targetBinId` | |
36
+ | `create_sequence_from_clips` | `name`, `projectItemIds[]` | `sequenceId` |
37
+ | `add_to_timeline` | `sequenceId`, `projectItemId`, `trackIndex`, `time`, `insertMode` | audio goes to the audio track at that index |
38
+ | `create_caption_track` | `sequenceId`, `projectItemId` (imported SRT), `startTime` | |
39
+ | `add_marker` | `sequenceId`, `time`, `name`, `color?`, `duration?` | |
40
+ | `list_sequence_tracks` | `sequenceId` | clips per track with `startTime`/`endTime` |
41
+ | `export_frame` | `sequenceId`, `time`, `outputPath`, `format` | PNG of the frame, captions included |
42
+ | `export_sequence` | `sequenceId`, `outputPath`, `presetPath` | **depends on Media Encoder** |
43
+ | `execute_extendscript` | `script` | runs the text as is; a top-level `return` works |
44
+ | `delete_sequence`, `delete_project_item` | id | to clean up what omnivideo itself created |
45
+
46
+ ## Confirmed limitations
47
+
48
+ - **No caption styling.** No action changes font, color, size or position.
49
+ - **No caption reading.** `read_sequence_captions` always returns zero; it is a
50
+ limitation of Premiere's scripting DOM. To check, use `export_frame`.
51
+ - **`create_sequence` ignores fps** and requires a `.sqpreset`. Use
52
+ `create_sequence_from_clips` (inherits everything from the first clip) or
53
+ `duplicate_sequence` with `clearContents: true`.
54
+ - **Buggy Media Encoder detection (v1.2.8).** On macOS the server only accepts
55
+ `/Applications/Adobe Media Encoder <year>.app` directly in `/Applications`
56
+ (`findInstalledMediaEncoder` in `dist/bridge/index.js`), but Adobe installs
57
+ it at `/Applications/Adobe Media Encoder 2026/Adobe Media Encoder 2026.app`.
58
+ Result: `MEDIA_ENCODER_NOT_INSTALLED` with AME installed, and nothing reaches
59
+ Premiere. `export_sequence` and `add_to_render_queue` go through the same check.
60
+ **Workaround in use** (approved by the user on 2026-10-12): a symbolic link
61
+ `/Applications/Adobe Media Encoder 2026.app` → the app inside the folder. To
62
+ undo: `rm "/Applications/Adobe Media Encoder 2026.app"`. When switching AME
63
+ versions, redo the link to the new folder.
64
+ - **Export:** `export_sequence` and `add_to_render_queue` queue in Adobe Media
65
+ Encoder (installed since 2026-10-12, but see the bug above). The alternative is
66
+ `sequence.exportAsMediaDirect(out, preset, app.encoder.ENCODE_ENTIRE)` via
67
+ `execute_extendscript`, which the server only allows with explicit approval.
68
+ - **Timeout:** the server waits 60 s for a response and the panel 45 s. A long
69
+ operation (export) keeps running in Premiere after that; check by the result.
70
+ - **`readOnly: true`** in the `verify_premiere_connection` response only says
71
+ that this check changes nothing. The other actions write normally.
72
+
73
+ ## Export preset
74
+
75
+ `/Applications/Adobe Premiere Pro 2026/Adobe Premiere Pro 2026.app/Contents/MediaIO/systempresets/4E49434B_48323634/01 - Match Source - High bitrate.epr`
76
+
77
+ The `4E49434B_48323634` folder is the H.264 one. The `01 - …` file is "Match
78
+ Source – Adaptive High Bitrate", Premiere's default.
79
+
80
+ ## Bridge down
81
+
82
+ `bridge_unavailable` with Premiere open: the panel stopped writing the
83
+ heartbeat (`/tmp/premiere-mcp-bridge/bridge-heartbeat.json`). Call
84
+ `verify_premiere_connection` **once** and, if it doesn't come back, ask the
85
+ user to close and reopen the panel.
86
+
87
+ `verify_premiere_connection` (and `premiere.mjs status`) **opens Premiere** if
88
+ it is closed: `launchIfNeeded` defaults to on. To only check,
89
+ `premiere.mjs call verify_premiere_connection '{"launchIfNeeded": false}'`, or
90
+ read the heartbeat: `t` in milliseconds; stale for more than 2.5 s means the
91
+ bridge is down. That is how the studio sees the bridge.