@gentbajko/slopify 3.25.9 → 4.1.0
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/dist/adapters/account-limits.js +30 -0
- package/dist/adapters/alignment/audio.js +1 -1
- package/dist/adapters/alignment/cache.js +4 -6
- package/dist/adapters/alignment/ctc.js +1 -2
- package/dist/adapters/alignment/lock.js +4 -3
- package/dist/adapters/alignment/multilingual.js +2 -4
- package/dist/adapters/alignment/prefetch.js +2 -1
- package/dist/adapters/alignment/runner.js +1 -1
- package/dist/adapters/alignment/worker.js +3 -2
- package/dist/adapters/explain.js +10 -12
- package/dist/adapters/ffmpeg.js +19 -1
- package/dist/adapters/host-cli/index.js +21 -4
- package/dist/adapters/host-cli/transport.js +2 -1
- package/dist/adapters/http-failure.js +53 -0
- package/dist/adapters/image/bytes.js +2 -1
- package/dist/adapters/image/codex.js +42 -9
- package/dist/adapters/image/fal.js +21 -53
- package/dist/adapters/image/google.js +33 -56
- package/dist/adapters/image/models.js +2 -2
- package/dist/adapters/image/openai.js +22 -48
- package/dist/adapters/image/reference.js +36 -0
- package/dist/adapters/image/replicate.js +21 -49
- package/dist/adapters/image/video.js +2 -1
- package/dist/adapters/interest/search-interest.js +113 -0
- package/dist/adapters/key-probes.js +54 -3
- package/dist/adapters/llm/antigravity-models.js +1 -1
- package/dist/adapters/llm/antigravity.js +11 -6
- package/dist/adapters/llm/assistant-cli.js +388 -0
- package/dist/adapters/llm/child-session.js +83 -0
- package/dist/adapters/llm/claude-code-models.js +52 -99
- package/dist/adapters/llm/claude-code.js +16 -4
- package/dist/adapters/llm/codex-limits.js +27 -68
- package/dist/adapters/llm/codex-models.js +1 -1
- package/dist/adapters/llm/codex-server-models.js +61 -109
- package/dist/adapters/llm/codex.js +12 -1
- package/dist/adapters/llm/document-workspace.js +3 -2
- package/dist/adapters/llm/image-workspace.js +3 -2
- package/dist/adapters/llm/openrouter.js +12 -48
- package/dist/adapters/llm/run-cli.js +9 -24
- package/dist/adapters/llm/sse-lines.js +5 -1
- package/dist/adapters/model-access.js +37 -0
- package/dist/adapters/tts/cartesia.js +15 -46
- package/dist/adapters/tts/elevenlabs.js +20 -52
- package/dist/adapters/tts/gemini.js +21 -41
- package/dist/adapters/tts/inworld-async.js +6 -2
- package/dist/adapters/tts/inworld.js +6 -2
- package/dist/adapters/tts/openai.js +20 -50
- package/dist/adapters/tts/system.js +2 -1
- package/dist/assets/models-lifecycle.yaml +6 -0
- package/dist/assistant-wiring.js +60 -0
- package/dist/autopilot-timers.js +59 -0
- package/dist/catalog/lifecycle.js +52 -0
- package/dist/catalog/propose.js +204 -0
- package/dist/catalog/registry.js +23 -14
- package/dist/catalog/schema.js +4 -1
- package/dist/catalog/store.js +39 -0
- package/dist/catalog/validate.js +5 -2
- package/dist/edge/autostart/native.js +3 -5
- package/dist/edge/autostart/prompt.js +2 -1
- package/dist/edge/autostart/service.js +3 -4
- package/dist/edge/cli-args.js +3 -4
- package/dist/edge/cli.js +2 -1
- package/dist/edge/docker-install/apply.js +11 -11
- package/dist/edge/docker-install/run.js +2 -1
- package/dist/edge/docker-install/state.js +4 -3
- package/dist/edge/docker-install/tree.js +2 -4
- package/dist/edge/docker-install/volume.js +3 -2
- package/dist/edge/docker.js +5 -4
- package/dist/edge/events/hub.js +5 -5
- package/dist/edge/http/actions.js +11 -32
- package/dist/edge/http/actor.js +5 -3
- package/dist/edge/http/app.js +86 -11
- package/dist/edge/http/assistant.js +129 -0
- package/dist/edge/http/audio-preview.js +4 -11
- package/dist/edge/http/auditions.js +1 -1
- package/dist/edge/http/autostart.js +5 -5
- package/dist/edge/http/backups.js +2 -4
- package/dist/edge/http/channel-memory.js +9 -22
- package/dist/edge/http/channels.js +14 -27
- package/dist/edge/http/checkpoints.js +39 -21
- package/dist/edge/http/design-templates.js +167 -0
- package/dist/edge/http/designs.js +178 -0
- package/dist/edge/http/diagnostics.js +5 -1
- package/dist/edge/http/document-themes.js +5 -14
- package/dist/edge/http/draft-files.js +1 -3
- package/dist/edge/http/draft-problem.js +5 -10
- package/dist/edge/http/drafts.js +3 -3
- package/dist/edge/http/entries.js +6 -9
- package/dist/edge/http/extension-auth.js +27 -0
- package/dist/edge/http/external-reviews.js +12 -11
- package/dist/edge/http/files.js +5 -11
- package/dist/edge/http/folder-location.js +1 -4
- package/dist/edge/http/fonts.js +0 -7
- package/dist/edge/http/home.js +47 -14
- package/dist/edge/http/host-cli.js +18 -8
- package/dist/edge/http/ids.js +8 -0
- package/dist/edge/http/keywords.js +35 -0
- package/dist/edge/http/model-checks.js +132 -0
- package/dist/edge/http/narration-peaks.js +5 -13
- package/dist/edge/http/onboarding.js +30 -26
- package/dist/edge/http/open-folder.js +5 -10
- package/dist/edge/http/outputs.js +7 -14
- package/dist/edge/http/patch-notes.js +6 -12
- package/dist/edge/http/planning.js +3 -7
- package/dist/edge/http/problem.js +2 -4
- package/dist/edge/http/project-create.js +2 -1
- package/dist/edge/http/project-templates.js +31 -19
- package/dist/edge/http/projects.js +24 -16
- package/dist/edge/http/prompts.js +9 -16
- package/dist/edge/http/pronunciations.js +1 -2
- package/dist/edge/http/providers.js +48 -34
- package/dist/edge/http/refusal.js +29 -0
- package/dist/edge/http/remote-access.js +40 -0
- package/dist/edge/http/remote-guard.js +71 -0
- package/dist/edge/http/request-guard.js +91 -0
- package/dist/edge/http/reviews.js +12 -25
- package/dist/edge/http/revision-files.js +6 -11
- package/dist/edge/http/revisions.js +14 -19
- package/dist/edge/http/run-cost.js +1 -2
- package/dist/edge/http/same-page.js +80 -0
- package/dist/edge/http/schedules.js +69 -40
- package/dist/edge/http/settings.js +27 -14
- package/dist/edge/http/social.js +283 -0
- package/dist/edge/http/staging.js +3 -5
- package/dist/edge/http/storage-files.js +5 -7
- package/dist/edge/http/storage.js +33 -25
- package/dist/edge/http/studio.js +94 -69
- package/dist/edge/http/style-preview.js +3 -6
- package/dist/edge/http/subtitles.js +3 -17
- package/dist/edge/http/template-studio.js +436 -0
- package/dist/edge/http/trash.js +11 -12
- package/dist/edge/http/tutorial.js +1 -2
- package/dist/edge/http/tutorials.js +5 -11
- package/dist/edge/http/update.js +7 -13
- package/dist/edge/http/waveform.js +3 -6
- package/dist/edge/http/youtube-edits.js +3 -4
- package/dist/edge/mcp/assistant.js +279 -0
- package/dist/edge/mcp/attribution.js +8 -2
- package/dist/edge/mcp/call-route.js +11 -2
- package/dist/edge/mcp/excluded-routes.js +29 -3
- package/dist/edge/mcp/http.js +11 -2
- package/dist/edge/mcp/instructions.js +6 -4
- package/dist/edge/mcp/library-tools.js +9 -5
- package/dist/edge/mcp/remake-tools.js +7 -4
- package/dist/edge/mcp/route-tool.js +35 -15
- package/dist/edge/mcp/server.js +13 -8
- package/dist/edge/mcp/tools-channels.js +11 -9
- package/dist/edge/mcp/tools-designs.js +165 -0
- package/dist/edge/mcp/tools-library.js +19 -7
- package/dist/edge/mcp/tools-planning.js +40 -21
- package/dist/edge/mcp/tools-projects.js +38 -11
- package/dist/edge/mcp/tools-publishing.js +9 -9
- package/dist/edge/mcp/tools-runs.js +23 -10
- package/dist/edge/mcp/tools-schedules.js +32 -8
- package/dist/edge/mcp/tools-setup.js +75 -11
- package/dist/edge/mcp/tools-social.js +47 -0
- package/dist/edge/mcp/tools-storage.js +11 -3
- package/dist/edge/mcp/tools-template-studio.js +166 -0
- package/dist/edge/mcp/tools.js +6 -0
- package/dist/edge/remote-access/cli.js +71 -0
- package/dist/edge/remote-access/model.js +32 -0
- package/dist/edge/remote-access/rules.js +207 -0
- package/dist/edge/remote-access/service.js +203 -0
- package/dist/edge/remote-access/store.js +44 -0
- package/dist/edge/remote-access/views.js +43 -0
- package/dist/extension/slopify-studio-chrome.zip +0 -0
- package/dist/extension/slopify-studio-firefox.zip +0 -0
- package/dist/host-cli/install.js +2 -2
- package/dist/host-cli/open-folder.js +2 -2
- package/dist/host-cli/paths.js +2 -4
- package/dist/host-cli/server.js +4 -4
- package/dist/host-cli/service.js +3 -3
- package/dist/host-cli/status.js +7 -7
- package/dist/kernel/db/migrations/0063-model-checks.sql +20 -0
- package/dist/kernel/db/migrations/0064-template-studio.sql +46 -0
- package/dist/kernel/db/migrations/0065-promise-and-assistant-reviews.sql +58 -0
- package/dist/kernel/db/migrations/0066-assistant.sql +44 -0
- package/dist/kernel/db/migrations/0067-autopilot.sql +6 -0
- package/dist/kernel/db/migrations/0068-topic-scores.sql +17 -0
- package/dist/kernel/db/migrations/0070-designs.sql +53 -0
- package/dist/kernel/db/migrations/0071-design-usage.sql +33 -0
- package/dist/kernel/db/migrations/0072-design-templates.sql +33 -0
- package/dist/kernel/db/migrations/0073-schedule-design-kind.sql +5 -0
- package/dist/kernel/db/migrations/0074-template-bakeoffs.sql +44 -0
- package/dist/kernel/db/migrations/0075-social-posts.sql +25 -0
- package/dist/kernel/db/migrations/0076-channel-social.sql +5 -0
- package/dist/kernel/db/migrations/0077-post-prompts.sql +17 -0
- package/dist/kernel/db/migrations/0078-uploaded-from-links.sql +7 -0
- package/dist/kernel/db/tx.js +2 -4
- package/dist/kernel/errors.js +27 -1
- package/dist/kernel/json-answer.js +15 -0
- package/dist/kernel/lock.js +4 -9
- package/dist/kernel/paths.js +8 -0
- package/dist/kernel/pipeline.js +12 -0
- package/dist/kernel/ports/assistant-cli.js +4 -0
- package/dist/kernel/ports/host-cli.js +3 -0
- package/dist/kernel/ports/interest.js +4 -0
- package/dist/kernel/ports/languages.js +0 -3
- package/dist/kernel/ports/model.js +2 -0
- package/dist/kernel/ports/settings-places.js +31 -0
- package/dist/kernel/ports/system-speech.js +31 -3
- package/dist/kernel/runner/attempt.js +14 -4
- package/dist/kernel/runner/audition.js +3 -1
- package/dist/kernel/runner/checkpoint-authority.js +2 -1
- package/dist/kernel/runner/index.js +8 -10
- package/dist/kernel/runner/model-access.js +40 -0
- package/dist/kernel/runner/model-check.js +153 -0
- package/dist/kernel/runner/providers.js +18 -12
- package/dist/kernel/runner/standalone.js +11 -7
- package/dist/main.js +338 -21
- package/dist/model-catalog.js +20 -0
- package/dist/model-checks.js +166 -0
- package/dist/patch-notes/4.0.0.md +51 -0
- package/dist/patch-notes/4.1.0.md +42 -0
- package/dist/patch-notes/index.json +12 -0
- package/dist/slices/admission/heads.js +2 -1
- package/dist/slices/admission/listing-facts.js +95 -0
- package/dist/slices/admission/repo.js +11 -7
- package/dist/slices/admission/rules.js +50 -15
- package/dist/slices/admission/schema.js +8 -0
- package/dist/slices/admission/stage-writes.js +0 -3
- package/dist/slices/admission/start.js +48 -31
- package/dist/slices/admission/state-words.js +34 -5
- package/dist/slices/admission/substitute.js +7 -4
- package/dist/slices/agents/attention-posts.js +31 -0
- package/dist/slices/agents/attention-templates.js +33 -0
- package/dist/slices/agents/attention.js +10 -1
- package/dist/slices/agents/connection.js +2 -6
- package/dist/slices/agents/model.js +6 -3
- package/dist/slices/agents/repo.js +15 -7
- package/dist/slices/article/continuation.js +0 -63
- package/dist/slices/article/plain.js +3 -2
- package/dist/slices/article/segments.js +2 -62
- package/dist/slices/assistant/access.js +1 -0
- package/dist/slices/assistant/asks.js +80 -0
- package/dist/slices/assistant/cost.js +54 -0
- package/dist/slices/assistant/gate.js +222 -0
- package/dist/slices/assistant/model.js +86 -0
- package/dist/slices/assistant/names.js +23 -0
- package/dist/slices/assistant/prompt.js +74 -0
- package/dist/slices/assistant/repo.js +74 -0
- package/dist/slices/assistant/tokens.js +18 -0
- package/dist/slices/assistant/turn.js +344 -0
- package/dist/slices/autopilot/buffer.js +76 -0
- package/dist/slices/autopilot/model.js +14 -0
- package/dist/slices/autopilot/notify.js +27 -0
- package/dist/slices/autopilot/repo.js +34 -0
- package/dist/slices/autopilot/signals.js +194 -0
- package/dist/slices/autopilot/warnings.js +85 -0
- package/dist/slices/autopilot/weekly.js +100 -0
- package/dist/slices/backups/files.js +2 -6
- package/dist/slices/backups/repo.js +3 -15
- package/dist/slices/backups/service.js +8 -7
- package/dist/slices/channels/cast-images.js +3 -2
- package/dist/slices/channels/model.js +0 -1
- package/dist/slices/channels/rebrand.js +0 -3
- package/dist/slices/channels/repo.js +4 -0
- package/dist/slices/channels/schema.js +7 -1
- package/dist/slices/channels/service.js +10 -0
- package/dist/slices/channels/videos.js +3 -15
- package/dist/slices/checkpoints/index.js +0 -1
- package/dist/slices/control/providers.js +2 -28
- package/dist/slices/designs/artwork.js +66 -0
- package/dist/slices/designs/budget.js +23 -0
- package/dist/slices/designs/calls.js +124 -0
- package/dist/slices/designs/check-context.js +38 -0
- package/dist/slices/designs/check-text.js +43 -0
- package/dist/slices/designs/fields.js +88 -0
- package/dist/slices/designs/frames.js +34 -0
- package/dist/slices/designs/gate.js +130 -0
- package/dist/slices/designs/layout.js +293 -0
- package/dist/slices/designs/model.js +35 -0
- package/dist/slices/designs/pdf-job.js +23 -0
- package/dist/slices/designs/pdf-pages.js +30 -0
- package/dist/slices/designs/pdf-runner.js +68 -0
- package/dist/slices/designs/pdf-worker.js +24 -0
- package/dist/slices/designs/picture-size.js +79 -0
- package/dist/slices/designs/pictures.js +55 -0
- package/dist/slices/designs/quote.js +24 -0
- package/dist/slices/designs/render-args.js +36 -0
- package/dist/slices/designs/render-input.js +59 -0
- package/dist/slices/designs/render.js +215 -0
- package/dist/slices/designs/repo.js +101 -0
- package/dist/slices/designs/requests.js +80 -0
- package/dist/slices/designs/runner.js +239 -0
- package/dist/slices/designs/sample-repo.js +91 -0
- package/dist/slices/designs/sample.js +223 -0
- package/dist/slices/designs/schema.js +87 -0
- package/dist/slices/designs/sections.js +44 -0
- package/dist/slices/designs/service.js +233 -0
- package/dist/slices/designs/steps-repo.js +102 -0
- package/dist/slices/designs/studio-kind.js +39 -0
- package/dist/slices/designs/template-checks.js +44 -0
- package/dist/slices/designs/template-make.js +118 -0
- package/dist/slices/designs/templates.js +218 -0
- package/dist/slices/document/fonts.js +2 -1
- package/dist/slices/document/model.js +7 -4
- package/dist/slices/document/render.js +2 -1
- package/dist/slices/document/theme-schema.js +1 -1
- package/dist/slices/document/theme.js +49 -3
- package/dist/slices/episodes/summarize.js +6 -2
- package/dist/slices/estimate/index.js +72 -28
- package/dist/slices/estimate/requests.js +4 -4
- package/dist/slices/fixes/rules.js +3 -1
- package/dist/slices/fonts/catalog.js +5 -3
- package/dist/slices/fonts/coverage.js +2 -1
- package/dist/slices/fonts/discovery.js +3 -2
- package/dist/slices/fonts/files.js +2 -6
- package/dist/slices/fonts/index.js +0 -1
- package/dist/slices/fonts/sfnt.js +45 -10
- package/dist/slices/images/appearance.js +8 -16
- package/dist/slices/images/scenes.js +102 -28
- package/dist/slices/keywords/digest.js +85 -0
- package/dist/slices/keywords/facts.js +92 -0
- package/dist/slices/keywords/fill.js +80 -0
- package/dist/slices/keywords/model.js +75 -0
- package/dist/slices/keywords/rules.js +187 -0
- package/dist/slices/keywords/schema.js +28 -0
- package/dist/slices/keywords/specs.js +260 -0
- package/dist/slices/keywords/values.js +74 -0
- package/dist/slices/library/lint.js +29 -12
- package/dist/slices/library/model.js +2 -0
- package/dist/slices/library/photorealistic.js +4 -12
- package/dist/slices/library/rename.js +9 -7
- package/dist/slices/library/save.js +14 -10
- package/dist/slices/library/slots.js +37 -11
- package/dist/slices/library/transfer.js +5 -4
- package/dist/slices/library/used-by.js +25 -10
- package/dist/slices/loudness/loudnorm.js +53 -12
- package/dist/slices/loudness/model.js +3 -2
- package/dist/slices/loudness/sentence-level.js +2 -1
- package/dist/slices/model-checks/cost.js +61 -0
- package/dist/slices/model-checks/listing.js +124 -0
- package/dist/slices/model-checks/model.js +20 -0
- package/dist/slices/model-checks/record.js +32 -0
- package/dist/slices/model-checks/repo.js +120 -0
- package/dist/slices/model-checks/rules.js +125 -0
- package/dist/slices/model-checks/run.js +143 -0
- package/dist/slices/model-checks/service.js +198 -0
- package/dist/slices/model-upkeep/model.js +1 -1
- package/dist/slices/model-upkeep/switch.js +72 -27
- package/dist/slices/model-upkeep/usage.js +39 -13
- package/dist/slices/narration/breaths.js +3 -1
- package/dist/slices/narration/clean-pieces.js +3 -1
- package/dist/slices/narration/concat.js +2 -1
- package/dist/slices/narration/pauses-model.js +3 -2
- package/dist/slices/narration/peaks.js +3 -4
- package/dist/slices/narration/pronunciation-chunks.js +4 -3
- package/dist/slices/narration/pronunciation.js +6 -4
- package/dist/slices/narration/steering.js +4 -3
- package/dist/slices/notifications/notifier.js +4 -3
- package/dist/slices/notifications/rules.js +5 -2
- package/dist/slices/notifications/settings.js +4 -12
- package/dist/slices/notifications/subject.js +4 -3
- package/dist/slices/onboarding/copy.js +21 -3
- package/dist/slices/onboarding/first-run.js +16 -40
- package/dist/slices/onboarding/full-video.js +3 -2
- package/dist/slices/onboarding/install.js +6 -4
- package/dist/slices/onboarding/model.js +26 -37
- package/dist/slices/onboarding/packs.js +22 -22
- package/dist/slices/onboarding/preferred-model.js +14 -0
- package/dist/slices/onboarding/quick-short.js +105 -65
- package/dist/slices/onboarding/sample.js +4 -2
- package/dist/slices/onboarding/state.js +9 -11
- package/dist/slices/onboarding/template.js +8 -6
- package/dist/slices/outputs/add.js +3 -2
- package/dist/slices/outputs/service.js +2 -2
- package/dist/slices/patch-notes/library.js +4 -3
- package/dist/slices/play-drafts/convert.js +4 -0
- package/dist/slices/play-drafts/readiness.js +3 -3
- package/dist/slices/play-drafts/review-inputs.js +9 -3
- package/dist/slices/play-drafts/review.js +5 -4
- package/dist/slices/play-drafts/schema.js +4 -0
- package/dist/slices/play-drafts/service.js +17 -7
- package/dist/slices/project-templates/from-project.js +9 -2
- package/dist/slices/project-templates/next-chapter.js +2 -1
- package/dist/slices/project-templates/provider-defaults.js +22 -0
- package/dist/slices/project-templates/repo.js +6 -1
- package/dist/slices/project-templates/setup-sections.js +26 -0
- package/dist/slices/project-templates/setup.js +14 -1
- package/dist/slices/project-templates/stand-ins.js +22 -0
- package/dist/slices/rebuild/activity.js +2 -0
- package/dist/slices/rebuild/admission-repo.js +3 -2
- package/dist/slices/rebuild/narration-history.js +4 -5
- package/dist/slices/rebuild/narration-retry.js +2 -1
- package/dist/slices/rebuild/preview-details.js +32 -14
- package/dist/slices/rebuild/preview-plan.js +3 -8
- package/dist/slices/rebuild/recipe-build.js +8 -3
- package/dist/slices/rebuild/recipe-describe.js +3 -3
- package/dist/slices/rebuild/recipe-digest.js +58 -0
- package/dist/slices/rebuild/recipe-input-schema.js +10 -0
- package/dist/slices/rebuild/recipe-keywords.js +71 -0
- package/dist/slices/rebuild/recipe-legacy.js +5 -1
- package/dist/slices/rebuild/recipe-model.js +4 -0
- package/dist/slices/rebuild/recipe-narration-text.js +2 -1
- package/dist/slices/rebuild/recipe-preparation.js +4 -4
- package/dist/slices/rebuild/recipe-reference.js +8 -4
- package/dist/slices/rebuild/recipe-reviews.js +27 -7
- package/dist/slices/rebuild/recipe-save.js +8 -5
- package/dist/slices/rebuild/recipe-scenes.js +40 -11
- package/dist/slices/rebuild/recipe-shorts.js +8 -8
- package/dist/slices/rebuild/recipe-social.js +46 -0
- package/dist/slices/rebuild/recipe-text.js +64 -20
- package/dist/slices/rebuild/recipe-validation.js +102 -31
- package/dist/slices/rebuild/recipe-visual.js +55 -16
- package/dist/slices/rebuild/recipe-voices.js +3 -2
- package/dist/slices/rebuild/recipe-work.js +19 -7
- package/dist/slices/rebuild/recipe-youtube.js +4 -3
- package/dist/slices/rebuild/recovery-selection.js +3 -1
- package/dist/slices/rebuild/recovery.js +9 -8
- package/dist/slices/rebuild/remake-outdated.js +5 -5
- package/dist/slices/rebuild/repo.js +4 -3
- package/dist/slices/rebuild/review-promise.js +25 -0
- package/dist/slices/rebuild/review-redo.js +3 -2
- package/dist/slices/rebuild/runtime-admission.js +4 -3
- package/dist/slices/rebuild/runtime-agent-review.js +11 -5
- package/dist/slices/rebuild/runtime-animate.js +10 -9
- package/dist/slices/rebuild/runtime-article.js +7 -5
- package/dist/slices/rebuild/runtime-checkpoints.js +5 -4
- package/dist/slices/rebuild/runtime-document.js +11 -13
- package/dist/slices/rebuild/runtime-export-bed.js +8 -12
- package/dist/slices/rebuild/runtime-export-edit.js +8 -16
- package/dist/slices/rebuild/runtime-export-inputs.js +12 -11
- package/dist/slices/rebuild/runtime-export-short.js +9 -5
- package/dist/slices/rebuild/runtime-export.js +38 -15
- package/dist/slices/rebuild/runtime-figure-card.js +2 -1
- package/dist/slices/rebuild/runtime-image.js +8 -12
- package/dist/slices/rebuild/runtime-instructions.js +2 -0
- package/dist/slices/rebuild/runtime-keywords.js +59 -0
- package/dist/slices/rebuild/runtime-lines.js +2 -11
- package/dist/slices/rebuild/runtime-local.js +17 -22
- package/dist/slices/rebuild/runtime-narration-publication.js +2 -5
- package/dist/slices/rebuild/runtime-narration-reuse.js +9 -13
- package/dist/slices/rebuild/runtime-narration-text.js +13 -17
- package/dist/slices/rebuild/runtime-pictures.js +2 -4
- package/dist/slices/rebuild/runtime-piece-label.js +10 -6
- package/dist/slices/rebuild/runtime-plan.js +31 -5
- package/dist/slices/rebuild/runtime-provider.js +67 -25
- package/dist/slices/rebuild/runtime-publication.js +10 -9
- package/dist/slices/rebuild/runtime-review.js +39 -33
- package/dist/slices/rebuild/runtime-run.js +4 -1
- package/dist/slices/rebuild/runtime-shorts.js +31 -50
- package/dist/slices/rebuild/runtime-store.js +20 -10
- package/dist/slices/rebuild/runtime-subtitles.js +28 -25
- package/dist/slices/rebuild/runtime-voices.js +10 -16
- package/dist/slices/rebuild/runtime-youtube.js +14 -31
- package/dist/slices/rebuild/service-readiness.js +11 -3
- package/dist/slices/rebuild/transition-repo.js +6 -5
- package/dist/slices/rebuild/work-records.js +6 -0
- package/dist/slices/reruns/cascade.js +1 -2
- package/dist/slices/reruns/index.js +6 -9
- package/dist/slices/research/synthesis.js +3 -2
- package/dist/slices/reviews/external-model.js +4 -1
- package/dist/slices/reviews/external-repo.js +2 -1
- package/dist/slices/reviews/external-rows.js +2 -3
- package/dist/slices/reviews/holds.js +5 -4
- package/dist/slices/reviews/model.js +32 -11
- package/dist/slices/reviews/repo.js +2 -1
- package/dist/slices/reviews/rules.js +4 -3
- package/dist/slices/reviews/verdict.js +2 -1
- package/dist/slices/reviews/view.js +5 -2
- package/dist/slices/revisions/downloads.js +4 -5
- package/dist/slices/revisions/image-plan.js +1 -1
- package/dist/slices/revisions/mutation-assets.js +9 -5
- package/dist/slices/revisions/mutation-cues.js +2 -5
- package/dist/slices/revisions/mutations.js +3 -3
- package/dist/slices/revisions/repo.js +3 -1
- package/dist/slices/revisions/schema.js +1 -0
- package/dist/slices/revisions/view.js +20 -0
- package/dist/slices/run-cost/limits.js +5 -2
- package/dist/slices/run-cost/meter.js +12 -5
- package/dist/slices/run-cost/panel.js +8 -74
- package/dist/slices/run-cost/plan-readings.js +127 -0
- package/dist/slices/run-cost/plan-use.js +169 -0
- package/dist/slices/run-cost/pricing.js +3 -3
- package/dist/slices/run-cost/week.js +32 -4
- package/dist/slices/schedules/agenda.js +18 -7
- package/dist/slices/schedules/by-date.js +42 -0
- package/dist/slices/schedules/calendar.js +5 -0
- package/dist/slices/schedules/design-agenda.js +36 -0
- package/dist/slices/schedules/design-check.js +41 -0
- package/dist/slices/schedules/design-run.js +126 -0
- package/dist/slices/schedules/next-run.js +62 -0
- package/dist/slices/schedules/prepare.js +18 -2
- package/dist/slices/schedules/repo.js +30 -21
- package/dist/slices/schedules/rescore.js +35 -0
- package/dist/slices/schedules/scheduler.js +13 -3
- package/dist/slices/schedules/schema.js +57 -3
- package/dist/slices/schedules/score.js +107 -0
- package/dist/slices/schedules/service.js +57 -24
- package/dist/slices/schedules/topic-list.js +15 -0
- package/dist/slices/schedules/topic-scores.js +104 -0
- package/dist/slices/schedules/topics.js +53 -41
- package/dist/slices/settings/cli-paths.js +4 -6
- package/dist/slices/settings/first-run.js +8 -43
- package/dist/slices/settings/health.js +30 -15
- package/dist/slices/settings/key-test.js +1 -1
- package/dist/slices/settings/model-reach.js +3 -17
- package/dist/slices/settings/model.js +14 -2
- package/dist/slices/settings/playback.js +34 -23
- package/dist/slices/settings/probe-read.js +16 -0
- package/dist/slices/settings/repo.js +33 -0
- package/dist/slices/settings/tutorial.js +2 -2
- package/dist/slices/settings/voices.js +4 -12
- package/dist/slices/shorts/keep.js +2 -1
- package/dist/slices/shorts/pick.js +6 -18
- package/dist/slices/shorts/prompts.js +4 -14
- package/dist/slices/shorts/render.js +6 -2
- package/dist/slices/social/channel.js +44 -0
- package/dist/slices/social/defaults.js +17 -0
- package/dist/slices/social/due.js +36 -0
- package/dist/slices/social/extension.js +18 -0
- package/dist/slices/social/fit.js +115 -0
- package/dist/slices/social/limits.js +186 -0
- package/dist/slices/social/links.js +21 -0
- package/dist/slices/social/media.js +132 -0
- package/dist/slices/social/model.js +75 -0
- package/dist/slices/social/notice.js +19 -0
- package/dist/slices/social/pack.js +176 -0
- package/dist/slices/social/post-prompt.js +56 -0
- package/dist/slices/social/queue.js +31 -0
- package/dist/slices/social/repo.js +133 -0
- package/dist/slices/social/reshape.js +97 -0
- package/dist/slices/social/rules.js +5 -0
- package/dist/slices/social/schema.js +70 -0
- package/dist/slices/social/serve.js +51 -0
- package/dist/slices/social/service.js +129 -0
- package/dist/slices/social/settings.js +21 -0
- package/dist/slices/social/sources.js +114 -0
- package/dist/slices/social/state.js +110 -0
- package/dist/slices/social/text.js +149 -0
- package/dist/slices/storage/arrange.js +3 -1
- package/dist/slices/storage/assets.js +8 -10
- package/dist/slices/storage/backup-designs.js +74 -0
- package/dist/slices/storage/backup-export.js +8 -3
- package/dist/slices/storage/backup-format.js +10 -0
- package/dist/slices/storage/backup-import.js +22 -4
- package/dist/slices/storage/delete-project.js +6 -5
- package/dist/slices/storage/files-location.js +6 -8
- package/dist/slices/storage/layout.js +13 -2
- package/dist/slices/storage/model.js +3 -0
- package/dist/slices/storage/portable.js +17 -12
- package/dist/slices/storage/schema.js +2 -0
- package/dist/slices/storage/staging-refs.js +2 -1
- package/dist/slices/storage/staging.js +6 -9
- package/dist/slices/storage/trim.js +26 -9
- package/dist/slices/studio/calendar.js +7 -2
- package/dist/slices/studio/disclosure.js +4 -4
- package/dist/slices/studio/model.js +1 -1
- package/dist/slices/studio/pack.js +9 -8
- package/dist/slices/studio/pick.js +2 -11
- package/dist/slices/studio/plan.js +7 -16
- package/dist/slices/studio/queue.js +3 -14
- package/dist/slices/studio/releases.js +26 -0
- package/dist/slices/studio/settings.js +20 -57
- package/dist/slices/studio/videos.js +35 -4
- package/dist/slices/style-preview/render.js +37 -16
- package/dist/slices/style-preview/schema.js +14 -1
- package/dist/slices/style-preview/service.js +2 -1
- package/dist/slices/style-preview/settings.js +33 -5
- package/dist/slices/subtitles/captions.js +1 -1
- package/dist/slices/telemetry/collector-client.js +2 -4
- package/dist/slices/telemetry/flush.js +2 -4
- package/dist/slices/telemetry/model.js +0 -7
- package/dist/slices/telemetry/record.js +10 -3
- package/dist/slices/template-studio/anatomy-view.js +161 -0
- package/dist/slices/template-studio/anatomy.js +73 -0
- package/dist/slices/template-studio/bakeoff-make.js +225 -0
- package/dist/slices/template-studio/bakeoff-repo.js +83 -0
- package/dist/slices/template-studio/bakeoff.js +333 -0
- package/dist/slices/template-studio/budget.js +106 -0
- package/dist/slices/template-studio/cards.js +78 -0
- package/dist/slices/template-studio/checks.js +322 -0
- package/dist/slices/template-studio/document-sample.js +56 -0
- package/dist/slices/template-studio/edit.js +15 -0
- package/dist/slices/template-studio/for-all.js +161 -0
- package/dist/slices/template-studio/free-video.js +31 -0
- package/dist/slices/template-studio/free.js +176 -0
- package/dist/slices/template-studio/gate.js +40 -0
- package/dist/slices/template-studio/hidden.js +20 -0
- package/dist/slices/template-studio/jobs.js +79 -0
- package/dist/slices/template-studio/loudness.js +111 -0
- package/dist/slices/template-studio/make.js +40 -0
- package/dist/slices/template-studio/model.js +58 -0
- package/dist/slices/template-studio/pack-import.js +253 -0
- package/dist/slices/template-studio/pack-samples.js +60 -0
- package/dist/slices/template-studio/pack.js +207 -0
- package/dist/slices/template-studio/paid-view.js +66 -0
- package/dist/slices/template-studio/paid.js +355 -0
- package/dist/slices/template-studio/quote.js +155 -0
- package/dist/slices/template-studio/ready.js +104 -0
- package/dist/slices/template-studio/repo.js +134 -0
- package/dist/slices/template-studio/reviews-path.js +58 -0
- package/dist/slices/template-studio/runner.js +84 -0
- package/dist/slices/template-studio/save.js +236 -0
- package/dist/slices/template-studio/say-it-as.js +248 -0
- package/dist/slices/template-studio/schedule-gate.js +34 -0
- package/dist/slices/template-studio/schedule-price.js +32 -0
- package/dist/slices/template-studio/schedule-sample.js +91 -0
- package/dist/slices/template-studio/schema.js +243 -0
- package/dist/slices/template-studio/scope.js +124 -0
- package/dist/slices/template-studio/sections.js +176 -0
- package/dist/slices/template-studio/service.js +175 -0
- package/dist/slices/template-studio/status.js +191 -0
- package/dist/slices/template-studio/topic.js +223 -0
- package/dist/slices/thumbnail/by-llm.js +1 -1
- package/dist/slices/trash/designs.js +76 -0
- package/dist/slices/trash/model.js +13 -4
- package/dist/slices/trash/service.js +52 -2
- package/dist/slices/tutorials/library.js +3 -2
- package/dist/slices/uploads/repo.js +37 -1
- package/dist/slices/uploads/rules.js +3 -2
- package/dist/slices/video/ass-text.js +17 -0
- package/dist/slices/video/audio-export.js +2 -64
- package/dist/slices/video/edit-list.js +2 -2
- package/dist/slices/video/edit-settings.js +1 -1
- package/dist/slices/video/encoding.js +169 -0
- package/dist/slices/video/ffmpeg.js +23 -21
- package/dist/slices/video/figure-card.js +1 -15
- package/dist/slices/video/plan.js +2 -1
- package/dist/slices/video/slideshow.js +43 -18
- package/dist/slices/voices/attribution.js +3 -2
- package/dist/slices/voices/model.js +9 -8
- package/dist/slices/voices/palette.js +0 -3
- package/dist/slices/voices/script.js +2 -1
- package/dist/slices/youtube/answer.js +4 -16
- package/dist/slices/youtube/edits-repo.js +3 -12
- package/dist/tutorials/AI-CLIs.md +25 -25
- package/dist/tutorials/Agents-MCP.md +34 -33
- package/dist/tutorials/Assistant.md +42 -0
- package/dist/tutorials/Backups.md +7 -7
- package/dist/tutorials/Calendar.md +17 -25
- package/dist/tutorials/Cast-Library.md +19 -19
- package/dist/tutorials/Channels.md +42 -35
- package/dist/tutorials/Costs-and-Run-Cost.md +38 -40
- package/dist/tutorials/Create-Article.md +114 -0
- package/dist/tutorials/Create-Extras.md +112 -0
- package/dist/tutorials/Create-Images.md +165 -0
- package/dist/tutorials/Create-Narration.md +178 -0
- package/dist/tutorials/Create-Overview.md +244 -0
- package/dist/tutorials/Create-Video-and-Style.md +144 -0
- package/dist/tutorials/Docker.md +3 -3
- package/dist/tutorials/Document-Themes.md +32 -32
- package/dist/tutorials/Editing-a-Project.md +94 -94
- package/dist/tutorials/FAQ.md +18 -18
- package/dist/tutorials/First-Launch-and-Welcome.md +50 -64
- package/dist/tutorials/Home-and-Projects.md +115 -71
- package/dist/tutorials/Home.md +33 -33
- package/dist/tutorials/Install.md +14 -13
- package/dist/tutorials/Intros-and-Outros.md +33 -34
- package/dist/tutorials/Keyboard-Shortcuts-and-Command-Palette.md +62 -58
- package/dist/tutorials/Keywords-Slopify-Fills.md +87 -0
- package/dist/tutorials/Models.md +53 -21
- package/dist/tutorials/Multiple-Voices.md +41 -40
- package/dist/tutorials/Narration-Aliases-and-Glossary.md +14 -14
- package/dist/tutorials/Notifications.md +27 -17
- package/dist/tutorials/Other-Languages.md +15 -15
- package/dist/tutorials/PDF-Documents.md +38 -29
- package/dist/tutorials/Posting-to-Social-Sites.md +121 -0
- package/dist/tutorials/Project-Page.md +118 -120
- package/dist/tutorials/Prompts-and-Templates.md +84 -0
- package/dist/tutorials/Prompts.md +48 -44
- package/dist/tutorials/Providers-and-Keys.md +105 -98
- package/dist/tutorials/Publishing-to-YouTube.md +31 -31
- package/dist/tutorials/Recovery-and-Retries.md +31 -31
- package/dist/tutorials/Remote-Access.md +63 -0
- package/dist/tutorials/Reviews-and-Checkpoints.md +98 -90
- package/dist/tutorials/Schedules.md +46 -27
- package/dist/tutorials/Settings-Reference.md +194 -174
- package/dist/tutorials/Shorts.md +34 -33
- package/dist/tutorials/Start-at-Login.md +3 -3
- package/dist/tutorials/Studio-Extension.md +22 -24
- package/dist/tutorials/Template-Studio.md +128 -0
- package/dist/tutorials/Templates.md +51 -77
- package/dist/tutorials/Trash.md +4 -4
- package/dist/tutorials/Troubleshooting.md +44 -44
- package/dist/tutorials/Uninstalling-and-Moving.md +5 -5
- package/dist/tutorials/Updating-and-Patch-Notes.md +18 -18
- package/dist/tutorials/Video-Editing.md +34 -34
- package/dist/tutorials/Where-Your-Files-Live.md +10 -10
- package/dist/tutorials/YouTube-Description.md +26 -26
- package/dist/tutorials/Your-First-Short.md +35 -35
- package/dist/tutorials/_Sidebar.md +19 -14
- package/dist/updater/work-in-progress.js +42 -12
- package/dist/web/assets/index-BNftKQrA.css +1 -0
- package/dist/web/assets/index-Cpa58woP.js +459 -0
- package/dist/web/assets/pdf-BKh8f7R6.js +56 -0
- package/dist/web/assets/pdf.worker.min-BmVo14Nb.mjs +28 -0
- package/dist/web/assets/pdf.worker.min-D7i8o3wR.js +1 -0
- package/dist/web/index.html +2 -2
- package/package.json +6 -2
- package/dist/slices/article/provided-entries.js +0 -66
- package/dist/slices/article/run.js +0 -145
- package/dist/slices/images/run.js +0 -234
- package/dist/slices/narration/legacy-plan.js +0 -58
- package/dist/slices/narration/run.js +0 -270
- package/dist/slices/rebuild/runtime-actions.js +0 -90
- package/dist/slices/research/run.js +0 -224
- package/dist/slices/subtitles/prepare.js +0 -194
- package/dist/slices/subtitles/transcript.js +0 -34
- package/dist/slices/thumbnail/run.js +0 -219
- package/dist/slices/video/audio-inputs.js +0 -33
- package/dist/slices/video/reuse-audio.js +0 -62
- package/dist/slices/video/run.js +0 -78
- package/dist/slices/video/write-export.js +0 -158
- package/dist/slices/video/write-subtitles.js +0 -59
- package/dist/tutorials/Library-Overview.md +0 -76
- package/dist/tutorials/Play-Images.md +0 -161
- package/dist/tutorials/Play-Narration.md +0 -167
- package/dist/tutorials/Play-Outputs.md +0 -109
- package/dist/tutorials/Play-Overview.md +0 -227
- package/dist/tutorials/Play-Title-and-Article.md +0 -136
- package/dist/tutorials/Play-Video-and-Style.md +0 -143
- package/dist/web/assets/index-BadsoORk.css +0 -1
- package/dist/web/assets/index-D8LqNsCl.js +0 -326
- package/dist/web/assets/pdf-T7MCwjIv.js +0 -54
- package/dist/web/assets/pdf.worker.min-Dswkl-cV.mjs +0 -29
- package/dist/web/assets/pdf.worker.min-zC6nfbxG.js +0 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { withLanguage } from "../../kernel/ports/languages.js";
|
|
2
|
+
import { subjectOf } from "../admission/model.js";
|
|
3
|
+
import { digestMessages, digestNames } from "../keywords/digest.js";
|
|
4
|
+
import { keywordUsesOf } from "../keywords/rules.js";
|
|
5
|
+
import { recipe, selectedReference, } from "./recipe-model.js";
|
|
6
|
+
import { llmInput, llmInputFingerprint } from "./recipe-text.js";
|
|
7
|
+
import { keywordBodies } from "./recipe-validation.js";
|
|
8
|
+
export const digestKey = "article:digest";
|
|
9
|
+
// The keyword digest step, only while a prompt the version runs uses a digest keyword, and the
|
|
10
|
+
// digest it wrote once it answers this plan's request. It reads the article the pictures are
|
|
11
|
+
// drawn from, so editing the article by hand keeps it with them.
|
|
12
|
+
export function keywordDigest(context, text) {
|
|
13
|
+
const { config } = context;
|
|
14
|
+
if (keywordUsesOf(keywordBodies(config, context.content)).digest === undefined)
|
|
15
|
+
return undefined;
|
|
16
|
+
const messages = withLanguage(digestMessages({ title: subjectOf(config), article: text.pictureText ?? "" }), config.language);
|
|
17
|
+
const value = recipe(context, digestKey, "article", text.pictureText === null
|
|
18
|
+
? {
|
|
19
|
+
kind: "deferred",
|
|
20
|
+
version: 1,
|
|
21
|
+
operation: "keyword-digest",
|
|
22
|
+
template: [llmInputFingerprint(context, messages), text.article.fingerprint],
|
|
23
|
+
}
|
|
24
|
+
: llmInput(context, messages), [text.article.key]);
|
|
25
|
+
return {
|
|
26
|
+
recipe: value,
|
|
27
|
+
producer: {
|
|
28
|
+
key: value.key,
|
|
29
|
+
fingerprint: value.fingerprint,
|
|
30
|
+
names: digestNames,
|
|
31
|
+
values: text.pictureText === null ? undefined : savedDigest(context, value),
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// The digest saved for this request, by either fingerprint (see `savedScenes`).
|
|
36
|
+
function savedDigest(context, value) {
|
|
37
|
+
const logical = context.catalogue === undefined || value.input.kind !== "llm"
|
|
38
|
+
? value.fingerprint
|
|
39
|
+
: recipe({ content: context.content }, value.key, value.stage, { ...value.input, thinkingConfig: null }, value.dependsOn).fingerprint;
|
|
40
|
+
const piece = context.manifest.pieces.find((row) => row.key === value.key &&
|
|
41
|
+
selectedReference(row) &&
|
|
42
|
+
row.piece.state === "done" &&
|
|
43
|
+
(row.fingerprint === value.fingerprint || row.fingerprint === logical));
|
|
44
|
+
if (piece?.piece.payload == null)
|
|
45
|
+
return undefined;
|
|
46
|
+
const payload = JSON.parse(piece.piece.payload);
|
|
47
|
+
const digest = payload.digest;
|
|
48
|
+
if (typeof digest !== "object" || digest === null)
|
|
49
|
+
return undefined;
|
|
50
|
+
const values = {};
|
|
51
|
+
for (const name of digestNames) {
|
|
52
|
+
const one = digest[name];
|
|
53
|
+
if (typeof one !== "string")
|
|
54
|
+
return undefined;
|
|
55
|
+
values[name] = one;
|
|
56
|
+
}
|
|
57
|
+
return values;
|
|
58
|
+
}
|
|
@@ -2,6 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { messageRoles, thinkingModes } from "../../kernel/ports/llm.js";
|
|
3
3
|
import { llmDocumentsSchema } from "../../kernel/ports/llm-documents.js";
|
|
4
4
|
import { describedKinds } from "../narration/blocks.js";
|
|
5
|
+
import { socialPlatforms } from "../social/model.js";
|
|
5
6
|
import { deferredOperations, localOperations } from "./recipe-model.js";
|
|
6
7
|
const value = z.lazy(() => z.union([
|
|
7
8
|
z.null(),
|
|
@@ -59,6 +60,15 @@ export const recipeInputSchema = z.discriminatedUnion("kind", [
|
|
|
59
60
|
})
|
|
60
61
|
.strict()
|
|
61
62
|
.optional(),
|
|
63
|
+
// A post for another site (`recipe-social.ts`): the limit its answer must keep.
|
|
64
|
+
social: z
|
|
65
|
+
.object({
|
|
66
|
+
platform: z.enum(socialPlatforms),
|
|
67
|
+
max: z.number().int().positive(),
|
|
68
|
+
unit: z.enum(["weighted", "graphemes", "characters"]),
|
|
69
|
+
})
|
|
70
|
+
.strict()
|
|
71
|
+
.optional(),
|
|
62
72
|
})
|
|
63
73
|
.strict(),
|
|
64
74
|
z
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { subjectOf } from "../admission/model.js";
|
|
2
|
+
import { detectSlots } from "../admission/substitute.js";
|
|
3
|
+
import { splitEndMatter } from "../article/split.js";
|
|
4
|
+
import { fillKeywords, mentionsKeyword } from "../keywords/fill.js";
|
|
5
|
+
import { placeOfKey } from "../keywords/rules.js";
|
|
6
|
+
import { keywordOf } from "../keywords/specs.js";
|
|
7
|
+
import { factValues } from "../keywords/values.js";
|
|
8
|
+
import { topHeadings } from "../video/chapters.js";
|
|
9
|
+
import { usesScriptPrompt } from "../voices/model.js";
|
|
10
|
+
export const articleKey = "article:body";
|
|
11
|
+
// The article as this version has it, or null while it is still to be written.
|
|
12
|
+
export function articleMarkdownOf(context) {
|
|
13
|
+
const { config, content, resolved } = context;
|
|
14
|
+
return config.sources.article !== "generate" || content.articleEdited === true
|
|
15
|
+
? (content.articleMarkdown ?? config.provided.article ?? "")
|
|
16
|
+
: resolved.articleMarkdown;
|
|
17
|
+
}
|
|
18
|
+
// The article's chapter titles, once it is written.
|
|
19
|
+
export function chaptersProducer(markdown, article) {
|
|
20
|
+
return {
|
|
21
|
+
key: article.key,
|
|
22
|
+
fingerprint: article.fingerprint,
|
|
23
|
+
names: ["Slopify_Chapters"],
|
|
24
|
+
values: markdown === null
|
|
25
|
+
? undefined
|
|
26
|
+
: {
|
|
27
|
+
Slopify_Chapters: topHeadings(splitEndMatter(markdown).body)
|
|
28
|
+
.map((heading) => heading.title)
|
|
29
|
+
.join("\n"),
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// A prompt with its keywords filled. A text without a `Slopify_` keyword is returned as the very
|
|
34
|
+
// string it was, so a project that uses none plans the requests it always did.
|
|
35
|
+
export function fillPrompt(context, text, place) {
|
|
36
|
+
if (place === undefined || !mentionsKeyword(text))
|
|
37
|
+
return { text, waits: [], dependsOn: [] };
|
|
38
|
+
const producers = context.keywords?.producers ?? [
|
|
39
|
+
chaptersProducer(articleMarkdownOf(context), { key: articleKey, fingerprint: "" }),
|
|
40
|
+
];
|
|
41
|
+
const values = {
|
|
42
|
+
...factValues(context.config.keywordFacts, subjectOf(context.config), place),
|
|
43
|
+
};
|
|
44
|
+
const used = new Set();
|
|
45
|
+
for (const producer of producers)
|
|
46
|
+
for (const name of producer.names)
|
|
47
|
+
if (usesName(text, name, place)) {
|
|
48
|
+
used.add(producer.key);
|
|
49
|
+
const value = producer.values?.[name];
|
|
50
|
+
if (value !== undefined)
|
|
51
|
+
values[name] = value;
|
|
52
|
+
}
|
|
53
|
+
const filled = fillKeywords(text, place, values);
|
|
54
|
+
const dependsOn = producers.filter((one) => used.has(one.key)).map((one) => one.key);
|
|
55
|
+
if (filled.ok)
|
|
56
|
+
return { text: filled.text, waits: [], dependsOn };
|
|
57
|
+
return {
|
|
58
|
+
text,
|
|
59
|
+
waits: producers
|
|
60
|
+
.filter((one) => one.names.some((name) => filled.waiting.includes(name)))
|
|
61
|
+
.map((one) => ({ key: one.key, fingerprint: one.fingerprint })),
|
|
62
|
+
dependsOn,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// A picked prompt (`library/slots.ts` names its key), rendered and filled.
|
|
66
|
+
export function filledPrompt(context, key, rendered) {
|
|
67
|
+
return fillPrompt(context, rendered, placeOfKey(key, { script: usesScriptPrompt(context.config) }));
|
|
68
|
+
}
|
|
69
|
+
function usesName(text, name, place) {
|
|
70
|
+
return (detectSlots(text).names.includes(name) && (keywordOf(name)?.places.includes(place) ?? false));
|
|
71
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { internalError } from "../../kernel/errors.js";
|
|
2
3
|
import { referenceKey } from "../admission/model.js";
|
|
3
4
|
import { buildRecipes } from "./recipe-build.js";
|
|
4
5
|
export function baselineFingerprints(project, outputs, pieces, content, stages = []) {
|
|
@@ -92,6 +93,9 @@ export function legacyOutputWorkKey(output, config) {
|
|
|
92
93
|
case "render_params":
|
|
93
94
|
case "instructions":
|
|
94
95
|
return `${output.stageKind}:${output.role}`;
|
|
96
|
+
// Only ever made by a revision.
|
|
97
|
+
case "social_post":
|
|
98
|
+
return `social:post:${output.meta.platform ?? "x"}`;
|
|
95
99
|
}
|
|
96
100
|
}
|
|
97
101
|
export function legacyPieceKey(piece, stageKind, outputs = []) {
|
|
@@ -145,7 +149,7 @@ export function legacyImageOutput(piece, outputs) {
|
|
|
145
149
|
row.meta.promptName === undefined ||
|
|
146
150
|
row.meta.promptName === promptName)));
|
|
147
151
|
if (matches.length > 1)
|
|
148
|
-
throw new Error(`
|
|
152
|
+
throw new Error(internalError(`an image from an older Slopify version, ${piece.id}, matches multiple outputs`));
|
|
149
153
|
return matches[0];
|
|
150
154
|
}
|
|
151
155
|
const legacyImageMetadata = z
|
|
@@ -51,6 +51,10 @@ export const deferredOperations = [
|
|
|
51
51
|
"thumbnail-scenes",
|
|
52
52
|
// How the subject and characters look (`recipe-appearance.ts`), looked up on the web.
|
|
53
53
|
"image-appearance",
|
|
54
|
+
// The keyword digest (`recipe-digest.ts`), written once the article is.
|
|
55
|
+
"keyword-digest",
|
|
56
|
+
// A post for another site written by a post prompt (`recipe-social.ts`), once the article is.
|
|
57
|
+
"social-post",
|
|
54
58
|
];
|
|
55
59
|
export function recipe(context, key, stage, input, dependsOn = [], options = {}) {
|
|
56
60
|
const requestFingerprint = input.kind === "tts" && input.dialogue !== undefined
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { internalError } from "../../kernel/errors.js";
|
|
1
2
|
import { recipe, resourceIdentity, } from "./recipe-model.js";
|
|
2
3
|
export function narrationFileRecipe(context, segment, parts) {
|
|
3
4
|
const key = `narration:files:${segment}`;
|
|
@@ -26,7 +27,7 @@ export function narrationFileRecipe(context, segment, parts) {
|
|
|
26
27
|
];
|
|
27
28
|
if (part.input.kind === "provided")
|
|
28
29
|
return [resourceIdentity(context, part), part.input.semantic, null];
|
|
29
|
-
throw new Error("
|
|
30
|
+
throw new Error(internalError("a narration chunk has an unexpected source"));
|
|
30
31
|
}),
|
|
31
32
|
},
|
|
32
33
|
}, dependencies, { unresolved: parts.length === 0 });
|
|
@@ -2,9 +2,9 @@ import { z } from "zod";
|
|
|
2
2
|
import { preparationMessages, validatePreparation, } from "../narration/preparation.js";
|
|
3
3
|
import { prepareRequests } from "../narration/steering.js";
|
|
4
4
|
import { recipe, selectedReference, } from "./recipe-model.js";
|
|
5
|
-
import { llmInput,
|
|
5
|
+
import { llmInput, promptOf } from "./recipe-text.js";
|
|
6
6
|
export function preparationTemplate(context) {
|
|
7
|
-
const input = llmInput(context, preparationMessages(
|
|
7
|
+
const input = llmInput(context, preparationMessages(promptOf(context, "narration").text, "", [], context.config.language));
|
|
8
8
|
return [
|
|
9
9
|
"inworld-tts-2",
|
|
10
10
|
1,
|
|
@@ -29,7 +29,7 @@ export function preparationForGroup(context, logicalKey, source, segment, depend
|
|
|
29
29
|
// A delivery note for this chunk alone (Edit project → Narration), after the project's prompt.
|
|
30
30
|
const override = context.content.narrationOverrides[logicalKey];
|
|
31
31
|
const note = override?.kind === "text" ? override.direction : undefined;
|
|
32
|
-
const prompt =
|
|
32
|
+
const prompt = promptOf(context, "narration").text;
|
|
33
33
|
const preparation = recipe(context, `narration:prepare:${segment}:${logicalKey}`, "audio", {
|
|
34
34
|
...llmInput(context, preparationMessages(note === undefined ? prompt : `${prompt}\n\n${note}`, source, aliases, context.config.language, speaker)),
|
|
35
35
|
preparation: { format: "inworld-tts-2", version: 1, source, logicalKey, segment },
|
|
@@ -38,7 +38,7 @@ export function preparationForGroup(context, logicalKey, source, segment, depend
|
|
|
38
38
|
return {
|
|
39
39
|
preparation,
|
|
40
40
|
requests: null,
|
|
41
|
-
refusal: "Narration
|
|
41
|
+
refusal: "Narration preparation needs narration text to work from.",
|
|
42
42
|
};
|
|
43
43
|
const logical = recipe(context, preparation.key, "audio", preparation.input.kind === "llm"
|
|
44
44
|
? { ...preparation.input, thinkingConfig: null }
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { referenceKey, subjectOf } from "../admission/model.js";
|
|
2
2
|
import { usesReference } from "../admission/rules.js";
|
|
3
|
+
import { withoutSlopifyScene } from "../images/scenes.js";
|
|
3
4
|
import { lookWait, withLooks } from "./recipe-appearance.js";
|
|
4
5
|
import { castFor } from "./recipe-cast.js";
|
|
5
6
|
import { recipe, selectedAsset, } from "./recipe-model.js";
|
|
6
|
-
import {
|
|
7
|
+
import { promptOf } from "./recipe-text.js";
|
|
7
8
|
// The establishing image (`RunDraft.reference`): one step of the Images stage, made before
|
|
8
9
|
// every other image of the run and never part of the video. Made from its library prompt, whose
|
|
9
10
|
// keywords are filled like every other image prompt's, or the file the user uploaded.
|
|
@@ -30,8 +31,10 @@ appearance) {
|
|
|
30
31
|
assetId: content.provided.reference ?? null,
|
|
31
32
|
semantic: "reference",
|
|
32
33
|
}, [], { unresolved: content.provided.reference === undefined });
|
|
33
|
-
const
|
|
34
|
-
|
|
34
|
+
const filled = promptOf(context, referencePromptKey);
|
|
35
|
+
// The establishing image has no scene of its own.
|
|
36
|
+
const written = withoutSlopifyScene(filled.text);
|
|
37
|
+
const prompt = filled.waits.length > 0 ? null : withLooks(written, appearance);
|
|
35
38
|
if (prompt === null) {
|
|
36
39
|
const wait = lookWait(written, appearance);
|
|
37
40
|
return recipe(context, referenceKey, "images", {
|
|
@@ -45,8 +48,9 @@ appearance) {
|
|
|
45
48
|
config.images?.model ?? null,
|
|
46
49
|
config.format,
|
|
47
50
|
...(config.images?.thinking === undefined ? [] : [config.images.thinking]),
|
|
51
|
+
...filled.waits.map((one) => one.fingerprint),
|
|
48
52
|
],
|
|
49
|
-
}, wait.dependsOn);
|
|
53
|
+
}, [...wait.dependsOn, ...filled.waits.map((one) => one.key)]);
|
|
50
54
|
}
|
|
51
55
|
return recipe(context, referenceKey, "images", {
|
|
52
56
|
kind: "image",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { narrationItemKey, reviewedByAgent, reviewKey, reviewModeOf, reviewPromptKey, reviewRetriesOf, } from "../reviews/model.js";
|
|
1
|
+
import { narrationItemKey, promiseItemKey, reviewedByAgent, reviewKey, reviewModeOf, reviewPromptKey, reviewRetriesOf, } from "../reviews/model.js";
|
|
2
2
|
import { activeReviewStages } from "../reviews/rules.js";
|
|
3
3
|
import { recipe, resourceIdentity, } from "./recipe-model.js";
|
|
4
|
-
import {
|
|
4
|
+
import { promptOf } from "./recipe-text.js";
|
|
5
5
|
// A review is a step of its own, `review:<item>`, planned like any other: it waits for the
|
|
6
6
|
// item, its fingerprint follows the item's output, the reviewer and the prompt, and it is
|
|
7
7
|
// kept and reused while those stay the same. What depends on a reviewed item waits for its
|
|
@@ -13,16 +13,23 @@ export function withReviews(context, recipes) {
|
|
|
13
13
|
if (settings === undefined || stages.length === 0)
|
|
14
14
|
return recipes;
|
|
15
15
|
const byKey = new Map(recipes.map((row) => [row.key, row]));
|
|
16
|
-
const
|
|
16
|
+
const all = stages.flatMap((stage) => reviewedItems(stage, recipes, byKey));
|
|
17
|
+
// A template studio sample shows how each stage's review answers on its first item only.
|
|
18
|
+
const items = context.config.sample === undefined
|
|
19
|
+
? all
|
|
20
|
+
: all.filter((item, index) => all.findIndex((one) => one.stage === item.stage) === index);
|
|
17
21
|
const byAgent = reviewedByAgent(settings);
|
|
18
22
|
const reviews = items.map((item) => {
|
|
19
23
|
const inputs = item.inputs.map((input) => [input.key, resourceIdentity(context, input)]);
|
|
20
24
|
// Blank means the stage's built-in prompt; the step fills it in, so a new built-in
|
|
21
25
|
// wording ships as a new operation version rather than a silent change here.
|
|
22
|
-
const
|
|
23
|
-
?
|
|
24
|
-
:
|
|
25
|
-
const
|
|
26
|
+
const filled = settings.stages[item.stage]?.prompt?.trim()
|
|
27
|
+
? promptOf(context, reviewPromptKey(item.stage))
|
|
28
|
+
: undefined;
|
|
29
|
+
const prompt = filled?.text ?? "";
|
|
30
|
+
const dependsOn = [
|
|
31
|
+
...new Set([...item.inputs.map((input) => input.key), ...(filled?.dependsOn ?? [])]),
|
|
32
|
+
];
|
|
26
33
|
// An external agent answers through MCP: no provider, no charge, nothing to be ready.
|
|
27
34
|
if (byAgent)
|
|
28
35
|
return recipe(context, reviewKey(item.itemKey), stageOf(item.stage), {
|
|
@@ -79,6 +86,18 @@ function reviewedItems(stage, recipes, byKey) {
|
|
|
79
86
|
? []
|
|
80
87
|
: [one(article.key, [article], [article.key])];
|
|
81
88
|
}
|
|
89
|
+
// The opening read against the title and thumbnail before the paid narration: everything
|
|
90
|
+
// that reads the article waits for it. A thumbnail brief a model writes is read too; the
|
|
91
|
+
// drawn thumbnail isn't, since it is made after the narration.
|
|
92
|
+
case "promise": {
|
|
93
|
+
const article = byKey.get("article:body");
|
|
94
|
+
if (article === undefined || article.kind !== "provider")
|
|
95
|
+
return [];
|
|
96
|
+
const brief = byKey.get("thumbnail:prompt");
|
|
97
|
+
return [
|
|
98
|
+
one(promiseItemKey, brief === undefined ? [article] : [article, brief], [article.key]),
|
|
99
|
+
];
|
|
100
|
+
}
|
|
82
101
|
case "images": {
|
|
83
102
|
const reference = byKey.get("reference:image");
|
|
84
103
|
return recipes
|
|
@@ -114,6 +133,7 @@ function reviewedItems(stage, recipes, byKey) {
|
|
|
114
133
|
function stageOf(stage) {
|
|
115
134
|
switch (stage) {
|
|
116
135
|
case "article":
|
|
136
|
+
case "promise":
|
|
117
137
|
return "article";
|
|
118
138
|
case "images":
|
|
119
139
|
return "images";
|
|
@@ -3,11 +3,12 @@ import { sourceOf } from "../admission/model.js";
|
|
|
3
3
|
import { allowedSources, articleOffFields, edgeSilenceSecondsProblem, imageSecondsProblem, normaliseDraft, silenceGapSecondsMax, voicesFields, zoomPercentProblem, } from "../admission/rules.js";
|
|
4
4
|
import { shortModeFields } from "../admission/short-mode.js";
|
|
5
5
|
import { render } from "../admission/substitute.js";
|
|
6
|
+
import { keywordUsesOf } from "../keywords/rules.js";
|
|
6
7
|
import { effectiveClips, pickedShortsOf, rangeProblem } from "../shorts/clips.js";
|
|
7
8
|
import { buildRecipes } from "./recipe-build.js";
|
|
8
9
|
import { selectedReference } from "./recipe-model.js";
|
|
9
10
|
import { shortsPickKey } from "./recipe-shorts.js";
|
|
10
|
-
import { validateRecipeInputs } from "./recipe-validation.js";
|
|
11
|
+
import { keywordBodies, validateRecipeInputs } from "./recipe-validation.js";
|
|
11
12
|
import { finishedShorts, keepChosen, movedShorts, withKeep } from "./shorts-keep-save.js";
|
|
12
13
|
// A range set by hand for a short is checked against the pick it was set on, while that is
|
|
13
14
|
// still the project's pick; one left from an earlier pick no longer applies and is ignored.
|
|
@@ -47,10 +48,12 @@ export function normalizeArticleIntent(base, edit) {
|
|
|
47
48
|
};
|
|
48
49
|
}
|
|
49
50
|
// The steps that are made from the article: each image's scene, the looks, the thumbnails'
|
|
50
|
-
// scenes, the thumbnail prompt and an intro or outro the AI model writes
|
|
51
|
+
// scenes, the keyword digest, the thumbnail prompt and an intro or outro the AI model writes
|
|
52
|
+
// from it.
|
|
51
53
|
export const pictureWorkKeys = [
|
|
52
54
|
"images:scenes",
|
|
53
55
|
"thumbnail:scenes",
|
|
56
|
+
"article:digest",
|
|
54
57
|
"images:appearance",
|
|
55
58
|
"thumbnail:prompt",
|
|
56
59
|
"entry:intro:text",
|
|
@@ -283,7 +286,7 @@ export function validateRevisionEdit(config, content) {
|
|
|
283
286
|
if (config.sources.images !== "off" && content.imageOrder.length === 0)
|
|
284
287
|
fields.push({
|
|
285
288
|
field: "content.imageOrder",
|
|
286
|
-
message: "Every image is deleted, so the video has nothing to show. Press Discard changes to get them back, then press
|
|
289
|
+
message: "Every image is deleted, so the video has nothing to show. Press Discard changes to get them back, then press Make all images again in the project's Images section. To make the project without pictures, set Images source and Video source to Off in Edit settings instead.",
|
|
287
290
|
});
|
|
288
291
|
if (config.sources.images === "off" && config.sources.video !== "off")
|
|
289
292
|
fields.push({ field: "sources.video", message: "Turn Video off when Images is off." });
|
|
@@ -321,11 +324,11 @@ export function validateRevisionEdit(config, content) {
|
|
|
321
324
|
if (config.sources.article === "provide" &&
|
|
322
325
|
!(content.articleMarkdown ?? config.provided.article)?.trim())
|
|
323
326
|
fields.push({ field: "provided.article", message: "Paste the article." });
|
|
324
|
-
fields.push(...articleOffFields(config));
|
|
327
|
+
fields.push(...articleOffFields(config, keywordUsesOf(keywordBodies(config, content))));
|
|
325
328
|
if (config.sources.audio === "off" &&
|
|
326
329
|
config.subtitles !== undefined &&
|
|
327
330
|
config.subtitles.mode !== "off")
|
|
328
|
-
fields.push({ field: "subtitles.mode", message: "
|
|
331
|
+
fields.push({ field: "subtitles.mode", message: "Captions need narration audio." });
|
|
329
332
|
fields.push(...voicesFields(config));
|
|
330
333
|
return fields;
|
|
331
334
|
}
|
|
@@ -1,28 +1,30 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { withLanguage } from "../../kernel/ports/languages.js";
|
|
3
3
|
import { subjectOf, thumbnailCountOf } from "../admission/model.js";
|
|
4
|
-
import { pictureKind, sceneMessages, usesScene } from "../images/scenes.js";
|
|
4
|
+
import { pictureKind, sceneMessages, usesScene, usesSlopifyScene, wantsSceneDetails, } from "../images/scenes.js";
|
|
5
5
|
import { recipe, selectedReference, } from "./recipe-model.js";
|
|
6
6
|
import { llmInput, llmInputFingerprint } from "./recipe-text.js";
|
|
7
7
|
export const imageScenesKey = "images:scenes";
|
|
8
8
|
export const thumbnailScenesKey = "thumbnail:scenes";
|
|
9
9
|
// With Scenes from the article on, a thumbnail drawn from a Library prompt whose text asks for
|
|
10
|
-
// `{{Scene}}` takes one scene per thumbnail;
|
|
10
|
+
// `{{Scene}}` takes one scene per thumbnail; so does one whose prompt uses a `Slopify_` scene
|
|
11
|
+
// keyword, switch or no switch. Any other thumbnail is drawn as it always was.
|
|
11
12
|
export function thumbnailScenes(context, text) {
|
|
12
13
|
const { config, content } = context;
|
|
13
|
-
if (config.sources.images !== "generate" || config.imageScenes !== true)
|
|
14
|
-
return undefined;
|
|
15
14
|
if (config.sources.thumbnail !== "from_prompt")
|
|
16
15
|
return undefined;
|
|
17
16
|
const body = content.promptTemplates.thumbnailPrompt ?? config.rendered.thumbnailPrompt;
|
|
18
|
-
|
|
17
|
+
const legacy = config.sources.images === "generate" && config.imageScenes === true && usesScene(body);
|
|
18
|
+
if (!legacy && !usesSlopifyScene(body))
|
|
19
19
|
return undefined;
|
|
20
20
|
const count = thumbnailCountOf(config);
|
|
21
|
+
const details = wantsSceneDetails(body);
|
|
21
22
|
const messages = withLanguage(sceneMessages({
|
|
22
23
|
title: subjectOf(config),
|
|
23
24
|
article: text.pictureText ?? "",
|
|
24
25
|
pictures: [],
|
|
25
26
|
thumbnails: count,
|
|
27
|
+
...(details ? { details } : {}),
|
|
26
28
|
}), config.language);
|
|
27
29
|
const value = recipe(context, thumbnailScenesKey, "thumbnail", text.pictureText === null
|
|
28
30
|
? {
|
|
@@ -32,18 +34,23 @@ export function thumbnailScenes(context, text) {
|
|
|
32
34
|
template: [llmInputFingerprint(context, messages), text.article.fingerprint],
|
|
33
35
|
}
|
|
34
36
|
: llmInput(context, messages), [text.article.key]);
|
|
37
|
+
const saved = text.pictureText === null ? undefined : savedScenes(context, value, count);
|
|
35
38
|
return {
|
|
36
39
|
recipe: value,
|
|
37
40
|
count,
|
|
38
|
-
scenes:
|
|
41
|
+
scenes: saved?.scenes,
|
|
42
|
+
...(saved?.details === undefined ? {} : { details: saved.details }),
|
|
43
|
+
legacy,
|
|
39
44
|
};
|
|
40
45
|
}
|
|
41
46
|
export function imageScenes(context, text) {
|
|
42
47
|
const { config, content } = context;
|
|
43
|
-
if (config.sources.images !== "generate"
|
|
48
|
+
if (config.sources.images !== "generate")
|
|
44
49
|
return undefined;
|
|
50
|
+
const legacy = config.imageScenes === true;
|
|
45
51
|
const keys = [];
|
|
46
52
|
const pictures = [];
|
|
53
|
+
let details = false;
|
|
47
54
|
for (const key of content.imageOrder) {
|
|
48
55
|
const image = content.imageDefinitions[key];
|
|
49
56
|
if (image?.source !== "generate")
|
|
@@ -53,6 +60,10 @@ export function imageScenes(context, text) {
|
|
|
53
60
|
: (content.promptTemplates[image.templateKey] ?? image.prompt);
|
|
54
61
|
if (body == null || body.trim() === "")
|
|
55
62
|
continue;
|
|
63
|
+
// With the switch off a picture takes a scene only for its own `Slopify_` keywords.
|
|
64
|
+
if (!legacy && !usesSlopifyScene(body))
|
|
65
|
+
continue;
|
|
66
|
+
details ||= wantsSceneDetails(body);
|
|
56
67
|
const at = /^imagePrompts\.(\d+)$/.exec(image.templateKey ?? "")?.[1];
|
|
57
68
|
const name = at === undefined ? "Image" : (config.imagePrompts[Number(at)]?.name ?? "Image");
|
|
58
69
|
keys.push(key);
|
|
@@ -60,7 +71,12 @@ export function imageScenes(context, text) {
|
|
|
60
71
|
}
|
|
61
72
|
if (keys.length === 0)
|
|
62
73
|
return undefined;
|
|
63
|
-
const messages = withLanguage(sceneMessages({
|
|
74
|
+
const messages = withLanguage(sceneMessages({
|
|
75
|
+
title: subjectOf(config),
|
|
76
|
+
article: text.pictureText ?? "",
|
|
77
|
+
pictures,
|
|
78
|
+
...(details ? { details } : {}),
|
|
79
|
+
}), config.language);
|
|
64
80
|
const value = recipe(context, imageScenesKey, "images", text.pictureText === null
|
|
65
81
|
? {
|
|
66
82
|
kind: "deferred",
|
|
@@ -69,10 +85,13 @@ export function imageScenes(context, text) {
|
|
|
69
85
|
template: [llmInputFingerprint(context, messages), text.article.fingerprint],
|
|
70
86
|
}
|
|
71
87
|
: llmInput(context, messages), [text.article.key]);
|
|
88
|
+
const saved = text.pictureText === null ? undefined : savedScenes(context, value, keys.length);
|
|
72
89
|
return {
|
|
73
90
|
recipe: value,
|
|
74
91
|
keys,
|
|
75
|
-
scenes:
|
|
92
|
+
scenes: saved?.scenes,
|
|
93
|
+
...(saved?.details === undefined ? {} : { details: saved.details }),
|
|
94
|
+
legacy,
|
|
76
95
|
};
|
|
77
96
|
}
|
|
78
97
|
// The scenes saved for this request. The request carries the model's thinking settings from
|
|
@@ -89,7 +108,17 @@ function savedScenes(context, value, count) {
|
|
|
89
108
|
if (piece?.piece.payload == null)
|
|
90
109
|
return undefined;
|
|
91
110
|
const parsed = z
|
|
92
|
-
.object({
|
|
111
|
+
.object({
|
|
112
|
+
scenes: z.array(z.string()),
|
|
113
|
+
details: z
|
|
114
|
+
.array(z.object({ setting: z.string().optional(), mood: z.string().optional() }))
|
|
115
|
+
.optional(),
|
|
116
|
+
})
|
|
93
117
|
.safeParse(JSON.parse(piece.piece.payload));
|
|
94
|
-
|
|
118
|
+
if (!parsed.success || parsed.data.scenes.length !== count)
|
|
119
|
+
return undefined;
|
|
120
|
+
return {
|
|
121
|
+
scenes: parsed.data.scenes,
|
|
122
|
+
...(parsed.data.details === undefined ? {} : { details: parsed.data.details }),
|
|
123
|
+
};
|
|
95
124
|
}
|
|
@@ -11,7 +11,7 @@ import { castFor } from "./recipe-cast.js";
|
|
|
11
11
|
import { noMaster } from "./recipe-loudness.js";
|
|
12
12
|
import { recipe, resourceIdentity, selectedAsset, selectedReference, } from "./recipe-model.js";
|
|
13
13
|
import { castField, imageChoice } from "./recipe-reference.js";
|
|
14
|
-
import { llmInput,
|
|
14
|
+
import { llmInput, promptOf } from "./recipe-text.js";
|
|
15
15
|
// The Shorts step unfolds as its answers land, the way research's chapters unfold from the
|
|
16
16
|
// plan. `shorts:pick` reads the word timing, so it waits for `subtitles:timing` and runs
|
|
17
17
|
// beside the render; until its saved answer matches, one deferred `shorts:future` stands in
|
|
@@ -39,6 +39,10 @@ appearance) {
|
|
|
39
39
|
const timing = exports.find((value) => value.key === "subtitles:timing");
|
|
40
40
|
if (!usesShorts(config) || shorts === undefined || timing === undefined)
|
|
41
41
|
return [];
|
|
42
|
+
const prompt = shorts.prompt?.trim() ? promptOf(context, "shorts") : undefined;
|
|
43
|
+
// A shorts image prompt may name `{{Scene}}` like the video's: the prompts call already writes
|
|
44
|
+
// each image's moment from what the clip says, so that line is left out here.
|
|
45
|
+
const styled = shorts.imagePrompt?.trim() ? promptOf(context, "shortsImage") : undefined;
|
|
42
46
|
const pickFor = (timingIdentity) => recipe(context, shortsPickKey, "video", {
|
|
43
47
|
kind: "local",
|
|
44
48
|
version: 1,
|
|
@@ -50,7 +54,7 @@ appearance) {
|
|
|
50
54
|
config.llm?.thinking ?? null,
|
|
51
55
|
// Blank means the built-in prompt; the step fills it in, so a new built-in wording
|
|
52
56
|
// ships as a new operation version rather than a silent change here.
|
|
53
|
-
|
|
57
|
+
prompt?.text ?? "",
|
|
54
58
|
shorts.count,
|
|
55
59
|
shorts.minSeconds,
|
|
56
60
|
shorts.maxSeconds,
|
|
@@ -78,7 +82,7 @@ appearance) {
|
|
|
78
82
|
],
|
|
79
83
|
]),
|
|
80
84
|
],
|
|
81
|
-
}, [timing.key],
|
|
85
|
+
}, [...new Set([timing.key, ...(prompt?.dependsOn ?? []), ...(styled?.dependsOn ?? [])])],
|
|
82
86
|
// A paid LLM call: readiness, the charge warning and the estimate treat it like one.
|
|
83
87
|
{ kind: "provider" });
|
|
84
88
|
const pick = pickFor(resourceIdentity(context, timing));
|
|
@@ -93,11 +97,7 @@ appearance) {
|
|
|
93
97
|
selectedReference(row));
|
|
94
98
|
const picked = savedPicked(context, pick, recorded === undefined ? [] : [pickFor([recorded.fingerprint, asset]).fingerprint]);
|
|
95
99
|
const images = config.images ?? { provider: "", model: "" };
|
|
96
|
-
|
|
97
|
-
// each image's moment from what the clip says, so that line is left out here.
|
|
98
|
-
const style = shorts.imagePrompt?.trim()
|
|
99
|
-
? withoutScene(renderedPrompt(context, "shortsImage"))
|
|
100
|
-
: defaultShortsImagePrompt;
|
|
100
|
+
const style = styled === undefined ? defaultShortsImagePrompt : withoutScene(styled.text);
|
|
101
101
|
if (picked === undefined)
|
|
102
102
|
return [
|
|
103
103
|
pick,
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { withLanguage } from "../../kernel/ports/languages.js";
|
|
2
|
+
import { subjectOf } from "../admission/model.js";
|
|
3
|
+
import { socialPlatforms } from "../social/model.js";
|
|
4
|
+
import { postMessages, postTarget } from "../social/post-prompt.js";
|
|
5
|
+
import { recipe } from "./recipe-model.js";
|
|
6
|
+
import { llmInput, llmInputFingerprint, promptOf } from "./recipe-text.js";
|
|
7
|
+
export const socialPostKey = (platform) => `social:post:${platform}`;
|
|
8
|
+
export const socialPromptKey = (platform) => `social.${platform}`;
|
|
9
|
+
// One post per site whose text comes from a post prompt (`config.social`): a paid call to the
|
|
10
|
+
// project's text model that reads the article. Every other text source is free and made when
|
|
11
|
+
// the pack is read, so a project without a post prompt plans exactly what it did before. The
|
|
12
|
+
// request waits for the article, and for the keywords its prompt uses.
|
|
13
|
+
export function socialRecipes(context, text) {
|
|
14
|
+
const { config } = context;
|
|
15
|
+
return socialPlatforms.flatMap((platform) => {
|
|
16
|
+
const choice = config.social?.[platform];
|
|
17
|
+
if (choice?.text !== "prompt")
|
|
18
|
+
return [];
|
|
19
|
+
const target = postTarget(platform);
|
|
20
|
+
const prompt = choice.prompt?.trim() === undefined || choice.prompt.trim() === ""
|
|
21
|
+
? undefined
|
|
22
|
+
: promptOf(context, socialPromptKey(platform));
|
|
23
|
+
const messages = withLanguage(postMessages({
|
|
24
|
+
instruction: prompt?.text ?? "",
|
|
25
|
+
target,
|
|
26
|
+
title: subjectOf(config),
|
|
27
|
+
article: text.articleText ?? "",
|
|
28
|
+
}), config.language);
|
|
29
|
+
const ready = text.articleText !== null && (prompt?.waits.length ?? 0) === 0;
|
|
30
|
+
return [
|
|
31
|
+
recipe(context, socialPostKey(platform), "video", ready
|
|
32
|
+
? { ...llmInput(context, messages), social: target }
|
|
33
|
+
: {
|
|
34
|
+
kind: "deferred",
|
|
35
|
+
version: 1,
|
|
36
|
+
operation: "social-post",
|
|
37
|
+
template: [
|
|
38
|
+
llmInputFingerprint(context, messages),
|
|
39
|
+
text.article.fingerprint,
|
|
40
|
+
platform,
|
|
41
|
+
...(prompt?.waits ?? []).map((one) => one.fingerprint),
|
|
42
|
+
],
|
|
43
|
+
}, [text.article.key, ...(prompt?.dependsOn ?? [])]),
|
|
44
|
+
];
|
|
45
|
+
});
|
|
46
|
+
}
|