@purpleschool/gptbot 0.14.27 → 0.14.29

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 (71) hide show
  1. package/api/controllers/http/avatar-studio.ts +23 -12
  2. package/api/routes.ts +68 -19
  3. package/build/api/controllers/http/avatar-studio.js +22 -12
  4. package/build/api/routes.js +41 -10
  5. package/build/commands/avatar-studio/generation-job/generate-avatar-studio-frame.command.js +2 -1
  6. package/build/commands/avatar-studio/generation-job/generate-avatar-studio-image.command.js +23 -0
  7. package/build/commands/avatar-studio/generation-job/generate-avatar-studio-scene-voice.command.js +4 -1
  8. package/build/commands/avatar-studio/generation-job/index.js +1 -3
  9. package/build/commands/avatar-studio/media/create-avatar-studio-media-from-file.command.js +6 -9
  10. package/build/commands/avatar-studio/media/find-avatar-studio-media.query.js +7 -5
  11. package/build/commands/avatar-studio/media/update-avatar-studio-media.command.js +1 -4
  12. package/build/commands/avatar-studio/scene/apply-avatar-studio-voice-sample-to-all-scenes.command.js +15 -0
  13. package/build/commands/avatar-studio/scene/index.js +2 -0
  14. package/build/commands/avatar-studio/scene/set-avatar-studio-scene-slot.command.js +21 -0
  15. package/build/commands/avatar-studio/scriptwriter/calculate-avatar-studio-scriptwriter-price.command.js +13 -6
  16. package/build/commands/avatar-studio/scriptwriter/create-avatar-studio-scriptwriter-message.command.js +23 -1
  17. package/build/commands/avatar-studio/shared/avatar-studio-common.schema.js +2 -1
  18. package/build/commands/avatar-studio/shared/get-avatar-studio-config.query.js +28 -18
  19. package/build/commands/avatar-studio/voice/design-avatar-studio-voice.command.js +5 -7
  20. package/build/commands/avatar-studio/voice/index.js +0 -3
  21. package/build/commands/photo-studio/execute-photo-studio-action.command.js +7 -2
  22. package/build/commands/photo-studio/find-photo-studio-job-by-id.query.js +2 -1
  23. package/build/constants/avatar-studio/enums/avatar-studio-job-type.enum.js +0 -3
  24. package/build/constants/avatar-studio/enums/avatar-studio-slot.enum.js +10 -7
  25. package/build/constants/avatar-studio/enums/avatar-studio-unavailable-reason.enum.js +16 -0
  26. package/build/constants/avatar-studio/enums/index.js +1 -5
  27. package/build/models/avatar-studio/avatar-studio.schema.js +60 -68
  28. package/commands/avatar-studio/generation-job/generate-avatar-studio-frame.command.ts +2 -1
  29. package/commands/avatar-studio/generation-job/{generate-avatar-studio-media-image.command.ts → generate-avatar-studio-image.command.ts} +5 -1
  30. package/commands/avatar-studio/generation-job/generate-avatar-studio-scene-voice.command.ts +4 -1
  31. package/commands/avatar-studio/generation-job/index.ts +1 -3
  32. package/commands/avatar-studio/media/create-avatar-studio-media-from-file.command.ts +7 -16
  33. package/commands/avatar-studio/media/find-avatar-studio-media.query.ts +9 -7
  34. package/commands/avatar-studio/media/update-avatar-studio-media.command.ts +1 -4
  35. package/commands/avatar-studio/scene/apply-avatar-studio-voice-sample-to-all-scenes.command.ts +20 -0
  36. package/commands/avatar-studio/scene/index.ts +2 -0
  37. package/commands/avatar-studio/{generation-job/generate-avatar-studio-voice-timings.command.ts → scene/set-avatar-studio-scene-slot.command.ts} +8 -5
  38. package/commands/avatar-studio/scriptwriter/calculate-avatar-studio-scriptwriter-price.command.ts +14 -7
  39. package/commands/avatar-studio/scriptwriter/create-avatar-studio-scriptwriter-message.command.ts +26 -1
  40. package/commands/avatar-studio/shared/avatar-studio-common.schema.ts +2 -1
  41. package/commands/avatar-studio/shared/get-avatar-studio-config.query.ts +31 -19
  42. package/commands/avatar-studio/voice/design-avatar-studio-voice.command.ts +6 -14
  43. package/commands/avatar-studio/voice/index.ts +0 -3
  44. package/commands/photo-studio/execute-photo-studio-action.command.ts +8 -2
  45. package/commands/photo-studio/find-photo-studio-job-by-id.query.ts +2 -1
  46. package/constants/avatar-studio/enums/avatar-studio-job-type.enum.ts +0 -3
  47. package/constants/avatar-studio/enums/avatar-studio-slot.enum.ts +10 -7
  48. package/constants/avatar-studio/enums/avatar-studio-unavailable-reason.enum.ts +12 -0
  49. package/constants/avatar-studio/enums/index.ts +1 -5
  50. package/models/avatar-studio/avatar-studio.schema.ts +59 -75
  51. package/package.json +1 -1
  52. package/build/commands/avatar-studio/generation-job/generate-avatar-studio-library-image.command.js +0 -20
  53. package/build/commands/avatar-studio/generation-job/generate-avatar-studio-media-image.command.js +0 -19
  54. package/build/commands/avatar-studio/generation-job/generate-avatar-studio-voice-timings.command.js +0 -18
  55. package/build/commands/avatar-studio/voice/find-avatar-studio-clip-voices.query.js +0 -14
  56. package/build/commands/avatar-studio/voice/find-avatar-studio-voices.query.js +0 -19
  57. package/build/commands/avatar-studio/voice/update-avatar-studio-clip-voice.command.js +0 -19
  58. package/build/constants/avatar-studio/enums/avatar-studio-job-phase.enum.js +0 -12
  59. package/build/constants/avatar-studio/enums/avatar-studio-media-role.enum.js +0 -14
  60. package/build/constants/avatar-studio/enums/avatar-studio-media-source.enum.js +0 -13
  61. package/build/constants/avatar-studio/enums/avatar-studio-scene-kind.enum.js +0 -7
  62. package/build/constants/avatar-studio/enums/avatar-studio-voice-source.enum.js +0 -10
  63. package/commands/avatar-studio/generation-job/generate-avatar-studio-library-image.command.ts +0 -25
  64. package/commands/avatar-studio/voice/find-avatar-studio-clip-voices.query.ts +0 -21
  65. package/commands/avatar-studio/voice/find-avatar-studio-voices.query.ts +0 -24
  66. package/commands/avatar-studio/voice/update-avatar-studio-clip-voice.command.ts +0 -21
  67. package/constants/avatar-studio/enums/avatar-studio-job-phase.enum.ts +0 -8
  68. package/constants/avatar-studio/enums/avatar-studio-media-role.enum.ts +0 -10
  69. package/constants/avatar-studio/enums/avatar-studio-media-source.enum.ts +0 -9
  70. package/constants/avatar-studio/enums/avatar-studio-scene-kind.enum.ts +0 -3
  71. package/constants/avatar-studio/enums/avatar-studio-voice-source.enum.ts +0 -6
