sapiens-mcp 1.40.0 → 1.41.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.
package/dist/registry.js CHANGED
@@ -114,7 +114,7 @@ export const TOOLS = {
114
114
  handler: shorts,
115
115
  },
116
116
  sapiens_video: {
117
- description: "Sapiens Video — gera vídeo (qualquer membro logado; vídeo é caro, cobra as Sinapses da sua conta). Sub-action 'create' (recomendada): escolhe modelo + config e gera num call (cria a row + renderiza). Modelos: 'sapiens-video-seedance' (Seedance 2.0, cena+áudio nativo, 4-15s, 480/720/1080p, t2v/i2v; aceita até 4 imagens de REFERÊNCIA via referenceImageIds/referenceImageUrls/referenceImagePaths (os Veo fast/quality também aceitam, até 3; Lite/Kling/WAN/Omni não), que guiam estilo/personagem/composição SEM virar o 1º frame — é o fluxo STORYBOARD: gere a folha de key poses com sapiens_image templateSlug='storyboard-sapiens-v1', passe folha + personagem como refs num t2v e descreva o take contínuo no prompt, citando as refs por descrição e mandando ignorar o traço do sketch; aceita também 1 VÍDEO DE MOVIMENTO via referenceVideoUrls (role 'refvideo' -> reference_videos, <=15s, host da casa): a coreografia/câmera do clipe guia o take, combinável com a folha), 'sapiens-video-kling' (Kling 3.0 Pro, anima imagem, 3-15s, sound opcional, i2v/t2v), 'sapiens-video-wan' (WAN 2.5, imagem que fala/canta com áudio+lip-sync, 5/10s, i2v), 'sapiens-video-kling-motion' (Motion transfer: passa o movimento de um vídeo pra uma imagem, PRECISA de pessoa com tronco visível na imagem E no vídeo), 'sapiens-video-shot-mimic' (Shot Mimic: recria o plano/câmera/cortes de um vídeo de referência como cena nova), 'sapiens-video-omni' (Gemini Omni: texto vira vídeo 10s 720p com áudio nativo; NÃO aceita mídia do user, ignora references/durationSec/resolution; editOfImageId aponta um vídeo Omni seu e o prompt edita a MESMA cena, preservando câmera e ambiente), 'sapiens-video-lite/fast/quality' (Veo 3.1). Args create: model, prompt, durationSec, resolution ('480p'/'720p'/'1080p'), audio, aspectRatio. FRAME INICIAL/FINAL POR REFERÊNCIA (recomendado): startImageId/endImageId (id da sua galeria) ou startImageUrl/endImageUrl (url de galeria/Acervo/personagem) — resolvidos server-side igual à imagem, descubra via sapiens_reference. FRAME POR ARQUIVO LOCAL (só no MCP instalado/stdio, não no remoto): startImagePath/endImagePath = caminho absoluto de uma imagem no seu PC (PNG/JPEG/WebP até 8MB); o processo lê o arquivo e sobe como frame inicial/final, igual a subir no gerador do site — 1 imagem inicial + 1 final por vídeo, então pra vários vídeos rode create uma vez por imagem. No remoto use id/url. Alternativa base64: references (role 'start'=imagem i2v, 'end'=frame final, 'driving'=vídeo de movimento do Motion). Suporte a frame final varia por modelo. Custo server-side por config. Sub-action 'generate' (legado): renderiza um imageId de vídeo já criado no site. Retorna {success, url, imageId, cost}. VITRINE (sem custo): sub-action 'demos' lista os SEUS demo films (kind=demo do Estúdio de Vídeo) com slug + estado de vitrine; sub-action 'showcase' põe/tira um demo (por slug) do mini-cinema da /conectar-claude, com showcaseTag (chip de capacidade) e showcaseOrder (ordem asc). Fluxo: 'demos' pra achar o slug, depois 'showcase' com showcase=true. Só entra na vitrine pública se for a conta da casa. VÍDEOS PROGRAMÁTICOS (ADMIN, sem custo): a mesa do Estúdio de Vídeo (/experimentos/films, tabela videoSpecs, 5 kinds: demo | aula-tour | essay | tipografia-musical | dataviz) opera por aqui sem browser — 'film-list' (todos os kinds; filtros filmKind/filmStatus), 'film-get' (spec inteiro por slug), 'film-upsert' (cria/atualiza por slug, idempotente; spec = objeto JSON no shape do 'Copiar spec' da tela, validação no servidor), 'film-status' (produção por slug: filmStatus + videoUrl + durationSecMeasured; o fecho do render é os três num call), 'film-publish' (Acervo aba Fitas + portfólio; exige pronto+URL), 'film-delete' (limpar rascunho). O RENDER do filme segue no agente local (skill /film, repo da casa): o MCP registra e fecha o ciclo, não renderiza. create é ASSÍNCRONA: cria o row, debita e volta NA HORA com {imageId, status:'rendering', cost} (não espera o render, que leva de segundos a minutos). Acompanhe com a sub-action 'status' (imageId) até status='completed' (traz a url) ou 'error'/'blocked'. NÃO chame create de novo enquanto renderiza (cria outro vídeo e cobra de novo); falha de provider refunda sozinha. SOM: 'sonorize' (imageId de vídeo SEU completed + prompt do som da cena) gera uma VARIANTE nova com trilha sincronizada (20 Sinapses/s, o original fica intacto; sonorize sempre o original, nunca uma variante). ADMIN: 'shadows' (videoUrl + title) extrai a sombra/depth-map de um vídeo pro Acervo como driving reutilizável; 'shadows-list' lista as sombras prontas. Sub-action 'models' (sem custo, sem login): lista os modelos de vídeo ativos + preço-piso + config (durações/resoluções) + disponibilidade (Omni depende de env).",
117
+ description: "Sapiens Video — gera vídeo (qualquer membro logado; vídeo é caro, cobra as Sinapses da sua conta). Sub-action 'create' (recomendada): escolhe modelo + config e gera num call (cria a row + renderiza). Modelos: 'sapiens-video-seedance' (Seedance 2.0, cena+áudio nativo, 4-15s, 480/720/1080p, t2v/i2v; aceita até 4 imagens de REFERÊNCIA via referenceImageIds/referenceImageUrls/referenceImagePaths (os Veo fast/quality também aceitam, até 3; Lite/Kling/WAN/Omni não), que guiam estilo/personagem/composição SEM virar o 1º frame — é o fluxo STORYBOARD: gere a folha de key poses com sapiens_image templateSlug='storyboard-sapiens-v1', passe folha + personagem como refs num t2v e descreva o take contínuo no prompt, citando as refs por descrição e mandando ignorar o traço do sketch; aceita também 1 VÍDEO DE MOVIMENTO via referenceVideoUrls (role 'refvideo' -> reference_videos, <=15s, host da casa): a coreografia/câmera do clipe guia o take, combinável com a folha), 'sapiens-video-seedance-2-fast' e 'sapiens-video-seedance-2-mini' (os irmãos do 2.0: MESMO repertório completo, incluindo referência, frame final e vídeo de movimento; o Fast custa 20% menos e o Mini METADE, ambos com teto 720p — pedir 1080p neles entrega e cobra 720p. Use o Mini pra iterar enquadramento/prompt barato e feche no 'sapiens-video-seedance' quando o take estiver certo), 'sapiens-video-kling' (Kling 3.0 Pro, anima imagem, 3-15s, sound opcional, i2v/t2v), 'sapiens-video-wan' (WAN 2.5, imagem que fala/canta com áudio+lip-sync, 5/10s, i2v), 'sapiens-video-kling-motion' (Motion transfer: passa o movimento de um vídeo pra uma imagem, PRECISA de pessoa com tronco visível na imagem E no vídeo), 'sapiens-video-shot-mimic' (Shot Mimic: recria o plano/câmera/cortes de um vídeo de referência como cena nova), 'sapiens-video-omni' (Gemini Omni: texto vira vídeo 10s 720p com áudio nativo; NÃO aceita mídia do user, ignora references/durationSec/resolution; editOfImageId aponta um vídeo Omni seu e o prompt edita a MESMA cena, preservando câmera e ambiente), 'sapiens-video-lite/fast/quality' (Veo 3.1). Args create: model, prompt, durationSec, resolution ('480p'/'720p'/'1080p'), audio, aspectRatio. FRAME INICIAL/FINAL POR REFERÊNCIA (recomendado): startImageId/endImageId (id da sua galeria) ou startImageUrl/endImageUrl (url de galeria/Acervo/personagem) — resolvidos server-side igual à imagem, descubra via sapiens_reference. FRAME POR ARQUIVO LOCAL (só no MCP instalado/stdio, não no remoto): startImagePath/endImagePath = caminho absoluto de uma imagem no seu PC (PNG/JPEG/WebP até 8MB); o processo lê o arquivo e sobe como frame inicial/final, igual a subir no gerador do site — 1 imagem inicial + 1 final por vídeo, então pra vários vídeos rode create uma vez por imagem. No remoto use id/url. Alternativa base64: references (role 'start'=imagem i2v, 'end'=frame final, 'driving'=vídeo de movimento do Motion). Suporte a frame final varia por modelo. Custo server-side por config. Sub-action 'generate' (legado): renderiza um imageId de vídeo já criado no site. Retorna {success, url, imageId, cost}. VITRINE (sem custo): sub-action 'demos' lista os SEUS demo films (kind=demo do Estúdio de Vídeo) com slug + estado de vitrine; sub-action 'showcase' põe/tira um demo (por slug) do mini-cinema da /conectar-claude, com showcaseTag (chip de capacidade) e showcaseOrder (ordem asc). Fluxo: 'demos' pra achar o slug, depois 'showcase' com showcase=true. Só entra na vitrine pública se for a conta da casa. VÍDEOS PROGRAMÁTICOS (ADMIN, sem custo): a mesa do Estúdio de Vídeo (/experimentos/films, tabela videoSpecs, 5 kinds: demo | aula-tour | essay | tipografia-musical | dataviz) opera por aqui sem browser — 'film-list' (todos os kinds; filtros filmKind/filmStatus), 'film-get' (spec inteiro por slug), 'film-upsert' (cria/atualiza por slug, idempotente; spec = objeto JSON no shape do 'Copiar spec' da tela, validação no servidor), 'film-status' (produção por slug: filmStatus + videoUrl + durationSecMeasured; o fecho do render é os três num call), 'film-publish' (Acervo aba Fitas + portfólio; exige pronto+URL), 'film-delete' (limpar rascunho). O RENDER do filme segue no agente local (skill /film, repo da casa): o MCP registra e fecha o ciclo, não renderiza. create é ASSÍNCRONA: cria o row, debita e volta NA HORA com {imageId, status:'rendering', cost} (não espera o render, que leva de segundos a minutos). Acompanhe com a sub-action 'status' (imageId) até status='completed' (traz a url) ou 'error'/'blocked'. NÃO chame create de novo enquanto renderiza (cria outro vídeo e cobra de novo); falha de provider refunda sozinha. SOM: 'sonorize' (imageId de vídeo SEU completed + prompt do som da cena) gera uma VARIANTE nova com trilha sincronizada (20 Sinapses/s, o original fica intacto; sonorize sempre o original, nunca uma variante). ADMIN: 'shadows' (videoUrl + title) extrai a sombra/depth-map de um vídeo: entra na sua timeline de vídeos e no Acervo como driving reutilizável; 'shadows-list' lista as sombras prontas. Sub-action 'models' (sem custo, sem login): lista os modelos de vídeo ativos + preço-piso + config (durações/resoluções) + disponibilidade (Omni depende de env).",
118
118
  schema: videoSchema,
119
119
  handler: video,
120
120
  },
