@adminide-stack/yantra-mobile 12.0.121 → 12.0.123
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/features/apps/appArt.js +1 -1
- package/lib/features/apps/appArt.js.map +1 -1
- package/lib/features/apps/mobileAppCatalog.js +15 -11
- package/lib/features/apps/mobileAppCatalog.js.map +1 -1
- package/lib/features/canvas/CanvasAgentChatPane.js +82 -20
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
- package/lib/features/canvas/CanvasBoardsGrid.js +291 -100
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js +105 -12
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
- package/lib/features/canvas/CanvasExperience.js +266 -68
- package/lib/features/canvas/CanvasExperience.js.map +1 -1
- package/lib/features/canvas/CanvasGeneratePanel.js +204 -66
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
- package/lib/features/canvas/CanvasLibrarySheet.js +31 -13
- package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
- package/lib/features/canvas/CanvasModelPicker.js +176 -0
- package/lib/features/canvas/CanvasModelPicker.js.map +1 -0
- package/lib/features/canvas/CanvasTasksPanel.js +325 -29
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasTemplatesPanel.js +5 -4
- package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
- package/lib/features/canvas/CanvasToolDock.js +137 -61
- package/lib/features/canvas/CanvasToolDock.js.map +1 -1
- package/lib/features/canvas/FrameExtractorExperience.js +33 -2
- package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
- package/lib/features/canvas/GeneratorReferenceSlots.js +197 -0
- package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -0
- package/lib/features/canvas/NativeCanvasViewer.js +89 -11
- package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
- package/lib/features/canvas/PromoContextFields.js +55 -2
- package/lib/features/canvas/PromoContextFields.js.map +1 -1
- package/lib/features/canvas/SetStudioExperience.js +323 -13
- package/lib/features/canvas/SetStudioExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditExperience.js +1 -53
- package/lib/features/canvas/VideoEditExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditorExperience.js +697 -506
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
- package/lib/features/canvas/VideoGeneratorExperience.js +22 -5
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
- package/lib/features/canvas/canvasAgentChat.js +125 -11
- package/lib/features/canvas/canvasAgentChat.js.map +1 -1
- package/lib/features/canvas/canvasCore.js +117 -12
- package/lib/features/canvas/canvasCore.js.map +1 -1
- package/lib/features/canvas/canvasEditOps.js +148 -111
- package/lib/features/canvas/canvasEditOps.js.map +1 -1
- package/lib/features/canvas/canvasTaskSync.js +235 -0
- package/lib/features/canvas/canvasTaskSync.js.map +1 -0
- package/lib/features/canvas/canvasTasks.js +98 -11
- package/lib/features/canvas/canvasTasks.js.map +1 -1
- package/lib/features/canvas/createTiles.js +247 -0
- package/lib/features/canvas/createTiles.js.map +1 -0
- package/lib/features/canvas/deepLinks.js +83 -0
- package/lib/features/canvas/deepLinks.js.map +1 -0
- package/lib/features/canvas/frameExtract.js +13 -1
- package/lib/features/canvas/frameExtract.js.map +1 -1
- package/lib/features/canvas/generationModels.js +36 -8
- package/lib/features/canvas/generationModels.js.map +1 -1
- package/lib/features/canvas/generatorCommands.js +106 -0
- package/lib/features/canvas/generatorCommands.js.map +1 -0
- package/lib/features/canvas/generatorReferences.js +82 -0
- package/lib/features/canvas/generatorReferences.js.map +1 -0
- package/lib/features/canvas/homeWork.js +74 -0
- package/lib/features/canvas/homeWork.js.map +1 -0
- package/lib/features/canvas/linksRpc.js +130 -0
- package/lib/features/canvas/linksRpc.js.map +1 -0
- package/lib/features/canvas/mediaRecheck.js +176 -0
- package/lib/features/canvas/mediaRecheck.js.map +1 -0
- package/lib/features/canvas/mediaUrls.js +258 -0
- package/lib/features/canvas/mediaUrls.js.map +1 -0
- package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
- package/lib/features/canvas/promoProjectImport.js +80 -13
- package/lib/features/canvas/promoProjectImport.js.map +1 -1
- package/lib/features/canvas/promoVideo.js +106 -15
- package/lib/features/canvas/promoVideo.js.map +1 -1
- package/lib/features/canvas/reframe.js +228 -0
- package/lib/features/canvas/reframe.js.map +1 -0
- package/lib/features/canvas/serverTasks.js +697 -0
- package/lib/features/canvas/serverTasks.js.map +1 -0
- package/lib/features/canvas/set/SetViewportWebView.js +207 -28
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
- package/lib/features/canvas/set/agent/prompt.js +66 -0
- package/lib/features/canvas/set/agent/prompt.js.map +1 -0
- package/lib/features/canvas/set/agent/setOps.js +203 -0
- package/lib/features/canvas/set/agent/setOps.js.map +1 -0
- package/lib/features/canvas/set/agent/setTurn.js +128 -0
- package/lib/features/canvas/set/agent/setTurn.js.map +1 -0
- package/lib/features/canvas/set/agent/snapshot.js +43 -0
- package/lib/features/canvas/set/agent/snapshot.js.map +1 -0
- package/lib/features/canvas/set/agent/tools.js +580 -0
- package/lib/features/canvas/set/agent/tools.js.map +1 -0
- package/lib/features/canvas/set/setProject.js +43 -4
- package/lib/features/canvas/set/setProject.js.map +1 -1
- package/lib/features/canvas/set/supplyLibrary.js +397 -0
- package/lib/features/canvas/set/supplyLibrary.js.map +1 -0
- package/lib/features/canvas/storageLibrary.js +113 -52
- package/lib/features/canvas/storageLibrary.js.map +1 -1
- package/lib/features/canvas/studioCatalog.js +15 -2
- package/lib/features/canvas/studioCatalog.js.map +1 -1
- package/lib/features/canvas/studioLooks.js +1 -8
- package/lib/features/canvas/studioLooks.js.map +1 -1
- package/lib/features/canvas/useBoardMediaRefresh.js +66 -0
- package/lib/features/canvas/useBoardMediaRefresh.js.map +1 -0
- package/lib/features/canvas/useMediaSource.js +84 -0
- package/lib/features/canvas/useMediaSource.js.map +1 -0
- package/lib/features/canvas/video3d.js +11 -10
- package/lib/features/canvas/video3d.js.map +1 -1
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +46 -0
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -0
- package/lib/features/canvas/videoEditor/ExportTaskCard.js +134 -0
- package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +45 -7
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/agentLoop.js +4 -2
- package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/attachments.js +304 -0
- package/lib/features/canvas/videoEditor/agent/attachments.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/brainClient.js +3 -2
- package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/cutTools.js +207 -7
- package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
- package/lib/features/canvas/videoEditor/blurBox.js +34 -0
- package/lib/features/canvas/videoEditor/blurBox.js.map +1 -0
- package/lib/features/canvas/videoEditor/compileTimeline.js +668 -0
- package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -0
- package/lib/features/canvas/videoEditor/editorModel.js +56 -22
- package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportPipeline.js +77 -0
- package/lib/features/canvas/videoEditor/exportPipeline.js.map +1 -0
- package/lib/features/canvas/videoEditor/exportRenderer.js +19 -12
- package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportTask.js +216 -0
- package/lib/features/canvas/videoEditor/exportTask.js.map +1 -0
- package/lib/features/canvas/videoEditor/formWidgets.js +142 -0
- package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -0
- package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +195 -0
- package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -0
- package/lib/features/canvas/videoEditor/produce/produceScenes.js +158 -0
- package/lib/features/canvas/videoEditor/produce/produceScenes.js.map +1 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js +17 -5
- package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/renderTimeline.js +207 -0
- package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -0
- package/lib/features/canvas/videoEditor/renewLinks.js +64 -0
- package/lib/features/canvas/videoEditor/renewLinks.js.map +1 -0
- package/lib/features/canvas/videoEditor/sceneLayers.js +101 -0
- package/lib/features/canvas/videoEditor/sceneLayers.js.map +1 -0
- package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +283 -0
- package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -0
- package/lib/features/canvas/videoEditor/tools/catalog.js +576 -0
- package/lib/features/canvas/videoEditor/tools/catalog.js.map +1 -0
- package/lib/features/canvas/videoEditor/videoProjectsStore.js +27 -3
- package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +29 -1
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +8 -4
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/codezenHandoff.js +108 -0
- package/lib/features/webbuilder/codezenHandoff.js.map +1 -0
- package/lib/features/webbuilder/workflow.js.map +1 -1
- package/lib/hooks/useChatApi.js +1 -2
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/screens/CanvasBoard/index.js +12 -1
- package/lib/screens/CanvasBoard/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/HomeSuggestions.js +3 -3
- package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
- package/lib/screens/WebBuilder/index.js +4 -2
- package/lib/screens/WebBuilder/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/index.js +29 -2
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +30 -6
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/package.json +3 -3
- /package/lib/assets/apps/{paper2poster.webp → poster.webp} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generationModels.js","sources":["../../../src/features/canvas/generationModels.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `hooks/useModelList` — LIST_MODELS shapes\n * and duration gating. An out-of-range `durationSeconds` comes back as a\n * blank video, not an error (web issue #305).\n */\n\nexport interface ModelInfo {\n id: string;\n label: string;\n provider: string;\n description: string;\n supportsImageInput?: boolean;\n supportsVideoInput?: boolean;\n supportsImageToVideo?: boolean;\n supportsEndFrame?: boolean;\n supportsAudio?: boolean;\n isFast?: boolean;\n type?: string;\n supportedDurationsSeconds?: number[];\n defaultDurationSeconds?: number;\n maxDurationSeconds?: number;\n aspectRatios?: string[];\n resolutions?: string[];\n}\n\nconst VEO_ASPECTS = ['16:9', '9:16'];\nconst VEO_RESOLUTIONS = ['720p', '1080p'];\nconst VEO_DURATIONS = [4, 6, 8];\n\nexport const STATIC_IMAGE_MODELS: ModelInfo[] = [\n { id: 'gemini-3.1-flash-image-preview', label: 'Gemini Efficient', provider: 'google', description: '' },\n];\n\n/** Offline fallback — mirrors canvas-surface `hooks/useModelList` STATIC_VIDEO_MODELS. */\nexport const STATIC_VIDEO_MODELS: ModelInfo[] = [\n {\n id: 'veo-3.1-generate-preview',\n label: 'Veo 3.1 Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n supportsEndFrame: true,\n supportsAudio: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3.1-fast-generate-preview',\n label: 'Veo 3.1 Fast Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n supportsEndFrame: true,\n isFast: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3-generate-preview',\n label: 'Veo 3 Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3-fast-generate-preview',\n label: 'Veo 3 Fast Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n isFast: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-2.0-generate-001',\n label: 'Veo 2.0',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: [5, 6, 7, 8],\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'bytedance/seedance-2.0',\n label: 'Seedance 2.0',\n provider: 'openrouter',\n description: '',\n supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n defaultDurationSeconds: 5,\n maxDurationSeconds: 15,\n supportsImageToVideo: true,\n },\n {\n id: 'bytedance/seedance-2.0-fast',\n label: 'Seedance 2.0 Fast',\n provider: 'openrouter',\n description: '',\n supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n defaultDurationSeconds: 5,\n maxDurationSeconds: 15,\n supportsImageToVideo: true,\n isFast: true,\n },\n];\n\nexport const AUDIO_PROMPT_TYPES = new Set(['tts', 'sfx', 'music']);\n\nfunction durationList(raw: unknown): number[] {\n if (!Array.isArray(raw)) return [];\n return raw.filter((s): s is number => typeof s === 'number' && Number.isFinite(s) && s > 0);\n}\n\nfunction duration(raw: unknown): number | undefined {\n return typeof raw === 'number' && Number.isFinite(raw) && raw > 0 ? raw : undefined;\n}\n\nexport function videoDurationOptions(model: ModelInfo | undefined): number[] {\n return model?.supportedDurationsSeconds ?? [];\n}\n\nexport function promptAudioModels(models: ModelInfo[]): ModelInfo[] {\n return models.filter((m) => !m.type || AUDIO_PROMPT_TYPES.has(m.type));\n}\n\nexport function normalizeModels(raw: unknown): ModelInfo[] {\n let payload: unknown = raw;\n if (typeof payload === 'string') {\n try {\n payload = JSON.parse(payload);\n } catch {\n return [];\n }\n }\n const record = payload && typeof payload === 'object' ? (payload as Record<string, unknown>) : {};\n const nested = record.data && typeof record.data === 'object' ? (record.data as Record<string, unknown>) : record;\n const list = Array.isArray(payload)\n ? payload\n : Array.isArray(nested.models)\n ? nested.models\n : Array.isArray(nested.data)\n ? nested.data\n : Array.isArray(record.models)\n ? record.models\n : [];\n return (list as Array<Record<string, unknown>>)\n .map((m) => ({\n id: String(m.id ?? m.modelId ?? m.name ?? ''),\n label: String(m.displayName ?? m.label ?? m.title ?? m.name ?? m.id ?? ''),\n provider: String(m.provider ?? m.source ?? ''),\n description: String(m.description ?? ''),\n ...(typeof m.supportsImageInput === 'boolean' ? { supportsImageInput: m.supportsImageInput } : {}),\n ...(typeof m.supportsVideoInput === 'boolean' ? { supportsVideoInput: m.supportsVideoInput } : {}),\n ...(typeof m.supportsImageToVideo === 'boolean' ? { supportsImageToVideo: m.supportsImageToVideo } : {}),\n ...(typeof m.supportsEndFrame === 'boolean' ? { supportsEndFrame: m.supportsEndFrame } : {}),\n ...(typeof m.supportsAudio === 'boolean' ? { supportsAudio: m.supportsAudio } : {}),\n ...(Array.isArray(m.aspectRatios)\n ? { aspectRatios: m.aspectRatios.filter((s): s is string => typeof s === 'string') }\n : {}),\n ...(Array.isArray(m.resolutions)\n ? { resolutions: m.resolutions.filter((s): s is string => typeof s === 'string') }\n : {}),\n ...(typeof m.type === 'string' ? { type: m.type } : {}),\n supportedDurationsSeconds: durationList(m.supportedDurationsSeconds),\n ...(duration(m.defaultDurationSeconds) ? { defaultDurationSeconds: Number(m.defaultDurationSeconds) } : {}),\n ...(duration(m.maxDurationSeconds) ? { maxDurationSeconds: Number(m.maxDurationSeconds) } : {}),\n }))\n .filter((m) => Boolean(m.id));\n}\n\nexport function buildVideoGenerateParams(opts: {\n prompt: string;\n aspectRatio: string;\n model?: string;\n durationSeconds?: number;\n referenceImageUrl?: string;\n referenceVideoUrl?: string;\n lastFrameUrl?: string;\n resolution?: string;\n generateAudio?: boolean;\n negativePrompt?: string;\n}): Record<string, unknown> {\n return {\n prompt: opts.prompt,\n aspectRatio: opts.aspectRatio,\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.durationSeconds ? { durationSeconds: opts.durationSeconds } : {}),\n ...(opts.referenceImageUrl ? { referenceImageUrl: opts.referenceImageUrl } : {}),\n ...(opts.referenceVideoUrl ? { referenceVideoUrl: opts.referenceVideoUrl } : {}),\n ...(opts.lastFrameUrl ? { lastFrameUrl: opts.lastFrameUrl } : {}),\n ...(opts.resolution ? { resolution: opts.resolution } : {}),\n ...(opts.generateAudio ? { generateAudio: true } : {}),\n ...(opts.negativePrompt ? { negativePrompt: opts.negativePrompt } : {}),\n };\n}\n\n/** Twin of canvas-surface `videoGenOptions.generationCapabilities`. */\nexport function generationCapabilities(model: ModelInfo | undefined): {\n aspects: string[];\n resolutions: string[];\n canAudio: boolean;\n canStartFrame: boolean;\n canEndFrame: boolean;\n canVideoInput: boolean;\n} {\n const google = model?.provider === 'google';\n return {\n aspects: model?.aspectRatios?.length ? model.aspectRatios : ['16:9', '9:16'],\n resolutions: model?.resolutions ?? [],\n canAudio: Boolean(model?.supportsAudio),\n canStartFrame: model?.supportsImageToVideo ?? true,\n canEndFrame: Boolean(model?.supportsEndFrame),\n canVideoInput: Boolean(model?.supportsVideoInput),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generationModels.js","sources":["../../../src/features/canvas/generationModels.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `hooks/useModelList` — LIST_MODELS shapes\n * and duration gating. An out-of-range `durationSeconds` comes back as a\n * blank video, not an error (web issue #305).\n */\n\nexport interface ModelInfo {\n id: string;\n label: string;\n provider: string;\n description: string;\n supportsImageInput?: boolean;\n supportsVideoInput?: boolean;\n supportsImageToVideo?: boolean;\n supportsEndFrame?: boolean;\n /** Whether the video model reads style/subject reference stills (`styleReferenceUrls`). */\n supportsReferenceImages?: boolean;\n /** How many reference stills it reads (Veo 3, Seedance 9); see `videoReferenceCap`. */\n maxReferenceImages?: number;\n supportsAudio?: boolean;\n isFast?: boolean;\n type?: string;\n supportedDurationsSeconds?: number[];\n defaultDurationSeconds?: number;\n maxDurationSeconds?: number;\n aspectRatios?: string[];\n resolutions?: string[];\n}\n\nconst VEO_ASPECTS = ['16:9', '9:16'];\nconst VEO_RESOLUTIONS = ['720p', '1080p'];\nconst VEO_DURATIONS = [4, 6, 8];\n\nexport const STATIC_IMAGE_MODELS: ModelInfo[] = [\n { id: 'gemini-3.1-flash-image-preview', label: 'Gemini Efficient', provider: 'google', description: '' },\n];\n\n/** Offline fallback — mirrors canvas-surface `hooks/useModelList` STATIC_VIDEO_MODELS. */\nexport const STATIC_VIDEO_MODELS: ModelInfo[] = [\n {\n id: 'veo-3.1-generate-preview',\n label: 'Veo 3.1 Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n supportsEndFrame: true,\n supportsAudio: true,\n supportsReferenceImages: true,\n maxReferenceImages: 3,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3.1-fast-generate-preview',\n label: 'Veo 3.1 Fast Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n supportsEndFrame: true,\n isFast: true,\n supportsReferenceImages: true,\n maxReferenceImages: 3,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3-generate-preview',\n label: 'Veo 3 Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3-fast-generate-preview',\n label: 'Veo 3 Fast Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n isFast: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-2.0-generate-001',\n label: 'Veo 2.0',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: [5, 6, 7, 8],\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'bytedance/seedance-2.0',\n label: 'Seedance 2.0',\n provider: 'openrouter',\n description: '',\n supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n defaultDurationSeconds: 5,\n maxDurationSeconds: 15,\n supportsImageToVideo: true,\n supportsReferenceImages: true,\n maxReferenceImages: 9,\n },\n {\n id: 'bytedance/seedance-2.0-fast',\n label: 'Seedance 2.0 Fast',\n provider: 'openrouter',\n description: '',\n supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n defaultDurationSeconds: 5,\n maxDurationSeconds: 15,\n supportsImageToVideo: true,\n supportsReferenceImages: true,\n maxReferenceImages: 9,\n isFast: true,\n },\n];\n\nexport const AUDIO_PROMPT_TYPES = new Set(['tts', 'sfx', 'music']);\n\nfunction durationList(raw: unknown): number[] {\n if (!Array.isArray(raw)) return [];\n return raw.filter((s): s is number => typeof s === 'number' && Number.isFinite(s) && s > 0);\n}\n\nfunction duration(raw: unknown): number | undefined {\n return typeof raw === 'number' && Number.isFinite(raw) && raw > 0 ? raw : undefined;\n}\n\nexport function videoDurationOptions(model: ModelInfo | undefined): number[] {\n return model?.supportedDurationsSeconds ?? [];\n}\n\nexport function promptAudioModels(models: ModelInfo[]): ModelInfo[] {\n return models.filter((m) => !m.type || AUDIO_PROMPT_TYPES.has(m.type));\n}\n\nexport function normalizeModels(raw: unknown): ModelInfo[] {\n let payload: unknown = raw;\n if (typeof payload === 'string') {\n try {\n payload = JSON.parse(payload);\n } catch {\n return [];\n }\n }\n const record = payload && typeof payload === 'object' ? (payload as Record<string, unknown>) : {};\n const nested = record.data && typeof record.data === 'object' ? (record.data as Record<string, unknown>) : record;\n const list = Array.isArray(payload)\n ? payload\n : Array.isArray(nested.models)\n ? nested.models\n : Array.isArray(nested.data)\n ? nested.data\n : Array.isArray(record.models)\n ? record.models\n : [];\n return (list as Array<Record<string, unknown>>)\n .map((m) => ({\n id: String(m.id ?? m.modelId ?? m.name ?? ''),\n label: String(m.displayName ?? m.label ?? m.title ?? m.name ?? m.id ?? ''),\n provider: String(m.provider ?? m.source ?? ''),\n description: String(m.description ?? ''),\n ...(typeof m.supportsImageInput === 'boolean' ? { supportsImageInput: m.supportsImageInput } : {}),\n ...(typeof m.supportsVideoInput === 'boolean' ? { supportsVideoInput: m.supportsVideoInput } : {}),\n ...(typeof m.supportsImageToVideo === 'boolean' ? { supportsImageToVideo: m.supportsImageToVideo } : {}),\n ...(typeof m.supportsEndFrame === 'boolean' ? { supportsEndFrame: m.supportsEndFrame } : {}),\n ...(typeof m.supportsReferenceImages === 'boolean'\n ? { supportsReferenceImages: m.supportsReferenceImages }\n : {}),\n ...(typeof m.maxReferenceImages === 'number' && Number.isFinite(m.maxReferenceImages)\n ? { maxReferenceImages: Math.max(0, Math.round(m.maxReferenceImages)) }\n : {}),\n ...(typeof m.supportsAudio === 'boolean' ? { supportsAudio: m.supportsAudio } : {}),\n ...(Array.isArray(m.aspectRatios)\n ? { aspectRatios: m.aspectRatios.filter((s): s is string => typeof s === 'string') }\n : {}),\n ...(Array.isArray(m.resolutions)\n ? { resolutions: m.resolutions.filter((s): s is string => typeof s === 'string') }\n : {}),\n ...(typeof m.type === 'string' ? { type: m.type } : {}),\n supportedDurationsSeconds: durationList(m.supportedDurationsSeconds),\n ...(duration(m.defaultDurationSeconds) ? { defaultDurationSeconds: Number(m.defaultDurationSeconds) } : {}),\n ...(duration(m.maxDurationSeconds) ? { maxDurationSeconds: Number(m.maxDurationSeconds) } : {}),\n }))\n .filter((m) => Boolean(m.id));\n}\n\nexport function buildVideoGenerateParams(opts: {\n prompt: string;\n aspectRatio: string;\n model?: string;\n durationSeconds?: number;\n referenceImageUrl?: string;\n referenceVideoUrl?: string;\n /** End frame (web `referenceEndImageUrl`); only models with `supportsEndFrame` read it. */\n referenceEndImageUrl?: string;\n /** Style/subject stills, capped by `videoReferenceCap`. */\n styleReferenceUrls?: string[];\n resolution?: string;\n generateAudio?: boolean;\n negativePrompt?: string;\n}): Record<string, unknown> {\n return {\n prompt: opts.prompt,\n aspectRatio: opts.aspectRatio,\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.durationSeconds ? { durationSeconds: opts.durationSeconds } : {}),\n ...(opts.referenceImageUrl ? { referenceImageUrl: opts.referenceImageUrl } : {}),\n ...(opts.referenceVideoUrl ? { referenceVideoUrl: opts.referenceVideoUrl } : {}),\n ...(opts.referenceEndImageUrl ? { referenceEndImageUrl: opts.referenceEndImageUrl } : {}),\n ...(opts.styleReferenceUrls?.length ? { styleReferenceUrls: opts.styleReferenceUrls } : {}),\n ...(opts.resolution ? { resolution: opts.resolution } : {}),\n // Sent whenever set: a model that defaults to sound needs an explicit false.\n ...(opts.generateAudio !== undefined ? { generateAudio: opts.generateAudio } : {}),\n ...(opts.negativePrompt ? { negativePrompt: opts.negativePrompt } : {}),\n };\n}\n\n/** Smallest reference count any provider takes - the cap when the connector does not say (web). */\nexport const DEFAULT_VIDEO_REFERENCE_CAP = 3;\n\n/** How many reference stills the selected video model's slot holds (web `videoReferenceCap`). */\nexport function videoReferenceCap(models: readonly ModelInfo[], selectedId: string): number {\n const current = models.find((m) => m.id === selectedId);\n if (!current) return DEFAULT_VIDEO_REFERENCE_CAP;\n if (typeof current.maxReferenceImages === 'number') return current.maxReferenceImages;\n return current.supportsReferenceImages === false ? 0 : DEFAULT_VIDEO_REFERENCE_CAP;\n}\n\n/** With a still attached, the first model that reads images when the pick cannot (web `modelThatReadsImages`). */\nexport function modelThatReadsImages(models: readonly ModelInfo[], selectedId: string): string | null {\n const current = models.find((m) => m.id === selectedId);\n if (!current || current.supportsImageInput !== false) return null;\n return models.find((m) => m.supportsImageInput)?.id ?? null;\n}\n\n/** Twin of canvas-surface `videoGenOptions.generationCapabilities`. */\nexport function generationCapabilities(model: ModelInfo | undefined): {\n aspects: string[];\n resolutions: string[];\n canAudio: boolean;\n canStartFrame: boolean;\n canEndFrame: boolean;\n canVideoInput: boolean;\n} {\n const google = model?.provider === 'google';\n return {\n aspects: model?.aspectRatios?.length ? model.aspectRatios : ['16:9', '9:16'],\n resolutions: model?.resolutions ?? [],\n canAudio: Boolean(model?.supportsAudio),\n canStartFrame: model?.supportsImageToVideo ?? true,\n canEndFrame: Boolean(model?.supportsEndFrame),\n canVideoInput: Boolean(model?.supportsVideoInput),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
const VIDEO_MODEL = "alibaba/happyhorse-1.1";
|
|
2
|
+
const IMAGE_MODEL = "openai/gpt-5.4-image-2";
|
|
3
|
+
const VIDEO_INPUT_MODEL = "alibaba/wan-2.7";
|
|
4
|
+
const GENERATOR_COMMANDS = [{
|
|
5
|
+
id: "animate",
|
|
6
|
+
label: "Animate",
|
|
7
|
+
blurb: "Redraw it as 2D animation - a still stays a still, footage stays footage",
|
|
8
|
+
icon: "creation",
|
|
9
|
+
mode: "image",
|
|
10
|
+
preferModel: IMAGE_MODEL,
|
|
11
|
+
needsModel: "supportsImageInput",
|
|
12
|
+
needs: "media",
|
|
13
|
+
suffix: "Redraw this as a frame from a high-end hand-drawn 2D animated film: confident ink linework with varied line weight, cel shading with crisp two-tone shadows, a limited harmonious palette and soft painted backgrounds. Keep the same subjects, faces, hairstyles, clothing, products, logos and readable text, the same pose, composition, camera angle and framing, translating every element one to one and adding nothing new. For footage, keep the motion and timing frame for frame with steady linework, no flicker or boiling between frames"
|
|
14
|
+
}, {
|
|
15
|
+
id: "slow-motion",
|
|
16
|
+
label: "Slow motion",
|
|
17
|
+
blurb: "Draw the action right out - fluid high-frame-rate slow motion",
|
|
18
|
+
icon: "speedometer-slow",
|
|
19
|
+
mode: "video",
|
|
20
|
+
preferModel: VIDEO_MODEL,
|
|
21
|
+
needsModel: "supportsImageToVideo",
|
|
22
|
+
needs: "media",
|
|
23
|
+
suffix: "Continue this exact frame as a cinematic super slow-motion shot filmed at 1000 fps: the action the frame implies keeps unfolding in clear, visible motion - hair, fabric, water, smoke, dust or particles flowing and rippling in fine detail - while the camera makes a slow, steady push-in. Keep the same subject, faces, product, lighting and colour grade from first frame to last, with a solid, stable background. One continuous take, no cuts, no return to normal speed, no morphing or warping"
|
|
24
|
+
}, {
|
|
25
|
+
id: "fpv-drone",
|
|
26
|
+
label: "FPV drone",
|
|
27
|
+
blurb: "Fly the scene as an FPV drone - one continuous banking flight",
|
|
28
|
+
icon: "quadcopter",
|
|
29
|
+
mode: "video",
|
|
30
|
+
preferModel: VIDEO_MODEL,
|
|
31
|
+
needsModel: "supportsImageToVideo",
|
|
32
|
+
needs: "media",
|
|
33
|
+
suffix: "A single continuous FPV drone flight that starts on this exact frame and immediately flies forward into the scene: skimming low over the ground, threading through gaps and banking smoothly around the main subject, then climbing and pushing deeper into the space. Fast, smooth, gimbal-stable motion through a wide lens with light motion blur. Keep the world solid and consistent as the camera passes - the same buildings, terrain, objects, lighting, weather and time of day. If the frame is a close-up, pull back first to reveal its surroundings. No cuts, no teleporting, no morphing or melting scenery"
|
|
34
|
+
}, {
|
|
35
|
+
id: "earth-zoom",
|
|
36
|
+
label: "Earth zoom",
|
|
37
|
+
blurb: "Pull back from the scene all the way out to orbit",
|
|
38
|
+
icon: "earth",
|
|
39
|
+
mode: "video",
|
|
40
|
+
preferModel: VIDEO_MODEL,
|
|
41
|
+
needsModel: "supportsImageToVideo",
|
|
42
|
+
needs: "image",
|
|
43
|
+
suffix: "Starting on this exact frame, one smooth continuous zoom out that accelerates steadily: rise straight up above the subject (out through the roof if indoors), revealing the street, then the neighbourhood and city from above, the surrounding landscape and coastline, up through thin clouds, until the whole curved Earth glows against black space under a thin blue atmosphere. Keep the geography directly below the starting point consistent at every altitude, with a photoreal satellite-imagery look. No cuts, no morphing, no map labels or text"
|
|
44
|
+
}, {
|
|
45
|
+
id: "tv-commercial",
|
|
46
|
+
label: "TV commercial",
|
|
47
|
+
blurb: "Shoot it like a premium spot - studio light, slow move, rich grade",
|
|
48
|
+
icon: "television-classic",
|
|
49
|
+
mode: "video",
|
|
50
|
+
preferModel: VIDEO_MODEL,
|
|
51
|
+
needsModel: "supportsImageToVideo",
|
|
52
|
+
needs: "media",
|
|
53
|
+
suffix: "Shoot this as the hero shot of a premium television commercial: the product or main subject stays sharp and centred, glossy studio lighting with a soft key, crisp rim light and a slow light sweep gliding across its surface, shallow depth of field against a clean background, faint haze or floating particles. The camera makes one smooth motorised move - a slow push-in or partial orbit - and settles on a perfectly framed final hero frame. Keep the product's exact shape, proportions, colours, logo, label and text, crisp and legible throughout. No added products or text, no cuts, no morphing"
|
|
54
|
+
}];
|
|
55
|
+
function parseCommandLine(text) {
|
|
56
|
+
if (!text.startsWith("/")) return null;
|
|
57
|
+
const body = text.slice(1);
|
|
58
|
+
const ws = body.search(/\s/);
|
|
59
|
+
const token = ws === -1 ? body : body.slice(0, ws);
|
|
60
|
+
if (!/^[a-z0-9-]*$/i.test(token)) return null;
|
|
61
|
+
return {
|
|
62
|
+
token: token.toLowerCase(),
|
|
63
|
+
rest: ws === -1 ? "" : body.slice(ws + 1),
|
|
64
|
+
typing: ws === -1
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function matchCommands(token, commands = GENERATOR_COMMANDS) {
|
|
68
|
+
const t = token.toLowerCase();
|
|
69
|
+
if (!t) return commands;
|
|
70
|
+
return commands.filter((c) => c.id.startsWith(t) || c.label.toLowerCase().includes(t));
|
|
71
|
+
}
|
|
72
|
+
function findCommand(text, commands = GENERATOR_COMMANDS) {
|
|
73
|
+
const line = parseCommandLine(text);
|
|
74
|
+
if (!line) return void 0;
|
|
75
|
+
return commands.find((c) => c.id === line.token);
|
|
76
|
+
}
|
|
77
|
+
function composePrompt(cmd, words) {
|
|
78
|
+
const w = words.trim();
|
|
79
|
+
return w ? `${cmd.suffix}. Also: ${w}` : cmd.suffix;
|
|
80
|
+
}
|
|
81
|
+
function commandPrompt(text, commands = GENERATOR_COMMANDS) {
|
|
82
|
+
const line = parseCommandLine(text);
|
|
83
|
+
if (!line) return text;
|
|
84
|
+
const cmd = commands.find((c) => c.id === line.token);
|
|
85
|
+
return cmd ? composePrompt(cmd, line.rest) : text;
|
|
86
|
+
}
|
|
87
|
+
const MISSING_LABEL = {
|
|
88
|
+
image: "a still to start from",
|
|
89
|
+
video: "footage to work on",
|
|
90
|
+
media: "a still or a clip to work on"
|
|
91
|
+
};
|
|
92
|
+
function missingFor(cmd, mode, has) {
|
|
93
|
+
if (mode === "image" || cmd.needs === "image") return has.still ? null : "image";
|
|
94
|
+
if (cmd.needs === "video") return has.footage ? null : "video";
|
|
95
|
+
return has.still || has.footage ? null : "media";
|
|
96
|
+
}
|
|
97
|
+
function modelForCommand(cmd, models, current) {
|
|
98
|
+
var _a, _b;
|
|
99
|
+
if (models.some((m) => m.id === cmd.preferModel)) return cmd.preferModel;
|
|
100
|
+
const cap = cmd.needsModel;
|
|
101
|
+
if (models.some((m) => m.id === current && m[cap])) return current;
|
|
102
|
+
return (_b = (_a = models.find((m) => m[cap])) == null ? void 0 : _a.id) != null ? _b : current;
|
|
103
|
+
}
|
|
104
|
+
function laneForCommand(cmd, has) {
|
|
105
|
+
return has.footage && cmd.needs !== "image" ? "video" : cmd.mode;
|
|
106
|
+
}export{GENERATOR_COMMANDS,MISSING_LABEL,VIDEO_INPUT_MODEL,commandPrompt,findCommand,laneForCommand,matchCommands,missingFor,modelForCommand,parseCommandLine};//# sourceMappingURL=generatorCommands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generatorCommands.js","sources":["../../../src/features/canvas/generatorCommands.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `components/generator/commands.ts` — generator\n * slash commands. Each suffix anchors the start frame, names what moves, then\n * what must not change. Pure (icons are MaterialCommunityIcons names).\n */\nimport type { ModelInfo } from './generationModels';\n\nexport type CommandLane = 'image' | 'video';\n\nexport type ModelCapability =\n | 'supportsImageInput'\n | 'supportsImageToVideo'\n | 'supportsVideoInput'\n | 'supportsEndFrame'\n | 'supportsAudio';\n\nexport interface GeneratorCommand {\n id: string;\n label: string;\n blurb: string;\n icon: string;\n /** The lane a still (or nothing) lands in; attached footage always goes to video. */\n mode: CommandLane;\n preferModel: string;\n needsModel: ModelCapability;\n needs: 'image' | 'video' | 'media';\n suffix: string;\n}\n\nconst VIDEO_MODEL = 'alibaba/happyhorse-1.1';\nconst IMAGE_MODEL = 'openai/gpt-5.4-image-2';\n/** Footage runs here: the model reporting `supportsVideoInput`. */\nexport const VIDEO_INPUT_MODEL = 'alibaba/wan-2.7';\n\nexport const GENERATOR_COMMANDS: GeneratorCommand[] = [\n {\n id: 'animate',\n label: 'Animate',\n blurb: 'Redraw it as 2D animation - a still stays a still, footage stays footage',\n icon: 'creation',\n mode: 'image',\n preferModel: IMAGE_MODEL,\n needsModel: 'supportsImageInput',\n needs: 'media',\n suffix: 'Redraw this as a frame from a high-end hand-drawn 2D animated film: confident ink linework with varied line weight, cel shading with crisp two-tone shadows, a limited harmonious palette and soft painted backgrounds. Keep the same subjects, faces, hairstyles, clothing, products, logos and readable text, the same pose, composition, camera angle and framing, translating every element one to one and adding nothing new. For footage, keep the motion and timing frame for frame with steady linework, no flicker or boiling between frames',\n },\n {\n id: 'slow-motion',\n label: 'Slow motion',\n blurb: 'Draw the action right out - fluid high-frame-rate slow motion',\n icon: 'speedometer-slow',\n mode: 'video',\n preferModel: VIDEO_MODEL,\n needsModel: 'supportsImageToVideo',\n needs: 'media',\n suffix: 'Continue this exact frame as a cinematic super slow-motion shot filmed at 1000 fps: the action the frame implies keeps unfolding in clear, visible motion - hair, fabric, water, smoke, dust or particles flowing and rippling in fine detail - while the camera makes a slow, steady push-in. Keep the same subject, faces, product, lighting and colour grade from first frame to last, with a solid, stable background. One continuous take, no cuts, no return to normal speed, no morphing or warping',\n },\n {\n id: 'fpv-drone',\n label: 'FPV drone',\n blurb: 'Fly the scene as an FPV drone - one continuous banking flight',\n icon: 'quadcopter',\n mode: 'video',\n preferModel: VIDEO_MODEL,\n needsModel: 'supportsImageToVideo',\n needs: 'media',\n suffix: 'A single continuous FPV drone flight that starts on this exact frame and immediately flies forward into the scene: skimming low over the ground, threading through gaps and banking smoothly around the main subject, then climbing and pushing deeper into the space. Fast, smooth, gimbal-stable motion through a wide lens with light motion blur. Keep the world solid and consistent as the camera passes - the same buildings, terrain, objects, lighting, weather and time of day. If the frame is a close-up, pull back first to reveal its surroundings. No cuts, no teleporting, no morphing or melting scenery',\n },\n {\n id: 'earth-zoom',\n label: 'Earth zoom',\n blurb: 'Pull back from the scene all the way out to orbit',\n icon: 'earth',\n mode: 'video',\n preferModel: VIDEO_MODEL,\n needsModel: 'supportsImageToVideo',\n needs: 'image',\n suffix: 'Starting on this exact frame, one smooth continuous zoom out that accelerates steadily: rise straight up above the subject (out through the roof if indoors), revealing the street, then the neighbourhood and city from above, the surrounding landscape and coastline, up through thin clouds, until the whole curved Earth glows against black space under a thin blue atmosphere. Keep the geography directly below the starting point consistent at every altitude, with a photoreal satellite-imagery look. No cuts, no morphing, no map labels or text',\n },\n {\n id: 'tv-commercial',\n label: 'TV commercial',\n blurb: 'Shoot it like a premium spot - studio light, slow move, rich grade',\n icon: 'television-classic',\n mode: 'video',\n preferModel: VIDEO_MODEL,\n needsModel: 'supportsImageToVideo',\n needs: 'media',\n suffix: \"Shoot this as the hero shot of a premium television commercial: the product or main subject stays sharp and centred, glossy studio lighting with a soft key, crisp rim light and a slow light sweep gliding across its surface, shallow depth of field against a clean background, faint haze or floating particles. The camera makes one smooth motorised move - a slow push-in or partial orbit - and settles on a perfectly framed final hero frame. Keep the product's exact shape, proportions, colours, logo, label and text, crisp and legible throughout. No added products or text, no cuts, no morphing\",\n },\n];\n\nexport interface CommandLine {\n token: string;\n rest: string;\n /** No whitespace yet - the state that shows the suggestion row. */\n typing: boolean;\n}\n\n/** Leading slash only. */\nexport function parseCommandLine(text: string): CommandLine | null {\n if (!text.startsWith('/')) return null;\n const body = text.slice(1);\n const ws = body.search(/\\s/);\n const token = ws === -1 ? body : body.slice(0, ws);\n if (!/^[a-z0-9-]*$/i.test(token)) return null;\n return { token: token.toLowerCase(), rest: ws === -1 ? '' : body.slice(ws + 1), typing: ws === -1 };\n}\n\nexport function matchCommands(token: string, commands: GeneratorCommand[] = GENERATOR_COMMANDS): GeneratorCommand[] {\n const t = token.toLowerCase();\n if (!t) return commands;\n return commands.filter((c) => c.id.startsWith(t) || c.label.toLowerCase().includes(t));\n}\n\nexport function findCommand(\n text: string,\n commands: GeneratorCommand[] = GENERATOR_COMMANDS,\n): GeneratorCommand | undefined {\n const line = parseCommandLine(text);\n if (!line) return undefined;\n return commands.find((c) => c.id === line.token);\n}\n\nfunction composePrompt(cmd: GeneratorCommand, words: string): string {\n const w = words.trim();\n return w ? `${cmd.suffix}. Also: ${w}` : cmd.suffix;\n}\n\n/** Strips the token only when it resolves, so `/r/earthporn aerial` still sends verbatim. */\nexport function commandPrompt(text: string, commands: GeneratorCommand[] = GENERATOR_COMMANDS): string {\n const line = parseCommandLine(text);\n if (!line) return text;\n const cmd = commands.find((c) => c.id === line.token);\n return cmd ? composePrompt(cmd, line.rest) : text;\n}\n\nexport type Missing = 'image' | 'video' | 'media';\n\nexport const MISSING_LABEL: Record<Missing, string> = {\n image: 'a still to start from',\n video: 'footage to work on',\n media: 'a still or a clip to work on',\n};\n\n/** What the command still needs, or null when it can run. The image lane only ever holds stills. */\nexport function missingFor(\n cmd: GeneratorCommand,\n mode: string,\n has: { still: boolean; footage: boolean },\n): Missing | null {\n if (mode === 'image' || cmd.needs === 'image') return has.still ? null : 'image';\n if (cmd.needs === 'video') return has.footage ? null : 'video';\n return has.still || has.footage ? null : 'media';\n}\n\n/** Prefer the pinned model, else keep/find one with the capability, else leave it. */\nexport function modelForCommand(cmd: GeneratorCommand, models: readonly ModelInfo[], current: string): string {\n if (models.some((m) => m.id === cmd.preferModel)) return cmd.preferModel;\n const cap = cmd.needsModel;\n if (models.some((m) => m.id === current && m[cap])) return current;\n return models.find((m) => m[cap])?.id ?? current;\n}\n\n/** The lane a command runs in: footage always takes video. */\nexport function laneForCommand(cmd: GeneratorCommand, has: { footage: boolean }): CommandLane {\n return has.footage && cmd.needs !== 'image' ? 'video' : cmd.mode;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
const STILL_ROLE_LABELS = {
|
|
21
|
+
source: "Edit",
|
|
22
|
+
reference: "Reference"
|
|
23
|
+
};
|
|
24
|
+
const STILL_ROLE_HINTS = {
|
|
25
|
+
source: "Change this image",
|
|
26
|
+
reference: "Guide a new image with its style or subject"
|
|
27
|
+
};
|
|
28
|
+
const MAX_REFERENCE_IMAGES = 14;
|
|
29
|
+
const PROMO_MAX_REFERENCES = 6;
|
|
30
|
+
const LIBRARY_PICK = {
|
|
31
|
+
reference: {
|
|
32
|
+
title: "Pick reference images",
|
|
33
|
+
action: "Use as a reference"
|
|
34
|
+
},
|
|
35
|
+
startFrame: {
|
|
36
|
+
title: "Pick a first frame",
|
|
37
|
+
action: "Open on"
|
|
38
|
+
},
|
|
39
|
+
endFrame: {
|
|
40
|
+
title: "Pick a last frame",
|
|
41
|
+
action: "End on"
|
|
42
|
+
},
|
|
43
|
+
videoReference: {
|
|
44
|
+
title: "Pick reference images",
|
|
45
|
+
action: "Use as a reference"
|
|
46
|
+
},
|
|
47
|
+
promoReference: {
|
|
48
|
+
title: "Pick reference images",
|
|
49
|
+
action: "Use as a reference"
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
function addReference(list, url, cap) {
|
|
53
|
+
if (!url || list.includes(url) || list.length >= cap) return [...list];
|
|
54
|
+
return [...list, url];
|
|
55
|
+
}
|
|
56
|
+
function imageLaneCall(opts) {
|
|
57
|
+
const refs = opts.stills.filter(Boolean).slice(0, MAX_REFERENCE_IMAGES);
|
|
58
|
+
const base = __spreadValues({
|
|
59
|
+
prompt: opts.prompt,
|
|
60
|
+
aspectRatio: opts.aspectRatio
|
|
61
|
+
}, opts.model ? {
|
|
62
|
+
model: opts.model
|
|
63
|
+
} : {});
|
|
64
|
+
if (refs.length && opts.role === "source") {
|
|
65
|
+
return {
|
|
66
|
+
action: "YANTRA_GEMINI_IMAGE_EDIT",
|
|
67
|
+
params: __spreadProps(__spreadValues({}, base), {
|
|
68
|
+
referenceImages: refs.map((url) => ({
|
|
69
|
+
url
|
|
70
|
+
}))
|
|
71
|
+
})
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
action: "YANTRA_GEMINI_IMAGE_GENERATE",
|
|
76
|
+
params: __spreadValues(__spreadValues({}, base), refs.length ? {
|
|
77
|
+
referenceImages: refs.map((url) => ({
|
|
78
|
+
url
|
|
79
|
+
}))
|
|
80
|
+
} : {})
|
|
81
|
+
};
|
|
82
|
+
}export{LIBRARY_PICK,MAX_REFERENCE_IMAGES,PROMO_MAX_REFERENCES,STILL_ROLE_HINTS,STILL_ROLE_LABELS,addReference,imageLaneCall};//# sourceMappingURL=generatorReferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generatorReferences.js","sources":["../../../src/features/canvas/generatorReferences.ts"],"sourcesContent":["/**\n * Generator reference slots — native twin of canvas-surface c4c533d7\n * (CanvasPage frameSlot / StillRoleSwitch / mediaGenerationRpc).\n *\n * Image lane: an attached still is either the thing the run changes (Edit ->\n * YANTRA_GEMINI_IMAGE_EDIT) or guidance for something new (Reference ->\n * GENERATE with `referenceImages`). Sending it to the wrong one is the\n * difference between a new composition and a retouched copy.\n *\n * Video lane: three named slots - First frame, Last frame (only when the model\n * ends on a frame), Other references (capped by `videoReferenceCap`).\n */\n\nexport type StillRole = 'source' | 'reference';\n\nexport const STILL_ROLE_LABELS: Readonly<Record<StillRole, string>> = {\n source: 'Edit',\n reference: 'Reference',\n};\n\nexport const STILL_ROLE_HINTS: Readonly<Record<StillRole, string>> = {\n source: 'Change this image',\n reference: 'Guide a new image with its style or subject',\n};\n\n/** The image connector's schema caps `referenceImages` at 14. */\nexport const MAX_REFERENCE_IMAGES = 14;\n\n/** Promo stills the producer reads (web PROMO_MAX_REFERENCES). */\nexport const PROMO_MAX_REFERENCES = 6;\n\n/** A reference slot that can fill from the library (web LIBRARY_PICK). */\nexport type LibraryPickTarget = 'reference' | 'startFrame' | 'endFrame' | 'videoReference' | 'promoReference';\n\nexport const LIBRARY_PICK: Record<LibraryPickTarget, { title: string; action: string }> = {\n reference: { title: 'Pick reference images', action: 'Use as a reference' },\n startFrame: { title: 'Pick a first frame', action: 'Open on' },\n endFrame: { title: 'Pick a last frame', action: 'End on' },\n videoReference: { title: 'Pick reference images', action: 'Use as a reference' },\n promoReference: { title: 'Pick reference images', action: 'Use as a reference' },\n};\n\n/** Add a url to a capped, de-duplicated reference list. */\nexport function addReference(list: readonly string[], url: string, cap: number): string[] {\n if (!url || list.includes(url) || list.length >= cap) return [...list];\n return [...list, url];\n}\n\n/** The image lane's connector call for the attached stills and their role. */\nexport function imageLaneCall(opts: {\n prompt: string;\n aspectRatio: string;\n model?: string;\n stills: readonly string[];\n role: StillRole;\n}): { action: 'YANTRA_GEMINI_IMAGE_EDIT' | 'YANTRA_GEMINI_IMAGE_GENERATE'; params: Record<string, unknown> } {\n const refs = opts.stills.filter(Boolean).slice(0, MAX_REFERENCE_IMAGES);\n const base = {\n prompt: opts.prompt,\n aspectRatio: opts.aspectRatio,\n ...(opts.model ? { model: opts.model } : {}),\n };\n if (refs.length && opts.role === 'source') {\n return {\n action: 'YANTRA_GEMINI_IMAGE_EDIT',\n params: { ...base, referenceImages: refs.map((url) => ({ url })) },\n };\n }\n return {\n action: 'YANTRA_GEMINI_IMAGE_GENERATE',\n params: { ...base, ...(refs.length ? { referenceImages: refs.map((url) => ({ url })) } : {}) },\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAcO,MAAM,iBAAyD,GAAA;AAAA,EACpE,MAAQ,EAAA,MAAA;AAAA,EACR,SAAW,EAAA;AACb;AACO,MAAM,gBAAwD,GAAA;AAAA,EACnE,MAAQ,EAAA,mBAAA;AAAA,EACR,SAAW,EAAA;AACb;AAGO,MAAM,oBAAuB,GAAA;AAG7B,MAAM,oBAAuB,GAAA;AAI7B,MAAM,YAGR,GAAA;AAAA,EACH,SAAW,EAAA;AAAA,IACT,KAAO,EAAA,uBAAA;AAAA,IACP,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,KAAO,EAAA,oBAAA;AAAA,IACP,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,KAAO,EAAA,mBAAA;AAAA,IACP,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,KAAO,EAAA,uBAAA;AAAA,IACP,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,KAAO,EAAA,uBAAA;AAAA,IACP,MAAQ,EAAA;AAAA;AAEZ;AAGgB,SAAA,YAAA,CAAa,IAAyB,EAAA,GAAA,EAAa,GAAuB,EAAA;AACxF,EAAA,IAAI,CAAC,GAAA,IAAO,IAAK,CAAA,QAAA,CAAS,GAAG,CAAA,IAAK,IAAK,CAAA,MAAA,IAAU,GAAK,EAAA,OAAO,CAAC,GAAG,IAAI,CAAA;AACrE,EAAO,OAAA,CAAC,GAAG,IAAA,EAAM,GAAG,CAAA;AACtB;AAGO,SAAS,cAAc,IAS5B,EAAA;AACA,EAAM,MAAA,IAAA,GAAO,KAAK,MAAO,CAAA,MAAA,CAAO,OAAO,CAAE,CAAA,KAAA,CAAM,GAAG,oBAAoB,CAAA;AACtE,EAAA,MAAM,IAAO,GAAA,cAAA,CAAA;AAAA,IACX,QAAQ,IAAK,CAAA,MAAA;AAAA,IACb,aAAa,IAAK,CAAA;AAAA,GAAA,EACd,KAAK,KAAQ,GAAA;AAAA,IACf,OAAO,IAAK,CAAA;AAAA,MACV,EAAC,CAAA;AAEP,EAAA,IAAI,IAAK,CAAA,MAAA,IAAU,IAAK,CAAA,IAAA,KAAS,QAAU,EAAA;AACzC,IAAO,OAAA;AAAA,MACL,MAAQ,EAAA,0BAAA;AAAA,MACR,MAAA,EAAQ,iCACH,IADG,CAAA,EAAA;AAAA,QAEN,eAAA,EAAiB,IAAK,CAAA,GAAA,CAAI,CAAQ,GAAA,MAAA;AAAA,UAChC;AAAA,SACA,CAAA;AAAA,OACJ;AAAA,KACF;AAAA;AAEF,EAAO,OAAA;AAAA,IACL,MAAQ,EAAA,8BAAA;AAAA,IACR,MAAQ,EAAA,cAAA,CAAA,cAAA,CAAA,EAAA,EACH,IACC,CAAA,EAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MAChB,eAAA,EAAiB,IAAK,CAAA,GAAA,CAAI,CAAQ,GAAA,MAAA;AAAA,QAChC;AAAA,OACA,CAAA;AAAA,QACA,EAAC;AAAA,GAET;AACF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
const WORK_FILTERS = [{
|
|
2
|
+
id: "all",
|
|
3
|
+
label: "All"
|
|
4
|
+
}, {
|
|
5
|
+
id: "canvases",
|
|
6
|
+
label: "Canvases"
|
|
7
|
+
}, {
|
|
8
|
+
id: "designs",
|
|
9
|
+
label: "Designs"
|
|
10
|
+
}, {
|
|
11
|
+
id: "docs",
|
|
12
|
+
label: "Docs"
|
|
13
|
+
}];
|
|
14
|
+
function mergeWork(boards, designs) {
|
|
15
|
+
const items = [...boards.map((board) => ({
|
|
16
|
+
type: "board",
|
|
17
|
+
id: board.channelId,
|
|
18
|
+
at: board.savedAt || 0,
|
|
19
|
+
board
|
|
20
|
+
})), ...designs.map((d) => ({
|
|
21
|
+
type: "design",
|
|
22
|
+
id: d.channelId,
|
|
23
|
+
at: d.savedAt || 0,
|
|
24
|
+
design: d
|
|
25
|
+
}))];
|
|
26
|
+
return items.map((item, i) => ({
|
|
27
|
+
item,
|
|
28
|
+
i
|
|
29
|
+
})).sort((a, b) => b.item.at - a.item.at || a.i - b.i).map((x) => x.item);
|
|
30
|
+
}
|
|
31
|
+
function isDocKind(kind) {
|
|
32
|
+
return kind === "doc";
|
|
33
|
+
}
|
|
34
|
+
function matchesFilter(item, filter) {
|
|
35
|
+
if (filter === "all") return true;
|
|
36
|
+
if (item.type === "board") return filter === "canvases";
|
|
37
|
+
return filter === (isDocKind(item.design.doc.kind) ? "docs" : "designs");
|
|
38
|
+
}
|
|
39
|
+
function availableFilters(items) {
|
|
40
|
+
const present = WORK_FILTERS.filter((f) => f.id !== "all" && items.some((item) => matchesFilter(item, f.id)));
|
|
41
|
+
return present.length > 1 ? ["all", ...present.map((f) => f.id)] : [];
|
|
42
|
+
}
|
|
43
|
+
function designNoun(doc) {
|
|
44
|
+
switch (doc.kind) {
|
|
45
|
+
case "tshirt":
|
|
46
|
+
return "T-shirt";
|
|
47
|
+
case "postcard":
|
|
48
|
+
return "Postcard";
|
|
49
|
+
case "carousel":
|
|
50
|
+
return "Carousel";
|
|
51
|
+
default:
|
|
52
|
+
return "Design";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function pageCount(doc) {
|
|
56
|
+
const pages = doc == null ? void 0 : doc.pages;
|
|
57
|
+
if (!Array.isArray(pages) || pages.length < 2) return "";
|
|
58
|
+
return `${pages.length} pages`;
|
|
59
|
+
}
|
|
60
|
+
function boardCover(items) {
|
|
61
|
+
var _a;
|
|
62
|
+
return (_a = items.find((it) => it.type === "image")) != null ? _a : items.find((it) => it.type === "video");
|
|
63
|
+
}
|
|
64
|
+
const videoFrames = /* @__PURE__ */ new Map();
|
|
65
|
+
function videoCoverFrame(src, runAction, pickUrl) {
|
|
66
|
+
const cached = videoFrames.get(src);
|
|
67
|
+
if (cached) return cached;
|
|
68
|
+
const job = runAction("yantra-video-editing", "YANTRA_VIDEO_EDIT_THUMBNAIL", {
|
|
69
|
+
input_url: src,
|
|
70
|
+
time_secs: 1
|
|
71
|
+
}).then((result) => pickUrl(result) || null).catch(() => null);
|
|
72
|
+
videoFrames.set(src, job);
|
|
73
|
+
return job;
|
|
74
|
+
}export{WORK_FILTERS,availableFilters,boardCover,designNoun,matchesFilter,mergeWork,pageCount,videoCoverFrame};//# sourceMappingURL=homeWork.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"homeWork.js","sources":["../../../src/features/canvas/homeWork.ts"],"sourcesContent":["/**\n * What screen one lists under \"Your work\" - native twin of canvas-surface\n * `components/home/homeWork.ts`: the boards plus the designs made in the\n * design studio, newest first, with All / Canvases / Designs / Docs filters.\n *\n * Native's design index has no docs today; the Docs filter is kept so the\n * contract matches web and simply never shows until a doc kind exists.\n *\n * Pure (no RN imports) so merge, filters, labels and covers are jest-testable.\n */\nimport type { CanvasBoardSummary } from './surfaceIndex';\nimport type { CanvasItem } from './canvasCore';\nimport type { DesignDocSummary } from '../design/designIndex';\nimport type { PersistedDesignDoc } from '../design/designCore';\nimport type { RunMediaAction } from './videoEditor/mediaActions';\n\nexport type WorkFilter = 'all' | 'canvases' | 'designs' | 'docs';\n\nexport const WORK_FILTERS: ReadonlyArray<{ id: WorkFilter; label: string }> = [\n { id: 'all', label: 'All' },\n { id: 'canvases', label: 'Canvases' },\n { id: 'designs', label: 'Designs' },\n { id: 'docs', label: 'Docs' },\n];\n\nexport type WorkItem =\n | { type: 'board'; id: string; at: number; board: CanvasBoardSummary }\n | { type: 'design'; id: string; at: number; design: DesignDocSummary };\n\n/** One list, newest first; equal times keep their input order (boards first). */\nexport function mergeWork(boards: readonly CanvasBoardSummary[], designs: readonly DesignDocSummary[]): WorkItem[] {\n const items: WorkItem[] = [\n ...boards.map((board) => ({ type: 'board' as const, id: board.channelId, at: board.savedAt || 0, board })),\n ...designs.map((d) => ({ type: 'design' as const, id: d.channelId, at: d.savedAt || 0, design: d })),\n ];\n return items\n .map((item, i) => ({ item, i }))\n .sort((a, b) => b.item.at - a.item.at || a.i - b.i)\n .map((x) => x.item);\n}\n\n/** A design whose kind is a document (none on native yet; web `doc`). */\nfunction isDocKind(kind: string): boolean {\n return kind === 'doc';\n}\n\nexport function matchesFilter(item: WorkItem, filter: WorkFilter): boolean {\n if (filter === 'all') return true;\n if (item.type === 'board') return filter === 'canvases';\n return filter === (isDocKind(item.design.doc.kind) ? 'docs' : 'designs');\n}\n\n/** The filters worth offering: All plus each kind present. One kind alone needs no chips. */\nexport function availableFilters(items: readonly WorkItem[]): WorkFilter[] {\n const present = WORK_FILTERS.filter((f) => f.id !== 'all' && items.some((item) => matchesFilter(item, f.id)));\n return present.length > 1 ? ['all', ...present.map((f) => f.id)] : [];\n}\n\n/** What a saved design is, in a word or two: the badge on its tile. */\nexport function designNoun(doc: Pick<PersistedDesignDoc, 'kind'>): string {\n switch (doc.kind) {\n case 'tshirt':\n return 'T-shirt';\n case 'postcard':\n return 'Postcard';\n case 'carousel':\n return 'Carousel';\n default:\n return 'Design';\n }\n}\n\n/** \"3 pages\" for a design with more than one page, else empty. */\nexport function pageCount(doc: Pick<PersistedDesignDoc, 'pages'> | null | undefined): string {\n const pages = doc?.pages;\n if (!Array.isArray(pages) || pages.length < 2) return '';\n return `${pages.length} pages`;\n}\n\n/**\n * A board's cover: the first image (always paints, costs nothing), else the\n * first video (its frame is fetched), else none - web `BoardCard`.\n */\nexport function boardCover(items: readonly CanvasItem[]): CanvasItem | undefined {\n return items.find((it) => it.type === 'image') ?? items.find((it) => it.type === 'video');\n}\n\nconst videoFrames = new Map<string, Promise<string | null>>();\n\n/**\n * A still from a video for its board cover, via the editing connector's\n * THUMBNAIL action (as the generate panel's frame picker). One request per\n * source per session; a failure is remembered as null so a broken clip is not\n * re-asked on every grid render. `pickUrl` reads the connector result.\n */\nexport function videoCoverFrame(\n src: string,\n runAction: RunMediaAction,\n pickUrl: (result: Record<string, unknown>) => string,\n): Promise<string | null> {\n const cached = videoFrames.get(src);\n if (cached) return cached;\n const job = runAction('yantra-video-editing', 'YANTRA_VIDEO_EDIT_THUMBNAIL', { input_url: src, time_secs: 1 })\n .then((result) => pickUrl(result) || null)\n .catch(() => null);\n videoFrames.set(src, job);\n return job;\n}\n\n/** Tests only. */\nexport function clearVideoCoverCache(): void {\n videoFrames.clear();\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import {isPresignedUrlExpiring,signStoredMediaUrl,presignedUrlExpiresAtMs,canonicalMediaUrl,unwrapProxyUrl}from'./mediaUrls.js';import {deriveBackendGraphqlUrl}from'./videoEditor/remoteMediaClient.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
function linksBackendUrl(backendGraphqlUrl) {
|
|
21
|
+
const match = (backendGraphqlUrl != null ? backendGraphqlUrl : "").trim().match(/^(https?:)\/\/([^/]+)(\/.*)?$/i);
|
|
22
|
+
if (!match) return "";
|
|
23
|
+
const labels = match[2].split(".");
|
|
24
|
+
if (labels.length < 3) return "";
|
|
25
|
+
return `${match[1]}//links-backend.${labels.slice(1).join(".")}${match[3] || "/graphql"}`;
|
|
26
|
+
}
|
|
27
|
+
const LINK_CREATE_MUTATION = "mutation($input:LinkCreateInput!){linkCreate(input:$input){id shortUrl}}";
|
|
28
|
+
const LINK_UPDATE_MUTATION = "mutation($id:ID!,$input:LinkUpdateInput!){linkUpdate(id:$id,input:$input){id}}";
|
|
29
|
+
function linkCreateRequest(destination, title) {
|
|
30
|
+
return {
|
|
31
|
+
query: LINK_CREATE_MUTATION,
|
|
32
|
+
variables: {
|
|
33
|
+
input: {
|
|
34
|
+
destination,
|
|
35
|
+
title,
|
|
36
|
+
tags: ["canvas"]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function linkUpdateRequest(id, destination) {
|
|
42
|
+
return {
|
|
43
|
+
query: LINK_UPDATE_MUTATION,
|
|
44
|
+
variables: {
|
|
45
|
+
id,
|
|
46
|
+
input: {
|
|
47
|
+
destination
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async function linksRequest(opts, body) {
|
|
53
|
+
var _a, _b, _c;
|
|
54
|
+
const url = linksBackendUrl(deriveBackendGraphqlUrl(opts.indexUrl));
|
|
55
|
+
if (!url) throw new Error("Share links are not available here.");
|
|
56
|
+
const res = await fetch(url, {
|
|
57
|
+
method: "POST",
|
|
58
|
+
headers: __spreadValues({
|
|
59
|
+
"content-type": "application/json"
|
|
60
|
+
}, opts.token ? {
|
|
61
|
+
authorization: `Bearer ${opts.token}`
|
|
62
|
+
} : {}),
|
|
63
|
+
body: JSON.stringify(body)
|
|
64
|
+
});
|
|
65
|
+
if (!res.ok) throw new Error(`Share links are unreachable (HTTP ${res.status}).`);
|
|
66
|
+
const payload = await res.json();
|
|
67
|
+
if (((_a = payload.errors) == null ? void 0 : _a.length) || !payload.data) {
|
|
68
|
+
throw new Error(((_c = (_b = payload.errors) == null ? void 0 : _b[0]) == null ? void 0 : _c.message) || "Share link request failed.");
|
|
69
|
+
}
|
|
70
|
+
return payload.data;
|
|
71
|
+
}
|
|
72
|
+
async function createShareLink(opts, destination, title) {
|
|
73
|
+
const data = await linksRequest(opts, linkCreateRequest(destination, title));
|
|
74
|
+
return data.linkCreate;
|
|
75
|
+
}
|
|
76
|
+
async function updateShareLinkDestination(opts, id, destination) {
|
|
77
|
+
await linksRequest(opts, linkUpdateRequest(id, destination));
|
|
78
|
+
}
|
|
79
|
+
const SHARE_LINK_MIN_LIFE_MS = 24 * 60 * 60 * 1e3;
|
|
80
|
+
function shareableMediaUrl(src) {
|
|
81
|
+
const shareable = canonicalMediaUrl(src);
|
|
82
|
+
if (!/^https?:\/\//i.test(shareable)) return null;
|
|
83
|
+
if (unwrapProxyUrl(shareable) !== shareable) return null;
|
|
84
|
+
if (/generativelanguage\.googleapis|googleusercontent\.com/i.test(shareable)) return null;
|
|
85
|
+
return shareable;
|
|
86
|
+
}
|
|
87
|
+
function shareLinkNeedsRefresh(share, nowMs = Date.now()) {
|
|
88
|
+
var _a;
|
|
89
|
+
if (!share) return true;
|
|
90
|
+
const expiresAt = (_a = share.expiresAt) != null ? _a : null;
|
|
91
|
+
return expiresAt !== null && expiresAt - nowMs < SHARE_LINK_MIN_LIFE_MS;
|
|
92
|
+
}
|
|
93
|
+
async function ensureItemShareLink(item, deps) {
|
|
94
|
+
var _a, _b, _c, _d;
|
|
95
|
+
const shareable = shareableMediaUrl(item.src);
|
|
96
|
+
if (!shareable) throw new Error("This media can't be shared yet.");
|
|
97
|
+
const now = (_a = deps.now) != null ? _a : Date.now;
|
|
98
|
+
if (item.share && !shareLinkNeedsRefresh(item.share, now())) {
|
|
99
|
+
return {
|
|
100
|
+
src: item.src,
|
|
101
|
+
share: item.share,
|
|
102
|
+
changed: false
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const destination = isPresignedUrlExpiring(shareable, now(), SHARE_LINK_MIN_LIFE_MS) ? (_b = await signStoredMediaUrl(deps.run, shareable)) != null ? _b : shareable : shareable;
|
|
106
|
+
if (isPresignedUrlExpiring(destination, now())) {
|
|
107
|
+
throw new Error("The media link has expired and could not be renewed.");
|
|
108
|
+
}
|
|
109
|
+
const expiresAt = presignedUrlExpiresAtMs(destination);
|
|
110
|
+
if (item.share) {
|
|
111
|
+
await ((_c = deps.update) != null ? _c : updateShareLinkDestination)(deps.links, item.share.linkId, destination);
|
|
112
|
+
return {
|
|
113
|
+
src: destination,
|
|
114
|
+
share: __spreadProps(__spreadValues({}, item.share), {
|
|
115
|
+
expiresAt
|
|
116
|
+
}),
|
|
117
|
+
changed: true
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const link = await ((_d = deps.create) != null ? _d : createShareLink)(deps.links, destination, item.generatedAssetName || `Canvas ${item.type}`);
|
|
121
|
+
return {
|
|
122
|
+
src: destination,
|
|
123
|
+
share: {
|
|
124
|
+
linkId: link.id,
|
|
125
|
+
shortUrl: link.shortUrl,
|
|
126
|
+
expiresAt
|
|
127
|
+
},
|
|
128
|
+
changed: true
|
|
129
|
+
};
|
|
130
|
+
}export{LINK_CREATE_MUTATION,LINK_UPDATE_MUTATION,SHARE_LINK_MIN_LIFE_MS,createShareLink,ensureItemShareLink,linkCreateRequest,linkUpdateRequest,linksBackendUrl,shareLinkNeedsRefresh,shareableMediaUrl,updateShareLinkDestination};//# sourceMappingURL=linksRpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linksRpc.js","sources":["../../../src/features/canvas/linksRpc.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `rpc/linksRpc.ts` - short share links for\n * canvas media, minted on the Links surface backend\n * (`servers/links-subgraph-server`).\n *\n * The web reads its bearer from `hostServices()`; here the caller hands the\n * session token the canvas screen already holds, and the backend derives from\n * the index URL the same way the connector client does\n * (surface-index-backend.X -> ideback.X -> links-backend.X).\n */\nimport type { CanvasItem } from './canvasCore';\nimport {\n canonicalMediaUrl,\n isPresignedUrlExpiring,\n presignedUrlExpiresAtMs,\n signStoredMediaUrl,\n unwrapProxyUrl,\n} from './mediaUrls';\nimport type { RunMediaAction } from './videoEditor/mediaActions';\nimport { deriveBackendGraphqlUrl } from './videoEditor/remoteMediaClient';\n\nexport interface ShareLink {\n id: string;\n shortUrl: string;\n}\n\nexport interface LinksClientOptions {\n token: string;\n /** Surface index URL for this environment. */\n indexUrl: string;\n}\n\n/** `https://ideback.<plane>/graphql` -> `https://links-backend.<plane>/graphql`; '' when it cannot be told. */\nexport function linksBackendUrl(backendGraphqlUrl: string | null | undefined): string {\n const match = (backendGraphqlUrl ?? '').trim().match(/^(https?:)\\/\\/([^/]+)(\\/.*)?$/i);\n if (!match) return '';\n const labels = match[2].split('.');\n if (labels.length < 3) return '';\n return `${match[1]}//links-backend.${labels.slice(1).join('.')}${match[3] || '/graphql'}`;\n}\n\nexport const LINK_CREATE_MUTATION = 'mutation($input:LinkCreateInput!){linkCreate(input:$input){id shortUrl}}';\nexport const LINK_UPDATE_MUTATION = 'mutation($id:ID!,$input:LinkUpdateInput!){linkUpdate(id:$id,input:$input){id}}';\n\n/** The GraphQL body for minting a share link (web parity: tagged `canvas`). */\nexport function linkCreateRequest(destination: string, title: string) {\n return { query: LINK_CREATE_MUTATION, variables: { input: { destination, title, tags: ['canvas'] } } };\n}\n\n/** The GraphQL body for pointing an existing link at a re-signed URL. */\nexport function linkUpdateRequest(id: string, destination: string) {\n return { query: LINK_UPDATE_MUTATION, variables: { id, input: { destination } } };\n}\n\nasync function linksRequest<T>(opts: LinksClientOptions, body: { query: string; variables: unknown }): Promise<T> {\n const url = linksBackendUrl(deriveBackendGraphqlUrl(opts.indexUrl));\n if (!url) throw new Error('Share links are not available here.');\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify(body),\n });\n if (!res.ok) throw new Error(`Share links are unreachable (HTTP ${res.status}).`);\n const payload = (await res.json()) as { data?: T; errors?: Array<{ message?: string }> };\n if (payload.errors?.length || !payload.data) {\n throw new Error(payload.errors?.[0]?.message || 'Share link request failed.');\n }\n return payload.data;\n}\n\nexport async function createShareLink(\n opts: LinksClientOptions,\n destination: string,\n title: string,\n): Promise<ShareLink> {\n const data = await linksRequest<{ linkCreate: ShareLink }>(opts, linkCreateRequest(destination, title));\n return data.linkCreate;\n}\n\nexport async function updateShareLinkDestination(\n opts: LinksClientOptions,\n id: string,\n destination: string,\n): Promise<void> {\n await linksRequest(opts, linkUpdateRequest(id, destination));\n}\n\n// ============= Item share links (web CanvasPage `handleShareLink`) =============\n\n/** A share link is re-pointed when its destination lapses within a day. */\nexport const SHARE_LINK_MIN_LIFE_MS = 24 * 60 * 60 * 1000;\n\nexport type ItemShare = NonNullable<CanvasItem['share']>;\n\n/**\n * The URL a share link may point at, or null. Phone-local and provider-held\n * media (agent-proxied, Google Veo URIs) have no public URL; a presigned clip\n * saved inside a proxy link shares as the storage URL it wraps.\n */\nexport function shareableMediaUrl(src: string): string | null {\n const shareable = canonicalMediaUrl(src);\n if (!/^https?:\\/\\//i.test(shareable)) return null;\n if (unwrapProxyUrl(shareable) !== shareable) return null;\n if (/generativelanguage\\.googleapis|googleusercontent\\.com/i.test(shareable)) return null;\n return shareable;\n}\n\n/** True when the item's stored link is missing or its destination lapses within {@link SHARE_LINK_MIN_LIFE_MS}. */\nexport function shareLinkNeedsRefresh(share: CanvasItem['share'], nowMs = Date.now()): boolean {\n if (!share) return true;\n const expiresAt = share.expiresAt ?? null;\n return expiresAt !== null && expiresAt - nowMs < SHARE_LINK_MIN_LIFE_MS;\n}\n\nexport interface ItemShareDeps {\n links: LinksClientOptions;\n run?: RunMediaAction;\n /** Seams for tests; default to the real links backend. */\n create?: typeof createShareLink;\n update?: typeof updateShareLinkDestination;\n now?: () => number;\n}\n\n/**\n * The item's share link, minted or re-pointed as needed. Re-signs the media\n * first when its signature would lapse within a day, so the short link does\n * not outlive its destination. `changed` is false when the stored link is\n * still good - nothing to persist then.\n */\nexport async function ensureItemShareLink(\n item: Pick<CanvasItem, 'src' | 'type' | 'share' | 'generatedAssetName'>,\n deps: ItemShareDeps,\n): Promise<{ src: string; share: ItemShare; changed: boolean }> {\n const shareable = shareableMediaUrl(item.src);\n if (!shareable) throw new Error(\"This media can't be shared yet.\");\n const now = deps.now ?? Date.now;\n if (item.share && !shareLinkNeedsRefresh(item.share, now())) {\n return { src: item.src, share: item.share, changed: false };\n }\n const destination = isPresignedUrlExpiring(shareable, now(), SHARE_LINK_MIN_LIFE_MS)\n ? ((await signStoredMediaUrl(deps.run, shareable)) ?? shareable)\n : shareable;\n if (isPresignedUrlExpiring(destination, now())) {\n throw new Error('The media link has expired and could not be renewed.');\n }\n const expiresAt = presignedUrlExpiresAtMs(destination);\n if (item.share) {\n await (deps.update ?? updateShareLinkDestination)(deps.links, item.share.linkId, destination);\n return { src: destination, share: { ...item.share, expiresAt }, changed: true };\n }\n const link = await (deps.create ?? createShareLink)(\n deps.links,\n destination,\n item.generatedAssetName || `Canvas ${item.type}`,\n );\n return { src: destination, share: { linkId: link.id, shortUrl: link.shortUrl, expiresAt }, changed: true };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAyBO,SAAS,gBAAgB,iBAAsD,EAAA;AACpF,EAAA,MAAM,SAAS,iBAAqB,IAAA,IAAA,GAAA,iBAAA,GAAA,EAAA,EAAI,IAAK,EAAA,CAAE,MAAM,gCAAgC,CAAA;AACrF,EAAI,IAAA,CAAC,OAAc,OAAA,EAAA;AACnB,EAAA,MAAM,MAAS,GAAA,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,GAAG,CAAA;AACjC,EAAI,IAAA,MAAA,CAAO,MAAS,GAAA,CAAA,EAAU,OAAA,EAAA;AAC9B,EAAA,OAAO,GAAG,KAAM,CAAA,CAAC,CAAC,CAAA,gBAAA,EAAmB,OAAO,KAAM,CAAA,CAAC,CAAE,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG,KAAM,CAAA,CAAC,KAAK,UAAU,CAAA,CAAA;AACzF;AACO,MAAM,oBAAuB,GAAA;AAC7B,MAAM,oBAAuB,GAAA;AAGpB,SAAA,iBAAA,CAAkB,aAAqB,KAAe,EAAA;AACpE,EAAO,OAAA;AAAA,IACL,KAAO,EAAA,oBAAA;AAAA,IACP,SAAW,EAAA;AAAA,MACT,KAAO,EAAA;AAAA,QACL,WAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA,EAAM,CAAC,QAAQ;AAAA;AACjB;AACF,GACF;AACF;AAGgB,SAAA,iBAAA,CAAkB,IAAY,WAAqB,EAAA;AACjE,EAAO,OAAA;AAAA,IACL,KAAO,EAAA,oBAAA;AAAA,IACP,SAAW,EAAA;AAAA,MACT,EAAA;AAAA,MACA,KAAO,EAAA;AAAA,QACL;AAAA;AACF;AACF,GACF;AACF;AACA,eAAe,YAAA,CAAgB,MAA0B,IAG1C,EAAA;AAhEf,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAiEE,EAAA,MAAM,GAAM,GAAA,eAAA,CAAgB,uBAAwB,CAAA,IAAA,CAAK,QAAQ,CAAC,CAAA;AAClE,EAAA,IAAI,CAAC,GAAA,EAAW,MAAA,IAAI,MAAM,qCAAqC,CAAA;AAC/D,EAAM,MAAA,GAAA,GAAM,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,IAC3B,MAAQ,EAAA,MAAA;AAAA,IACR,OAAS,EAAA,cAAA,CAAA;AAAA,MACP,cAAgB,EAAA;AAAA,KAAA,EACZ,KAAK,KAAQ,GAAA;AAAA,MACf,aAAA,EAAe,CAAU,OAAA,EAAA,IAAA,CAAK,KAAK,CAAA;AAAA,QACjC,EAAC,CAAA;AAAA,IAEP,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,IAAI;AAAA,GAC1B,CAAA;AACD,EAAI,IAAA,CAAC,IAAI,EAAI,EAAA,MAAM,IAAI,KAAM,CAAA,CAAA,kCAAA,EAAqC,GAAI,CAAA,MAAM,CAAI,EAAA,CAAA,CAAA;AAChF,EAAM,MAAA,OAAA,GAAW,MAAM,GAAA,CAAI,IAAK,EAAA;AAMhC,EAAA,IAAA,CAAA,CAAI,aAAQ,MAAR,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAgB,MAAU,KAAA,CAAC,QAAQ,IAAM,EAAA;AAC3C,IAAM,MAAA,IAAI,QAAM,EAAQ,GAAA,CAAA,EAAA,GAAA,OAAA,CAAA,MAAA,KAAR,mBAAiB,CAAjB,CAAA,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAqB,YAAW,4BAA4B,CAAA;AAAA;AAE9E,EAAA,OAAO,OAAQ,CAAA,IAAA;AACjB;AACsB,eAAA,eAAA,CAAgB,IAA0B,EAAA,WAAA,EAAqB,KAAmC,EAAA;AACtH,EAAA,MAAM,OAAO,MAAM,YAAA,CAEhB,MAAM,iBAAkB,CAAA,WAAA,EAAa,KAAK,CAAC,CAAA;AAC9C,EAAA,OAAO,IAAK,CAAA,UAAA;AACd;AACsB,eAAA,0BAAA,CAA2B,IAA0B,EAAA,EAAA,EAAY,WAAoC,EAAA;AACzH,EAAA,MAAM,YAAa,CAAA,IAAA,EAAM,iBAAkB,CAAA,EAAA,EAAI,WAAW,CAAC,CAAA;AAC7D;AAKa,MAAA,sBAAA,GAAyB,EAAK,GAAA,EAAA,GAAK,EAAK,GAAA;AAQ9C,SAAS,kBAAkB,GAA4B,EAAA;AAC5D,EAAM,MAAA,SAAA,GAAY,kBAAkB,GAAG,CAAA;AACvC,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAK,CAAA,SAAS,GAAU,OAAA,IAAA;AAC7C,EAAA,IAAI,cAAe,CAAA,SAAS,CAAM,KAAA,SAAA,EAAkB,OAAA,IAAA;AACpD,EAAA,IAAI,wDAAyD,CAAA,IAAA,CAAK,SAAS,CAAA,EAAU,OAAA,IAAA;AACrF,EAAO,OAAA,SAAA;AACT;AAGO,SAAS,qBAAsB,CAAA,KAAA,EAA4B,KAAQ,GAAA,IAAA,CAAK,KAAgB,EAAA;AAvH/F,EAAA,IAAA,EAAA;AAwHE,EAAI,IAAA,CAAC,OAAc,OAAA,IAAA;AACnB,EAAM,MAAA,SAAA,GAAA,CAAY,EAAM,GAAA,KAAA,CAAA,SAAA,KAAN,IAAmB,GAAA,EAAA,GAAA,IAAA;AACrC,EAAO,OAAA,SAAA,KAAc,IAAQ,IAAA,SAAA,GAAY,KAAQ,GAAA,sBAAA;AACnD;AAgBsB,eAAA,mBAAA,CAAoB,MAAyE,IAIhH,EAAA;AA/IH,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAgJE,EAAM,MAAA,SAAA,GAAY,iBAAkB,CAAA,IAAA,CAAK,GAAG,CAAA;AAC5C,EAAA,IAAI,CAAC,SAAA,EAAiB,MAAA,IAAI,MAAM,iCAAiC,CAAA;AACjE,EAAA,MAAM,GAAM,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,GAAL,KAAA,IAAA,GAAA,EAAA,GAAY,IAAK,CAAA,GAAA;AAC7B,EAAI,IAAA,IAAA,CAAK,SAAS,CAAC,qBAAA,CAAsB,KAAK,KAAO,EAAA,GAAA,EAAK,CAAG,EAAA;AAC3D,IAAO,OAAA;AAAA,MACL,KAAK,IAAK,CAAA,GAAA;AAAA,MACV,OAAO,IAAK,CAAA,KAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACX;AAAA;AAEF,EAAA,MAAM,WAAc,GAAA,sBAAA,CAAuB,SAAW,EAAA,GAAA,IAAO,sBAAsB,CAAA,GAAA,CAAK,EAAM,GAAA,MAAA,kBAAA,CAAmB,IAAK,CAAA,GAAA,EAAK,SAAS,CAAA,KAA5C,YAAkD,SAAY,GAAA,SAAA;AACtJ,EAAA,IAAI,sBAAuB,CAAA,WAAA,EAAa,GAAI,EAAC,CAAG,EAAA;AAC9C,IAAM,MAAA,IAAI,MAAM,sDAAsD,CAAA;AAAA;AAExE,EAAM,MAAA,SAAA,GAAY,wBAAwB,WAAW,CAAA;AACrD,EAAA,IAAI,KAAK,KAAO,EAAA;AACd,IAAO,MAAA,CAAA,CAAA,EAAA,GAAA,IAAA,CAAK,WAAL,IAAe,GAAA,EAAA,GAAA,0BAAA,EAA4B,KAAK,KAAO,EAAA,IAAA,CAAK,KAAM,CAAA,MAAA,EAAQ,WAAW,CAAA;AAC5F,IAAO,OAAA;AAAA,MACL,GAAK,EAAA,WAAA;AAAA,MACL,KAAA,EAAO,aACF,CAAA,cAAA,CAAA,EAAA,EAAA,IAAA,CAAK,KADH,CAAA,EAAA;AAAA,QAEL;AAAA,OACF,CAAA;AAAA,MACA,OAAS,EAAA;AAAA,KACX;AAAA;AAEF,EAAA,MAAM,IAAO,GAAA,MAAA,CAAA,CAAO,EAAK,GAAA,IAAA,CAAA,MAAA,KAAL,YAAe,eAAiB,EAAA,IAAA,CAAK,KAAO,EAAA,WAAA,EAAa,IAAK,CAAA,kBAAA,IAAsB,CAAU,OAAA,EAAA,IAAA,CAAK,IAAI,CAAE,CAAA,CAAA;AAC7H,EAAO,OAAA;AAAA,IACL,GAAK,EAAA,WAAA;AAAA,IACL,KAAO,EAAA;AAAA,MACL,QAAQ,IAAK,CAAA,EAAA;AAAA,MACb,UAAU,IAAK,CAAA,QAAA;AAAA,MACf;AAAA,KACF;AAAA,IACA,OAAS,EAAA;AAAA,GACX;AACF"}
|