@@ -1,4 +1,9 @@
1
1
  export const AVATAR_STUDIO_CONTROLLER_PRIVATE = 'private/avatar-studio' as const;
2
+ /**
3
+ * Тот же набор роутов для незарегистрированных. Правила доступа к моделям это не ослабляет:
4
+ * анрегу недоступна ни одна модель студии, поэтому ему остаются клипы, сцены, медиатека и экспорт.
5
+ */
6
+ export const AVATAR_STUDIO_CONTROLLER_PUBLIC = 'public/avatar-studio' as const;
2
7
 
3
8
  export const AVATAR_STUDIO_ROUTES = {
4
9
  CREATE_CLIP: 'clips',
@@ -10,28 +15,34 @@ export const AVATAR_STUDIO_ROUTES = {
10
15
  UPDATE_SCENE: (clipId: string, sceneId: string) => `clips/${clipId}/scenes/${sceneId}`,
11
16
  DELETE_SCENE: (clipId: string, sceneId: string) => `clips/${clipId}/scenes/${sceneId}`,
12
17
  REORDER_SCENES: (clipId: string) => `clips/${clipId}/scenes/reorder`,
18
+ SET_SCENE_SLOT: (clipId: string, sceneId: string, slot: string) =>
19
+ `clips/${clipId}/scenes/${sceneId}/slots/${slot}`,
20
+ /**
21
+ * Разовое действие над всеми сценами клипа: проставить им один образец голоса.
22
+ * Не состояние клипа — голос принадлежит сцене, поэтому новые сцены его не наследуют.
23
+ */
24
+ APPLY_VOICE_SAMPLE_TO_ALL_SCENES: (clipId: string, mediaId: string) =>
25
+ `clips/${clipId}/voice-sample/${mediaId}/apply-to-all-scenes`,
13
26
  GET_CONFIG: 'config',
14
- CREATE_MEDIA_FROM_FILE: (clipId: string) => `clips/${clipId}/media/from-file`,
27
+ // Медиатека принадлежит пользователю, а не клипу, поэтому роуты плоские.
28
+ CREATE_MEDIA_FROM_FILE: 'media/from-file',
15
29
  GET_MEDIA: 'media',
16
- UPDATE_MEDIA: (clipId: string, mediaId: string) => `clips/${clipId}/media/${mediaId}`,
17
- DELETE_MEDIA: (clipId: string, mediaId: string) => `clips/${clipId}/media/${mediaId}`,
30
+ UPDATE_MEDIA: (mediaId: string) => `media/${mediaId}`,
31
+ DELETE_MEDIA: (mediaId: string) => `media/${mediaId}`,
18
32
  GENERATE_FRAME: (clipId: string, sceneId: string) =>
19
33
  `clips/${clipId}/scenes/${sceneId}/frame/generate`,
20
- GENERATE_LIBRARY_IMAGE: (clipId: string) => `clips/${clipId}/library/images/generate`,
21
- GENERATE_MEDIA_IMAGE: 'media/images/generate',
34
+ GENERATE_IMAGE: 'images/generate',
22
35
  GENERATE_SCENE_VIDEO: (clipId: string, sceneId: string) =>
23
36
  `clips/${clipId}/scenes/${sceneId}/video/generate`,
24
37
  GENERATE_SCENE_VOICE: (clipId: string, sceneId: string) =>
25
38
  `clips/${clipId}/scenes/${sceneId}/voice/generate`,
26
- GENERATE_VOICE_TIMINGS: (clipId: string, sceneId: string) =>
27
- `clips/${clipId}/scenes/${sceneId}/voice/timings`,
28
39
  GENERATE_AVATAR: (clipId: string, sceneId: string) =>
29
40
  `clips/${clipId}/scenes/${sceneId}/avatar/generate`,
30
- DESIGN_VOICE: (clipId: string) => `clips/${clipId}/voices/design`,
31
- GET_VOICES: 'voices',
32
- GET_CLIP_VOICES: (clipId: string) => `clips/${clipId}/voices`,
33
- UPDATE_CLIP_VOICE: (clipId: string) => `clips/${clipId}/voice`,
34
- CALCULATE_SCRIPTWRITER_PRICE: (clipId: string) => `clips/${clipId}/scriptwriter/price`,
41
+ // Голос рождается в медиатеке пользователя, клип тут ни при чём — роут плоский,
42
+ // как и GENERATE_IMAGE.
43
+ DESIGN_VOICE: 'voices/design',
44
+ // Клип опционален и едет в теле: цену спрашивают ещё до создания клипа.
45
+ CALCULATE_SCRIPTWRITER_PRICE: 'scriptwriter/price',
35
46
  GET_SCRIPTWRITER_MESSAGES: (clipId: string) => `clips/${clipId}/scriptwriter/messages`,
36
47
  CREATE_SCRIPTWRITER_MESSAGE: (clipId: string) => `clips/${clipId}/scriptwriter/messages`,
37
48
  APPLY_SCRIPTWRITER_MESSAGE: (clipId: string, messageId: string) =>
package/api/routes.ts CHANGED
@@ -1711,34 +1711,27 @@ export const REST_API = {
1711
1711
  REORDER_SCENES: (clipId: string) =>
1712
1712
  `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.REORDER_SCENES(clipId)}`,
1713
1713
  GET_CONFIG: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CONFIG}`,
1714
- CREATE_MEDIA_FROM_FILE: (clipId: string) =>
1715
- `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CREATE_MEDIA_FROM_FILE(clipId)}`,
1714
+ CREATE_MEDIA_FROM_FILE: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CREATE_MEDIA_FROM_FILE}`,
1715
+ SET_SCENE_SLOT: (clipId: string, sceneId: string, slot: string) =>
1716
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.SET_SCENE_SLOT(clipId, sceneId, slot)}`,
1717
+ APPLY_VOICE_SAMPLE_TO_ALL_SCENES: (clipId: string, mediaId: string) =>
1718
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.APPLY_VOICE_SAMPLE_TO_ALL_SCENES(clipId, mediaId)}`,
1716
1719
  GET_MEDIA: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_MEDIA}`,
1717
- UPDATE_MEDIA: (clipId: string, mediaId: string) =>
1718
- `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.UPDATE_MEDIA(clipId, mediaId)}`,
1719
- DELETE_MEDIA: (clipId: string, mediaId: string) =>
1720
- `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DELETE_MEDIA(clipId, mediaId)}`,
1720
+ UPDATE_MEDIA: (mediaId: string) =>
1721
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.UPDATE_MEDIA(mediaId)}`,
1722
+ DELETE_MEDIA: (mediaId: string) =>
1723
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DELETE_MEDIA(mediaId)}`,
1721
1724
  GENERATE_FRAME: (clipId: string, sceneId: string) =>
1722
1725
  `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_FRAME(clipId, sceneId)}`,
1723
- GENERATE_LIBRARY_IMAGE: (clipId: string) =>
1724
- `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_LIBRARY_IMAGE(clipId)}`,
1726
+ GENERATE_IMAGE: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_IMAGE}`,
1725
1727
  GENERATE_SCENE_VIDEO: (clipId: string, sceneId: string) =>
