@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,9 @@
1
1
  import { z } from "zod";
2
+ import { checkpointChangeSchema } from "../../slices/checkpoints/change.js";
3
+ import { revisionControlSchema } from "../../slices/control/revision-control-schema.js";
4
+ import { addOutputPreviewRequestSchema, addOutputRequestSchema, } from "../../slices/outputs/model.js";
2
5
  import { oldVersionsConsequence } from "../../slices/storage/consequences.js";
6
+ import { approvalBody } from "../http/checkpoints.js";
3
7
  import { control } from "./route-tool.js";
4
8
  import { listWithStateWords, projectWithStateWords } from "./state-shapes.js";
5
9
  // What get_project_storage (and the page's Free up space) reads for the old versions.
@@ -9,7 +13,7 @@ const projects = [
9
13
  name: "list_projects",
10
14
  route: "GET /api/projects",
11
15
  title: "List projects",
12
- description: "Every project as the Projects list shows it: id, title, status, stateWord (how Slopify's pages say it: Queued, Running, Paused, Waiting for your review, Waiting for the agent, Stopped (only Continue the run, resume_project, goes on), Prepared, Kept as is, Failed, Done with problems, Done, Canceled; an uploaded project reads Done once nothing it admitted is left to run; a run whose step failed while another step waits for the agent or the person reads by that wait, with stepFailed: true, and Failed once nothing else can go on), stepFailures (each step that failed while another step waits for the agent, the person or its day, even while a third still runs, as kind@finishedAt; absent otherwise), progress from 0 to 1, channelId and uploadedAt.",
16
+ description: "Every project as the Projects list shows it: id, title, status, stateWord (how Slopify's pages say it: Queued, Running, Paused, Waiting for your review, Waiting for the agent, Stopped (only Continue the run, resume_project, goes on), Waiting for its day (made ahead by its schedule), Kept as is, Failed, Done with problems, Done, Canceled; an uploaded project reads Done once nothing it admitted is left to run; a run whose step failed while another step waits for the agent or the person reads by that wait, with stepFailed: true, and Failed once nothing else can go on), stepFailures (each step that failed while another step waits for the agent, the person or its day, even while a third still runs, as kind@finishedAt; absent otherwise), progress from 0 to 1, channelId and uploadedAt.",
13
17
  shape: listWithStateWords,
14
18
  },
