@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.
Files changed (718) hide show
  1. package/dist/adapters/account-limits.js +30 -0
  2. package/dist/adapters/alignment/audio.js +1 -1
  3. package/dist/adapters/alignment/cache.js +4 -6
  4. package/dist/adapters/alignment/ctc.js +1 -2
  5. package/dist/adapters/alignment/lock.js +4 -3
  6. package/dist/adapters/alignment/multilingual.js +2 -4
  7. package/dist/adapters/alignment/prefetch.js +2 -1
  8. package/dist/adapters/alignment/runner.js +1 -1
  9. package/dist/adapters/alignment/worker.js +3 -2
  10. package/dist/adapters/explain.js +10 -12
  11. package/dist/adapters/ffmpeg.js +19 -1
  12. package/dist/adapters/host-cli/index.js +21 -4
  13. package/dist/adapters/host-cli/transport.js +2 -1
  14. package/dist/adapters/http-failure.js +53 -0
  15. package/dist/adapters/image/bytes.js +2 -1
  16. package/dist/adapters/image/codex.js +42 -9
  17. package/dist/adapters/image/fal.js +21 -53
  18. package/dist/adapters/image/google.js +33 -56
  19. package/dist/adapters/image/models.js +2 -2
  20. package/dist/adapters/image/openai.js +22 -48
  21. package/dist/adapters/image/reference.js +36 -0
  22. package/dist/adapters/image/replicate.js +21 -49
  23. package/dist/adapters/image/video.js +2 -1
  24. package/dist/adapters/interest/search-interest.js +113 -0
  25. package/dist/adapters/key-probes.js +54 -3
  26. package/dist/adapters/llm/antigravity-models.js +1 -1
  27. package/dist/adapters/llm/antigravity.js +11 -6
  28. package/dist/adapters/llm/assistant-cli.js +388 -0
  29. package/dist/adapters/llm/child-session.js +83 -0
  30. package/dist/adapters/llm/claude-code-models.js +52 -99
  31. package/dist/adapters/llm/claude-code.js +16 -4
  32. package/dist/adapters/llm/codex-limits.js +27 -68
  33. package/dist/adapters/llm/codex-models.js +1 -1
  34. package/dist/adapters/llm/codex-server-models.js +61 -109
  35. package/dist/adapters/llm/codex.js +12 -1
  36. package/dist/adapters/llm/document-workspace.js +3 -2
  37. package/dist/adapters/llm/image-workspace.js +3 -2
  38. package/dist/adapters/llm/openrouter.js +12 -48
  39. package/dist/adapters/llm/run-cli.js +9 -24
  40. package/dist/adapters/llm/sse-lines.js +5 -1
  41. package/dist/adapters/model-access.js +37 -0
  42. package/dist/adapters/tts/cartesia.js +15 -46
  43. package/dist/adapters/tts/elevenlabs.js +20 -52
  44. package/dist/adapters/tts/gemini.js +21 -41
  45. package/dist/adapters/tts/inworld-async.js +6 -2
  46. package/dist/adapters/tts/inworld.js +6 -2
  47. package/dist/adapters/tts/openai.js +20 -50
  48. package/dist/adapters/tts/system.js +2 -1
  49. package/dist/assets/models-lifecycle.yaml +6 -0
  50. package/dist/assistant-wiring.js +60 -0
  51. package/dist/autopilot-timers.js +59 -0
  52. package/dist/catalog/lifecycle.js +52 -0
  53. package/dist/catalog/propose.js +204 -0
  54. package/dist/catalog/registry.js +23 -14
  55. package/dist/catalog/schema.js +4 -1
  56. package/dist/catalog/store.js +39 -0
  57. package/dist/catalog/validate.js +5 -2
  58. package/dist/edge/autostart/native.js +3 -5
  59. package/dist/edge/autostart/prompt.js +2 -1
  60. package/dist/edge/autostart/service.js +3 -4
  61. package/dist/edge/cli-args.js +3 -4
  62. package/dist/edge/cli.js +2 -1
  63. package/dist/edge/docker-install/apply.js +11 -11
  64. package/dist/edge/docker-install/run.js +2 -1
  65. package/dist/edge/docker-install/state.js +4 -3
  66. package/dist/edge/docker-install/tree.js +2 -4
  67. package/dist/edge/docker-install/volume.js +3 -2
  68. package/dist/edge/docker.js +5 -4
  69. package/dist/edge/events/hub.js +5 -5
  70. package/dist/edge/http/actions.js +11 -32
  71. package/dist/edge/http/actor.js +5 -3
  72. package/dist/edge/http/app.js +86 -11
  73. package/dist/edge/http/assistant.js +129 -0
  74. package/dist/edge/http/audio-preview.js +4 -11
  75. package/dist/edge/http/auditions.js +1 -1
  76. package/dist/edge/http/autostart.js +5 -5
  77. package/dist/edge/http/backups.js +2 -4
  78. package/dist/edge/http/channel-memory.js +9 -22
  79. package/dist/edge/http/channels.js +14 -27
  80. package/dist/edge/http/checkpoints.js +39 -21
  81. package/dist/edge/http/design-templates.js +167 -0
  82. package/dist/edge/http/designs.js +178 -0
  83. package/dist/edge/http/diagnostics.js +5 -1
  84. package/dist/edge/http/document-themes.js +5 -14
  85. package/dist/edge/http/draft-files.js +1 -3
  86. package/dist/edge/http/draft-problem.js +5 -10
  87. package/dist/edge/http/drafts.js +3 -3
  88. package/dist/edge/http/entries.js +6 -9
  89. package/dist/edge/http/extension-auth.js +27 -0
  90. package/dist/edge/http/external-reviews.js +12 -11
  91. package/dist/edge/http/files.js +5 -11
  92. package/dist/edge/http/folder-location.js +1 -4
  93. package/dist/edge/http/fonts.js +0 -7
  94. package/dist/edge/http/home.js +47 -14
  95. package/dist/edge/http/host-cli.js +18 -8
  96. package/dist/edge/http/ids.js +8 -0
  97. package/dist/edge/http/keywords.js +35 -0
  98. package/dist/edge/http/model-checks.js +132 -0
  99. package/dist/edge/http/narration-peaks.js +5 -13
  100. package/dist/edge/http/onboarding.js +30 -26
  101. package/dist/edge/http/open-folder.js +5 -10
  102. package/dist/edge/http/outputs.js +7 -14
  103. package/dist/edge/http/patch-notes.js +6 -12
  104. package/dist/edge/http/planning.js +3 -7
  105. package/dist/edge/http/problem.js +2 -4
  106. package/dist/edge/http/project-create.js +2 -1
  107. package/dist/edge/http/project-templates.js +31 -19
  108. package/dist/edge/http/projects.js +24 -16
  109. package/dist/edge/http/prompts.js +9 -16
  110. package/dist/edge/http/pronunciations.js +1 -2
  111. package/dist/edge/http/providers.js +48 -34
  112. package/dist/edge/http/refusal.js +29 -0
  113. package/dist/edge/http/remote-access.js +40 -0
  114. package/dist/edge/http/remote-guard.js +71 -0
  115. package/dist/edge/http/request-guard.js +91 -0
  116. package/dist/edge/http/reviews.js +12 -25
  117. package/dist/edge/http/revision-files.js +6 -11
  118. package/dist/edge/http/revisions.js +14 -19
  119. package/dist/edge/http/run-cost.js +1 -2
  120. package/dist/edge/http/same-page.js +80 -0
  121. package/dist/edge/http/schedules.js +69 -40
  122. package/dist/edge/http/settings.js +27 -14
  123. package/dist/edge/http/social.js +283 -0
  124. package/dist/edge/http/staging.js +3 -5
  125. package/dist/edge/http/storage-files.js +5 -7
  126. package/dist/edge/http/storage.js +33 -25
  127. package/dist/edge/http/studio.js +94 -69
  128. package/dist/edge/http/style-preview.js +3 -6
  129. package/dist/edge/http/subtitles.js +3 -17
  130. package/dist/edge/http/template-studio.js +436 -0
  131. package/dist/edge/http/trash.js +11 -12
  132. package/dist/edge/http/tutorial.js +1 -2
  133. package/dist/edge/http/tutorials.js +5 -11
  134. package/dist/edge/http/update.js +7 -13
  135. package/dist/edge/http/waveform.js +3 -6
  136. package/dist/edge/http/youtube-edits.js +3 -4
  137. package/dist/edge/mcp/assistant.js +279 -0
  138. package/dist/edge/mcp/attribution.js +8 -2
  139. package/dist/edge/mcp/call-route.js +11 -2
  140. package/dist/edge/mcp/excluded-routes.js +29 -3
  141. package/dist/edge/mcp/http.js +11 -2
  142. package/dist/edge/mcp/instructions.js +6 -4
  143. package/dist/edge/mcp/library-tools.js +9 -5
  144. package/dist/edge/mcp/remake-tools.js +7 -4
  145. package/dist/edge/mcp/route-tool.js +35 -15
  146. package/dist/edge/mcp/server.js +13 -8
  147. package/dist/edge/mcp/tools-channels.js +11 -9
  148. package/dist/edge/mcp/tools-designs.js +165 -0
  149. package/dist/edge/mcp/tools-library.js +19 -7
  150. package/dist/edge/mcp/tools-planning.js +40 -21
  151. package/dist/edge/mcp/tools-projects.js +38 -11
  152. package/dist/edge/mcp/tools-publishing.js +9 -9
  153. package/dist/edge/mcp/tools-runs.js +23 -10
  154. package/dist/edge/mcp/tools-schedules.js +32 -8
  155. package/dist/edge/mcp/tools-setup.js +75 -11
  156. package/dist/edge/mcp/tools-social.js +47 -0
  157. package/dist/edge/mcp/tools-storage.js +11 -3
  158. package/dist/edge/mcp/tools-template-studio.js +166 -0
  159. package/dist/edge/mcp/tools.js +6 -0
  160. package/dist/edge/remote-access/cli.js +71 -0
  161. package/dist/edge/remote-access/model.js +32 -0
  162. package/dist/edge/remote-access/rules.js +207 -0
  163. package/dist/edge/remote-access/service.js +203 -0
  164. package/dist/edge/remote-access/store.js +44 -0
  165. package/dist/edge/remote-access/views.js +43 -0
  166. package/dist/extension/slopify-studio-chrome.zip +0 -0
  167. package/dist/extension/slopify-studio-firefox.zip +0 -0
  168. package/dist/host-cli/install.js +2 -2
  169. package/dist/host-cli/open-folder.js +2 -2
  170. package/dist/host-cli/paths.js +2 -4
  171. package/dist/host-cli/server.js +4 -4
  172. package/dist/host-cli/service.js +3 -3
  173. package/dist/host-cli/status.js +7 -7
  174. package/dist/kernel/db/migrations/0063-model-checks.sql +20 -0
  175. package/dist/kernel/db/migrations/0064-template-studio.sql +46 -0
  176. package/dist/kernel/db/migrations/0065-promise-and-assistant-reviews.sql +58 -0
  177. package/dist/kernel/db/migrations/0066-assistant.sql +44 -0
  178. package/dist/kernel/db/migrations/0067-autopilot.sql +6 -0
  179. package/dist/kernel/db/migrations/0068-topic-scores.sql +17 -0
  180. package/dist/kernel/db/migrations/0070-designs.sql +53 -0
  181. package/dist/kernel/db/migrations/0071-design-usage.sql +33 -0
  182. package/dist/kernel/db/migrations/0072-design-templates.sql +33 -0
  183. package/dist/kernel/db/migrations/0073-schedule-design-kind.sql +5 -0
  184. package/dist/kernel/db/migrations/0074-template-bakeoffs.sql +44 -0
  185. package/dist/kernel/db/migrations/0075-social-posts.sql +25 -0
  186. package/dist/kernel/db/migrations/0076-channel-social.sql +5 -0
  187. package/dist/kernel/db/migrations/0077-post-prompts.sql +17 -0
  188. package/dist/kernel/db/migrations/0078-uploaded-from-links.sql +7 -0
  189. package/dist/kernel/db/tx.js +2 -4
  190. package/dist/kernel/errors.js +27 -1
  191. package/dist/kernel/json-answer.js +15 -0
  192. package/dist/kernel/lock.js +4 -9
  193. package/dist/kernel/paths.js +8 -0
  194. package/dist/kernel/pipeline.js +12 -0
  195. package/dist/kernel/ports/assistant-cli.js +4 -0
  196. package/dist/kernel/ports/host-cli.js +3 -0
  197. package/dist/kernel/ports/interest.js +4 -0
  198. package/dist/kernel/ports/languages.js +0 -3
  199. package/dist/kernel/ports/model.js +2 -0
  200. package/dist/kernel/ports/settings-places.js +31 -0
  201. package/dist/kernel/ports/system-speech.js +31 -3
  202. package/dist/kernel/runner/attempt.js +14 -4
  203. package/dist/kernel/runner/audition.js +3 -1
  204. package/dist/kernel/runner/checkpoint-authority.js +2 -1
  205. package/dist/kernel/runner/index.js +8 -10
  206. package/dist/kernel/runner/model-access.js +40 -0
  207. package/dist/kernel/runner/model-check.js +153 -0
  208. package/dist/kernel/runner/providers.js +18 -12
  209. package/dist/kernel/runner/standalone.js +11 -7
  210. package/dist/main.js +338 -21
  211. package/dist/model-catalog.js +20 -0
  212. package/dist/model-checks.js +166 -0
  213. package/dist/patch-notes/4.0.0.md +51 -0
  214. package/dist/patch-notes/4.1.0.md +42 -0
  215. package/dist/patch-notes/index.json +12 -0
  216. package/dist/slices/admission/heads.js +2 -1
  217. package/dist/slices/admission/listing-facts.js +95 -0
  218. package/dist/slices/admission/repo.js +11 -7
  219. package/dist/slices/admission/rules.js +50 -15
  220. package/dist/slices/admission/schema.js +8 -0
  221. package/dist/slices/admission/stage-writes.js +0 -3
  222. package/dist/slices/admission/start.js +48 -31
  223. package/dist/slices/admission/state-words.js +34 -5
  224. package/dist/slices/admission/substitute.js +7 -4
  225. package/dist/slices/agents/attention-posts.js +31 -0
  226. package/dist/slices/agents/attention-templates.js +33 -0
  227. package/dist/slices/agents/attention.js +10 -1
  228. package/dist/slices/agents/connection.js +2 -6
  229. package/dist/slices/agents/model.js +6 -3
  230. package/dist/slices/agents/repo.js +15 -7
  231. package/dist/slices/article/continuation.js +0 -63
  232. package/dist/slices/article/plain.js +3 -2
  233. package/dist/slices/article/segments.js +2 -62
  234. package/dist/slices/assistant/access.js +1 -0
  235. package/dist/slices/assistant/asks.js +80 -0
  236. package/dist/slices/assistant/cost.js +54 -0
  237. package/dist/slices/assistant/gate.js +222 -0
  238. package/dist/slices/assistant/model.js +86 -0
  239. package/dist/slices/assistant/names.js +23 -0
  240. package/dist/slices/assistant/prompt.js +74 -0
  241. package/dist/slices/assistant/repo.js +74 -0
  242. package/dist/slices/assistant/tokens.js +18 -0
  243. package/dist/slices/assistant/turn.js +344 -0
  244. package/dist/slices/autopilot/buffer.js +76 -0
  245. package/dist/slices/autopilot/model.js +14 -0
  246. package/dist/slices/autopilot/notify.js +27 -0
  247. package/dist/slices/autopilot/repo.js +34 -0
  248. package/dist/slices/autopilot/signals.js +194 -0
  249. package/dist/slices/autopilot/warnings.js +85 -0
  250. package/dist/slices/autopilot/weekly.js +100 -0
  251. package/dist/slices/backups/files.js +2 -6
  252. package/dist/slices/backups/repo.js +3 -15
  253. package/dist/slices/backups/service.js +8 -7
  254. package/dist/slices/channels/cast-images.js +3 -2
  255. package/dist/slices/channels/model.js +0 -1
  256. package/dist/slices/channels/rebrand.js +0 -3
  257. package/dist/slices/channels/repo.js +4 -0
  258. package/dist/slices/channels/schema.js +7 -1
  259. package/dist/slices/channels/service.js +10 -0
  260. package/dist/slices/channels/videos.js +3 -15
  261. package/dist/slices/checkpoints/index.js +0 -1
  262. package/dist/slices/control/providers.js +2 -28
  263. package/dist/slices/designs/artwork.js +66 -0
  264. package/dist/slices/designs/budget.js +23 -0
  265. package/dist/slices/designs/calls.js +124 -0
  266. package/dist/slices/designs/check-context.js +38 -0
  267. package/dist/slices/designs/check-text.js +43 -0
  268. package/dist/slices/designs/fields.js +88 -0
  269. package/dist/slices/designs/frames.js +34 -0
  270. package/dist/slices/designs/gate.js +130 -0
  271. package/dist/slices/designs/layout.js +293 -0
  272. package/dist/slices/designs/model.js +35 -0
  273. package/dist/slices/designs/pdf-job.js +23 -0
  274. package/dist/slices/designs/pdf-pages.js +30 -0
  275. package/dist/slices/designs/pdf-runner.js +68 -0
  276. package/dist/slices/designs/pdf-worker.js +24 -0
  277. package/dist/slices/designs/picture-size.js +79 -0
  278. package/dist/slices/designs/pictures.js +55 -0
  279. package/dist/slices/designs/quote.js +24 -0
  280. package/dist/slices/designs/render-args.js +36 -0
  281. package/dist/slices/designs/render-input.js +59 -0
  282. package/dist/slices/designs/render.js +215 -0
  283. package/dist/slices/designs/repo.js +101 -0
  284. package/dist/slices/designs/requests.js +80 -0
  285. package/dist/slices/designs/runner.js +239 -0
  286. package/dist/slices/designs/sample-repo.js +91 -0
  287. package/dist/slices/designs/sample.js +223 -0
  288. package/dist/slices/designs/schema.js +87 -0
  289. package/dist/slices/designs/sections.js +44 -0
  290. package/dist/slices/designs/service.js +233 -0
  291. package/dist/slices/designs/steps-repo.js +102 -0
  292. package/dist/slices/designs/studio-kind.js +39 -0
  293. package/dist/slices/designs/template-checks.js +44 -0
  294. package/dist/slices/designs/template-make.js +118 -0
  295. package/dist/slices/designs/templates.js +218 -0
  296. package/dist/slices/document/fonts.js +2 -1
  297. package/dist/slices/document/model.js +7 -4
  298. package/dist/slices/document/render.js +2 -1
  299. package/dist/slices/document/theme-schema.js +1 -1
  300. package/dist/slices/document/theme.js +49 -3
  301. package/dist/slices/episodes/summarize.js +6 -2
  302. package/dist/slices/estimate/index.js +72 -28
  303. package/dist/slices/estimate/requests.js +4 -4
  304. package/dist/slices/fixes/rules.js +3 -1
  305. package/dist/slices/fonts/catalog.js +5 -3
  306. package/dist/slices/fonts/coverage.js +2 -1
  307. package/dist/slices/fonts/discovery.js +3 -2
  308. package/dist/slices/fonts/files.js +2 -6
  309. package/dist/slices/fonts/index.js +0 -1
  310. package/dist/slices/fonts/sfnt.js +45 -10
  311. package/dist/slices/images/appearance.js +8 -16
  312. package/dist/slices/images/scenes.js +102 -28
  313. package/dist/slices/keywords/digest.js +85 -0
  314. package/dist/slices/keywords/facts.js +92 -0
  315. package/dist/slices/keywords/fill.js +80 -0
  316. package/dist/slices/keywords/model.js +75 -0
  317. package/dist/slices/keywords/rules.js +187 -0
  318. package/dist/slices/keywords/schema.js +28 -0
  319. package/dist/slices/keywords/specs.js +260 -0
  320. package/dist/slices/keywords/values.js +74 -0
  321. package/dist/slices/library/lint.js +29 -12
  322. package/dist/slices/library/model.js +2 -0
  323. package/dist/slices/library/photorealistic.js +4 -12
  324. package/dist/slices/library/rename.js +9 -7
  325. package/dist/slices/library/save.js +14 -10
  326. package/dist/slices/library/slots.js +37 -11
  327. package/dist/slices/library/transfer.js +5 -4
  328. package/dist/slices/library/used-by.js +25 -10
  329. package/dist/slices/loudness/loudnorm.js +53 -12
  330. package/dist/slices/loudness/model.js +3 -2
  331. package/dist/slices/loudness/sentence-level.js +2 -1
  332. package/dist/slices/model-checks/cost.js +61 -0
  333. package/dist/slices/model-checks/listing.js +124 -0
  334. package/dist/slices/model-checks/model.js +20 -0
  335. package/dist/slices/model-checks/record.js +32 -0
  336. package/dist/slices/model-checks/repo.js +120 -0
  337. package/dist/slices/model-checks/rules.js +125 -0
  338. package/dist/slices/model-checks/run.js +143 -0
  339. package/dist/slices/model-checks/service.js +198 -0
  340. package/dist/slices/model-upkeep/model.js +1 -1
  341. package/dist/slices/model-upkeep/switch.js +72 -27
  342. package/dist/slices/model-upkeep/usage.js +39 -13
  343. package/dist/slices/narration/breaths.js +3 -1
  344. package/dist/slices/narration/clean-pieces.js +3 -1
  345. package/dist/slices/narration/concat.js +2 -1
  346. package/dist/slices/narration/pauses-model.js +3 -2
  347. package/dist/slices/narration/peaks.js +3 -4
  348. package/dist/slices/narration/pronunciation-chunks.js +4 -3
  349. package/dist/slices/narration/pronunciation.js +6 -4
  350. package/dist/slices/narration/steering.js +4 -3
  351. package/dist/slices/notifications/notifier.js +4 -3
  352. package/dist/slices/notifications/rules.js +5 -2
  353. package/dist/slices/notifications/settings.js +4 -12
  354. package/dist/slices/notifications/subject.js +4 -3
  355. package/dist/slices/onboarding/copy.js +21 -3
  356. package/dist/slices/onboarding/first-run.js +16 -40
  357. package/dist/slices/onboarding/full-video.js +3 -2
  358. package/dist/slices/onboarding/install.js +6 -4
  359. package/dist/slices/onboarding/model.js +26 -37
  360. package/dist/slices/onboarding/packs.js +22 -22
  361. package/dist/slices/onboarding/preferred-model.js +14 -0
  362. package/dist/slices/onboarding/quick-short.js +105 -65
  363. package/dist/slices/onboarding/sample.js +4 -2
  364. package/dist/slices/onboarding/state.js +9 -11
  365. package/dist/slices/onboarding/template.js +8 -6
  366. package/dist/slices/outputs/add.js +3 -2
  367. package/dist/slices/outputs/service.js +2 -2
  368. package/dist/slices/patch-notes/library.js +4 -3
  369. package/dist/slices/play-drafts/convert.js +4 -0
  370. package/dist/slices/play-drafts/readiness.js +3 -3
  371. package/dist/slices/play-drafts/review-inputs.js +9 -3
  372. package/dist/slices/play-drafts/review.js +5 -4
  373. package/dist/slices/play-drafts/schema.js +4 -0
  374. package/dist/slices/play-drafts/service.js +17 -7
  375. package/dist/slices/project-templates/from-project.js +9 -2
  376. package/dist/slices/project-templates/next-chapter.js +2 -1
  377. package/dist/slices/project-templates/provider-defaults.js +22 -0
  378. package/dist/slices/project-templates/repo.js +6 -1
  379. package/dist/slices/project-templates/setup-sections.js +26 -0
  380. package/dist/slices/project-templates/setup.js +14 -1
  381. package/dist/slices/project-templates/stand-ins.js +22 -0
  382. package/dist/slices/rebuild/activity.js +2 -0
  383. package/dist/slices/rebuild/admission-repo.js +3 -2
  384. package/dist/slices/rebuild/narration-history.js +4 -5
  385. package/dist/slices/rebuild/narration-retry.js +2 -1
  386. package/dist/slices/rebuild/preview-details.js +32 -14
  387. package/dist/slices/rebuild/preview-plan.js +3 -8
  388. package/dist/slices/rebuild/recipe-build.js +8 -3
  389. package/dist/slices/rebuild/recipe-describe.js +3 -3
  390. package/dist/slices/rebuild/recipe-digest.js +58 -0
  391. package/dist/slices/rebuild/recipe-input-schema.js +10 -0
  392. package/dist/slices/rebuild/recipe-keywords.js +71 -0
  393. package/dist/slices/rebuild/recipe-legacy.js +5 -1
  394. package/dist/slices/rebuild/recipe-model.js +4 -0
  395. package/dist/slices/rebuild/recipe-narration-text.js +2 -1
  396. package/dist/slices/rebuild/recipe-preparation.js +4 -4
  397. package/dist/slices/rebuild/recipe-reference.js +8 -4
  398. package/dist/slices/rebuild/recipe-reviews.js +27 -7
  399. package/dist/slices/rebuild/recipe-save.js +8 -5
  400. package/dist/slices/rebuild/recipe-scenes.js +40 -11
  401. package/dist/slices/rebuild/recipe-shorts.js +8 -8
  402. package/dist/slices/rebuild/recipe-social.js +46 -0
  403. package/dist/slices/rebuild/recipe-text.js +64 -20
  404. package/dist/slices/rebuild/recipe-validation.js +102 -31
  405. package/dist/slices/rebuild/recipe-visual.js +55 -16
  406. package/dist/slices/rebuild/recipe-voices.js +3 -2
  407. package/dist/slices/rebuild/recipe-work.js +19 -7
  408. package/dist/slices/rebuild/recipe-youtube.js +4 -3
  409. package/dist/slices/rebuild/recovery-selection.js +3 -1
  410. package/dist/slices/rebuild/recovery.js +9 -8
  411. package/dist/slices/rebuild/remake-outdated.js +5 -5
  412. package/dist/slices/rebuild/repo.js +4 -3
  413. package/dist/slices/rebuild/review-promise.js +25 -0
  414. package/dist/slices/rebuild/review-redo.js +3 -2
  415. package/dist/slices/rebuild/runtime-admission.js +4 -3
  416. package/dist/slices/rebuild/runtime-agent-review.js +11 -5
  417. package/dist/slices/rebuild/runtime-animate.js +10 -9
  418. package/dist/slices/rebuild/runtime-article.js +7 -5
  419. package/dist/slices/rebuild/runtime-checkpoints.js +5 -4
  420. package/dist/slices/rebuild/runtime-document.js +11 -13
  421. package/dist/slices/rebuild/runtime-export-bed.js +8 -12
  422. package/dist/slices/rebuild/runtime-export-edit.js +8 -16
  423. package/dist/slices/rebuild/runtime-export-inputs.js +12 -11
  424. package/dist/slices/rebuild/runtime-export-short.js +9 -5
  425. package/dist/slices/rebuild/runtime-export.js +38 -15
  426. package/dist/slices/rebuild/runtime-figure-card.js +2 -1
  427. package/dist/slices/rebuild/runtime-image.js +8 -12
  428. package/dist/slices/rebuild/runtime-instructions.js +2 -0
  429. package/dist/slices/rebuild/runtime-keywords.js +59 -0
  430. package/dist/slices/rebuild/runtime-lines.js +2 -11
  431. package/dist/slices/rebuild/runtime-local.js +17 -22
  432. package/dist/slices/rebuild/runtime-narration-publication.js +2 -5
  433. package/dist/slices/rebuild/runtime-narration-reuse.js +9 -13
  434. package/dist/slices/rebuild/runtime-narration-text.js +13 -17
  435. package/dist/slices/rebuild/runtime-pictures.js +2 -4
  436. package/dist/slices/rebuild/runtime-piece-label.js +10 -6
  437. package/dist/slices/rebuild/runtime-plan.js +31 -5
  438. package/dist/slices/rebuild/runtime-provider.js +67 -25
  439. package/dist/slices/rebuild/runtime-publication.js +10 -9
  440. package/dist/slices/rebuild/runtime-review.js +39 -33
  441. package/dist/slices/rebuild/runtime-run.js +4 -1
  442. package/dist/slices/rebuild/runtime-shorts.js +31 -50
  443. package/dist/slices/rebuild/runtime-store.js +20 -10
  444. package/dist/slices/rebuild/runtime-subtitles.js +28 -25
  445. package/dist/slices/rebuild/runtime-voices.js +10 -16
  446. package/dist/slices/rebuild/runtime-youtube.js +14 -31
  447. package/dist/slices/rebuild/service-readiness.js +11 -3
  448. package/dist/slices/rebuild/transition-repo.js +6 -5
  449. package/dist/slices/rebuild/work-records.js +6 -0
  450. package/dist/slices/reruns/cascade.js +1 -2
  451. package/dist/slices/reruns/index.js +6 -9
  452. package/dist/slices/research/synthesis.js +3 -2
  453. package/dist/slices/reviews/external-model.js +4 -1
  454. package/dist/slices/reviews/external-repo.js +2 -1
  455. package/dist/slices/reviews/external-rows.js +2 -3
  456. package/dist/slices/reviews/holds.js +5 -4
  457. package/dist/slices/reviews/model.js +32 -11
  458. package/dist/slices/reviews/repo.js +2 -1
  459. package/dist/slices/reviews/rules.js +4 -3
  460. package/dist/slices/reviews/verdict.js +2 -1
  461. package/dist/slices/reviews/view.js +5 -2
  462. package/dist/slices/revisions/downloads.js +4 -5
  463. package/dist/slices/revisions/image-plan.js +1 -1
  464. package/dist/slices/revisions/mutation-assets.js +9 -5
  465. package/dist/slices/revisions/mutation-cues.js +2 -5
  466. package/dist/slices/revisions/mutations.js +3 -3
  467. package/dist/slices/revisions/repo.js +3 -1
  468. package/dist/slices/revisions/schema.js +1 -0
  469. package/dist/slices/revisions/view.js +20 -0
  470. package/dist/slices/run-cost/limits.js +5 -2
  471. package/dist/slices/run-cost/meter.js +12 -5
  472. package/dist/slices/run-cost/panel.js +8 -74
  473. package/dist/slices/run-cost/plan-readings.js +127 -0
  474. package/dist/slices/run-cost/plan-use.js +169 -0
  475. package/dist/slices/run-cost/pricing.js +3 -3
  476. package/dist/slices/run-cost/week.js +32 -4
  477. package/dist/slices/schedules/agenda.js +18 -7
  478. package/dist/slices/schedules/by-date.js +42 -0
  479. package/dist/slices/schedules/calendar.js +5 -0
  480. package/dist/slices/schedules/design-agenda.js +36 -0
  481. package/dist/slices/schedules/design-check.js +41 -0
  482. package/dist/slices/schedules/design-run.js +126 -0
  483. package/dist/slices/schedules/next-run.js +62 -0
  484. package/dist/slices/schedules/prepare.js +18 -2
  485. package/dist/slices/schedules/repo.js +30 -21
  486. package/dist/slices/schedules/rescore.js +35 -0
  487. package/dist/slices/schedules/scheduler.js +13 -3
  488. package/dist/slices/schedules/schema.js +57 -3
  489. package/dist/slices/schedules/score.js +107 -0
  490. package/dist/slices/schedules/service.js +57 -24
  491. package/dist/slices/schedules/topic-list.js +15 -0
  492. package/dist/slices/schedules/topic-scores.js +104 -0
  493. package/dist/slices/schedules/topics.js +53 -41
  494. package/dist/slices/settings/cli-paths.js +4 -6
  495. package/dist/slices/settings/first-run.js +8 -43
  496. package/dist/slices/settings/health.js +30 -15
  497. package/dist/slices/settings/key-test.js +1 -1
  498. package/dist/slices/settings/model-reach.js +3 -17
  499. package/dist/slices/settings/model.js +14 -2
  500. package/dist/slices/settings/playback.js +34 -23
  501. package/dist/slices/settings/probe-read.js +16 -0
  502. package/dist/slices/settings/repo.js +33 -0
  503. package/dist/slices/settings/tutorial.js +2 -2
  504. package/dist/slices/settings/voices.js +4 -12
  505. package/dist/slices/shorts/keep.js +2 -1
  506. package/dist/slices/shorts/pick.js +6 -18
  507. package/dist/slices/shorts/prompts.js +4 -14
  508. package/dist/slices/shorts/render.js +6 -2
  509. package/dist/slices/social/channel.js +44 -0
  510. package/dist/slices/social/defaults.js +17 -0
  511. package/dist/slices/social/due.js +36 -0
  512. package/dist/slices/social/extension.js +18 -0
  513. package/dist/slices/social/fit.js +115 -0
  514. package/dist/slices/social/limits.js +186 -0
  515. package/dist/slices/social/links.js +21 -0
  516. package/dist/slices/social/media.js +132 -0
  517. package/dist/slices/social/model.js +75 -0
  518. package/dist/slices/social/notice.js +19 -0
  519. package/dist/slices/social/pack.js +176 -0
  520. package/dist/slices/social/post-prompt.js +56 -0
  521. package/dist/slices/social/queue.js +31 -0
  522. package/dist/slices/social/repo.js +133 -0
  523. package/dist/slices/social/reshape.js +97 -0
  524. package/dist/slices/social/rules.js +5 -0
  525. package/dist/slices/social/schema.js +70 -0
  526. package/dist/slices/social/serve.js +51 -0
  527. package/dist/slices/social/service.js +129 -0
  528. package/dist/slices/social/settings.js +21 -0
  529. package/dist/slices/social/sources.js +114 -0
  530. package/dist/slices/social/state.js +110 -0
  531. package/dist/slices/social/text.js +149 -0
  532. package/dist/slices/storage/arrange.js +3 -1
  533. package/dist/slices/storage/assets.js +8 -10
  534. package/dist/slices/storage/backup-designs.js +74 -0
  535. package/dist/slices/storage/backup-export.js +8 -3
  536. package/dist/slices/storage/backup-format.js +10 -0
  537. package/dist/slices/storage/backup-import.js +22 -4
  538. package/dist/slices/storage/delete-project.js +6 -5
  539. package/dist/slices/storage/files-location.js +6 -8
  540. package/dist/slices/storage/layout.js +13 -2
  541. package/dist/slices/storage/model.js +3 -0
  542. package/dist/slices/storage/portable.js +17 -12
  543. package/dist/slices/storage/schema.js +2 -0
  544. package/dist/slices/storage/staging-refs.js +2 -1
  545. package/dist/slices/storage/staging.js +6 -9
  546. package/dist/slices/storage/trim.js +26 -9
  547. package/dist/slices/studio/calendar.js +7 -2
  548. package/dist/slices/studio/disclosure.js +4 -4
  549. package/dist/slices/studio/model.js +1 -1
  550. package/dist/slices/studio/pack.js +9 -8
  551. package/dist/slices/studio/pick.js +2 -11
  552. package/dist/slices/studio/plan.js +7 -16
  553. package/dist/slices/studio/queue.js +3 -14
  554. package/dist/slices/studio/releases.js +26 -0
  555. package/dist/slices/studio/settings.js +20 -57
  556. package/dist/slices/studio/videos.js +35 -4
  557. package/dist/slices/style-preview/render.js +37 -16
  558. package/dist/slices/style-preview/schema.js +14 -1
  559. package/dist/slices/style-preview/service.js +2 -1
  560. package/dist/slices/style-preview/settings.js +33 -5
  561. package/dist/slices/subtitles/captions.js +1 -1
  562. package/dist/slices/telemetry/collector-client.js +2 -4
  563. package/dist/slices/telemetry/flush.js +2 -4
  564. package/dist/slices/telemetry/model.js +0 -7
  565. package/dist/slices/telemetry/record.js +10 -3
  566. package/dist/slices/template-studio/anatomy-view.js +161 -0
  567. package/dist/slices/template-studio/anatomy.js +73 -0
  568. package/dist/slices/template-studio/bakeoff-make.js +225 -0
  569. package/dist/slices/template-studio/bakeoff-repo.js +83 -0
  570. package/dist/slices/template-studio/bakeoff.js +333 -0
  571. package/dist/slices/template-studio/budget.js +106 -0
  572. package/dist/slices/template-studio/cards.js +78 -0
  573. package/dist/slices/template-studio/checks.js +322 -0
  574. package/dist/slices/template-studio/document-sample.js +56 -0
  575. package/dist/slices/template-studio/edit.js +15 -0
  576. package/dist/slices/template-studio/for-all.js +161 -0
  577. package/dist/slices/template-studio/free-video.js +31 -0
  578. package/dist/slices/template-studio/free.js +176 -0
  579. package/dist/slices/template-studio/gate.js +40 -0
  580. package/dist/slices/template-studio/hidden.js +20 -0
  581. package/dist/slices/template-studio/jobs.js +79 -0
  582. package/dist/slices/template-studio/loudness.js +111 -0
  583. package/dist/slices/template-studio/make.js +40 -0
  584. package/dist/slices/template-studio/model.js +58 -0
  585. package/dist/slices/template-studio/pack-import.js +253 -0
  586. package/dist/slices/template-studio/pack-samples.js +60 -0
  587. package/dist/slices/template-studio/pack.js +207 -0
  588. package/dist/slices/template-studio/paid-view.js +66 -0
  589. package/dist/slices/template-studio/paid.js +355 -0
  590. package/dist/slices/template-studio/quote.js +155 -0
  591. package/dist/slices/template-studio/ready.js +104 -0
  592. package/dist/slices/template-studio/repo.js +134 -0
  593. package/dist/slices/template-studio/reviews-path.js +58 -0
  594. package/dist/slices/template-studio/runner.js +84 -0
  595. package/dist/slices/template-studio/save.js +236 -0
  596. package/dist/slices/template-studio/say-it-as.js +248 -0
  597. package/dist/slices/template-studio/schedule-gate.js +34 -0
  598. package/dist/slices/template-studio/schedule-price.js +32 -0
  599. package/dist/slices/template-studio/schedule-sample.js +91 -0
  600. package/dist/slices/template-studio/schema.js +243 -0
  601. package/dist/slices/template-studio/scope.js +124 -0
  602. package/dist/slices/template-studio/sections.js +176 -0
  603. package/dist/slices/template-studio/service.js +175 -0
  604. package/dist/slices/template-studio/status.js +191 -0
  605. package/dist/slices/template-studio/topic.js +223 -0
  606. package/dist/slices/thumbnail/by-llm.js +1 -1
  607. package/dist/slices/trash/designs.js +76 -0
  608. package/dist/slices/trash/model.js +13 -4
  609. package/dist/slices/trash/service.js +52 -2
  610. package/dist/slices/tutorials/library.js +3 -2
  611. package/dist/slices/uploads/repo.js +37 -1
  612. package/dist/slices/uploads/rules.js +3 -2
  613. package/dist/slices/video/ass-text.js +17 -0
  614. package/dist/slices/video/audio-export.js +2 -64
  615. package/dist/slices/video/edit-list.js +2 -2
  616. package/dist/slices/video/edit-settings.js +1 -1
  617. package/dist/slices/video/encoding.js +169 -0
  618. package/dist/slices/video/ffmpeg.js +23 -21
  619. package/dist/slices/video/figure-card.js +1 -15
  620. package/dist/slices/video/plan.js +2 -1
  621. package/dist/slices/video/slideshow.js +43 -18
  622. package/dist/slices/voices/attribution.js +3 -2
  623. package/dist/slices/voices/model.js +9 -8
  624. package/dist/slices/voices/palette.js +0 -3
  625. package/dist/slices/voices/script.js +2 -1
  626. package/dist/slices/youtube/answer.js +4 -16
  627. package/dist/slices/youtube/edits-repo.js +3 -12
  628. package/dist/tutorials/AI-CLIs.md +25 -25
  629. package/dist/tutorials/Agents-MCP.md +34 -33
  630. package/dist/tutorials/Assistant.md +42 -0
  631. package/dist/tutorials/Backups.md +7 -7
  632. package/dist/tutorials/Calendar.md +17 -25
  633. package/dist/tutorials/Cast-Library.md +19 -19
  634. package/dist/tutorials/Channels.md +42 -35
  635. package/dist/tutorials/Costs-and-Run-Cost.md +38 -40
  636. package/dist/tutorials/Create-Article.md +114 -0
  637. package/dist/tutorials/Create-Extras.md +112 -0
  638. package/dist/tutorials/Create-Images.md +165 -0
  639. package/dist/tutorials/Create-Narration.md +178 -0
  640. package/dist/tutorials/Create-Overview.md +244 -0
  641. package/dist/tutorials/Create-Video-and-Style.md +144 -0
  642. package/dist/tutorials/Docker.md +3 -3
  643. package/dist/tutorials/Document-Themes.md +32 -32
  644. package/dist/tutorials/Editing-a-Project.md +94 -94
  645. package/dist/tutorials/FAQ.md +18 -18
  646. package/dist/tutorials/First-Launch-and-Welcome.md +50 -64
  647. package/dist/tutorials/Home-and-Projects.md +115 -71
  648. package/dist/tutorials/Home.md +33 -33
  649. package/dist/tutorials/Install.md +14 -13
  650. package/dist/tutorials/Intros-and-Outros.md +33 -34
  651. package/dist/tutorials/Keyboard-Shortcuts-and-Command-Palette.md +62 -58
  652. package/dist/tutorials/Keywords-Slopify-Fills.md +87 -0
  653. package/dist/tutorials/Models.md +53 -21
  654. package/dist/tutorials/Multiple-Voices.md +41 -40
  655. package/dist/tutorials/Narration-Aliases-and-Glossary.md +14 -14
  656. package/dist/tutorials/Notifications.md +27 -17
  657. package/dist/tutorials/Other-Languages.md +15 -15
  658. package/dist/tutorials/PDF-Documents.md +38 -29
  659. package/dist/tutorials/Posting-to-Social-Sites.md +121 -0
  660. package/dist/tutorials/Project-Page.md +118 -120
  661. package/dist/tutorials/Prompts-and-Templates.md +84 -0
  662. package/dist/tutorials/Prompts.md +48 -44
  663. package/dist/tutorials/Providers-and-Keys.md +105 -98
  664. package/dist/tutorials/Publishing-to-YouTube.md +31 -31
  665. package/dist/tutorials/Recovery-and-Retries.md +31 -31
  666. package/dist/tutorials/Remote-Access.md +63 -0
  667. package/dist/tutorials/Reviews-and-Checkpoints.md +98 -90
  668. package/dist/tutorials/Schedules.md +46 -27
  669. package/dist/tutorials/Settings-Reference.md +194 -174
  670. package/dist/tutorials/Shorts.md +34 -33
  671. package/dist/tutorials/Start-at-Login.md +3 -3
  672. package/dist/tutorials/Studio-Extension.md +22 -24
  673. package/dist/tutorials/Template-Studio.md +128 -0
  674. package/dist/tutorials/Templates.md +51 -77
  675. package/dist/tutorials/Trash.md +4 -4
  676. package/dist/tutorials/Troubleshooting.md +44 -44
  677. package/dist/tutorials/Uninstalling-and-Moving.md +5 -5
  678. package/dist/tutorials/Updating-and-Patch-Notes.md +18 -18
  679. package/dist/tutorials/Video-Editing.md +34 -34
  680. package/dist/tutorials/Where-Your-Files-Live.md +10 -10
  681. package/dist/tutorials/YouTube-Description.md +26 -26
  682. package/dist/tutorials/Your-First-Short.md +35 -35
  683. package/dist/tutorials/_Sidebar.md +19 -14
  684. package/dist/updater/work-in-progress.js +42 -12
  685. package/dist/web/assets/index-BNftKQrA.css +1 -0
  686. package/dist/web/assets/index-Cpa58woP.js +459 -0
  687. package/dist/web/assets/pdf-BKh8f7R6.js +56 -0
  688. package/dist/web/assets/pdf.worker.min-BmVo14Nb.mjs +28 -0
  689. package/dist/web/assets/pdf.worker.min-D7i8o3wR.js +1 -0
  690. package/dist/web/index.html +2 -2
  691. package/package.json +6 -2
  692. package/dist/slices/article/provided-entries.js +0 -66
  693. package/dist/slices/article/run.js +0 -145
  694. package/dist/slices/images/run.js +0 -234
  695. package/dist/slices/narration/legacy-plan.js +0 -58
  696. package/dist/slices/narration/run.js +0 -270
  697. package/dist/slices/rebuild/runtime-actions.js +0 -90
  698. package/dist/slices/research/run.js +0 -224
  699. package/dist/slices/subtitles/prepare.js +0 -194
  700. package/dist/slices/subtitles/transcript.js +0 -34
  701. package/dist/slices/thumbnail/run.js +0 -219
  702. package/dist/slices/video/audio-inputs.js +0 -33
  703. package/dist/slices/video/reuse-audio.js +0 -62
  704. package/dist/slices/video/run.js +0 -78
  705. package/dist/slices/video/write-export.js +0 -158
  706. package/dist/slices/video/write-subtitles.js +0 -59
  707. package/dist/tutorials/Library-Overview.md +0 -76
  708. package/dist/tutorials/Play-Images.md +0 -161
  709. package/dist/tutorials/Play-Narration.md +0 -167
  710. package/dist/tutorials/Play-Outputs.md +0 -109
  711. package/dist/tutorials/Play-Overview.md +0 -227
  712. package/dist/tutorials/Play-Title-and-Article.md +0 -136
  713. package/dist/tutorials/Play-Video-and-Style.md +0 -143
  714. package/dist/web/assets/index-BadsoORk.css +0 -1
  715. package/dist/web/assets/index-D8LqNsCl.js +0 -326
  716. package/dist/web/assets/pdf-T7MCwjIv.js +0 -54
  717. package/dist/web/assets/pdf.worker.min-Dswkl-cV.mjs +0 -29
  718. package/dist/web/assets/pdf.worker.min-zC6nfbxG.js +0 -1