1726
1728
  `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_SCENE_VIDEO(clipId, sceneId)}`,
1727
1729
  GENERATE_SCENE_VOICE: (clipId: string, sceneId: string) =>
1728
1730
  `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_SCENE_VOICE(clipId, sceneId)}`,
1729
- GENERATE_VOICE_TIMINGS: (clipId: string, sceneId: string) =>
1730
- `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_VOICE_TIMINGS(clipId, sceneId)}`,
1731
1731
  GENERATE_AVATAR: (clipId: string, sceneId: string) =>
1732
1732
  `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_AVATAR(clipId, sceneId)}`,
1733
- DESIGN_VOICE: (clipId: string) =>
1734
- `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DESIGN_VOICE(clipId)}`,
1735
- GET_VOICES: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_VOICES}`,
1736
- GET_CLIP_VOICES: (clipId: string) =>
1737
- `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CLIP_VOICES(clipId)}`,
1738
- UPDATE_CLIP_VOICE: (clipId: string) =>
1739
- `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.UPDATE_CLIP_VOICE(clipId)}`,
1740
- CALCULATE_SCRIPTWRITER_PRICE: (clipId: string) =>
1741
- `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CALCULATE_SCRIPTWRITER_PRICE(clipId)}`,
1733
+ DESIGN_VOICE: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DESIGN_VOICE}`,
1734
+ CALCULATE_SCRIPTWRITER_PRICE: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CALCULATE_SCRIPTWRITER_PRICE}`,
1742
1735
  GET_SCRIPTWRITER_MESSAGES: (clipId: string) =>
1743
1736
  `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_SCRIPTWRITER_MESSAGES(clipId)}`,
1744
1737
  CREATE_SCRIPTWRITER_MESSAGE: (clipId: string) =>
@@ -1756,6 +1749,62 @@ export const REST_API = {
1756
1749
  START_EXPORT: (clipId: string) =>
1757
1750
  `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.START_EXPORT(clipId)}`,
1758
1751
  },
1752
+ AVATAR_STUDIO_PUBLIC: {
1753
+ CREATE_CLIP: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CREATE_CLIP}`,
1754
+ GET_CLIPS: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CLIPS}`,
1755
+ GET_CLIP: (clipId: string) =>
1756
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CLIP(clipId)}`,
1757
+ UPDATE_CLIP: (clipId: string) =>
1758
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.UPDATE_CLIP(clipId)}`,
1759
+ DELETE_CLIP: (clipId: string) =>
1760
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DELETE_CLIP(clipId)}`,
1761
+ CREATE_SCENE: (clipId: string) =>
1762
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CREATE_SCENE(clipId)}`,
1763
+ UPDATE_SCENE: (clipId: string, sceneId: string) =>
1764
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.UPDATE_SCENE(clipId, sceneId)}`,
1765
+ DELETE_SCENE: (clipId: string, sceneId: string) =>
1766
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DELETE_SCENE(clipId, sceneId)}`,
1767
+ REORDER_SCENES: (clipId: string) =>
1768
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.REORDER_SCENES(clipId)}`,
1769
+ GET_CONFIG: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CONFIG}`,
1770
+ CREATE_MEDIA_FROM_FILE: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CREATE_MEDIA_FROM_FILE}`,
1771
+ SET_SCENE_SLOT: (clipId: string, sceneId: string, slot: string) =>
1772
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.SET_SCENE_SLOT(clipId, sceneId, slot)}`,
1773
+ APPLY_VOICE_SAMPLE_TO_ALL_SCENES: (clipId: string, mediaId: string) =>
1774
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.APPLY_VOICE_SAMPLE_TO_ALL_SCENES(clipId, mediaId)}`,
1775
+ GET_MEDIA: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_MEDIA}`,
1776
+ UPDATE_MEDIA: (mediaId: string) =>
1777
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.UPDATE_MEDIA(mediaId)}`,
1778
+ DELETE_MEDIA: (mediaId: string) =>
1779
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DELETE_MEDIA(mediaId)}`,
1780
+ GENERATE_FRAME: (clipId: string, sceneId: string) =>
1781
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_FRAME(clipId, sceneId)}`,
1782
+ GENERATE_IMAGE: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_IMAGE}`,
1783
+ GENERATE_SCENE_VIDEO: (clipId: string, sceneId: string) =>
1784
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_SCENE_VIDEO(clipId, sceneId)}`,
1785
+ GENERATE_SCENE_VOICE: (clipId: string, sceneId: string) =>
1786
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_SCENE_VOICE(clipId, sceneId)}`,
1787
+ GENERATE_AVATAR: (clipId: string, sceneId: string) =>
1788
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_AVATAR(clipId, sceneId)}`,
1789
+ DESIGN_VOICE: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DESIGN_VOICE}`,
1790
+ CALCULATE_SCRIPTWRITER_PRICE: `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CALCULATE_SCRIPTWRITER_PRICE}`,
1791
+ GET_SCRIPTWRITER_MESSAGES: (clipId: string) =>
1792
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_SCRIPTWRITER_MESSAGES(clipId)}`,
1793
+ CREATE_SCRIPTWRITER_MESSAGE: (clipId: string) =>
1794
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CREATE_SCRIPTWRITER_MESSAGE(clipId)}`,
1795
+ APPLY_SCRIPTWRITER_MESSAGE: (clipId: string, messageId: string) =>
1796
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.APPLY_SCRIPTWRITER_MESSAGE(clipId, messageId)}`,
1797
+ GET_GENERATION_JOB: (jobId: string) =>
1798
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_GENERATION_JOB(jobId)}`,
1799
+ GET_CLIP_GENERATION_JOBS: (clipId: string) =>
1800
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CLIP_GENERATION_JOBS(clipId)}`,
1801
+ GET_EXPORT_JOB: (jobId: string) =>
1802
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_EXPORT_JOB(jobId)}`,
1803
+ GET_CLIP_EXPORT_JOBS: (clipId: string) =>
1804
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CLIP_EXPORT_JOBS(clipId)}`,
1805
+ START_EXPORT: (clipId: string) =>
1806
+ `${ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.START_EXPORT(clipId)}`,
1807
+ },
1759
1808
  PHOTO_STUDIO_PRIVATE: {
1760
1809
  ACTIONS: `${ROOT}/${CONTROLLERS.PHOTO_STUDIO_PRIVATE_CONTROLLER}/${CONTROLLERS.PHOTO_STUDIO_ROUTES.ACTIONS}`,
1761
1810
  CONFIG: `${ROOT}/${CONTROLLERS.PHOTO_STUDIO_PRIVATE_CONTROLLER}/${CONTROLLERS.PHOTO_STUDIO_ROUTES.CONFIG}`,
@@ -1,7 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AVATAR_STUDIO_ROUTES = exports.AVATAR_STUDIO_CONTROLLER_PRIVATE = void 0;
3
+ exports.AVATAR_STUDIO_ROUTES = exports.AVATAR_STUDIO_CONTROLLER_PUBLIC = exports.AVATAR_STUDIO_CONTROLLER_PRIVATE = void 0;
4
4
  exports.AVATAR_STUDIO_CONTROLLER_PRIVATE = 'private/avatar-studio';
5
+ /**
6
+ * Тот же набор роутов для незарегистрированных. Правила доступа к моделям это не ослабляет:
7
+ * анрегу недоступна ни одна модель студии, поэтому ему остаются клипы, сцены, медиатека и экспорт.
8
+ */
9
+ exports.AVATAR_STUDIO_CONTROLLER_PUBLIC = 'public/avatar-studio';
5
10
  exports.AVATAR_STUDIO_ROUTES = {
6
11
  CREATE_CLIP: 'clips',
7
12
  GET_CLIPS: 'clips',
@@ -12,23 +17,28 @@ exports.AVATAR_STUDIO_ROUTES = {
12
17
  UPDATE_SCENE: (clipId, sceneId) => `clips/${clipId}/scenes/${sceneId}`,
13
18
  DELETE_SCENE: (clipId, sceneId) => `clips/${clipId}/scenes/${sceneId}`,
14
19
  REORDER_SCENES: (clipId) => `clips/${clipId}/scenes/reorder`,
20
+ SET_SCENE_SLOT: (clipId, sceneId, slot) => `clips/${clipId}/scenes/${sceneId}/slots/${slot}`,
21
+ /**
22
+ * Разовое действие над всеми сценами клипа: проставить им один образец голоса.
23
+ * Не состояние клипа — голос принадлежит сцене, поэтому новые сцены его не наследуют.
24
+ */
25
+ APPLY_VOICE_SAMPLE_TO_ALL_SCENES: (clipId, mediaId) => `clips/${clipId}/voice-sample/${mediaId}/apply-to-all-scenes`,
15
26
  GET_CONFIG: 'config',
16
- CREATE_MEDIA_FROM_FILE: (clipId) => `clips/${clipId}/media/from-file`,
27
+ // Медиатека принадлежит пользователю, а не клипу, поэтому роуты плоские.
28
+ CREATE_MEDIA_FROM_FILE: 'media/from-file',
17
29
  GET_MEDIA: 'media',
18
- UPDATE_MEDIA: (clipId, mediaId) => `clips/${clipId}/media/${mediaId}`,
19
- DELETE_MEDIA: (clipId, mediaId) => `clips/${clipId}/media/${mediaId}`,
30
+ UPDATE_MEDIA: (mediaId) => `media/${mediaId}`,
31
+ DELETE_MEDIA: (mediaId) => `media/${mediaId}`,
20
32
  GENERATE_FRAME: (clipId, sceneId) => `clips/${clipId}/scenes/${sceneId}/frame/generate`,
21
- GENERATE_LIBRARY_IMAGE: (clipId) => `clips/${clipId}/library/images/generate`,
22
- GENERATE_MEDIA_IMAGE: 'media/images/generate',
33
+ GENERATE_IMAGE: 'images/generate',
23
34
  GENERATE_SCENE_VIDEO: (clipId, sceneId) => `clips/${clipId}/scenes/${sceneId}/video/generate`,
24
35
  GENERATE_SCENE_VOICE: (clipId, sceneId) => `clips/${clipId}/scenes/${sceneId}/voice/generate`,
25
- GENERATE_VOICE_TIMINGS: (clipId, sceneId) => `clips/${clipId}/scenes/${sceneId}/voice/timings`,
26
36
  GENERATE_AVATAR: (clipId, sceneId) => `clips/${clipId}/scenes/${sceneId}/avatar/generate`,
27
- DESIGN_VOICE: (clipId) => `clips/${clipId}/voices/design`,
28
- GET_VOICES: 'voices',
29
- GET_CLIP_VOICES: (clipId) => `clips/${clipId}/voices`,
30
- UPDATE_CLIP_VOICE: (clipId) => `clips/${clipId}/voice`,
31
- CALCULATE_SCRIPTWRITER_PRICE: (clipId) => `clips/${clipId}/scriptwriter/price`,
37
+ // Голос рождается в медиатеке пользователя, клип тут ни при чём — роут плоский,
38
+ // как и GENERATE_IMAGE.
39
+ DESIGN_VOICE: 'voices/design',
40
+ // Клип опционален и едет в теле: цену спрашивают ещё до создания клипа.
41
+ CALCULATE_SCRIPTWRITER_PRICE: 'scriptwriter/price',
32
42
  GET_SCRIPTWRITER_MESSAGES: (clipId) => `clips/${clipId}/scriptwriter/messages`,
33
43
  CREATE_SCRIPTWRITER_MESSAGE: (clipId) => `clips/${clipId}/scriptwriter/messages`,
34
44
  APPLY_SCRIPTWRITER_MESSAGE: (clipId, messageId) => `clips/${clipId}/scriptwriter/messages/${messageId}/apply`,
@@ -1232,21 +1232,19 @@ exports.REST_API = {
1232
1232
  DELETE_SCENE: (clipId, sceneId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DELETE_SCENE(clipId, sceneId)}`,
1233
1233
  REORDER_SCENES: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.REORDER_SCENES(clipId)}`,
1234
1234
  GET_CONFIG: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CONFIG}`,
1235
- CREATE_MEDIA_FROM_FILE: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CREATE_MEDIA_FROM_FILE(clipId)}`,
1235
+ CREATE_MEDIA_FROM_FILE: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CREATE_MEDIA_FROM_FILE}`,
1236
+ SET_SCENE_SLOT: (clipId, sceneId, slot) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.SET_SCENE_SLOT(clipId, sceneId, slot)}`,
1237
+ APPLY_VOICE_SAMPLE_TO_ALL_SCENES: (clipId, mediaId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.APPLY_VOICE_SAMPLE_TO_ALL_SCENES(clipId, mediaId)}`,
1236
1238
  GET_MEDIA: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_MEDIA}`,
1237
- UPDATE_MEDIA: (clipId, mediaId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.UPDATE_MEDIA(clipId, mediaId)}`,
1238
- DELETE_MEDIA: (clipId, mediaId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DELETE_MEDIA(clipId, mediaId)}`,
1239
+ UPDATE_MEDIA: (mediaId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.UPDATE_MEDIA(mediaId)}`,
1240
+ DELETE_MEDIA: (mediaId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DELETE_MEDIA(mediaId)}`,
1239
1241
  GENERATE_FRAME: (clipId, sceneId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_FRAME(clipId, sceneId)}`,
1240
- GENERATE_LIBRARY_IMAGE: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_LIBRARY_IMAGE(clipId)}`,
1242
+ GENERATE_IMAGE: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_IMAGE}`,
1241
1243
  GENERATE_SCENE_VIDEO: (clipId, sceneId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_SCENE_VIDEO(clipId, sceneId)}`,
1242
1244
  GENERATE_SCENE_VOICE: (clipId, sceneId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_SCENE_VOICE(clipId, sceneId)}`,
1243
- GENERATE_VOICE_TIMINGS: (clipId, sceneId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_VOICE_TIMINGS(clipId, sceneId)}`,
1244
1245
  GENERATE_AVATAR: (clipId, sceneId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_AVATAR(clipId, sceneId)}`,
1245
- DESIGN_VOICE: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DESIGN_VOICE(clipId)}`,
1246
- GET_VOICES: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_VOICES}`,
1247
- GET_CLIP_VOICES: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CLIP_VOICES(clipId)}`,
1248
- UPDATE_CLIP_VOICE: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.UPDATE_CLIP_VOICE(clipId)}`,
1249
- CALCULATE_SCRIPTWRITER_PRICE: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CALCULATE_SCRIPTWRITER_PRICE(clipId)}`,
1246
+ DESIGN_VOICE: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DESIGN_VOICE}`,
1247
+ CALCULATE_SCRIPTWRITER_PRICE: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CALCULATE_SCRIPTWRITER_PRICE}`,
1250
1248
  GET_SCRIPTWRITER_MESSAGES: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_SCRIPTWRITER_MESSAGES(clipId)}`,
1251
1249
  CREATE_SCRIPTWRITER_MESSAGE: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CREATE_SCRIPTWRITER_MESSAGE(clipId)}`,