@@ -184,7 +184,7 @@ export const TOOLS = {
184
184
  handler: trilhas,
185
185
  },
186
186
  sapiens_share: {
187
- description: "Share Drop (ADMIN-ONLY): sobe um HTML single-file (doctype + CSS/JS inline) e recebe o link curto sapiens.app/s/<code> pra mandar pra alguém abrir no navegador sem instalar nada. O PONTO: publicar um artefato e depois RE-PUBLICAR no MESMO link quantas vezes quiser (action=update com o code) — edita o HTML aqui no Claude, joga pro ar, atualiza o mesmo arquivo. Sub-actions: 'list' (links ativos: code + url + título + tamanho + isActive/hasPassword/requireLogin), 'upload' (cria link NOVO a partir de html ou htmlPath → devolve {code, url}), 'update' (re-publica no MESMO code: mesma url, conteúdo novo, apaga o blob antigo), 'delete' (tira do ar — o link vira 404), 'settings' (isActive liga/desliga, password senha string vazia remove, requireLogin exige conta logada). O HTML entra por `html` (conteúdo string, funciona no stdio e no remoto) OU `htmlPath` (caminho absoluto de um .html local, SÓ no MCP instalado/stdio). Título sai do <title> do HTML se não passar `title` (ou keepTitle=true no update pra manter o atual). Sem custo em Sinapses. Espelha a mesa /dashboard/admin/share-drop.",
187
+ description: "Share Drop (ADMIN-ONLY): sobe um HTML single-file (doctype + CSS/JS inline) e recebe o link curto sint.fyi/s/<code> pra mandar pra alguém abrir no navegador sem instalar nada. O PONTO: publicar um artefato e depois RE-PUBLICAR no MESMO link quantas vezes quiser (action=update com o code) — edita o HTML aqui no Claude, joga pro ar, atualiza o mesmo arquivo. Sub-actions: 'list' (links ativos: code + url + título + tamanho + isActive/hasPassword/requireLogin), 'upload' (cria link NOVO a partir de html ou htmlPath → devolve {code, url}), 'update' (re-publica no MESMO code: mesma url, conteúdo novo, apaga o blob antigo), 'delete' (tira do ar — o link vira 404), 'settings' (isActive liga/desliga, password senha string vazia remove, requireLogin exige conta logada). O HTML entra por `html` (conteúdo string, funciona no stdio e no remoto) OU `htmlPath` (caminho absoluto de um .html local, SÓ no MCP instalado/stdio). Título sai do <title> do HTML se não passar `title` (ou keepTitle=true no update pra manter o atual). Sem custo em Sinapses. Espelha a mesa /dashboard/admin/share-drop.",
188
188
  schema: shareDropSchema,
189
189
  handler: shareDrop,
190
190
  },
