@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,17 @@
|
|
|
1
|
+
-- Topic scoring (`slices/schedules/score.ts`): off for every schedule saved before it, which
|
|
2
|
+
-- then finds and orders topics exactly as it did. A topic's score is kept beside the queue, by
|
|
3
|
+
-- its normalised title, so the queue's own rows keep their strict shape; `pinned` is a topic the
|
|
4
|
+
-- person moved, which scoring then leaves where it was put.
|
|
5
|
+
ALTER TABLE schedules ADD COLUMN topic_scoring TEXT NOT NULL DEFAULT 'off' CHECK(topic_scoring IN ('off','library','search'));
|
|
6
|
+
CREATE TABLE topic_scores (
|
|
7
|
+
schedule_id TEXT NOT NULL REFERENCES schedules(id) ON DELETE CASCADE,
|
|
8
|
+
topic_key TEXT NOT NULL,
|
|
9
|
+
title TEXT NOT NULL,
|
|
10
|
+
score INTEGER NOT NULL CHECK(score BETWEEN 0 AND 100),
|
|
11
|
+
interest REAL,
|
|
12
|
+
novelty REAL NOT NULL,
|
|
13
|
+
reasons TEXT NOT NULL CHECK(json_valid(reasons)),
|
|
14
|
+
pinned INTEGER NOT NULL DEFAULT 0 CHECK(pinned IN (0,1)),
|
|
15
|
+
scored_at TEXT NOT NULL,
|
|
16
|
+
PRIMARY KEY(schedule_id, topic_key)
|
|
17
|
+
);
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
-- Designs (4.0): an uploaded or generated picture edited step by step, and a designed piece
|
|
2
|
+
-- (poster, flyer, brochure, social image) whose text Slopify lays out on the AI's artwork.
|
|
3
|
+
-- A design is its own record, not a project; `project_id` only links it to one ("Keep in
|
|
4
|
+
-- project") and is cleared when that project is deleted. `channel_id` is the channel its paid
|
|
5
|
+
-- calls count under on Home. `sample_of` marks the hidden sample a design template's editor
|
|
6
|
+
-- redraws; every list leaves those out. Each step is one version of the picture, kept in
|
|
7
|
+
-- image_blobs (backed up), chained by `parent_id`; `head_step_id` is the version the design
|
|
8
|
+
-- shows and continues from.
|
|
9
|
+
CREATE TABLE designs (
|
|
10
|
+
id TEXT PRIMARY KEY,
|
|
11
|
+
kind TEXT NOT NULL CHECK(kind IN ('edit','design')),
|
|
12
|
+
name TEXT NOT NULL CHECK(length(trim(name)) BETWEEN 1 AND 200),
|
|
13
|
+
channel_id TEXT NOT NULL,
|
|
14
|
+
project_id TEXT REFERENCES projects(id) ON DELETE SET NULL,
|
|
15
|
+
template_id TEXT,
|
|
16
|
+
template_version INTEGER CHECK(template_version IS NULL OR template_version >= 1),
|
|
17
|
+
schedule_id TEXT,
|
|
18
|
+
schedule_run_id TEXT,
|
|
19
|
+
document_json TEXT CHECK(document_json IS NULL OR json_valid(document_json)),
|
|
20
|
+
values_json TEXT NOT NULL DEFAULT '{}' CHECK(json_valid(values_json)),
|
|
21
|
+
head_step_id TEXT,
|
|
22
|
+
sample_of TEXT,
|
|
23
|
+
mutation_id TEXT UNIQUE,
|
|
24
|
+
mutation_hash TEXT,
|
|
25
|
+
created_at TEXT NOT NULL,
|
|
26
|
+
updated_at TEXT NOT NULL,
|
|
27
|
+
deleted_at TEXT
|
|
28
|
+
);
|
|
29
|
+
CREATE INDEX designs_project ON designs(project_id) WHERE project_id IS NOT NULL;
|
|
30
|
+
CREATE INDEX designs_schedule ON designs(schedule_id) WHERE schedule_id IS NOT NULL;
|
|
31
|
+
CREATE INDEX designs_sample_of ON designs(sample_of) WHERE sample_of IS NOT NULL;
|
|
32
|
+
CREATE TABLE design_steps (
|
|
33
|
+
id TEXT PRIMARY KEY,
|
|
34
|
+
design_id TEXT NOT NULL REFERENCES designs(id) ON DELETE CASCADE,
|
|
35
|
+
n INTEGER NOT NULL CHECK(n >= 1),
|
|
36
|
+
parent_id TEXT REFERENCES design_steps(id) ON DELETE CASCADE,
|
|
37
|
+
kind TEXT NOT NULL CHECK(kind IN ('upload','edit','generate')),
|
|
38
|
+
instruction TEXT CHECK(instruction IS NULL OR length(instruction) <= 4000),
|
|
39
|
+
provider TEXT,
|
|
40
|
+
model TEXT,
|
|
41
|
+
inputs_json TEXT NOT NULL DEFAULT '{}' CHECK(json_valid(inputs_json)),
|
|
42
|
+
state TEXT NOT NULL CHECK(state IN ('making','ready','failed')),
|
|
43
|
+
error TEXT,
|
|
44
|
+
sha256 TEXT REFERENCES image_blobs(sha256),
|
|
45
|
+
width INTEGER CHECK(width IS NULL OR width > 0),
|
|
46
|
+
height INTEGER CHECK(height IS NULL OR height > 0),
|
|
47
|
+
mutation_id TEXT UNIQUE,
|
|
48
|
+
mutation_hash TEXT,
|
|
49
|
+
created_at TEXT NOT NULL,
|
|
50
|
+
settled_at TEXT,
|
|
51
|
+
UNIQUE(design_id, n),
|
|
52
|
+
CHECK(state <> 'ready' OR sha256 IS NOT NULL)
|
|
53
|
+
);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
-- A design's picture edits and artwork are paid calls made outside a project, metered like a
|
|
2
|
+
-- schedule's or a channel's (0040). Every row is copied as it was; only the owner kinds widen.
|
|
3
|
+
CREATE TABLE standalone_usage_next (
|
|
4
|
+
id TEXT PRIMARY KEY,
|
|
5
|
+
owner_kind TEXT NOT NULL CHECK(owner_kind IN ('schedule','channel','design')),
|
|
6
|
+
owner_id TEXT NOT NULL,
|
|
7
|
+
channel_id TEXT NOT NULL,
|
|
8
|
+
purpose TEXT NOT NULL,
|
|
9
|
+
kind TEXT NOT NULL CHECK(kind IN ('llm','tts','image','video')),
|
|
10
|
+
provider TEXT NOT NULL,
|
|
11
|
+
model TEXT NOT NULL,
|
|
12
|
+
tokens_in INTEGER,
|
|
13
|
+
tokens_out INTEGER,
|
|
14
|
+
tokens_cached INTEGER,
|
|
15
|
+
characters INTEGER,
|
|
16
|
+
images INTEGER,
|
|
17
|
+
seconds REAL,
|
|
18
|
+
size TEXT,
|
|
19
|
+
quality TEXT,
|
|
20
|
+
wall_ms INTEGER NOT NULL,
|
|
21
|
+
on_plan INTEGER NOT NULL DEFAULT 0 CHECK(on_plan IN (0,1)),
|
|
22
|
+
cost REAL,
|
|
23
|
+
api_model TEXT,
|
|
24
|
+
api_cost REAL,
|
|
25
|
+
price_json TEXT CHECK(price_json IS NULL OR json_valid(price_json)),
|
|
26
|
+
account TEXT,
|
|
27
|
+
reading_json TEXT CHECK(reading_json IS NULL OR json_valid(reading_json)),
|
|
28
|
+
created_at TEXT NOT NULL
|
|
29
|
+
);
|
|
30
|
+
INSERT INTO standalone_usage_next SELECT id, owner_kind, owner_id, channel_id, purpose, kind, provider, model, tokens_in, tokens_out, tokens_cached, characters, images, seconds, size, quality, wall_ms, on_plan, cost, api_model, api_cost, price_json, account, reading_json, created_at FROM standalone_usage ORDER BY rowid;
|
|
31
|
+
DROP TABLE standalone_usage;
|
|
32
|
+
ALTER TABLE standalone_usage_next RENAME TO standalone_usage;
|
|
33
|
+
CREATE INDEX standalone_usage_created ON standalone_usage(created_at);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
-- Design templates: a designed piece saved with fields ({{Event}}, {{Date}}…) to make again by
|
|
2
|
+
-- hand or from a schedule. Every Save is a new revision; schedules only make from a revision
|
|
3
|
+
-- marked ready. `design_template_samples` is the one sample job per template its editor
|
|
4
|
+
-- redraws after a Save (the sample itself is a hidden design, `designs.sample_of`).
|
|
5
|
+
CREATE TABLE design_templates (
|
|
6
|
+
id TEXT PRIMARY KEY,
|
|
7
|
+
channel_id TEXT,
|
|
8
|
+
head_version INTEGER NOT NULL CHECK(head_version >= 1),
|
|
9
|
+
created_at TEXT NOT NULL,
|
|
10
|
+
deleted_at TEXT,
|
|
11
|
+
mutation_id TEXT UNIQUE,
|
|
12
|
+
mutation_hash TEXT
|
|
13
|
+
);
|
|
14
|
+
CREATE TABLE design_template_revisions (
|
|
15
|
+
template_id TEXT NOT NULL REFERENCES design_templates(id) ON DELETE CASCADE,
|
|
16
|
+
version INTEGER NOT NULL CHECK(version >= 1),
|
|
17
|
+
name TEXT NOT NULL CHECK(length(trim(name)) BETWEEN 1 AND 200),
|
|
18
|
+
document_json TEXT NOT NULL CHECK(json_valid(document_json)),
|
|
19
|
+
gate TEXT NOT NULL DEFAULT 'unchecked' CHECK(gate IN ('unchecked','ready')),
|
|
20
|
+
checks_json TEXT CHECK(checks_json IS NULL OR json_valid(checks_json)),
|
|
21
|
+
marked_at TEXT,
|
|
22
|
+
created_at TEXT NOT NULL,
|
|
23
|
+
PRIMARY KEY(template_id, version)
|
|
24
|
+
);
|
|
25
|
+
CREATE TABLE design_template_samples (
|
|
26
|
+
template_id TEXT PRIMARY KEY REFERENCES design_templates(id) ON DELETE CASCADE,
|
|
27
|
+
design_id TEXT UNIQUE,
|
|
28
|
+
version INTEGER NOT NULL CHECK(version >= 1),
|
|
29
|
+
state TEXT NOT NULL CHECK(state IN ('queued','making','done','failed','held')),
|
|
30
|
+
held_reason TEXT,
|
|
31
|
+
quoted_high REAL,
|
|
32
|
+
updated_at TEXT NOT NULL
|
|
33
|
+
);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
-- A schedule makes either projects from a project template (every schedule so far) or
|
|
2
|
+
-- designed pieces from a design template, one per row of its table ahead of that row's date.
|
|
3
|
+
-- `design_ids_json` lists the designs a run made, as `project_ids_json` lists projects.
|
|
4
|
+
ALTER TABLE schedules ADD COLUMN template_kind TEXT NOT NULL DEFAULT 'project' CHECK(template_kind IN ('project','design'));
|
|
5
|
+
ALTER TABLE schedule_runs ADD COLUMN design_ids_json TEXT NOT NULL DEFAULT '[]' CHECK(json_valid(design_ids_json));
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
-- Template studio's model bake-off (4.0, `slices/template-studio/bakeoff.ts`): one section's
|
|
2
|
+
-- sample made again on two or three models, each on a hidden copy of the template's sample
|
|
3
|
+
-- project, compared by cost and speed, then discarded. One bake-off per template at a time.
|
|
4
|
+
CREATE TABLE template_bakeoffs (
|
|
5
|
+
id TEXT PRIMARY KEY,
|
|
6
|
+
template_id TEXT NOT NULL UNIQUE REFERENCES project_templates(id) ON DELETE CASCADE,
|
|
7
|
+
template_version INTEGER NOT NULL CHECK(template_version >= 1),
|
|
8
|
+
section TEXT NOT NULL CHECK(section IN ('script','voice','pictures')),
|
|
9
|
+
ack_high REAL NOT NULL CHECK(ack_high >= 0),
|
|
10
|
+
ack_unknown INTEGER NOT NULL DEFAULT 0 CHECK(ack_unknown IN (0,1)),
|
|
11
|
+
state TEXT NOT NULL CHECK(state IN ('queued','making','done','held','failed')),
|
|
12
|
+
sentence TEXT,
|
|
13
|
+
created_at TEXT NOT NULL,
|
|
14
|
+
updated_at TEXT NOT NULL
|
|
15
|
+
);
|
|
16
|
+
-- Each model's copy. Its project is hidden like the sample's (`template_hidden_projects`) and
|
|
17
|
+
-- removed with the bake-off.
|
|
18
|
+
CREATE TABLE template_bakeoff_clones (
|
|
19
|
+
bakeoff_id TEXT NOT NULL REFERENCES template_bakeoffs(id) ON DELETE CASCADE,
|
|
20
|
+
slot INTEGER NOT NULL CHECK(slot BETWEEN 0 AND 2),
|
|
21
|
+
provider TEXT NOT NULL CHECK(length(provider) BETWEEN 1 AND 100),
|
|
22
|
+
model TEXT NOT NULL CHECK(length(model) BETWEEN 1 AND 200),
|
|
23
|
+
project_id TEXT UNIQUE,
|
|
24
|
+
state TEXT NOT NULL CHECK(state IN ('queued','making','done','failed')),
|
|
25
|
+
quoted_high REAL,
|
|
26
|
+
failure TEXT,
|
|
27
|
+
started_at TEXT,
|
|
28
|
+
finished_at TEXT,
|
|
29
|
+
PRIMARY KEY(bakeoff_id, slot)
|
|
30
|
+
);
|
|
31
|
+
-- Every project the studio keeps out of the lists the person sees: each template's sample and
|
|
32
|
+
-- each bake-off copy (`notTemplateSample`).
|
|
33
|
+
CREATE VIEW template_hidden_projects AS
|
|
34
|
+
SELECT project_id FROM template_samples
|
|
35
|
+
UNION ALL
|
|
36
|
+
SELECT project_id FROM template_bakeoff_clones WHERE project_id IS NOT NULL;
|
|
37
|
+
-- What a hidden project spent, kept when the project is removed (a bake-off discarded, a sample
|
|
38
|
+
-- made again on a new topic), so today's sample budget still counts it.
|
|
39
|
+
CREATE TABLE template_studio_spend (
|
|
40
|
+
project_id TEXT NOT NULL,
|
|
41
|
+
cost REAL NOT NULL CHECK(cost >= 0),
|
|
42
|
+
created_at TEXT NOT NULL
|
|
43
|
+
);
|
|
44
|
+
CREATE INDEX template_studio_spend_at ON template_studio_spend(created_at);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
-- Posting to other sites (`slices/social`). One row per project, site and item (0 is the
|
|
2
|
+
-- project's one post per site): the project's own pick (`choice_json`, NULL is the template's),
|
|
3
|
+
-- the person's hand edit of the text and the generated text it was made from, Reddit's own
|
|
4
|
+
-- fields, and where the post stands after the extension filled it or the person posted it.
|
|
5
|
+
-- A project with no row posts as its settings say; nothing here is generated.
|
|
6
|
+
CREATE TABLE social_posts (
|
|
7
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
8
|
+
platform TEXT NOT NULL CHECK (platform IN ('x','linkedin','instagram','tiktok','reddit','bluesky')),
|
|
9
|
+
item INTEGER NOT NULL DEFAULT 0 CHECK (item >= 0),
|
|
10
|
+
choice_json TEXT CHECK (choice_json IS NULL OR json_valid(choice_json)),
|
|
11
|
+
text_edit TEXT,
|
|
12
|
+
text_base TEXT,
|
|
13
|
+
reddit_json TEXT CHECK (reddit_json IS NULL OR json_valid(reddit_json)),
|
|
14
|
+
state TEXT NOT NULL DEFAULT 'none' CHECK (state IN ('none','waiting','filling','filled','scheduled','posted','failed')),
|
|
15
|
+
waiting_at TEXT,
|
|
16
|
+
filled_at TEXT,
|
|
17
|
+
scheduled_at TEXT,
|
|
18
|
+
posted_at TEXT,
|
|
19
|
+
url TEXT,
|
|
20
|
+
message TEXT,
|
|
21
|
+
by TEXT CHECK (by IN ('extension','person')),
|
|
22
|
+
updated_at TEXT NOT NULL,
|
|
23
|
+
PRIMARY KEY (project_id, platform, item)
|
|
24
|
+
);
|
|
25
|
+
CREATE INDEX social_posts_waiting ON social_posts(platform, waiting_at) WHERE state = 'waiting';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
-- A channel's accounts on other sites (`slices/social`): the X subscription, which only changes
|
|
2
|
+
-- a post's warnings, and the account names the extension reads a published post's link from.
|
|
3
|
+
-- Never a login.
|
|
4
|
+
ALTER TABLE channels ADD COLUMN x_tier TEXT NOT NULL DEFAULT 'free' CHECK (x_tier IN ('free','premium','premium_plus'));
|
|
5
|
+
ALTER TABLE channels ADD COLUMN social_accounts TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(social_accounts));
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-- Library prompts of the new "post" kind: what writes a project's post for another site
|
|
2
|
+
-- (`slices/social`). SQLite cannot change a CHECK in place, so the table is copied into one
|
|
3
|
+
-- whose CHECK lists the new kind, like 0034 did for "script".
|
|
4
|
+
CREATE TABLE prompts_post_upgrade (
|
|
5
|
+
id TEXT PRIMARY KEY,
|
|
6
|
+
kind TEXT NOT NULL CHECK (kind IN ('article','image','thumbnail','narration','description','shorts','review','script','post')),
|
|
7
|
+
name TEXT NOT NULL,
|
|
8
|
+
body TEXT NOT NULL,
|
|
9
|
+
slots TEXT NOT NULL,
|
|
10
|
+
updated_at TEXT NOT NULL,
|
|
11
|
+
deleted_at TEXT
|
|
12
|
+
);
|
|
13
|
+
INSERT INTO prompts_post_upgrade (id,kind,name,body,slots,updated_at,deleted_at)
|
|
14
|
+
SELECT id,kind,name,body,slots,updated_at,deleted_at FROM prompts;
|
|
15
|
+
DROP TABLE prompts;
|
|
16
|
+
ALTER TABLE prompts_post_upgrade RENAME TO prompts;
|
|
17
|
+
CREATE UNIQUE INDEX prompts_name ON prompts(kind,lower(name)) WHERE deleted_at IS NULL;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
-- The long video on YouTube and the project's "uploaded" mark are one fact
|
|
2
|
+
-- (`slices/studio/videos.ts`): saving or confirming the long video's link marks the project
|
|
3
|
+
-- uploaded. A long video already on YouTube before that marks its project now, from when its
|
|
4
|
+
-- link was recorded; a mark made by hand keeps its own time.
|
|
5
|
+
INSERT INTO project_uploads (project_id, uploaded_at)
|
|
6
|
+
SELECT project_id, recorded_at FROM youtube_videos WHERE short = 0 AND upload_state = 'done'
|
|
7
|
+
ON CONFLICT(project_id) DO NOTHING;
|
package/dist/kernel/db/tx.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { errorText } from "../errors.js";
|
|
1
2
|
// SQLite starts a transaction for a SAVEPOINT issued outside one and nests it inside one
|
|
2
3
|
// already open, so a slice can wrap its own writes without knowing whether its caller did
|
|
3
4
|
// too. The name is a constant, not a parameter: SQLite matches RELEASE and ROLLBACK TO
|
|
@@ -34,7 +35,7 @@ function unwind(db, error) {
|
|
|
34
35
|
db.exec(`RELEASE ${savepoint}`);
|
|
35
36
|
}
|
|
36
37
|
catch (cleanup) {
|
|
37
|
-
throw new Error(`the transaction could not be unwound: ${
|
|
38
|
+
throw new Error(`the transaction could not be unwound: ${errorText(cleanup)}`, {
|
|
38
39
|
cause: error,
|
|
39
40
|
});
|
|
40
41
|
}
|
|
@@ -45,6 +46,3 @@ function isThenable(value) {
|
|
|
45
46
|
"then" in value &&
|
|
46
47
|
typeof value.then === "function");
|
|
47
48
|
}
|
|
48
|
-
function messageOf(error) {
|
|
49
|
-
return error instanceof Error ? error.message : String(error);
|
|
50
|
-
}
|
package/dist/kernel/errors.js
CHANGED
|
@@ -1,8 +1,29 @@
|
|
|
1
|
+
// The one sentence a failure carries: an Error's message, or whatever else was thrown as text.
|
|
2
|
+
export function errorText(error) {
|
|
3
|
+
return error instanceof Error ? error.message : String(error);
|
|
4
|
+
}
|
|
5
|
+
// The Node file-system code (`ENOENT`, `EEXIST`) of a thrown value, if it carries one.
|
|
6
|
+
export function errnoCode(error) {
|
|
7
|
+
return typeof error === "object" &&
|
|
8
|
+
error !== null &&
|
|
9
|
+
"code" in error &&
|
|
10
|
+
typeof error.code === "string"
|
|
11
|
+
? error.code
|
|
12
|
+
: undefined;
|
|
13
|
+
}
|
|
14
|
+
export function hasErrnoCode(error, code) {
|
|
15
|
+
return errnoCode(error) === code;
|
|
16
|
+
}
|
|
17
|
+
// A path that is missing, not a directory, not readable or a link loop: nothing to read there.
|
|
18
|
+
export function isUnreachablePath(error) {
|
|
19
|
+
const code = errnoCode(error);
|
|
20
|
+
return code !== undefined && ["ENOENT", "ENOTDIR", "EACCES", "EPERM", "ELOOP"].includes(code);
|
|
21
|
+
}
|
|
1
22
|
// A failure's own sentence and every cause it wraps, for the log. The page shows only the
|
|
2
23
|
// sentence; the chain is the only place a "download interrupted" says the server closed the
|
|
3
24
|
// stream.
|
|
4
25
|
export function causedBy(error) {
|
|
5
|
-
const chain = [
|
|
26
|
+
const chain = [errorText(error)];
|
|
6
27
|
let cause = error instanceof Error ? error.cause : undefined;
|
|
7
28
|
while (cause !== undefined && cause !== null && chain.length < 6) {
|
|
8
29
|
chain.push(cause instanceof Error ? `${cause.name}: ${cause.message}` : String(cause));
|
|
@@ -10,3 +31,8 @@ export function causedBy(error) {
|
|
|
10
31
|
}
|
|
11
32
|
return chain.join(" <- ");
|
|
12
33
|
}
|
|
34
|
+
// The sentence for a check that can only fail through a bug. `what` says which check, in words a
|
|
35
|
+
// person can report; `retry` names the button that is right on the screen the message appears on.
|
|
36
|
+
export function internalError(what, retry = "Try again") {
|
|
37
|
+
return `Slopify hit an internal error (${what}). ${retry}; if it happens again, use Download diagnostics in Settings and report it.`;
|
|
38
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// The JSON an AI model's answer carries, wherever the model put it: bare, in a ```json fence, or
|
|
2
|
+
// after a sentence of its own. Everything from the first `open` to the last `close` is parsed;
|
|
3
|
+
// undefined when there is none or it is not JSON.
|
|
4
|
+
export function jsonBetween(text, open, close) {
|
|
5
|
+
const start = text.indexOf(open);
|
|
6
|
+
const end = text.lastIndexOf(close);
|
|
7
|
+
if (start === -1 || end <= start)
|
|
8
|
+
return undefined;
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(text.slice(start, end + 1));
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
}
|
package/dist/kernel/lock.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { errnoCode } from "./errors.js";
|
|
2
3
|
// Seconds since the epoch at which this process started, stable for its whole life.
|
|
3
4
|
const startedAt = Math.round(Date.now() / 1000 - process.uptime());
|
|
4
5
|
export function acquireInstanceLock(lockPath) {
|
|
@@ -32,7 +33,7 @@ function claim(lockPath, pid) {
|
|
|
32
33
|
return true;
|
|
33
34
|
}
|
|
34
35
|
catch (error) {
|
|
35
|
-
if (
|
|
36
|
+
if (errnoCode(error) === "EEXIST") {
|
|
36
37
|
return false;
|
|
37
38
|
}
|
|
38
39
|
throw error;
|
|
@@ -65,7 +66,7 @@ function discard(lockPath) {
|
|
|
65
66
|
unlinkSync(lockPath);
|
|
66
67
|
}
|
|
67
68
|
catch (error) {
|
|
68
|
-
if (
|
|
69
|
+
if (errnoCode(error) !== "ENOENT") {
|
|
69
70
|
throw error;
|
|
70
71
|
}
|
|
71
72
|
}
|
|
@@ -77,12 +78,6 @@ function isAlive(pid) {
|
|
|
77
78
|
}
|
|
78
79
|
catch (error) {
|
|
79
80
|
// EPERM means the process exists and belongs to someone else.
|
|
80
|
-
return
|
|
81
|
+
return errnoCode(error) === "EPERM";
|
|
81
82
|
}
|
|
82
83
|
}
|
|
83
|
-
function errnoOf(error) {
|
|
84
|
-
if (error instanceof Error && "code" in error && typeof error.code === "string") {
|
|
85
|
-
return error.code;
|
|
86
|
-
}
|
|
87
|
-
return undefined;
|
|
88
|
-
}
|
package/dist/kernel/paths.js
CHANGED
|
@@ -18,6 +18,14 @@ export function layout(dataDir, files) {
|
|
|
18
18
|
export function attachPlaces(paths, places) {
|
|
19
19
|
Object.assign(paths, { places });
|
|
20
20
|
}
|
|
21
|
+
// Tells a running install's Paths which projects are studio samples.
|
|
22
|
+
export function attachSamples(paths, samples) {
|
|
23
|
+
Object.assign(paths, { samples });
|
|
24
|
+
}
|
|
25
|
+
// Where the studio samples' project folders are: inside the data dir, beside the database.
|
|
26
|
+
export function templateSamplesDir(paths) {
|
|
27
|
+
return join(paths.dataDir, "template-studio", "samples");
|
|
28
|
+
}
|
|
21
29
|
// Points a running install's Paths at moved files. The one object every slice was handed is
|
|
22
30
|
// changed in place, so the next file each one reads or writes is in the new place.
|
|
23
31
|
export function repoint(paths, files) {
|
package/dist/kernel/pipeline.js
CHANGED
|
@@ -19,6 +19,18 @@ export const stageKinds = [
|
|
|
19
19
|
"video",
|
|
20
20
|
"document",
|
|
21
21
|
];
|
|
22
|
+
// One name per stage, everywhere a stage is named, on screen (the web app reads it through
|
|
23
|
+
// `@/lib/stage-words`) and in the server's sentences. The pipeline calls the narration stage
|
|
24
|
+
// `audio` and the PDF stage `document`; a person never sees those words.
|
|
25
|
+
export const stageWords = {
|
|
26
|
+
research: "Research",
|
|
27
|
+
article: "Article",
|
|
28
|
+
audio: "Narration",
|
|
29
|
+
images: "Images",
|
|
30
|
+
thumbnail: "Thumbnail",
|
|
31
|
+
video: "Video",
|
|
32
|
+
document: "PDF",
|
|
33
|
+
};
|
|
22
34
|
export const stageStates = [
|
|
23
35
|
"pending",
|
|
24
36
|
"running",
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// The in-app assistant's turn on a CLI on this computer (`adapters/llm/assistant-cli.ts`). The
|
|
2
|
+
// slice hands in the turn's prompt and token and reads back what the chat shows; how the CLI
|
|
3
|
+
// is started, isolated and read stays in the adapter.
|
|
4
|
+
export const assistantCliIds = ["claude-code", "codex"];
|
|
@@ -91,6 +91,9 @@ export const hostImageSchema = z
|
|
|
91
91
|
.strict())
|
|
92
92
|
.max(4)
|
|
93
93
|
.optional(),
|
|
94
|
+
// A design's picture to change (`ImageRequest.edit`). A helper from before it refuses the
|
|
95
|
+
// whole request as invalid rather than drawing a new picture in its place.
|
|
96
|
+
edit: z.object({ source: bridgedImage }).strict().optional(),
|
|
94
97
|
})
|
|
95
98
|
.strict();
|
|
96
99
|
export const hostOpenFolderSchema = z
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// Public search interest in a topic: the search suggestions offered for it and how often its
|
|
2
|
+
// Wikipedia article is read. Used only by schedules the person set to rank topics by search
|
|
3
|
+
// interest; it sends the topic's title and nothing else. Never a channel's own analytics.
|
|
4
|
+
export {};
|
|
@@ -61,9 +61,6 @@ export function languageInfo(code) {
|
|
|
61
61
|
export function projectLanguage(config) {
|
|
62
62
|
return config.language ?? defaultLanguage;
|
|
63
63
|
}
|
|
64
|
-
export function isEnglish(config) {
|
|
65
|
-
return projectLanguage(config) === defaultLanguage;
|
|
66
|
-
}
|
|
67
64
|
// The line added to every prompt that writes for the audience, when the project is not in
|
|
68
65
|
// English. It is the app's own sentence, added after the user's prompt rather than written
|
|
69
66
|
// into it, so the prompt library stays as the user wrote it; an English project gets nothing,
|
|
@@ -22,12 +22,14 @@ export const providerErrorKinds = [
|
|
|
22
22
|
"dropped",
|
|
23
23
|
"other",
|
|
24
24
|
];
|
|
25
|
+
export const modelAccesses = ["no-access", "not-found"];
|
|
25
26
|
export function providerError(init) {
|
|
26
27
|
return Object.assign(new Error(init.message), {
|
|
27
28
|
fault: {
|
|
28
29
|
kind: init.kind,
|
|
29
30
|
...(init.retryAfterMs === undefined ? {} : { retryAfterMs: init.retryAfterMs }),
|
|
30
31
|
...(init.planLimit === undefined ? {} : { planLimit: init.planLimit }),
|
|
32
|
+
...(init.access === undefined ? {} : { access: init.access }),
|
|
31
33
|
},
|
|
32
34
|
});
|
|
33
35
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Where a server sentence sends a person to change something: a project's Edit settings and its
|
|
2
|
+
// sections (the web app's project/revision-form.tsx), and Create's rows (play/setup-rows.ts).
|
|
3
|
+
// Named once here, so every refusal and failure says the same path, and a section that is
|
|
4
|
+
// renamed on screen is renamed in its sentences by changing one line. Browser-safe.
|
|
5
|
+
export const editSettings = {
|
|
6
|
+
open: "Edit settings",
|
|
7
|
+
title: "Edit settings → Title and keywords",
|
|
8
|
+
article: "Edit settings → Article",
|
|
9
|
+
// The one text model a project's AI writing uses: the article, its research, the narration's
|
|
10
|
+
// preparation, the image prompts, the description, the shorts' picks and the speaker split.
|
|
11
|
+
writer: "Edit settings → Article → Written by",
|
|
12
|
+
narration: "Edit settings → Narration",
|
|
13
|
+
images: "Edit settings → Images",
|
|
14
|
+
video: "Edit settings → Video and style",
|
|
15
|
+
look: "Edit settings → Video and style → Look",
|
|
16
|
+
sound: "Edit settings → Video and style → Sound polish",
|
|
17
|
+
captions: "Edit settings → Captions",
|
|
18
|
+
// The thumbnail, the YouTube description, the shorts and the PDF, together as in Create.
|
|
19
|
+
extras: "Edit settings → Extras",
|
|
20
|
+
shorts: "Edit settings → Extras → Shorts",
|
|
21
|
+
checks: "Edit settings → Pauses and checks",
|
|
22
|
+
channel: "Edit settings → Channel",
|
|
23
|
+
language: "Edit settings → Channel → Language",
|
|
24
|
+
};
|
|
25
|
+
export const createRows = {
|
|
26
|
+
article: "Create → Article",
|
|
27
|
+
narration: "Create → Narration",
|
|
28
|
+
images: "Create → Images",
|
|
29
|
+
video: "Create → Video and style",
|
|
30
|
+
extras: "Create → Extras",
|
|
31
|
+
};
|
|
@@ -30,7 +30,30 @@ const picoVoices = [
|
|
|
30
30
|
{ id: "fr-FR", name: "French", language: "fr-FR" },
|
|
31
31
|
{ id: "it-IT", name: "Italian", language: "it-IT" },
|
|
32
32
|
];
|
|
33
|
-
|
|
33
|
+
// OpenAI is named alone: the voices the starter templates set up are OpenAI voices, so its key
|
|
34
|
+
// narrates at once, while ElevenLabs, Cartesia and Inworld also need a voice saved first.
|
|
35
|
+
export const noSpeechFix = "or add an OpenAI key in Settings → Keys & services: its voices work at once and sound better.";
|
|
36
|
+
// How to get a speech program onto this computer from a terminal, for a screen that lists the
|
|
37
|
+
// commands apart from the sentence (the first-run checklist), or undefined where none is
|
|
38
|
+
// installed that way: macOS and Windows have their own, which only a broken setup lacks. The
|
|
39
|
+
// issue sentences below name the fix in words and leave the commands to this.
|
|
40
|
+
export function speechInstall(host) {
|
|
41
|
+
if (host.platform === "darwin" || host.platform === "win32")
|
|
42
|
+
return undefined;
|
|
43
|
+
return host.env.SLOPIFY_CONTAINER === "1"
|
|
44
|
+
? {
|
|
45
|
+
text: "Update Slopify's Docker image, which has one built in:",
|
|
46
|
+
commands: ["docker compose pull", "docker compose up -d"],
|
|
47
|
+
}
|
|
48
|
+
: {
|
|
49
|
+
text: "Install espeak-ng with one of these:",
|
|
50
|
+
commands: [
|
|
51
|
+
"sudo apt install espeak-ng",
|
|
52
|
+
"sudo pacman -S espeak-ng",
|
|
53
|
+
"sudo dnf install espeak-ng",
|
|
54
|
+
],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
34
57
|
export async function detectSpeech(given, host) {
|
|
35
58
|
// A probe that throws (a host bridge that cannot run local programs) found nothing.
|
|
36
59
|
const probe = (binary, args, timeoutMs) => Promise.resolve()
|
|
@@ -84,8 +107,8 @@ export async function detectSpeech(given, host) {
|
|
|
84
107
|
return {
|
|
85
108
|
engines,
|
|
86
109
|
issue: host.env.SLOPIFY_CONTAINER === "1"
|
|
87
|
-
? `Slopify runs in Docker and this image has no speech program, so the system voice can't narrate. Update
|
|
88
|
-
: `No speech program was found on this computer, so the system voice can't narrate. Install
|
|
110
|
+
? `Slopify runs in Docker and this image has no speech program, so the system voice can't narrate. Update Slopify's Docker image, which has one built in, ${noSpeechFix}`
|
|
111
|
+
: `No speech program was found on this computer, so the system voice can't narrate. Install the free program eSpeak NG, ${noSpeechFix}`,
|
|
89
112
|
};
|
|
90
113
|
}
|
|
91
114
|
async function onPath(probe, binary) {
|
|
@@ -185,6 +208,11 @@ export function primaryLanguage(voice) {
|
|
|
185
208
|
// processes each time is wasted work for something that changes when a program is installed.
|
|
186
209
|
const cacheMs = 60_000;
|
|
187
210
|
const cached = new WeakMap();
|
|
211
|
+
// "Check again" after installing a speech program: the next look runs the programs again
|
|
212
|
+
// instead of answering from the last minute's.
|
|
213
|
+
export function forgetDetectedSpeech(probe) {
|
|
214
|
+
cached.delete(probe);
|
|
215
|
+
}
|
|
188
216
|
export function detectSpeechCached(probe, host) {
|
|
189
217
|
const now = performance.now();
|
|
190
218
|
const key = [
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { errorText } from "../errors.js";
|
|
1
2
|
import { redact } from "../log.js";
|
|
2
3
|
import { isProviderError, providerError } from "../ports/model.js";
|
|
4
|
+
import { editSettings } from "../ports/settings-places.js";
|
|
3
5
|
// The retry policy, in one place. A stage slice is handed the wrapped calls of
|
|
4
6
|
// `providers.ts` and never an adapter, so there is no way round it.
|
|
5
7
|
// Four attempts - the first plus 3 retries - waiting 2 s, 8 s, 30 s.
|
|
@@ -111,7 +113,7 @@ function classify(error, expired, opts, limit) {
|
|
|
111
113
|
kind: "timeout",
|
|
112
114
|
message: opts.streaming === true
|
|
113
115
|
? `The ${callee[opts.kind]} sent nothing for ${seconds} seconds, so Slopify stopped waiting. It may be overloaded: wait a few minutes, then use Try again.`
|
|
114
|
-
: `The ${callee[opts.kind]} did not answer within ${seconds} seconds. It may be overloaded: wait a few minutes, then use Try again, or choose another model in
|
|
116
|
+
: `The ${callee[opts.kind]} did not answer within ${seconds} seconds. It may be overloaded: wait a few minutes, then use Try again, or choose another model in ${modelPlace[opts.kind]}.`,
|
|
115
117
|
});
|
|
116
118
|
}
|
|
117
119
|
if (isProviderError(error)) {
|
|
@@ -122,6 +124,7 @@ function classify(error, expired, opts, limit) {
|
|
|
122
124
|
message: redact(error.message),
|
|
123
125
|
...(error.fault.retryAfterMs === undefined ? {} : { retryAfterMs: error.fault.retryAfterMs }),
|
|
124
126
|
...(error.fault.planLimit === undefined ? {} : { planLimit: error.fault.planLimit }),
|
|
127
|
+
...(error.fault.access === undefined ? {} : { access: error.fault.access }),
|
|
125
128
|
});
|
|
126
129
|
}
|
|
127
130
|
if (unreachable(error)) {
|
|
@@ -134,16 +137,23 @@ function classify(error, expired, opts, limit) {
|
|
|
134
137
|
}
|
|
135
138
|
return providerError({
|
|
136
139
|
kind: "other",
|
|
137
|
-
message: redact(
|
|
140
|
+
message: redact(errorText(error)),
|
|
138
141
|
});
|
|
139
142
|
}
|
|
140
143
|
// What the user calls the other end of each kind of call.
|
|
141
144
|
const callee = {
|
|
142
145
|
llm: "AI model",
|
|
143
|
-
tts: "
|
|
144
|
-
image: "image
|
|
146
|
+
tts: "voice service",
|
|
147
|
+
image: "image service",
|
|
145
148
|
video: "image-to-video model",
|
|
146
149
|
};
|
|
150
|
+
// Where a project's settings choose the model of each kind of call.
|
|
151
|
+
const modelPlace = {
|
|
152
|
+
llm: editSettings.writer,
|
|
153
|
+
tts: editSettings.narration,
|
|
154
|
+
image: editSettings.images,
|
|
155
|
+
video: editSettings.look,
|
|
156
|
+
};
|
|
147
157
|
// Node's `fetch` rejects a request that never reached the server with this TypeError.
|
|
148
158
|
function unreachable(error) {
|
|
149
159
|
return error instanceof TypeError && error.message === "fetch failed";
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { attempt } from "./attempt.js";
|
|
2
|
+
import { observed } from "./model-access.js";
|
|
2
3
|
const unrecorded = {
|
|
3
4
|
start: () => "audition",
|
|
4
5
|
end: () => { },
|
|
5
6
|
};
|
|
6
7
|
export function auditionVoice(deps, call, signal) {
|
|
7
8
|
const port = deps.registry.tts(call.provider);
|
|
8
|
-
|
|
9
|
+
const spoken = attempt({
|
|
9
10
|
work: {
|
|
10
11
|
projectId: "audition",
|
|
11
12
|
revisionId: "audition",
|
|
@@ -33,4 +34,5 @@ export function auditionVoice(deps, call, signal) {
|
|
|
33
34
|
const bytes = new Uint8Array(await new Response(spoken.audio).arrayBuffer());
|
|
34
35
|
return { bytes, container: spoken.container };
|
|
35
36
|
}, { kind: "tts", streaming: port.capabilities.streams });
|
|
37
|
+
return observed(deps.access, deps.log, { provider: call.provider, family: "tts", model: call.model ?? "" }, spoken, (result) => result.ok);
|
|
36
38
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { errorText } from "../errors.js";
|
|
1
2
|
export function createCheckpointAuthority(deps) {
|
|
2
3
|
return {
|
|
3
4
|
beforeClaim: deps.decide,
|
|
@@ -13,7 +14,7 @@ export function createCheckpointAuthority(deps) {
|
|
|
13
14
|
catch (error) {
|
|
14
15
|
deps.log.write("error", "checkpoint.wake", {
|
|
15
16
|
projectId,
|
|
16
|
-
detail:
|
|
17
|
+
detail: errorText(error),
|
|
17
18
|
});
|
|
18
19
|
}
|
|
19
20
|
}
|