1252
1250
  APPLY_SCRIPTWRITER_MESSAGE: (clipId, messageId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.APPLY_SCRIPTWRITER_MESSAGE(clipId, messageId)}`,
@@ -1256,6 +1254,39 @@ exports.REST_API = {
1256
1254
  GET_CLIP_EXPORT_JOBS: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CLIP_EXPORT_JOBS(clipId)}`,
1257
1255
  START_EXPORT: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PRIVATE}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.START_EXPORT(clipId)}`,
1258
1256
  },
1257
+ AVATAR_STUDIO_PUBLIC: {
1258
+ CREATE_CLIP: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CREATE_CLIP}`,
1259
+ GET_CLIPS: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CLIPS}`,
1260
+ GET_CLIP: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CLIP(clipId)}`,
1261
+ UPDATE_CLIP: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.UPDATE_CLIP(clipId)}`,
1262
+ DELETE_CLIP: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DELETE_CLIP(clipId)}`,
1263
+ CREATE_SCENE: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CREATE_SCENE(clipId)}`,
1264
+ UPDATE_SCENE: (clipId, sceneId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.UPDATE_SCENE(clipId, sceneId)}`,
1265
+ DELETE_SCENE: (clipId, sceneId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DELETE_SCENE(clipId, sceneId)}`,
1266
+ REORDER_SCENES: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.REORDER_SCENES(clipId)}`,
1267
+ GET_CONFIG: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CONFIG}`,
1268
+ CREATE_MEDIA_FROM_FILE: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CREATE_MEDIA_FROM_FILE}`,
1269
+ SET_SCENE_SLOT: (clipId, sceneId, slot) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.SET_SCENE_SLOT(clipId, sceneId, slot)}`,
1270
+ APPLY_VOICE_SAMPLE_TO_ALL_SCENES: (clipId, mediaId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.APPLY_VOICE_SAMPLE_TO_ALL_SCENES(clipId, mediaId)}`,
1271
+ GET_MEDIA: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_MEDIA}`,
1272
+ UPDATE_MEDIA: (mediaId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.UPDATE_MEDIA(mediaId)}`,
1273
+ DELETE_MEDIA: (mediaId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DELETE_MEDIA(mediaId)}`,
1274
+ GENERATE_FRAME: (clipId, sceneId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_FRAME(clipId, sceneId)}`,
1275
+ GENERATE_IMAGE: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_IMAGE}`,
1276
+ GENERATE_SCENE_VIDEO: (clipId, sceneId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_SCENE_VIDEO(clipId, sceneId)}`,
1277
+ GENERATE_SCENE_VOICE: (clipId, sceneId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_SCENE_VOICE(clipId, sceneId)}`,
1278
+ GENERATE_AVATAR: (clipId, sceneId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GENERATE_AVATAR(clipId, sceneId)}`,
1279
+ DESIGN_VOICE: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.DESIGN_VOICE}`,
1280
+ CALCULATE_SCRIPTWRITER_PRICE: `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CALCULATE_SCRIPTWRITER_PRICE}`,
1281
+ GET_SCRIPTWRITER_MESSAGES: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_SCRIPTWRITER_MESSAGES(clipId)}`,
1282
+ CREATE_SCRIPTWRITER_MESSAGE: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.CREATE_SCRIPTWRITER_MESSAGE(clipId)}`,
1283
+ APPLY_SCRIPTWRITER_MESSAGE: (clipId, messageId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.APPLY_SCRIPTWRITER_MESSAGE(clipId, messageId)}`,
1284
+ GET_GENERATION_JOB: (jobId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_GENERATION_JOB(jobId)}`,
1285
+ GET_CLIP_GENERATION_JOBS: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CLIP_GENERATION_JOBS(clipId)}`,
1286
+ GET_EXPORT_JOB: (jobId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_EXPORT_JOB(jobId)}`,
1287
+ GET_CLIP_EXPORT_JOBS: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.GET_CLIP_EXPORT_JOBS(clipId)}`,
1288
+ START_EXPORT: (clipId) => `${exports.ROOT}/${CONTROLLERS.AVATAR_STUDIO_CONTROLLER_PUBLIC}/${CONTROLLERS.AVATAR_STUDIO_ROUTES.START_EXPORT(clipId)}`,
1289
+ },
1259
1290
  PHOTO_STUDIO_PRIVATE: {
1260
1291
  ACTIONS: `${exports.ROOT}/${CONTROLLERS.PHOTO_STUDIO_PRIVATE_CONTROLLER}/${CONTROLLERS.PHOTO_STUDIO_ROUTES.ACTIONS}`,
1261
1292
  CONFIG: `${exports.ROOT}/${CONTROLLERS.PHOTO_STUDIO_PRIVATE_CONTROLLER}/${CONTROLLERS.PHOTO_STUDIO_ROUTES.CONFIG}`,
@@ -8,11 +8,12 @@ const avatar_studio_common_schema_1 = require("../shared/avatar-studio-common.sc
8
8
  var GenerateAvatarStudioFrameCommand;
9
9
  (function (GenerateAvatarStudioFrameCommand) {
10
10
  GenerateAvatarStudioFrameCommand.ParamsSchema = avatar_studio_common_schema_1.AvatarStudioSceneIdParamsSchema;
11
+ /** Все три поля — параметры imageConfig сцены: они же в неё и сохраняются. */
11
12
  GenerateAvatarStudioFrameCommand.RequestSchema = zod_1.z
12
13
  .object({
13
14
  prompt: zod_1.z.string().trim().min(1),
14
15
  style: zod_1.z.nativeEnum(constants_1.AVATAR_STUDIO_IMAGE_STYLE).default(constants_1.AVATAR_STUDIO_IMAGE_STYLE.UGC),
15
- referenceMediaIds: avatar_studio_common_schema_1.AvatarStudioUuidListSchema.optional(),
16
+ references: avatar_studio_common_schema_1.AvatarStudioUuidListSchema,
16
17
  })
17
18
  .strict();
18
19
  GenerateAvatarStudioFrameCommand.ResponseSchema = zod_1.z.object({
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GenerateAvatarStudioImageCommand = void 0;
4
+ const zod_1 = require("zod");
5
+ const models_1 = require("../../../models");
6
+ const avatar_studio_common_schema_1 = require("../shared/avatar-studio-common.schema");
7
+ /**
8
+ * Генерация изображения в медиатеку пользователя. Клипа у неё нет: медиатека
9
+ * принадлежит пользователю, и картинка доступна из любого его клипа.
10
+ */
11
+ var GenerateAvatarStudioImageCommand;
12
+ (function (GenerateAvatarStudioImageCommand) {
13
+ GenerateAvatarStudioImageCommand.RequestSchema = zod_1.z
14
+ .object({
15
+ prompt: zod_1.z.string().trim().min(1),
16
+ referenceMediaIds: avatar_studio_common_schema_1.AvatarStudioUuidListSchema.optional(),
17
+ aspectRatio: models_1.AvatarStudioAspectRatioSchema.default('9:16'),
18
+ })
19
+ .strict();
20
+ GenerateAvatarStudioImageCommand.ResponseSchema = zod_1.z.object({
21
+ data: models_1.AvatarStudioGenerationJobSchema,
22
+ });
23
+ })(GenerateAvatarStudioImageCommand || (exports.GenerateAvatarStudioImageCommand = GenerateAvatarStudioImageCommand = {}));
@@ -7,10 +7,13 @@ const avatar_studio_common_schema_1 = require("../shared/avatar-studio-common.sc
7
7
  var GenerateAvatarStudioSceneVoiceCommand;
8
8
  (function (GenerateAvatarStudioSceneVoiceCommand) {
9
9
  GenerateAvatarStudioSceneVoiceCommand.ParamsSchema = avatar_studio_common_schema_1.AvatarStudioSceneIdParamsSchema;
10
+ /**
11
+ * Образец голоса не передаётся: он берётся из voiceConfig.voiceSampleMediaId сцены.
12
+ * Сменить образец — обычный PATCH сцены, а не отдельная операция.
13
+ */
10
14
  GenerateAvatarStudioSceneVoiceCommand.RequestSchema = zod_1.z
11
15
  .object({
12
16
  text: zod_1.z.string().trim().min(1).optional(),
13
- mediaId: zod_1.z.string().uuid().optional(),
14
17
  })
15
18
  .strict();
16
19
  GenerateAvatarStudioSceneVoiceCommand.ResponseSchema = zod_1.z.object({
@@ -16,10 +16,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./find-avatar-studio-generation-jobs.query"), exports);
18
18
  __exportStar(require("./generate-avatar-studio-frame.command"), exports);
19
- __exportStar(require("./generate-avatar-studio-library-image.command"), exports);
20
- __exportStar(require("./generate-avatar-studio-media-image.command"), exports);
19
+ __exportStar(require("./generate-avatar-studio-image.command"), exports);
21
20
  __exportStar(require("./generate-avatar-studio-scene-video.command"), exports);
22
21
  __exportStar(require("./generate-avatar-studio-scene-voice.command"), exports);
23
22
  __exportStar(require("./generate-avatar-studio-talking-avatar.command"), exports);
24
- __exportStar(require("./generate-avatar-studio-voice-timings.command"), exports);
25
23
  __exportStar(require("./get-avatar-studio-generation-job.query"), exports);
@@ -4,22 +4,19 @@ exports.CreateAvatarStudioMediaFromFileCommand = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const constants_1 = require("../../../constants");
6
6
  const models_1 = require("../../../models");
7
- const avatar_studio_common_schema_1 = require("../shared/avatar-studio-common.schema");
7
+ /**
8
+ * Загруженный файл попадает в медиатеку пользователя и доступен из любого его клипа.
9
+ * Положить его в сцену — отдельная операция: PUT .../scenes/:sceneId/slots/:slot.
10
+ * Чем медиа будет — озвучкой, образцом голоса, референсом — решает поле, которое на него
11
+ * сошлётся, а не признак на самом медиа.
12
+ */
8
13
  var CreateAvatarStudioMediaFromFileCommand;
9
14
  (function (CreateAvatarStudioMediaFromFileCommand) {
10
- CreateAvatarStudioMediaFromFileCommand.ParamsSchema = avatar_studio_common_schema_1.AvatarStudioClipIdParamsSchema;
11
15
  CreateAvatarStudioMediaFromFileCommand.RequestSchema = zod_1.z
12
16
  .object({
13
17
  fileId: zod_1.z.string().uuid(),
14
- sceneId: zod_1.z.string().uuid().optional(),
15
18
  kind: zod_1.z.nativeEnum(constants_1.AVATAR_STUDIO_MEDIA_KIND),
16
- source: zod_1.z
17
- .nativeEnum(constants_1.AVATAR_STUDIO_MEDIA_SOURCE)
18
- .default(constants_1.AVATAR_STUDIO_MEDIA_SOURCE.UPLOAD)
19
- .optional(),
20
- role: zod_1.z.nativeEnum(constants_1.AVATAR_STUDIO_MEDIA_ROLE),
21
19
  title: zod_1.z.string().trim().min(1).max(255).optional(),
22
- prompt: zod_1.z.string().optional(),
23
20
  })
24
21
  .strict();
25
22
  CreateAvatarStudioMediaFromFileCommand.ResponseSchema = zod_1.z.object({
@@ -1,18 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FindAvatarStudioMediaQuery = void 0;
3
+ exports.FindAvatarStudioMediaQuery = exports.AvatarStudioMediaOwnerSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const constants_1 = require("../../../constants");
6
6
  const models_1 = require("../../../models");
7
7
  const avatar_studio_common_schema_1 = require("../shared/avatar-studio-common.schema");
8
+ /**
9
+ * Список медиа всегда однороден по владельцу: либо медиатека пользователя,
10
+ * либо общие системные медиа. Смешанного списка нет, поэтому owner обязателен.
11
+ */
12
+ exports.AvatarStudioMediaOwnerSchema = zod_1.z.enum(['me', 'system']);
8
13
  var FindAvatarStudioMediaQuery;
9
14
  (function (FindAvatarStudioMediaQuery) {
10
- FindAvatarStudioMediaQuery.ParamsSchema = zod_1.z.object({}).strict();
11
15
  FindAvatarStudioMediaQuery.QuerySchema = avatar_studio_common_schema_1.AvatarStudioPaginationQuerySchema.extend({
12
- clipId: zod_1.z.string().uuid().optional(),
13
- sceneId: zod_1.z.string().uuid().optional(),
16
+ owner: exports.AvatarStudioMediaOwnerSchema,
14
17
  kind: zod_1.z.nativeEnum(constants_1.AVATAR_STUDIO_MEDIA_KIND).optional(),
15
- role: zod_1.z.nativeEnum(constants_1.AVATAR_STUDIO_MEDIA_ROLE).optional(),
16
18
  });
17
19
  FindAvatarStudioMediaQuery.ResponseSchema = (0, avatar_studio_common_schema_1.AvatarStudioPagedResponseSchema)(models_1.AvatarStudioMediaSchema);
18
20
  })(FindAvatarStudioMediaQuery || (exports.FindAvatarStudioMediaQuery = FindAvatarStudioMediaQuery = {}));
@@ -2,18 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.UpdateAvatarStudioMediaCommand = void 0;
4
4
  const zod_1 = require("zod");
5
- const constants_1 = require("../../../constants");
6
5
  const models_1 = require("../../../models");
7
6
  const avatar_studio_common_schema_1 = require("../shared/avatar-studio-common.schema");
7
+ /** Только метаданные: прикрепление медиа в сцену — операция сцены, а не медиа. */
8
8
  var UpdateAvatarStudioMediaCommand;
9
9
  (function (UpdateAvatarStudioMediaCommand) {
10
10
  UpdateAvatarStudioMediaCommand.ParamsSchema = avatar_studio_common_schema_1.AvatarStudioMediaIdParamsSchema;
11
11
  UpdateAvatarStudioMediaCommand.RequestSchema = zod_1.z
12
12
  .object({
13
- sceneId: zod_1.z.string().uuid().nullable().optional(),
14
- role: zod_1.z.nativeEnum(constants_1.AVATAR_STUDIO_MEDIA_ROLE).optional(),
15
13
  title: zod_1.z.string().trim().min(1).max(255).nullable().optional(),
16
- prompt: zod_1.z.string().nullable().optional(),
17
14
  })
18
15
  .strict();
19
16
  UpdateAvatarStudioMediaCommand.ResponseSchema = zod_1.z.object({
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApplyAvatarStudioVoiceSampleToAllScenesCommand = void 0;
4
+ const zod_1 = require("zod");
5
+ const models_1 = require("../../../models");
6
+ const avatar_studio_common_schema_1 = require("../shared/avatar-studio-common.schema");
7
+ var ApplyAvatarStudioVoiceSampleToAllScenesCommand;
8
+ (function (ApplyAvatarStudioVoiceSampleToAllScenesCommand) {
9
+ ApplyAvatarStudioVoiceSampleToAllScenesCommand.ParamsSchema = avatar_studio_common_schema_1.AvatarStudioClipIdParamsSchema.merge(avatar_studio_common_schema_1.AvatarStudioMediaIdParamsSchema);
10
+ // Ответ — клип со сценами, а не список сцен: фронт перерисовывает клип целиком
11
+ // и не ходит следом за GET /clips/:clipId.
12
+ ApplyAvatarStudioVoiceSampleToAllScenesCommand.ResponseSchema = zod_1.z.object({
13
+ data: models_1.AvatarStudioClipSchema,
14
+ });
15
+ })(ApplyAvatarStudioVoiceSampleToAllScenesCommand || (exports.ApplyAvatarStudioVoiceSampleToAllScenesCommand = ApplyAvatarStudioVoiceSampleToAllScenesCommand = {}));
@@ -14,7 +14,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./apply-avatar-studio-voice-sample-to-all-scenes.command"), exports);
17
18
  __exportStar(require("./create-avatar-studio-scene.command"), exports);
18
19
  __exportStar(require("./delete-avatar-studio-scene.command"), exports);
19
20
  __exportStar(require("./reorder-avatar-studio-scenes.command"), exports);
21
+ __exportStar(require("./set-avatar-studio-scene-slot.command"), exports);
20
22
  __exportStar(require("./update-avatar-studio-scene.command"), exports);
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SetAvatarStudioSceneSlotCommand = void 0;
4
+ const zod_1 = require("zod");
5
+ const constants_1 = require("../../../constants");
6
+ const models_1 = require("../../../models");
7
+ const avatar_studio_common_schema_1 = require("../shared/avatar-studio-common.schema");
8
+ var SetAvatarStudioSceneSlotCommand;
9
+ (function (SetAvatarStudioSceneSlotCommand) {
10
+ SetAvatarStudioSceneSlotCommand.ParamsSchema = avatar_studio_common_schema_1.AvatarStudioSceneIdParamsSchema.extend({
11
+ slot: zod_1.z.nativeEnum(constants_1.AVATAR_STUDIO_SLOT),
12
+ });
13
+ SetAvatarStudioSceneSlotCommand.RequestSchema = zod_1.z
14
+ .object({
15
+ mediaId: zod_1.z.string().uuid(),
16
+ })
17
+ .strict();
18
+ SetAvatarStudioSceneSlotCommand.ResponseSchema = zod_1.z.object({
19
+ data: models_1.AvatarStudioSceneSchema,
20
+ });
21
+ })(SetAvatarStudioSceneSlotCommand || (exports.SetAvatarStudioSceneSlotCommand = SetAvatarStudioSceneSlotCommand = {}));
@@ -1,19 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CalculateAvatarStudioScriptwriterPriceCommand = void 0;
3
+ exports.CalculateAvatarStudioScriptwriterPriceCommand = exports.AvatarStudioScriptwriterPriceSchema = void 0;
4
4
  const zod_1 = require("zod");
5
- const avatar_studio_common_schema_1 = require("../shared/avatar-studio-common.schema");
5
+ /** Сама цена, без транспортной обёртки: её считает и сервис сценариста. */
6
+ exports.AvatarStudioScriptwriterPriceSchema = zod_1.z.object({
7
+ price: zod_1.z.number(),
8
+ charsUntilNextPriceIncrease: zod_1.z.number().int().nonnegative().nullable(),
9
+ charsUntilNextPriceDecrease: zod_1.z.number().int().nonnegative().nullable(),
10
+ });
6
11
  var CalculateAvatarStudioScriptwriterPriceCommand;
7
12
  (function (CalculateAvatarStudioScriptwriterPriceCommand) {
8
- CalculateAvatarStudioScriptwriterPriceCommand.ParamsSchema = avatar_studio_common_schema_1.AvatarStudioClipIdParamsSchema;
13
+ /**
14
+ * Клип опционален: цену спрашивают ещё до его создания. Без клипа считаем по одной длине
15
+ * ввода, без контекста прошлого диалога — история в цену и не входит, если её нет.
16
+ */
9
17
  CalculateAvatarStudioScriptwriterPriceCommand.RequestSchema = zod_1.z
10
18
  .object({
11
19
  inputLength: zod_1.z.number().int().nonnegative(),
20
+ clipId: zod_1.z.string().uuid().optional(),
12
21
  })
13
22
  .strict();
14
23
  CalculateAvatarStudioScriptwriterPriceCommand.ResponseSchema = zod_1.z.object({
15
- price: zod_1.z.number(),
16
- charsUntilNextPriceIncrease: zod_1.z.number().int().nonnegative().nullable(),
17
- charsUntilNextPriceDecrease: zod_1.z.number().int().nonnegative().nullable(),
24
+ data: exports.AvatarStudioScriptwriterPriceSchema,
18
25
  });
19
26
  })(CalculateAvatarStudioScriptwriterPriceCommand || (exports.CalculateAvatarStudioScriptwriterPriceCommand = CalculateAvatarStudioScriptwriterPriceCommand = {}));
@@ -40,10 +40,32 @@ var CreateAvatarStudioScriptwriterMessageCommand;
40
40
  }),
41
41
  })
42
42
  .strict();
43
+ CreateAvatarStudioScriptwriterMessageCommand.ModelOutputScenePlanSchema = zod_1.z
44
+ .object({
45
+ voiceConfig: zod_1.z.object({
46
+ text: zod_1.z.string().trim().min(1),
47
+ trimStart: zod_1.z.number().nonnegative().nullable(),
48
+ trimEnd: zod_1.z.number().nonnegative().nullable(),
49
+ }),
50
+ imageConfig: zod_1.z.object({
51
+ prompt: zod_1.z.string().trim().min(1),
52
+ style: zod_1.z.nativeEnum(constants_1.AVATAR_STUDIO_IMAGE_STYLE),
53
+ }),
54
+ videoConfig: zod_1.z.object({
55
+ prompt: zod_1.z.string().trim().min(1),
56
+ durationSeconds: zod_1.z.number().positive(),
57
+ videoMode: zod_1.z.nativeEnum(constants_1.AVATAR_STUDIO_VIDEO_MODE),
58
+ quality: zod_1.z.nativeEnum(constants_1.AVATAR_STUDIO_VIDEO_QUALITY),
59
+ sound: zod_1.z.boolean(),
60
+ trimStart: zod_1.z.number().nonnegative().nullable(),
61
+ trimEnd: zod_1.z.number().nonnegative().nullable(),
62
+ }),
63
+ })
64
+ .strict();
43
65
  CreateAvatarStudioScriptwriterMessageCommand.ModelOutputSchema = zod_1.z
44
66
  .object({
45
67
  message: zod_1.z.string().trim().min(1),
46
- scenes: zod_1.z.array(CreateAvatarStudioScriptwriterMessageCommand.ScenePlanSchema).min(1).max(20),
68
+ scenes: zod_1.z.array(CreateAvatarStudioScriptwriterMessageCommand.ModelOutputScenePlanSchema).min(1).max(20),
47
69
  })
48
70
  .strict();
49
71
  })(CreateAvatarStudioScriptwriterMessageCommand || (exports.CreateAvatarStudioScriptwriterMessageCommand = CreateAvatarStudioScriptwriterMessageCommand = {}));
@@ -10,7 +10,8 @@ exports.AvatarStudioClipIdParamsSchema = zod_1.z.object({
10
10
  exports.AvatarStudioSceneIdParamsSchema = exports.AvatarStudioClipIdParamsSchema.extend({
11
11
  sceneId: zod_1.z.string().uuid(),
12
12
  });
13
- exports.AvatarStudioMediaIdParamsSchema = exports.AvatarStudioClipIdParamsSchema.extend({
13
+ // Медиа принадлежит пользователю, а не клипу, поэтому clipId в его параметрах нет.
14
+ exports.AvatarStudioMediaIdParamsSchema = zod_1.z.object({
14
15
  mediaId: zod_1.z.string().uuid(),
15
16
  });
16
17
  exports.AvatarStudioGenerationJobIdParamsSchema = zod_1.z.object({