@@ -218,7 +218,7 @@ Efeito sonoro (sapiens_stock_audio): primeiro procure pronto (action=list kind=s
218
218
 
219
219
  Sonorizar clipe (sapiens_video action=sonorize): dá som a um vídeo SEU já gerado (status completed). Passe imageId + prompt descrevendo o som da cena (ambiente, materiais, impactos); sai uma VARIANTE nova com trilha sincronizada ao movimento (MMAudio, 20 Sinapses/s do clipe, mín 100), o original fica intacto. Acompanhe com action=status no imageId NOVO que o sonorize devolve. Não re-sonorize uma variante: sonorize sempre o original.
220
220
 
221
- Vídeo (sapiens_video) action=create EXIGE 'model': sapiens-video-seedance | kling | wan | kling-motion | lite | fast | quality | omni. Sem model, falha de cara. O 'omni' (Gemini Omni) gera clipe de 10s 720p com áudio nativo a partir de TEXTO (não aceita imagem/vídeo do user, ignora duração/resolução) e EDITA os próprios vídeos: passe editOfImageId com o imageId de um vídeo Omni já gerado e o prompt vira instrução de edição sobre a MESMA cena (troca item/personagem, preserva câmera e ambiente; cada edição debita como geração nova). É o caminho pra variações com continuidade: gera a base uma vez, edita N vezes. Vídeo é o mais caro: confirme com o usuário antes. action=shadows (ADMIN, 200 Sinapses/segundo, refund na falha): passa videoUrl (URL pública) + title (+ durationSec se souber, pra cobrar proporcional; sem ela, flat ~2000) e o servidor extrai a SOMBRA (mapa de profundidade) do vídeo e guarda no Acervo (Corpo) como deepshadow reutilizável (driving pro Shot Mimic/Kling Motion). VÍDEOS PROGRAMÁTICOS (Estúdio de Vídeo, tela /experimentos/films): são OUTRA coisa, a mesa de filmes-de-código da casa, CINCO kinds na tabela videoSpecs: demo (UI clonada + câmera), aula-tour (telas reais + narração), essay (fita-ensaio abstrata: partícula/tinta vira símbolo; narração opcional, 16:9 ou 9:16), tipografia-musical (clipe tipográfico, a música dirige o corte) e dataviz (barras/números no tempo). O RENDER não sai deste MCP: um agente local (Claude Code, skill /film) produz o mp4 no repo da casa. Mas o CICLO na plataforma fecha por aqui (ADMIN, sem custo): film-list/film-get puxam os specs, film-upsert registra/atualiza, film-status cola a URL do render e marca pronto, film-publish põe no Acervo. User comum pedindo 'fita-ensaio'/'demo film': aponte pra tela e pro agente local.
221
+ Vídeo (sapiens_video) action=create EXIGE 'model': sapiens-video-seedance | seedance-2-fast | seedance-2-mini | kling | wan | kling-motion | lite | fast | quality | omni. Sem model, falha de cara. Os três Seedance 2.0 têm o MESMO repertório (referência, frame inicial/final, vídeo de movimento, áudio nativo): o 'sapiens-video-seedance-2-mini' custa METADE do padrão e o '-2-fast' 20% menos, ambos com teto 720p. Iterar no Mini e fechar no padrão economiza Sinapses do usuário sem trocar de fluxo. O 'omni' (Gemini Omni) gera clipe de 10s 720p com áudio nativo a partir de TEXTO (não aceita imagem/vídeo do user, ignora duração/resolução) e EDITA os próprios vídeos: passe editOfImageId com o imageId de um vídeo Omni já gerado e o prompt vira instrução de edição sobre a MESMA cena (troca item/personagem, preserva câmera e ambiente; cada edição debita como geração nova). É o caminho pra variações com continuidade: gera a base uma vez, edita N vezes. Vídeo é o mais caro: confirme com o usuário antes. action=shadows (ADMIN, 200 Sinapses/segundo, refund na falha): passa videoUrl (URL pública) + title (+ durationSec se souber, pra cobrar proporcional; sem ela, flat ~2000) e o servidor extrai a SOMBRA (mapa de profundidade) do vídeo: ela cai na SUA timeline de vídeos (quem extrai vira dono, igual ao recorte de fundo na imagem) e vira ficha no Acervo (Corpo) como deepshadow reutilizável (driving pro Shot Mimic/Kling Motion). VÍDEOS PROGRAMÁTICOS (Estúdio de Vídeo, tela /experimentos/films): são OUTRA coisa, a mesa de filmes-de-código da casa, CINCO kinds na tabela videoSpecs: demo (UI clonada + câmera), aula-tour (telas reais + narração), essay (fita-ensaio abstrata: partícula/tinta vira símbolo; narração opcional, 16:9 ou 9:16), tipografia-musical (clipe tipográfico, a música dirige o corte) e dataviz (barras/números no tempo). O RENDER não sai deste MCP: um agente local (Claude Code, skill /film) produz o mp4 no repo da casa. Mas o CICLO na plataforma fecha por aqui (ADMIN, sem custo): film-list/film-get puxam os specs, film-upsert registra/atualiza, film-status cola a URL do render e marca pronto, film-publish põe no Acervo. User comum pedindo 'fita-ensaio'/'demo film': aponte pra tela e pro agente local.
222
222
 
223
223
  Imagem (sapiens_image) action=generate: prompt + model + aspectRatio. Referência via referenceImageUrls (galeria/Acervo/personagens) e/ou sourceImageIds. templateSlug aplica um super-prompt travado da casa. PROMPT na regra da casa: full-bleed, sujeito oversized (70%+ do frame), sem "tarot card"/"intimate scale"/moldura/margem. action=models (sem custo, sem login) lista os modelos ativos com o preço atual: consulte quando não tiver certeza do modelo ou do custo.
224
224
 
@@ -219,6 +219,7 @@ export async function image(args) {
219
219
  return {
220
220
  imageId: result?.imageId,
221
221
  url: result?.url,
222
+ webUrl: result?.imageId ? `https://sapiensinteticos.com/imagem/${result.imageId}` : undefined,
222
223
  mimeType: result?.mimeType,
223
224
  // studioApplied=true só quando useStudio achou e aplicou o studio do user.
224
225
  // false = geração base. É o sinal pra não confundir studio com base.
@@ -7,6 +7,37 @@ import { setTierFromIsAdmin } from "../tier.js";
7
7
  * package.json em runtime). Serve pra flagrar client preso em cache antigo do npx.
8
8
  */
9
9
  const readMcpVersion = getMcpVersion;
10
+ /**
11
+ * Compara a versão rodando com a última do npm. Best-effort: offline, timeout ou
12
+ * npm fora devolve `latest: null` e ninguém é incomodado.
13
+ *
14
+ * Serve a duas superfícies: `action=version` (diagnóstico sob demanda) e
15
+ * `action=start` (a porta de entrada, que avisa sozinha). Client atrasado é
16
+ * invisível pra quem usa — o agente chama uma rota velha, toma erro do servidor
17
+ * e conclui qualquer coisa. Um cliente do Repertório passou por isso em
18
+ * jul/2026: MCP preso em versão de junho, "adicionei o filme!" sem item nenhum.
19
+ */
20
+ async function fetchVersionStatus() {
21
+ const version = readMcpVersion();
22
+ try {
23
+ const ctrl = new AbortController();
24
+ const timer = setTimeout(() => ctrl.abort(), 2500);
25
+ const resp = await fetch("https://registry.npmjs.org/sapiens-mcp/latest", {
26
+ signal: ctrl.signal,
27
+ });
28
+ clearTimeout(timer);
29
+ if (resp.ok) {
30
+ const data = await resp.json();
31
+ if (typeof data?.version === "string") {
32
+ return { version, latest: data.version, upToDate: data.version === version };
33
+ }
34
+ }
35
+ }
36
+ catch {
37
+ // offline / timeout: reporta só a versão local (ainda útil)
38
+ }
39
+ return { version, latest: null, upToDate: null };
40
+ }
10
41
  export const metaSchema = z.object({
11
42
  action: z.enum([
12
43
  "start",
@@ -203,9 +234,26 @@ export async function meta(args) {
203
234
  catch {
204
235
  token = null;
205
236
  }
237
+ // Checagem de versão na porta de entrada: quem está atrasado descobre agora,
238
+ // e não depois de uma tool falhar por rota antiga.
239
+ const ver = await fetchVersionStatus();
240
+ const outdated = ver.upToDate === false
241
+ ? {
242
+ clientOutdated: {
243
+ running: ver.version,
244
+ latest: ver.latest,
245
+ howToFix: [
246
+ `Atualizar o pacote: pinar sapiens-mcp@${ver.latest} na config do MCP, ou limpar o cache do npx e reiniciar o agent (restart sozinho não basta, o cache sobrevive).`,
247
+ "Ou conectar pelo MCP remoto em sapiensinteticos.com/conectar-claude: ele sai do site, então está sempre na última versão e nunca desatualiza.",
248
+ ],
249
+ note: "AVISE O USUÁRIO já na primeira resposta. Client atrasado chama rotas antigas e falha de um jeito que parece erro do Sapiens (ex: filme que 'foi adicionado' e não entrou no Repertório).",
250
+ },
251
+ }
252
+ : {};
206
253
  if (!token) {
207
254
  return {
208
255
  connected: false,
256
+ ...outdated,
209
257
  message: "Bem-vindo ao Sapiens Sintéticos. Sua conta ainda não tá conectada aqui no cliente.",
210
258
  howToConnect: [
211
259
  "1. Entra logado em sapiensinteticos.com/conectar-claude e gera um código XXXX-XXXX (expira em 5 min, uso único).",
@@ -238,6 +286,7 @@ export async function meta(args) {
238
286
  const companion = await loadCompanion(token);
239
287
  return {
240
288
  connected: true,
289
+ ...outdated,
241
290
  // Quando a companhia está ativa, o operador NÃO abre como assistente
242
291
  // neutro: incorpora o Sintético (companion.voiceDirective) e dá o oi na
243
292
  // voz dele. Este campo vem primeiro de propósito, pra o modelo ver antes.
@@ -297,27 +346,7 @@ export async function meta(args) {
297
346
  // exige login: é sobre o binário, não a conta. É o teste limpo pra saber se o
298
347
  // client pegou a versão nova ou ficou preso em cache do npx.
299
348
  if (args.action === "version") {
300
- const version = readMcpVersion();
301
- let latest = null;
302
- let upToDate = null;
303
- try {
304
- const ctrl = new AbortController();
305
- const timer = setTimeout(() => ctrl.abort(), 2500);
306
- const resp = await fetch("https://registry.npmjs.org/sapiens-mcp/latest", {
307
- signal: ctrl.signal,
308
- });
309
- clearTimeout(timer);
310
- if (resp.ok) {
311
- const data = await resp.json();
312
- if (typeof data?.version === "string") {
313
- latest = data.version;
314
- upToDate = latest === version;
315
- }
316
- }
317
- }
318
- catch {
319
- // offline / timeout: reporta só a versão local (ainda útil)
320
- }
349
+ const { version, latest, upToDate } = await fetchVersionStatus();
321
350
  return {
322
351
  name: "sapiens-mcp",
323
352
  version,
@@ -5,7 +5,7 @@ import { need } from "../schema.js";
5
5
  /**
6
6
  * sapiens_share — Share Drop pelo MCP (ADMIN-ONLY; requireMcpAdmin no Convex).
7
7
  *
8
- * Sobe um HTML single-file e recebe o link curto sapiens.app/s/<code>. O ponto:
8
+ * Sobe um HTML single-file e recebe o link curto sint.fyi/s/<code>. O ponto:
9
9
  * PUBLICAR um artefato e depois RE-PUBLICAR no MESMO link quantas vezes quiser
10
10
  * (action=update com o code) — edita aqui no Claude, joga pro ar, atualiza o
11
11
  * mesmo arquivo. Espelha a mesa /dashboard/admin/share-drop e o CLI
@@ -15,12 +15,12 @@ import { need } from "../schema.js";
15
15
  * `htmlPath` (caminho local .html, SÓ no MCP instalado/stdio — no remoto não há
16
16
  * disco do usuário). Título sai do <title> do HTML se não vier explícito.
17
17
  */
18
- // Domínio que serve a rota /s/[code]. No browser a UI usa window.location.origin
19
- // (o site: sapiensinteticos.com); aqui no server-side usamos o domínio canônico
20
- // do site, com override por env. NÃO usar "sapiens.app": aquilo é só texto
21
- // ilustrativo na página do Share Drop, não é um domínio configurado.
18
+ // Microlink oficial da casa: sint.fyi/s/<code> faz 301 preservando o path pra
19
+ // www.sapiensinteticos.com/s/<code>, onde a rota /s/[code] serve o HTML. É o
20
+ // link curto pra compartilhar. Override por env. (NÃO usar "sapiens.app": era
21
+ // texto ilustrativo antigo, domínio não configurado.)
22
22
  const SHARE_BASE_URL = process.env.SHARE_DROP_BASE_URL?.replace(/\/$/, "") ||
23
- "https://sapiensinteticos.com";
23
+ "https://sint.fyi";
24
24
  export const shareDropSchema = z.object({
25
25
  action: z.enum(["list", "upload", "update", "delete", "settings"]),
26
26
  code: z
@@ -42,6 +42,13 @@ import { httpUrl } from "../schema.js";
42
42
  * personagem/composição sem virar o 1º frame. É o fluxo storyboard:
43
43
  * folha de key poses (template storyboard-sapiens-v1 do sapiens_image)
44
44
  * + imagem do personagem como refs num t2v de take contínuo.
45
+ * - sapiens-video-seedance-2-fast Seedance 2.0 Fast — o MESMO repertório do 2.0 (referência, frame
46
+ * final, vídeo de movimento, áudio nativo), 20% mais barato e mais
47
+ * rápido. Teto 720p.
48
+ * - sapiens-video-seedance-2-mini Seedance 2.0 Mini — metade do preço do 2.0, mesmo repertório,
49
+ * teto 720p. É o take pra queimar tentativa e achar o enquadramento
50
+ * antes de fechar no 2.0 padrão. Pedir 1080p nos dois cai em 720p
51
+ * (cobrando 720p).
45
52
  * - sapiens-video-kling Kling 3.0 Pro — dá vida a uma imagem, 3-15s, sound opcional (i2v/t2v)
46
53
  * - sapiens-video-wan WAN 2.5 — imagem que fala/canta (áudio+lip-sync nativo), 5/10s (i2v)
47
54
  * - sapiens-video-kling-motion Kling Motion — transfere o movimento de um vídeo pra uma imagem
@@ -65,6 +72,8 @@ import { httpUrl } from "../schema.js";
65
72
  */
66
73
  const VIDEO_MODELS = [
67
74
  "sapiens-video-seedance",
75
+ "sapiens-video-seedance-2-fast",
76
+ "sapiens-video-seedance-2-mini",
68
77
  "sapiens-video-kling",
69
78
  "sapiens-video-wan",
70
79
  "sapiens-video-kling-motion",
@@ -122,7 +131,7 @@ export const videoSchema = z.object({
122
131
  // --- action=shadows (deepshadows: extrai o mapa de profundidade de um vídeo) ---
123
132
  videoUrl: httpUrl()
124
133
  .optional()
125
- .describe("action=shadows: URL pública (http/https) do vídeo-fonte. O servidor extrai a SOMBRA (depth) e guarda no Acervo (Corpo). ADMIN, 200 Sinapses/segundo (refund na falha). " +
134
+ .describe("action=shadows: URL pública (http/https) do vídeo-fonte. O servidor extrai a SOMBRA (depth), entrega ela na SUA timeline de vídeos (você vira dono) e guarda a ficha no Acervo (Corpo). ADMIN, 200 Sinapses/segundo (refund na falha). " +
126
135
  "film-status: a URL https do render no CDN (Bunny), o que acende o player do card."),
127
136
  title: z
128
137
  .string()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sapiens-mcp",
3
- "version": "1.40.0",
3
+ "version": "1.41.0",
4
4
  "description": "MCP server pra operar o Sapiens Sintéticos (sapiensinteticos.com) pelo Claude Code: gerar imagem, escrever artigo, voz, música e mais, na sua conta. Login pelo código de sapiensinteticos.com/conectar-claude.",
5
5
  "type": "module",
6
6
  "bin": {