@gentbajko/slopify 3.25.8 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. package/dist/adapters/account-limits.js +30 -0
  2. package/dist/adapters/alignment/cache.js +3 -5
  3. package/dist/adapters/alignment/ctc.js +1 -2
  4. package/dist/adapters/alignment/lock.js +4 -3
  5. package/dist/adapters/alignment/multilingual.js +0 -3
  6. package/dist/adapters/alignment/prefetch.js +2 -1
  7. package/dist/adapters/alignment/worker.js +2 -1
  8. package/dist/adapters/explain.js +0 -3
  9. package/dist/adapters/ffmpeg.js +19 -1
  10. package/dist/adapters/host-cli/index.js +19 -3
  11. package/dist/adapters/http-failure.js +53 -0
  12. package/dist/adapters/image/codex.js +36 -4
  13. package/dist/adapters/image/fal.js +17 -50
  14. package/dist/adapters/image/google.js +31 -55
  15. package/dist/adapters/image/openai.js +20 -47
  16. package/dist/adapters/image/reference.js +36 -0
  17. package/dist/adapters/image/replicate.js +18 -47
  18. package/dist/adapters/interest/search-interest.js +113 -0
  19. package/dist/adapters/key-probes.js +53 -2
  20. package/dist/adapters/llm/antigravity.js +4 -0
  21. package/dist/adapters/llm/assistant-cli.js +388 -0
  22. package/dist/adapters/llm/child-session.js +83 -0
  23. package/dist/adapters/llm/claude-code-models.js +51 -98
  24. package/dist/adapters/llm/claude-code.js +13 -2
  25. package/dist/adapters/llm/codex-limits.js +27 -68
  26. package/dist/adapters/llm/codex-server-models.js +61 -109
  27. package/dist/adapters/llm/codex.js +12 -1
  28. package/dist/adapters/llm/openrouter.js +10 -47
  29. package/dist/adapters/llm/run-cli.js +6 -22
  30. package/dist/adapters/llm/sse-lines.js +5 -1
  31. package/dist/adapters/model-access.js +37 -0
  32. package/dist/adapters/tts/cartesia.js +15 -46
  33. package/dist/adapters/tts/elevenlabs.js +20 -52
  34. package/dist/adapters/tts/gemini.js +19 -40
  35. package/dist/adapters/tts/inworld-async.js +4 -1
  36. package/dist/adapters/tts/inworld.js +3 -0
  37. package/dist/adapters/tts/openai.js +20 -50
  38. package/dist/assets/models-lifecycle.yaml +6 -0
  39. package/dist/assistant-wiring.js +60 -0
  40. package/dist/autopilot-timers.js +59 -0
  41. package/dist/catalog/lifecycle.js +52 -0
  42. package/dist/catalog/propose.js +204 -0
  43. package/dist/catalog/registry.js +3 -1
  44. package/dist/catalog/schema.js +2 -0
  45. package/dist/catalog/store.js +39 -0
  46. package/dist/edge/autostart/native.js +3 -5
  47. package/dist/edge/autostart/prompt.js +2 -1
  48. package/dist/edge/autostart/service.js +3 -4
  49. package/dist/edge/cli-args.js +3 -4
  50. package/dist/edge/cli.js +2 -1
  51. package/dist/edge/docker-install/apply.js +11 -11
  52. package/dist/edge/docker-install/run.js +2 -1
  53. package/dist/edge/docker-install/state.js +4 -3
  54. package/dist/edge/docker-install/tree.js +2 -4
  55. package/dist/edge/docker-install/volume.js +3 -2
  56. package/dist/edge/docker.js +5 -4
  57. package/dist/edge/events/hub.js +5 -5
  58. package/dist/edge/http/actions.js +4 -25
  59. package/dist/edge/http/actor.js +5 -3
  60. package/dist/edge/http/app.js +85 -10
  61. package/dist/edge/http/assistant.js +127 -0
  62. package/dist/edge/http/audio-preview.js +4 -11
  63. package/dist/edge/http/auditions.js +1 -1
  64. package/dist/edge/http/autostart.js +5 -5
  65. package/dist/edge/http/backups.js +1 -3
  66. package/dist/edge/http/channel-memory.js +7 -20
  67. package/dist/edge/http/channels.js +13 -26
  68. package/dist/edge/http/checkpoints.js +33 -17
  69. package/dist/edge/http/design-templates.js +167 -0
  70. package/dist/edge/http/designs.js +178 -0
  71. package/dist/edge/http/diagnostics.js +5 -1
  72. package/dist/edge/http/document-themes.js +2 -11
  73. package/dist/edge/http/draft-files.js +1 -3
  74. package/dist/edge/http/draft-problem.js +4 -9
  75. package/dist/edge/http/drafts.js +3 -3
  76. package/dist/edge/http/entries.js +6 -9
  77. package/dist/edge/http/extension-auth.js +27 -0
  78. package/dist/edge/http/external-reviews.js +12 -11
  79. package/dist/edge/http/files.js +5 -11
  80. package/dist/edge/http/folder-location.js +1 -4
  81. package/dist/edge/http/fonts.js +0 -7
  82. package/dist/edge/http/home.js +38 -13
  83. package/dist/edge/http/host-cli.js +18 -8
  84. package/dist/edge/http/ids.js +8 -0
  85. package/dist/edge/http/keywords.js +35 -0
  86. package/dist/edge/http/model-checks.js +132 -0
  87. package/dist/edge/http/narration-peaks.js +5 -13
  88. package/dist/edge/http/onboarding.js +1 -14
  89. package/dist/edge/http/open-folder.js +5 -10
  90. package/dist/edge/http/outputs.js +4 -12
  91. package/dist/edge/http/patch-notes.js +4 -10
  92. package/dist/edge/http/planning.js +2 -6
  93. package/dist/edge/http/problem.js +2 -4
  94. package/dist/edge/http/project-create.js +1 -0
  95. package/dist/edge/http/project-templates.js +29 -17
  96. package/dist/edge/http/projects.js +2 -12
  97. package/dist/edge/http/prompts.js +7 -14
  98. package/dist/edge/http/pronunciations.js +1 -2
  99. package/dist/edge/http/providers.js +39 -24
  100. package/dist/edge/http/refusal.js +29 -0
  101. package/dist/edge/http/remote-access.js +40 -0
  102. package/dist/edge/http/remote-guard.js +71 -0
  103. package/dist/edge/http/request-guard.js +91 -0
  104. package/dist/edge/http/reviews.js +11 -24
  105. package/dist/edge/http/revision-files.js +5 -10
  106. package/dist/edge/http/revisions.js +10 -15
  107. package/dist/edge/http/run-cost.js +1 -2
  108. package/dist/edge/http/same-page.js +80 -0
  109. package/dist/edge/http/schedules.js +59 -32
  110. package/dist/edge/http/settings.js +22 -13
  111. package/dist/edge/http/social.js +282 -0
  112. package/dist/edge/http/staging.js +2 -4
  113. package/dist/edge/http/storage-files.js +5 -7
  114. package/dist/edge/http/storage.js +23 -23
  115. package/dist/edge/http/studio.js +23 -50
  116. package/dist/edge/http/style-preview.js +1 -4
  117. package/dist/edge/http/subtitles.js +3 -17
  118. package/dist/edge/http/template-studio.js +433 -0
  119. package/dist/edge/http/trash.js +10 -11
  120. package/dist/edge/http/tutorial.js +1 -2
  121. package/dist/edge/http/tutorials.js +5 -11
  122. package/dist/edge/http/update.js +7 -13
  123. package/dist/edge/http/waveform.js +3 -6
  124. package/dist/edge/http/youtube-edits.js +2 -3
  125. package/dist/edge/mcp/assistant.js +279 -0
  126. package/dist/edge/mcp/attribution.js +8 -2
  127. package/dist/edge/mcp/call-route.js +11 -2
  128. package/dist/edge/mcp/excluded-routes.js +25 -0
  129. package/dist/edge/mcp/http.js +11 -2
  130. package/dist/edge/mcp/instructions.js +5 -3
  131. package/dist/edge/mcp/library-tools.js +1 -0
  132. package/dist/edge/mcp/route-tool.js +35 -15
  133. package/dist/edge/mcp/server.js +13 -8
  134. package/dist/edge/mcp/tools-channels.js +2 -0
  135. package/dist/edge/mcp/tools-designs.js +165 -0
  136. package/dist/edge/mcp/tools-library.js +14 -2
  137. package/dist/edge/mcp/tools-planning.js +23 -4
  138. package/dist/edge/mcp/tools-projects.js +28 -1
  139. package/dist/edge/mcp/tools-runs.js +14 -1
  140. package/dist/edge/mcp/tools-schedules.js +28 -4
  141. package/dist/edge/mcp/tools-setup.js +61 -3
  142. package/dist/edge/mcp/tools-social.js +46 -0
  143. package/dist/edge/mcp/tools-storage.js +8 -0
  144. package/dist/edge/mcp/tools-template-studio.js +166 -0
  145. package/dist/edge/mcp/tools.js +6 -0
  146. package/dist/edge/remote-access/cli.js +71 -0
  147. package/dist/edge/remote-access/model.js +32 -0
  148. package/dist/edge/remote-access/rules.js +207 -0
  149. package/dist/edge/remote-access/service.js +203 -0
  150. package/dist/edge/remote-access/store.js +44 -0
  151. package/dist/edge/remote-access/views.js +43 -0
  152. package/dist/extension/slopify-studio-chrome.zip +0 -0
  153. package/dist/extension/slopify-studio-firefox.zip +0 -0
  154. package/dist/host-cli/install.js +2 -2
  155. package/dist/host-cli/open-folder.js +2 -2
  156. package/dist/host-cli/paths.js +2 -4
  157. package/dist/host-cli/server.js +4 -4
  158. package/dist/host-cli/service.js +3 -3
  159. package/dist/host-cli/status.js +7 -7
  160. package/dist/kernel/db/migrations/0063-model-checks.sql +20 -0
  161. package/dist/kernel/db/migrations/0064-template-studio.sql +46 -0
  162. package/dist/kernel/db/migrations/0065-promise-and-assistant-reviews.sql +58 -0
  163. package/dist/kernel/db/migrations/0066-assistant.sql +44 -0
  164. package/dist/kernel/db/migrations/0067-autopilot.sql +6 -0
  165. package/dist/kernel/db/migrations/0068-topic-scores.sql +17 -0
  166. package/dist/kernel/db/migrations/0070-designs.sql +53 -0
  167. package/dist/kernel/db/migrations/0071-design-usage.sql +33 -0
  168. package/dist/kernel/db/migrations/0072-design-templates.sql +33 -0
  169. package/dist/kernel/db/migrations/0073-schedule-design-kind.sql +5 -0
  170. package/dist/kernel/db/migrations/0074-template-bakeoffs.sql +44 -0
  171. package/dist/kernel/db/migrations/0075-social-posts.sql +25 -0
  172. package/dist/kernel/db/migrations/0076-channel-social.sql +5 -0
  173. package/dist/kernel/db/migrations/0077-post-prompts.sql +17 -0
  174. package/dist/kernel/db/tx.js +2 -4
  175. package/dist/kernel/errors.js +27 -1
  176. package/dist/kernel/json-answer.js +15 -0
  177. package/dist/kernel/lock.js +4 -9
  178. package/dist/kernel/paths.js +8 -0
  179. package/dist/kernel/ports/assistant-cli.js +4 -0
  180. package/dist/kernel/ports/host-cli.js +3 -0
  181. package/dist/kernel/ports/interest.js +4 -0
  182. package/dist/kernel/ports/languages.js +0 -3
  183. package/dist/kernel/ports/model.js +2 -0
  184. package/dist/kernel/runner/attempt.js +3 -1
  185. package/dist/kernel/runner/audition.js +3 -1
  186. package/dist/kernel/runner/checkpoint-authority.js +2 -1
  187. package/dist/kernel/runner/index.js +8 -10
  188. package/dist/kernel/runner/model-access.js +40 -0
  189. package/dist/kernel/runner/model-check.js +153 -0
  190. package/dist/kernel/runner/providers.js +15 -10
  191. package/dist/kernel/runner/standalone.js +9 -5
  192. package/dist/main.js +334 -19
  193. package/dist/model-checks.js +166 -0
  194. package/dist/patch-notes/3.25.9.md +5 -0
  195. package/dist/patch-notes/4.0.0.md +51 -0
  196. package/dist/patch-notes/index.json +12 -0
  197. package/dist/slices/admission/heads.js +2 -1
  198. package/dist/slices/admission/repo.js +2 -1
  199. package/dist/slices/admission/rules.js +43 -8
  200. package/dist/slices/admission/schema.js +8 -0
  201. package/dist/slices/admission/stage-writes.js +0 -3
  202. package/dist/slices/admission/start.js +48 -31
  203. package/dist/slices/admission/substitute.js +7 -4
  204. package/dist/slices/agents/attention-posts.js +31 -0
  205. package/dist/slices/agents/attention-templates.js +33 -0
  206. package/dist/slices/agents/attention.js +10 -1
  207. package/dist/slices/agents/connection.js +2 -6
  208. package/dist/slices/agents/model.js +6 -3
  209. package/dist/slices/agents/repo.js +15 -7
  210. package/dist/slices/article/continuation.js +0 -63
  211. package/dist/slices/article/plain.js +3 -2
  212. package/dist/slices/article/segments.js +2 -62
  213. package/dist/slices/assistant/access.js +1 -0
  214. package/dist/slices/assistant/asks.js +80 -0
  215. package/dist/slices/assistant/cost.js +54 -0
  216. package/dist/slices/assistant/gate.js +222 -0
  217. package/dist/slices/assistant/model.js +79 -0
  218. package/dist/slices/assistant/names.js +23 -0
  219. package/dist/slices/assistant/prompt.js +74 -0
  220. package/dist/slices/assistant/repo.js +74 -0
  221. package/dist/slices/assistant/tokens.js +18 -0
  222. package/dist/slices/assistant/turn.js +342 -0
  223. package/dist/slices/autopilot/buffer.js +76 -0
  224. package/dist/slices/autopilot/model.js +14 -0
  225. package/dist/slices/autopilot/notify.js +27 -0
  226. package/dist/slices/autopilot/repo.js +34 -0
  227. package/dist/slices/autopilot/signals.js +194 -0
  228. package/dist/slices/autopilot/warnings.js +85 -0
  229. package/dist/slices/autopilot/weekly.js +100 -0
  230. package/dist/slices/backups/files.js +2 -6
  231. package/dist/slices/backups/repo.js +3 -15
  232. package/dist/slices/backups/service.js +4 -3
  233. package/dist/slices/channels/cast-images.js +2 -1
  234. package/dist/slices/channels/model.js +0 -1
  235. package/dist/slices/channels/rebrand.js +0 -3
  236. package/dist/slices/channels/repo.js +4 -0
  237. package/dist/slices/channels/schema.js +6 -0
  238. package/dist/slices/channels/service.js +10 -0
  239. package/dist/slices/channels/videos.js +2 -14
  240. package/dist/slices/checkpoints/index.js +0 -1
  241. package/dist/slices/control/providers.js +0 -26
  242. package/dist/slices/designs/artwork.js +66 -0
  243. package/dist/slices/designs/budget.js +23 -0
  244. package/dist/slices/designs/calls.js +124 -0
  245. package/dist/slices/designs/check-context.js +38 -0
  246. package/dist/slices/designs/check-text.js +43 -0
  247. package/dist/slices/designs/fields.js +88 -0
  248. package/dist/slices/designs/frames.js +34 -0
  249. package/dist/slices/designs/gate.js +128 -0
  250. package/dist/slices/designs/layout.js +293 -0
  251. package/dist/slices/designs/model.js +35 -0
  252. package/dist/slices/designs/pdf-job.js +23 -0
  253. package/dist/slices/designs/pdf-pages.js +30 -0
  254. package/dist/slices/designs/pdf-runner.js +68 -0
  255. package/dist/slices/designs/pdf-worker.js +24 -0
  256. package/dist/slices/designs/picture-size.js +79 -0
  257. package/dist/slices/designs/pictures.js +55 -0
  258. package/dist/slices/designs/quote.js +24 -0
  259. package/dist/slices/designs/render-args.js +36 -0
  260. package/dist/slices/designs/render-input.js +59 -0
  261. package/dist/slices/designs/render.js +215 -0
  262. package/dist/slices/designs/repo.js +101 -0
  263. package/dist/slices/designs/requests.js +80 -0
  264. package/dist/slices/designs/runner.js +239 -0
  265. package/dist/slices/designs/sample-repo.js +91 -0
  266. package/dist/slices/designs/sample.js +222 -0
  267. package/dist/slices/designs/schema.js +87 -0
  268. package/dist/slices/designs/sections.js +44 -0
  269. package/dist/slices/designs/service.js +233 -0
  270. package/dist/slices/designs/steps-repo.js +102 -0
  271. package/dist/slices/designs/studio-kind.js +39 -0
  272. package/dist/slices/designs/template-checks.js +44 -0
  273. package/dist/slices/designs/template-make.js +118 -0
  274. package/dist/slices/designs/templates.js +218 -0
  275. package/dist/slices/document/fonts.js +2 -1
  276. package/dist/slices/episodes/summarize.js +5 -1
  277. package/dist/slices/estimate/index.js +45 -7
  278. package/dist/slices/fonts/catalog.js +3 -2
  279. package/dist/slices/fonts/discovery.js +3 -2
  280. package/dist/slices/fonts/files.js +2 -6
  281. package/dist/slices/fonts/index.js +0 -1
  282. package/dist/slices/fonts/sfnt.js +45 -10
  283. package/dist/slices/images/appearance.js +6 -15
  284. package/dist/slices/images/scenes.js +100 -27
  285. package/dist/slices/keywords/digest.js +84 -0
  286. package/dist/slices/keywords/facts.js +92 -0
  287. package/dist/slices/keywords/fill.js +80 -0
  288. package/dist/slices/keywords/model.js +75 -0
  289. package/dist/slices/keywords/rules.js +187 -0
  290. package/dist/slices/keywords/schema.js +28 -0
  291. package/dist/slices/keywords/specs.js +260 -0
  292. package/dist/slices/keywords/values.js +74 -0
  293. package/dist/slices/library/lint.js +29 -12
  294. package/dist/slices/library/model.js +2 -0
  295. package/dist/slices/library/photorealistic.js +4 -12
  296. package/dist/slices/library/rename.js +9 -7
  297. package/dist/slices/library/save.js +14 -10
  298. package/dist/slices/library/slots.js +37 -11
  299. package/dist/slices/library/transfer.js +2 -1
  300. package/dist/slices/library/used-by.js +25 -10
  301. package/dist/slices/loudness/loudnorm.js +51 -11
  302. package/dist/slices/model-checks/cost.js +61 -0
  303. package/dist/slices/model-checks/listing.js +124 -0
  304. package/dist/slices/model-checks/model.js +20 -0
  305. package/dist/slices/model-checks/record.js +32 -0
  306. package/dist/slices/model-checks/repo.js +120 -0
  307. package/dist/slices/model-checks/rules.js +112 -0
  308. package/dist/slices/model-checks/run.js +143 -0
  309. package/dist/slices/model-checks/service.js +198 -0
  310. package/dist/slices/model-upkeep/switch.js +70 -25
  311. package/dist/slices/model-upkeep/usage.js +26 -11
  312. package/dist/slices/narration/breaths.js +2 -1
  313. package/dist/slices/narration/clean-pieces.js +2 -1
  314. package/dist/slices/narration/concat.js +2 -1
  315. package/dist/slices/narration/peaks.js +3 -4
  316. package/dist/slices/narration/pronunciation-chunks.js +4 -3
  317. package/dist/slices/narration/pronunciation.js +3 -2
  318. package/dist/slices/narration/steering.js +4 -3
  319. package/dist/slices/notifications/notifier.js +4 -3
  320. package/dist/slices/notifications/rules.js +5 -2
  321. package/dist/slices/notifications/settings.js +4 -12
  322. package/dist/slices/notifications/subject.js +2 -1
  323. package/dist/slices/onboarding/copy.js +2 -1
  324. package/dist/slices/onboarding/first-run.js +3 -2
  325. package/dist/slices/onboarding/full-video.js +3 -2
  326. package/dist/slices/onboarding/install.js +4 -3
  327. package/dist/slices/onboarding/model.js +0 -16
  328. package/dist/slices/onboarding/packs.js +22 -22
  329. package/dist/slices/onboarding/quick-short.js +2 -1
  330. package/dist/slices/onboarding/sample.js +0 -1
  331. package/dist/slices/onboarding/state.js +2 -11
  332. package/dist/slices/onboarding/template.js +2 -1
  333. package/dist/slices/patch-notes/library.js +3 -2
  334. package/dist/slices/play-drafts/convert.js +4 -0
  335. package/dist/slices/play-drafts/review-inputs.js +8 -2
  336. package/dist/slices/play-drafts/review.js +5 -4
  337. package/dist/slices/play-drafts/schema.js +4 -0
  338. package/dist/slices/project-templates/from-project.js +9 -2
  339. package/dist/slices/project-templates/repo.js +6 -1
  340. package/dist/slices/project-templates/setup.js +8 -0
  341. package/dist/slices/project-templates/stand-ins.js +22 -0
  342. package/dist/slices/rebuild/activity.js +2 -0
  343. package/dist/slices/rebuild/admission-repo.js +3 -2
  344. package/dist/slices/rebuild/narration-history.js +4 -5
  345. package/dist/slices/rebuild/narration-retry.js +2 -1
  346. package/dist/slices/rebuild/preview-details.js +27 -9
  347. package/dist/slices/rebuild/preview-plan.js +3 -8
  348. package/dist/slices/rebuild/recipe-build.js +8 -3
  349. package/dist/slices/rebuild/recipe-describe.js +3 -3
  350. package/dist/slices/rebuild/recipe-digest.js +58 -0
  351. package/dist/slices/rebuild/recipe-input-schema.js +10 -0
  352. package/dist/slices/rebuild/recipe-keywords.js +71 -0
  353. package/dist/slices/rebuild/recipe-legacy.js +5 -1
  354. package/dist/slices/rebuild/recipe-model.js +4 -0
  355. package/dist/slices/rebuild/recipe-narration-text.js +2 -1
  356. package/dist/slices/rebuild/recipe-preparation.js +3 -3
  357. package/dist/slices/rebuild/recipe-reference.js +8 -4
  358. package/dist/slices/rebuild/recipe-reviews.js +27 -7
  359. package/dist/slices/rebuild/recipe-save.js +6 -3
  360. package/dist/slices/rebuild/recipe-scenes.js +40 -11
  361. package/dist/slices/rebuild/recipe-shorts.js +8 -8
  362. package/dist/slices/rebuild/recipe-social.js +46 -0
  363. package/dist/slices/rebuild/recipe-text.js +64 -20
  364. package/dist/slices/rebuild/recipe-validation.js +98 -28
  365. package/dist/slices/rebuild/recipe-visual.js +55 -16
  366. package/dist/slices/rebuild/recipe-work.js +15 -3
  367. package/dist/slices/rebuild/recipe-youtube.js +4 -3
  368. package/dist/slices/rebuild/recovery-selection.js +3 -1
  369. package/dist/slices/rebuild/recovery.js +3 -2
  370. package/dist/slices/rebuild/repo.js +4 -3
  371. package/dist/slices/rebuild/review-promise.js +25 -0
  372. package/dist/slices/rebuild/review-redo.js +2 -1
  373. package/dist/slices/rebuild/runtime-admission.js +4 -3
  374. package/dist/slices/rebuild/runtime-agent-review.js +11 -5
  375. package/dist/slices/rebuild/runtime-animate.js +9 -8
  376. package/dist/slices/rebuild/runtime-article.js +3 -2
  377. package/dist/slices/rebuild/runtime-checkpoints.js +5 -4
  378. package/dist/slices/rebuild/runtime-document.js +8 -11
  379. package/dist/slices/rebuild/runtime-export-bed.js +6 -11
  380. package/dist/slices/rebuild/runtime-export-edit.js +6 -15
  381. package/dist/slices/rebuild/runtime-export-inputs.js +7 -7
  382. package/dist/slices/rebuild/runtime-export-short.js +8 -4
  383. package/dist/slices/rebuild/runtime-export.js +34 -12
  384. package/dist/slices/rebuild/runtime-figure-card.js +2 -1
  385. package/dist/slices/rebuild/runtime-image.js +4 -9
  386. package/dist/slices/rebuild/runtime-instructions.js +2 -0
  387. package/dist/slices/rebuild/runtime-keywords.js +59 -0
  388. package/dist/slices/rebuild/runtime-lines.js +2 -11
  389. package/dist/slices/rebuild/runtime-local.js +14 -20
  390. package/dist/slices/rebuild/runtime-narration-publication.js +2 -5
  391. package/dist/slices/rebuild/runtime-narration-reuse.js +9 -13
  392. package/dist/slices/rebuild/runtime-narration-text.js +10 -15
  393. package/dist/slices/rebuild/runtime-pictures.js +2 -4
  394. package/dist/slices/rebuild/runtime-piece-label.js +10 -6
  395. package/dist/slices/rebuild/runtime-plan.js +31 -5
  396. package/dist/slices/rebuild/runtime-provider.js +60 -19
  397. package/dist/slices/rebuild/runtime-publication.js +10 -9
  398. package/dist/slices/rebuild/runtime-review.js +33 -28
  399. package/dist/slices/rebuild/runtime-run.js +4 -1
  400. package/dist/slices/rebuild/runtime-shorts.js +34 -50
  401. package/dist/slices/rebuild/runtime-store.js +3 -8
  402. package/dist/slices/rebuild/runtime-subtitles.js +16 -14
  403. package/dist/slices/rebuild/runtime-voices.js +8 -15
  404. package/dist/slices/rebuild/runtime-youtube.js +11 -29
  405. package/dist/slices/rebuild/transition-repo.js +6 -5
  406. package/dist/slices/rebuild/work-records.js +6 -0
  407. package/dist/slices/reruns/cascade.js +1 -2
  408. package/dist/slices/reruns/index.js +6 -9
  409. package/dist/slices/reviews/external-model.js +3 -0
  410. package/dist/slices/reviews/external-repo.js +2 -1
  411. package/dist/slices/reviews/external-rows.js +2 -3
  412. package/dist/slices/reviews/model.js +26 -8
  413. package/dist/slices/reviews/repo.js +2 -1
  414. package/dist/slices/reviews/rules.js +1 -0
  415. package/dist/slices/reviews/view.js +5 -2
  416. package/dist/slices/revisions/downloads.js +4 -5
  417. package/dist/slices/revisions/mutation-assets.js +7 -4
  418. package/dist/slices/revisions/mutation-cues.js +2 -5
  419. package/dist/slices/revisions/mutations.js +0 -1
  420. package/dist/slices/revisions/repo.js +3 -1
  421. package/dist/slices/revisions/schema.js +1 -0
  422. package/dist/slices/revisions/view.js +20 -0
  423. package/dist/slices/run-cost/limits.js +5 -2
  424. package/dist/slices/run-cost/meter.js +12 -5
  425. package/dist/slices/run-cost/panel.js +8 -74
  426. package/dist/slices/run-cost/plan-readings.js +127 -0
  427. package/dist/slices/run-cost/plan-use.js +169 -0
  428. package/dist/slices/run-cost/pricing.js +3 -3
  429. package/dist/slices/run-cost/week.js +32 -4
  430. package/dist/slices/schedules/agenda.js +11 -2
  431. package/dist/slices/schedules/by-date.js +42 -0
  432. package/dist/slices/schedules/calendar.js +5 -0
  433. package/dist/slices/schedules/design-agenda.js +36 -0
  434. package/dist/slices/schedules/design-check.js +41 -0
  435. package/dist/slices/schedules/design-run.js +126 -0
  436. package/dist/slices/schedules/next-run.js +62 -0
  437. package/dist/slices/schedules/prepare.js +18 -2
  438. package/dist/slices/schedules/repo.js +24 -16
  439. package/dist/slices/schedules/rescore.js +35 -0
  440. package/dist/slices/schedules/scheduler.js +13 -3
  441. package/dist/slices/schedules/schema.js +54 -3
  442. package/dist/slices/schedules/score.js +107 -0
  443. package/dist/slices/schedules/service.js +57 -24
  444. package/dist/slices/schedules/topic-list.js +15 -0
  445. package/dist/slices/schedules/topic-scores.js +104 -0
  446. package/dist/slices/schedules/topics.js +48 -36
  447. package/dist/slices/settings/cli-paths.js +4 -6
  448. package/dist/slices/settings/first-run.js +2 -11
  449. package/dist/slices/settings/model-reach.js +3 -17
  450. package/dist/slices/settings/model.js +10 -0
  451. package/dist/slices/settings/playback.js +33 -22
  452. package/dist/slices/settings/probe-read.js +16 -0
  453. package/dist/slices/settings/repo.js +33 -0
  454. package/dist/slices/settings/tutorial.js +2 -2
  455. package/dist/slices/settings/voices.js +4 -12
  456. package/dist/slices/shorts/pick.js +2 -15
  457. package/dist/slices/shorts/prompts.js +2 -13
  458. package/dist/slices/shorts/render.js +3 -0
  459. package/dist/slices/social/channel.js +44 -0
  460. package/dist/slices/social/defaults.js +17 -0
  461. package/dist/slices/social/due.js +36 -0
  462. package/dist/slices/social/extension.js +18 -0
  463. package/dist/slices/social/fit.js +115 -0
  464. package/dist/slices/social/limits.js +186 -0
  465. package/dist/slices/social/links.js +21 -0
  466. package/dist/slices/social/media.js +131 -0
  467. package/dist/slices/social/model.js +75 -0
  468. package/dist/slices/social/notice.js +19 -0
  469. package/dist/slices/social/pack.js +176 -0
  470. package/dist/slices/social/post-prompt.js +55 -0
  471. package/dist/slices/social/queue.js +31 -0
  472. package/dist/slices/social/repo.js +133 -0
  473. package/dist/slices/social/reshape.js +97 -0
  474. package/dist/slices/social/rules.js +5 -0
  475. package/dist/slices/social/schema.js +70 -0
  476. package/dist/slices/social/serve.js +51 -0
  477. package/dist/slices/social/service.js +128 -0
  478. package/dist/slices/social/settings.js +21 -0
  479. package/dist/slices/social/sources.js +114 -0
  480. package/dist/slices/social/state.js +110 -0
  481. package/dist/slices/social/text.js +149 -0
  482. package/dist/slices/storage/arrange.js +3 -1
  483. package/dist/slices/storage/assets.js +8 -10
  484. package/dist/slices/storage/backup-designs.js +74 -0
  485. package/dist/slices/storage/backup-export.js +8 -3
  486. package/dist/slices/storage/backup-format.js +10 -0
  487. package/dist/slices/storage/backup-import.js +20 -2
  488. package/dist/slices/storage/delete-project.js +6 -5
  489. package/dist/slices/storage/files-location.js +6 -8
  490. package/dist/slices/storage/layout.js +13 -2
  491. package/dist/slices/storage/model.js +3 -0
  492. package/dist/slices/storage/portable.js +16 -11
  493. package/dist/slices/storage/schema.js +2 -0
  494. package/dist/slices/storage/staging-refs.js +2 -1
  495. package/dist/slices/storage/staging.js +6 -9
  496. package/dist/slices/storage/trim.js +10 -3
  497. package/dist/slices/studio/calendar.js +4 -1
  498. package/dist/slices/studio/pick.js +2 -11
  499. package/dist/slices/studio/plan.js +6 -15
  500. package/dist/slices/studio/queue.js +3 -14
  501. package/dist/slices/studio/releases.js +26 -0
  502. package/dist/slices/studio/settings.js +14 -51
  503. package/dist/slices/studio/videos.js +12 -0
  504. package/dist/slices/style-preview/render.js +34 -13
  505. package/dist/slices/style-preview/schema.js +13 -0
  506. package/dist/slices/style-preview/service.js +2 -1
  507. package/dist/slices/style-preview/settings.js +33 -5
  508. package/dist/slices/telemetry/collector-client.js +2 -4
  509. package/dist/slices/telemetry/flush.js +2 -4
  510. package/dist/slices/telemetry/model.js +0 -7
  511. package/dist/slices/telemetry/record.js +10 -3
  512. package/dist/slices/template-studio/anatomy-view.js +118 -0
  513. package/dist/slices/template-studio/anatomy.js +73 -0
  514. package/dist/slices/template-studio/bakeoff-make.js +225 -0
  515. package/dist/slices/template-studio/bakeoff-repo.js +83 -0
  516. package/dist/slices/template-studio/bakeoff.js +333 -0
  517. package/dist/slices/template-studio/budget.js +103 -0
  518. package/dist/slices/template-studio/checks.js +273 -0
  519. package/dist/slices/template-studio/document-sample.js +56 -0
  520. package/dist/slices/template-studio/edit.js +15 -0
  521. package/dist/slices/template-studio/for-all.js +161 -0
  522. package/dist/slices/template-studio/free-video.js +31 -0
  523. package/dist/slices/template-studio/free.js +176 -0
  524. package/dist/slices/template-studio/gate.js +40 -0
  525. package/dist/slices/template-studio/hidden.js +20 -0
  526. package/dist/slices/template-studio/jobs.js +79 -0
  527. package/dist/slices/template-studio/loudness.js +111 -0
  528. package/dist/slices/template-studio/make.js +40 -0
  529. package/dist/slices/template-studio/model.js +54 -0
  530. package/dist/slices/template-studio/pack-import.js +253 -0
  531. package/dist/slices/template-studio/pack-samples.js +60 -0
  532. package/dist/slices/template-studio/pack.js +205 -0
  533. package/dist/slices/template-studio/paid-view.js +66 -0
  534. package/dist/slices/template-studio/paid.js +348 -0
  535. package/dist/slices/template-studio/quote.js +148 -0
  536. package/dist/slices/template-studio/ready.js +104 -0
  537. package/dist/slices/template-studio/repo.js +134 -0
  538. package/dist/slices/template-studio/reviews-path.js +58 -0
  539. package/dist/slices/template-studio/runner.js +84 -0
  540. package/dist/slices/template-studio/save.js +236 -0
  541. package/dist/slices/template-studio/say-it-as.js +248 -0
  542. package/dist/slices/template-studio/schedule-gate.js +34 -0
  543. package/dist/slices/template-studio/schedule-price.js +30 -0
  544. package/dist/slices/template-studio/schedule-sample.js +87 -0
  545. package/dist/slices/template-studio/schema.js +218 -0
  546. package/dist/slices/template-studio/scope.js +124 -0
  547. package/dist/slices/template-studio/sections.js +176 -0
  548. package/dist/slices/template-studio/service.js +173 -0
  549. package/dist/slices/template-studio/status.js +174 -0
  550. package/dist/slices/template-studio/topic.js +223 -0
  551. package/dist/slices/trash/designs.js +76 -0
  552. package/dist/slices/trash/model.js +13 -4
  553. package/dist/slices/trash/service.js +52 -2
  554. package/dist/slices/tutorials/library.js +3 -2
  555. package/dist/slices/video/ass-text.js +17 -0
  556. package/dist/slices/video/audio-export.js +2 -64
  557. package/dist/slices/video/encoding.js +160 -0
  558. package/dist/slices/video/ffmpeg.js +23 -21
  559. package/dist/slices/video/figure-card.js +1 -15
  560. package/dist/slices/video/slideshow.js +43 -18
  561. package/dist/slices/voices/palette.js +0 -3
  562. package/dist/slices/youtube/answer.js +2 -15
  563. package/dist/slices/youtube/edits-repo.js +2 -11
  564. package/dist/tutorials/Agents-MCP.md +2 -1
  565. package/dist/tutorials/Assistant.md +42 -0
  566. package/dist/tutorials/Channels.md +2 -0
  567. package/dist/tutorials/Home-and-Projects.md +19 -0
  568. package/dist/tutorials/Install.md +1 -0
  569. package/dist/tutorials/Keywords-Slopify-Fills.md +87 -0
  570. package/dist/tutorials/Models.md +33 -1
  571. package/dist/tutorials/Notifications.md +6 -0
  572. package/dist/tutorials/Play-Images.md +4 -0
  573. package/dist/tutorials/Posting-to-Social-Sites.md +121 -0
  574. package/dist/tutorials/Prompts.md +10 -6
  575. package/dist/tutorials/Remote-Access.md +63 -0
  576. package/dist/tutorials/Reviews-and-Checkpoints.md +13 -2
  577. package/dist/tutorials/Schedules.md +21 -1
  578. package/dist/tutorials/Settings-Reference.md +50 -8
  579. package/dist/tutorials/Template-Studio.md +125 -0
  580. package/dist/tutorials/Templates.md +3 -0
  581. package/dist/tutorials/_Sidebar.md +5 -0
  582. package/dist/updater/work-in-progress.js +42 -12
  583. package/dist/web/assets/index-CkAI_2E7.css +1 -0
  584. package/dist/web/assets/index-DcD0cdfo.js +334 -0
  585. package/dist/web/assets/{pdf-T7MCwjIv.js → pdf-TODRwF31.js} +1 -1
  586. package/dist/web/index.html +2 -2
  587. package/package.json +5 -1
  588. package/dist/slices/article/provided-entries.js +0 -66
  589. package/dist/slices/article/run.js +0 -145
  590. package/dist/slices/images/run.js +0 -234
  591. package/dist/slices/narration/legacy-plan.js +0 -58
  592. package/dist/slices/narration/run.js +0 -270
  593. package/dist/slices/rebuild/runtime-actions.js +0 -90
  594. package/dist/slices/research/run.js +0 -224
  595. package/dist/slices/subtitles/prepare.js +0 -194
  596. package/dist/slices/subtitles/transcript.js +0 -34
  597. package/dist/slices/thumbnail/run.js +0 -219
  598. package/dist/slices/video/audio-inputs.js +0 -33
  599. package/dist/slices/video/reuse-audio.js +0 -62
  600. package/dist/slices/video/run.js +0 -78
  601. package/dist/slices/video/write-export.js +0 -158
  602. package/dist/slices/video/write-subtitles.js +0 -59
  603. package/dist/web/assets/index-BadsoORk.css +0 -1
  604. package/dist/web/assets/index-D8LqNsCl.js +0 -326
