@gentbajko/slopify 3.25.8 → 4.0.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/cache.js +3 -5
- package/dist/adapters/alignment/ctc.js +1 -2
- package/dist/adapters/alignment/lock.js +4 -3
- package/dist/adapters/alignment/multilingual.js +0 -3
- package/dist/adapters/alignment/prefetch.js +2 -1
- package/dist/adapters/alignment/worker.js +2 -1
- package/dist/adapters/explain.js +0 -3
- package/dist/adapters/ffmpeg.js +19 -1
- package/dist/adapters/host-cli/index.js +19 -3
- package/dist/adapters/http-failure.js +53 -0
- package/dist/adapters/image/codex.js +36 -4
- package/dist/adapters/image/fal.js +17 -50
- package/dist/adapters/image/google.js +31 -55
- package/dist/adapters/image/openai.js +20 -47
- package/dist/adapters/image/reference.js +36 -0
- package/dist/adapters/image/replicate.js +18 -47
- package/dist/adapters/interest/search-interest.js +113 -0
- package/dist/adapters/key-probes.js +53 -2
- package/dist/adapters/llm/antigravity.js +4 -0
- 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 +51 -98
- package/dist/adapters/llm/claude-code.js +13 -2
- package/dist/adapters/llm/codex-limits.js +27 -68
- package/dist/adapters/llm/codex-server-models.js +61 -109
- package/dist/adapters/llm/codex.js +12 -1
- package/dist/adapters/llm/openrouter.js +10 -47
- package/dist/adapters/llm/run-cli.js +6 -22
- 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 +19 -40
- package/dist/adapters/tts/inworld-async.js +4 -1
- package/dist/adapters/tts/inworld.js +3 -0
- package/dist/adapters/tts/openai.js +20 -50
- 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 +3 -1
- package/dist/catalog/schema.js +2 -0
- package/dist/catalog/store.js +39 -0
- 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 +4 -25
- package/dist/edge/http/actor.js +5 -3
- package/dist/edge/http/app.js +85 -10
- package/dist/edge/http/assistant.js +127 -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 +1 -3
- package/dist/edge/http/channel-memory.js +7 -20
- package/dist/edge/http/channels.js +13 -26
- package/dist/edge/http/checkpoints.js +33 -17
- 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 +2 -11
- package/dist/edge/http/draft-files.js +1 -3
- package/dist/edge/http/draft-problem.js +4 -9
- 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 +38 -13
- 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 +1 -14
- package/dist/edge/http/open-folder.js +5 -10
- package/dist/edge/http/outputs.js +4 -12
- package/dist/edge/http/patch-notes.js +4 -10
- package/dist/edge/http/planning.js +2 -6
- package/dist/edge/http/problem.js +2 -4
- package/dist/edge/http/project-create.js +1 -0
- package/dist/edge/http/project-templates.js +29 -17
- package/dist/edge/http/projects.js +2 -12
- package/dist/edge/http/prompts.js +7 -14
- package/dist/edge/http/pronunciations.js +1 -2
- package/dist/edge/http/providers.js +39 -24
- 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 +11 -24
- package/dist/edge/http/revision-files.js +5 -10
- package/dist/edge/http/revisions.js +10 -15
- package/dist/edge/http/run-cost.js +1 -2
- package/dist/edge/http/same-page.js +80 -0
- package/dist/edge/http/schedules.js +59 -32
- package/dist/edge/http/settings.js +22 -13
- package/dist/edge/http/social.js +282 -0
- package/dist/edge/http/staging.js +2 -4
- package/dist/edge/http/storage-files.js +5 -7
- package/dist/edge/http/storage.js +23 -23
- package/dist/edge/http/studio.js +23 -50
- package/dist/edge/http/style-preview.js +1 -4
- package/dist/edge/http/subtitles.js +3 -17
- package/dist/edge/http/template-studio.js +433 -0
- package/dist/edge/http/trash.js +10 -11
- 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 +2 -3
- 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 +25 -0
- package/dist/edge/mcp/http.js +11 -2
- package/dist/edge/mcp/instructions.js +5 -3
- package/dist/edge/mcp/library-tools.js +1 -0
- package/dist/edge/mcp/route-tool.js +35 -15
- package/dist/edge/mcp/server.js +13 -8
- package/dist/edge/mcp/tools-channels.js +2 -0
- package/dist/edge/mcp/tools-designs.js +165 -0
- package/dist/edge/mcp/tools-library.js +14 -2
- package/dist/edge/mcp/tools-planning.js +23 -4
- package/dist/edge/mcp/tools-projects.js +28 -1
- package/dist/edge/mcp/tools-runs.js +14 -1
- package/dist/edge/mcp/tools-schedules.js +28 -4
- package/dist/edge/mcp/tools-setup.js +61 -3
- package/dist/edge/mcp/tools-social.js +46 -0
- package/dist/edge/mcp/tools-storage.js +8 -0
- 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/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/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/runner/attempt.js +3 -1
- 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 +15 -10
- package/dist/kernel/runner/standalone.js +9 -5
- package/dist/main.js +334 -19
- package/dist/model-checks.js +166 -0
- package/dist/patch-notes/3.25.9.md +5 -0
- package/dist/patch-notes/4.0.0.md +51 -0
- package/dist/patch-notes/index.json +12 -0
- package/dist/slices/admission/heads.js +2 -1
- package/dist/slices/admission/repo.js +2 -1
- package/dist/slices/admission/rules.js +43 -8
- 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/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 +79 -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 +342 -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 +4 -3
- package/dist/slices/channels/cast-images.js +2 -1
- 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 +6 -0
- package/dist/slices/channels/service.js +10 -0
- package/dist/slices/channels/videos.js +2 -14
- package/dist/slices/checkpoints/index.js +0 -1
- package/dist/slices/control/providers.js +0 -26
- 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 +128 -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 +222 -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/episodes/summarize.js +5 -1
- package/dist/slices/estimate/index.js +45 -7
- package/dist/slices/fonts/catalog.js +3 -2
- 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 +6 -15
- package/dist/slices/images/scenes.js +100 -27
- package/dist/slices/keywords/digest.js +84 -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 +2 -1
- package/dist/slices/library/used-by.js +25 -10
- package/dist/slices/loudness/loudnorm.js +51 -11
- 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 +112 -0
- package/dist/slices/model-checks/run.js +143 -0
- package/dist/slices/model-checks/service.js +198 -0
- package/dist/slices/model-upkeep/switch.js +70 -25
- package/dist/slices/model-upkeep/usage.js +26 -11
- package/dist/slices/narration/breaths.js +2 -1
- package/dist/slices/narration/clean-pieces.js +2 -1
- package/dist/slices/narration/concat.js +2 -1
- package/dist/slices/narration/peaks.js +3 -4
- package/dist/slices/narration/pronunciation-chunks.js +4 -3
- package/dist/slices/narration/pronunciation.js +3 -2
- 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 +2 -1
- package/dist/slices/onboarding/copy.js +2 -1
- package/dist/slices/onboarding/first-run.js +3 -2
- package/dist/slices/onboarding/full-video.js +3 -2
- package/dist/slices/onboarding/install.js +4 -3
- package/dist/slices/onboarding/model.js +0 -16
- package/dist/slices/onboarding/packs.js +22 -22
- package/dist/slices/onboarding/quick-short.js +2 -1
- package/dist/slices/onboarding/sample.js +0 -1
- package/dist/slices/onboarding/state.js +2 -11
- package/dist/slices/onboarding/template.js +2 -1
- package/dist/slices/patch-notes/library.js +3 -2
- package/dist/slices/play-drafts/convert.js +4 -0
- package/dist/slices/play-drafts/review-inputs.js +8 -2
- package/dist/slices/play-drafts/review.js +5 -4
- package/dist/slices/play-drafts/schema.js +4 -0
- package/dist/slices/project-templates/from-project.js +9 -2
- package/dist/slices/project-templates/repo.js +6 -1
- package/dist/slices/project-templates/setup.js +8 -0
- 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 +27 -9
- 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 +3 -3
- 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 +6 -3
- 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 +98 -28
- package/dist/slices/rebuild/recipe-visual.js +55 -16
- package/dist/slices/rebuild/recipe-work.js +15 -3
- package/dist/slices/rebuild/recipe-youtube.js +4 -3
- package/dist/slices/rebuild/recovery-selection.js +3 -1
- package/dist/slices/rebuild/recovery.js +3 -2
- package/dist/slices/rebuild/repo.js +4 -3
- package/dist/slices/rebuild/review-promise.js +25 -0
- package/dist/slices/rebuild/review-redo.js +2 -1
- 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 +9 -8
- package/dist/slices/rebuild/runtime-article.js +3 -2
- package/dist/slices/rebuild/runtime-checkpoints.js +5 -4
- package/dist/slices/rebuild/runtime-document.js +8 -11
- package/dist/slices/rebuild/runtime-export-bed.js +6 -11
- package/dist/slices/rebuild/runtime-export-edit.js +6 -15
- package/dist/slices/rebuild/runtime-export-inputs.js +7 -7
- package/dist/slices/rebuild/runtime-export-short.js +8 -4
- package/dist/slices/rebuild/runtime-export.js +34 -12
- package/dist/slices/rebuild/runtime-figure-card.js +2 -1
- package/dist/slices/rebuild/runtime-image.js +4 -9
- 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 +14 -20
- 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 +10 -15
- 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 +60 -19
- package/dist/slices/rebuild/runtime-publication.js +10 -9
- package/dist/slices/rebuild/runtime-review.js +33 -28
- package/dist/slices/rebuild/runtime-run.js +4 -1
- package/dist/slices/rebuild/runtime-shorts.js +34 -50
- package/dist/slices/rebuild/runtime-store.js +3 -8
- package/dist/slices/rebuild/runtime-subtitles.js +16 -14
- package/dist/slices/rebuild/runtime-voices.js +8 -15
- package/dist/slices/rebuild/runtime-youtube.js +11 -29
- 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/reviews/external-model.js +3 -0
- package/dist/slices/reviews/external-repo.js +2 -1
- package/dist/slices/reviews/external-rows.js +2 -3
- package/dist/slices/reviews/model.js +26 -8
- package/dist/slices/reviews/repo.js +2 -1
- package/dist/slices/reviews/rules.js +1 -0
- package/dist/slices/reviews/view.js +5 -2
- package/dist/slices/revisions/downloads.js +4 -5
- package/dist/slices/revisions/mutation-assets.js +7 -4
- package/dist/slices/revisions/mutation-cues.js +2 -5
- package/dist/slices/revisions/mutations.js +0 -1
- 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 +11 -2
- 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 +24 -16
- package/dist/slices/schedules/rescore.js +35 -0
- package/dist/slices/schedules/scheduler.js +13 -3
- package/dist/slices/schedules/schema.js +54 -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 +48 -36
- package/dist/slices/settings/cli-paths.js +4 -6
- package/dist/slices/settings/first-run.js +2 -11
- package/dist/slices/settings/model-reach.js +3 -17
- package/dist/slices/settings/model.js +10 -0
- package/dist/slices/settings/playback.js +33 -22
- 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/pick.js +2 -15
- package/dist/slices/shorts/prompts.js +2 -13
- package/dist/slices/shorts/render.js +3 -0
- 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 +131 -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 +55 -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 +128 -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 +20 -2
- 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 +16 -11
- 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 +10 -3
- package/dist/slices/studio/calendar.js +4 -1
- package/dist/slices/studio/pick.js +2 -11
- package/dist/slices/studio/plan.js +6 -15
- package/dist/slices/studio/queue.js +3 -14
- package/dist/slices/studio/releases.js +26 -0
- package/dist/slices/studio/settings.js +14 -51
- package/dist/slices/studio/videos.js +12 -0
- package/dist/slices/style-preview/render.js +34 -13
- package/dist/slices/style-preview/schema.js +13 -0
- package/dist/slices/style-preview/service.js +2 -1
- package/dist/slices/style-preview/settings.js +33 -5
- 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 +118 -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 +103 -0
- package/dist/slices/template-studio/checks.js +273 -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 +54 -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 +205 -0
- package/dist/slices/template-studio/paid-view.js +66 -0
- package/dist/slices/template-studio/paid.js +348 -0
- package/dist/slices/template-studio/quote.js +148 -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 +30 -0
- package/dist/slices/template-studio/schedule-sample.js +87 -0
- package/dist/slices/template-studio/schema.js +218 -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 +173 -0
- package/dist/slices/template-studio/status.js +174 -0
- package/dist/slices/template-studio/topic.js +223 -0
- 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/video/ass-text.js +17 -0
- package/dist/slices/video/audio-export.js +2 -64
- package/dist/slices/video/encoding.js +160 -0
- package/dist/slices/video/ffmpeg.js +23 -21
- package/dist/slices/video/figure-card.js +1 -15
- package/dist/slices/video/slideshow.js +43 -18
- package/dist/slices/voices/palette.js +0 -3
- package/dist/slices/youtube/answer.js +2 -15
- package/dist/slices/youtube/edits-repo.js +2 -11
- package/dist/tutorials/Agents-MCP.md +2 -1
- package/dist/tutorials/Assistant.md +42 -0
- package/dist/tutorials/Channels.md +2 -0
- package/dist/tutorials/Home-and-Projects.md +19 -0
- package/dist/tutorials/Install.md +1 -0
- package/dist/tutorials/Keywords-Slopify-Fills.md +87 -0
- package/dist/tutorials/Models.md +33 -1
- package/dist/tutorials/Notifications.md +6 -0
- package/dist/tutorials/Play-Images.md +4 -0
- package/dist/tutorials/Posting-to-Social-Sites.md +121 -0
- package/dist/tutorials/Prompts.md +10 -6
- package/dist/tutorials/Remote-Access.md +63 -0
- package/dist/tutorials/Reviews-and-Checkpoints.md +13 -2
- package/dist/tutorials/Schedules.md +21 -1
- package/dist/tutorials/Settings-Reference.md +50 -8
- package/dist/tutorials/Template-Studio.md +125 -0
- package/dist/tutorials/Templates.md +3 -0
- package/dist/tutorials/_Sidebar.md +5 -0
- package/dist/updater/work-in-progress.js +42 -12
- package/dist/web/assets/index-CkAI_2E7.css +1 -0
- package/dist/web/assets/index-DcD0cdfo.js +334 -0
- package/dist/web/assets/{pdf-T7MCwjIv.js → pdf-TODRwF31.js} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +5 -1
- 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/web/assets/index-BadsoORk.css +0 -1
- package/dist/web/assets/index-D8LqNsCl.js +0 -326
package/dist/host-cli/status.js
CHANGED
|
@@ -6,6 +6,7 @@ import { z } from "zod";
|
|
|
6
6
|
import { parseAntigravityModels } from "../adapters/llm/antigravity-models.js";
|
|
7
7
|
import { cliLoginError } from "../adapters/llm/cli-login-error.js";
|
|
8
8
|
import { cliCommand } from "../kernel/cli-command.js";
|
|
9
|
+
import { errorText, hasErrnoCode } from "../kernel/errors.js";
|
|
9
10
|
import { cliProbeTimeoutMs, readinessFromProbe, } from "../slices/settings/cli-status.js";
|
|
10
11
|
export function hostCommandName(id) {
|
|
11
12
|
if (id === "claude-code")
|
|
@@ -25,7 +26,9 @@ export async function resolveHostCommand(id, env) {
|
|
|
25
26
|
return path;
|
|
26
27
|
}
|
|
27
28
|
catch (error) {
|
|
28
|
-
if (!
|
|
29
|
+
if (!hasErrnoCode(error, "ENOENT") &&
|
|
30
|
+
!hasErrnoCode(error, "ENOTDIR") &&
|
|
31
|
+
!hasErrnoCode(error, "EACCES"))
|
|
29
32
|
throw error;
|
|
30
33
|
}
|
|
31
34
|
}
|
|
@@ -89,10 +92,10 @@ export function createHostStatus(deps) {
|
|
|
89
92
|
command: hostCommandName(id),
|
|
90
93
|
installed: false,
|
|
91
94
|
login: "unknown",
|
|
92
|
-
issueKind:
|
|
93
|
-
issue:
|
|
95
|
+
issueKind: hasErrnoCode(error, "ENOENT") ? "missing" : "bridge",
|
|
96
|
+
issue: hasErrnoCode(error, "ENOENT")
|
|
94
97
|
? `${hostCommandName(id)} was not found on this machine. Install it and sign in there, then run the launcher again: npx @gentbajko/slopify --docker`
|
|
95
|
-
: `Slopify could not check for ${hostCommandName(id)} on this machine (${
|
|
98
|
+
: `Slopify could not check for ${hostCommandName(id)} on this machine (${errorText(error)}). Fix the problem, then run the launcher again: npx @gentbajko/slopify --docker`,
|
|
96
99
|
};
|
|
97
100
|
}
|
|
98
101
|
const readiness = readinessFromProbe(await deps.probe(command, ["--version"], cliProbeTimeoutMs), {
|
|
@@ -149,6 +152,3 @@ export function createHostStatus(deps) {
|
|
|
149
152
|
return { ...(await entry.value), id };
|
|
150
153
|
};
|
|
151
154
|
}
|
|
152
|
-
function isCode(error, code) {
|
|
153
|
-
return typeof error === "object" && error !== null && "code" in error && error.code === code;
|
|
154
|
-
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
-- What Settings → Models and the pickers know about each model for the person's own key or
|
|
2
|
+
-- CLI login (`slices/model-checks`): whether the key's live list names it, and the last check
|
|
3
|
+
-- or real run's verdict. Only pickers read it; no run does. `account` is the key generation or
|
|
4
|
+
-- the CLI's id, so a new key starts every row over.
|
|
5
|
+
CREATE TABLE model_checks (
|
|
6
|
+
provider TEXT NOT NULL,
|
|
7
|
+
family TEXT NOT NULL CHECK (family IN ('llm','tts','image')),
|
|
8
|
+
model TEXT NOT NULL,
|
|
9
|
+
account TEXT NOT NULL,
|
|
10
|
+
listed INTEGER CHECK (listed IN (0,1)),
|
|
11
|
+
listed_at TEXT,
|
|
12
|
+
verdict TEXT CHECK (verdict IN ('works','no-access','failed')),
|
|
13
|
+
verdict_source TEXT CHECK (verdict_source IN ('check','run')),
|
|
14
|
+
sentence TEXT,
|
|
15
|
+
checked_at TEXT,
|
|
16
|
+
cost REAL NOT NULL DEFAULT 0,
|
|
17
|
+
first_works_at TEXT,
|
|
18
|
+
notice_seen INTEGER NOT NULL DEFAULT 0 CHECK (notice_seen IN (0,1)),
|
|
19
|
+
PRIMARY KEY(provider, family, model)
|
|
20
|
+
);
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
-- Template studio (4.0, `slices/template-studio`). A version is runnable by schedules when its
|
|
2
|
+
-- gate is ready, carried (a system writer copied a runnable gate) or legacy (saved before the
|
|
3
|
+
-- studio). A version with no row was never checked.
|
|
4
|
+
CREATE TABLE template_gates (
|
|
5
|
+
template_id TEXT NOT NULL,
|
|
6
|
+
version INTEGER NOT NULL CHECK(version >= 1),
|
|
7
|
+
state TEXT NOT NULL CHECK(state IN ('legacy','ready','carried')),
|
|
8
|
+
carried_from INTEGER CHECK(carried_from IS NULL OR carried_from >= 1),
|
|
9
|
+
checks_json TEXT CHECK(checks_json IS NULL OR json_valid(checks_json)),
|
|
10
|
+
marked_at TEXT,
|
|
11
|
+
PRIMARY KEY(template_id, version),
|
|
12
|
+
FOREIGN KEY(template_id, version) REFERENCES project_template_revisions(template_id, version) ON DELETE CASCADE
|
|
13
|
+
);
|
|
14
|
+
INSERT INTO template_gates (template_id, version, state)
|
|
15
|
+
SELECT template_id, version, 'legacy' FROM project_template_revisions;
|
|
16
|
+
-- The hidden project each template's samples are made on. It never appears in a list the user
|
|
17
|
+
-- sees (`notTemplateSample`), and its project may be gone: the next sample makes it again.
|
|
18
|
+
CREATE TABLE template_samples (
|
|
19
|
+
template_id TEXT PRIMARY KEY REFERENCES project_templates(id) ON DELETE CASCADE,
|
|
20
|
+
project_id TEXT NOT NULL UNIQUE,
|
|
21
|
+
topic TEXT NOT NULL CHECK(length(trim(topic)) BETWEEN 1 AND 300),
|
|
22
|
+
topic_source TEXT NOT NULL CHECK(topic_source IN ('fixed','queued')),
|
|
23
|
+
full_script INTEGER NOT NULL DEFAULT 0 CHECK(full_script IN (0,1)),
|
|
24
|
+
created_at TEXT NOT NULL
|
|
25
|
+
);
|
|
26
|
+
CREATE TABLE template_sample_versions (
|
|
27
|
+
template_id TEXT NOT NULL REFERENCES project_templates(id) ON DELETE CASCADE,
|
|
28
|
+
template_version INTEGER NOT NULL CHECK(template_version >= 1),
|
|
29
|
+
revision_id TEXT,
|
|
30
|
+
state TEXT NOT NULL CHECK(state IN ('queued','making','done','failed','skipped','held')),
|
|
31
|
+
quoted_high REAL,
|
|
32
|
+
held_reason TEXT,
|
|
33
|
+
updated_at TEXT NOT NULL,
|
|
34
|
+
PRIMARY KEY(template_id, template_version)
|
|
35
|
+
);
|
|
36
|
+
-- At most one queued and one running sample job per template: a newer Save replaces the queued
|
|
37
|
+
-- one and waits behind the running one, which is never stopped.
|
|
38
|
+
CREATE TABLE template_sample_jobs (
|
|
39
|
+
template_id TEXT NOT NULL REFERENCES project_templates(id) ON DELETE CASCADE,
|
|
40
|
+
template_version INTEGER NOT NULL CHECK(template_version >= 1),
|
|
41
|
+
ack_high REAL NOT NULL DEFAULT 0 CHECK(ack_high >= 0),
|
|
42
|
+
kind TEXT NOT NULL CHECK(kind IN ('save','topic','full-script','bakeoff','free')),
|
|
43
|
+
requested_at TEXT NOT NULL,
|
|
44
|
+
state TEXT NOT NULL CHECK(state IN ('queued','running')),
|
|
45
|
+
PRIMARY KEY(template_id, state)
|
|
46
|
+
);
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
-- The promise check is a review stage of its own (`reviews/model.ts`), and the in-app assistant
|
|
2
|
+
-- acts on and answers reviews as itself rather than as an agent. SQLite cannot change a CHECK in
|
|
3
|
+
-- place, so both tables are copied, as 0055 and 0059 did.
|
|
4
|
+
CREATE TABLE review_verdicts_promise_upgrade (
|
|
5
|
+
id TEXT PRIMARY KEY,
|
|
6
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
7
|
+
revision_id TEXT NOT NULL,
|
|
8
|
+
item_key TEXT NOT NULL,
|
|
9
|
+
stage TEXT NOT NULL CHECK(stage IN ('article','images','narration','thumbnail','shorts','promise')),
|
|
10
|
+
item_fingerprint TEXT NOT NULL,
|
|
11
|
+
review_fingerprint TEXT NOT NULL,
|
|
12
|
+
passed INTEGER NOT NULL CHECK(passed IN (0,1)),
|
|
13
|
+
reasons TEXT NOT NULL,
|
|
14
|
+
outcome TEXT NOT NULL CHECK(outcome IN ('passed','flagged','redo','auto-passed')),
|
|
15
|
+
attempt INTEGER NOT NULL CHECK(attempt >= 1),
|
|
16
|
+
action TEXT CHECK(action IN ('overruled','redone')),
|
|
17
|
+
action_at TEXT,
|
|
18
|
+
action_by TEXT CHECK(action_by IN ('person','agent','assistant')),
|
|
19
|
+
redo_state TEXT CHECK(redo_state IN ('pending','started','failed')),
|
|
20
|
+
redo_error TEXT,
|
|
21
|
+
answered_by TEXT NOT NULL DEFAULT 'model' CHECK(answered_by IN ('model','agent','person','nobody')),
|
|
22
|
+
created_at TEXT NOT NULL,
|
|
23
|
+
UNIQUE(project_id,review_fingerprint)
|
|
24
|
+
);
|
|
25
|
+
INSERT INTO review_verdicts_promise_upgrade (id,project_id,revision_id,item_key,stage,item_fingerprint,review_fingerprint,passed,reasons,outcome,attempt,action,action_at,action_by,redo_state,redo_error,answered_by,created_at)
|
|
26
|
+
SELECT id,project_id,revision_id,item_key,stage,item_fingerprint,review_fingerprint,passed,reasons,outcome,attempt,action,action_at,action_by,redo_state,redo_error,answered_by,created_at
|
|
27
|
+
FROM review_verdicts ORDER BY rowid;
|
|
28
|
+
DROP TABLE review_verdicts;
|
|
29
|
+
ALTER TABLE review_verdicts_promise_upgrade RENAME TO review_verdicts;
|
|
30
|
+
CREATE INDEX review_verdicts_item ON review_verdicts(project_id,item_key);
|
|
31
|
+
CREATE INDEX review_verdicts_redo ON review_verdicts(redo_state);
|
|
32
|
+
|
|
33
|
+
CREATE TABLE external_reviews_promise_upgrade (
|
|
34
|
+
id TEXT PRIMARY KEY,
|
|
35
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
36
|
+
revision_id TEXT NOT NULL,
|
|
37
|
+
work_id TEXT NOT NULL,
|
|
38
|
+
piece_id TEXT NOT NULL,
|
|
39
|
+
work_key TEXT NOT NULL,
|
|
40
|
+
item_key TEXT NOT NULL,
|
|
41
|
+
stage TEXT NOT NULL CHECK(stage IN ('article','images','narration','thumbnail','shorts','promise')),
|
|
42
|
+
item_fingerprint TEXT NOT NULL,
|
|
43
|
+
review_fingerprint TEXT NOT NULL,
|
|
44
|
+
material TEXT NOT NULL CHECK(json_valid(material)),
|
|
45
|
+
state TEXT NOT NULL CHECK(state IN ('waiting','answered','auto-passed','superseded','canceled')),
|
|
46
|
+
waiting_since TEXT NOT NULL,
|
|
47
|
+
deadline_at TEXT NOT NULL,
|
|
48
|
+
verdict TEXT CHECK(verdict IS NULL OR json_valid(verdict)),
|
|
49
|
+
answered_by TEXT CHECK(answered_by IN ('person','agent','assistant')),
|
|
50
|
+
answered_at TEXT,
|
|
51
|
+
UNIQUE(project_id,review_fingerprint)
|
|
52
|
+
);
|
|
53
|
+
INSERT INTO external_reviews_promise_upgrade (id,project_id,revision_id,work_id,piece_id,work_key,item_key,stage,item_fingerprint,review_fingerprint,material,state,waiting_since,deadline_at,verdict,answered_by,answered_at)
|
|
54
|
+
SELECT id,project_id,revision_id,work_id,piece_id,work_key,item_key,stage,item_fingerprint,review_fingerprint,material,state,waiting_since,deadline_at,verdict,answered_by,answered_at
|
|
55
|
+
FROM external_reviews ORDER BY rowid;
|
|
56
|
+
DROP TABLE external_reviews;
|
|
57
|
+
ALTER TABLE external_reviews_promise_upgrade RENAME TO external_reviews;
|
|
58
|
+
CREATE INDEX external_reviews_waiting ON external_reviews(state, deadline_at);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
-- The in-app assistant acts through the same API as an agent but is told apart: its changes
|
|
2
|
+
-- show "by assistant", and it can start a project's work. Its chat is kept per session, each
|
|
3
|
+
-- turn replayed to a fresh CLI, and what it asked the person first ("Ask first") is kept with
|
|
4
|
+
-- the person's answer, which a later call may use once. SQLite cannot change a CHECK in place,
|
|
5
|
+
-- so project_starts is copied, as 0055 did.
|
|
6
|
+
ALTER TABLE agent_actions ADD COLUMN actor TEXT NOT NULL DEFAULT 'agent' CHECK(actor IN ('agent','assistant'));
|
|
7
|
+
|
|
8
|
+
CREATE TABLE project_starts_assistant_upgrade (
|
|
9
|
+
project_id TEXT PRIMARY KEY REFERENCES projects(id) ON DELETE CASCADE,
|
|
10
|
+
actor TEXT NOT NULL CHECK(actor IN ('person','agent','assistant')),
|
|
11
|
+
started_at TEXT NOT NULL
|
|
12
|
+
);
|
|
13
|
+
INSERT INTO project_starts_assistant_upgrade (project_id,actor,started_at)
|
|
14
|
+
SELECT project_id,actor,started_at FROM project_starts ORDER BY rowid;
|
|
15
|
+
DROP TABLE project_starts;
|
|
16
|
+
ALTER TABLE project_starts_assistant_upgrade RENAME TO project_starts;
|
|
17
|
+
|
|
18
|
+
CREATE TABLE assistant_sessions (
|
|
19
|
+
id TEXT PRIMARY KEY,
|
|
20
|
+
cli TEXT NOT NULL,
|
|
21
|
+
created_at TEXT NOT NULL,
|
|
22
|
+
updated_at TEXT NOT NULL
|
|
23
|
+
);
|
|
24
|
+
CREATE TABLE assistant_messages (
|
|
25
|
+
id TEXT PRIMARY KEY,
|
|
26
|
+
session_id TEXT NOT NULL REFERENCES assistant_sessions(id) ON DELETE CASCADE,
|
|
27
|
+
turn_id TEXT NOT NULL,
|
|
28
|
+
role TEXT NOT NULL CHECK(role IN ('person','assistant','tool','ask','error')),
|
|
29
|
+
text TEXT NOT NULL,
|
|
30
|
+
meta TEXT NOT NULL DEFAULT '{}' CHECK(json_valid(meta)),
|
|
31
|
+
created_at TEXT NOT NULL
|
|
32
|
+
);
|
|
33
|
+
CREATE INDEX assistant_messages_session ON assistant_messages(session_id, created_at);
|
|
34
|
+
CREATE TABLE assistant_asks (
|
|
35
|
+
id TEXT PRIMARY KEY,
|
|
36
|
+
session_id TEXT NOT NULL REFERENCES assistant_sessions(id) ON DELETE CASCADE,
|
|
37
|
+
tool TEXT NOT NULL,
|
|
38
|
+
args_hash TEXT NOT NULL,
|
|
39
|
+
text TEXT NOT NULL,
|
|
40
|
+
state TEXT NOT NULL CHECK(state IN ('asked','allowed','denied','used','expired')),
|
|
41
|
+
created_at TEXT NOT NULL,
|
|
42
|
+
decided_at TEXT
|
|
43
|
+
);
|
|
44
|
+
CREATE INDEX assistant_asks_session ON assistant_asks(session_id, state);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-- Topic scoring (`slices/schedules/score.ts`): off for every schedule saved before it, which
|
|
2
|
+
-- then finds and orders topics exactly as it did. A topic's score is kept beside the queue, by
|
|
3
|
+
-- its normalised title, so the queue's own rows keep their strict shape; `pinned` is a topic the
|
|
4
|
+
-- person moved, which scoring then leaves where it was put.
|
|
5
|
+
ALTER TABLE schedules ADD COLUMN topic_scoring TEXT NOT NULL DEFAULT 'off' CHECK(topic_scoring IN ('off','library','search'));
|
|
6
|
+
CREATE TABLE topic_scores (
|
|
7
|
+
schedule_id TEXT NOT NULL REFERENCES schedules(id) ON DELETE CASCADE,
|
|
8
|
+
topic_key TEXT NOT NULL,
|
|
9
|
+
title TEXT NOT NULL,
|
|
10
|
+
score INTEGER NOT NULL CHECK(score BETWEEN 0 AND 100),
|
|
11
|
+
interest REAL,
|
|
12
|
+
novelty REAL NOT NULL,
|
|
13
|
+
reasons TEXT NOT NULL CHECK(json_valid(reasons)),
|
|
14
|
+
pinned INTEGER NOT NULL DEFAULT 0 CHECK(pinned IN (0,1)),
|
|
15
|
+
scored_at TEXT NOT NULL,
|
|
16
|
+
PRIMARY KEY(schedule_id, topic_key)
|
|
17
|
+
);
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
-- Designs (4.0): an uploaded or generated picture edited step by step, and a designed piece
|
|
2
|
+
-- (poster, flyer, brochure, social image) whose text Slopify lays out on the AI's artwork.
|
|
3
|
+
-- A design is its own record, not a project; `project_id` only links it to one ("Keep in
|
|
4
|
+
-- project") and is cleared when that project is deleted. `channel_id` is the channel its paid
|
|
5
|
+
-- calls count under on Home. `sample_of` marks the hidden sample a design template's editor
|
|
6
|
+
-- redraws; every list leaves those out. Each step is one version of the picture, kept in
|
|
7
|
+
-- image_blobs (backed up), chained by `parent_id`; `head_step_id` is the version the design
|
|
8
|
+
-- shows and continues from.
|
|
9
|
+
CREATE TABLE designs (
|
|
10
|
+
id TEXT PRIMARY KEY,
|
|
11
|
+
kind TEXT NOT NULL CHECK(kind IN ('edit','design')),
|
|
12
|
+
name TEXT NOT NULL CHECK(length(trim(name)) BETWEEN 1 AND 200),
|
|
13
|
+
channel_id TEXT NOT NULL,
|
|
14
|
+
project_id TEXT REFERENCES projects(id) ON DELETE SET NULL,
|
|
15
|
+
template_id TEXT,
|
|
16
|
+
template_version INTEGER CHECK(template_version IS NULL OR template_version >= 1),
|
|
17
|
+
schedule_id TEXT,
|
|
18
|
+
schedule_run_id TEXT,
|
|
19
|
+
document_json TEXT CHECK(document_json IS NULL OR json_valid(document_json)),
|
|
20
|
+
values_json TEXT NOT NULL DEFAULT '{}' CHECK(json_valid(values_json)),
|
|
21
|
+
head_step_id TEXT,
|
|
22
|
+
sample_of TEXT,
|
|
23
|
+
mutation_id TEXT UNIQUE,
|
|
24
|
+
mutation_hash TEXT,
|
|
25
|
+
created_at TEXT NOT NULL,
|
|
26
|
+
updated_at TEXT NOT NULL,
|
|
27
|
+
deleted_at TEXT
|
|
28
|
+
);
|
|
29
|
+
CREATE INDEX designs_project ON designs(project_id) WHERE project_id IS NOT NULL;
|
|
30
|
+
CREATE INDEX designs_schedule ON designs(schedule_id) WHERE schedule_id IS NOT NULL;
|
|
31
|
+
CREATE INDEX designs_sample_of ON designs(sample_of) WHERE sample_of IS NOT NULL;
|
|
32
|
+
CREATE TABLE design_steps (
|
|
33
|
+
id TEXT PRIMARY KEY,
|
|
34
|
+
design_id TEXT NOT NULL REFERENCES designs(id) ON DELETE CASCADE,
|
|
35
|
+
n INTEGER NOT NULL CHECK(n >= 1),
|
|
36
|
+
parent_id TEXT REFERENCES design_steps(id) ON DELETE CASCADE,
|
|
37
|
+
kind TEXT NOT NULL CHECK(kind IN ('upload','edit','generate')),
|
|
38
|
+
instruction TEXT CHECK(instruction IS NULL OR length(instruction) <= 4000),
|
|
39
|
+
provider TEXT,
|
|
40
|
+
model TEXT,
|
|
41
|
+
inputs_json TEXT NOT NULL DEFAULT '{}' CHECK(json_valid(inputs_json)),
|
|
42
|
+
state TEXT NOT NULL CHECK(state IN ('making','ready','failed')),
|
|
43
|
+
error TEXT,
|
|
44
|
+
sha256 TEXT REFERENCES image_blobs(sha256),
|
|
45
|
+
width INTEGER CHECK(width IS NULL OR width > 0),
|
|
46
|
+
height INTEGER CHECK(height IS NULL OR height > 0),
|
|
47
|
+
mutation_id TEXT UNIQUE,
|
|
48
|
+
mutation_hash TEXT,
|
|
49
|
+
created_at TEXT NOT NULL,
|
|
50
|
+
settled_at TEXT,
|
|
51
|
+
UNIQUE(design_id, n),
|
|
52
|
+
CHECK(state <> 'ready' OR sha256 IS NOT NULL)
|
|
53
|
+
);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
-- A design's picture edits and artwork are paid calls made outside a project, metered like a
|
|
2
|
+
-- schedule's or a channel's (0040). Every row is copied as it was; only the owner kinds widen.
|
|
3
|
+
CREATE TABLE standalone_usage_next (
|
|
4
|
+
id TEXT PRIMARY KEY,
|
|
5
|
+
owner_kind TEXT NOT NULL CHECK(owner_kind IN ('schedule','channel','design')),
|
|
6
|
+
owner_id TEXT NOT NULL,
|
|
7
|
+
channel_id TEXT NOT NULL,
|
|
8
|
+
purpose TEXT NOT NULL,
|
|
9
|
+
kind TEXT NOT NULL CHECK(kind IN ('llm','tts','image','video')),
|
|
10
|
+
provider TEXT NOT NULL,
|
|
11
|
+
model TEXT NOT NULL,
|
|
12
|
+
tokens_in INTEGER,
|
|
13
|
+
tokens_out INTEGER,
|
|
14
|
+
tokens_cached INTEGER,
|
|
15
|
+
characters INTEGER,
|
|
16
|
+
images INTEGER,
|
|
17
|
+
seconds REAL,
|
|
18
|
+
size TEXT,
|
|
19
|
+
quality TEXT,
|
|
20
|
+
wall_ms INTEGER NOT NULL,
|
|
21
|
+
on_plan INTEGER NOT NULL DEFAULT 0 CHECK(on_plan IN (0,1)),
|
|
22
|
+
cost REAL,
|
|
23
|
+
api_model TEXT,
|
|
24
|
+
api_cost REAL,
|
|
25
|
+
price_json TEXT CHECK(price_json IS NULL OR json_valid(price_json)),
|
|
26
|
+
account TEXT,
|
|
27
|
+
reading_json TEXT CHECK(reading_json IS NULL OR json_valid(reading_json)),
|
|
28
|
+
created_at TEXT NOT NULL
|
|
29
|
+
);
|
|
30
|
+
INSERT INTO standalone_usage_next SELECT id, owner_kind, owner_id, channel_id, purpose, kind, provider, model, tokens_in, tokens_out, tokens_cached, characters, images, seconds, size, quality, wall_ms, on_plan, cost, api_model, api_cost, price_json, account, reading_json, created_at FROM standalone_usage ORDER BY rowid;
|
|
31
|
+
DROP TABLE standalone_usage;
|
|
32
|
+
ALTER TABLE standalone_usage_next RENAME TO standalone_usage;
|
|
33
|
+
CREATE INDEX standalone_usage_created ON standalone_usage(created_at);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
-- Design templates: a designed piece saved with fields ({{Event}}, {{Date}}…) to make again by
|
|
2
|
+
-- hand or from a schedule. Every Save is a new revision; schedules only make from a revision
|
|
3
|
+
-- marked ready. `design_template_samples` is the one sample job per template its editor
|
|
4
|
+
-- redraws after a Save (the sample itself is a hidden design, `designs.sample_of`).
|
|
5
|
+
CREATE TABLE design_templates (
|
|
6
|
+
id TEXT PRIMARY KEY,
|
|
7
|
+
channel_id TEXT,
|
|
8
|
+
head_version INTEGER NOT NULL CHECK(head_version >= 1),
|
|
9
|
+
created_at TEXT NOT NULL,
|
|
10
|
+
deleted_at TEXT,
|
|
11
|
+
mutation_id TEXT UNIQUE,
|
|
12
|
+
mutation_hash TEXT
|
|
13
|
+
);
|
|
14
|
+
CREATE TABLE design_template_revisions (
|
|
15
|
+
template_id TEXT NOT NULL REFERENCES design_templates(id) ON DELETE CASCADE,
|
|
16
|
+
version INTEGER NOT NULL CHECK(version >= 1),
|
|
17
|
+
name TEXT NOT NULL CHECK(length(trim(name)) BETWEEN 1 AND 200),
|
|
18
|
+
document_json TEXT NOT NULL CHECK(json_valid(document_json)),
|
|
19
|
+
gate TEXT NOT NULL DEFAULT 'unchecked' CHECK(gate IN ('unchecked','ready')),
|
|
20
|
+
checks_json TEXT CHECK(checks_json IS NULL OR json_valid(checks_json)),
|
|
21
|
+
marked_at TEXT,
|
|
22
|
+
created_at TEXT NOT NULL,
|
|
23
|
+
PRIMARY KEY(template_id, version)
|
|
24
|
+
);
|
|
25
|
+
CREATE TABLE design_template_samples (
|
|
26
|
+
template_id TEXT PRIMARY KEY REFERENCES design_templates(id) ON DELETE CASCADE,
|
|
27
|
+
design_id TEXT UNIQUE,
|
|
28
|
+
version INTEGER NOT NULL CHECK(version >= 1),
|
|
29
|
+
state TEXT NOT NULL CHECK(state IN ('queued','making','done','failed','held')),
|
|
30
|
+
held_reason TEXT,
|
|
31
|
+
quoted_high REAL,
|
|
32
|
+
updated_at TEXT NOT NULL
|
|
33
|
+
);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
-- A schedule makes either projects from a project template (every schedule so far) or
|
|
2
|
+
-- designed pieces from a design template, one per row of its table ahead of that row's date.
|
|
3
|
+
-- `design_ids_json` lists the designs a run made, as `project_ids_json` lists projects.
|
|
4
|
+
ALTER TABLE schedules ADD COLUMN template_kind TEXT NOT NULL DEFAULT 'project' CHECK(template_kind IN ('project','design'));
|
|
5
|
+
ALTER TABLE schedule_runs ADD COLUMN design_ids_json TEXT NOT NULL DEFAULT '[]' CHECK(json_valid(design_ids_json));
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
-- Template studio's model bake-off (4.0, `slices/template-studio/bakeoff.ts`): one section's
|
|
2
|
+
-- sample made again on two or three models, each on a hidden copy of the template's sample
|
|
3
|
+
-- project, compared by cost and speed, then discarded. One bake-off per template at a time.
|
|
4
|
+
CREATE TABLE template_bakeoffs (
|
|
5
|
+
id TEXT PRIMARY KEY,
|
|
6
|
+
template_id TEXT NOT NULL UNIQUE REFERENCES project_templates(id) ON DELETE CASCADE,
|
|
7
|
+
template_version INTEGER NOT NULL CHECK(template_version >= 1),
|
|
8
|
+
section TEXT NOT NULL CHECK(section IN ('script','voice','pictures')),
|
|
9
|
+
ack_high REAL NOT NULL CHECK(ack_high >= 0),
|
|
10
|
+
ack_unknown INTEGER NOT NULL DEFAULT 0 CHECK(ack_unknown IN (0,1)),
|
|
11
|
+
state TEXT NOT NULL CHECK(state IN ('queued','making','done','held','failed')),
|
|
12
|
+
sentence TEXT,
|
|
13
|
+
created_at TEXT NOT NULL,
|
|
14
|
+
updated_at TEXT NOT NULL
|
|
15
|
+
);
|
|
16
|
+
-- Each model's copy. Its project is hidden like the sample's (`template_hidden_projects`) and
|
|
17
|
+
-- removed with the bake-off.
|
|
18
|
+
CREATE TABLE template_bakeoff_clones (
|
|
19
|
+
bakeoff_id TEXT NOT NULL REFERENCES template_bakeoffs(id) ON DELETE CASCADE,
|
|
20
|
+
slot INTEGER NOT NULL CHECK(slot BETWEEN 0 AND 2),
|
|
21
|
+
provider TEXT NOT NULL CHECK(length(provider) BETWEEN 1 AND 100),
|
|
22
|
+
model TEXT NOT NULL CHECK(length(model) BETWEEN 1 AND 200),
|
|
23
|
+
project_id TEXT UNIQUE,
|
|
24
|
+
state TEXT NOT NULL CHECK(state IN ('queued','making','done','failed')),
|
|
25
|
+
quoted_high REAL,
|
|
26
|
+
failure TEXT,
|
|
27
|
+
started_at TEXT,
|
|
28
|
+
finished_at TEXT,
|
|
29
|
+
PRIMARY KEY(bakeoff_id, slot)
|
|
30
|
+
);
|
|
31
|
+
-- Every project the studio keeps out of the lists the person sees: each template's sample and
|
|
32
|
+
-- each bake-off copy (`notTemplateSample`).
|
|
33
|
+
CREATE VIEW template_hidden_projects AS
|
|
34
|
+
SELECT project_id FROM template_samples
|
|
35
|
+
UNION ALL
|
|
36
|
+
SELECT project_id FROM template_bakeoff_clones WHERE project_id IS NOT NULL;
|
|
37
|
+
-- What a hidden project spent, kept when the project is removed (a bake-off discarded, a sample
|
|
38
|
+
-- made again on a new topic), so today's sample budget still counts it.
|
|
39
|
+
CREATE TABLE template_studio_spend (
|
|
40
|
+
project_id TEXT NOT NULL,
|
|
41
|
+
cost REAL NOT NULL CHECK(cost >= 0),
|
|
42
|
+
created_at TEXT NOT NULL
|
|
43
|
+
);
|
|
44
|
+
CREATE INDEX template_studio_spend_at ON template_studio_spend(created_at);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
-- Posting to other sites (`slices/social`). One row per project, site and item (0 is the
|
|
2
|
+
-- project's one post per site): the project's own pick (`choice_json`, NULL is the template's),
|
|
3
|
+
-- the person's hand edit of the text and the generated text it was made from, Reddit's own
|
|
4
|
+
-- fields, and where the post stands after the extension filled it or the person posted it.
|
|
5
|
+
-- A project with no row posts as its settings say; nothing here is generated.
|
|
6
|
+
CREATE TABLE social_posts (
|
|
7
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
8
|
+
platform TEXT NOT NULL CHECK (platform IN ('x','linkedin','instagram','tiktok','reddit','bluesky')),
|
|
9
|
+
item INTEGER NOT NULL DEFAULT 0 CHECK (item >= 0),
|
|
10
|
+
choice_json TEXT CHECK (choice_json IS NULL OR json_valid(choice_json)),
|
|
11
|
+
text_edit TEXT,
|
|
12
|
+
text_base TEXT,
|
|
13
|
+
reddit_json TEXT CHECK (reddit_json IS NULL OR json_valid(reddit_json)),
|
|
14
|
+
state TEXT NOT NULL DEFAULT 'none' CHECK (state IN ('none','waiting','filling','filled','scheduled','posted','failed')),
|
|
15
|
+
waiting_at TEXT,
|
|
16
|
+
filled_at TEXT,
|
|
17
|
+
scheduled_at TEXT,
|
|
18
|
+
posted_at TEXT,
|
|
19
|
+
url TEXT,
|
|
20
|
+
message TEXT,
|
|
21
|
+
by TEXT CHECK (by IN ('extension','person')),
|
|
22
|
+
updated_at TEXT NOT NULL,
|
|
23
|
+
PRIMARY KEY (project_id, platform, item)
|
|
24
|
+
);
|
|
25
|
+
CREATE INDEX social_posts_waiting ON social_posts(platform, waiting_at) WHERE state = 'waiting';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
-- A channel's accounts on other sites (`slices/social`): the X subscription, which only changes
|
|
2
|
+
-- a post's warnings, and the account names the extension reads a published post's link from.
|
|
3
|
+
-- Never a login.
|
|
4
|
+
ALTER TABLE channels ADD COLUMN x_tier TEXT NOT NULL DEFAULT 'free' CHECK (x_tier IN ('free','premium','premium_plus'));
|
|
5
|
+
ALTER TABLE channels ADD COLUMN social_accounts TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(social_accounts));
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-- Library prompts of the new "post" kind: what writes a project's post for another site
|
|
2
|
+
-- (`slices/social`). SQLite cannot change a CHECK in place, so the table is copied into one
|
|
3
|
+
-- whose CHECK lists the new kind, like 0034 did for "script".
|
|
4
|
+
CREATE TABLE prompts_post_upgrade (
|
|
5
|
+
id TEXT PRIMARY KEY,
|
|
6
|
+
kind TEXT NOT NULL CHECK (kind IN ('article','image','thumbnail','narration','description','shorts','review','script','post')),
|
|
7
|
+
name TEXT NOT NULL,
|
|
8
|
+
body TEXT NOT NULL,
|
|
9
|
+
slots TEXT NOT NULL,
|
|
10
|
+
updated_at TEXT NOT NULL,
|
|
11
|
+
deleted_at TEXT
|
|
12
|
+
);
|
|
13
|
+
INSERT INTO prompts_post_upgrade (id,kind,name,body,slots,updated_at,deleted_at)
|
|
14
|
+
SELECT id,kind,name,body,slots,updated_at,deleted_at FROM prompts;
|
|
15
|
+
DROP TABLE prompts;
|
|
16
|
+
ALTER TABLE prompts_post_upgrade RENAME TO prompts;
|
|
17
|
+
CREATE UNIQUE INDEX prompts_name ON prompts(kind,lower(name)) WHERE deleted_at IS NULL;
|
package/dist/kernel/db/tx.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { errorText } from "../errors.js";
|
|
1
2
|
// SQLite starts a transaction for a SAVEPOINT issued outside one and nests it inside one
|
|
2
3
|
// already open, so a slice can wrap its own writes without knowing whether its caller did
|
|
3
4
|
// too. The name is a constant, not a parameter: SQLite matches RELEASE and ROLLBACK TO
|
|
@@ -34,7 +35,7 @@ function unwind(db, error) {
|
|
|
34
35
|
db.exec(`RELEASE ${savepoint}`);
|
|
35
36
|
}
|
|
36
37
|
catch (cleanup) {
|
|
37
|
-
throw new Error(`the transaction could not be unwound: ${
|
|
38
|
+
throw new Error(`the transaction could not be unwound: ${errorText(cleanup)}`, {
|
|
38
39
|
cause: error,
|
|
39
40
|
});
|
|
40
41
|
}
|
|
@@ -45,6 +46,3 @@ function isThenable(value) {
|
|
|
45
46
|
"then" in value &&
|
|
46
47
|
typeof value.then === "function");
|
|
47
48
|
}
|
|
48
|
-
function messageOf(error) {
|
|
49
|
-
return error instanceof Error ? error.message : String(error);
|
|
50
|
-
}
|
package/dist/kernel/errors.js
CHANGED
|
@@ -1,8 +1,29 @@
|
|
|
1
|
+
// The one sentence a failure carries: an Error's message, or whatever else was thrown as text.
|
|
2
|
+
export function errorText(error) {
|
|
3
|
+
return error instanceof Error ? error.message : String(error);
|
|
4
|
+
}
|
|
5
|
+
// The Node file-system code (`ENOENT`, `EEXIST`) of a thrown value, if it carries one.
|
|
6
|
+
export function errnoCode(error) {
|
|
7
|
+
return typeof error === "object" &&
|
|
8
|
+
error !== null &&
|
|
9
|
+
"code" in error &&
|
|
10
|
+
typeof error.code === "string"
|
|
11
|
+
? error.code
|
|
12
|
+
: undefined;
|
|
13
|
+
}
|
|
14
|
+
export function hasErrnoCode(error, code) {
|
|
15
|
+
return errnoCode(error) === code;
|
|
16
|
+
}
|
|
17
|
+
// A path that is missing, not a directory, not readable or a link loop: nothing to read there.
|
|
18
|
+
export function isUnreachablePath(error) {
|
|
19
|
+
const code = errnoCode(error);
|
|
20
|
+
return code !== undefined && ["ENOENT", "ENOTDIR", "EACCES", "EPERM", "ELOOP"].includes(code);
|
|
21
|
+
}
|
|
1
22
|
// A failure's own sentence and every cause it wraps, for the log. The page shows only the
|
|
2
23
|
// sentence; the chain is the only place a "download interrupted" says the server closed the
|
|
3
24
|
// stream.
|
|
4
25
|
export function causedBy(error) {
|
|
5
|
-
const chain = [
|
|
26
|
+
const chain = [errorText(error)];
|
|
6
27
|
let cause = error instanceof Error ? error.cause : undefined;
|
|
7
28
|
while (cause !== undefined && cause !== null && chain.length < 6) {
|
|
8
29
|
chain.push(cause instanceof Error ? `${cause.name}: ${cause.message}` : String(cause));
|
|
@@ -10,3 +31,8 @@ export function causedBy(error) {
|
|
|
10
31
|
}
|
|
11
32
|
return chain.join(" <- ");
|
|
12
33
|
}
|
|
34
|
+
// The sentence for a check that can only fail through a bug. `what` says which check, in words a
|
|
35
|
+
// person can report; `retry` names the button that is right on the screen the message appears on.
|
|
36
|
+
export function internalError(what, retry = "Try again") {
|
|
37
|
+
return `Slopify hit an internal error (${what}). ${retry}; if it happens again, use Download diagnostics in Settings and report it.`;
|
|
38
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// The JSON an AI model's answer carries, wherever the model put it: bare, in a ```json fence, or
|
|
2
|
+
// after a sentence of its own. Everything from the first `open` to the last `close` is parsed;
|
|
3
|
+
// undefined when there is none or it is not JSON.
|
|
4
|
+
export function jsonBetween(text, open, close) {
|
|
5
|
+
const start = text.indexOf(open);
|
|
6
|
+
const end = text.lastIndexOf(close);
|
|
7
|
+
if (start === -1 || end <= start)
|
|
8
|
+
return undefined;
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(text.slice(start, end + 1));
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
}
|
package/dist/kernel/lock.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { errnoCode } from "./errors.js";
|
|
2
3
|
// Seconds since the epoch at which this process started, stable for its whole life.
|
|
3
4
|
const startedAt = Math.round(Date.now() / 1000 - process.uptime());
|
|
4
5
|
export function acquireInstanceLock(lockPath) {
|
|
@@ -32,7 +33,7 @@ function claim(lockPath, pid) {
|
|
|
32
33
|
return true;
|
|
33
34
|
}
|
|
34
35
|
catch (error) {
|
|
35
|
-
if (
|
|
36
|
+
if (errnoCode(error) === "EEXIST") {
|
|
36
37
|
return false;
|
|
37
38
|
}
|
|
38
39
|
throw error;
|
|
@@ -65,7 +66,7 @@ function discard(lockPath) {
|
|
|
65
66
|
unlinkSync(lockPath);
|
|
66
67
|
}
|
|
67
68
|
catch (error) {
|
|
68
|
-
if (
|
|
69
|
+
if (errnoCode(error) !== "ENOENT") {
|
|
69
70
|
throw error;
|
|
70
71
|
}
|
|
71
72
|
}
|
|
@@ -77,12 +78,6 @@ function isAlive(pid) {
|
|
|
77
78
|
}
|
|
78
79
|
catch (error) {
|
|
79
80
|
// EPERM means the process exists and belongs to someone else.
|
|
80
|
-
return
|
|
81
|
+
return errnoCode(error) === "EPERM";
|
|
81
82
|
}
|
|
82
83
|
}
|
|
83
|
-
function errnoOf(error) {
|
|
84
|
-
if (error instanceof Error && "code" in error && typeof error.code === "string") {
|
|
85
|
-
return error.code;
|
|
86
|
-
}
|
|
87
|
-
return undefined;
|
|
88
|
-
}
|
package/dist/kernel/paths.js
CHANGED
|
@@ -18,6 +18,14 @@ export function layout(dataDir, files) {
|
|
|
18
18
|
export function attachPlaces(paths, places) {
|
|
19
19
|
Object.assign(paths, { places });
|
|
20
20
|
}
|
|
21
|
+
// Tells a running install's Paths which projects are studio samples.
|
|
22
|
+
export function attachSamples(paths, samples) {
|
|
23
|
+
Object.assign(paths, { samples });
|
|
24
|
+
}
|
|
25
|
+
// Where the studio samples' project folders are: inside the data dir, beside the database.
|
|
26
|
+
export function templateSamplesDir(paths) {
|
|
27
|
+
return join(paths.dataDir, "template-studio", "samples");
|
|
28
|
+
}
|
|
21
29
|
// Points a running install's Paths at moved files. The one object every slice was handed is
|
|
22
30
|
// changed in place, so the next file each one reads or writes is in the new place.
|
|
23
31
|
export function repoint(paths, files) {
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// The in-app assistant's turn on a CLI on this computer (`adapters/llm/assistant-cli.ts`). The
|
|
2
|
+
// slice hands in the turn's prompt and token and reads back what the chat shows; how the CLI
|
|
3
|
+
// is started, isolated and read stays in the adapter.
|
|
4
|
+
export const assistantCliIds = ["claude-code", "codex"];
|
|
@@ -91,6 +91,9 @@ export const hostImageSchema = z
|
|
|
91
91
|
.strict())
|
|
92
92
|
.max(4)
|
|
93
93
|
.optional(),
|
|
94
|
+
// A design's picture to change (`ImageRequest.edit`). A helper from before it refuses the
|
|
95
|
+
// whole request as invalid rather than drawing a new picture in its place.
|
|
96
|
+
edit: z.object({ source: bridgedImage }).strict().optional(),
|
|
94
97
|
})
|
|
95
98
|
.strict();
|
|
96
99
|
export const hostOpenFolderSchema = z
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// Public search interest in a topic: the search suggestions offered for it and how often its
|
|
2
|
+
// Wikipedia article is read. Used only by schedules the person set to rank topics by search
|
|
3
|
+
// interest; it sends the topic's title and nothing else. Never a channel's own analytics.
|
|
4
|
+
export {};
|
|
@@ -61,9 +61,6 @@ export function languageInfo(code) {
|
|
|
61
61
|
export function projectLanguage(config) {
|
|
62
62
|
return config.language ?? defaultLanguage;
|
|
63
63
|
}
|
|
64
|
-
export function isEnglish(config) {
|
|
65
|
-
return projectLanguage(config) === defaultLanguage;
|
|
66
|
-
}
|
|
67
64
|
// The line added to every prompt that writes for the audience, when the project is not in
|
|
68
65
|
// English. It is the app's own sentence, added after the user's prompt rather than written
|
|
69
66
|
// into it, so the prompt library stays as the user wrote it; an English project gets nothing,
|
|
@@ -22,12 +22,14 @@ export const providerErrorKinds = [
|
|
|
22
22
|
"dropped",
|
|
23
23
|
"other",
|
|
24
24
|
];
|
|
25
|
+
export const modelAccesses = ["no-access", "not-found"];
|
|
25
26
|
export function providerError(init) {
|
|
26
27
|
return Object.assign(new Error(init.message), {
|
|
27
28
|
fault: {
|
|
28
29
|
kind: init.kind,
|
|
29
30
|
...(init.retryAfterMs === undefined ? {} : { retryAfterMs: init.retryAfterMs }),
|
|
30
31
|
...(init.planLimit === undefined ? {} : { planLimit: init.planLimit }),
|
|
32
|
+
...(init.access === undefined ? {} : { access: init.access }),
|
|
31
33
|
},
|
|
32
34
|
});
|
|
33
35
|
}
|