@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
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { remark } from "remark";
|
|
2
2
|
import remarkGfm from "remark-gfm";
|
|
3
|
+
import { internalError } from "../../kernel/errors.js";
|
|
4
|
+
import { createRows, editSettings } from "../../kernel/ports/settings-places.js";
|
|
3
5
|
import { remembered } from "../../kernel/remembered.js";
|
|
4
6
|
export const currentPronunciationRules = 2;
|
|
5
7
|
export function pronunciationRulesOf(config) {
|
|
@@ -153,7 +155,7 @@ function parseGlossary(markdown, language, rules = currentPronunciationRules) {
|
|
|
153
155
|
export function skippedGlossaryNotice(skipped, unpronounced = 0) {
|
|
154
156
|
if (skipped.length === 0 && unpronounced === 0)
|
|
155
157
|
return null;
|
|
156
|
-
const where =
|
|
158
|
+
const where = `in the Pronunciation Glossary at the end of the article in ${editSettings.article}`;
|
|
157
159
|
const blank = unpronounced === 0
|
|
158
160
|
? ""
|
|
159
161
|
: `${unpronounced === 1 ? "1 name has" : `${unpronounced} names have`} no pronunciation given and ${unpronounced === 1 ? "is" : "are"} read as written. To give ${unpronounced === 1 ? "it one" : "them one"}, fill in its IPA ${where}.`;
|
|
@@ -178,7 +180,7 @@ export function skippedSpeakerPronunciationsNotice(rows) {
|
|
|
178
180
|
return null;
|
|
179
181
|
const parts = rows.map((row) => `${row.speaker}: ${row.skipped.map((one) => `entry ${one.row}: ${one.reason}`).join("; ")}`);
|
|
180
182
|
return (`Speaker pronunciations: some entries are skipped and read as ordinary text (${parts.join(". ")}). ` +
|
|
181
|
-
|
|
183
|
+
`The rest are used. To use them, fix those entries under Speakers → Pronunciations for that speaker (${createRows.narration}, or ${editSettings.narration}).`);
|
|
182
184
|
}
|
|
183
185
|
// Remembered (`kernel/remembered.ts`): every plan rebuild matches the whole narration again.
|
|
184
186
|
export const pronunciationMatches = remembered(1024, (source, entries, possessives) => `${possessives === true ? "p" : "-"}\u0000${source}\u0000${JSON.stringify(entries)}`, matchPronunciations);
|
|
@@ -211,7 +213,7 @@ function matchPronunciations(source, entries, possessives = false) {
|
|
|
211
213
|
continue;
|
|
212
214
|
const entry = ordered.find((_, index) => match[index + 1] !== undefined);
|
|
213
215
|
if (entry === undefined)
|
|
214
|
-
throw new Error("
|
|
216
|
+
throw new Error(internalError("a pronunciation glossary term has no pronunciation"));
|
|
215
217
|
const possessive = possessives ? match[ordered.length + 1] : undefined;
|
|
216
218
|
matches.push({
|
|
217
219
|
start: match.index,
|
|
@@ -237,7 +239,7 @@ export function pronunciationSpans(source, entries, possessives = false) {
|
|
|
237
239
|
for (const [index, word] of words.entries()) {
|
|
238
240
|
const ipa = match.entry.ipa[index];
|
|
239
241
|
if (ipa === undefined)
|
|
240
|
-
throw new Error("
|
|
242
|
+
throw new Error(internalError("a pronunciation glossary term is missing a word"));
|
|
241
243
|
const start = match.start + word.index;
|
|
242
244
|
const spoken = match.possessive !== undefined && index === words.length - 1 ? withPossessive(ipa) : ipa;
|
|
243
245
|
spans.push({ start, end: start + word[0].length, text: `/${spoken}/` });
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { internalError } from "../../kernel/errors.js";
|
|
1
2
|
import { sourceSentences } from "./preparation.js";
|
|
2
3
|
const cannotFit = {
|
|
3
4
|
ok: false,
|
|
@@ -9,14 +10,14 @@ function atoms(source, from, to, spans) {
|
|
|
9
10
|
const span = spans.get(at);
|
|
10
11
|
if (span !== undefined) {
|
|
11
12
|
if (span.end > to || span.end <= at)
|
|
12
|
-
throw new Error("
|
|
13
|
+
throw new Error(internalError("a pronunciation fix spans more than one word"));
|
|
13
14
|
result.push({ text: span.text, spokenText: source.slice(at, span.end) });
|
|
14
15
|
at = span.end;
|
|
15
16
|
}
|
|
16
17
|
else {
|
|
17
18
|
const point = source.codePointAt(at);
|
|
18
19
|
if (point === undefined)
|
|
19
|
-
throw new Error("
|
|
20
|
+
throw new Error(internalError("a narration position is outside the article text"));
|
|
20
21
|
const text = String.fromCodePoint(point);
|
|
21
22
|
// An empty span is a later word of a multi-word alias (its spoken form sits on the first
|
|
22
23
|
// word), so the whitespace in front of it would leave two spaces where one word was.
|
|
@@ -45,7 +46,7 @@ function checkedSpans(source, pronunciation) {
|
|
|
45
46
|
span.end <= span.start ||
|
|
46
47
|
span.end > source.length ||
|
|
47
48
|
!/^[^\s\uD800-\uDFFF]+$/u.test(source.slice(span.start, span.end)))
|
|
48
|
-
throw new Error("
|
|
49
|
+
throw new Error(internalError("pronunciation fixes overlap or split a word"));
|
|
49
50
|
spans.set(span.start, span);
|
|
50
51
|
end = span.end;
|
|
51
52
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { errorText } from "../../kernel/errors.js";
|
|
1
2
|
import { redact } from "../../kernel/log.js";
|
|
2
3
|
import { webhookBody } from "./address.js";
|
|
3
4
|
import { autoPassNoticeText, noticeOf, noticeText, reviewNoticeText, runNotices, topicsNoticeText, } from "./rules.js";
|
|
@@ -84,7 +85,7 @@ export function createRunNotifier(deps) {
|
|
|
84
85
|
.catch((error) => {
|
|
85
86
|
deps.log.write("warn", "notification.failed", {
|
|
86
87
|
...about,
|
|
87
|
-
detail: `${kind} notification not delivered: ${
|
|
88
|
+
detail: `${kind} notification not delivered: ${errorText(error)}`,
|
|
88
89
|
});
|
|
89
90
|
})
|
|
90
91
|
.finally(() => {
|
|
@@ -123,7 +124,7 @@ export function createRunNotifier(deps) {
|
|
|
123
124
|
catch (error) {
|
|
124
125
|
deps.log.write("warn", "notification.failed", {
|
|
125
126
|
projectId: event.projectId,
|
|
126
|
-
detail: `notification skipped: ${
|
|
127
|
+
detail: `notification skipped: ${errorText(error)}`,
|
|
127
128
|
});
|
|
128
129
|
}
|
|
129
130
|
},
|
|
@@ -138,7 +139,7 @@ export function createRunNotifier(deps) {
|
|
|
138
139
|
}
|
|
139
140
|
catch (error) {
|
|
140
141
|
deps.log.write("warn", "notification.failed", {
|
|
141
|
-
detail: `topics notification skipped: ${
|
|
142
|
+
detail: `topics notification skipped: ${errorText(error)}`,
|
|
142
143
|
});
|
|
143
144
|
}
|
|
144
145
|
},
|
|
@@ -29,6 +29,7 @@ const reviewItemNames = {
|
|
|
29
29
|
narration: "the narration",
|
|
30
30
|
thumbnail: "the thumbnail",
|
|
31
31
|
shorts: "a short",
|
|
32
|
+
promise: "the article's opening (promise check)",
|
|
32
33
|
};
|
|
33
34
|
export function reviewNoticeText(subject) {
|
|
34
35
|
const title = subject.title.trim() === "" ? "Untitled project" : subject.title.trim();
|
|
@@ -48,6 +49,8 @@ export function reviewItemName(itemKey, imageOrder) {
|
|
|
48
49
|
return "the article";
|
|
49
50
|
if (itemKey === "narration")
|
|
50
51
|
return "the narration";
|
|
52
|
+
if (itemKey === "promise")
|
|
53
|
+
return "the article's opening (promise check)";
|
|
51
54
|
if (itemKey === "thumbnail:image")
|
|
52
55
|
return "the thumbnail";
|
|
53
56
|
const variant = /^thumbnail:image:(\d+)$/.exec(itemKey);
|
|
@@ -139,8 +142,8 @@ export function shortReason(reason) {
|
|
|
139
142
|
}
|
|
140
143
|
export function noticeText(kind, subject) {
|
|
141
144
|
const text = runNoticeText(kind, subject);
|
|
142
|
-
return subject.startedBy === "agent"
|
|
143
|
-
? { ...text, headline: `${text.headline} · started by
|
|
145
|
+
return subject.startedBy === "agent" || subject.startedBy === "assistant"
|
|
146
|
+
? { ...text, headline: `${text.headline} · started by ${subject.startedBy}` }
|
|
144
147
|
: text;
|
|
145
148
|
}
|
|
146
149
|
function runNoticeText(kind, subject) {
|
|
@@ -1,19 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { deleteSetting, readJsonSetting, writeSetting } from "../settings/repo.js";
|
|
2
3
|
import { notificationUrlProblem } from "./address.js";
|
|
3
4
|
// Its own row in the key/value `settings` table. Backups leave it out
|
|
4
5
|
// (`slices/storage/portable.ts`): an ntfy topic in the URL is as good as a password.
|
|
5
6
|
export const notificationUrlKey = "notificationUrl";
|
|
6
7
|
export function readNotificationUrl(db) {
|
|
7
|
-
const
|
|
8
|
-
if (stored === undefined)
|
|
9
|
-
return null;
|
|
10
|
-
let value;
|
|
11
|
-
try {
|
|
12
|
-
value = JSON.parse(stored);
|
|
13
|
-
}
|
|
14
|
-
catch {
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
8
|
+
const value = readJsonSetting(db, notificationUrlKey, z.unknown(), null);
|
|
17
9
|
// A hand-edited row that no longer passes the rules is treated as not set rather than
|
|
18
10
|
// POSTed to.
|
|
19
11
|
return typeof value === "string" && value !== "" && notificationUrlProblem(value) === undefined
|
|
@@ -26,7 +18,7 @@ export function saveNotificationUrl(db, raw) {
|
|
|
26
18
|
return { ok: false, message: problem };
|
|
27
19
|
const url = raw.trim();
|
|
28
20
|
if (url === "") {
|
|
29
|
-
db
|
|
21
|
+
deleteSetting(db, notificationUrlKey);
|
|
30
22
|
return { ok: true, url: null };
|
|
31
23
|
}
|
|
32
24
|
writeSetting(db, notificationUrlKey, JSON.stringify(url));
|
|
@@ -3,17 +3,18 @@ import { projectById, stagesOf } from "../admission/repo.js";
|
|
|
3
3
|
import { stepFailedWhileWaiting } from "../admission/state-words.js";
|
|
4
4
|
import { lastStarter } from "../agents/repo.js";
|
|
5
5
|
import { projectHolds } from "../reviews/holds.js";
|
|
6
|
-
import {
|
|
6
|
+
import { isTemplateSample } from "../template-studio/repo.js";
|
|
7
|
+
import { settledProjects } from "../uploads/repo.js";
|
|
7
8
|
import { settledStatus } from "../uploads/rules.js";
|
|
8
9
|
import { atItsDay, failuresOf } from "./rules.js";
|
|
9
10
|
// What a notification says about a project, read at the moment it goes out, by the rule the
|
|
10
11
|
// Projects list reads it with (`edge/http/projects.ts`).
|
|
11
12
|
export function noticeSubject(db, projectId) {
|
|
12
13
|
const project = projectById(db, projectId);
|
|
13
|
-
if (project === undefined)
|
|
14
|
+
if (project === undefined || isTemplateSample(db, projectId))
|
|
14
15
|
return undefined;
|
|
15
16
|
const stages = stagesOf(db, projectId);
|
|
16
|
-
const settled =
|
|
17
|
+
const settled = settledProjects(db, projectId);
|
|
17
18
|
const holds = projectHolds(db, { projectId, standings: new Map([[projectId, stages]]), settled });
|
|
18
19
|
const status = settledStatus(derive(stages, project.paused), settled.has(projectId));
|
|
19
20
|
const failures = failuresOf(stages);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { copyFileSync, lstatSync, mkdirSync, readdirSync, rmSync } from "node:fs";
|
|
2
2
|
import { dirname, join, relative, sep } from "node:path";
|
|
3
3
|
import { transact } from "../../kernel/db/tx.js";
|
|
4
|
+
import { internalError } from "../../kernel/errors.js";
|
|
4
5
|
import { executionPlan } from "../rebuild/runtime-plan.js";
|
|
5
6
|
import { currentRevisionId } from "../revisions/repo.js";
|
|
6
7
|
import { getRevisionView } from "../revisions/view.js";
|
|
@@ -11,7 +12,7 @@ import { projectDir } from "../storage/layout.js";
|
|
|
11
12
|
// ceiling: one pass per layer of the step graph (text, narration, timing, picks, prompts,
|
|
12
13
|
// images, renders); far more than any plan has.
|
|
13
14
|
const rebindPasses = 40;
|
|
14
|
-
export function copyProject(deps, sourceId, title) {
|
|
15
|
+
export function copyProject(deps, sourceId, title, { renamed = false } = {}) {
|
|
15
16
|
const source = projectDir(deps.paths, sourceId);
|
|
16
17
|
const tables = projectTables.map((table) => [table, projectRows(deps.db, table, sourceId)]);
|
|
17
18
|
const ids = new Map([[sourceId, deps.ids.next()]]);
|
|
@@ -33,6 +34,9 @@ export function copyProject(deps, sourceId, title) {
|
|
|
33
34
|
const projectId = ids.get(sourceId) ?? sourceId;
|
|
34
35
|
const target = projectDir(deps.paths, projectId);
|
|
35
36
|
const at = deps.clock.now().toISOString();
|
|
37
|
+
const named = (row) => renamed && typeof row.config === "string"
|
|
38
|
+
? { ...row, config: renameConfig(row.config, title) }
|
|
39
|
+
: row;
|
|
36
40
|
try {
|
|
37
41
|
for (const file of listFiles(source)) {
|
|
38
42
|
if (file === projectMarker)
|
|
@@ -51,7 +55,11 @@ export function copyProject(deps, sourceId, title) {
|
|
|
51
55
|
column,
|
|
52
56
|
typeof value === "string" ? remap(value) : value,
|
|
53
57
|
]));
|
|
54
|
-
insert(deps.db, table, table === "projects"
|
|
58
|
+
insert(deps.db, table, table === "projects"
|
|
59
|
+
? { ...named(copied), title, created_at: at, updated_at: at }
|
|
60
|
+
: table === "project_revisions"
|
|
61
|
+
? named(copied)
|
|
62
|
+
: copied);
|
|
55
63
|
}
|
|
56
64
|
rebind(deps, projectId);
|
|
57
65
|
});
|
|
@@ -62,6 +70,16 @@ export function copyProject(deps, sourceId, title) {
|
|
|
62
70
|
}
|
|
63
71
|
return { projectId };
|
|
64
72
|
}
|
|
73
|
+
// A stored config (JSON) under a new title, keeping what it was made about.
|
|
74
|
+
function renameConfig(config, title) {
|
|
75
|
+
const parsed = JSON.parse(config);
|
|
76
|
+
if (typeof parsed !== "object" || parsed === null || !("title" in parsed))
|
|
77
|
+
return config;
|
|
78
|
+
const before = parsed;
|
|
79
|
+
if (typeof before.title !== "string" || before.title === title)
|
|
80
|
+
return config;
|
|
81
|
+
return JSON.stringify({ ...before, title, subjectTitle: before.subjectTitle ?? before.title });
|
|
82
|
+
}
|
|
65
83
|
// Re-stamps the copy's finished steps with the fingerprints its own ids give them.
|
|
66
84
|
function rebind(deps, projectId) {
|
|
67
85
|
const revisionId = currentRevisionId(deps.db, projectId);
|
|
@@ -104,7 +122,7 @@ function rebind(deps, projectId) {
|
|
|
104
122
|
.prepare(`UPDATE ${table} SET ${column}=replace(${column},?,?) WHERE project_id=? AND instr(${column},?)>0`)
|
|
105
123
|
.run(before, after, projectId, before);
|
|
106
124
|
}
|
|
107
|
-
throw new Error("
|
|
125
|
+
throw new Error(internalError("the copy of the sample kept changing while its steps were matched up", "Delete the copy and try Make my own copy again"));
|
|
108
126
|
}
|
|
109
127
|
function requestOf(payload) {
|
|
110
128
|
try {
|
|
@@ -1,26 +1,35 @@
|
|
|
1
|
-
import { readinessIsUsable } from "../../kernel/ports/model.js";
|
|
2
1
|
import { templateById } from "../project-templates/repo.js";
|
|
3
|
-
import {
|
|
2
|
+
import { listVoices } from "../settings/repo.js";
|
|
3
|
+
import { notTemplateSample } from "../template-studio/repo.js";
|
|
4
|
+
import { starterPacks, starterSet } from "./packs.js";
|
|
5
|
+
import { shortReadiness } from "./quick-short.js";
|
|
4
6
|
import { sampleProjectIds } from "./sample.js";
|
|
5
7
|
import { firstRunDismissed, readPackRecords } from "./state.js";
|
|
6
8
|
// The first-run screen shows on a fresh install and never again once it is skipped or a real
|
|
7
|
-
// project (anything but the samples) exists. Reading it writes nothing: a real project that
|
|
9
|
+
// project (anything but the samples and the template studio's hidden projects) exists. Reading it writes nothing: a real project that
|
|
8
10
|
// exists before the screen was recorded as done is reported as `settle`, and the client
|
|
9
11
|
// records it with POST /dismiss, so deleting every project later does not bring it back.
|
|
10
|
-
export function firstRunView(db, statuses
|
|
12
|
+
export function firstRunView(db, statuses,
|
|
13
|
+
// How to install the computer's voice here, for the checklist's voice line.
|
|
14
|
+
install) {
|
|
11
15
|
const samples = sampleProjectIds(db);
|
|
12
16
|
const real = db
|
|
13
|
-
.prepare(
|
|
17
|
+
.prepare(`SELECT 1 FROM projects WHERE id IS NOT ? AND id IS NOT ? AND id IS NOT ? AND ${notTemplateSample()} LIMIT 1`)
|
|
14
18
|
.get(samples.library, samples.audiobook, samples.podcast) !== undefined;
|
|
15
19
|
const dismissed = firstRunDismissed(db);
|
|
16
20
|
const packs = readPackRecords(db);
|
|
17
21
|
return {
|
|
18
22
|
show: !real && !dismissed,
|
|
19
23
|
settle: real && !dismissed,
|
|
20
|
-
voice
|
|
24
|
+
// Every starter pack suggests the same voice, so the starter set's stands for all of them.
|
|
25
|
+
needs: shortReadiness({
|
|
26
|
+
statuses,
|
|
27
|
+
voices: listVoices(db),
|
|
28
|
+
suggested: starterSet.voice,
|
|
29
|
+
install,
|
|
30
|
+
}),
|
|
21
31
|
sampleProjectId: samples.library,
|
|
22
32
|
samples,
|
|
23
|
-
clis: detectedClis(statuses),
|
|
24
33
|
// A pack counts as added only with its template: the first short adds a pack's prompts and
|
|
25
34
|
// voice but no template, and Add pack must still be able to add that template later (or
|
|
26
35
|
// again, after it was deleted).
|
|
@@ -37,36 +46,3 @@ export function firstRunView(db, statuses) {
|
|
|
37
46
|
}),
|
|
38
47
|
};
|
|
39
48
|
}
|
|
40
|
-
// Who would narrate a first short: a keyed voice provider when one has a key, else the
|
|
41
|
-
// computer's own voice when a speech program was found.
|
|
42
|
-
export function firstVoice(statuses) {
|
|
43
|
-
const keyed = statuses.find((row) => row.family === "tts" && row.readiness.kind === "keyed" && readinessIsUsable(row.readiness));
|
|
44
|
-
const system = statuses.find((row) => row.readiness.kind === "local")?.readiness;
|
|
45
|
-
const local = system?.kind === "local" ? system : undefined;
|
|
46
|
-
return {
|
|
47
|
-
keyed: keyed?.displayName ?? null,
|
|
48
|
-
system: {
|
|
49
|
-
available: local?.available === true,
|
|
50
|
-
engine: local?.engine ?? null,
|
|
51
|
-
issue: local?.issue ?? null,
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
// What this machine can make without a key: each agent CLI Slopify found, and whether it
|
|
56
|
-
// answers (installed, a supported version, signed in as far as the probe can tell).
|
|
57
|
-
export function detectedClis(statuses) {
|
|
58
|
-
return ["claude-code", "codex", "gemini"].map((id) => {
|
|
59
|
-
const status = statuses.find((row) => row.id === id);
|
|
60
|
-
const readiness = status?.readiness;
|
|
61
|
-
const cli = readiness?.kind === "cli" ? readiness : undefined;
|
|
62
|
-
return {
|
|
63
|
-
id,
|
|
64
|
-
name: status?.displayName ?? id,
|
|
65
|
-
installed: cli?.installed === true,
|
|
66
|
-
ready: cli?.installed === true && cli.issue === undefined,
|
|
67
|
-
version: cli?.version ?? null,
|
|
68
|
-
issue: cli?.issue ?? null,
|
|
69
|
-
draws: id === "codex",
|
|
70
|
-
};
|
|
71
|
-
});
|
|
72
|
-
}
|
|
@@ -26,7 +26,7 @@ export function fullVideoDraft(deps, input) {
|
|
|
26
26
|
const config = project.config;
|
|
27
27
|
if (!usesShortMode(config))
|
|
28
28
|
return { ok: false, reason: "not-short" };
|
|
29
|
-
const topic = config.values.topic?.trim() || project.title;
|
|
29
|
+
const topic = config.values.Topic?.trim() || config.values.topic?.trim() || project.title;
|
|
30
30
|
const pack = shortPack(deps, config.articlePrompt ?? "");
|
|
31
31
|
const document = packDocument(deps, pack);
|
|
32
32
|
if (document === undefined)
|
|
@@ -46,7 +46,8 @@ export function fullVideoDraft(deps, input) {
|
|
|
46
46
|
form: {
|
|
47
47
|
...form,
|
|
48
48
|
title: project.title,
|
|
49
|
-
|
|
49
|
+
// {{Topic}} since 4.0; a pack installed before asks for {{topic}}.
|
|
50
|
+
values: { ...form.values, Topic: topic, topic },
|
|
50
51
|
llm: provider(config.llm, form.llm),
|
|
51
52
|
images: provider(config.images, form.images),
|
|
52
53
|
audio: config.audio === undefined
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { transact } from "../../kernel/db/tx.js";
|
|
2
|
+
import { internalError } from "../../kernel/errors.js";
|
|
2
3
|
import { detectSlots } from "../admission/substitute.js";
|
|
3
4
|
import { nameMax } from "../library/model.js";
|
|
4
5
|
import { insertPrompt, promptById, promptByName } from "../library/repo.js";
|
|
5
6
|
import { templateById, templateSummaries } from "../project-templates/repo.js";
|
|
6
7
|
import { createTemplate } from "../project-templates/service.js";
|
|
8
|
+
import { readProviderDefaults } from "../settings/first-run.js";
|
|
7
9
|
import { insertVoice, listVoices } from "../settings/repo.js";
|
|
8
10
|
import { packById } from "./packs.js";
|
|
9
11
|
import { readPackRecords, writePackRecord } from "./state.js";
|
|
@@ -45,10 +47,10 @@ export function installPack(deps, packId, options = { template: true }) {
|
|
|
45
47
|
const created = createTemplate(deps, {
|
|
46
48
|
id,
|
|
47
49
|
name: freeTemplateName(deps, `${pack.name} starter`),
|
|
48
|
-
document: packTemplate(pack, names, voice.voiceId),
|
|
50
|
+
document: packTemplate(pack, names, voice.voiceId, readProviderDefaults(deps.db)),
|
|
49
51
|
});
|
|
50
52
|
if (!created.ok)
|
|
51
|
-
throw new Error(`
|
|
53
|
+
throw new Error(internalError(`the ${pack.name} pack's template was refused: ${created.reason}`));
|
|
52
54
|
template = id;
|
|
53
55
|
added = true;
|
|
54
56
|
}
|
|
@@ -71,7 +73,7 @@ export function installPack(deps, packId, options = { template: true }) {
|
|
|
71
73
|
};
|
|
72
74
|
});
|
|
73
75
|
}
|
|
74
|
-
function placePrompt(deps, kind, name, body, at) {
|
|
76
|
+
export function placePrompt(deps, kind, name, body, at) {
|
|
75
77
|
for (let n = 1;; n += 1) {
|
|
76
78
|
const suffix = n === 1 ? "" : ` (${String(n)})`;
|
|
77
79
|
const candidate = `${name.slice(0, nameMax - suffix.length).trimEnd()}${suffix}`;
|
|
@@ -109,7 +111,7 @@ function placeVoice(deps, pack, before) {
|
|
|
109
111
|
});
|
|
110
112
|
return { id, voiceId: pack.voice.voiceId, added: true };
|
|
111
113
|
}
|
|
112
|
-
function freeTemplateName(deps, name) {
|
|
114
|
+
export function freeTemplateName(deps, name) {
|
|
113
115
|
const taken = new Set(templateSummaries(deps.db).map((row) => row.name.toLowerCase()));
|
|
114
116
|
for (let n = 1;; n += 1) {
|
|
115
117
|
const candidate = n === 1 ? name : `${name} (${String(n)})`;
|
|
@@ -10,6 +10,25 @@ export const sampleProjectsSchema = z.object({
|
|
|
10
10
|
audiobook: z.string().nullable(),
|
|
11
11
|
podcast: z.string().nullable(),
|
|
12
12
|
});
|
|
13
|
+
// What a 60-second short needs that nothing on this computer does yet, with what fixes it. The
|
|
14
|
+
// first-run checklist and the refusal of "Make a 60-second short" say the same gaps.
|
|
15
|
+
export const shortGapSchema = z.object({
|
|
16
|
+
need: z.enum(["text", "voice", "images"]),
|
|
17
|
+
// What is missing and what fixes it, in a sentence or two.
|
|
18
|
+
message: z.string(),
|
|
19
|
+
// A key for that part, or (the voice) a voice saved for the voice service that has a key.
|
|
20
|
+
fix: z.enum(["key", "saved-voice"]),
|
|
21
|
+
// The voice only: how to install the computer's own free voice from a terminal, where that
|
|
22
|
+
// can be done.
|
|
23
|
+
install: z.object({ text: z.string(), commands: z.array(z.string()) }).optional(),
|
|
24
|
+
});
|
|
25
|
+
// Who does one part of a first short, by name ("Claude Code CLI", "OpenAI", "eSpeak NG"), and
|
|
26
|
+
// how: with the person's own sign-in to a tool on this computer, a saved key, or (the voice)
|
|
27
|
+
// the computer's own speech. Null while nothing can.
|
|
28
|
+
const shortPartSchema = z.object({
|
|
29
|
+
by: z.string().nullable(),
|
|
30
|
+
how: z.enum(["sign-in", "key", "computer"]).nullable(),
|
|
31
|
+
});
|
|
13
32
|
export const firstRunViewSchema = z
|
|
14
33
|
.object({
|
|
15
34
|
show: z.boolean(),
|
|
@@ -17,31 +36,17 @@ export const firstRunViewSchema = z
|
|
|
17
36
|
// with POST /dismiss, so deleting every project later does not bring the screen back.
|
|
18
37
|
// Reading this view writes nothing.
|
|
19
38
|
settle: z.boolean(),
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
engine: z.string().nullable(),
|
|
28
|
-
// Why none can be used, with the fix.
|
|
29
|
-
issue: z.string().nullable(),
|
|
30
|
-
}),
|
|
39
|
+
// The three things a short needs (the script, a voice and the images), each with who would
|
|
40
|
+
// do it, and the gaps, as "Make a 60-second short" would refuse them.
|
|
41
|
+
needs: z.object({
|
|
42
|
+
text: shortPartSchema,
|
|
43
|
+
voice: shortPartSchema,
|
|
44
|
+
images: shortPartSchema,
|
|
45
|
+
gaps: z.array(shortGapSchema),
|
|
31
46
|
}),
|
|
32
47
|
// The Library of Alexandria's project, as before the demos; `samples` has all three.
|
|
33
48
|
sampleProjectId: z.string().nullable(),
|
|
34
49
|
samples: sampleProjectsSchema,
|
|
35
|
-
clis: z.array(z.object({
|
|
36
|
-
id: z.enum(["claude-code", "codex", "gemini"]),
|
|
37
|
-
name: z.string(),
|
|
38
|
-
installed: z.boolean(),
|
|
39
|
-
ready: z.boolean(),
|
|
40
|
-
version: z.string().nullable(),
|
|
41
|
-
issue: z.string().nullable(),
|
|
42
|
-
// Codex draws the images too.
|
|
43
|
-
draws: z.boolean(),
|
|
44
|
-
})),
|
|
45
50
|
packs: z.array(z.object({
|
|
46
51
|
id: z.string(),
|
|
47
52
|
name: z.string(),
|
|
@@ -63,22 +68,6 @@ export const quickShortInputSchema = z
|
|
|
63
68
|
export const fullVideoInputSchema = z
|
|
64
69
|
.object({ projectId: z.string().min(1).max(64), draftId: z.uuid() })
|
|
65
70
|
.strict();
|
|
66
|
-
export const quickShortResultSchema = z.object({
|
|
67
|
-
projectId: z.string(),
|
|
68
|
-
replayed: z.boolean(),
|
|
69
|
-
});
|
|
70
|
-
export const installedPackSchema = z.object({
|
|
71
|
-
packId: z.string(),
|
|
72
|
-
added: z.boolean(),
|
|
73
|
-
prompts: z.record(z.string(), z.string()),
|
|
74
|
-
templateId: z.string().nullable(),
|
|
75
|
-
voice: z.string().nullable(),
|
|
76
|
-
});
|
|
77
|
-
export const sampleCopySchema = z.object({ projectId: z.string() });
|
|
78
|
-
export const sampleStateSchema = z.object({
|
|
79
|
-
projectId: z.string().nullable(),
|
|
80
|
-
samples: sampleProjectsSchema,
|
|
81
|
-
});
|
|
82
71
|
// Make my own copy of one sample; without a project, the Library of Alexandria.
|
|
83
72
|
export const sampleCopyInputSchema = z
|
|
84
73
|
.object({ projectId: z.string().max(60).optional() })
|