@clipwright/sdk 0.25.0 → 0.26.1

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 (3) hide show
  1. package/CHANGELOG.md +161 -0
  2. package/README.md +12 -4
  3. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -16,6 +16,167 @@ a customer reading it should not miss what appeared in the product. Like *Server
16
16
  they are live from the day the web app was deployed, not from the package release they are
17
17
  listed under.
18
18
 
19
+ ## [0.26.1] - 2026-10-09
20
+
21
+ A metadata patch: the npm description of `@clipwright/mcp-server` no longer carries a catalog claim token.
22
+
23
+ ### Changed
24
+
25
+ - `@clipwright/mcp-server`: the package description on npm returns to its text before 0.26.0. That release appended
26
+ a one-time token, which a catalog read to confirm who owns its listing of the server. The catalog has confirmed it,
27
+ so the token is gone. No tool, flag or behavior changed. (clipwright#570)
28
+
29
+ ## [0.26.0] - 2026-10-09
30
+
31
+ `make_faceless` takes a narration voice by name: `list_voices` with `skill=make_faceless` lists seventeen voices in
32
+ six languages. The MCP tools `make_faceless` and `quote_faceless` refuse a key they do not declare, and the MCP
33
+ server requires a patched `@modelcontextprotocol/sdk`.
34
+
35
+ ### Changed
36
+
37
+ - *Dashboard:* a guide at `/guides/ai-ugc-ads` says what UGC ads and AI UGC ads are, and what the rules of the
38
+ United States, the European Union and the large platforms ask of them. Every source is listed with its date.
39
+ (clipwright#569)
40
+ - *Server-side:* a faceless video file carries its AI disclosure: the statement is embedded in the MP4 and stored in
41
+ the object metadata beside `ai-generated: true` and `generator: clipwright`. When the tag cannot be embedded, the
42
+ video is still delivered and the run says so, with the cause, in `warnings[]`. Faceless files delivered on or before
43
+ 2026-10-04 may carry the storage flag alone. (clipwright#489)
44
+ - `@clipwright/core` exports `aiDisclosureObjectMetadata(text, embedded?)`, the builder of that object metadata, and
45
+ `AI_DISCLOSURE_EMBEDDED_METADATA_KEY`. `AI_DISCLOSURE_OBJECT_METADATA` stays the metadata of a video with a
46
+ presenter. (clipwright#489)
47
+ - *Dashboard:* The AI Disclosure page describes one marking for both kinds of video and names the date before which
48
+ a faceless file may carry less. (clipwright#489)
49
+ - *Server-side:* a finished faceless video is delivered even when our own check of the picture objects. The run ends
50
+ `succeeded`, is charged by the delivered duration, and says in `warnings[]` what the check could not confirm and at
51
+ which second: the captions, a scene change, text in the caption area with captions off, or that the check did not
52
+ run. Such a run used to wait for an operator, and the customer got no video. A file that is not the video we
53
+ rendered (wrong length, size or sound) is still refused without a charge. (clipwright#498)
54
+ - *Server-side:* the narration of a faceless video is levelled to -16 LUFS, and quiet and loud phrases are brought
55
+ closer together. It used to keep the level of the speech vendor: about 4 LU quieter, with phrases up to 5 dB apart,
56
+ so a later phrase could sound much louder than the opening. Timing is unchanged. (clipwright#333)
57
+ - *Server-side:* pictures in a faceless video change faster and less evenly: about every two and a half seconds on
58
+ average, where they used to hold for three to four, and a short phrase gets a short shot of its own. A video uses
59
+ more generated pictures, so it takes longer to make; the price is unchanged. (clipwright#519)
60
+ - *Server-side:* a faceless shot that covers two phrases shows one scene. It used to ask for both scenes in one
61
+ picture, which could come back as two pictures stacked in one frame. (clipwright#517)
62
+ - *Server-side:* the step that writes the scene descriptions of a faceless video is told to ask for readable words
63
+ and figures only when the script says them. It used to invent some, such as figures on a blackboard that
64
+ contradicted the narration. This makes invented writing rarer, not impossible; the writing in a finished picture
65
+ is compared with the script by the check of generated pictures described further down. (clipwright#516)
66
+ - *Server-side:* a faceless video file is smaller and closer to the rendered picture. A local render of one
67
+ 43-second video with the new settings came to 29 MB at about 5 Mbit/s, where the old settings gave 75 MB at 14.
68
+ Resolution, frame rate, colour and audio are unchanged. (clipwright#518)
69
+ - *Server-side:* a faceless video whose opening clip shows text is delivered, with a `warnings[]` line saying so. It
70
+ used to fail with `opening_clip_rejected: the generated opening clip shows text`, or wait for an operator when the
71
+ frame held a lot of text, so a scene set in a shop or a café often could not be made: the image model draws signs
72
+ and price tags on its own. An opening clip that ends on a fade or is one flat colour still fails without a charge.
73
+ (clipwright#524)
74
+ - *Server-side:* a faceless video may run up to a quarter past `duration_seconds`, never past 90 seconds. It used to
75
+ fail with `voice_outside_selected_duration` when its narration ran more than 5 seconds over, and one script is
76
+ spoken at a different length from run to run, so a script that fitted once could fail the next time. A video more
77
+ than 5 seconds longer than selected says so in `warnings[]`, with both lengths. The price is unchanged: seconds
78
+ past the selection are free. A script is still accepted when its estimated length is 21 seconds to
79
+ `duration_seconds` plus 5, at most 90. (clipwright#529)
80
+ - `@clipwright/core`: `facelessMaxOutputFrames(selected)` returns a quarter past the selection, and the new
81
+ `facelessMaxEstimateFrames(selected)` returns the selection plus 5 seconds, the bound a script estimate must fit.
82
+ (clipwright#529)
83
+ - *Server-side:* a faceless video is ready sooner. After the first picture the others are generated three at a time,
84
+ beside the opening clip, where they used to be made one after another. The price and the result are unchanged.
85
+ (clipwright#520)
86
+ - *Server-side:* at most two faceless videos of one account are made at once; a third waits its turn and is not
87
+ refused. Faceless runs had no such limit. Each line also has a limit across all accounts now, so when many accounts
88
+ render at once a run may wait behind theirs instead of failing at a vendor. Three videos with a presenter per
89
+ account, as before. (clipwright#534)
90
+ - `@clipwright/core` exports `MAX_CONCURRENT_FACELESS_PER_ACCOUNT`. (clipwright#534)
91
+ - *Server-side:* captions of a faceless video break at the script's punctuation. A caption line used to be filled to
92
+ the width of the frame, so it could end one word into the next sentence: "NEXT MORNING A SIGN SOLD", then "OUT BY
93
+ NOON". A line now ends at a sentence mark, crosses a comma only with whole clauses, and a clause too long for one
94
+ line is split into parts of similar width instead of a full line and a leftover word. An abbreviation written with a
95
+ full stop before a capital or a figure ("Dr. Smith", "No. 1") still reads as a sentence end and can leave a one-word
96
+ line. (clipwright#535)
97
+ - *Server-side:* a video with a presenter (`make_ugc` or long-form) comes in a smaller file that is closer to the
98
+ rendered picture. A local render of one 69-second long-form video with the new settings came to 45 MB, where the
99
+ old settings gave 54 MB. Resolution, frame rate, colour and audio are unchanged. (clipwright#526)
100
+ - *Server-side:* a character who appears in several scenes of a faceless video is now described the same way in every
101
+ scene that shows them. The step that writes the scenes fixes one description of every recurring person or animal
102
+ (apparent age, build, hair, clothing), and the picture of each such scene is asked for with it. A secondary character
103
+ used to be a different person in every scene; only the main character, shown in the first picture, stayed the same.
104
+ Faces can still differ a little between scenes. (clipwright#532)
105
+ - `make_faceless` takes `voice`, the narration voice by name: `voice` on `quote_faceless` and `make_faceless`,
106
+ `--voice` on `quote-faceless` and `make-faceless`. `list_voices` with `skill=make_faceless` (`--skill
107
+ make_faceless` on `voices`) lists seventeen narration voices for it, in English, Russian, Spanish, Portuguese,
108
+ French and Italian, each with a language and a gender. Every listed voice now names the one skill that speaks it
109
+ in `skill`. Without `voice` the narration is read as before, by `narrator_en_wise_lady`. An unknown name,
110
+ a `make_ugc` voice and `voice_id` are refused before any charge, and `make_ugc` refuses a faceless voice the same
111
+ way, naming the skill that speaks it. A named voice whose language is written in another alphabet than the
112
+ script adds a line to `warnings[]` of the quote and of the run: the voice may mispronounce the text, and the
113
+ video may come out longer than its length limit and fail. A brief written in the other alphabet, with no letter
114
+ of the voice's, adds that line as a condition, since a brief may ask for the narration's language in words. The faceless voices have
115
+ no audio sample yet. (clipwright#530)
116
+ - **Breaking:** `@clipwright/mcp-server`: `make_faceless` and `quote_faceless` refuse a key they do not declare,
117
+ `voice_id` first of all, before any request is sent. Such a key used to be dropped silently. (clipwright#530)
118
+ - *Server-side:* `GET /v1/voices` without `skill` returns the `make_ugc` voices only, the same list as before, to
119
+ every client version; `skill=make_ugc` returns it too. The faceless voices come only with `skill=make_faceless`,
120
+ as `kind: "faceless_voice"`. (clipwright#530)
121
+ - `@clipwright/core` exports `FACELESS_VOICES`, `FACELESS_VOICE_NAMES`, `DEFAULT_FACELESS_VOICE`,
122
+ `FACELESS_SPEECH_MODEL`, `isFacelessVoiceName`, `buildFacelessVoiceWarnings`, `VOICE_SKILLS`,
123
+ `FACELESS_REJECTED_FIELDS` and `offeredFacelessInput`; `@clipwright/core/voice-admission` exports
124
+ `serverFacelessInput` and `facelessVoiceRefusal`. (clipwright#530)
125
+ - *Server-side:* a generated picture of a faceless video can be checked before the video is assembled: for writing that
126
+ neither the script nor the run's `character_details` contain, and for a frame cut into several pictures. The check
127
+ sits behind a server switch, which was turned on after its first production run had been read; that run, of eighteen
128
+ pictures, took a minute and a half longer than the same video unchecked. A picture
129
+ with either is drawn once more when the run has time and budget for it, and the cleaner of the two is used. What
130
+ remains is named in `warnings[]` with the seconds it is on screen, one line for each thing found; a finding by itself
131
+ does not fail the run. A picture whose check cannot run in its time or within the run's budget is used as it is, and
132
+ one `warnings[]` line says how many pictures went unchecked. The check is a paid step like the others: when its cost
133
+ cannot be established, the run waits for an operator. Scene pictures are also asked for no writing unless the scene
134
+ quotes the script, which removed invented signs and figures from 10 of 10 test pictures. A customer's own image is
135
+ not checked. Writing on a `character_reference` picture is not known to the check: a generated picture that repeats
136
+ it is reported when the writing has a figure or more than two words. (clipwright#516, clipwright#517)
137
+ - *Server-side:* the narration of a faceless video is delivered in two identical channels instead of one. It sounds the
138
+ same, and a loudness meter now reads the -16 LUFS the narration is levelled to; a meter that measured the single
139
+ channel read 3 LU lower. The file grows by about 1 %. (clipwright#526)
140
+
141
+ ### Security
142
+
143
+ - `@clipwright/mcp-server` requires `@modelcontextprotocol/sdk` 1.31.0 or newer. Earlier versions let an OAuth client
144
+ send credentials to an authorization server chosen by the MCP server (GHSA-6qxp-vccf-f47h). The server speaks stdio
145
+ and uses no OAuth; a fresh install of 0.25.0 already resolves to a patched version. (clipwright#510)
146
+
147
+ ### Fixed
148
+
149
+ - *Server-side:* a faceless video whose opening clip has to end in the middle of a phrase keeps the words a
150
+ `scene_images` picture is anchored to on that picture: the narration starts later, by under three seconds, so the
151
+ clip ends before those words. When no such start exists, the video is still delivered, and `warnings[]` names the image and
152
+ the anchored words spoken while the opening clip was on screen. It used to say nothing. (clipwright#521)
153
+ - *Server-side:* a faceless narration that comes out longer than the video may run is spoken once more, a little
154
+ faster. The run used to fail with `voice_outside_selected_duration` after the story and the speech were made, and
155
+ one script is spoken at a different length from run to run, so a script that fitted once could fail the next time.
156
+ A script that would not fit even at the fastest speech still fails, without a charge. (clipwright#529)
157
+ - *Server-side:* a faceless run no longer stops for review when one picture takes the image service about two minutes.
158
+ Such a picture is rare, about two in a hundred, but a video has eighteen or more, and since the pictures are made
159
+ three at a time (clipwright#520) one slow picture was enough to hold the whole run for an operator. A picture now has
160
+ four minutes before the run gives up on it. (clipwright#544)
161
+ - *Server-side:* two faceless videos made at the same time are much less likely to stop for review. To record what a
162
+ picture cost we ask the image service, which answers only a few such questions a minute; with two videos in work it
163
+ refused some, and a picture with no recorded cost held the whole run for an operator. A refused question now waits
164
+ as long as the service asks and is put again. Under load a video can take a few minutes longer; the limit itself
165
+ stays, so several videos at once can still meet it. (clipwright#553)
166
+ - *Server-side:* at most two faceless videos are made at once across all accounts; a third waits in the queue and
167
+ starts when one of them is done. Three at once asked the image service for more cost records than it answers, and
168
+ two of the three stopped for review. The limit per account stays at two, so one account's two videos can hold the
169
+ line while another account's video waits. (clipwright#553)
170
+ - *Server-side:* the voice preset `owner_ru_clone` speaks again. The cloned voice behind it was replaced at the
171
+ vendor, and a run that named the preset was refused before any charge. The preset now maps to the new voice, still
172
+ on `eleven_v4`, and `list_voices` links a sample spoken by it. (clipwright#497)
173
+ - *Server-side:* the delivery check of a faceless video no longer mistakes a yellow or amber picture for a caption
174
+ fault. It refused a correct video whose picture glowed behind the captions: a lamp, a sunset, fire, gold. The check
175
+ now compares neighbouring frames, so only yellow that moves with the spoken word counts. (clipwright#496)
176
+ - *Server-side:* a video file keeps one metadata box. The AI disclosure used to be added as a second box next to the
177
+ encoder's own, so a reader that takes the first box saw the encoder's comment and no disclosure. The disclosure now
178
+ replaces that comment in the one box, and the encoder tag stays. (clipwright#493)
179
+
19
180
  ## [0.25.0] - 2026-10-04
20
181
 
21
182
  The AI disclosure names what each video holds, and the clients show it: `get_run` of the MCP server and
package/README.md CHANGED
@@ -18,21 +18,29 @@ id, so a retried request returns the original run instead of paying twice. Pass
18
18
  `idempotencyKey` explicitly when you deliberately want a fresh run.
19
19
 
20
20
  `quoteFaceless(input)` prices a faceless video for a `duration_seconds` of 30 to 90
21
- (the delivered video runs from 25 seconds to 5 seconds past it, never past 90, and
21
+ (the delivered video runs from 25 seconds to a quarter past it, never past 90, and
22
22
  never costs more than the quote), and
23
23
  `startFaceless(input, { attempt })` starts it and returns the run at once; poll
24
24
  `getRun` until it succeeds. The input names its source with `input_mode`:
25
25
  `{ input_mode: "script", script, duration_seconds }` reads your text as written,
26
26
  `{ input_mode: "brief", brief, duration_seconds }` writes the narration from a
27
27
  short description. Captions are on unless `captions: false`. Both methods
28
- refuse a mismatched `script`/`brief` before sending anything.
28
+ refuse a mismatched `script`/`brief` before sending anything. `voice` picks the
29
+ narration voice: a name from `listVoices({ skill: "make_faceless" })`, in English,
30
+ Russian, Spanish, Portuguese, French or Italian. Without it the narration is
31
+ read by `narrator_en_wise_lady`. The API refuses an unknown name and a
32
+ `make_ugc` voice before any charge; `voice_id` is refused before sending.
29
33
 
30
- `listVoices({ language, gender, age, use_case, model })` returns the voices for
34
+ `listVoices({ language, gender, age, use_case, model, skill })` returns the voices for
31
35
  `voice`, each filter optional. It is free. A voice with a sample carries a
32
36
  `preview_url` that expires in an hour. Pass a voice's `name` as `voice`;
33
37
  `language` is a filter only, since any voice speaks any supported language.
38
+ Each voice names the one skill that speaks it in `skill`: `make_ugc` or
39
+ `make_faceless`. The other skill refuses it before any charge. Without `skill`
40
+ the list holds the `make_ugc` voices only; the narration voices of
41
+ `make_faceless` are listed with `skill: "make_faceless"`.
34
42
 
35
- The list holds the presets, the thirty voices of the speech model
43
+ For `make_ugc` the list holds the presets, the thirty voices of the speech model
36
44
  `gemini-3.8-flash-tts` (`kind: "model_voice"`) and the catalog. A `model_voice`
37
45
  voice has no language of its own: `language: "en"` and `language: "ru"` find it,
38
46
  and its sample is in English unless you ask for `language: "ru"`. Naming such a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clipwright/sdk",
3
- "version": "0.25.0",
3
+ "version": "0.26.1",
4
4
  "description": "TypeScript client for the Clipwright UGC video API",
5
5
  "license": "MIT",
6
6
  "author": "Dimantika Sp. z o.o.",
@@ -24,7 +24,7 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "zod": "^4.4.3",
27
- "@clipwright/core": "0.25.0"
27
+ "@clipwright/core": "0.26.1"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/node": "^26.1.1"