@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
|
@@ -6,14 +6,8 @@ import { documentThemeLabels, documentThemes } from "../../slices/document/model
|
|
|
6
6
|
import { renderSampleDocument } from "../../slices/document/sample.js";
|
|
7
7
|
import { builtInTheme, resolveTheme } from "../../slices/document/theme.js";
|
|
8
8
|
import { documentThemeSchema } from "../../slices/document/theme-schema.js";
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
id: z
|
|
12
|
-
.string()
|
|
13
|
-
.min(1)
|
|
14
|
-
.max(64)
|
|
15
|
-
.regex(/^[0-9A-Za-z_-]+$/),
|
|
16
|
-
});
|
|
9
|
+
import { idParam } from "./ids.js";
|
|
10
|
+
import { onInvalid, problem } from "./problem.js";
|
|
17
11
|
// Shape only: the values' ranges are the slice's, so the editor gets field-by-field sentences.
|
|
18
12
|
const themeBody = z.object({ name: z.string(), values: z.unknown() });
|
|
19
13
|
// Library → Documents. The return type is inferred so Hono keeps the route types the SPA's
|
|
@@ -57,15 +51,13 @@ function refused(c, failure) {
|
|
|
57
51
|
case "invalid":
|
|
58
52
|
return problem(c, {
|
|
59
53
|
status: 400,
|
|
60
|
-
|
|
61
|
-
detail: "This theme can't be saved yet. Fix the highlighted settings and try again.",
|
|
54
|
+
detail: "This look can't be saved yet. Fix the highlighted settings and try again.",
|
|
62
55
|
extensions: { fields: failure.fields },
|
|
63
56
|
});
|
|
64
57
|
case "duplicate-name": {
|
|
65
|
-
const message = "Another PDF
|
|
58
|
+
const message = "Another PDF look already has this name. Choose a different name.";
|
|
66
59
|
return problem(c, {
|
|
67
60
|
status: 409,
|
|
68
|
-
title: titleOf(409),
|
|
69
61
|
detail: message,
|
|
70
62
|
extensions: { fields: [{ field: "name", message }] },
|
|
71
63
|
});
|
|
@@ -73,8 +65,7 @@ function refused(c, failure) {
|
|
|
73
65
|
case "not-found":
|
|
74
66
|
return problem(c, {
|
|
75
67
|
status: 404,
|
|
76
|
-
|
|
77
|
-
detail: "This PDF theme no longer exists; it may have been deleted in another tab. Go back to Library → PDF themes.",
|
|
68
|
+
detail: "This PDF look no longer exists; it may have been deleted in another tab. Go back to the PDF looks (Settings → Production defaults → Edit PDF looks).",
|
|
78
69
|
});
|
|
79
70
|
}
|
|
80
71
|
}
|
|
@@ -10,7 +10,7 @@ import { stagedFileById } from "../../slices/storage/repo.js";
|
|
|
10
10
|
import { fileResponse } from "./byte-range.js";
|
|
11
11
|
import { draftProblem } from "./draft-problem.js";
|
|
12
12
|
import { readMultipart } from "./multipart.js";
|
|
13
|
-
import { onInvalid, problem
|
|
13
|
+
import { onInvalid, problem } from "./problem.js";
|
|
14
14
|
const params = z.object({ id: z.uuid(), attachmentId: z.uuid() });
|
|
15
15
|
const imageTypes = {
|
|
16
16
|
".png": "image/png",
|
|
@@ -30,7 +30,6 @@ export function draftFileRoutes(service) {
|
|
|
30
30
|
if (result === undefined)
|
|
31
31
|
return problem(c, {
|
|
32
32
|
status: 400,
|
|
33
|
-
title: titleOf(400),
|
|
34
33
|
detail: "No file arrived with the upload. Choose the file again and retry.",
|
|
35
34
|
});
|
|
36
35
|
return result.ok
|
|
@@ -55,7 +54,6 @@ export function draftFileRoutes(service) {
|
|
|
55
54
|
contentType === undefined)
|
|
56
55
|
return problem(c, {
|
|
57
56
|
status: 404,
|
|
58
|
-
title: titleOf(404),
|
|
59
57
|
detail: "This attached file has not finished uploading, so it cannot be previewed yet. Wait a moment or attach it again.",
|
|
60
58
|
});
|
|
61
59
|
return fileResponse(c, stagingPath(deps.paths, staged.path), staged.bytes, {
|
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { refusal } from "./refusal.js";
|
|
2
2
|
export function draftProblem(c, result) {
|
|
3
|
-
const status = result.reason === "not-found"
|
|
4
|
-
? 404
|
|
5
|
-
: ["invalid-edit", "readiness"].includes(result.reason)
|
|
6
|
-
? 400
|
|
7
|
-
: 409;
|
|
8
3
|
const { ok: _ok, ...extensions } = result;
|
|
9
4
|
const details = {
|
|
10
5
|
"not-found": "This draft no longer exists; it may have been started or deleted. Reload the page to start a new one.",
|
|
11
|
-
"invalid-draft": "This saved draft could not be read. Reload the page and set the video up again
|
|
6
|
+
"invalid-draft": "This saved draft could not be read. Reload the page and set the video up again on Create.",
|
|
12
7
|
conflict: "This draft changed in another tab or window. Reload the page to see the latest, then make your change again.",
|
|
13
8
|
"invalid-edit": "Some settings need fixing. Fix the highlighted fields, then try again.",
|
|
14
9
|
"pending-start": "This video is already starting. Wait a moment, then find it in Projects.",
|
|
@@ -16,9 +11,9 @@ export function draftProblem(c, result) {
|
|
|
16
11
|
"stale-review": "Something changed since you reviewed this video, such as a setting or a price. Choose Review and start again to see the latest.",
|
|
17
12
|
readiness: "Slopify is not ready to start this video yet. Fix the highlighted problems, then try again.",
|
|
18
13
|
};
|
|
19
|
-
return
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
return refusal(c, result.reason, {
|
|
15
|
+
statuses: { "not-found": 404, "invalid-edit": 400, readiness: 400 },
|
|
16
|
+
otherwise: 409,
|
|
22
17
|
detail: details[result.reason],
|
|
23
18
|
extensions,
|
|
24
19
|
});
|
package/dist/edge/http/drafts.js
CHANGED
|
@@ -11,9 +11,9 @@ import { draftFileRoutes } from "./draft-files.js";
|
|
|
11
11
|
import { draftProblem } from "./draft-problem.js";
|
|
12
12
|
import { onInvalid } from "./problem.js";
|
|
13
13
|
const idParam = z.object({ id: z.uuid() });
|
|
14
|
-
const versionBody = discardDraftInputSchema.unwrap().omit({ id: true });
|
|
15
|
-
const saveBody = saveDraftInputSchema.unwrap().omit({ id: true });
|
|
16
|
-
const startBody = versionBody.extend({ reviewId: z.uuid() }).strict();
|
|
14
|
+
export const versionBody = discardDraftInputSchema.unwrap().omit({ id: true });
|
|
15
|
+
export const saveBody = saveDraftInputSchema.unwrap().omit({ id: true });
|
|
16
|
+
export const startBody = versionBody.extend({ reviewId: z.uuid() }).strict();
|
|
17
17
|
const summariesSchema = z
|
|
18
18
|
.object({
|
|
19
19
|
drafts: z.array(z
|
|
@@ -7,30 +7,27 @@ import { formerNames } from "../../slices/library/rename.js";
|
|
|
7
7
|
import { entryById, listEntries } from "../../slices/library/repo.js";
|
|
8
8
|
import { createEntry, removeEntry, restoreEntry, updateEntry } from "../../slices/library/save.js";
|
|
9
9
|
import { usedBy } from "../../slices/library/used-by.js";
|
|
10
|
+
import { idParam } from "./ids.js";
|
|
10
11
|
import { onInvalid } from "./problem.js";
|
|
11
12
|
// One rule set for prompts and entries, so one refusal mapping too.
|
|
12
13
|
import { refused, versionParam } from "./prompts.js";
|
|
13
|
-
const idParam = z.object({
|
|
14
|
-
id: z
|
|
15
|
-
.string()
|
|
16
|
-
.min(1)
|
|
17
|
-
.max(64)
|
|
18
|
-
.regex(/^[0-9A-Za-z_-]+$/),
|
|
19
|
-
});
|
|
20
14
|
const entryBody = z.object({
|
|
21
15
|
category: z.enum(entryCategories),
|
|
22
16
|
mode: z.enum(entryModes),
|
|
23
17
|
name: z.string(),
|
|
24
18
|
body: z.string(),
|
|
25
19
|
});
|
|
20
|
+
// Duplicate names the entry it copies, whose old keyword names the copy may keep.
|
|
21
|
+
const entryCreateBody = entryBody.extend({ copyOf: z.string().min(1).max(100).optional() });
|
|
26
22
|
// The return type is inferred so Hono keeps the route types the SPA's client is
|
|
27
23
|
// generated from; see stagingRoutes.
|
|
28
24
|
export function entryRoutes(deps) {
|
|
29
25
|
const library = { db: deps.db, ids: deps.ids, clock: deps.clock };
|
|
30
26
|
return new Hono()
|
|
31
27
|
.get("/", (c) => c.json({ entries: listEntries(deps.db) }))
|
|
32
|
-
.post("/", zValidator("json",
|
|
33
|
-
const
|
|
28
|
+
.post("/", zValidator("json", entryCreateBody, onInvalid), (c) => {
|
|
29
|
+
const { copyOf, ...draft } = c.req.valid("json");
|
|
30
|
+
const result = createEntry(library, draft, copyOf);
|
|
34
31
|
return result.ok ? c.json(result.value, 201) : refused(c, result, "entry");
|
|
35
32
|
})
|
|
36
33
|
.put("/:id", zValidator("param", idParam, onInvalid), zValidator("json", entryBody, onInvalid), (c) => {
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { bearerToken, isExtensionOrigin, studioPairing, studioRequestAllowed, } from "../../slices/studio/settings.js";
|
|
2
|
+
import { problem } from "./problem.js";
|
|
3
|
+
// The paired Slopify Studio extension's access to the `/ext` routes: every request carries the
|
|
4
|
+
// pairing token, and the CORS headers name the paired extension's origin, never a web page's
|
|
5
|
+
// and never `*`.
|
|
6
|
+
export function extensionAuth(db) {
|
|
7
|
+
const allowOrigin = (c, pairing) => {
|
|
8
|
+
const origin = c.req.header("origin");
|
|
9
|
+
const paired = studioPairing(db).origin;
|
|
10
|
+
c.header("Vary", "Origin");
|
|
11
|
+
if (!isExtensionOrigin(origin))
|
|
12
|
+
return;
|
|
13
|
+
if (origin === paired || pairing) {
|
|
14
|
+
c.header("Access-Control-Allow-Origin", origin);
|
|
15
|
+
c.header("Access-Control-Allow-Headers", "authorization, content-type");
|
|
16
|
+
c.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
17
|
+
c.header("Access-Control-Max-Age", "600");
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const allowed = (c) => studioRequestAllowed(db, bearerToken(c.req.header("authorization")), c.req.header("origin"));
|
|
21
|
+
const refused = (c) => problem(c, {
|
|
22
|
+
status: 401,
|
|
23
|
+
title: "Unauthorized",
|
|
24
|
+
detail: "The Slopify Studio extension isn't paired with this Slopify. Copy the pairing token from Slopify's Settings → YouTube Studio and posting into the extension's options and press Pair.",
|
|
25
|
+
});
|
|
26
|
+
return { allowOrigin, allowed, refused };
|
|
27
|
+
}
|
|
@@ -7,12 +7,9 @@ import { closedReviewSentences } from "../../slices/reviews/external-model.js";
|
|
|
7
7
|
import { answerExternalReview } from "../../slices/reviews/external-repo.js";
|
|
8
8
|
import { verdictAnswerSchema, verdictIssue } from "../../slices/reviews/verdict.js";
|
|
9
9
|
import { actorOf } from "./actor.js";
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
.min(1)
|
|
14
|
-
.max(64)
|
|
15
|
-
.regex(/^[0-9A-Za-z_-]+$/);
|
|
10
|
+
import { idString } from "./ids.js";
|
|
11
|
+
import { onInvalid, problem, problemFromError } from "./problem.js";
|
|
12
|
+
const id = idString;
|
|
16
13
|
const reviewParam = z.object({ id, reviewId: id });
|
|
17
14
|
// A verdict that wasn't saved, what was wrong with it, and the tool and body to send instead.
|
|
18
15
|
// Said before the review is looked up, so it claims nothing about the review: a fixed verdict
|
|
@@ -20,7 +17,6 @@ const reviewParam = z.object({ id, reviewId: id });
|
|
|
20
17
|
function notSaved(c, why) {
|
|
21
18
|
return problem(c, {
|
|
22
19
|
status: 400,
|
|
23
|
-
title: titleOf(400),
|
|
24
20
|
detail: `The verdict wasn't saved${why}. Call submit_review_verdict again with body {verdict: "pass" | "fail", reasons: ["one short sentence per problem"]} and that fixed; a pass may send reasons: [].`,
|
|
25
21
|
extensions: { reason: "invalid-verdict" },
|
|
26
22
|
});
|
|
@@ -30,7 +26,6 @@ function notSaved(c, why) {
|
|
|
30
26
|
function noVerdict(c) {
|
|
31
27
|
return problem(c, {
|
|
32
28
|
status: 400,
|
|
33
|
-
title: titleOf(400),
|
|
34
29
|
detail: 'The verdict wasn\'t saved: no verdict came with it. Call submit_review_verdict again with body {verdict: "pass" | "fail", reasons: ["one short sentence per problem"]}; a pass may send reasons: [].',
|
|
35
30
|
extensions: { reason: "invalid-verdict" },
|
|
36
31
|
});
|
|
@@ -59,24 +54,30 @@ export function externalReviewRoutes(deps) {
|
|
|
59
54
|
.post("/:id/external-reviews/:reviewId/verdict", zValidator("param", reviewParam, onInvalid), zValidator("json", verdictAnswerSchema, verdictRefused), async (c) => {
|
|
60
55
|
const { id: projectId, reviewId } = c.req.valid("param");
|
|
61
56
|
const answer = c.req.valid("json");
|
|
57
|
+
const by = actorOf(c);
|
|
58
|
+
// The in-app assistant has no review tool; this holds even if one were called.
|
|
59
|
+
if (by === "assistant")
|
|
60
|
+
return problem(c, {
|
|
61
|
+
status: 403,
|
|
62
|
+
detail: "The assistant can't answer this review: it waits for the agent you connected in Settings → Connections → Agents (MCP). Answer it from that agent, or it passes on its own 2 hours after it began waiting.",
|
|
63
|
+
extensions: { reason: "assistant" },
|
|
64
|
+
});
|
|
62
65
|
const result = answerExternalReview(deps.db, {
|
|
63
66
|
projectId,
|
|
64
67
|
id: reviewId,
|
|
65
68
|
verdict: { passed: answer.verdict === "pass", reasons: answer.reasons },
|
|
66
|
-
by
|
|
69
|
+
by,
|
|
67
70
|
at: deps.clock.now().toISOString(),
|
|
68
71
|
});
|
|
69
72
|
if (!result.ok)
|
|
70
73
|
return result.reason === "not-found"
|
|
71
74
|
? problem(c, {
|
|
72
75
|
status: 404,
|
|
73
|
-
title: titleOf(404),
|
|
74
76
|
detail: "This review doesn't exist: the project may have been deleted. Call needs_attention to see what is waiting now.",
|
|
75
77
|
extensions: { reason: "not-found" },
|
|
76
78
|
})
|
|
77
79
|
: problem(c, {
|
|
78
80
|
status: 409,
|
|
79
|
-
title: titleOf(409),
|
|
80
81
|
detail: `The verdict wasn't saved. ${closedReviewSentences[result.reason]}`,
|
|
81
82
|
extensions: { reason: result.reason },
|
|
82
83
|
});
|
package/dist/edge/http/files.js
CHANGED
|
@@ -3,19 +3,13 @@ import { Hono } from "hono";
|
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { findDownload, imagesZip } from "../../slices/storage/downloads.js";
|
|
5
5
|
import { fileResponse } from "./byte-range.js";
|
|
6
|
-
import {
|
|
6
|
+
import { projectIdParam } from "./ids.js";
|
|
7
|
+
import { onInvalid, problem } from "./problem.js";
|
|
7
8
|
import { waveformAnswer } from "./waveform.js";
|
|
8
|
-
const
|
|
9
|
-
projectId: z
|
|
10
|
-
.string()
|
|
11
|
-
.min(1)
|
|
12
|
-
.max(64)
|
|
13
|
-
.regex(/^[0-9A-Za-z_-]+$/),
|
|
14
|
-
});
|
|
15
|
-
const setParam = projectParam.extend({
|
|
9
|
+
const setParam = projectIdParam.extend({
|
|
16
10
|
set: z.enum(["images.zip", "thumbnails.zip", "shorts.zip"]),
|
|
17
11
|
});
|
|
18
|
-
const assetParam =
|
|
12
|
+
const assetParam = projectIdParam.extend({
|
|
19
13
|
asset: z
|
|
20
14
|
.string()
|
|
21
15
|
.min(1)
|
|
@@ -79,5 +73,5 @@ function missing(c, reason) {
|
|
|
79
73
|
"missing-file": "This file was deleted or moved from the project folder. Use More → make it again in its section on the project page to make it again.",
|
|
80
74
|
"no-images": "This project has no images or thumbnail yet. Wait for the Images step to finish, then try again.",
|
|
81
75
|
};
|
|
82
|
-
return problem(c, { status: 404,
|
|
76
|
+
return problem(c, { status: 404, detail: details[reason] });
|
|
83
77
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { lstat } from "node:fs/promises";
|
|
2
2
|
import { dirname, isAbsolute, join, relative, sep } from "node:path";
|
|
3
3
|
import { folderReplySchema } from "./folder-location-schema.js";
|
|
4
|
-
import { problem
|
|
4
|
+
import { problem } from "./problem.js";
|
|
5
5
|
export async function replyForFolder(c, deps, projectId, file) {
|
|
6
6
|
c.header("Cache-Control", "no-store");
|
|
7
7
|
if (deps.folderLocation?.container) {
|
|
@@ -9,7 +9,6 @@ export async function replyForFolder(c, deps, projectId, file) {
|
|
|
9
9
|
if (!host)
|
|
10
10
|
return problem(c, {
|
|
11
11
|
status: 503,
|
|
12
|
-
title: titleOf(503),
|
|
13
12
|
detail: "Slopify cannot show where this file is on your computer because its Docker project folder was not set up. You can still use the download buttons, or run the Slopify Docker launcher again to set up the folder.",
|
|
14
13
|
});
|
|
15
14
|
try {
|
|
@@ -45,7 +44,6 @@ export async function replyForFolder(c, deps, projectId, file) {
|
|
|
45
44
|
});
|
|
46
45
|
return problem(c, {
|
|
47
46
|
status: 404,
|
|
48
|
-
title: titleOf(404),
|
|
49
47
|
detail: "This output's folder was deleted or moved. Use More → make it again in its section on the project page to make the file again.",
|
|
50
48
|
});
|
|
51
49
|
}
|
|
@@ -63,7 +61,6 @@ export async function replyForFolder(c, deps, projectId, file) {
|
|
|
63
61
|
});
|
|
64
62
|
return problem(c, {
|
|
65
63
|
status: 503,
|
|
66
|
-
title: titleOf(503),
|
|
67
64
|
detail: "Slopify could not open a file manager window on the computer it runs on. Make sure you are signed in to that computer's desktop, or use the download buttons instead.",
|
|
68
65
|
});
|
|
69
66
|
}
|
package/dist/edge/http/fonts.js
CHANGED
|
@@ -16,14 +16,12 @@ export function fontsRoutes(deps) {
|
|
|
16
16
|
if (contentType === undefined || !contentType.toLowerCase().startsWith("multipart/form-data"))
|
|
17
17
|
return problem(c, {
|
|
18
18
|
status: 415,
|
|
19
|
-
title: titleOf(415),
|
|
20
19
|
detail: "The font was not sent as a file. Reload the page and choose a .ttf or .otf file again.",
|
|
21
20
|
});
|
|
22
21
|
const body = c.req.raw.body;
|
|
23
22
|
if (body === null)
|
|
24
23
|
return problem(c, {
|
|
25
24
|
status: 400,
|
|
26
|
-
title: titleOf(400),
|
|
27
25
|
detail: "No font file arrived. Choose a .ttf or .otf file and try again.",
|
|
28
26
|
});
|
|
29
27
|
const part = await readUpload(contentType, body);
|
|
@@ -46,7 +44,6 @@ export function fontsRoutes(deps) {
|
|
|
46
44
|
if (!result.success)
|
|
47
45
|
return problem(c, {
|
|
48
46
|
status: 404,
|
|
49
|
-
title: titleOf(404),
|
|
50
47
|
detail: "This font no longer exists; it may have been deleted. Reload the page to see your current fonts.",
|
|
51
48
|
});
|
|
52
49
|
return undefined;
|
|
@@ -64,7 +61,6 @@ export function fontsRoutes(deps) {
|
|
|
64
61
|
throw error;
|
|
65
62
|
return problem(c, {
|
|
66
63
|
status: 404,
|
|
67
|
-
title: titleOf(404),
|
|
68
64
|
detail: "This font no longer exists; it may have been deleted. Reload the page to see your current fonts.",
|
|
69
65
|
});
|
|
70
66
|
}
|
|
@@ -140,19 +136,16 @@ function failure(reason) {
|
|
|
140
136
|
case "unsupported-format":
|
|
141
137
|
return {
|
|
142
138
|
status: 415,
|
|
143
|
-
title: titleOf(415),
|
|
144
139
|
detail: "Slopify only accepts .ttf or .otf font files. Choose a file with one of those endings.",
|
|
145
140
|
};
|
|
146
141
|
case "unsafe-filename":
|
|
147
142
|
return {
|
|
148
143
|
status: 400,
|
|
149
|
-
title: titleOf(400),
|
|
150
144
|
detail: "The font's file name contains characters Slopify cannot use. Rename the file on your computer, then upload it again.",
|
|
151
145
|
};
|
|
152
146
|
case "invalid-font":
|
|
153
147
|
return {
|
|
154
148
|
status: 400,
|
|
155
|
-
title: titleOf(400),
|
|
156
149
|
detail: "This file is not a valid TrueType (.ttf) or OpenType (.otf) font; it may be damaged. Download the font again or choose another.",
|
|
157
150
|
};
|
|
158
151
|
}
|
package/dist/edge/http/home.js
CHANGED
|
@@ -1,28 +1,57 @@
|
|
|
1
1
|
import { zValidator } from "@hono/zod-validator";
|
|
2
2
|
import { Hono } from "hono";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
+
import { transact } from "../../kernel/db/tx.js";
|
|
5
|
+
import { snoozeDays } from "../../slices/autopilot/model.js";
|
|
6
|
+
import { setWeeklyNotify, snoozeWarning, weeklyNotifyOf } from "../../slices/autopilot/repo.js";
|
|
7
|
+
import { autopilotView } from "../../slices/autopilot/signals.js";
|
|
4
8
|
import { weekSummary } from "../../slices/run-cost/week.js";
|
|
9
|
+
import { markNotUploaded } from "../../slices/studio/videos.js";
|
|
10
|
+
import { notReadySentence, runnableTemplate } from "../../slices/template-studio/schedule-gate.js";
|
|
5
11
|
import { markUploaded, setAside } from "../../slices/uploads/repo.js";
|
|
6
|
-
import {
|
|
12
|
+
import { idParam, idString } from "./ids.js";
|
|
13
|
+
import { onInvalid, problem } from "./problem.js";
|
|
7
14
|
const weekQuery = z.object({
|
|
8
15
|
since: z.iso.datetime({ offset: true }),
|
|
9
|
-
channelId:
|
|
16
|
+
channelId: idString.optional(),
|
|
10
17
|
});
|
|
11
18
|
// Home's "This week": videos made, spend and the API equivalent since `since` (the browser's
|
|
12
19
|
// own Monday), for one channel or all of them, and where each CLI plan's windows stand.
|
|
13
20
|
export function homeRoutes(deps) {
|
|
14
|
-
|
|
21
|
+
const catalogue = deps.catalogue;
|
|
22
|
+
return (new Hono()
|
|
23
|
+
.get("/week", zValidator("query", weekQuery, onInvalid), (c) => {
|
|
15
24
|
const { since, channelId } = c.req.valid("query");
|
|
16
25
|
return c.json(weekSummary(deps.db, new Date(since).toISOString(), channelId));
|
|
17
|
-
})
|
|
26
|
+
})
|
|
27
|
+
// How far ahead the content is and what may stop the schedules, from the database now
|
|
28
|
+
// and the hourly check's last answers: it never asks a CLI or waits for one.
|
|
29
|
+
.get("/autopilot", zValidator("query", channelQuery, onInvalid), (c) => c.json(autopilotView({
|
|
30
|
+
db: deps.db,
|
|
31
|
+
clock: deps.clock,
|
|
32
|
+
// What the schedules actually run (`template-studio/schedule-gate.ts`).
|
|
33
|
+
template: (id) => runnableTemplate(deps.db, id),
|
|
34
|
+
notReady: (id) => notReadySentence(deps.db, id),
|
|
35
|
+
...(catalogue === undefined ? {} : { catalogue: () => catalogue.read() }),
|
|
36
|
+
}, deps.autopilot?.latest(), c.req.valid("query").channelId)))
|
|
37
|
+
// Hide: the warning stays hidden for a week, or until it changes.
|
|
38
|
+
.post("/autopilot/snooze", zValidator("json", snoozeBody, onInvalid), (c) => {
|
|
39
|
+
const { key } = c.req.valid("json");
|
|
40
|
+
const until = new Date(deps.clock.now().valueOf() + snoozeDays * 24 * 60 * 60_000);
|
|
41
|
+
snoozeWarning(deps.db, key, until);
|
|
42
|
+
return c.json({ key, until: until.toISOString() });
|
|
43
|
+
})
|
|
44
|
+
// Settings → Notifications' Weekly report.
|
|
45
|
+
.get("/autopilot/weekly", (c) => c.json({ enabled: weeklyNotifyOf(deps.db) }))
|
|
46
|
+
.put("/autopilot/weekly", zValidator("json", weeklyBody, onInvalid), (c) => {
|
|
47
|
+
const { enabled } = c.req.valid("json");
|
|
48
|
+
setWeeklyNotify(deps.db, enabled);
|
|
49
|
+
return c.json({ enabled });
|
|
50
|
+
}));
|
|
18
51
|
}
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
.min(1)
|
|
23
|
-
.max(64)
|
|
24
|
-
.regex(/^[0-9A-Za-z_-]+$/),
|
|
25
|
-
});
|
|
52
|
+
const channelQuery = z.object({ channelId: idString.optional() });
|
|
53
|
+
const snoozeBody = z.object({ key: z.string().min(1).max(300) }).strict();
|
|
54
|
+
const weeklyBody = z.object({ enabled: z.boolean() }).strict();
|
|
26
55
|
// Home's "Mark uploaded" and its undo. Slopify never uploads, so this only records what the
|
|
27
56
|
// person says they did.
|
|
28
57
|
export function uploadedRoutes(deps) {
|
|
@@ -33,17 +62,21 @@ export function uploadedRoutes(deps) {
|
|
|
33
62
|
if (!result.ok)
|
|
34
63
|
return problem(c, {
|
|
35
64
|
status: 404,
|
|
36
|
-
title: titleOf(404),
|
|
37
65
|
detail: "This project no longer exists. Go back to Projects to pick another.",
|
|
38
66
|
});
|
|
39
67
|
return c.json({ setAside: c.req.valid("json").setAside });
|
|
40
68
|
})
|
|
41
69
|
.put("/:id/uploaded", zValidator("param", idParam, onInvalid), zValidator("json", z.object({ uploaded: z.boolean() }).strict(), onInvalid), (c) => {
|
|
42
|
-
const
|
|
70
|
+
const { id } = c.req.valid("param");
|
|
71
|
+
const at = deps.clock.now().toISOString();
|
|
72
|
+
// The long video's YouTube link and the mark are one fact (`studio/videos.ts`):
|
|
73
|
+
// Mark not uploaded forgets the link too.
|
|
74
|
+
const result = c.req.valid("json").uploaded
|
|
75
|
+
? markUploaded(deps.db, id, true, at)
|
|
76
|
+
: transact(deps.db, () => markNotUploaded(deps.db, id, at));
|
|
43
77
|
if (!result.ok)
|
|
44
78
|
return problem(c, {
|
|
45
79
|
status: 404,
|
|
46
|
-
title: titleOf(404),
|
|
47
80
|
detail: "This project no longer exists. Go back to Projects to pick another.",
|
|
48
81
|
});
|
|
49
82
|
return c.json({ uploadedAt: result.uploadedAt });
|
|
@@ -4,6 +4,7 @@ import { bodyLimit } from "hono/body-limit";
|
|
|
4
4
|
import { stream } from "hono/streaming";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { sniffImage } from "../../adapters/image/bytes.js";
|
|
7
|
+
import { internalError } from "../../kernel/errors.js";
|
|
7
8
|
import { redact } from "../../kernel/log.js";
|
|
8
9
|
import { bridgeLimits, encodeHostImageReport, HostFolderRefused, hostCliIds, hostCliProtocol, hostDoneFrame, hostFrameSchema, hostFramesHeader, hostImageReportHeader, hostImageSchema, hostLlmIds, hostLlmSchema, hostModelsSchema, hostOpenFolderSchema, hostStatusSchema, } from "../../kernel/ports/host-cli.js";
|
|
9
10
|
import { agentImageTimeoutMs } from "../../kernel/ports/image.js";
|
|
@@ -137,7 +138,7 @@ export function hostCliRoutes(options) {
|
|
|
137
138
|
onError: (c) => c.json({
|
|
138
139
|
type: "error",
|
|
139
140
|
kind: "unavailable",
|
|
140
|
-
message: "
|
|
141
|
+
message: internalError("a request to the helper on your computer was too large"),
|
|
141
142
|
}, 413),
|
|
142
143
|
}));
|
|
143
144
|
app.get("/v1/status/:provider", async (c) => {
|
|
@@ -149,7 +150,7 @@ export function hostCliRoutes(options) {
|
|
|
149
150
|
if (Buffer.byteLength(text) > bridgeLimits.status)
|
|
150
151
|
throw providerError({
|
|
151
152
|
kind: "unavailable",
|
|
152
|
-
message: "
|
|
153
|
+
message: internalError("the helper on your computer sent a status report that was too large"),
|
|
153
154
|
});
|
|
154
155
|
return c.json(status);
|
|
155
156
|
});
|
|
@@ -163,7 +164,7 @@ export function hostCliRoutes(options) {
|
|
|
163
164
|
if (Buffer.byteLength(JSON.stringify(result)) > bridgeLimits.models)
|
|
164
165
|
throw providerError({
|
|
165
166
|
kind: "unavailable",
|
|
166
|
-
message: "
|
|
167
|
+
message: internalError("the helper on your computer sent a model list that was too large"),
|
|
167
168
|
});
|
|
168
169
|
return c.json(result);
|
|
169
170
|
});
|
|
@@ -202,11 +203,11 @@ export function hostCliRoutes(options) {
|
|
|
202
203
|
? { type: "activity" }
|
|
203
204
|
: event);
|
|
204
205
|
if (done || parsed.type === "error")
|
|
205
|
-
throw new Error("
|
|
206
|
+
throw new Error(internalError("the AI tool on your computer sent a reply Slopify could not read"));
|
|
206
207
|
const frame = `${JSON.stringify(parsed)}\n`;
|
|
207
208
|
total += Buffer.byteLength(frame);
|
|
208
209
|
if (Buffer.byteLength(frame) > bridgeLimits.frame || total > bridgeLimits.stream)
|
|
209
|
-
throw new Error("
|
|
210
|
+
throw new Error(internalError("the AI tool on your computer sent a reply that was too large"));
|
|
210
211
|
await output.write(frame);
|
|
211
212
|
signal.throwIfAborted();
|
|
212
213
|
done = parsed.type === "done";
|
|
@@ -238,7 +239,7 @@ export function hostCliRoutes(options) {
|
|
|
238
239
|
const signal = AbortSignal.any([job.signal, controller.signal]);
|
|
239
240
|
const timer = setTimeout(() => controller.abort(), agentImageTimeoutMs);
|
|
240
241
|
try {
|
|
241
|
-
const { reference, thinking, cast: bridgedCast, ...rest } = body.data;
|
|
242
|
+
const { reference, thinking, cast: bridgedCast, edit: bridgedEdit, ...rest } = body.data;
|
|
242
243
|
const cast = bridgedCast?.map((member) => ({
|
|
243
244
|
name: member.name,
|
|
244
245
|
description: member.description,
|
|
@@ -257,17 +258,26 @@ export function hostCliRoutes(options) {
|
|
|
257
258
|
};
|
|
258
259
|
if (image !== undefined && sniffImage(image.bytes) !== image.mime)
|
|
259
260
|
return invalid(c);
|
|
261
|
+
const source = bridgedEdit === undefined
|
|
262
|
+
? undefined
|
|
263
|
+
: {
|
|
264
|
+
bytes: new Uint8Array(Buffer.from(bridgedEdit.source.base64, "base64")),
|
|
265
|
+
mime: bridgedEdit.source.mime,
|
|
266
|
+
};
|
|
267
|
+
if (source !== undefined && sniffImage(source.bytes) !== source.mime)
|
|
268
|
+
return invalid(c);
|
|
260
269
|
const result = await ports.image.generate({
|
|
261
270
|
...rest,
|
|
262
271
|
...(thinking === undefined ? {} : { thinking }),
|
|
263
272
|
...(image === undefined ? {} : { reference: image }),
|
|
264
273
|
...(cast === undefined ? {} : { cast }),
|
|
274
|
+
...(source === undefined ? {} : { edit: { source } }),
|
|
265
275
|
signal,
|
|
266
276
|
});
|
|
267
277
|
if (signal.aborted)
|
|
268
278
|
throw providerError({ kind: "unavailable", message: unavailable });
|
|
269
279
|
if (result.bytes.byteLength > bridgeLimits.image || sniffImage(result.bytes) !== result.mime)
|
|
270
|
-
throw new Error("
|
|
280
|
+
throw new Error(internalError("the image made on your computer was too large or not a valid image"));
|
|
271
281
|
c.header("Content-Type", result.mime);
|
|
272
282
|
c.header("Content-Length", String(result.bytes.byteLength));
|
|
273
283
|
// Any app may get this: one from before it ignores headers it does not know.
|
|
@@ -328,6 +338,6 @@ function invalid(c) {
|
|
|
328
338
|
return c.json({
|
|
329
339
|
type: "error",
|
|
330
340
|
kind: "unavailable",
|
|
331
|
-
message: "
|
|
341
|
+
message: internalError("the helper on your computer received a request it could not read"),
|
|
332
342
|
}, 400);
|
|
333
343
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { zValidator } from "@hono/zod-validator";
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import { projectById, projectTrashed } from "../../slices/admission/repo.js";
|
|
4
|
+
import { projectChannelId } from "../../slices/channels/repo.js";
|
|
5
|
+
import { keywordFactsFor } from "../../slices/keywords/facts.js";
|
|
6
|
+
import { costLabel, placeLabels } from "../../slices/keywords/model.js";
|
|
7
|
+
import { keywordSpecs } from "../../slices/keywords/specs.js";
|
|
8
|
+
import { projectIdParam } from "./ids.js";
|
|
9
|
+
import { onInvalid, problem } from "./problem.js";
|
|
10
|
+
// The keywords Slopify fills, as the editor's Insert bar and agents read them, and a project's
|
|
11
|
+
// facts copied again for Edit project's Refresh keyword facts.
|
|
12
|
+
export function keywordRoutes(deps) {
|
|
13
|
+
return new Hono()
|
|
14
|
+
.get("/", (c) => c.json({
|
|
15
|
+
keywords: keywordSpecs.map((spec) => ({
|
|
16
|
+
...spec,
|
|
17
|
+
cost: { kind: spec.cost, label: costLabel(spec.cost) },
|
|
18
|
+
places: spec.places.map((place) => ({ place, label: placeLabels[place] })),
|
|
19
|
+
})),
|
|
20
|
+
}))
|
|
21
|
+
.get("/facts/:projectId", zValidator("param", projectIdParam, onInvalid), (c) => {
|
|
22
|
+
const { projectId } = c.req.valid("param");
|
|
23
|
+
const project = projectById(deps.db, projectId);
|
|
24
|
+
if (project === undefined)
|
|
25
|
+
return problem(c, {
|
|
26
|
+
status: 404,
|
|
27
|
+
detail: projectTrashed(deps.db, projectId)
|
|
28
|
+
? "This project is in the trash. Restore it in Settings → Trash, then refresh its keyword facts."
|
|
29
|
+
: "This project no longer exists. Go back to Projects to pick another.",
|
|
30
|
+
});
|
|
31
|
+
return c.json({
|
|
32
|
+
keywordFacts: keywordFactsFor(deps, { ...project.config, channelId: projectChannelId(deps.db, projectId) }, deps.clock.now(), projectId),
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|