@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,7 +1,9 @@
1
1
  import { z } from "zod";
2
2
  import { redact } from "../../kernel/log.js";
3
3
  import { providerError } from "../../kernel/ports/model.js";
4
+ import { editSettings } from "../../kernel/ports/settings-places.js";
4
5
  import { httpFailure, missingKey, noAudio, unreadable, voiceFix } from "../explain.js";
6
+ import { accessField } from "../model-access.js";
5
7
  import { retryAfter } from "../retry-after.js";
6
8
  import { inworldAsync, streamFailure } from "./inworld-async.js";
7
9
  import { inworldLanguages, lookUp } from "./voice-languages.js";
@@ -69,7 +71,7 @@ async function* synthesizeRequest(deps, request, key) {
69
71
  if (request.text.trim().length === 0)
70
72
  throw providerError({
71
73
  kind: "unsupported",
72
- message: "Inworld was sent an empty piece of narration. Check the article has text in the Article section of Edit project, then use Try again.",
74
+ message: `Inworld was sent an empty piece of narration. Check the article has text in ${editSettings.article}, then use Try again.`,
73
75
  });
74
76
  if ((request.model ?? "inworld-tts-2") === "inworld-tts-2" && request.text.length > 4000) {
75
77
  yield* inworldAsync(deps, request, key);
@@ -78,7 +80,7 @@ async function* synthesizeRequest(deps, request, key) {
78
80
  if (request.text.length > 4000)
79
81
  throw providerError({
80
82
  kind: "unsupported",
81
- message: "This narration part is longer than the 4,000 characters Inworld's Flash model takes at once. In the Providers section of Edit project, set Chunking to Paragraph or a smaller character count, or switch to the Realtime TTS-2 model.",
83
+ message: `This narration part is longer than the 4,000 characters Inworld's Flash model takes at once. In ${editSettings.narration}, set Chunking to Paragraph or a smaller character count, or switch to the Realtime TTS-2 voice model.`,
82
84
  });
83
85
  request.signal.throwIfAborted();
84
86
  const response = await deps.fetch("https://api.inworld.ai/tts/v1/voice:stream", {
@@ -97,6 +99,7 @@ async function* synthesizeRequest(deps, request, key) {
97
99
  const detail = clean(await response.text().catch(() => ""), key);
98
100
  const retryAfterMs = retryAfter(response.headers.get("retry-after"));
99
101
  throw providerError({
102
+ ...accessField(response.status, detail),
100
103
  kind: response.status === 401 || response.status === 403
101
104
  ? "auth"
102
105
  : response.status === 429
@@ -134,6 +137,7 @@ async function* synthesizeRequest(deps, request, key) {
134
137
  if (parsed.data.error) {
135
138
  const { code, message } = parsed.data.error;
136
139
  throw providerError({
140
+ ...accessField(code === 5 ? 404 : code === 7 ? 403 : null, message ?? ""),
137
141
  kind: code === 16 || code === 7
138
142
  ? "auth"
139
143
  : code === 8
@@ -1,8 +1,9 @@
1
1
  import { z } from "zod";
2
2
  import { redact } from "../../kernel/log.js";
3
3
  import { providerError } from "../../kernel/ports/model.js";
4
- import { httpFailure, missingKey, noAudio, refreshList, unreadable, voiceFix } from "../explain.js";
5
- import { retryAfter } from "../retry-after.js";
4
+ import { httpFailure, noAudio, refreshList, unreadable, voiceFix } from "../explain.js";
5
+ import { failureText, httpProviderError, kindOfStatus, requireKey, safeJson, } from "../http-failure.js";
6
+ import { modelAccessOf } from "../model-access.js";
6
7
  // The HTTP gateway adapter for OpenAI's speech endpoint. `fetch` and nothing else; the response
7
8
  // body is already the stream the port asks for.
8
9
  export const openAiAudioBase = "https://api.openai.com/v1";
@@ -79,58 +80,27 @@ function voiceOf(voiceId) {
79
80
  return customVoice.test(voiceId) ? { id: voiceId } : voiceId;
80
81
  }
81
82
  function keyOf(deps) {
82
- const key = deps.key();
83
- // An absent key is terminal, so it never becomes a request.
84
- if (key === undefined || key === "") {
85
- throw providerError({ kind: "missing_key", message: missingKey("OpenAI") });
86
- }
87
- return key;
88
- }
89
- function kindOf(status) {
90
- if (status === 401 || status === 403) {
91
- return "auth";
92
- }
93
- if (status === 429) {
94
- return "rate_limit";
95
- }
96
- // ceiling: as in the OpenRouter adapter, a 400 is retried three more times because the
97
- // port's error contract has no terminal kind for a request that cannot be repaired.
98
- // The provider's own server failed; the same request may well succeed later.
99
- if (status >= 500)
100
- return "dropped";
101
- return "other";
83
+ return requireKey(deps.key(), "OpenAI");
102
84
  }
103
85
  async function failure(response, voiceId, next) {
104
- const text = await response.text().catch(() => "");
86
+ const text = await failureText(response);
105
87
  const parsed = errorBody.safeParse(safeJson(text));
106
88
  // Verbatim, through the same redactor the wrapper uses: OpenAI's own 401 quotes the
107
89
  // start of the key back at the caller.
108
90
  const message = redact(parsed.success ? parsed.data.error.message : text.trim() || response.statusText);
109
- const retryAfterMs = retryAfter(response.headers.get("retry-after"));
110
- return providerError({
111
- kind: kindOf(response.status),
112
- // The voice ID is named, so a rejected voice reads differently from
113
- // a rejected key.
114
- message: httpFailure({
115
- provider: "OpenAI",
116
- status: response.status,
117
- detail: message,
118
- next,
119
- ...(voiceId === undefined
120
- ? {}
121
- : {
122
- subject: `narration request for voice "${voiceId}"`,
123
- fix: voiceFix(voiceId),
124
- }),
125
- }),
126
- ...(retryAfterMs === undefined ? {} : { retryAfterMs }),
127
- });
128
- }
129
- function safeJson(text) {
130
- try {
131
- return JSON.parse(text);
132
- }
133
- catch {
134
- return undefined;
135
- }
91
+ return httpProviderError(response, kindOfStatus(response.status),
92
+ // The voice ID is named, so a rejected voice reads differently from
93
+ // a rejected key.
94
+ httpFailure({
95
+ provider: "OpenAI",
96
+ status: response.status,
97
+ detail: message,
98
+ next,
99
+ ...(voiceId === undefined
100
+ ? {}
101
+ : {
102
+ subject: `narration request for voice "${voiceId}"`,
103
+ fix: voiceFix(voiceId),
104
+ }),
105
+ }), undefined, modelAccessOf(response.status, text));
136
106
  }
@@ -1,6 +1,7 @@
1
1
  import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { providerError } from "../../kernel/ports/model.js";
4
+ import { editSettings } from "../../kernel/ports/settings-places.js";
4
5
  import { defaultSpeechVoice, noSpeechFix, primaryLanguage, } from "../../kernel/ports/system-speech.js";
5
6
  export const systemVoiceId = "system-voice";
6
7
  // Windows speaks through System.Speech. Every input arrives in an environment variable, so no
@@ -48,7 +49,7 @@ export function systemTts(deps) {
48
49
  kind: "unavailable",
49
50
  message: found.engines.length === 0
50
51
  ? (found.issue ?? `No speech program was found on this computer, ${noSpeechFix}`)
51
- : `The speech program "${model}" chosen for this narration isn't on this computer any more. In the Edit tab, choose Edit project and pick another System voice model (${found.engines.map((one) => one.name).join(", ")}) under Providers, then use Continue the run.`,
52
+ : `The speech program "${model}" chosen for this narration isn't on this computer any more. Pick another voice model (${found.engines.map((one) => one.name).join(", ")}) in ${editSettings.narration}, then use Continue the run.`,
52
53
  });
53
54
  };
54
55
  return {
@@ -0,0 +1,6 @@
1
+ # When a model in models.yaml is due to retire, and what replaces it. Kept apart from
2
+ # models.yaml on purpose: older Slopify versions read models.yaml with a strict schema, so a new
3
+ # field there would break them. Each entry names a model by family, provider and id;
4
+ # replacement (optional) is the id of a model of the same provider and family.
5
+ schemaVersion: 1
6
+ models: []
@@ -0,0 +1,60 @@
1
+ import { assistantCliRunner } from "./adapters/llm/assistant-cli.js";
2
+ import { assistantClis, } from "./slices/assistant/model.js";
3
+ import { createTurnTokens } from "./slices/assistant/tokens.js";
4
+ import { createAssistant } from "./slices/assistant/turn.js";
5
+ import { cliPathStatus } from "./slices/settings/cli-paths.js";
6
+ import { cliProbeTimeoutMs, readinessFromProbe, } from "./slices/settings/cli-status.js";
7
+ import { providerById } from "./slices/settings/model.js";
8
+ // The in-app assistant wired to this computer's CLIs: which are installed and signed in (asked
9
+ // at most once a minute, so opening the panel never waits on a probe twice), the CLI runner,
10
+ // and this server's own address for `/mcp/assistant`.
11
+ // ceiling: a CLI's state is kept a minute; signing in or installing one shows on the next
12
+ // message after that.
13
+ const statesTtlMs = 60_000;
14
+ export function wireAssistant(deps) {
15
+ let cached;
16
+ const stateOf = async (cli) => {
17
+ const provider = providerById(cli);
18
+ if (provider.auth !== "cli")
19
+ return { installed: false, login: "unknown" };
20
+ const { command } = cliPathStatus(deps.db, cli);
21
+ const readiness = readinessFromProbe(await deps.probe(command, provider.versionArgs, cliProbeTimeoutMs), provider);
22
+ if (readiness.kind !== "cli" || !readiness.installed)
23
+ return { installed: false, login: "unknown" };
24
+ const login = await deps.readLogin(command, cli, AbortSignal.timeout(cliProbeTimeoutMs));
25
+ return { installed: true, login, issue: readiness.issue };
26
+ };
27
+ const clis = () => {
28
+ const now = deps.clock.now().valueOf();
29
+ if (cached === undefined || now - cached.at > statesTtlMs) {
30
+ const states = Promise.all(assistantClis.map(stateOf)).then(([claude, codex]) => ({
31
+ "claude-code": claude ?? { installed: false, login: "unknown" },
32
+ codex: codex ?? { installed: false, login: "unknown" },
33
+ }));
34
+ cached = { at: now, states };
35
+ states.catch(() => {
36
+ cached = undefined;
37
+ });
38
+ }
39
+ return cached.states;
40
+ };
41
+ return createAssistant({
42
+ db: deps.db,
43
+ ids: deps.ids,
44
+ clock: deps.clock,
45
+ log: deps.log,
46
+ emit: deps.emit,
47
+ runCli: assistantCliRunner(deps.spawn),
48
+ clis,
49
+ binaryOf: (cli) => cliPathStatus(deps.db, cli).command,
50
+ selfUrl: deps.selfUrl,
51
+ container: deps.container,
52
+ tokens: createTurnTokens(),
53
+ });
54
+ }
55
+ // The address the CLIs reach this server at: loopback when it listens on every address.
56
+ export function assistantSelfUrl(host, port) {
57
+ const wildcard = host === "" || host === "0.0.0.0" || host === "::";
58
+ const reach = wildcard ? "127.0.0.1" : host;
59
+ return `http://${reach.includes(":") ? `[${reach}]` : reach}:${String(port)}`;
60
+ }
@@ -0,0 +1,59 @@
1
+ import { diskSpaceAt, openRouterKeyLimit } from "./adapters/account-limits.js";
2
+ import { causedBy } from "./kernel/errors.js";
3
+ import { sendWeeklyReport } from "./slices/autopilot/notify.js";
4
+ import { createAutopilotHealth } from "./slices/autopilot/signals.js";
5
+ import { cliPathStatus } from "./slices/settings/cli-paths.js";
6
+ import { keyOf } from "./slices/settings/repo.js";
7
+ // ceiling: the first check waits for the server to settle after a start, then runs hourly; the
8
+ // weekly report is looked at every quarter hour, so Monday 09:00 is met within 15 minutes.
9
+ const firstCheckMs = 30_000;
10
+ const checkEveryMs = 60 * 60_000;
11
+ const weeklyEveryMs = 15 * 60_000;
12
+ // Home's autopilot block reads the hourly check's answers; nothing here blocks a request.
13
+ export function startAutopilot(deps) {
14
+ const health = createAutopilotHealth({
15
+ db: deps.db,
16
+ clock: deps.clock,
17
+ log: deps.log,
18
+ template: deps.template,
19
+ catalogue: deps.catalogue,
20
+ cliLogin: async (id, signal) => deps.hostCli === undefined
21
+ ? deps.readLogin(cliPathStatus(deps.db, id).command, id, signal)
22
+ : (await deps.hostCli.status(id)).login,
23
+ openRouterKey: async (signal) => {
24
+ const key = keyOf(deps.db, "openrouter");
25
+ return key === undefined ? null : openRouterKeyLimit(deps.fetch, key, signal);
26
+ },
27
+ disk: () => diskSpaceAt(deps.dataDir),
28
+ });
29
+ const check = () => {
30
+ health.refresh().catch((error) => {
31
+ deps.log.write("error", "autopilot.check", { detail: causedBy(error) });
32
+ });
33
+ };
34
+ const weekly = () => {
35
+ sendWeeklyReport({
36
+ db: deps.db,
37
+ clock: deps.clock,
38
+ send: deps.send,
39
+ log: deps.log,
40
+ timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
41
+ }).catch((error) => {
42
+ deps.log.write("error", "autopilot.weekly", { detail: causedBy(error) });
43
+ });
44
+ };
45
+ const first = setTimeout(() => {
46
+ check();
47
+ weekly();
48
+ }, firstCheckMs);
49
+ const checkTimer = setInterval(check, checkEveryMs);
50
+ const weeklyTimer = setInterval(weekly, weeklyEveryMs);
51
+ return {
52
+ latest: health.latest,
53
+ stop: () => {
54
+ clearTimeout(first);
55
+ clearInterval(checkTimer);
56
+ clearInterval(weeklyTimer);
57
+ },
58
+ };
59
+ }
@@ -0,0 +1,52 @@
1
+ import { parse } from "yaml";
2
+ import { z } from "zod";
3
+ import { providerFamilies } from "../kernel/ports/model.js";
4
+ // models-lifecycle.yaml: retirement dates and replacements for models in models.yaml. Rows
5
+ // keep unknown keys out rather than refusing them, so a later version may add fields without
6
+ // breaking this one.
7
+ const lifecycleRow = z.object({
8
+ family: z.enum(providerFamilies),
9
+ provider: z.string().regex(/^[a-z0-9-]+$/),
10
+ id: z.string().min(1).max(200),
11
+ retiresOn: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
12
+ replacement: z.string().min(1).max(200).optional(),
13
+ });
14
+ export const lifecycleSchema = z.object({
15
+ schemaVersion: z.literal(1),
16
+ models: z.array(lifecycleRow).max(500),
17
+ });
18
+ export const emptyLifecycle = { schemaVersion: 1, models: [] };
19
+ export const lifecycleSource = "https://raw.githubusercontent.com/GentBajko/slopify/main/packages/app/src/assets/models-lifecycle.yaml";
20
+ export function parseLifecycle(text) {
21
+ if (Buffer.byteLength(text) > 256 * 1024)
22
+ throw new Error("Model lifecycle exceeds 256 KB");
23
+ return lifecycleSchema.parse(parse(text, { maxAliasCount: 20, uniqueKeys: true }) ?? {});
24
+ }
25
+ function liveRow(catalogue, row, id) {
26
+ return catalogue[row.family].find((model) => model.provider === row.provider && model.id === id && model.enabled && !model.deprecated);
27
+ }
28
+ // A model due to retire, with its replacement when that one is live. A model already retired
29
+ // in the catalogue (deprecated) is past this: the retired-models flow takes over.
30
+ export function retirementOf(lifecycle, catalogue, model) {
31
+ const row = lifecycle.models.find((one) => one.family === model.family && one.provider === model.provider && one.id === model.model);
32
+ if (row === undefined)
33
+ return undefined;
34
+ const current = catalogue[row.family].find((one) => one.provider === row.provider && one.id === row.id);
35
+ if (current?.deprecated === true)
36
+ return undefined;
37
+ const next = row.replacement === undefined ? undefined : liveRow(catalogue, row, row.replacement);
38
+ return {
39
+ on: row.retiresOn,
40
+ replacement: next === undefined ? null : { id: next.id, name: next.name },
41
+ };
42
+ }
43
+ // The lifecycle's named replacement for a model, when it is live in the catalogue.
44
+ export function lifecycleReplacement(lifecycle, catalogue, model) {
45
+ if (lifecycle === undefined)
46
+ return undefined;
47
+ const row = lifecycle.models.find((one) => one.family === model.family && one.provider === model.provider && one.id === model.model);
48
+ if (row?.replacement === undefined)
49
+ return undefined;
50
+ const next = liveRow(catalogue, row, row.replacement);
51
+ return next === undefined ? undefined : { id: next.id, name: next.name };
52
+ }
@@ -0,0 +1,204 @@
1
+ // ceiling: a new OpenRouter model is proposed only from a vendor the list already carries,
2
+ // only when it was published in the last 60 days, and at most 10 a day, so the PR stays
3
+ // reviewable and the list stays curated.
4
+ export const newWithinDays = 60;
5
+ export const newPerRun = 10;
6
+ const source = "https://openrouter.ai/api/v1/models";
7
+ const perMillion = (perToken) => perToken === undefined ? undefined : Math.round(perToken * 1e6 * 1e6) / 1e6;
8
+ function rateNote(today) {
9
+ return `Public OpenRouter rates read ${today}; routing, long context, reasoning and web search may add charges.`;
10
+ }
11
+ const reasoningThinking = {
12
+ low: { effort: "low" },
13
+ medium: { effort: "medium" },
14
+ high: { effort: "high" },
15
+ };
16
+ function refreshed(row, live, today) {
17
+ const input = perMillion(live.promptPerToken);
18
+ const output = perMillion(live.completionPerToken);
19
+ const cached = perMillion(live.cachedPerToken);
20
+ const priced = (input !== undefined && input !== row.pricing.inputPerMillionTokens) ||
21
+ (output !== undefined && output !== row.pricing.outputPerMillionTokens);
22
+ const pricing = priced
23
+ ? {
24
+ ...row.pricing,
25
+ ...(input === undefined ? {} : { inputPerMillionTokens: input }),
26
+ ...(output === undefined ? {} : { outputPerMillionTokens: output }),
27
+ ...(cached === undefined ? {} : { cachedInputPerMillionTokens: cached }),
28
+ note: rateNote(today),
29
+ }
30
+ : row.pricing;
31
+ const llm = {
32
+ ...row.llm,
33
+ ...(live.contextLength === undefined ? {} : { contextTokens: live.contextLength }),
34
+ ...(live.maxOutputTokens === undefined ? {} : { maxOutputTokens: live.maxOutputTokens }),
35
+ ...(row.llm.thinking === undefined && live.reasoning === true
36
+ ? { thinking: reasoningThinking }
37
+ : {}),
38
+ };
39
+ return { row: { ...row, pricing, llm }, priced };
40
+ }
41
+ function proposedRow(live, today) {
42
+ const input = perMillion(live.promptPerToken);
43
+ const output = perMillion(live.completionPerToken);
44
+ return {
45
+ provider: "openrouter",
46
+ id: live.id,
47
+ name: (live.name ?? live.id).slice(0, 120),
48
+ enabled: true,
49
+ deprecated: false,
50
+ source,
51
+ keywords: ["llm"],
52
+ pricing: {
53
+ ...(input === undefined ? {} : { inputPerMillionTokens: input }),
54
+ ...(output === undefined ? {} : { outputPerMillionTokens: output }),
55
+ note: rateNote(today),
56
+ },
57
+ llm: {
58
+ webSearch: false,
59
+ ...(live.contextLength === undefined ? {} : { contextTokens: live.contextLength }),
60
+ ...(live.maxOutputTokens === undefined ? {} : { maxOutputTokens: live.maxOutputTokens }),
61
+ ...(live.reasoning === true ? { thinking: reasoningThinking } : {}),
62
+ },
63
+ };
64
+ }
65
+ function isNew(live, vendors, today) {
66
+ if (live.id.includes(":"))
67
+ return false;
68
+ const vendor = live.id.split("/")[0] ?? "";
69
+ if (!vendors.has(vendor))
70
+ return false;
71
+ if (!(live.inputs ?? []).includes("text") || !(live.outputs ?? []).includes("text"))
72
+ return false;
73
+ if (live.outputs !== undefined && live.outputs.length !== 1)
74
+ return false;
75
+ if (live.promptPerToken === undefined || live.completionPerToken === undefined)
76
+ return false;
77
+ if (live.created === undefined)
78
+ return false;
79
+ const age = (Date.parse(`${today}T00:00:00Z`) - live.created * 1000) / 86_400_000;
80
+ return age >= 0 && age <= newWithinDays;
81
+ }
82
+ export function proposeCatalogue(current, sources) {
83
+ const live = new Map(sources.openRouter.map((row) => [row.id, row]));
84
+ const added = [];
85
+ const retired = [];
86
+ const priced = [];
87
+ // A model past its lifecycle date retires, and its entry has done its job.
88
+ const expired = current.lifecycle.models.filter((row) => row.retiresOn <= sources.today);
89
+ const expiredKey = new Set(expired.map((row) => `${row.family}:${row.provider}:${row.id}`));
90
+ const retire = (family, row, vanished) => {
91
+ if (row.deprecated)
92
+ return row;
93
+ if (!vanished && !expiredKey.has(`${family}:${row.provider}:${row.id}`))
94
+ return row;
95
+ retired.push(row.id);
96
+ return { ...row, deprecated: true };
97
+ };
98
+ const llm = current.catalogue.llm.map((row) => {
99
+ if (row.provider !== "openrouter")
100
+ return retire("llm", row, false);
101
+ const found = live.get(row.id);
102
+ // An empty listing is a failed read, never "everything retired".
103
+ const vanished = live.size > 0 && found === undefined;
104
+ const next = retire("llm", row, vanished);
105
+ if (found === undefined || next.deprecated)
106
+ return next;
107
+ const fresh = refreshed(next, found, sources.today);
108
+ if (fresh.priced)
109
+ priced.push(row.id);
110
+ return fresh.row;
111
+ });
112
+ const vendors = new Set(current.catalogue.llm
113
+ .filter((row) => row.provider === "openrouter")
114
+ .map((row) => row.id.split("/")[0] ?? ""));
115
+ const known = new Set(current.catalogue.llm.map((row) => `${row.provider}:${row.id}`));
116
+ const room = Math.max(0, 300 - llm.length);
117
+ const fresh = sources.openRouter
118
+ .filter((row) => !known.has(`openrouter:${row.id}`) && isNew(row, vendors, sources.today))
119
+ .sort((a, b) => (b.created ?? 0) - (a.created ?? 0))
120
+ .slice(0, Math.min(newPerRun, room))
121
+ .map((row) => proposedRow(row, sources.today));
122
+ for (const row of fresh)
123
+ added.push(row.id);
124
+ const image = current.catalogue.image.map((row) => retire("image", row, false));
125
+ const tts = current.catalogue.tts.map((row) => retire("tts", row, false));
126
+ const changed = added.length + retired.length + priced.length > 0;
127
+ const catalogue = {
128
+ ...current.catalogue,
129
+ updatedAt: changed ? sources.today : current.catalogue.updatedAt,
130
+ llm: [...llm, ...fresh],
131
+ image,
132
+ tts,
133
+ };
134
+ // Metadata (context, output limit, thinking) can change without a price change.
135
+ const metadataChanged = JSON.stringify(catalogue.llm) !== JSON.stringify(current.catalogue.llm);
136
+ const lifecycle = {
137
+ ...current.lifecycle,
138
+ models: current.lifecycle.models.filter((row) => row.retiresOn > sources.today),
139
+ };
140
+ return {
141
+ catalogue: metadataChanged && !changed ? { ...catalogue, updatedAt: sources.today } : catalogue,
142
+ lifecycle,
143
+ added,
144
+ retired,
145
+ priced,
146
+ changed: changed || metadataChanged || expired.length > 0,
147
+ };
148
+ }
149
+ // The PR's title and the script's last line: "Models: 3 new, 1 retired, 2 price changes".
150
+ export function proposalSummary(proposal) {
151
+ const count = (n, one, many) => `${String(n)} ${n === 1 ? one : many}`;
152
+ return `Models: ${count(proposal.added.length, "new", "new")}, ${count(proposal.retired.length, "retired", "retired")}, ${count(proposal.priced.length, "price change", "price changes")}`;
153
+ }
154
+ // OpenRouter's full listing, read loosely: a row that does not read cleanly is skipped.
155
+ export function readOpenRouterModels(value) {
156
+ const data = typeof value === "object" && value !== null ? value.data : undefined;
157
+ if (!Array.isArray(data))
158
+ return [];
159
+ const num = (raw) => {
160
+ const n = typeof raw === "string" || typeof raw === "number" ? Number(raw) : Number.NaN;
161
+ return Number.isFinite(n) && n >= 0 ? n : undefined;
162
+ };
163
+ const int = (raw) => {
164
+ const n = num(raw);
165
+ return n !== undefined && Number.isInteger(n) && n > 0 ? n : undefined;
166
+ };
167
+ const strings = (raw) => Array.isArray(raw) ? raw.filter((one) => typeof one === "string") : undefined;
168
+ const rows = [];
169
+ for (const raw of data) {
170
+ if (typeof raw !== "object" || raw === null)
171
+ continue;
172
+ const row = raw;
173
+ if (typeof row.id !== "string" || row.id === "" || row.id.length > 200)
174
+ continue;
175
+ const pricing = (typeof row.pricing === "object" && row.pricing !== null ? row.pricing : {});
176
+ const architecture = (typeof row.architecture === "object" && row.architecture !== null ? row.architecture : {});
177
+ const top = (typeof row.top_provider === "object" && row.top_provider !== null ? row.top_provider : {});
178
+ const params = strings(row.supported_parameters) ?? [];
179
+ rows.push({
180
+ id: row.id,
181
+ ...(typeof row.name === "string" && row.name !== "" ? { name: row.name } : {}),
182
+ ...(int(row.created) === undefined ? {} : { created: int(row.created) }),
183
+ ...(int(row.context_length) === undefined ? {} : { contextLength: int(row.context_length) }),
184
+ ...(int(top.max_completion_tokens) === undefined
185
+ ? {}
186
+ : { maxOutputTokens: int(top.max_completion_tokens) }),
187
+ ...(num(pricing.prompt) === undefined ? {} : { promptPerToken: num(pricing.prompt) }),
188
+ ...(num(pricing.completion) === undefined
189
+ ? {}
190
+ : { completionPerToken: num(pricing.completion) }),
191
+ ...(num(pricing.input_cache_read) === undefined
192
+ ? {}
193
+ : { cachedPerToken: num(pricing.input_cache_read) }),
194
+ ...(strings(architecture.input_modalities) === undefined
195
+ ? {}
196
+ : { inputs: strings(architecture.input_modalities) }),
197
+ ...(strings(architecture.output_modalities) === undefined
198
+ ? {}
199
+ : { outputs: strings(architecture.output_modalities) }),
200
+ reasoning: params.includes("reasoning"),
201
+ });
202
+ }
203
+ return rows;
204
+ }