@@ -0,0 +1,165 @@
1
+ import { editPictureSchema, makeArtworkSchema, quoteEditSchema, retryStepSchema, } from "../../slices/designs/requests.js";
2
+ import { makeFromTemplateSchema } from "../../slices/designs/template-make.js";
3
+ import { createTemplateSchema, markReadySchema as markDesignReadySchema, saveTemplateSchema, } from "../../slices/designs/templates.js";
4
+ import { sampleRequestSchema } from "../http/design-templates.js";
5
+ import { formBody } from "./route-tool.js";
6
+ // Library → Designs: pictures edited step by step and designed pieces (posters, flyers,
7
+ // brochures, social images), and the design templates they are made from. Every paid step
8
+ // starts only with the acknowledgedHigh its quote gave.
9
+ const paid = "a paid call: send acknowledgedHigh as the quote's high (refused with the new quote when the price rose)";
10
+ export const designTools = [
11
+ {
12
+ name: "list_designs",
13
+ route: "GET /api/designs",
14
+ title: "List designs",
15
+ description: "Every design with its versions, newest first. Query: projectId to list one project's.",
16
+ },
17
+ {
18
+ name: "upload_design_picture",
19
+ route: "POST /api/designs/pictures",
20
+ title: "Upload a picture to design with",
21
+ description: "Keeps a PNG or JPEG (at most 10 MB) and answers its sha256, which create_design takes as fromStepSha.",
22
+ upload: "raw",
23
+ },
24
+ {
25
+ name: "create_design",
26
+ route: "POST /api/designs",
27
+ title: "Start a design",
28
+ description: `Starts an edit from a picture (kind "edit" with fromStepSha or stagedFileId) or a designed piece (kind "design" with its document). Body: {id: a new id of letters, digits, - and _, mutationId: a new UUID, kind, name, channelId?, projectId?, stagedFileId? | fromStepSha?, document?, values?}.`,
29
+ },
30
+ {
31
+ name: "get_design",
32
+ route: "GET /api/designs/:id",
33
+ title: "Read a design",
34
+ description: "One design: its settings, values, current version (headStepId) and every version.",
35
+ },
36
+ {
37
+ name: "update_design",
38
+ route: "PUT /api/designs/:id",
39
+ title: "Save a design",
40
+ description: `Renames it, links it to a project (projectId, or null to unlink), saves its settings (document; an edit with a document becomes a designed piece) and values. Body: {baseUpdatedAt: the updatedAt get_design returns, name?, projectId?, document?, values?}. ${formBody("the design's Text and Formats tabs")}`,
41
+ },
42
+ {
43
+ name: "delete_design",
44
+ route: "DELETE /api/designs/:id",
45
+ title: "Delete a design",
46
+ description: "Moves the design to Settings → Trash, where it stays 30 days.",
47
+ confirm: "It moves to Settings → Trash. After 30 days it is removed for good with every version and every file drawn from it.",
48
+ },
49
+ {
50
+ name: "quote_design_edit",
51
+ route: "POST /api/designs/:id/quote",
52
+ body: quoteEditSchema,
53
+ title: "Price a picture edit",
54
+ description: "What one edit costs with this model. Body: {provider, model, castMemberIds?}. Records nothing.",
55
+ unrecorded: true,
56
+ },
57
+ {
58
+ name: "quote_design_artwork",
59
+ route: "POST /api/designs/:id/artwork/quote",
60
+ title: "Price a design's artwork",
61
+ description: "What drawing the designed piece's artwork costs. Records nothing.",
62
+ unrecorded: true,
63
+ },
64
+ {
65
+ name: "edit_design_picture",
66
+ route: "POST /api/designs/:id/edit",
67
+ body: editPictureSchema,
68
+ title: "Edit the picture",
69
+ description: `Changes a version of the picture as the instruction says; the result lands as the next version (read get_design until it is ready or failed). This is ${paid}. Body: {mutationId: a new UUID, fromStepId, instruction, provider, model, castMemberIds?, acknowledgedHigh}.`,
70
+ },
71
+ {
72
+ name: "make_design_artwork",
73
+ route: "POST /api/designs/:id/artwork",
74
+ body: makeArtworkSchema,
75
+ title: "Make the artwork",
76
+ description: `Draws the designed piece's artwork from its picture prompt with its fields filled. This is ${paid}. Body: {mutationId: a new UUID, acknowledgedHigh}.`,
77
+ },
78
+ {
79
+ name: "retry_design_step",
80
+ route: "POST /api/designs/:id/steps/:stepId/retry",
81
+ body: retryStepSchema,
82
+ title: "Try a failed version again",
83
+ description: "Asks the provider again for a version that failed, as Try again does. It is paid again, even for a version a restart stopped that may already have been charged: send acknowledgedHigh as the high price quote_design_edit (an edited picture) or quote_design_artwork (artwork) gives for that version's provider and model, and acknowledgedUnknown: true when that price is unknown; refused with the current quote when it differs. Body: {acknowledgedHigh, acknowledgedUnknown?}.",
84
+ },
85
+ {
86
+ name: "set_design_version",
87
+ route: "PUT /api/designs/:id/head",
88
+ title: "Continue from a version",
89
+ description: "Makes a ready version the one the next edit starts from and the files are drawn from. Free. Body: {stepId}.",
90
+ },
91
+ {
92
+ name: "get_design_picture",
93
+ route: "GET /api/designs/:id/steps/:stepId/picture",
94
+ title: "See a version",
95
+ description: "One version of the design's picture, as an image.",
96
+ },
97
+ {
98
+ name: "get_design_file",
99
+ route: "GET /api/designs/:id/files/:file",
100
+ title: "Draw a finished piece",
101
+ description: "Draws the piece in one format with Slopify's text layer, as the design page's Download does: file is <format>.png (a4, a3, flyer, square, portrait, story, wide) or <format>.pdf (a4, a3, flyer, brochure). A PNG comes back as an image; a PDF is drawn and its size reported.",
102
+ },
103
+ {
104
+ name: "list_design_templates",
105
+ route: "GET /api/design-templates",
106
+ title: "List design templates",
107
+ description: "Every design template with its versions and the version marked ready.",
108
+ },
109
+ {
110
+ name: "create_design_template",
111
+ route: "POST /api/design-templates",
112
+ body: createTemplateSchema,
113
+ title: "Create a design template",
114
+ description: "Body: {id: a new id, mutationId: a new UUID, name, document, channelId?}.",
115
+ },
116
+ {
117
+ name: "get_design_template",
118
+ route: "GET /api/design-templates/:id",
119
+ title: "Read a design template",
120
+ description: "One design template: its newest version, its checks and every version.",
121
+ },
122
+ {
123
+ name: "save_design_template",
124
+ route: "PUT /api/design-templates/:id",
125
+ body: saveTemplateSchema,
126
+ title: "Save a design template",
127
+ description: `Saves a new version. Body: {baseVersion: the headVersion get_design_template returns, name, document, sample?: "make" | "skip", acknowledgedHigh?}. ${formBody("the template editor")}`,
128
+ },
129
+ {
130
+ name: "delete_design_template",
131
+ route: "DELETE /api/design-templates/:id",
132
+ title: "Delete a design template",
133
+ description: "Moves the template to Settings → Trash, where it stays 30 days.",
134
+ confirm: "It moves to Settings → Trash, and schedules that make from it stop making pieces. After 30 days it is removed for good with its versions and its sample.",
135
+ },
136
+ {
137
+ name: "quote_design_template",
138
+ route: "POST /api/design-templates/:id/quote",
139
+ title: "Price a piece from a template",
140
+ description: "What one piece made from the template's newest version costs. With a body {document}: what saving that document would cost the editor's sample instead (only a changed picture is paid), with the sections it changes and whether it makes a picture. Records nothing.",
141
+ unrecorded: true,
142
+ },
143
+ {
144
+ name: "make_design_template_sample",
145
+ route: "POST /api/design-templates/:id/sample",
146
+ body: sampleRequestSchema,
147
+ title: "Make a template's sample",
148
+ description: `Makes the template editor's sample of a version now, when it is held (it cost more than shown, a price is unknown or the day's sample budget is spent), failed or not made yet. This is ${paid}. Body: {version, acknowledgedHigh: the quote's high}.`,
149
+ },
150
+ {
151
+ name: "mark_design_template_ready",
152
+ route: "POST /api/design-templates/:id/ready",
153
+ body: markDesignReadySchema,
154
+ title: "Mark a template version ready",
155
+ description: "Runs the version's checks and marks it ready when they pass; refused with the checks that failed. Body: {version}.",
156
+ confirm: "Schedules start making pieces from this version.",
157
+ },
158
+ {
159
+ name: "make_design_from_template",
160
+ route: "POST /api/design-templates/:id/make",
161
+ body: makeFromTemplateSchema,
162
+ title: "Make a piece from a template",
163
+ description: `Makes one designed piece from a template version with these values and starts its artwork. This is ${paid}. Body: {mutationId: a new UUID, values, acknowledgedHigh, version?, name?, projectId?}.`,
164
+ },
165
+ ];
@@ -10,13 +10,25 @@ export const libraryTools = [
10
10
  name: "create_prompt",
11
11
  route: "POST /api/prompts",
12
12
  title: "Create a prompt",
13
- description: "Body: {kind: article | image | thumbnail | narration | description | shorts | review | script, name, body}.",
13
+ description: "Body: {kind: article | image | thumbnail | narration | description | shorts | review | script, name, body}. A body can use the keywords Slopify fills ({{Slopify_Title}}, {{Slopify_Summary}}, {{Slopify_Scene}}…; list_keywords says which work in which kind); any other name starting with Slopify_ is refused.",
14
14
  },