@@ -1,5 +1,7 @@
1
1
  import { remark } from "remark";
2
2
  import remarkGfm from "remark-gfm";
3
+ import { internalError } from "../../kernel/errors.js";
4
+ import { createRows, editSettings } from "../../kernel/ports/settings-places.js";
3
5
  import { remembered } from "../../kernel/remembered.js";
4
6
  export const currentPronunciationRules = 2;
5
7
  export function pronunciationRulesOf(config) {
@@ -153,7 +155,7 @@ function parseGlossary(markdown, language, rules = currentPronunciationRules) {
153
155
  export function skippedGlossaryNotice(skipped, unpronounced = 0) {
154
156
  if (skipped.length === 0 && unpronounced === 0)
155
157
  return null;
156
- const where = "in the Pronunciation Glossary at the end of the article in Edit project → Article";
158
+ const where = `in the Pronunciation Glossary at the end of the article in ${editSettings.article}`;
157
159
  const blank = unpronounced === 0
158
160
  ? ""
159
161
  : `${unpronounced === 1 ? "1 name has" : `${unpronounced} names have`} no pronunciation given and ${unpronounced === 1 ? "is" : "are"} read as written. To give ${unpronounced === 1 ? "it one" : "them one"}, fill in its IPA ${where}.`;
@@ -178,7 +180,7 @@ export function skippedSpeakerPronunciationsNotice(rows) {
178
180
  return null;
179
181
  const parts = rows.map((row) => `${row.speaker}: ${row.skipped.map((one) => `entry ${one.row}: ${one.reason}`).join("; ")}`);
180
182
  return (`Speaker pronunciations: some entries are skipped and read as ordinary text (${parts.join(". ")}). ` +
181
- "The rest are used. To use them, fix those entries under Speakers → Pronunciations for that speaker (Play → Narration, or Edit project → Providers).");
183
+ `The rest are used. To use them, fix those entries under Speakers → Pronunciations for that speaker (${createRows.narration}, or ${editSettings.narration}).`);
182
184
  }
183
185
  // Remembered (`kernel/remembered.ts`): every plan rebuild matches the whole narration again.
184
186
  export const pronunciationMatches = remembered(1024, (source, entries, possessives) => `${possessives === true ? "p" : "-"}\u0000${source}\u0000${JSON.stringify(entries)}`, matchPronunciations);
@@ -211,7 +213,7 @@ function matchPronunciations(source, entries, possessives = false) {
211
213
  continue;
212
214
  const entry = ordered.find((_, index) => match[index + 1] !== undefined);
213
215
  if (entry === undefined)
214
- throw new Error("Slopify hit an internal error (a pronunciation glossary term has no pronunciation). Try again; if it happens again, use Download diagnostics in Settings and report it.");
216
+ throw new Error(internalError("a pronunciation glossary term has no pronunciation"));
215
217
  const possessive = possessives ? match[ordered.length + 1] : undefined;
216
218
  matches.push({
217
219
  start: match.index,
@@ -237,7 +239,7 @@ export function pronunciationSpans(source, entries, possessives = false) {
237
239
  for (const [index, word] of words.entries()) {
238
240
  const ipa = match.entry.ipa[index];
239
241
  if (ipa === undefined)
240
- throw new Error("Slopify hit an internal error (a pronunciation glossary term is missing a word). Try again; if it happens again, use Download diagnostics in Settings and report it.");
242
+ throw new Error(internalError("a pronunciation glossary term is missing a word"));
241
243
  const start = match.start + word.index;
242
244
  const spoken = match.possessive !== undefined && index === words.length - 1 ? withPossessive(ipa) : ipa;
243
245
  spans.push({ start, end: start + word[0].length, text: `/${spoken}/` });
@@ -1,3 +1,4 @@
1
+ import { internalError } from "../../kernel/errors.js";
1
2
  import { sourceSentences } from "./preparation.js";
2
3
  const cannotFit = {
3
4
  ok: false,
@@ -9,14 +10,14 @@ function atoms(source, from, to, spans) {
9
10
  const span = spans.get(at);
10
11
  if (span !== undefined) {
11
12
  if (span.end > to || span.end <= at)
12
- throw new Error("Slopify hit an internal error (a pronunciation fix spans more than one word). Try again; if it happens again, use Download diagnostics in Settings and report it.");
13
+ throw new Error(internalError("a pronunciation fix spans more than one word"));
13
14
  result.push({ text: span.text, spokenText: source.slice(at, span.end) });
14
15
  at = span.end;
15
16
  }
16
17
  else {
17
18
  const point = source.codePointAt(at);
18
19
  if (point === undefined)
19
- throw new Error("Slopify hit an internal error (a narration position is outside the article text). Try again; if it happens again, use Download diagnostics in Settings and report it.");
20
+ throw new Error(internalError("a narration position is outside the article text"));
20
21
  const text = String.fromCodePoint(point);
21
22
  // An empty span is a later word of a multi-word alias (its spoken form sits on the first
22
23
  // word), so the whitespace in front of it would leave two spaces where one word was.
@@ -45,7 +46,7 @@ function checkedSpans(source, pronunciation) {
45
46
  span.end <= span.start ||
46
47
  span.end > source.length ||
47
48
  !/^[^\s\uD800-\uDFFF]+$/u.test(source.slice(span.start, span.end)))
48
- throw new Error("Slopify hit an internal error (pronunciation fixes overlap or split a word). Try again; if it happens again, use Download diagnostics in Settings and report it.");
49
+ throw new Error(internalError("pronunciation fixes overlap or split a word"));
49
50
  spans.set(span.start, span);
50
51
  end = span.end;
51
52
  }
@@ -1,3 +1,4 @@
1
+ import { errorText } from "../../kernel/errors.js";
1
2
  import { redact } from "../../kernel/log.js";
2
3
  import { webhookBody } from "./address.js";
3
4
  import { autoPassNoticeText, noticeOf, noticeText, reviewNoticeText, runNotices, topicsNoticeText, } from "./rules.js";
@@ -84,7 +85,7 @@ export function createRunNotifier(deps) {
84
85
  .catch((error) => {
85
86
  deps.log.write("warn", "notification.failed", {
86
87
  ...about,
87
- detail: `${kind} notification not delivered: ${error instanceof Error ? error.message : String(error)}`,
88
+ detail: `${kind} notification not delivered: ${errorText(error)}`,
88
89
  });
89
90
  })
90
91
  .finally(() => {
@@ -123,7 +124,7 @@ export function createRunNotifier(deps) {
123
124
  catch (error) {
124
125
  deps.log.write("warn", "notification.failed", {
125
126
  projectId: event.projectId,
126
- detail: `notification skipped: ${error instanceof Error ? error.message : String(error)}`,
127
+ detail: `notification skipped: ${errorText(error)}`,
127
128
  });
128
129
  }
129
130
  },
@@ -138,7 +139,7 @@ export function createRunNotifier(deps) {
138
139
  }
139
140
  catch (error) {
140
141
  deps.log.write("warn", "notification.failed", {
141
- detail: `topics notification skipped: ${error instanceof Error ? error.message : String(error)}`,
142
+ detail: `topics notification skipped: ${errorText(error)}`,
142
143
  });
143
144
  }
144
145
  },
@@ -29,6 +29,7 @@ const reviewItemNames = {
29
29
  narration: "the narration",
30
30
  thumbnail: "the thumbnail",
31
31
  shorts: "a short",
32
+ promise: "the article's opening (promise check)",
32
33
  };
33
34
  export function reviewNoticeText(subject) {
34
35
  const title = subject.title.trim() === "" ? "Untitled project" : subject.title.trim();
@@ -48,6 +49,8 @@ export function reviewItemName(itemKey, imageOrder) {
48
49
  return "the article";
49
50
  if (itemKey === "narration")
50
51
  return "the narration";
52
+ if (itemKey === "promise")
53
+ return "the article's opening (promise check)";
51
54
  if (itemKey === "thumbnail:image")
52
55
  return "the thumbnail";
53
56
  const variant = /^thumbnail:image:(\d+)$/.exec(itemKey);
@@ -139,8 +142,8 @@ export function shortReason(reason) {
139
142
  }
140
143
  export function noticeText(kind, subject) {
141
144
  const text = runNoticeText(kind, subject);
142
- return subject.startedBy === "agent"
143
- ? { ...text, headline: `${text.headline} · started by agent` }
145
+ return subject.startedBy === "agent" || subject.startedBy === "assistant"
146
+ ? { ...text, headline: `${text.headline} · started by ${subject.startedBy}` }
144
147
  : text;
145
148
  }
146
149
  function runNoticeText(kind, subject) {
@@ -1,19 +1,11 @@
1
- import { readSetting, writeSetting } from "../settings/repo.js";
1
+ import { z } from "zod";
2
+ import { deleteSetting, readJsonSetting, writeSetting } from "../settings/repo.js";
2
3
  import { notificationUrlProblem } from "./address.js";
3
4
  // Its own row in the key/value `settings` table. Backups leave it out
4
5
  // (`slices/storage/portable.ts`): an ntfy topic in the URL is as good as a password.
5
6
  export const notificationUrlKey = "notificationUrl";
6
7
  export function readNotificationUrl(db) {
7
- const stored = readSetting(db, notificationUrlKey);
8
- if (stored === undefined)
9
- return null;
10
- let value;
11
- try {
12
- value = JSON.parse(stored);
13
- }
14
- catch {
15
- return null;
16
- }
8
+ const value = readJsonSetting(db, notificationUrlKey, z.unknown(), null);
17
9
  // A hand-edited row that no longer passes the rules is treated as not set rather than
18
10
  // POSTed to.
19
11
  return typeof value === "string" && value !== "" && notificationUrlProblem(value) === undefined
@@ -26,7 +18,7 @@ export function saveNotificationUrl(db, raw) {
26
18
  return { ok: false, message: problem };
27
19
  const url = raw.trim();
28
20
  if (url === "") {
29
- db.prepare("DELETE FROM settings WHERE key = ?").run(notificationUrlKey);
21
+ deleteSetting(db, notificationUrlKey);
30
22
  return { ok: true, url: null };
31
23
  }
32
24
  writeSetting(db, notificationUrlKey, JSON.stringify(url));
@@ -3,17 +3,18 @@ import { projectById, stagesOf } from "../admission/repo.js";
3
3
  import { stepFailedWhileWaiting } from "../admission/state-words.js";
4
4
  import { lastStarter } from "../agents/repo.js";
5
5
  import { projectHolds } from "../reviews/holds.js";
6
- import { uploadedAndSettled } from "../uploads/repo.js";
6
+ import { isTemplateSample } from "../template-studio/repo.js";
7
+ import { settledProjects } from "../uploads/repo.js";
7
8
  import { settledStatus } from "../uploads/rules.js";
8
9
  import { atItsDay, failuresOf } from "./rules.js";
9
10
  // What a notification says about a project, read at the moment it goes out, by the rule the
10
11
  // Projects list reads it with (`edge/http/projects.ts`).
11
12
  export function noticeSubject(db, projectId) {
12
13
  const project = projectById(db, projectId);
13
- if (project === undefined)
14
+ if (project === undefined || isTemplateSample(db, projectId))
14
15
  return undefined;
15
16
  const stages = stagesOf(db, projectId);
16
- const settled = uploadedAndSettled(db, projectId);
17
+ const settled = settledProjects(db, projectId);
17
18
  const holds = projectHolds(db, { projectId, standings: new Map([[projectId, stages]]), settled });
18
19
  const status = settledStatus(derive(stages, project.paused), settled.has(projectId));
19
20
  const failures = failuresOf(stages);
@@ -1,6 +1,7 @@
1
1
  import { copyFileSync, lstatSync, mkdirSync, readdirSync, rmSync } from "node:fs";
2
2
  import { dirname, join, relative, sep } from "node:path";
3
3
  import { transact } from "../../kernel/db/tx.js";
4
+ import { internalError } from "../../kernel/errors.js";
4
5
  import { executionPlan } from "../rebuild/runtime-plan.js";
5
6
  import { currentRevisionId } from "../revisions/repo.js";
6
7
  import { getRevisionView } from "../revisions/view.js";
@@ -11,7 +12,7 @@ import { projectDir } from "../storage/layout.js";
11
12
  // ceiling: one pass per layer of the step graph (text, narration, timing, picks, prompts,
12
13
  // images, renders); far more than any plan has.
13
14
  const rebindPasses = 40;
14
- export function copyProject(deps, sourceId, title) {
15
+ export function copyProject(deps, sourceId, title, { renamed = false } = {}) {
15
16
  const source = projectDir(deps.paths, sourceId);
16
17
  const tables = projectTables.map((table) => [table, projectRows(deps.db, table, sourceId)]);
17
18
  const ids = new Map([[sourceId, deps.ids.next()]]);
@@ -33,6 +34,9 @@ export function copyProject(deps, sourceId, title) {
33
34
  const projectId = ids.get(sourceId) ?? sourceId;
34
35
  const target = projectDir(deps.paths, projectId);
35
36
  const at = deps.clock.now().toISOString();
37
+ const named = (row) => renamed && typeof row.config === "string"
38
+ ? { ...row, config: renameConfig(row.config, title) }
39
+ : row;
36
40
  try {
37
41
  for (const file of listFiles(source)) {
38
42
  if (file === projectMarker)
@@ -51,7 +55,11 @@ export function copyProject(deps, sourceId, title) {
51
55
  column,
52
56
  typeof value === "string" ? remap(value) : value,
53
57
  ]));
54
- insert(deps.db, table, table === "projects" ? { ...copied, title, created_at: at, updated_at: at } : copied);
58
+ insert(deps.db, table, table === "projects"
59
+ ? { ...named(copied), title, created_at: at, updated_at: at }
60
+ : table === "project_revisions"
61
+ ? named(copied)
62
+ : copied);
55
63
  }
56
64
  rebind(deps, projectId);
57
65
  });
@@ -62,6 +70,16 @@ export function copyProject(deps, sourceId, title) {
62
70
  }
63
71
  return { projectId };
64
72
  }
73
+ // A stored config (JSON) under a new title, keeping what it was made about.
74
+ function renameConfig(config, title) {
75
+ const parsed = JSON.parse(config);
76
+ if (typeof parsed !== "object" || parsed === null || !("title" in parsed))
77
+ return config;
78
+ const before = parsed;
79
+ if (typeof before.title !== "string" || before.title === title)
80
+ return config;
81
+ return JSON.stringify({ ...before, title, subjectTitle: before.subjectTitle ?? before.title });
82
+ }
65
83
  // Re-stamps the copy's finished steps with the fingerprints its own ids give them.
66
84
  function rebind(deps, projectId) {
67
85
  const revisionId = currentRevisionId(deps.db, projectId);
@@ -104,7 +122,7 @@ function rebind(deps, projectId) {
104
122
  .prepare(`UPDATE ${table} SET ${column}=replace(${column},?,?) WHERE project_id=? AND instr(${column},?)>0`)
105
123
  .run(before, after, projectId, before);
106
124
  }
107
- throw new Error("Slopify hit an internal error (the copy of the sample kept changing while its steps were matched up). Delete the copy and try Make my own copy again; if it happens again, use Download diagnostics in Settings and report it.");
125
+ throw new Error(internalError("the copy of the sample kept changing while its steps were matched up", "Delete the copy and try Make my own copy again"));
108
126
  }
109
127
  function requestOf(payload) {
110
128
  try {
@@ -1,26 +1,35 @@
1
- import { readinessIsUsable } from "../../kernel/ports/model.js";
2
1
  import { templateById } from "../project-templates/repo.js";
3
- import { starterPacks } from "./packs.js";
2
+ import { listVoices } from "../settings/repo.js";
3
+ import { notTemplateSample } from "../template-studio/repo.js";
4
+ import { starterPacks, starterSet } from "./packs.js";
5
+ import { shortReadiness } from "./quick-short.js";
4
6
  import { sampleProjectIds } from "./sample.js";
5
7
  import { firstRunDismissed, readPackRecords } from "./state.js";
6
8
  // The first-run screen shows on a fresh install and never again once it is skipped or a real
7
- // project (anything but the samples) exists. Reading it writes nothing: a real project that
9
+ // project (anything but the samples and the template studio's hidden projects) exists. Reading it writes nothing: a real project that
8
10
  // exists before the screen was recorded as done is reported as `settle`, and the client
9
11
  // records it with POST /dismiss, so deleting every project later does not bring it back.
10
- export function firstRunView(db, statuses) {
12
+ export function firstRunView(db, statuses,
13
+ // How to install the computer's voice here, for the checklist's voice line.
14
+ install) {
11
15
  const samples = sampleProjectIds(db);
12
16
  const real = db
13
- .prepare("SELECT 1 FROM projects WHERE id IS NOT ? AND id IS NOT ? AND id IS NOT ? LIMIT 1")
17
+ .prepare(`SELECT 1 FROM projects WHERE id IS NOT ? AND id IS NOT ? AND id IS NOT ? AND ${notTemplateSample()} LIMIT 1`)
14
18
  .get(samples.library, samples.audiobook, samples.podcast) !== undefined;
15
19
  const dismissed = firstRunDismissed(db);
16
20
  const packs = readPackRecords(db);
17
21
  return {
18
22
  show: !real && !dismissed,
19
23
  settle: real && !dismissed,
20
- voice: firstVoice(statuses),
24
+ // Every starter pack suggests the same voice, so the starter set's stands for all of them.
25
+ needs: shortReadiness({
26
+ statuses,
27
+ voices: listVoices(db),
28
+ suggested: starterSet.voice,
29
+ install,
30
+ }),
21
31
  sampleProjectId: samples.library,
22
32
  samples,
23
- clis: detectedClis(statuses),
24
33
  // A pack counts as added only with its template: the first short adds a pack's prompts and
25
34
  // voice but no template, and Add pack must still be able to add that template later (or
26
35
  // again, after it was deleted).
@@ -37,36 +46,3 @@ export function firstRunView(db, statuses) {
37
46
  }),
38
47
  };
39
48
  }
40
- // Who would narrate a first short: a keyed voice provider when one has a key, else the
41
- // computer's own voice when a speech program was found.
42
- export function firstVoice(statuses) {
43
- const keyed = statuses.find((row) => row.family === "tts" && row.readiness.kind === "keyed" && readinessIsUsable(row.readiness));
44
- const system = statuses.find((row) => row.readiness.kind === "local")?.readiness;
45
- const local = system?.kind === "local" ? system : undefined;
46
- return {
47
- keyed: keyed?.displayName ?? null,
48
- system: {
49
- available: local?.available === true,
50
- engine: local?.engine ?? null,
51
- issue: local?.issue ?? null,
52
- },
53
- };
54
- }
55
- // What this machine can make without a key: each agent CLI Slopify found, and whether it
56
- // answers (installed, a supported version, signed in as far as the probe can tell).
57
- export function detectedClis(statuses) {
58
- return ["claude-code", "codex", "gemini"].map((id) => {
59
- const status = statuses.find((row) => row.id === id);
60
- const readiness = status?.readiness;
61
- const cli = readiness?.kind === "cli" ? readiness : undefined;
62
- return {
63
- id,
64
- name: status?.displayName ?? id,
65
- installed: cli?.installed === true,
66
- ready: cli?.installed === true && cli.issue === undefined,
67
- version: cli?.version ?? null,
68
- issue: cli?.issue ?? null,
69
- draws: id === "codex",
70
- };
71
- });
72
- }
@@ -26,7 +26,7 @@ export function fullVideoDraft(deps, input) {
26
26
  const config = project.config;
27
27
  if (!usesShortMode(config))
28
28
  return { ok: false, reason: "not-short" };
29
- const topic = config.values.topic?.trim() || project.title;
29
+ const topic = config.values.Topic?.trim() || config.values.topic?.trim() || project.title;
30
30
  const pack = shortPack(deps, config.articlePrompt ?? "");
31
31
  const document = packDocument(deps, pack);
32
32
  if (document === undefined)
@@ -46,7 +46,8 @@ export function fullVideoDraft(deps, input) {
46
46
  form: {
47
47
  ...form,
48
48
  title: project.title,
49
- values: { ...form.values, topic },
49
+ // {{Topic}} since 4.0; a pack installed before asks for {{topic}}.
50
+ values: { ...form.values, Topic: topic, topic },
50
51
  llm: provider(config.llm, form.llm),
51
52
  images: provider(config.images, form.images),
52
53
  audio: config.audio === undefined
@@ -1,9 +1,11 @@
1
1
  import { transact } from "../../kernel/db/tx.js";
2
+ import { internalError } from "../../kernel/errors.js";
2
3
  import { detectSlots } from "../admission/substitute.js";
3
4
  import { nameMax } from "../library/model.js";
4
5
  import { insertPrompt, promptById, promptByName } from "../library/repo.js";
5
6
  import { templateById, templateSummaries } from "../project-templates/repo.js";
6
7
  import { createTemplate } from "../project-templates/service.js";
8
+ import { readProviderDefaults } from "../settings/first-run.js";
7
9
  import { insertVoice, listVoices } from "../settings/repo.js";
8
10
  import { packById } from "./packs.js";
9
11
  import { readPackRecords, writePackRecord } from "./state.js";
@@ -45,10 +47,10 @@ export function installPack(deps, packId, options = { template: true }) {
45
47
  const created = createTemplate(deps, {
46
48
  id,
47
49
  name: freeTemplateName(deps, `${pack.name} starter`),
48
- document: packTemplate(pack, names, voice.voiceId),
50
+ document: packTemplate(pack, names, voice.voiceId, readProviderDefaults(deps.db)),
49
51
  });
50
52
  if (!created.ok)
51
- throw new Error(`Slopify hit an internal error (the ${pack.name} pack's template was refused: ${created.reason}). Try again; if it happens again, use Download diagnostics in Settings and report it.`);
53
+ throw new Error(internalError(`the ${pack.name} pack's template was refused: ${created.reason}`));
52
54
  template = id;
53
55
  added = true;
54
56
  }
@@ -71,7 +73,7 @@ export function installPack(deps, packId, options = { template: true }) {
71
73
  };
72
74
  });
73
75
  }
74
- function placePrompt(deps, kind, name, body, at) {
76
+ export function placePrompt(deps, kind, name, body, at) {
75
77
  for (let n = 1;; n += 1) {
76
78
  const suffix = n === 1 ? "" : ` (${String(n)})`;
77
79
  const candidate = `${name.slice(0, nameMax - suffix.length).trimEnd()}${suffix}`;
@@ -109,7 +111,7 @@ function placeVoice(deps, pack, before) {
109
111
  });
110
112
  return { id, voiceId: pack.voice.voiceId, added: true };
111
113
  }
112
- function freeTemplateName(deps, name) {
114
+ export function freeTemplateName(deps, name) {
113
115
  const taken = new Set(templateSummaries(deps.db).map((row) => row.name.toLowerCase()));
114
116
  for (let n = 1;; n += 1) {
115
117
  const candidate = n === 1 ? name : `${name} (${String(n)})`;
@@ -10,6 +10,25 @@ export const sampleProjectsSchema = z.object({
10
10
  audiobook: z.string().nullable(),
11
11
  podcast: z.string().nullable(),
12
12
  });
13
+ // What a 60-second short needs that nothing on this computer does yet, with what fixes it. The
14
+ // first-run checklist and the refusal of "Make a 60-second short" say the same gaps.
15
+ export const shortGapSchema = z.object({
16
+ need: z.enum(["text", "voice", "images"]),
17
+ // What is missing and what fixes it, in a sentence or two.
18
+ message: z.string(),
19
+ // A key for that part, or (the voice) a voice saved for the voice service that has a key.
20
+ fix: z.enum(["key", "saved-voice"]),
21
+ // The voice only: how to install the computer's own free voice from a terminal, where that
22
+ // can be done.
23
+ install: z.object({ text: z.string(), commands: z.array(z.string()) }).optional(),
24
+ });
25
+ // Who does one part of a first short, by name ("Claude Code CLI", "OpenAI", "eSpeak NG"), and
26
+ // how: with the person's own sign-in to a tool on this computer, a saved key, or (the voice)
27
+ // the computer's own speech. Null while nothing can.
28
+ const shortPartSchema = z.object({
29
+ by: z.string().nullable(),
30
+ how: z.enum(["sign-in", "key", "computer"]).nullable(),
31
+ });
13
32
  export const firstRunViewSchema = z
14
33
  .object({
15
34
  show: z.boolean(),
@@ -17,31 +36,17 @@ export const firstRunViewSchema = z
17
36
  // with POST /dismiss, so deleting every project later does not bring the screen back.
18
37
  // Reading this view writes nothing.
19
38
  settle: z.boolean(),
20
- // Who narrates a first short: a voice provider with a saved key, else the computer's own.
21
- voice: z.object({
22
- // The keyed voice provider that would be used, by name ("OpenAI"), or null.
23
- keyed: z.string().nullable(),
24
- system: z.object({
25
- available: z.boolean(),
26
- // The speech program found ("eSpeak NG", "macOS voices").
27
- engine: z.string().nullable(),
28
- // Why none can be used, with the fix.
29
- issue: z.string().nullable(),
30
- }),
39
+ // The three things a short needs (the script, a voice and the images), each with who would
40
+ // do it, and the gaps, as "Make a 60-second short" would refuse them.
41
+ needs: z.object({
42
+ text: shortPartSchema,
43
+ voice: shortPartSchema,
44
+ images: shortPartSchema,
45
+ gaps: z.array(shortGapSchema),
31
46
  }),
32
47
  // The Library of Alexandria's project, as before the demos; `samples` has all three.
33
48
  sampleProjectId: z.string().nullable(),
34
49
  samples: sampleProjectsSchema,
35
- clis: z.array(z.object({
36
- id: z.enum(["claude-code", "codex", "gemini"]),
37
- name: z.string(),
38
- installed: z.boolean(),
39
- ready: z.boolean(),
40
- version: z.string().nullable(),
41
- issue: z.string().nullable(),
42
- // Codex draws the images too.
43
- draws: z.boolean(),
44
- })),
45
50
  packs: z.array(z.object({
46
51
  id: z.string(),
47
52
  name: z.string(),
@@ -63,22 +68,6 @@ export const quickShortInputSchema = z
63
68
  export const fullVideoInputSchema = z
64
69
  .object({ projectId: z.string().min(1).max(64), draftId: z.uuid() })
65
70
  .strict();
66
- export const quickShortResultSchema = z.object({
67
- projectId: z.string(),
68
- replayed: z.boolean(),
69
- });
70
- export const installedPackSchema = z.object({
71
- packId: z.string(),
72
- added: z.boolean(),
73
- prompts: z.record(z.string(), z.string()),
74
- templateId: z.string().nullable(),
75
- voice: z.string().nullable(),
76
- });
77
- export const sampleCopySchema = z.object({ projectId: z.string() });
78
- export const sampleStateSchema = z.object({
79
- projectId: z.string().nullable(),
80
- samples: sampleProjectsSchema,
81
- });
82
71
  // Make my own copy of one sample; without a project, the Library of Alexandria.
83
72
  export const sampleCopyInputSchema = z
84
73
  .object({ projectId: z.string().max(60).optional() })