15
19
  {
@@ -24,7 +28,7 @@ const projects = [
24
28
  route: "DELETE /api/projects/:id",
25
29
  title: "Delete a project",
26
30
  description: "Delete on the Projects list: moves the project to the trash. A running project is refused: cancel it first.",
27
- confirm: "This moves the project to Settings → Backup & storage → Trash, where it is kept 30 days before it is deleted for good.",
31
+ confirm: "This moves the project to Settings → Trash, where it is kept 30 days before it is deleted for good.",
28
32
  },
29
33
  {
30
34
  name: "move_projects_to_channel",
@@ -36,7 +40,7 @@ const projects = [
36
40
  name: "get_run_queue",
37
41
  route: "GET /api/projects/queue",
38
42
  title: "Read the run queue",
39
- description: "The batch queue: projects waiting their turn, in order. Play's Queue switch (the draft's queue field) puts a run's videos here.",
43
+ description: "The batch queue: projects waiting their turn, in order. Create's One after another switch (the draft's queue field) puts a run's videos here.",
40
44
  },
41
45
  {
42
46
  name: "move_in_run_queue",
@@ -48,14 +52,14 @@ const projects = [
48
52
  name: "estimate_run",
49
53
  route: "POST /api/projects/estimate",
50
54
  title: "Estimate a run",
51
- description: "The cost estimate Play shows before Start. Body: {draft: a run draft, expectedWords?: 1-100000, items?}. For a Play draft, review_draft returns the same estimate.",
55
+ description: "The cost estimate Create shows before Make the video. Body: {draft: a run draft, expectedWords?: 1-100000, items?}. For a draft on Create, review_draft returns the same estimate.",
52
56
  unrecorded: true,
53
57
  },
54
58
  {
55
59
  name: "get_run_cost",
56
60
  route: "GET /api/projects/:id/run-cost",
57
61
  title: "Read a project's run cost",
58
- description: "What the project's runs cost so far, by stage and provider, and any wait on a CLI plan's limits, as its Run cost tab shows.",
62
+ description: 'What the project\'s runs cost so far, by stage and provider, and any wait on a CLI plan\'s limits, as its Run cost tab shows. Each plan window has two figures: usedPercent, this run\'s own share from each call\'s before→after readings (basis "measured"; "split" when overlapping calls shared a rise by tokens; "shared" when some calls ran beside other use on the account and are not counted, usedPercent null if none could be told apart; "approximate" for projects run before per-call readings were kept, the account\'s rise as an upper bound), and fromPercent → nowPercent, all use on the account while the run went (accountPercent, never above 100), with resetsAt.',
59
63
  },
60
64
  {
61
65
  name: "get_week",
@@ -63,6 +67,24 @@ const projects = [
63
67
  title: "Read this week",
64
68
  description: "Home's This week: videos made, calls, cost and CLI plan standings. Query: {since: an ISO time, channelId?}.",
65
69
  },
70
+ {
71
+ name: "get_autopilot",
72
+ route: "GET /api/home/autopilot",
73
+ title: "Read autopilot health",
74
+ description: "Home's autopilot block: how far ahead the schedules' content is (forecast: readyCount, daysAhead, coveredUntil, runsDryAt and each schedule's own), the warnings that may stop them (each with key, what failed, why, and where the fix is), checkedAt (when sign-ins, the OpenRouter key and the disk were last checked, hourly), the last seven days (finished, failed steps, cost) and weeklyNotify. It never starts a CLI. Query: {channelId?}.",
75
+ },
76
+ {
77
+ name: "hide_autopilot_warning",
78
+ route: "POST /api/home/autopilot/snooze",
79
+ title: "Hide an autopilot warning",
80
+ description: "Hide, like the button beside a warning on Home: the warning stays hidden for 7 days, or until it changes. It fixes nothing. Body: {key: a warning's key from get_autopilot}.",
81
+ },
82
+ {
83
+ name: "set_weekly_report",
84
+ route: "PUT /api/home/autopilot/weekly",
85
+ title: "Turn the weekly report on or off",
86
+ description: "Settings → Notifications → Weekly report: each Monday from 09:00 Slopify sends last week's report (made, failed, cost) to the Notification URL. Off by default. Body: {enabled: true | false}.",
87
+ },
66
88
  {
67
89
  name: "mark_uploaded",
68
90
  route: "PUT /api/projects/:id/uploaded",
@@ -109,6 +131,7 @@ const outputs = [
109
131
  {
110
132
  name: "preview_added_output",
111
133
  route: "POST /api/projects/:id/outputs/preview",
134
+ body: addOutputPreviewRequestSchema,
112
135
  title: "Preview another output",
113
136
  description: "Add another output, first step: what the new output reuses, makes and is estimated to cost, and any choice the project lacks for it. Body: {baseRevisionId, kind: narration | audiobook | images | video | pdf | podcast}.",
114
137
  unrecorded: true,
@@ -116,6 +139,7 @@ const outputs = [
116
139
  {
117
140
  name: "add_output",
118
141
  route: "POST /api/projects/:id/outputs",
142
+ body: addOutputRequestSchema,
119
143
  title: "Add another output",
120
144
  description: 'Switches the output on as a new version and answers the workKeys to make; it starts nothing. Then preview_rebuild with {kind: "selected", workKeys} and start_rebuild, as the page\'s Add does. Body: {baseRevisionId, idempotencyKey: a new UUID, kind, adapt?: true to accept rewriting the text as a conversation}.',
121
145
  },
@@ -124,20 +148,22 @@ const decisions = [
124
148
  {
125
149
  name: "get_checkpoints",
126
150
  route: "GET /api/projects/:id/checkpoints",
127
- title: "Read review checkpoints",
128
- description: "The project's review checkpoints: each gate's stage, state, fingerprint and currentFingerprint. A gate is Waiting for your review while held.",
151
+ title: "Read the pauses for your review",
152
+ description: "The project's pauses for your review (Pauses and checks): each gate's stage, state, fingerprint and currentFingerprint. A gate is Waiting for your review while held.",
129
153
  },
130
154
  {
131
155
  name: "approve_checkpoint",
132
156
  route: "POST /api/projects/:id/checkpoints/:checkpointId/approve",
133
- title: "Approve a checkpoint",
134
- description: "Approves a held checkpoint so the stages after it run, like Approve on the project page. Body: {revisionId, fingerprint: the gate's currentFingerprint, idempotencyKey: a new UUID}.",
157
+ body: approvalBody,
158
+ title: "Approve a pause",
159
+ description: "Approves a held pause so the stages after it run, like Approve and make the … on the project page. Body: {revisionId, fingerprint: the gate's currentFingerprint, idempotencyKey: a new UUID}.",
135
160
  },
136
161
  {
137
162
  name: "change_checkpoints",
138
163
  route: "PATCH /api/projects/:id/checkpoints",
139
- title: "Change checkpoints",
140
- description: 'Sets the stages that stop for approval, like the Checkpoints tab. Body: {revisionId, stages: ["audio" | "images" | "video"]}.',
164
+ body: checkpointChangeSchema,
165
+ title: "Change the pauses",
166
+ description: 'Sets the stages that stop for approval, like Pause after … in Edit settings → Pauses and checks. Body: {revisionId, stages: ["audio" | "images" | "video"]}.',
141
167
  },
142
168
  {
143
169
  name: "list_reviews",
@@ -154,6 +180,7 @@ const decisions = [
154
180
  {
155
181
  name: "redo_review",
156
182
  route: "POST /api/projects/:id/reviews/:verdictId/redo",
183
+ body: revisionControlSchema,
157
184
  title: "Redo a flagged item",
158
185
  description: `Makes a flagged item again, like Redo beside it. ${control}`,
159
186
  },
@@ -36,32 +36,32 @@ const uploadPrep = [
36
36
  {
37
37
  name: "get_upload_pack",
38
38
  route: "GET /api/studio/packs/:projectId",
39
- title: "Read the upload pack",
40
- description: "Prepare upload: the title, description, tags, thumbnails, playlists and release time of each upload (the video and each short), and the plan's free slots. The agent's work ends here, at Ready to upload: uploading is the person's.",
39
+ title: "Read Copy for YouTube Studio",
40
+ description: "Copy for YouTube Studio: the title, description, tags, thumbnails, playlists and release time of each upload (the video and each short), and the plan's free release times (slots). The agent's work ends here, at Ready to upload: uploading is the person's.",
41
41
  },
42
42
  {
43
43
  name: "set_pack_slot",
44
44
  route: "PUT /api/studio/packs/:projectId/slot",
45
- title: "Choose the release slot",
46
- description: "Prepare upload's slot picker: one of the free slots get_upload_pack lists, or none. Body: {slot: {row, longAt} | null}.",
45
+ title: "Choose the release time",
46
+ description: "Copy for YouTube Studio's release picker: one of the free release times (slots) get_upload_pack lists, or none. Body: {slot: {row, longAt} | null}.",
47
47
  },
48
48
  {
49
49
  name: "set_pack_real_footage",
50
50
  route: "PUT /api/studio/packs/:projectId/real-footage",
51
51
  title: "Set the altered-content answer",
52
- description: "Prepare upload's AI use tick: the project's uploaded clips are real footage. Body: {realFootage: true | false}.",
52
+ description: "Copy for YouTube Studio's AI use tick: the project's uploaded clips are real footage. Body: {realFootage: true | false}.",
53
53
  },
54
54
  {
55
55
  name: "set_pack_pick",
56
56
  route: "PUT /api/studio/packs/:projectId/pick",
57
57
  title: "Pick the title and thumbnail",
58
- description: "Prepare upload's pick: which title and thumbnail the upload carries (the A/B test tries the others once the video is public). Body: {title: 0-9, thumbnail: 0-9}.",
58
+ description: "Copy for YouTube Studio's pick: which title and thumbnail the upload carries (the A/B test tries the others once the video is public). Body: {title: 0-9, thumbnail: 0-9}.",
59
59
  },
60
60
  {
61
61
  name: "set_pack_playlists",
62
62
  route: "PUT /api/studio/packs/:projectId/playlists",
63
- title: "Set the pack's playlists",
64
- description: "Prepare upload's playlist ticks. Body: {playlists: [names] | null for the channel's defaults}.",
63
+ title: "Set the upload's playlists",
64
+ description: "Copy for YouTube Studio's playlist ticks. Body: {playlists: [names] | null for the channel's defaults}.",
65
65
  },
66
66
  {
67
67
  name: "get_fill_queue",
@@ -137,7 +137,7 @@ const youtube = [
137
137
  name: "get_ab_results",
138
138
  route: "GET /api/studio/ab-results",
139
139
  title: "Read A/B results",
140
- description: "Library → A/B results: every finished title and thumbnail test.",
140
+ description: "What worked on YouTube (on a channel's page): every finished title and thumbnail test.",
141
141
  },
142
142
  ];
143
143
  export const publishingTools = [
@@ -1,20 +1,26 @@
1
+ import { revisionControlSchema } from "../../slices/control/revision-control-schema.js";
2
+ import { previewRebuildSchema, startRebuildSchema } from "../../slices/rebuild/model.js";
3
+ import { restoreBody, saveBody } from "../http/revisions.js";
1
4
  import { control } from "./route-tool.js";
2
5
  const runs = [
3
6
  {
4
7
  name: "pause_project",
5
8
  route: "POST /api/projects/:id/pause",
9
+ body: revisionControlSchema,
6
10
  title: "Pause",
7
11
  description: `Pause: the run stops after the steps already sent finish; nothing starts until resume_project. ${control}`,
8
12
  },
9
13
  {
10
14
  name: "resume_project",
11
15
  route: "POST /api/projects/:id/resume",
16
+ body: revisionControlSchema,
12
17
  title: "Continue the run",
13
18
  description: `Continue the run: starts the project's held and unfinished work, including work a saved edit left waiting. On a canceled run it resumes the whole run, the canceled steps too; once a step of it was taken up again (retry_stage), only the steps taken up again go on and the rest stay canceled. ${control}`,
14
19
  },
15
20
  {
16
21
  name: "cancel_project",
17
22
  route: "POST /api/projects/:id/cancel",
23
+ body: revisionControlSchema,
18
24
  title: "Cancel run",
19
25
  description: `Cancel run: stops every running stage of the project. ${control}`,
20
26
  confirm: "Cancel this run? It stops every running stage; finished outputs are kept.",
@@ -22,12 +28,14 @@ const runs = [
22
28
  {
23
29
  name: "retry_stage",
24
30
  route: "POST /api/projects/:id/stages/:kind/retry",
31
+ body: revisionControlSchema,
25
32
  title: "Try again",
26
33
  description: `Try again on a failed step (kind: research, article, audio, images, thumbnail, video or document), keeping what it already made. ${control}`,
27
34
  },
28
35
  {
29
36
  name: "soften_stage",
30
37
  route: "POST /api/projects/:id/stages/:kind/soften",
38
+ body: revisionControlSchema,
31
39
  title: "Soften and retry",
32
40
  description: `Soften and retry, for a picture a content filter refused (kind images or thumbnail, or video for a short's picture): rewords the refused prompts and draws them again. ${control}`,
33
41
  confirm: "Your project's AI model rewrites each refused prompt without what a content filter could flag, keeping the scene and style. The image is then drawn again from the new wording, which it keeps as its prompt. The AI call and the new image are charged like any other.",
@@ -35,9 +43,10 @@ const runs = [
35
43
  {
36
44
  name: "rerun_stage",
37
45
  route: "POST /api/projects/:id/stages/:kind/rerun",
38
- title: "Re-run a stage",
39
- description: `Re-run section: makes a stage again and everything built on it. A re-run that costs money is refused until it is reviewed: use preview_rebuild (Choose what to remake), then start_rebuild. ${control}`,
40
- confirm: "Re-run this stage? It generates the stage and its dependent outputs again, which costs what the stage cost the first time; previous outputs stay in History.",
46
+ body: revisionControlSchema,
47
+ title: "Make a stage again",
48
+ description: `A section's Make … again button (Write the article again, Make all images again): makes a stage again and everything built on it. Making again what costs money is refused until it is reviewed: use preview_rebuild (Choose what to make again), then start_rebuild. ${control}`,
49
+ confirm: "Make this stage again? It makes the stage and what is built on it again, which costs what the stage cost the first time; the previous outputs stay under Versions.",
41
50
  },
42
51
  ];
43
52
  const revisions = [
@@ -51,7 +60,7 @@ const revisions = [
51
60
  name: "list_revisions",
52
61
  route: "GET /api/projects/:id/revisions",
53
62
  title: "Read project history",
54
- description: "Every saved version of the project, newest first, as Project history lists them (byAgent marks one an agent saved), and agentActions: what agents did in the project.",
63
+ description: "Every saved version of the project, newest first, as Project history lists them (byAgent marks one an agent saved, byAssistant one the in-app assistant saved), and agentActions: what agents and the assistant did in the project (actor says which).",
55
64
  },
56
65
  {
57
66
  name: "get_revision",
@@ -68,27 +77,31 @@ const revisions = [
68
77
  {
69
78
  name: "save_revision",
70
79
  route: "POST /api/projects/:id/revisions",
80
+ body: saveBody,
71
81
  title: "Save an edit",
72
- description: "Saves an edit as a new version, like Save in Edit project; it starts nothing. Body: {baseRevisionId, idempotencyKey: a new UUID, edit: {config, content, regenerate?: [work keys to make again, such as a narration chunk key], uploads?: [{stagedFileId, destination}]}}; send get_revision's revision.config and revision.content with your change. One chunk's wording or delivery note is content.narrationOverrides[chunk key] = {kind: \"text\", text, direction?}. Finished shorts kept through a new pick are content.shortsKeep: leave one out to pick a new moment for it, and lower config.shorts.count as well to drop it. Then preview_rebuild (Choose what to remake) says what it makes and costs, and start_rebuild starts it.",
82
+ description: "Saves an edit as a new version, like Save in Edit settings; it starts nothing. Body: {baseRevisionId, idempotencyKey: a new UUID, edit: {config, content, regenerate?: [work keys to make again, such as a narration chunk key], uploads?: [{stagedFileId, destination}]}}; send get_revision's revision.config and revision.content with your change. One chunk's wording or delivery note is content.narrationOverrides[chunk key] = {kind: \"text\", text, direction?}. Finished shorts kept through a new pick are content.shortsKeep: leave one out to pick a new moment for it, and lower config.shorts.count as well to drop it. Then preview_rebuild (Choose what to make again) says what it makes and costs, and start_rebuild starts it.",
73
83
  },
74
84
  {
75
85
  name: "restore_revision",
76
86
  route: "POST /api/projects/:id/revisions/restore",
87
+ body: restoreBody,
77
88
  title: "Restore a version",
78
- description: "Makes an earlier version current again, like Restore this revision; it starts nothing. Body: {baseRevisionId, idempotencyKey: a new UUID, targetRevisionId}.",
89
+ description: "Makes an earlier version current again, like Restore on a row of Versions; it starts nothing. Body: {baseRevisionId, idempotencyKey: a new UUID, targetRevisionId}.",
79
90
  },
80
91
  {
81
92
  name: "preview_rebuild",
82
93
  route: "POST /api/projects/:id/rebuild/preview",
83
- title: "Choose what to remake",
84
- description: 'Choose what to remake: what a remake makes again, reuses or leaves blocked, each output\'s estimate and the total, like the project\'s Choose what to remake. Body: {baseRevisionId, request: {kind: "allAffected"} | {kind: "selected", workKeys: [...]}}. Nothing starts; start_rebuild does, with this preview\'s id.',
94
+ body: previewRebuildSchema,
95
+ title: "Choose what to make again",
96
+ description: 'Choose what to make again: what making it again makes, reuses or leaves blocked, each output\'s estimate and the total, like the project\'s Choose what to make again. Body: {baseRevisionId, request: {kind: "allAffected"} | {kind: "selected", workKeys: [...]}}. Nothing starts; start_rebuild does, with this preview\'s id.',
85
97
  unrecorded: true,
86
98
  },
87
99
  {
88
100
  name: "start_rebuild",
89
101
  route: "POST /api/projects/:id/rebuild",
90
- title: "Start a remake",
91
- description: "Starts the remake you previewed: the acknowledgement Choose what to remake asks for. Body: {baseRevisionId, idempotencyKey: a new UUID, previewId: the preview's id, acknowledgeUnknownCosts: true only after reading the preview's unknown costs, confirmedProvidedWorkKeys: the preview's providedReuseRequired keys you accept replacing}.",
102
+ body: startRebuildSchema,
103
+ title: "Make the previewed parts again",
104
+ description: "Starts making again what you previewed: the acknowledgement Choose what to make again asks for. Body: {baseRevisionId, idempotencyKey: a new UUID, previewId: the preview's id, acknowledgeUnknownCosts: true only after reading the preview's unknown costs, confirmedProvidedWorkKeys: the preview's providedReuseRequired keys you accept replacing}.",
92
105
  },
93
106
  ];
94
107
  export const runTools = [...runs, ...revisions];
@@ -1,3 +1,5 @@
1
+ import { heldTopicEditSchema, scheduleCreateSchema, scheduleSaveBodySchema, scheduleVersionBodySchema, topicMoveSchema, topicQueueSchema, topicTransferSchema, } from "../../slices/schedules/schema.js";
2
+ import { approveHeldTopicBody, heldIds, heldRestore, prepareTopicBody } from "../http/schedules.js";
1
3
  import { formBody } from "./route-tool.js";
2
4
  export const scheduleTools = [
3
5
  {
@@ -9,36 +11,41 @@ export const scheduleTools = [
9
11
  {
10
12
  name: "create_schedule",
11
13
  route: "POST /api/schedules",
14
+ body: scheduleCreateSchema,
12
15
  title: "Create a schedule",
13
- description: `${formBody("the schedule editor")} Duplicate on a schedule is this with get_schedule's settings, a new id, a new name ending "(copy)" and items: [], then pause_schedule on the copy.`,
16
+ description: `${formBody("the schedule editor")} Duplicate on a schedule is this with get_schedule's settings, a new id, a new name ending "(copy)" and items: [], then pause_schedule on the copy. A design schedule (one designed piece per row, made ahead of the row's date) is {templateKind: "design", templateId: the design template's id, templateVersion: its headVersion, cadence: {kind: "by-date", time: "HH:MM"}, items: [{title, values: {every field, the date field as YYYY-MM-DD}}]}; it has no topic generation or release days, and makes only from a version approved for schedules.`,
14
17
  },
15
18
  {
16
19
  name: "get_schedule",
17
20
  route: "GET /api/schedules/:id",
18
21
  title: "Read a schedule",
19
- description: "One schedule with its topic queue and release lines.",
22
+ description: "One schedule with its topic queue and release lines, and scores: each queued topic's score (0-100) and reasons by normalised title while the schedule ranks topics (topicScoring library or search).",
20
23
  },
21
24
  {
22
25
  name: "update_schedule",
23
26
  route: "PUT /api/schedules/:id",
27
+ body: scheduleSaveBodySchema,
24
28
  title: "Save a schedule",
25
- description: `${formBody("the schedule editor")} Its release lines set when each run's videos are released.`,
29
+ description: `${formBody("the schedule editor")} Its release lines set when each run's videos are released. topicScoring ranks generated topics: "off" (the default), "library" (by what the library already covers) or "search" (also by public search interest: sends topic titles to Google, DuckDuckGo and Wikipedia); left out, a save keeps it.`,
26
30
  },
27
31
  {
28
32
  name: "pause_schedule",
29
33
  route: "POST /api/schedules/:id/pause",
34
+ body: scheduleVersionBodySchema,
30
35
  title: "Pause a schedule",
31
36
  description: "No run starts from it until resume_schedule.",
32
37
  },
33
38
  {
34
39
  name: "resume_schedule",
35
40
  route: "POST /api/schedules/:id/resume",
41
+ body: scheduleVersionBodySchema,
36
42
  title: "Resume a schedule",
37
43
  description: "Runs start from it again at its times.",
38
44
  },
39
45
  {
40
46
  name: "cancel_schedule",
41
47
  route: "POST /api/schedules/:id/cancel",
48
+ body: scheduleVersionBodySchema,
42
49
  title: "Cancel a schedule",
43
50
  description: "Cancel schedule, as the schedule's page does.",
44
51
  confirm: "Stops future scheduled runs. Existing projects and run history are kept.",
@@ -46,6 +53,7 @@ export const scheduleTools = [
46
53
  {
47
54
  name: "delete_schedule",
48
55
  route: "DELETE /api/schedules/:id",
56
+ body: scheduleVersionBodySchema,
49
57
  title: "Delete a schedule",
50
58
  description: "Moves the schedule to the trash.",
51
59
  confirm: "Moves this schedule to the trash for 30 days (Settings → Trash). Its run history is kept.",
@@ -59,20 +67,28 @@ export const scheduleTools = [
59
67
  {
60
68
  name: "list_prepared_topics",
61
69
  route: "GET /api/schedules/:id/prepared",
62
- title: "Read prepared topics",
63
- description: "Which queued topics are Prepared ahead, and their projects.",
70
+ title: "Read topics made ahead",
71
+ description: "Which queued topics are made ahead (Make ahead), and their projects.",
64
72
  },
65
73
  {
66
74
  name: "prepare_topic",
67
75
  route: "POST /api/schedules/:id/topics/prepare",
68
- title: "Prepare a topic",
69
- description: "Prepare, from the schedule's topics or Open on calendar: makes the topic's project now, exactly as the schedule would, and runs everything but the video, which its scheduled day renders. It spends what Play's review estimates and is refused over the schedule's spend limit. Body: {topic: the topic's title}.",
76
+ body: prepareTopicBody,
77
+ title: "Make a topic ahead",
78
+ description: "Make ahead, on a topic in the calendar: makes the topic's project now, exactly as the schedule would, and runs everything but the video, which its scheduled day puts together. It spends what Create's estimate says and is refused over the schedule's spend limit and while the schedule is paused. Body: {topic: the topic's title}.",
70
79
  },
71
80
  {
72
81
  name: "generate_topics",
73
82
  route: "POST /api/schedules/:id/topics/generate",
74
83
  title: "Suggest topics",
75
- description: "Asks the schedule's text model for topics, a paid call, like Suggest topics.",
84
+ description: "Asks the schedule's AI model for topics, a paid call, like Suggest topics.",
85
+ },
86
+ {
87
+ name: "score_topics",
88
+ route: "POST /api/schedules/:id/topics/score",
89
+ title: "Rescore topics",
90
+ description: "Rescore, like the button under the schedule's queue: scores every queued and held topic again (by what the library already covers; with search ranking also by Google, DuckDuckGo and Wikipedia, which are sent each topic's title) and puts them in score order. Topics the person added or moved keep their places. Refused while the schedule's Rank topics is Off. get_schedule and list_held_topics answer the scores (score 0-100 and reasons, by normalised title).",
91
+ reachesOut: "asks",
76
92
  },
77
93
  {
78
94
  name: "approve_all_topics",
@@ -83,24 +99,28 @@ export const scheduleTools = [
83
99
  {
84
100
  name: "approve_topics",
85
101
  route: "POST /api/schedules/:id/topics/held/approve",
102
+ body: heldIds,
86
103
  title: "Approve selected topics",
87
104
  description: "Approve selected: moves these held topics into the queue. Body: {ids: [held topic ids]}.",
88
105
  },
89
106
  {
90
107
  name: "reject_topics",
91
108
  route: "POST /api/schedules/:id/topics/held/reject",
109
+ body: heldIds,
92
110
  title: "Reject selected topics",
93
111
  description: "Reject selected, or Reject all with every id shown: later generations won't suggest them again. Body: {ids: [held topic ids]}.",
94
112
  },
95
113
  {
96
114
  name: "restore_topics",
97
115
  route: "POST /api/schedules/:id/topics/held/restore",
116
+ body: heldRestore,
98
117
  title: "Bring rejected topics back",
99
118
  description: `The Undo after a rejection: puts turned-down topics back. ${formBody("the Undo in the rejection's message")}`,
100
119
  },
101
120
  {
102
121
  name: "approve_topic",
103
122
  route: "POST /api/schedules/:id/topics/held/:topicId/approve",
123
+ body: approveHeldTopicBody,
104
124
  title: "Approve a topic",
105
125
  description: formBody("Approve in Calendar → Suggested topics"),
106
126
  },
@@ -113,24 +133,28 @@ export const scheduleTools = [
113
133
  {
114
134
  name: "edit_held_topic",
115
135
  route: "PUT /api/schedules/:id/topics/held/:topicId",
136
+ body: heldTopicEditSchema,
116
137
  title: "Edit a suggested topic",
117
138
  description: formBody("the suggested topic's editor"),
118
139
  },
119
140
  {
120
141
  name: "set_topic_queue",
121
142
  route: "PUT /api/schedules/:id/topics",
143
+ body: topicQueueSchema,
122
144
  title: "Set the topic queue",
123
145
  description: `${formBody("the schedule's topic queue")} Bulk paste is this with the pasted topics added to the queue.`,
124
146
  },
125
147
  {
126
148
  name: "move_topic",
127
149
  route: "POST /api/schedules/:id/topics/move",
150
+ body: topicMoveSchema,
128
151
  title: "Move a topic",
129
152
  description: `Reorders the queue. ${formBody("the topic queue's move")}`,
130
153
  },
131
154
  {
132
155
  name: "transfer_topic",
133
156
  route: "POST /api/schedules/:id/topics/transfer",
157
+ body: topicTransferSchema,
134
158
  title: "Move a topic to another schedule",
135
159
  description: formBody("the topic queue's move to another schedule"),
136
160
  },
@@ -1,5 +1,10 @@
1
1
  import { z } from "zod";
2
2
  import { readinessIsUsable } from "../../kernel/ports/model.js";
3
+ import { costPhrase } from "../../slices/model-checks/rules.js";
4
+ import { quoteBody } from "../http/auditions.js";
5
+ import { checkBody } from "../http/model-checks.js";
6
+ import { switchBody } from "../http/providers.js";
7
+ import { notificationBody } from "../http/settings.js";
3
8
  import { formBody } from "./route-tool.js";
4
9
  const readinessShape = z.discriminatedUnion("kind", [
5
10
  z.object({ kind: z.literal("keyed"), hasKey: z.boolean() }).loose(),
@@ -48,23 +53,35 @@ export function notificationUrlState(value) {
48
53
  return { notificationUrl: url === null || url.trim() === "" ? "missing" : "configured" };
49
54
  }
50
55
  const settings = [
56
+ {
57
+ name: "get_remote_access",
58
+ route: "GET /api/settings/remote-access",
59
+ title: "Read remote access",
60
+ description: "Settings → Remote access: whether Slopify's page is open on the person's other devices through Tailscale serve (their tailnet only, never the public internet), its https address, and any problem with the exact fix. Turning it on or off is the person's; agents can't.",
61
+ },
51
62
  {
52
63
  name: "get_settings",
53
64
  route: "GET /api/settings",
54
65
  title: "Read production defaults",
55
- description: "Settings → Production defaults: silence gap, appearance, loudness and the English subtitle timing model.",
66
+ description: "Settings → Production defaults: silence gap, appearance, loudness, the English subtitle timing model and the render settings (video encoder, clip encoding, render priority).",
56
67
  },
57
68
  {
58
69
  name: "update_settings",
59
70
  route: "PUT /api/settings",
60
71
  title: "Save production defaults",
61
- description: "Body: {silenceGapSeconds, appearance: system | light | dark, loudness?: {enabled, videoLufs, audioFilesLufs}, subtitleModel?: fp32 | fp16 | int8}. subtitleModel is this computer's English caption-timing model (fp32 378 MB most accurate, the default; fp16 189 MB; int8 95 MB, less accurate); it never marks subtitles outdated.",
72
+ description: "Body: {silenceGapSeconds, appearance: system | light | dark, loudness?: {enabled, videoLufs, audioFilesLufs}, subtitleModel?: fp32 | fp16 | int8, videoEncoder?: cpu | nvidia, clipEncodeSpeed?: thorough | fast, renderPriority?: normal | background}. subtitleModel is this computer's English caption-timing model (fp32 378 MB most accurate, the default; fp16 189 MB; int8 95 MB, less accurate). videoEncoder nvidia encodes on the NVIDIA card (check get_video_encoders first; a render falls back to the processor when it does not work); clipEncodeSpeed fast encodes the clips under burned-in captions with x264 veryfast; renderPriority background runs renders below normal priority. None of these marks anything outdated.",
73
+ },
74
+ {
75
+ name: "get_video_encoders",
76
+ route: "GET /api/settings/encoders",
77
+ title: "Check the NVIDIA encoder",
78
+ description: "Settings → Production defaults → Video encoder: whether this computer's NVIDIA encoder (NVENC) works, and why not when it does not. The first check runs a tiny test encode.",
62
79
  },
63
80
  {
64
81
  name: "get_default_channel_links",
65
82
  route: "GET /api/settings/channel-links",
66
83
  title: "Read the default channel links",
67
- description: "Settings → Channel links: the links a description's {{Name}} placeholders fill from.",
84
+ description: "Settings → YouTube Studio and posting: the links a description's {{Name}} placeholders fill from.",
68
85
  },
69
86
  {
70
87
  name: "set_default_channel_links",
@@ -82,6 +99,7 @@ const settings = [
82
99
  {
83
100
  name: "set_notification_url",
84
101
  route: "PUT /api/settings/notifications",
102
+ body: notificationBody,
85
103
  title: "Save the Notification URL",
86
104
  description: "Body: {url: an http(s) address, or empty to stop}. Answers configured or missing, never the address.",
87
105
  shape: notificationUrlState,
@@ -128,8 +146,9 @@ const settings = [
128
146
  {
129
147
  name: "quote_voice_sample",
130
148
  route: "POST /api/auditions/quote",
149
+ body: quoteBody,
131
150
  title: "Price a voice sample",
132
- description: "Try a sample's price, as Play shows it before playing one. Body: {lines: [{speaker, provider, model, text}]}.",
151
+ description: "Try a sample's price, as Create shows it before playing one. Body: {lines: [{speaker, provider, model, text}]}.",
133
152
  unrecorded: true,
134
153
  },
135
154
  {
@@ -148,7 +167,7 @@ const settings = [
148
167
  name: "get_studio_settings",
149
168
  route: "GET /api/studio/settings",
150
169
  title: "Read YouTube Studio settings",
151
- description: "Settings → YouTube Studio: the playlists upload packs name, and whether the comment is posted.",
170
+ description: "Settings → YouTube Studio and posting: the playlists upload packs name, and whether the comment is posted.",
152
171
  shape: withoutExtensionSecrets,
153
172
  },
154
173
  {
@@ -168,15 +187,59 @@ const providers = [
168
187
  {
169
188
  name: "list_providers",
170
189
  route: "GET /api/providers",
171
- title: "List providers",
172
- description: "Each provider as configured or missing.",
190
+ title: "List the services",
191
+ description: "Each service on Settings → Keys & services, as configured or missing.",
173
192
  shape: configuredOrMissing,
174
193
  },
175
194
  {
176
195
  name: "list_models",
177
196
  route: "GET /api/providers/:id/models",
178
- title: "List a provider's models",
179
- description: "The models Slopify offers for the provider, with prices where known.",
197
+ title: "List a service's models",
198
+ description: "The models Slopify offers for the provider, with prices where known, and each model's standing for the saved key or CLI under standings: works (a check or a run succeeded), listed (the key's own model list names it), known (only Slopify's model list does), no-access (the provider said it is not on the plan, with its sentence), and retiring with its replacement when one is due. Standings never stop a run: a model chosen anywhere keeps working as before.",
199
+ },
200
+ {
201
+ name: "get_model_checks",
202
+ route: "GET /api/model-checks",
203
+ title: "Read Settings → Models' model checks",
204
+ description: "Per provider: when its models were last checked, how many work, are listed or are not on the plan, whether a check is running and what checks have cost; the New for you list; and whether automatic checks are free-only or off.",
205
+ },
206
+ {
207
+ name: "estimate_model_checks",
208
+ route: "GET /api/providers/:id/models/check/estimate",
209
+ title: "Estimate checking a service's models",
210
+ description: "What Check models in Settings → Models would check for this provider and what it costs at list price, before anything is sent. Query: models (optional, comma-separated ids).",
211
+ },
212
+ {
213
+ name: "check_models",
214
+ route: "POST /api/providers/:id/models/check",
215
+ body: checkBody,
216
+ title: "Check a service's models",
217
+ description: "Settings → Models' Check models: sends each model the smallest request (one word, a spoken Hi, one small image) to learn whether it works for the saved key or CLI, in the background. A check that costs money is refused with its estimate until the body carries confirmedDollars of at least the estimate's totalDollars (read estimate_model_checks first). Body: {models?: [ids], confirmedDollars?: number}.",
218
+ confirm: "Each model checked is sent one small paid request at list price (a CLI's checks use its plan's allowance instead).",
219
+ confirmFrom: {
220
+ route: "/api/providers/:id/models/check/estimate",
221
+ text: (value) => {
222
+ const estimate = z
223
+ .object({
224
+ count: z.number(),
225
+ totalDollars: z.number(),
226
+ unpriced: z.number(),
227
+ planAccounts: z.array(z.string()),
228
+ })
229
+ .safeParse(value);
230
+ if (!estimate.success)
231
+ return undefined;
232
+ const { count, totalDollars, unpriced, planAccounts } = estimate.data;
233
+ return `Checks ${String(count)} model${count === 1 ? "" : "s"}, one small request each: ${costPhrase(totalDollars, unpriced)}${planAccounts.length > 0 ? ", using the CLI plan's allowance" : ""}.`;
234
+ },
235
+ },
236
+ reachesOut: "asks",
237
+ },
238
+ {
239
+ name: "dismiss_model_notices",
240
+ route: "POST /api/model-checks/notices/dismiss",
241
+ title: "Dismiss New for you models",
242
+ description: "Settings → Models' Dismiss on New for you. Body: {keys: [{provider, family, model}]} as get_model_checks lists them.",
180
243
  },
181
244
  {
182
245
  name: "list_system_voices",
@@ -187,8 +250,8 @@ const providers = [
187
250
  {
188
251
  name: "check_providers",
189
252
  route: "POST /api/providers/health",
190
- title: "Check providers",
191
- description: "Settings → Providers' Check all: which providers answer and which CLIs are signed in.",
253
+ title: "Check every service",
254
+ description: "Settings → Keys & services' Check every service: which services answer and which CLIs are signed in.",
192
255
  unrecorded: true,
193
256
  reachesOut: "asks",
194
257
  },
@@ -221,6 +284,7 @@ const providers = [
221
284
  {
222
285
  name: "switch_retired_model",
223
286
  route: "POST /api/providers/catalogue/retired/switch",
287
+ body: switchBody,
224
288
  title: "Switch a retired model",
225
289
  description: formBody("Settings → Models' Switch"),
226
290
  },