15
15
  {
16
16
  name: "update_prompt",
17
17
  route: "PUT /api/prompts/:id",
18
18
  title: "Save a prompt",
19
- description: "Body: {kind, name, body}. Saving adds a history version; a rename follows into templates and Play drafts.",
19
+ description: "Body: {kind, name, body}. Saving adds a history version; a rename follows into templates and Play drafts. The body follows create_prompt's keyword rules; an unknown Slopify_ name the prompt already had is kept.",
20
+ },
21
+ {
22
+ name: "list_keywords",
23
+ route: "GET /api/keywords",
24
+ title: "List the keywords Slopify fills",
25
+ description: "Every {{Slopify_…}} keyword: what it fills in, an example, when it exists, which prompt kinds can use it and what it costs (free, or part of one AI call per run). {{Scene}} and {{Appearance}} are the old names of {{Slopify_Scene}} and {{Slopify_Appearance}}.",
26
+ },
27
+ {
28
+ name: "get_keyword_facts",
29
+ route: "GET /api/keywords/facts/:projectId",
30
+ title: "Read a project's keyword facts as they are now",
31
+ description: "The facts keywords like {{Slopify_Channel}}, {{Slopify_Links}} and {{Slopify_Previous_Video}} are filled from, copied again from the project's channel and its other projects, like Refresh keyword facts in Edit project. Put the answer's keywordFacts into the revision's config and save it with save_revision.",
20
32
  },
