@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.
- package/.env.example +41 -0
- package/README.md +2 -2
- package/bin/omni.mjs +18 -0
- package/docs/onboarding/clone-voice.png +0 -0
- package/docs/onboarding/getting-started.png +0 -0
- package/docs/onboarding/new-video.png +0 -0
- package/docs/onboarding/providers.png +0 -0
- package/docs/onboarding/publish.png +0 -0
- package/docs/onboarding/references.png +0 -0
- package/docs/onboarding.md +212 -0
- package/omnivideo.config.example.json +437 -0
- package/package.json +40 -4
- package/reference/captions.md +156 -0
- package/reference/carousel-contract.md +91 -0
- package/reference/cloud.md +96 -0
- package/reference/learnings.md +792 -0
- package/reference/omnichat.md +305 -0
- package/reference/premiere-mcp.md +91 -0
- package/reference/publish.md +305 -0
- package/reference/scenes-contract.md +109 -0
- package/reference/studio.md +666 -0
- package/reference/voicestudio.md +81 -0
- package/reference/writing-for-voice.md +67 -0
- package/requirements.txt +3 -0
- package/studio/api/app.ts +87 -0
- package/studio/api/lib/errors.ts +33 -0
- package/studio/api/lib/files.ts +41 -0
- package/studio/api/lib/hono.ts +9 -0
- package/studio/api/lib/result.ts +14 -0
- package/studio/api/lib/validate.ts +31 -0
- package/studio/api/lib/video.ts +10 -0
- package/studio/api/middleware/json-charset.ts +11 -0
- package/studio/api/middleware/local-only.ts +32 -0
- package/studio/api/middleware/no-timeout.ts +10 -0
- package/studio/api/routes/admin.ts +18 -0
- package/studio/api/routes/agent-cascade.ts +100 -0
- package/studio/api/routes/agent-history.ts +23 -0
- package/studio/api/routes/agent.ts +162 -0
- package/studio/api/routes/analytics.ts +31 -0
- package/studio/api/routes/approval.ts +60 -0
- package/studio/api/routes/archive.ts +12 -0
- package/studio/api/routes/captions.ts +28 -0
- package/studio/api/routes/carousel.ts +38 -0
- package/studio/api/routes/clone.ts +27 -0
- package/studio/api/routes/create.ts +19 -0
- package/studio/api/routes/events.ts +11 -0
- package/studio/api/routes/export.ts +14 -0
- package/studio/api/routes/media.ts +30 -0
- package/studio/api/routes/omnichat.ts +113 -0
- package/studio/api/routes/onboarding.ts +14 -0
- package/studio/api/routes/publish.ts +40 -0
- package/studio/api/routes/queue.ts +14 -0
- package/studio/api/routes/references.ts +40 -0
- package/studio/api/routes/runner.ts +17 -0
- package/studio/api/routes/schedule.ts +47 -0
- package/studio/api/routes/services.ts +11 -0
- package/studio/api/routes/sessions.ts +27 -0
- package/studio/api/routes/settings.ts +102 -0
- package/studio/api/routes/sound.ts +45 -0
- package/studio/api/routes/thumbnail.ts +18 -0
- package/studio/api/routes/usage.ts +13 -0
- package/studio/api/routes/videos.ts +41 -0
- package/studio/api/routes/voices.ts +71 -0
- package/studio/api/services/admin.ts +113 -0
- package/studio/api/services/agent-cascade.ts +975 -0
- package/studio/api/services/agent-claude.ts +47 -0
- package/studio/api/services/agent-history.ts +103 -0
- package/studio/api/services/agent-persona.ts +77 -0
- package/studio/api/services/agent-tools.ts +2237 -0
- package/studio/api/services/agent-ui-tools.ts +259 -0
- package/studio/api/services/agent-wait.ts +32 -0
- package/studio/api/services/agent.ts +553 -0
- package/studio/api/services/analytics.ts +92 -0
- package/studio/api/services/approval.ts +134 -0
- package/studio/api/services/archive.ts +38 -0
- package/studio/api/services/captions.ts +268 -0
- package/studio/api/services/carousel.ts +206 -0
- package/studio/api/services/classify.ts +196 -0
- package/studio/api/services/clone-phrases.ts +75 -0
- package/studio/api/services/clone.ts +722 -0
- package/studio/api/services/create.ts +421 -0
- package/studio/api/services/events.ts +215 -0
- package/studio/api/services/media.ts +32 -0
- package/studio/api/services/omnichat.ts +624 -0
- package/studio/api/services/onboarding.ts +77 -0
- package/studio/api/services/publish.ts +287 -0
- package/studio/api/services/queue.ts +150 -0
- package/studio/api/services/references.ts +269 -0
- package/studio/api/services/root.ts +60 -0
- package/studio/api/services/services.ts +114 -0
- package/studio/api/services/sessions.ts +1007 -0
- package/studio/api/services/settings.ts +983 -0
- package/studio/api/services/sound.ts +311 -0
- package/studio/api/services/thumbnail.ts +133 -0
- package/studio/api/services/usage.ts +27 -0
- package/studio/api/services/videos.ts +418 -0
- package/studio/api/services/voice-pause.ts +98 -0
- package/studio/api/services/voices.ts +324 -0
- package/studio/runner/runner.ts +244 -0
- package/studio/shared/omni-actions.ts +68 -0
- package/studio/shared/omni-admin.ts +52 -0
- package/studio/shared/omni-farewell.ts +48 -0
- package/studio/shared/omni-hotword.ts +20 -0
- package/studio/shared/omni-screens.ts +228 -0
- package/studio/shared/schemas/admin.ts +15 -0
- package/studio/shared/schemas/agent-cascade.ts +58 -0
- package/studio/shared/schemas/agent-history.ts +73 -0
- package/studio/shared/schemas/agent.ts +50 -0
- package/studio/shared/schemas/analytics.ts +6 -0
- package/studio/shared/schemas/approval.ts +22 -0
- package/studio/shared/schemas/captions.ts +19 -0
- package/studio/shared/schemas/carousel.ts +26 -0
- package/studio/shared/schemas/clone.ts +40 -0
- package/studio/shared/schemas/common.ts +16 -0
- package/studio/shared/schemas/omnichat.ts +54 -0
- package/studio/shared/schemas/onboarding.ts +5 -0
- package/studio/shared/schemas/publish.ts +45 -0
- package/studio/shared/schemas/references.ts +20 -0
- package/studio/shared/schemas/settings.ts +82 -0
- package/studio/shared/schemas/sound.ts +22 -0
- package/studio/shared/schemas/videos.ts +38 -0
- package/studio/shared/schemas/voices.ts +23 -0
- package/studio/shared/types/api.ts +1290 -0
- package/studio/studio.ts +148 -0
- package/studio/tsconfig.json +15 -0
- package/studio/web/assets/logos/cartesia.svg +4 -0
- package/studio/web/assets/logos/elevenlabs.svg +12 -0
- package/studio/web/assets/logos/fish.svg +24 -0
- package/studio/web/assets/logos/omni-black.png +0 -0
- package/studio/web/assets/logos/omni-white.png +0 -0
- package/studio/web/assets/logos/voicestudio.svg +21 -0
- package/studio/web/components/AgentMark.tsx +7 -0
- package/studio/web/components/AgentWalking.tsx +11 -0
- package/studio/web/components/ApiKeyField.tsx +104 -0
- package/studio/web/components/AppShell.tsx +64 -0
- package/studio/web/components/ApprovalNotice.tsx +65 -0
- package/studio/web/components/AvatarGroupIcon.tsx +22 -0
- package/studio/web/components/AvatarNameField.tsx +86 -0
- package/studio/web/components/AvatarPicker.tsx +84 -0
- package/studio/web/components/BrandLogo.tsx +16 -0
- package/studio/web/components/CartesiaPlanSetting.tsx +90 -0
- package/studio/web/components/ClaudeWalking.tsx +32 -0
- package/studio/web/components/CloneVoiceDialog/GuidedScript.tsx +39 -0
- package/studio/web/components/CloneVoiceDialog/LanguageBar.tsx +37 -0
- package/studio/web/components/CloneVoiceDialog/LevelMeter.tsx +31 -0
- package/studio/web/components/CloneVoiceDialog/ProviderChoice.tsx +81 -0
- package/studio/web/components/CloneVoiceDialog/QualityPanel.tsx +62 -0
- package/studio/web/components/CloneVoiceDialog/RecordStep.tsx +50 -0
- package/studio/web/components/CloneVoiceDialog/RecorderBar.tsx +79 -0
- package/studio/web/components/CloneVoiceDialog/RedoSummary.tsx +54 -0
- package/studio/web/components/CloneVoiceDialog/SaveStep.tsx +91 -0
- package/studio/web/components/CloneVoiceDialog/SourceBar.tsx +30 -0
- package/studio/web/components/CloneVoiceDialog/index.tsx +141 -0
- package/studio/web/components/CloneVoiceDialog/types.ts +28 -0
- package/studio/web/components/CloneVoiceDialog/useCloneVoice.ts +528 -0
- package/studio/web/components/ConnectionSignals.tsx +51 -0
- package/studio/web/components/EditVoiceDialog/EditVoiceFooter.tsx +72 -0
- package/studio/web/components/EditVoiceDialog/ProviderCards.tsx +81 -0
- package/studio/web/components/EditVoiceDialog/index.tsx +256 -0
- package/studio/web/components/ErrorBanner.tsx +115 -0
- package/studio/web/components/FinishedTask.tsx +41 -0
- package/studio/web/components/FishModelSetting.tsx +69 -0
- package/studio/web/components/FishPriceSetting.tsx +44 -0
- package/studio/web/components/HumanBanner.tsx +64 -0
- package/studio/web/components/Lightbox.tsx +41 -0
- package/studio/web/components/LogStream.tsx +42 -0
- package/studio/web/components/Markdown.tsx +21 -0
- package/studio/web/components/MissingDmsPanel/BatchSend.tsx +137 -0
- package/studio/web/components/MissingDmsPanel/CommentCard.tsx +168 -0
- package/studio/web/components/MissingDmsPanel/CommentFeed.tsx +45 -0
- package/studio/web/components/MissingDmsPanel/DmBubble.tsx +38 -0
- package/studio/web/components/MissingDmsPanel/ReplyComposer.tsx +63 -0
- package/studio/web/components/MissingDmsPanel/index.tsx +98 -0
- package/studio/web/components/NotFound.tsx +48 -0
- package/studio/web/components/Omni/OmniAvatarPicker.tsx +92 -0
- package/studio/web/components/Omni/OmniCards.tsx +202 -0
- package/studio/web/components/Omni/OmniGlow.tsx +183 -0
- package/studio/web/components/Omni/OmniHistory.tsx +119 -0
- package/studio/web/components/Omni/OmniHotword.tsx +40 -0
- package/studio/web/components/Omni/OmniMicSelect.tsx +92 -0
- package/studio/web/components/Omni/OmniVoiceSample.tsx +81 -0
- package/studio/web/components/Omni/OmniWidget.tsx +743 -0
- package/studio/web/components/Omni/PendingActions.tsx +200 -0
- package/studio/web/components/Omni/Transcript.tsx +127 -0
- package/studio/web/components/OmnichatAccountStatus.tsx +87 -0
- package/studio/web/components/OmnichatRulePanel/RuleConfig.tsx +150 -0
- package/studio/web/components/OmnichatRulePanel/RuleDryRun.tsx +15 -0
- package/studio/web/components/OmnichatRulePanel/RuleEnableConfirm.tsx +42 -0
- package/studio/web/components/OmnichatRulePanel/RuleSkeleton.tsx +18 -0
- package/studio/web/components/OmnichatRulePanel/RuleStatus.tsx +55 -0
- package/studio/web/components/OmnichatRulePanel/index.tsx +115 -0
- package/studio/web/components/OmnichatRulePanel/rule-steps.ts +67 -0
- package/studio/web/components/OmnichatRulePanel/steps/MessageStep.tsx +91 -0
- package/studio/web/components/OmnichatRulePanel/steps/RepliesStep.tsx +201 -0
- package/studio/web/components/OmnichatRulePanel/steps/TriggerStep.tsx +76 -0
- package/studio/web/components/OmnichatRulePanel/steps/types.ts +11 -0
- package/studio/web/components/Palette.tsx +17 -0
- package/studio/web/components/PlatformCard.tsx +109 -0
- package/studio/web/components/PlatformIcon.tsx +19 -0
- package/studio/web/components/ProviderCard.tsx +80 -0
- package/studio/web/components/ProviderDetail.tsx +367 -0
- package/studio/web/components/ProviderLogo.tsx +20 -0
- package/studio/web/components/QueuePanel.tsx +77 -0
- package/studio/web/components/ReferenceActions.tsx +89 -0
- package/studio/web/components/ReferencePicker.tsx +136 -0
- package/studio/web/components/ResultMessage.tsx +7 -0
- package/studio/web/components/RuleForm.tsx +138 -0
- package/studio/web/components/RuleLog.tsx +151 -0
- package/studio/web/components/RunningTask.tsx +23 -0
- package/studio/web/components/SampleList.tsx +55 -0
- package/studio/web/components/SessionPanel.tsx +352 -0
- package/studio/web/components/SettingRow.tsx +14 -0
- package/studio/web/components/SettingsCategorySkeleton.tsx +25 -0
- package/studio/web/components/SidePanel.tsx +77 -0
- package/studio/web/components/Sidebar.tsx +289 -0
- package/studio/web/components/StageStepper.tsx +87 -0
- package/studio/web/components/StudioOffline.tsx +80 -0
- package/studio/web/components/TaskName.tsx +17 -0
- package/studio/web/components/TopBanners.tsx +30 -0
- package/studio/web/components/VideoOmnichatPanel.tsx +287 -0
- package/studio/web/components/VoiceAvatar.tsx +33 -0
- package/studio/web/components/VoiceCarousel.tsx +196 -0
- package/studio/web/components/VoiceCategory.tsx +9 -0
- package/studio/web/components/VoiceModal.tsx +39 -0
- package/studio/web/components/VoiceProfileCard.tsx +75 -0
- package/studio/web/components/VoiceProfilePicker.tsx +107 -0
- package/studio/web/components/VoiceProfilesSettings.tsx +150 -0
- package/studio/web/components/VoiceProviderCard.tsx +118 -0
- package/studio/web/components/VoiceProvidersCard.tsx +26 -0
- package/studio/web/components/WaitList.tsx +21 -0
- package/studio/web/components/icons.tsx +247 -0
- package/studio/web/components/ui/accordion.tsx +47 -0
- package/studio/web/components/ui/badge.tsx +18 -0
- package/studio/web/components/ui/calendar.tsx +43 -0
- package/studio/web/components/ui/chart.tsx +229 -0
- package/studio/web/components/ui/checkbox.tsx +26 -0
- package/studio/web/components/ui/cx.ts +2 -0
- package/studio/web/components/ui/date-time-picker.tsx +84 -0
- package/studio/web/components/ui/panel.tsx +23 -0
- package/studio/web/components/ui/picker.tsx +58 -0
- package/studio/web/components/ui/popover.tsx +24 -0
- package/studio/web/components/ui/select.tsx +89 -0
- package/studio/web/components/ui/skeleton.tsx +10 -0
- package/studio/web/components/ui/slider.tsx +68 -0
- package/studio/web/components/ui/switch.tsx +13 -0
- package/studio/web/components/ui/tooltip.tsx +59 -0
- package/studio/web/hooks/useAccounts.ts +27 -0
- package/studio/web/hooks/useAdmin.ts +12 -0
- package/studio/web/hooks/useAnalytics.ts +21 -0
- package/studio/web/hooks/useAvatarAudioReactive.ts +87 -0
- package/studio/web/hooks/useBrowserConnect.ts +48 -0
- package/studio/web/hooks/useClonePlan.ts +14 -0
- package/studio/web/hooks/useConnected.ts +7 -0
- package/studio/web/hooks/useLiveQuery.ts +29 -0
- package/studio/web/hooks/useMenuCollapsed.ts +32 -0
- package/studio/web/hooks/useMicDevices.ts +53 -0
- package/studio/web/hooks/useMissingDms.ts +211 -0
- package/studio/web/hooks/useMissingSetupSteps.ts +26 -0
- package/studio/web/hooks/useNow.ts +11 -0
- package/studio/web/hooks/useOmniAgent.ts +278 -0
- package/studio/web/hooks/useOmniClaude.ts +124 -0
- package/studio/web/hooks/useOmniDock.ts +142 -0
- package/studio/web/hooks/useOmniGreeting.ts +60 -0
- package/studio/web/hooks/useOmniHotword.ts +128 -0
- package/studio/web/hooks/useOmnichat.ts +26 -0
- package/studio/web/hooks/useOnboarding.ts +27 -0
- package/studio/web/hooks/usePost.ts +23 -0
- package/studio/web/hooks/useQueue.ts +10 -0
- package/studio/web/hooks/useReferences.ts +20 -0
- package/studio/web/hooks/useRuleEditor.ts +101 -0
- package/studio/web/hooks/useRunner.ts +24 -0
- package/studio/web/hooks/useSaveAction.ts +23 -0
- package/studio/web/hooks/useSchedule.ts +11 -0
- package/studio/web/hooks/useServices.ts +10 -0
- package/studio/web/hooks/useSessions.ts +15 -0
- package/studio/web/hooks/useSettings.ts +11 -0
- package/studio/web/hooks/useSettingsSection.ts +30 -0
- package/studio/web/hooks/useSidePanel.ts +23 -0
- package/studio/web/hooks/useSound.ts +30 -0
- package/studio/web/hooks/useUsage.ts +11 -0
- package/studio/web/hooks/useVideoVoice.ts +36 -0
- package/studio/web/hooks/useVideos.ts +21 -0
- package/studio/web/hooks/useVoiceProfilePreview.ts +52 -0
- package/studio/web/hooks/useVoiceProfiles.ts +7 -0
- package/studio/web/hooks/useVoiceRunning.ts +10 -0
- package/studio/web/hooks/useVoiceStudioClosed.ts +8 -0
- package/studio/web/index.html +19 -0
- package/studio/web/lib/agent.ts +7 -0
- package/studio/web/lib/alerts.ts +210 -0
- package/studio/web/lib/analytics-metrics.ts +351 -0
- package/studio/web/lib/api.ts +70 -0
- package/studio/web/lib/audio.ts +39 -0
- package/studio/web/lib/avatars.ts +41 -0
- package/studio/web/lib/calendar.ts +218 -0
- package/studio/web/lib/caption-position.ts +249 -0
- package/studio/web/lib/carousel.ts +24 -0
- package/studio/web/lib/chime.ts +42 -0
- package/studio/web/lib/clone-voice.ts +55 -0
- package/studio/web/lib/export.ts +11 -0
- package/studio/web/lib/files.ts +8 -0
- package/studio/web/lib/format.ts +93 -0
- package/studio/web/lib/media.ts +29 -0
- package/studio/web/lib/mic-device.ts +72 -0
- package/studio/web/lib/missing-dms.ts +70 -0
- package/studio/web/lib/omni-cards.ts +42 -0
- package/studio/web/lib/omni-cascade.ts +1067 -0
- package/studio/web/lib/omni-greeting-audio.ts +24 -0
- package/studio/web/lib/omni-hotword.ts +231 -0
- package/studio/web/lib/omni-panel.ts +67 -0
- package/studio/web/lib/omni-realtime.ts +811 -0
- package/studio/web/lib/omni-ui.ts +402 -0
- package/studio/web/lib/omni-wait.ts +174 -0
- package/studio/web/lib/omnichat-api.ts +44 -0
- package/studio/web/lib/orb.ts +270 -0
- package/studio/web/lib/pcm-recorder.ts +115 -0
- package/studio/web/lib/platforms.ts +17 -0
- package/studio/web/lib/providers.ts +27 -0
- package/studio/web/lib/publish-draft.ts +52 -0
- package/studio/web/lib/publish-settings.ts +81 -0
- package/studio/web/lib/query-client.ts +122 -0
- package/studio/web/lib/references.ts +13 -0
- package/studio/web/lib/services.ts +40 -0
- package/studio/web/lib/sessions.ts +103 -0
- package/studio/web/lib/settings-categories.ts +58 -0
- package/studio/web/lib/sound-audio.ts +33 -0
- package/studio/web/lib/sound-timeline.ts +291 -0
- package/studio/web/lib/sse.ts +86 -0
- package/studio/web/lib/stage-history.ts +141 -0
- package/studio/web/lib/stages.ts +344 -0
- package/studio/web/lib/studio-offline.ts +60 -0
- package/studio/web/lib/upload.ts +24 -0
- package/studio/web/lib/video-tabs.ts +118 -0
- package/studio/web/lib/voice-profile-draft.ts +34 -0
- package/studio/web/lib/voice-profiles.ts +3 -0
- package/studio/web/main.tsx +14 -0
- package/studio/web/pages/AdminPage/index.tsx +123 -0
- package/studio/web/pages/AgentPage/components/Measurements.tsx +102 -0
- package/studio/web/pages/AgentPage/index.tsx +28 -0
- package/studio/web/pages/AnalyticsPage/components/About.tsx +52 -0
- package/studio/web/pages/AnalyticsPage/components/ChannelCards.tsx +106 -0
- package/studio/web/pages/AnalyticsPage/components/ChannelView.tsx +137 -0
- package/studio/web/pages/AnalyticsPage/components/CollectionStatus.tsx +46 -0
- package/studio/web/pages/AnalyticsPage/components/Comparison.tsx +68 -0
- package/studio/web/pages/AnalyticsPage/components/Diagnosis.tsx +50 -0
- package/studio/web/pages/AnalyticsPage/components/Highlights.tsx +49 -0
- package/studio/web/pages/AnalyticsPage/components/Hint.tsx +11 -0
- package/studio/web/pages/AnalyticsPage/components/HookVsBody.tsx +100 -0
- package/studio/web/pages/AnalyticsPage/components/HourlyWave.tsx +133 -0
- package/studio/web/pages/AnalyticsPage/components/Insights.tsx +70 -0
- package/studio/web/pages/AnalyticsPage/components/MetricCard.tsx +46 -0
- package/studio/web/pages/AnalyticsPage/components/PlanSection.tsx +40 -0
- package/studio/web/pages/AnalyticsPage/components/ProgressionChart.tsx +155 -0
- package/studio/web/pages/AnalyticsPage/components/ReelBarsChart.tsx +154 -0
- package/studio/web/pages/AnalyticsPage/components/ReelThumb.tsx +19 -0
- package/studio/web/pages/AnalyticsPage/components/ReelView.tsx +290 -0
- package/studio/web/pages/AnalyticsPage/components/ReelsTable.tsx +269 -0
- package/studio/web/pages/AnalyticsPage/components/RequestWithFocus.tsx +38 -0
- package/studio/web/pages/AnalyticsPage/components/SegmentedControl.tsx +35 -0
- package/studio/web/pages/AnalyticsPage/components/VsMedian.tsx +31 -0
- package/studio/web/pages/AnalyticsPage/index.tsx +17 -0
- package/studio/web/pages/GettingStartedPage/index.tsx +174 -0
- package/studio/web/pages/NewVideoPage/components/DeliverablesPicker.tsx +62 -0
- package/studio/web/pages/NewVideoPage/components/FormatPicker.tsx +33 -0
- package/studio/web/pages/NewVideoPage/index.tsx +133 -0
- package/studio/web/pages/NotFoundPage/index.tsx +9 -0
- package/studio/web/pages/OmnichatPage/components/NewFromLink.tsx +59 -0
- package/studio/web/pages/OmnichatPage/components/RuleListItem.tsx +64 -0
- package/studio/web/pages/OmnichatPage/components/RulePreview.tsx +14 -0
- package/studio/web/pages/OmnichatPage/components/RuleView.tsx +88 -0
- package/studio/web/pages/OmnichatPage/index.tsx +153 -0
- package/studio/web/pages/QueuePage/index.tsx +22 -0
- package/studio/web/pages/ReferencePage/components/ReferenceTexts.tsx +131 -0
- package/studio/web/pages/ReferencePage/index.tsx +216 -0
- package/studio/web/pages/ReferencesPage/components/NewReferenceForm.tsx +150 -0
- package/studio/web/pages/ReferencesPage/components/ReferenceCard.tsx +42 -0
- package/studio/web/pages/ReferencesPage/components/ReferenceGridSkeleton.tsx +31 -0
- package/studio/web/pages/ReferencesPage/index.tsx +67 -0
- package/studio/web/pages/SchedulePage/components/CalendarSkeleton.tsx +18 -0
- package/studio/web/pages/SchedulePage/components/DayView.tsx +177 -0
- package/studio/web/pages/SchedulePage/components/HourPicker.tsx +103 -0
- package/studio/web/pages/SchedulePage/components/MonthDayCell.tsx +111 -0
- package/studio/web/pages/SchedulePage/components/MonthView.tsx +47 -0
- package/studio/web/pages/SchedulePage/components/PlatformIcons.tsx +12 -0
- package/studio/web/pages/SchedulePage/components/PostThumb.tsx +15 -0
- package/studio/web/pages/SchedulePage/components/WeekColumn.tsx +75 -0
- package/studio/web/pages/SchedulePage/components/WeekView.tsx +35 -0
- package/studio/web/pages/SchedulePage/index.tsx +285 -0
- package/studio/web/pages/SettingsPage/components/AgentAccounts.tsx +263 -0
- package/studio/web/pages/SettingsPage/components/AgentCategory.tsx +20 -0
- package/studio/web/pages/SettingsPage/components/ModelPicker.tsx +49 -0
- package/studio/web/pages/SettingsPage/components/ModelsSettings.tsx +138 -0
- package/studio/web/pages/SettingsPage/components/PlatformsCategory.tsx +23 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/AccountStatus.tsx +29 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/AutoPublishPanel.tsx +90 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/BrowserConnect.tsx +62 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/CheckField.tsx +19 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/InstagramPanel.tsx +113 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/OmnichatSettingsPanel.tsx +146 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/SaveBar.tsx +33 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/SchedulePanel.tsx +132 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/SettingsCard.tsx +47 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/SettingsCardGroup.tsx +19 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/TextPanel.tsx +55 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/TiktokPanel.tsx +123 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/YoutubePanel.tsx +100 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/badges.tsx +15 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/index.tsx +40 -0
- package/studio/web/pages/SettingsPage/components/PublishingCategory/types.ts +10 -0
- package/studio/web/pages/SettingsPage/components/UsageCategory.tsx +389 -0
- package/studio/web/pages/SettingsPage/components/VoiceProvidersCategory.tsx +97 -0
- package/studio/web/pages/SettingsPage/index.tsx +85 -0
- package/studio/web/pages/VideoPage/components/AudioPlayer.tsx +113 -0
- package/studio/web/pages/VideoPage/components/CaptionPositionEditor/AxisField.tsx +50 -0
- package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionList.tsx +56 -0
- package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionListItem.tsx +92 -0
- package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionMargins.tsx +57 -0
- package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionStyleFields.tsx +70 -0
- package/studio/web/pages/VideoPage/components/CaptionPositionEditor/CaptionTextForm.tsx +87 -0
- package/studio/web/pages/VideoPage/components/CaptionPositionEditor/ColorField.tsx +37 -0
- package/studio/web/pages/VideoPage/components/CaptionPositionEditor/MarginField.tsx +59 -0
- package/studio/web/pages/VideoPage/components/CaptionPositionEditor/NumberField.tsx +57 -0
- package/studio/web/pages/VideoPage/components/CaptionPositionEditor/PositionControls.tsx +140 -0
- package/studio/web/pages/VideoPage/components/CaptionPositionEditor/captionEditor.ts +215 -0
- package/studio/web/pages/VideoPage/components/CaptionPositionEditor/useCaptionPosition.ts +154 -0
- package/studio/web/pages/VideoPage/components/CarouselChangeRequest.tsx +72 -0
- package/studio/web/pages/VideoPage/components/CarouselCompositionStage.tsx +80 -0
- package/studio/web/pages/VideoPage/components/CarouselCreate.tsx +63 -0
- package/studio/web/pages/VideoPage/components/CarouselMissing.tsx +19 -0
- package/studio/web/pages/VideoPage/components/CarouselPublishStage.tsx +173 -0
- package/studio/web/pages/VideoPage/components/CarouselScriptStage.tsx +82 -0
- package/studio/web/pages/VideoPage/components/CarouselSlideCard.tsx +49 -0
- package/studio/web/pages/VideoPage/components/CarouselViewer.tsx +55 -0
- package/studio/web/pages/VideoPage/components/ChangedVoices.tsx +53 -0
- package/studio/web/pages/VideoPage/components/CompositionStage.tsx +78 -0
- package/studio/web/pages/VideoPage/components/CoverPicker.tsx +32 -0
- package/studio/web/pages/VideoPage/components/EditorStage.tsx +53 -0
- package/studio/web/pages/VideoPage/components/LineTakes.tsx +160 -0
- package/studio/web/pages/VideoPage/components/LineTextEditor.tsx +124 -0
- package/studio/web/pages/VideoPage/components/LineVoicePicker.tsx +37 -0
- package/studio/web/pages/VideoPage/components/MediaImage.tsx +25 -0
- package/studio/web/pages/VideoPage/components/MotionScriptStage.tsx +39 -0
- package/studio/web/pages/VideoPage/components/NarrationStage.tsx +70 -0
- package/studio/web/pages/VideoPage/components/PublishForm.tsx +387 -0
- package/studio/web/pages/VideoPage/components/PublishStage.tsx +76 -0
- package/studio/web/pages/VideoPage/components/PublishText.tsx +149 -0
- package/studio/web/pages/VideoPage/components/ScenesApprovalPanel.tsx +278 -0
- package/studio/web/pages/VideoPage/components/ScheduledInfo.tsx +72 -0
- package/studio/web/pages/VideoPage/components/ScriptApprovalPanel.tsx +189 -0
- package/studio/web/pages/VideoPage/components/ScriptStage.tsx +17 -0
- package/studio/web/pages/VideoPage/components/SequencePlayer.tsx +146 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/AddSound.tsx +117 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/AreaSelection.tsx +74 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/BedPanel.tsx +94 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/BedRow.tsx +45 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/CaptionOverlay.tsx +44 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/CaptionSaveBar.tsx +32 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/CaptionsPanel.tsx +22 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/ClipBlock.tsx +111 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/ClipPanel.tsx +76 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/CutsPanel.tsx +44 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/EditorTabBar.tsx +73 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/EffectChoice.tsx +46 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/EffectItem.tsx +89 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/EffectPanel.tsx +232 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/EffectsRow.tsx +21 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/Lane.tsx +39 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/MarkerRow.tsx +40 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/MuteButton.tsx +36 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/NumberInput.tsx +37 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/PlanWarnings.tsx +19 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/PlayerResizeHandle.tsx +50 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/PreviewControls.tsx +51 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/SceneRow.tsx +54 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/SettingsPanel.tsx +65 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/SoundLibrary.tsx +99 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/SoundPreview.tsx +82 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/SpeedPanel.tsx +128 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineDock.tsx +56 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineFooter.tsx +26 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineSkeleton.tsx +21 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineToolbar.tsx +160 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/TimelineTracks.tsx +121 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/TrackSidebar.tsx +30 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/VoiceRow.tsx +53 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/Waveform.tsx +97 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/clipActions.ts +50 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/effectActions.ts +161 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/index.tsx +161 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/timelineGeometry.ts +45 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/types.ts +43 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/useAutosave.ts +107 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/useEditorShortcuts.ts +168 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/useFitHeight.ts +40 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/useFollowPlayhead.ts +21 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/useListenMix.ts +43 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/usePlayback.ts +231 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/usePlayerWidth.ts +27 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/useSoundData.ts +124 -0
- package/studio/web/pages/VideoPage/components/SoundTimeline/useSoundTimeline.ts +511 -0
- package/studio/web/pages/VideoPage/components/StageDrawer/CompareVersions.tsx +111 -0
- package/studio/web/pages/VideoPage/components/StageDrawer/VersionCard.tsx +81 -0
- package/studio/web/pages/VideoPage/components/StageDrawer/VersionMedia.tsx +24 -0
- package/studio/web/pages/VideoPage/components/StageDrawer/VersionText.tsx +15 -0
- package/studio/web/pages/VideoPage/components/StageDrawer/index.tsx +109 -0
- package/studio/web/pages/VideoPage/components/StageProcess.tsx +126 -0
- package/studio/web/pages/VideoPage/components/StageResult.tsx +69 -0
- package/studio/web/pages/VideoPage/components/SwapReference.tsx +92 -0
- package/studio/web/pages/VideoPage/components/ThumbnailPanel.tsx +252 -0
- package/studio/web/pages/VideoPage/components/TimingPanel.tsx +89 -0
- package/studio/web/pages/VideoPage/components/VideoPlayer.tsx +18 -0
- package/studio/web/pages/VideoPage/components/VideoSkeleton.tsx +50 -0
- package/studio/web/pages/VideoPage/components/VideoVoiceInfo.tsx +33 -0
- package/studio/web/pages/VideoPage/components/VideoVoicePicker.tsx +165 -0
- package/studio/web/pages/VideoPage/components/VoicePauseBanner.tsx +56 -0
- package/studio/web/pages/VideoPage/components/WithLogo.tsx +10 -0
- package/studio/web/pages/VideoPage/index.tsx +295 -0
- package/studio/web/pages/VideosPage/components/PublishedOn.tsx +85 -0
- package/studio/web/pages/VideosPage/components/ServicesPanel.tsx +81 -0
- package/studio/web/pages/VideosPage/components/SessionsPanel.tsx +62 -0
- package/studio/web/pages/VideosPage/components/VideoListSkeleton.tsx +25 -0
- package/studio/web/pages/VideosPage/components/VideoRow.tsx +122 -0
- package/studio/web/pages/VideosPage/index.tsx +134 -0
- package/studio/web/pages/VoicePage/index.tsx +28 -0
- package/studio/web/router.tsx +201 -0
- package/studio/web/styles/base/elements.css +55 -0
- package/studio/web/styles/base/utilities.css +25 -0
- package/studio/web/styles/components/badge.css +33 -0
- package/studio/web/styles/components/claude-running.css +27 -0
- package/studio/web/styles/components/claude-session.css +212 -0
- package/studio/web/styles/components/claude-walking.css +92 -0
- package/studio/web/styles/components/clone-voice-save.css +136 -0
- package/studio/web/styles/components/clone-voice.css +379 -0
- package/studio/web/styles/components/controls.css +70 -0
- package/studio/web/styles/components/data-and-image.css +54 -0
- package/studio/web/styles/components/forms.css +132 -0
- package/studio/web/styles/components/human-banner.css +99 -0
- package/studio/web/styles/components/lightbox.css +50 -0
- package/studio/web/styles/components/markdown.css +68 -0
- package/studio/web/styles/components/modal.css +70 -0
- package/studio/web/styles/components/omni-cards.css +105 -0
- package/studio/web/styles/components/omni.css +859 -0
- package/studio/web/styles/components/omnichat.css +538 -0
- package/studio/web/styles/components/panel.css +115 -0
- package/studio/web/styles/components/platform-card.css +140 -0
- package/studio/web/styles/components/provider-card.css +132 -0
- package/studio/web/styles/components/queue.css +185 -0
- package/studio/web/styles/components/reference-actions.css +133 -0
- package/studio/web/styles/components/reference-picker.css +146 -0
- package/studio/web/styles/components/results-drawer.css +224 -0
- package/studio/web/styles/components/segmented.css +115 -0
- package/studio/web/styles/components/side-panel-tab.css +23 -0
- package/studio/web/styles/components/status-signals.css +66 -0
- package/studio/web/styles/components/stepper.css +208 -0
- package/studio/web/styles/components/table.css +19 -0
- package/studio/web/styles/components/tabs.css +24 -0
- package/studio/web/styles/components/ui/accordion.css +71 -0
- package/studio/web/styles/components/ui/chart.css +162 -0
- package/studio/web/styles/components/ui/checkbox.css +37 -0
- package/studio/web/styles/components/ui/date-picker.css +153 -0
- package/studio/web/styles/components/ui/select.css +110 -0
- package/studio/web/styles/components/ui/skeleton.css +25 -0
- package/studio/web/styles/components/ui/slider.css +81 -0
- package/studio/web/styles/components/ui/switch.css +41 -0
- package/studio/web/styles/components/ui/tooltip.css +24 -0
- package/studio/web/styles/components/voice-carousel.css +255 -0
- package/studio/web/styles/components/voice-editor.css +179 -0
- package/studio/web/styles/components/voice-grid.css +56 -0
- package/studio/web/styles/components/voice-profiles.css +192 -0
- package/studio/web/styles/design-system.md +136 -0
- package/studio/web/styles/index.css +116 -0
- package/studio/web/styles/layout/page.css +41 -0
- package/studio/web/styles/layout/sidebar-groups.css +39 -0
- package/studio/web/styles/layout/sidebar.css +111 -0
- package/studio/web/styles/pages/agent.css +26 -0
- package/studio/web/styles/pages/analytics/dashboard.css +614 -0
- package/studio/web/styles/pages/analytics/insights.css +48 -0
- package/studio/web/styles/pages/getting-started.css +166 -0
- package/studio/web/styles/pages/new-video/form.css +32 -0
- package/studio/web/styles/pages/not-found.css +59 -0
- package/studio/web/styles/pages/references.css +204 -0
- package/studio/web/styles/pages/schedule/calendar.css +541 -0
- package/studio/web/styles/pages/schedule/chip-states.css +60 -0
- package/studio/web/styles/pages/settings/models.css +72 -0
- package/studio/web/styles/pages/settings/shell.css +361 -0
- package/studio/web/styles/pages/settings/usage.css +63 -0
- package/studio/web/styles/pages/studio-offline.css +105 -0
- package/studio/web/styles/pages/video/caption-controls.css +194 -0
- package/studio/web/styles/pages/video/captions-grid.css +70 -0
- package/studio/web/styles/pages/video/captions.css +79 -0
- package/studio/web/styles/pages/video/editor-chat.css +103 -0
- package/studio/web/styles/pages/video/export.css +50 -0
- package/studio/web/styles/pages/video/frames.css +29 -0
- package/studio/web/styles/pages/video/fullscreen-stage.css +400 -0
- package/studio/web/styles/pages/video/instagram-carousel.css +309 -0
- package/studio/web/styles/pages/video/layout.css +285 -0
- package/studio/web/styles/pages/video/narration.css +138 -0
- package/studio/web/styles/pages/video/preview-overview.css +11 -0
- package/studio/web/styles/pages/video/processing-notice.css +34 -0
- package/studio/web/styles/pages/video/publish-when.css +76 -0
- package/studio/web/styles/pages/video/publish.css +97 -0
- package/studio/web/styles/pages/video/result.css +96 -0
- package/studio/web/styles/pages/video/scenes.css +167 -0
- package/studio/web/styles/pages/video/sound-timeline.css +672 -0
- package/studio/web/styles/pages/video/sound-toolbar.css +149 -0
- package/studio/web/styles/pages/video/take-player.css +100 -0
- package/studio/web/styles/pages/video/thumbnail.css +157 -0
- package/studio/web/styles/pages/video/timeline.css +117 -0
- package/studio/web/styles/pages/video/voice-picker.css +14 -0
- package/studio/web/styles/pages/video-list/active-row.css +27 -0
- package/studio/web/styles/pages/video-list/card-link.css +49 -0
- package/studio/web/styles/pages/video-list/list.css +86 -0
- package/studio/web/styles/theme/identity/details.css +204 -0
- package/studio/web/styles/theme/identity/shell.css +249 -0
- package/studio/web/styles/theme/identity/surfaces.css +183 -0
- package/studio/web/styles/theme/identity/titles-and-buttons.css +120 -0
- package/studio/web/styles/theme/no-borders/blocks.css +208 -0
- package/studio/web/styles/theme/no-borders/controls.css +256 -0
- package/studio/web/styles/tokens.css +245 -0
- package/studio/web/types/api.ts +2 -0
- package/studio/web/types/assets.d.ts +9 -0
- package/templates/brief.md +27 -0
- package/templates/captions.html +204 -0
- package/templates/carousel-composition.md +47 -0
- package/templates/carousel-script.md +60 -0
- package/templates/components/voiceavatar/README.md +87 -0
- package/templates/components/voiceavatar/demo.html +50 -0
- package/templates/components/voiceavatar/voiceavatar.js +415 -0
- package/templates/motion.md +80 -0
- package/templates/playbook.md +43 -0
- package/templates/reference.md +123 -0
- package/templates/scene.html +112 -0
- package/templates/scenes.example.json +96 -0
- package/templates/script.md +63 -0
- package/templates/slide.html +71 -0
- package/templates/wireframe.html +91 -0
- package/tools/analysis.mjs +300 -0
- package/tools/approval.mjs +442 -0
- package/tools/assemble.mjs +942 -0
- package/tools/build-motion.mjs +437 -0
- package/tools/captions.mjs +246 -0
- package/tools/carousel.mjs +558 -0
- package/tools/compose.mjs +307 -0
- package/tools/cuts.mjs +74 -0
- package/tools/editor.mjs +419 -0
- package/tools/epidemic-capture.js +54 -0
- package/tools/fanout.mjs +69 -0
- package/tools/history.mjs +70 -0
- package/tools/history.py +61 -0
- package/tools/job-queue.mjs +180 -0
- package/tools/job_queue.py +430 -0
- package/tools/lib/agents.mjs +412 -0
- package/tools/lib/channel.mjs +399 -0
- package/tools/lib/claude-settings.mjs +67 -0
- package/tools/lib/cli.mjs +9 -0
- package/tools/lib/fanout.mjs +234 -0
- package/tools/lib/http.mjs +94 -0
- package/tools/lib/index.js +14 -0
- package/tools/lib/mcp-server.mjs +69 -0
- package/tools/lib/metrics/metrics.mjs +204 -0
- package/tools/lib/narration.mjs +15 -0
- package/tools/lib/oauth-client.mjs +295 -0
- package/tools/lib/omnichat/config.mjs +139 -0
- package/tools/lib/omnichat/errors.mjs +42 -0
- package/tools/lib/omnichat/extract.mjs +82 -0
- package/tools/lib/omnichat/gate.mjs +151 -0
- package/tools/lib/omnichat/manual.mjs +166 -0
- package/tools/lib/omnichat/match.mjs +78 -0
- package/tools/lib/omnichat/pass.mjs +393 -0
- package/tools/lib/omnichat/record.mjs +208 -0
- package/tools/lib/omnichat/text.mjs +315 -0
- package/tools/lib/omnichat/webhook.mjs +166 -0
- package/tools/lib/pairing.mjs +99 -0
- package/tools/lib/paths.mjs +41 -0
- package/tools/lib/platforms/instagram.mjs +469 -0
- package/tools/lib/platforms/tiktok.mjs +343 -0
- package/tools/lib/platforms/youtube.mjs +228 -0
- package/tools/lib/publish/publish.mjs +244 -0
- package/tools/lib/schedule/schedule.mjs +191 -0
- package/tools/lib/service.mjs +134 -0
- package/tools/lib/skill-client.mjs +126 -0
- package/tools/lib/skills-release.mjs +196 -0
- package/tools/lib/testing.mjs +52 -0
- package/tools/lib/up.mjs +187 -0
- package/tools/metrics.mjs +415 -0
- package/tools/models.mjs +134 -0
- package/tools/narrate.mjs +257 -0
- package/tools/omni.mjs +298 -0
- package/tools/omni_paths.py +12 -0
- package/tools/omnichat.mjs +1577 -0
- package/tools/omnivideo.py +1122 -0
- package/tools/package.mjs +130 -0
- package/tools/platforms.mjs +236 -0
- package/tools/premiere.mjs +533 -0
- package/tools/publish.mjs +1496 -0
- package/tools/reference.mjs +1408 -0
- package/tools/render.mjs +426 -0
- package/tools/runner.mjs +156 -0
- package/tools/setup.mjs +466 -0
- package/tools/skills-release.mjs +93 -0
- package/tools/sound.mjs +1323 -0
- package/tools/soundtrack.mjs +217 -0
- package/tools/thumbnail.mjs +271 -0
- package/tools/timing.mjs +108 -0
- package/tools/usage.py +628 -0
- package/tools/voice-envelope.mjs +185 -0
- package/tools/voice.py +448 -0
- package/tools/voice_sample.py +75 -0
- 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.
|