21
33
  {
22
34
  name: "set_prompt_photorealistic",
@@ -1,3 +1,8 @@
1
+ import { createDraftInputSchema } from "../../slices/play-drafts/schema.js";
2
+ import { templateCreateSchema } from "../../slices/project-templates/schema.js";
3
+ import { startBody, versionBody } from "../http/drafts.js";
4
+ import { nextChapterBody, templateDeleteBody, templateFromProjectBody, templateInstantiateBody, templateUpdateBody, } from "../http/project-templates.js";
5
+ import { saveBody } from "../http/revisions.js";
1
6
  import { formBody } from "./route-tool.js";
2
7
  const drafts = [
3
8
  {
@@ -9,6 +14,7 @@ const drafts = [
9
14
  {
10
15
  name: "create_draft",
11
16
  route: "POST /api/drafts",
17
+ body: createDraftInputSchema,
12
18
  title: "Create a Play draft",
13
19
  description: "Create, like New project: a draft whose document is the Play form (kind and outputs, format including square 1:1, sources, prompts, voices, reviews, the queue switch). Body: {id: a new UUID, document}. get_draft shows a document's shape; instantiate_template makes one from a template.",
14
20
  },
@@ -21,18 +27,21 @@ const drafts = [
21
27
  {
22
28
  name: "save_draft",
23
29
  route: "PUT /api/drafts/:id",
30
+ body: saveBody,
24
31
  title: "Save a Play draft",
25
32
  description: "Saves the draft's document; queue: true is Play's Queue switch, so several videos run one after another. Body: {baseVersion: the draft's version, mutationId: a new UUID, document}.",
26
33
  },
27
34
  {
28
35
  name: "fork_draft",
29
36
  route: "POST /api/drafts/:id/fork",
37
+ body: createDraftInputSchema,
30
38
  title: "Copy a Play draft",
31
39
  description: "Body: {id: a new UUID for the copy, sourceId: this draft's id, document}.",
32
40
  },
33
41
  {
34
42
  name: "discard_draft",
35
43
  route: "DELETE /api/drafts/:id",
44
+ body: versionBody,
36
45
  title: "Discard a Play draft",
37
46
  description: "Body: {baseVersion}.",
38
47
  confirm: "This discards the draft and its uploaded files for good.",
@@ -40,6 +49,7 @@ const drafts = [
40
49
  {
41
50
  name: "review_draft",
42
51
  route: "POST /api/drafts/:id/review",
52
+ body: versionBody,
43
53
  title: "Review a Play draft",
44
54
  description: "Play's Review step: readiness, warnings and the cost estimate the person sees before Start. Body: {baseVersion}. start_draft needs this review's id.",
45
55
  unrecorded: true,
@@ -47,6 +57,7 @@ const drafts = [
47
57
  {
48
58
  name: "start_draft",
49
59
  route: "POST /api/drafts/:id/start",
60
+ body: startBody,
50
61
  title: "Start a Play draft",
51
62
  description: "Start in Play: starts the reviewed draft's runs, which spend what the review estimated. Body: {baseVersion, reviewId: the id review_draft returned}.",
52
63
  },
@@ -83,6 +94,8 @@ const drafts = [
83
94
  description: "Removes an uploaded file no edit used.",
84
95
  },
85
96
  ];
97
+ // Which version a schedule runs after a save (`template-studio/gate.ts`).
98
+ const templateGateRule = "Schedules use a new version from their next run unless a version of this template was marked ready in its Template studio (mark_template_ready); from then on a new version waits until it is marked ready.";
86
99
  const templates = [
87
100
  {
88
101
  name: "list_templates",
@@ -93,20 +106,23 @@ const templates = [
93
106
  {
94
107
  name: "create_template",
95
108
  route: "POST /api/project-templates",
109
+ body: templateCreateSchema,
96
110
  title: "Create a template",
97
- description: formBody("the template editor"),
111
+ description: `${formBody("the template editor")} ${templateGateRule}`,
98
112
  },
99
113
  {
100
114
  name: "template_from_project",
101
115
  route: "POST /api/project-templates/from-project/:projectId",
116
+ body: templateFromProjectBody,
102
117
  title: "Save a project as a template",
103
- description: formBody("Save as template on the project page"),
118
+ description: `${formBody("Save as template on the project page")} ${templateGateRule}`,
104
119
  },
105
120
  {
106
121
  name: "next_chapter_template",
107
122
  route: "POST /api/project-templates/next-chapter/:projectId",
123
+ body: nextChapterBody,
108
124
  title: "Template for the next chapter",
109
- description: formBody("Next chapter on the project page"),
125
+ description: `${formBody("Next chapter on the project page")} ${templateGateRule}`,
110
126
  },
111
127
  {
112
128
  name: "get_template",
@@ -117,12 +133,14 @@ const templates = [
117
133
  {
118
134
  name: "update_template",
119
135
  route: "PUT /api/project-templates/:id",
136
+ body: templateUpdateBody,
120
137
  title: "Save a template",
121
- description: `${formBody("the template editor")} Saving adds a version.`,
138
+ description: `${formBody("the template editor")} Saving adds a version. ${templateGateRule}`,
122
139
  },
123
140
  {
124
141
  name: "delete_template",
125
142
  route: "DELETE /api/project-templates/:id",
143
+ body: templateDeleteBody,
126
144
  title: "Delete a template",
127
145
  description: formBody("Delete in Library → Templates"),
128
146
  confirm: "Moves it to the trash for 30 days (Settings → Trash). Existing projects and drafts keep their setup.",
@@ -130,6 +148,7 @@ const templates = [
130
148
  {
131
149
  name: "instantiate_template",
132
150
  route: "POST /api/project-templates/:id/instantiate",
151
+ body: templateInstantiateBody,
133
152
  title: "Use a template",
134
153
  description: "Opens a new Play draft from the template, like Use template.",
135
154
  },
@@ -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.
@@ -55,7 +59,7 @@ const projects = [
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
  },
@@ -130,12 +154,14 @@ const decisions = [
130
154
  {
131
155
  name: "approve_checkpoint",
132
156
  route: "POST /api/projects/:id/checkpoints/:checkpointId/approve",
157
+ body: approvalBody,
133
158
  title: "Approve a checkpoint",
134
159
  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}.",
135
160
  },
136
161
  {
137
162
  name: "change_checkpoints",
138
163
  route: "PATCH /api/projects/:id/checkpoints",
164
+ body: checkpointChangeSchema,
139
165
  title: "Change checkpoints",
140
166
  description: 'Sets the stages that stop for approval, like the Checkpoints tab. Body: {revisionId, stages: ["audio" | "images" | "video"]}.',
141
167
  },
@@ -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
  },
@@ -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,6 +43,7 @@ const runs = [
35
43
  {
36
44
  name: "rerun_stage",
37
45
  route: "POST /api/projects/:id/stages/:kind/rerun",
46
+ body: revisionControlSchema,
38
47
  title: "Re-run a stage",
39
48
  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
49
  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.",
@@ -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,18 +77,21 @@ 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
82
  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.",
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
89
  description: "Makes an earlier version current again, like Restore this revision; 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",
94
+ body: previewRebuildSchema,
83
95
  title: "Choose what to remake",
84
96
  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.',
85
97
  unrecorded: true,
@@ -87,6 +99,7 @@ const revisions = [
87
99
  {
88
100
  name: "start_rebuild",
89
101
  route: "POST /api/projects/:id/rebuild",
102
+ body: startRebuildSchema,
90
103
  title: "Start a remake",
91
104
  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}.",
92
105
  },
@@ -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 marked ready.`,
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.",
@@ -65,8 +73,9 @@ export const scheduleTools = [
65
73
  {
66
74
  name: "prepare_topic",
67
75
  route: "POST /api/schedules/:id/topics/prepare",
76
+ body: prepareTopicBody,
68
77
  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}.",
78
+ 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 and while the schedule is paused. Body: {topic: the topic's title}.",
70
79
  },
71
80
  {
72
81
  name: "generate_topics",
@@ -74,6 +83,13 @@ export const scheduleTools = [
74
83
  title: "Suggest topics",
75
84
  description: "Asks the schedule's text model for topics, a paid call, like Suggest topics.",
76
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",
92
+ },
77
93
  {
78
94
  name: "approve_all_topics",
79
95
  route: "POST /api/schedules/:id/topics/held/approve-all",
@@ -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
  },