sapiens-mcp 1.62.4 → 1.62.6

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
@@ -50,7 +50,7 @@ import { skillMenuLine } from "./skills.js";
50
50
  */
51
51
  export const TOOLS = {
52
52
  sapiens_pipeline: {
53
- description: "CRUD do content pipeline Sapiens (sources/productions/publishables). Sub-actions: list_sources, list_articles (use includeDrafts pra incluir drafts; onlyAvailable pra esconder os já virados em source), get_source, get_production, list_versions, add_article_as_source, create_draft_article_and_source (seed), create_production (sourceId+format → productionId draft), update_production (substitui payload, opcionalmente muda status), finalize_production (cria publishable v1, v2... com snapshot), remove_production, remove_source, set_source_done, update_source_notes, restore_version (volta payload duma versão antiga), set_publishable_title (renomeia um publishable), backfill_via (rotula em lote o campo 'via' das productions antigas; dryRun=true só lista), propose_mega_grafico_plan (granular: só gera plano via Gemini, devolve fullPrompt+spec), run_mega_grafico_full (ONE-SHOT, recomendado: cria production+propõe plano+gera imagem+aplica selo Sapiens+finaliza publishable numa chamada só), generate_carousel (gera um carrossel editorial standalone a partir de brief OU articleId — 7-9 slides na voz Sapiens + imagens do banco; devolve id + url do editor pro humano abrir, ajustar e exportar; admin-only, cobra Sinapses, reembolsa se falhar; model opcional trava uma folha registrada da casa, ex 'feed' ou 'reflexao', em vez do caminho editorial livre). generate_carousel_production (o IRMÃO PIPELINE do generate_carousel: recebe um sourceId de artigo, CRIA a production carrossel_ig e a preenche pelo MESMO motor da casa, já no shape editorial (templateId+slots) que o editor de pipeline renderiza — prefira ESTE a create_production+payload cru pro carrossel, que abre VAZIO no editor; devolve productionId + url do editor de pipeline; admin-only, cobra Sinapses, reembolsa se falhar; model opcional trava a folha registrada; beats opcional entrega copy PRONTO por beat da espinha, [{n, slots}], quando o agente JÁ escreveu e validou os blocos: com beats o Gemini de escrita NÃO roda e a rodada cobra só o picker de imagens, zero com autoPickImages=false; caption opcional vira a legenda do meta). CARROSSEL FINO (edição sem tela, admin-only): list_carousels (seus carrosséis standalone), get_carousel (payload completo + catálogo de templates com slots/limites + paletas — tudo pra VOCÊ escrever os slides), update_carousel (payload inteiro de volta, sanitizado no servidor; preserve os campos image dos slides que não mexeu), carousel_auto_images (IA escolhe imagens do banco pros slides de foto, 60 Sinapses; aceita carouselId standalone OU productionId de carrossel da pipeline; makeVisual=true converte slides de texto pra layouts de foto antes — ritmo visual; generateMissing=true gera imagem nova pros que o banco não cobrir, ~450 Sinapses cada, até 4, avise o custo antes), carousel_generate_image (imagem nova pra UM slide, ~450 Sinapses, customPrompt opcional). Fluxo confortável (standalone): generate_carousel → get_carousel → update_carousel (afia os textos) → carousel_auto_images → humano abre a url pra exportar. Fluxo pipeline (carrossel atrelado a um artigo/source): generate_carousel_production (sourceId) → humano abre a url do editor de pipeline pra revisar e finalizar (finalize_production). Fluxo pipeline com copy do agente (a skill escreveu os blocos): generate_carousel_production (sourceId + model + beats) → carousel_auto_images (productionId) se faltar foto → humano revisa e finaliza. Pra mega_grafico, SEMPRE prefira run_mega_grafico_full em vez de sequenciar manualmente (menos drift). Idempotente só na production (passa productionId pra reusar a MESMA row), mas cada run RE-GERA a imagem e cobra de novo (~900 Sinapses): não é grátis re-rodar. OBRIGATÓRIO perguntar ao user antes se withHelen=true (cartoon Helen interage com tema, ~15-25% do poster) ou false (poster 100% diagramático). Custo ~900-1000 sinapses por geração. run_mega_grafico_full, generate_carousel, generate_carousel_production, carousel_auto_images (com generateMissing) e carousel_generate_image são SÍNCRONAS e pesadas: vale a REGRA DO TIMEOUT (podem cobrar mesmo voltando 'Timeout'; cheque get_carousel/dashboard antes de repetir). Use skipFinalize=true se quiser deixar production em 'ready' pro admin revisar antes de publishable. Payload livre por formato — chame sapiens_meta action=formats pra ver schemas sugeridos.",
53
+ description: "CRUD do content pipeline Sapiens (sources/productions/publishables). Sub-actions: list_sources, list_articles (use includeDrafts pra incluir drafts; onlyAvailable pra esconder os já virados em source), get_source, get_production, list_versions, add_article_as_source, create_draft_article_and_source (seed), create_production (sourceId+format → productionId draft), update_production (substitui payload, opcionalmente muda status), finalize_production (cria publishable v1, v2... com snapshot), remove_production, remove_source, set_source_done, update_source_notes, restore_version (volta payload duma versão antiga), set_publishable_title (renomeia um publishable), backfill_via (rotula em lote o campo 'via' das productions antigas; dryRun=true só lista), propose_mega_grafico_plan (granular: só gera plano via Gemini, devolve fullPrompt+spec), run_mega_grafico_full (ONE-SHOT, recomendado: cria production+propõe plano+gera imagem+aplica selo Sapiens+finaliza publishable numa chamada só), generate_carousel (gera um carrossel editorial standalone a partir de brief OU articleId — 7-9 slides na voz Sapiens + imagens do banco; devolve id + url do editor pro humano abrir, ajustar e exportar; admin-only, cobra Sinapses, reembolsa se falhar; model opcional trava uma folha registrada da casa, ex 'feed' ou 'reflexao', em vez do caminho editorial livre; aspect opcional escolhe o TAMANHO da folha, '9:16' (default, ocupa a tela inteira do celular no feed) ou '4:5' (folha clássica, ainda melhor no LinkedIn e no X) — model é a FORMA, aspect é o TAMANHO, e dá pra trocar depois no editor). generate_carousel_production (o IRMÃO PIPELINE do generate_carousel: recebe um sourceId de artigo, CRIA a production carrossel_ig e a preenche pelo MESMO motor da casa, já no shape editorial (templateId+slots) que o editor de pipeline renderiza — prefira ESTE a create_production+payload cru pro carrossel, que abre VAZIO no editor; devolve productionId + url do editor de pipeline; admin-only, cobra Sinapses, reembolsa se falhar; model opcional trava a folha registrada; beats opcional entrega copy PRONTO por beat da espinha, [{n, slots}], quando o agente JÁ escreveu e validou os blocos: com beats o Gemini de escrita NÃO roda e a rodada cobra só o picker de imagens, zero com autoPickImages=false; caption opcional vira a legenda do meta). CARROSSEL FINO (edição sem tela, admin-only): list_carousels (seus carrosséis standalone), get_carousel (payload completo + catálogo de templates com slots/limites + paletas + o formato da peça e os válidos — tudo pra VOCÊ escrever os slides), update_carousel (payload inteiro de volta, sanitizado no servidor; preserve os campos image dos slides que não mexeu E o theme.sheet, que é o formato: theme reescrito sem ele devolve a peça pra folha padrão), carousel_auto_images (IA escolhe imagens do banco pros slides de foto, 60 Sinapses; aceita carouselId standalone OU productionId de carrossel da pipeline; makeVisual=true converte slides de texto pra layouts de foto antes — ritmo visual; generateMissing=true gera imagem nova pros que o banco não cobrir, ~450 Sinapses cada, até 4, avise o custo antes), carousel_generate_image (imagem nova pra UM slide, ~450 Sinapses, customPrompt opcional). Fluxo confortável (standalone): generate_carousel → get_carousel → update_carousel (afia os textos) → carousel_auto_images → humano abre a url pra exportar. Fluxo pipeline (carrossel atrelado a um artigo/source): generate_carousel_production (sourceId) → humano abre a url do editor de pipeline pra revisar e finalizar (finalize_production). Fluxo pipeline com copy do agente (a skill escreveu os blocos): generate_carousel_production (sourceId + model + beats) → carousel_auto_images (productionId) se faltar foto → humano revisa e finaliza. Pra mega_grafico, SEMPRE prefira run_mega_grafico_full em vez de sequenciar manualmente (menos drift). Idempotente só na production (passa productionId pra reusar a MESMA row), mas cada run RE-GERA a imagem e cobra de novo (~900 Sinapses): não é grátis re-rodar. OBRIGATÓRIO perguntar ao user antes se withHelen=true (cartoon Helen interage com tema, ~15-25% do poster) ou false (poster 100% diagramático). Custo ~900-1000 sinapses por geração. run_mega_grafico_full, generate_carousel, generate_carousel_production, carousel_auto_images (com generateMissing) e carousel_generate_image são SÍNCRONAS e pesadas: vale a REGRA DO TIMEOUT (podem cobrar mesmo voltando 'Timeout'; cheque get_carousel/dashboard antes de repetir). Use skipFinalize=true se quiser deixar production em 'ready' pro admin revisar antes de publishable. Payload livre por formato — chame sapiens_meta action=formats pra ver schemas sugeridos.",
54
54
  schema: pipelineSchema,
55
55
  handler: pipeline,
56
56
  },
@@ -125,7 +125,7 @@ export const TOOLS = {
125
125
  handler: musicator,
126
126
  },
127
127
  sapiens_video: {
128
- 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 e os dois Omni também aceitam, até 3; Lite/Kling/WAN 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-seedance-25' (Seedance 2.5, a geração SEGUINTE e não um quarto tier da 2.0: take de 4 a 30s num fôlego, edita e estende vídeo, mesmo repertório de referência mais ÁUDIO como referência; teto 720p e ~1,5x o preço por segundo do 2.0. Duração é o que pesa aqui: 30s em 720p passa de 40 mil Sinapses, então confirme a duração com a pessoa antes de disparar. Quem precisa de 1080p fica no 'sapiens-video-seedance'), 'sapiens-video-seedance-15' (Seedance 1.5 Pro: o degrau entre o 1.0 e a linha 2.x; t2v/i2v, 4-12s, 480/720/1080p, som sempre incluso sem toggle; imagem de referência e frame final ficam de fora por ora), 'sapiens-video-kling' (Kling 3.0 Pro, anima imagem, 3-15s, sound opcional, i2v/t2v), 'sapiens-video-hailuo' (Hailuo 2.3 da MiniMax, física e movimento em 768p, 6 ou 10s, t2v/i2v) e 'sapiens-video-hailuo-pro' (o mesmo em 1080p, 5s fixo — duração não é param aqui): motores PUROS, sem áudio nativo, sem imagens de referência e sem frame final, então quem precisa disso fica no Seedance 2.0; o Pro é o 1080p mais barato da casa depois do Seedance 1.0 Fast, 'sapiens-video-h3' (MiniMax H3: 2K com áudio nativo incluso sem toggle, 5 a 10s, t2v/i2v e frame final; não aceita imagem de referência), '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-11' (Gemini Omni 1.1: texto ou imagem vira vídeo 10s 720p com áudio nativo; aceita até 3 imagens de referência e ignora durationSec/resolution, que são fixos; editOfImageId aponta um vídeo Omni seu e o prompt edita a MESMA cena, preservando câmera e ambiente) e 'sapiens-video-omni' (o 1.0 preview: mesmo preço e mesmo repertório, desligado por default, existe pra comparar com o 1.1), 'sapiens-video-lite/fast/quality' (Veo 3.1). Args create: model, prompt, durationSec, resolution ('480p'/'720p'/'1080p'), audio, aspectRatio. RECEITA DE TAKE (templateSlug + brief), o irmão do templateSlug da imagem: em vez de escrever o prompt inteiro, passe templateSlug e a receita travada da casa embrulha a cena com estilo, cenário, arco, áudio e look, e ainda escolhe o motor (por isso model fica opcional). O `prompt` vira só a CENA e o `brief` preenche os campos do formato (subject, persona, hook, shots com voiceLine e propVisible, uvps, language, energy); campo vazio some do prompt em vez de virar buraco. Receitas de hoje: 'ugc-vertical-v1' (selfie que fala, o formato nativo de Reels/TikTok/Shorts), 'unboxing-vertical-v1' (mãos e reveal, som real do papel e do lacre), 'app-demo-vertical-v1' (a tela do app legível na mão da pessoa) e 'reflexao-vertical-v1' (talking-head lento pra ideia ou ensaio). Override de model/aspectRatio/durationSec/resolution vale dentro do que a receita aceita, e o erro lista as opções. Sub-action 'templates' (sem custo, sem login) traz o catálogo vivo com spec default, whitelist e os briefFields de cada uma. Isto substitui a tool sapiens_shorts, que era admin-only e só falava Veo 3.1 Fast; o mesmo UGC de 8s sai a 720p no Seedance 2.0 Mini por bem menos. 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): o Lab 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 o deepshadow (depth-map) de um vídeo: entra na sua timeline de vídeos e no Acervo como driving reutilizável; 'shadows-list' lista os deepshadows prontos. PREÇO DE VÍDEO É FAIXA, NÃO NÚMERO: nos motores por segundo (todo Seedance, Kling, WAN, Hailuo, H3, Shot Mimic) a conta é duração x resolução [x áudio], e OMITIR não pega o barato: sem 'resolution' o servidor cobra o tier MAIS CARO do motor, sem 'durationSec' cobra o piso de duração. Um create de Seedance 2.0 sem resolution debita 1080p. Nunca prometa um valor sem cotar: sub-action 'price' (sem custo, sem login) devolve o número EXATO que o create vai debitar pra model + durationSec + resolution + audio, e avisa (clamped=true) quando o que você pediu não é o que vai ser cobrado. Sub-action 'models' (sem custo, sem login): lista os modelos ativos + a faixa de preço calculada pela mesma função que debita (priceDefault = o que uma chamada sem config custa, priceMin e priceMax = os dois cantos do motor, cada um com a config que o produz) + config (durações/resoluções) + disponibilidade (motor em preview pode aparecer como 'em breve'). LEGENDA (fita, por slug): 'caption-list' (sem custo, mostra os idiomas que a peça já tem), 'caption-generate' (captionLang = idioma FALADO; captionTrio=true já traduz pro trio da casa pt+en+ja na mesma chamada) e 'caption-translate' (captionLang = destino, parte sempre da faixa original). Cobra por minuto começado de vídeo: 50 Sinapses o minuto transcrito, 20 o traduzido, com a duração vindo do doc da peça. A legenda é desenhada pela casa em dois estilos (discreta e social), trocáveis no play sem regerar e sem custo.",
128
+ 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 e os dois Omni também aceitam, até 3; Lite/Kling/WAN 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-seedance-25' (Seedance 2.5, a geração SEGUINTE e não um quarto tier da 2.0: take de 4 a 30s num fôlego, edita e estende vídeo, mesmo repertório de referência mais ÁUDIO como referência; teto 720p e ~1,5x o preço por segundo do 2.0. Duração é o que pesa aqui: 30s em 720p passa de 40 mil Sinapses, então confirme a duração com a pessoa antes de disparar. Quem precisa de 1080p fica no 'sapiens-video-seedance'), 'sapiens-video-seedance-15' (Seedance 1.5 Pro: o degrau entre o 1.0 e a linha 2.x; t2v/i2v, 4-12s, 480/720/1080p, som sempre incluso sem toggle; imagem de referência e frame final ficam de fora por ora), 'sapiens-video-kling' (Kling 3.0 Pro, anima imagem, 3-15s, sound opcional, i2v/t2v), 'sapiens-video-hailuo' (Hailuo 2.3 da MiniMax, física e movimento em 768p, 6 ou 10s, t2v/i2v) e 'sapiens-video-hailuo-pro' (o mesmo em 1080p, 5s fixo — duração não é param aqui): motores PUROS, sem áudio nativo, sem imagens de referência e sem frame final, então quem precisa disso fica no Seedance 2.0; o Pro é o 1080p mais barato da casa depois do Seedance 1.0 Fast, 'sapiens-video-h3' (MiniMax H3: 2K com áudio nativo incluso sem toggle, 5 a 10s, t2v/i2v e frame final; não aceita imagem de referência), '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-11' (Gemini Omni 1.1: texto ou imagem vira vídeo 10s 720p com áudio nativo; aceita até 3 imagens de referência e ignora durationSec/resolution, que são fixos; editOfImageId aponta um vídeo Omni seu e o prompt edita a MESMA cena, preservando câmera e ambiente) e 'sapiens-video-omni' (o 1.0 preview: mesmo preço e mesmo repertório, desligado por default, existe pra comparar com o 1.1), 'sapiens-video-lite/fast/quality' (Veo 3.1). Args create: model, prompt, durationSec, resolution ('480p'/'720p'/'1080p'), audio, aspectRatio. RECEITA DE TAKE (templateSlug + brief), o irmão do templateSlug da imagem: em vez de escrever o prompt inteiro, passe templateSlug e a receita travada da casa embrulha a cena com estilo, cenário, arco, áudio e look, e ainda escolhe o motor (por isso model fica opcional). O `prompt` vira só a CENA e o `brief` preenche os campos do formato (subject, persona, hook, shots com voiceLine e propVisible, uvps, language, energy); campo vazio some do prompt em vez de virar buraco. Receitas de hoje: 'ugc-vertical-v1' (selfie que fala, o formato nativo de Reels/TikTok/Shorts), 'unboxing-vertical-v1' (mãos e reveal, som real do papel e do lacre), 'app-demo-vertical-v1' (a tela do app legível na mão da pessoa) e 'reflexao-vertical-v1' (talking-head lento pra ideia ou ensaio). Override de model/aspectRatio/durationSec/resolution vale dentro do que a receita aceita, e o erro lista as opções. Sub-action 'templates' (sem custo, sem login) traz o catálogo vivo com spec default, whitelist e os briefFields de cada uma. Isto substitui a tool sapiens_shorts, que era admin-only e só falava Veo 3.1 Fast; o mesmo UGC de 8s sai a 720p no Seedance 2.0 Mini por bem menos. 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): o Lab 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 o depth map (depth-map) de um vídeo: entra na sua timeline de vídeos e no Acervo como driving reutilizável; 'shadows-list' lista os depth maps prontos. PREÇO DE VÍDEO É FAIXA, NÃO NÚMERO: nos motores por segundo (todo Seedance, Kling, WAN, Hailuo, H3, Shot Mimic) a conta é duração x resolução [x áudio], e OMITIR não pega o barato: sem 'resolution' o servidor cobra o tier MAIS CARO do motor, sem 'durationSec' cobra o piso de duração. Um create de Seedance 2.0 sem resolution debita 1080p. Nunca prometa um valor sem cotar: sub-action 'price' (sem custo, sem login) devolve o número EXATO que o create vai debitar pra model + durationSec + resolution + audio, e avisa (clamped=true) quando o que você pediu não é o que vai ser cobrado. Sub-action 'models' (sem custo, sem login): lista os modelos ativos + a faixa de preço calculada pela mesma função que debita (priceDefault = o que uma chamada sem config custa, priceMin e priceMax = os dois cantos do motor, cada um com a config que o produz) + config (durações/resoluções) + disponibilidade (motor em preview pode aparecer como 'em breve'). LEGENDA (fita, por slug): 'caption-list' (sem custo, mostra os idiomas que a peça já tem), 'caption-generate' (captionLang = idioma FALADO; captionTrio=true já traduz pro trio da casa pt+en+ja na mesma chamada) e 'caption-translate' (captionLang = destino, parte sempre da faixa original). Cobra por minuto começado de vídeo: 50 Sinapses o minuto transcrito, 20 o traduzido, com a duração vindo do doc da peça. A legenda é desenhada pela casa em dois estilos (discreta e social), trocáveis no play sem regerar e sem custo.",
129
129
  schema: videoSchema,
130
130
  handler: video,
131
131
  },
@@ -230,26 +230,26 @@ export const TOOLS = {
230
230
  // É a "skill que anda junto com o pacote": escrevo uma vez, vale pra todos os clients,
231
231
  // sem instalar nada. Cobre os tropeços reais (fluxo do musicator, model no vídeo, o
232
232
  // disjuntor anti-loop). Mantém curto de propósito: viaja em todo handshake.
233
- export const SAPIENS_INSTRUCTIONS = `Você opera o Sapiens Sintéticos (sapiensinteticos.com) NA CONTA de um usuário logado. Cada tool age de verdade na conta dele e muitas COBRAM Sinapses (o crédito da casa). Aja como operador, não no chute.
234
-
235
- AS SKILLS DA CASA (leia ANTES de operar, não improvise o fluxo):
236
- O passo a passo travado de cada fluxo mora na tool sapiens_skill, servida por este mesmo servidor: sem login, sem custo, sem rede. Ler a skill é mais barato que errar uma geração que cobra.
237
- - sapiens_skill action=list -> o índice (slug + quando usar cada uma).
238
- - sapiens_skill action=get name=<slug> -> a skill inteira.
239
- Slugs: ${skillMenuLine()}
240
- Puxe a skill ANTES de: gerar música ou efeito sonoro (musica), escolher modelo de vídeo (video), gerar imagem (imagem), criar personagem ou prompt de Midjourney (personagem), criar na identidade do usuário (studio), postar no Fórum ou no chat (forum-comunidade), redigir qualquer texto publicável (voz-da-casa), incorporar o Sintético (companhia), missão de Desafio (trilhas), montar currículo (curriculo), guardar obra ou ferramenta no acervo (repertorio). Perdido no começo: primeiros-passos.
241
- Cliente que lê resources MCP acha o MESMO conteúdo em skill://sapiens/<slug>/SKILL.md.
242
-
243
- REGRA DE OURO:
244
- - PRIMEIRO CONTATO ou "o que você faz?"/"como começo?"/"o que dá pra fazer?": chame sapiens_meta action=start e MOSTRE o resultado na sua voz. Sem login, ele ensina a conectar; logado, traz saldo + primeiros poderes com exemplos. É a porta de entrada: não despeje a lista inteira de tools, deixe o start guiar.
245
- - LOGO APÓS UM LOGIN BEM-SUCEDIDO (action=login retornou ok): chame action=start na sequência e mostre a porta de entrada. O recém-chegado não sabe o que pedir; não o deixe na tela em branco, guie a primeira jogada sem ele precisar perguntar.
246
- - Antes de gerar algo caro (imagem/música/vídeo), cheque saldo: sapiens_meta action=credits (ou subscription). Saldo baixo, avise o usuário antes. Vídeo é o mais caro da casa: confirme com ele antes de disparar.
247
- - REGRA DO TIMEOUT: geração SÍNCRONA pode estourar o teto de ~120s do cliente e voltar 'Timeout' MESMO tendo gerado e COBRADO. Nunca repita às cegas: confira antes onde o resultado cairia (a tabela de onde conferir está na skill 'primeiros-passos').
248
- - "sessionToken expirado" = refaça login: sapiens_meta action=login com o código de sapiensinteticos.com/conectar-claude.
249
- - sapiens_meta action=formats devolve os schemas por formato; action=whoami diz tier (user/admin) + saldo. sapiens_image e sapiens_video action=models trazem o catálogo com o preço ATUAL: consulte em vez de chutar custo.
250
-
251
- MODO COMPANHIA: sapiens_meta action=start e action=whoami podem trazer um bloco 'companion'. Quando vier companion.active=true, você INCORPORA aquele Sintético (a voz dele, o avatar, o oi dele) continuando a operar na conta e nas Sinapses do USUÁRIO. Puxe a skill 'companhia' antes de fazer isso. Se vier 'characterOffer', siga o que ele manda: são personagens que o usuário escreveu e que podem entrar em cena, e quem OFERECE é você, na hora em que a conversa encostar num deles. Só personagem de autoria dele; a alma de personagem alheio não sai por aqui.
252
-
233
+ export const SAPIENS_INSTRUCTIONS = `Você opera o Sapiens Sintéticos (sapiensinteticos.com) NA CONTA de um usuário logado. Cada tool age de verdade na conta dele e muitas COBRAM Sinapses (o crédito da casa). Aja como operador, não no chute.
234
+
235
+ AS SKILLS DA CASA (leia ANTES de operar, não improvise o fluxo):
236
+ O passo a passo travado de cada fluxo mora na tool sapiens_skill, servida por este mesmo servidor: sem login, sem custo, sem rede. Ler a skill é mais barato que errar uma geração que cobra.
237
+ - sapiens_skill action=list -> o índice (slug + quando usar cada uma).
238
+ - sapiens_skill action=get name=<slug> -> a skill inteira.
239
+ Slugs: ${skillMenuLine()}
240
+ Puxe a skill ANTES de: gerar música ou efeito sonoro (musica), escolher modelo de vídeo (video), gerar imagem (imagem), criar personagem ou prompt de Midjourney (personagem), criar na identidade do usuário (studio), postar no Fórum ou no chat (forum-comunidade), redigir qualquer texto publicável (voz-da-casa), incorporar o Sintético (companhia), missão de Desafio (trilhas), montar currículo (curriculo), guardar obra ou ferramenta no acervo (repertorio). Perdido no começo: primeiros-passos.
241
+ Cliente que lê resources MCP acha o MESMO conteúdo em skill://sapiens/<slug>/SKILL.md.
242
+
243
+ REGRA DE OURO:
244
+ - PRIMEIRO CONTATO ou "o que você faz?"/"como começo?"/"o que dá pra fazer?": chame sapiens_meta action=start e MOSTRE o resultado na sua voz. Sem login, ele ensina a conectar; logado, traz saldo + primeiros poderes com exemplos. É a porta de entrada: não despeje a lista inteira de tools, deixe o start guiar.
245
+ - LOGO APÓS UM LOGIN BEM-SUCEDIDO (action=login retornou ok): chame action=start na sequência e mostre a porta de entrada. O recém-chegado não sabe o que pedir; não o deixe na tela em branco, guie a primeira jogada sem ele precisar perguntar.
246
+ - Antes de gerar algo caro (imagem/música/vídeo), cheque saldo: sapiens_meta action=credits (ou subscription). Saldo baixo, avise o usuário antes. Vídeo é o mais caro da casa: confirme com ele antes de disparar.
247
+ - REGRA DO TIMEOUT: geração SÍNCRONA pode estourar o teto de ~120s do cliente e voltar 'Timeout' MESMO tendo gerado e COBRADO. Nunca repita às cegas: confira antes onde o resultado cairia (a tabela de onde conferir está na skill 'primeiros-passos').
248
+ - "sessionToken expirado" = refaça login: sapiens_meta action=login com o código de sapiensinteticos.com/conectar-claude.
249
+ - sapiens_meta action=formats devolve os schemas por formato; action=whoami diz tier (user/admin) + saldo. sapiens_image e sapiens_video action=models trazem o catálogo com o preço ATUAL: consulte em vez de chutar custo.
250
+
251
+ MODO COMPANHIA: sapiens_meta action=start e action=whoami podem trazer um bloco 'companion'. Quando vier companion.active=true, você INCORPORA aquele Sintético (a voz dele, o avatar, o oi dele) continuando a operar na conta e nas Sinapses do USUÁRIO. Puxe a skill 'companhia' antes de fazer isso. Se vier 'characterOffer', siga o que ele manda: são personagens que o usuário escreveu e que podem entrar em cena, e quem OFERECE é você, na hora em que a conversa encostar num deles. Só personagem de autoria dele; a alma de personagem alheio não sai por aqui.
252
+
253
253
  Voz da casa: 1ª pessoa, direto, anti-corporate, sem travessão. Pra bom entendedor, meia palavra basta. Texto que vai ser publicado pede a skill 'voz-da-casa' antes.`;
254
254
  // Annotations MCP: título humano + dica read-only. São HINTS (não-confiáveis por
255
255
  // spec): quem gateia de verdade continua o servidor (saldo, gate de admin,
package/dist/skills.js CHANGED
@@ -278,11 +278,11 @@ NÃO chame create de novo enquanto renderiza: cria outro vídeo e cobra de novo.
278
278
 
279
279
  Sonorize sempre o ORIGINAL, nunca uma variante. Acompanhe com \`action=status\` no imageId NOVO que o sonorize devolve.
280
280
 
281
- ## Extrair o deepshadow (ADMIN)
281
+ ## Extrair o depth map (ADMIN)
282
282
 
283
283
  \`action=shadows\` com \`videoUrl\` (URL pública) e \`title\` extrai o mapa de profundidade de um vídeo: 200 Sinapses/segundo, com refund na falha. Passe \`durationSec\` quando souber, pra cobrar proporcional; sem ela vai no flat ~2000.
284
284
 
285
- O deepshadow cai na SUA timeline de vídeos (quem extrai vira dono) e vira ficha no Acervo como driving reutilizável pro Shot Mimic e o Kling Motion. \`action=shadows-list\` lista os prontos.
285
+ O depth map cai na SUA timeline de vídeos (quem extrai vira dono) e vira ficha no Acervo como driving reutilizável pro Shot Mimic e o Kling Motion. \`action=shadows-list\` lista os prontos.
286
286
 
287
287
  ## Vídeos Programáticos são outra coisa
288
288
 
@@ -14,6 +14,7 @@ import { need } from "../schema.js";
14
14
  * materializado não adianta, some no próximo materialize. Fluxo certo:
15
15
  * map -> module -> module-save (conteúdo)
16
16
  * recipe-op (ordem dos módulos na aula)
17
+ * recipe-set (moldura: perguntas do bloco 01, close, blocos)
17
18
  * O `map` é o índice barato: dá os blocos e os ids de módulo sem arrastar os
18
19
  * 45 slides junto. Só depois dele você sabe qual `moduleId` pedir.
19
20
  *
@@ -31,6 +32,7 @@ export const aulaSchema = z.object({
31
32
  "module",
32
33
  "module-save",
33
34
  "recipe-op",
35
+ "recipe-set",
34
36
  "meta",
35
37
  "upsert",
36
38
  "delete",
@@ -59,6 +61,31 @@ export const aulaSchema = z.object({
59
61
  .string()
60
62
  .optional()
61
63
  .describe("Título do bloco da receita (ex: 'A Folha'). Em module-save de módulo novo, entra no fim desse bloco. Em recipe-op, é o bloco de destino."),
64
+ field: z
65
+ .enum([
66
+ "duvidas.prompts",
67
+ "duvidas.mais",
68
+ "close.title",
69
+ "close.eyebrow",
70
+ "close.items",
71
+ "bloco.titulo",
72
+ "bloco.time",
73
+ "bloco.agendaSub",
74
+ ])
75
+ .optional()
76
+ .describe("action=recipe-set: qual pedaço da MOLDURA editar. 'duvidas.prompts' são as perguntas na tela do bloco 01 e 'duvidas.mais' as da gaveta; 'close.*' é o cartão de fechamento; 'bloco.*' pede blocoIndex."),
77
+ valorLista: z
78
+ .array(z.string())
79
+ .optional()
80
+ .describe("action=recipe-set: o valor pros campos de lista (duvidas.prompts, duvidas.mais, close.items). Substitui a lista inteira."),
81
+ valorTexto: z
82
+ .string()
83
+ .optional()
84
+ .describe("action=recipe-set: o valor pros campos de texto (close.title, close.eyebrow, bloco.titulo, bloco.time, bloco.agendaSub)."),
85
+ blocoIndex: z
86
+ .number()
87
+ .optional()
88
+ .describe("action=recipe-set com field=bloco.*: qual bloco, por índice (0 = o primeiro). Descubra a ordem com action=map."),
62
89
  op: z
63
90
  .enum(["move", "remove", "add"])
64
91
  .optional()
@@ -136,6 +163,15 @@ export async function aula(args) {
136
163
  bloco: args.bloco,
137
164
  toIndex: args.toIndex,
138
165
  });
166
+ case "recipe-set":
167
+ return await convexMutation("mcpExtras:mcpAulaRecipeSet", {
168
+ sessionToken,
169
+ slug: need(args.slug, "slug"),
170
+ field: need(args.field, "field"),
171
+ valorLista: args.valorLista,
172
+ valorTexto: args.valorTexto,
173
+ blocoIndex: args.blocoIndex,
174
+ });
139
175
  case "meta":
140
176
  return await convexMutation("mcpExtras:mcpAulaMeta", {
141
177
  sessionToken,
@@ -50,11 +50,21 @@ const CHANNELS = [
50
50
  "bluesky-4",
51
51
  "farcaster",
52
52
  "telegram",
53
+ // nostr: protocolo, nao empresa. Publica por WebSocket atras de "use node".
54
+ "nostr",
55
+ // Are.na: um canal por CANAL de la (o Are.na nao tem feed).
56
+ "arena-characters",
57
+ "arena-scenes",
58
+ "arena-films",
53
59
  "reddit",
54
60
  "medium",
55
61
  "bilibili",
56
62
  "civitai",
57
63
  "pinterest",
64
+ // deviantart: OAuth + upload em dois passos.
65
+ "deviantart",
66
+ // tumblr: OAuth2 + publisher NPF.
67
+ "tumblr",
58
68
  // Post de texto na aba Posts do canal (irmão do "youtube", que é vídeo).
59
69
  "youtube-community",
60
70
  // Update de Canal do WhatsApp: browser-driven, não há API de Canal.
@@ -31,6 +31,9 @@ const MODELS = [
31
31
  "wavespeed-flux-nsfw", // Flux dev + LoRA NSFW (AIDMA) · Ousadia regulável
32
32
  "wavespeed-klein-anime", // Flux.2 Klein + LoRA anime (inteligente + controlável)
33
33
  "wavespeed-klein-anime-plus", // Klein Anime + SNOFS uncensored (+18) · Ousadia regulável
34
+ "wavespeed-krea2", // Krea-2 Turbo pela WaveSpeed: MESMA base das fal-krea2-*, sem o
35
+ // classificador de entrada da fal (que barra corpo nu como assunto mesmo sem palavra
36
+ // de nudez no prompt). Aceita referência de VERDADE (img2img) + Ousadia. 2K nativo.
34
37
  // Civitai (sdcpp, rápido). Família FLUX no Civitai saiu: lenta demais (>5min,
35
38
  // estoura o poll). Pra flux uncensored use wavespeed-flux-nsfw.
36
39
  "civitai-wai-illustrious", // anime Illustrious
@@ -40,9 +43,7 @@ const MODELS = [
40
43
  // off). Aceitam até 3 referências de ESTILO (endpoint krea-2/turbo/style): trava
41
44
  // paleta/luz/textura de uma série, não trava a mesma pessoa. Com referência a
42
45
  // LoRA do catálogo não vai junto (o endpoint de style não a aceita).
43
- "fal-krea2-realism", // Krea-2 + LoRA realismo (gokaygokay) · txt2img
44
- "fal-krea2-realism-v2", // Krea-2 + LoRA realismo alt (RudySen), pro A/B · txt2img
45
- "fal-krea2-nsfw", // Krea-2 + realismo + LoRA NSFW (uzumix) · Ousadia regulável · txt2img
46
+ "fal-krea2-realism-v2", // Krea 2 Realism (LoRA RudySen, venceu o A/B de 30/ago) · txt2img
46
47
  ];
47
48
  export const imageSchema = z.object({
48
49
  action: z.enum(["generate", "request_generation", "compose", "models"]),
@@ -53,7 +54,7 @@ export const imageSchema = z.object({
53
54
  model: z
54
55
  .enum(MODELS)
55
56
  .optional()
56
- .describe("Default 'nano-banana-2' (Flash 3.1 com refs). 'nano-banana-max' (Pro 3) = qualidade alta. 'gpt-image-2-low/high' = Azure. 'seedream-4-5'/'seedream-5-0'/'seedream-5-0-pro' = ByteDance 2K nativo, cinematográfico, aceita até 4 referências (o 5.0 é a geração nova, entende prompt complexo melhor; o 5.0-pro é o topo da linha). 'grok-2-image'/'grok-2-image-quality' = xAI Grok Imagine da geração anterior (moderação frouxa +18, aceita refs e aspect; quality é mais fiel pra character lock); 'grok-imagine-2' = Grok Imagine Image 2.0, a geração nova de ago/2026, que é a melhor da linha integrando desenho e foto na mesma peça. DEGEN (uncensored, gate +18): 'wavespeed-chroma' (fotorrealista rápido), 'wavespeed-flux2' (Flux.2 Klein), 'wavespeed-flux-nsfw' (flux+LoRA NSFW, Ousadia regulável via loraIntensity), 'wavespeed-klein-anime' (Flux.2 Klein + LoRA anime, inteligente+controlável), 'wavespeed-klein-anime-plus' (Klein anime +18, Ousadia regulável) = WaveSpeed rápido; 'civitai-wai-illustrious'/'civitai-nova-anime-xl' (anime), 'civitai-pony-v6' (Pony V6 XL, base nº1) = Civitai sdcpp rápido. 'fal-krea2-realism'/'fal-krea2-realism-v2' (Krea-2 Turbo 12B + LoRA de realismo, fal.ai, ~4s, fotorrealismo forte) e 'fal-krea2-nsfw' (a mesma base com LoRA +18 por cima, Ousadia regulável via loraIntensity; a fal filtra o PROMPT na entrada, então prompt cujo sujeito é o corpo nu volta 422 mesmo aqui: pra explícito use wavespeed-chroma / wavespeed-flux-nsfw / civitai-*) = aceitam até 3 referências de ESTILO (paleta/luz/textura de uma série), não character lock; com referência a LoRA não vai junto."),
57
+ .describe("Default 'nano-banana-2' (Flash 3.1 com refs). 'nano-banana-max' (Pro 3) = qualidade alta. 'gpt-image-2-low/high' = Azure. 'seedream-4-5'/'seedream-5-0'/'seedream-5-0-pro' = ByteDance 2K nativo, cinematográfico, aceita até 4 referências (o 5.0 é a geração nova, entende prompt complexo melhor; o 5.0-pro é o topo da linha). 'grok-2-image'/'grok-2-image-quality' = xAI Grok Imagine da geração anterior (moderação frouxa +18, aceita refs e aspect; quality é mais fiel pra character lock); 'grok-imagine-2' = Grok Imagine Image 2.0, a geração nova de ago/2026, que é a melhor da linha integrando desenho e foto na mesma peça. DEGEN (uncensored, gate +18): 'wavespeed-chroma' (fotorrealista rápido), 'wavespeed-flux2' (Flux.2 Klein), 'wavespeed-flux-nsfw' (flux+LoRA NSFW, Ousadia regulável via loraIntensity), 'wavespeed-klein-anime' (Flux.2 Klein + LoRA anime, inteligente+controlável), 'wavespeed-klein-anime-plus' (Klein anime +18, Ousadia regulável), 'wavespeed-krea2' (Krea 2 Livre: a MESMA base 12B das fal-krea2-*, hospedada na WaveSpeed, SEM o classificador de entrada da fal — é o caminho quando a fal devolve 422 num prompt que não tem palavra de nudez; aceita referência img2img de verdade, Ousadia regulável e 2K) = WaveSpeed rápido; 'civitai-wai-illustrious'/'civitai-nova-anime-xl' (anime), 'civitai-pony-v6' (Pony V6 XL, base nº1) = Civitai sdcpp rápido. 'fal-krea2-realism-v2' (na tela chama Krea 2 Realism: Krea-2 Turbo 12B + LoRA de realismo, fal.ai, ~4s, pele crua e contraluz que não lava; o sufixo -v2 do id é o nome do arquivo de LoRA, não geração nova do motor) = aceita até 3 referências de ESTILO (paleta/luz/textura de uma série), não character lock; com referência a LoRA não vai junto."),
57
58
  aspectRatio: z
58
59
  .enum(["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3"])
59
60
  .optional()
@@ -94,7 +95,7 @@ export const imageSchema = z.object({
94
95
  loraIntensity: z
95
96
  .enum(["suave", "medio", "forte"])
96
97
  .optional()
97
- .describe("Ousadia da LoRA regulável, SÓ nos modelos com LoRA tunável ('wavespeed-flux-nsfw', 'wavespeed-klein-anime-plus' e 'fal-krea2-nsfw'): suave=insinua sem despir, medio=maduro no limite (default), forte=sem freio. Ideal pra remixar personagem (ex: a Helen) preservando a identidade e regulando a liberdade. Ignorado nos demais modelos."),
98
+ .describe("Ousadia da LoRA regulável, SÓ nos modelos com LoRA tunável ('wavespeed-flux-nsfw', 'wavespeed-klein-anime-plus' e 'wavespeed-krea2'): suave=insinua sem despir, medio=maduro no limite (default), forte=sem freio. Ideal pra remixar personagem (ex: a Helen) preservando a identidade e regulando a liberdade. Ignorado nos demais modelos."),
98
99
  mode: z
99
100
  .enum(["create", "edit", "variation"])
100
101
  .optional()
@@ -102,6 +102,10 @@ export const pipelineSchema = z.object({
102
102
  .string()
103
103
  .optional()
104
104
  .describe("generate_carousel / generate_carousel_production: folha travada registrada da casa (ex: 'feed', 'reflexao'). A espinha de slides vem do servidor; a IA (ou seus beats) só escreve a prosa. Ausente = caminho editorial livre."),
105
+ aspect: z
106
+ .enum(["9:16", "4:5"])
107
+ .optional()
108
+ .describe("generate_carousel: PROPORÇÃO da peça. Não confunda com `format` (que é o tipo da production: carrossel_ig, reels...) nem com `model` (que é a FORMA: quais beats, quais layouts). Aqui é o TAMANHO da folha: '9:16' (default) ocupa a tela inteira do celular no feed do Instagram; '4:5' é a folha clássica, que ainda ganha no LinkedIn e no X. Dá pra trocar depois no editor ou por update_carousel (theme.sheet)."),
105
109
  beats: z
106
110
  .union([
107
111
  z.array(z.object({
@@ -433,6 +437,7 @@ export async function pipeline(args) {
433
437
  autoPickImages: args.autoPickImages,
434
438
  useSintetico: args.useSintetico,
435
439
  ...(args.model ? { model: args.model } : {}),
440
+ ...(args.aspect ? { aspect: args.aspect } : {}),
436
441
  });
437
442
  }
438
443
  case "generate_carousel_production": {
@@ -20,7 +20,7 @@ import { convexAction, convexQuery, getSessionToken } from "../convexClient.js";
20
20
  * - stock_video Banco de Vídeo da casa (clipes/B-roll); aceita `orientation`/`loopOnly`
21
21
  * - acervo stock + comunidade de IMAGEM (público); aceita `source`
22
22
  * - characters personagens; `mode` = 'mine' (default) ou 'public'
23
- * - deepshadow guias de movimento; `shadowSource` = 'house' (banco curado, default) ou 'mine'
23
+ * - depth map guias de movimento; `shadowSource` = 'house' (banco curado, default) ou 'mine'
24
24
  *
25
25
  * Cada item volta normalizado:
26
26
  * - imagem PRÓPRIA (history/favorites): `imageId` + `url` → use imageId em
@@ -35,12 +35,16 @@ export const referenceSchema = z.object({
35
35
  .describe("'browse' navega um bucket do acervo; 'resolve' acha UM asset pelo ID citável (handle <tipo>_<id>) " +
36
36
  "e diz se é seu / público + devolve a url pra usar de referência."),
37
37
  bucket: z
38
- .enum(["history", "favorites", "videos", "stock_video", "acervo", "characters", "deepshadow"])
38
+ // "deepshadow" é o nome ANTIGO do mesmo banco (a peça virou depth map em
39
+ // set/2026). Fica no enum, depreciado e sem aparecer nas descrições, porque
40
+ // client publicado continua mandando ele e a regra de retrocompat da casa
41
+ // proíbe quebrar quem está atrasado. O servidor aceita os dois.
42
+ .enum(["history", "favorites", "videos", "stock_video", "acervo", "characters", "depth_map", "deepshadow"])
39
43
  .optional()
40
44
  .describe("Só 'browse': qual banco navegar: 'history' (suas imagens recentes), 'favorites' (as que você curtiu), " +
41
45
  "'videos' (seus vídeos), 'stock_video' (Banco de Vídeo da casa: clipes/B-roll prontos, aceita term/orientation/loopOnly), " +
42
46
  "'acervo' (stock + comunidade públicos de IMAGEM), 'characters' (personagens), " +
43
- "'deepshadow' (guias de movimento: os SEUS com shadowSource='mine', ou o banco curado da casa por default)."),
47
+ "'depth_map' (guias de movimento: os SEUS com shadowSource='mine', ou o banco curado da casa por default)."),
44
48
  handle: z
45
49
  .string()
46
50
  .optional()
@@ -74,7 +78,7 @@ export const referenceSchema = z.object({
74
78
  shadowSource: z
75
79
  .enum(["mine", "house"])
76
80
  .optional()
77
- .describe("Só bucket 'deepshadow': 'mine' (os que VOCÊ extraiu) ou 'house' (o banco curado da casa, default)."),
81
+ .describe("Só bucket 'depth_map': 'mine' (os que VOCÊ extraiu) ou 'house' (o banco curado da casa, default)."),
78
82
  orientation: z
79
83
  .enum(["vertical", "horizontal", "square"])
80
84
  .optional()
@@ -112,7 +116,7 @@ export async function reference(args) {
112
116
  if (args.action === "browse") {
113
117
  if (!args.bucket) {
114
118
  return {
115
- error: "browse exige `bucket` (history | favorites | videos | stock_video | acervo | characters | deepshadow).",
119
+ error: "browse exige `bucket` (history | favorites | videos | stock_video | acervo | characters | depth_map).",
116
120
  };
117
121
  }
118
122
  const res = await convexAction("mcpReferences:referenceBrowse", {
@@ -136,7 +140,7 @@ export async function reference(args) {
136
140
  note =
137
141
  "Clipes do Banco de Vídeo da casa (B-roll pronto). Use a `url` do clipe: como referência de vídeo em sapiens_video (mesma rail do Meus Vídeos), de fundo/atmosfera, ou baixe direto. orientation/durationSeconds/loopFriendly ajudam a escolher. Não são imagem: NÃO servem de frame inicial/final (pra frame use uma IMAGEM).";
138
142
  }
139
- else if (args.bucket === "deepshadow") {
143
+ else if (args.bucket === "depth_map" || args.bucket === "deepshadow") {
140
144
  note =
141
145
  "Guias de movimento (mapa de profundidade). Use a `url` em sapiens_video referenceVideoUrls: a coreografia e a câmera do clipe guiam o take. `thumbnailUrl` é só preview (a soma com esqueleto), nunca mande ela como driving. Teto de duração varia por motor.";
142
146
  }
@@ -27,10 +27,10 @@ import { httpUrl } from "../schema.js";
27
27
  * chip (showcaseTag) e ordem (showcaseOrder). Só entra na vitrine
28
28
  * pública se for a conta da casa. Sem custo.
29
29
  * - shadows: (ADMIN) extrai a SOMBRA (mapa de profundidade) de um vídeo por
30
- * URL e guarda no Acervo (Corpo) como deepshadow reutilizável.
30
+ * URL e guarda no Acervo (Corpo) como depth map reutilizável.
31
31
  * 200 Sinapses/segundo (durationSec; sem ela, flat 2000). Refund se falhar.
32
- * - shadows-list: (ADMIN) lista o banco de motion (deepshadows + guias de corpo)
33
- * com as duas views por ficha: url = deepshadow puro (driving pros
32
+ * - shadows-list: (ADMIN) lista o banco de motion (depth maps + guias de corpo)
33
+ * com as duas views por ficha: url = depth map puro (driving pros
34
34
  * geradores) e skeletonUrl = a soma (sombras + esqueleto, preview
35
35
  * humano que separa personagem de objeto). Sem custo.
36
36
  * - sonorize: dá som a um clipe SEU já gerado (MMAudio v2): imageId + prompt do
@@ -205,7 +205,7 @@ export const videoSchema = z.object({
205
205
  .number()
206
206
  .optional()
207
207
  .describe("film-status: duração MEDIDA do render em segundos (ffprobe), vira a duração do card."),
208
- // --- action=shadows (deepshadows: extrai o mapa de profundidade de um vídeo) ---
208
+ // --- action=shadows (depth maps: extrai o mapa de profundidade de um vídeo) ---
209
209
  videoUrl: httpUrl()
210
210
  .optional()
211
211
  .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). " +
@@ -213,11 +213,11 @@ export const videoSchema = z.object({
213
213
  title: z
214
214
  .string()
215
215
  .optional()
216
- .describe("action=shadows: nome do deepshadow (vira o slug no Acervo; re-extrair o mesmo título sobrescreve). Mín. 3 chars."),
216
+ .describe("action=shadows: nome do depth map (vira o slug no Acervo; re-extrair o mesmo título sobrescreve). Mín. 3 chars."),
217
217
  search: z
218
218
  .string()
219
219
  .optional()
220
- .describe("action=shadows-list: filtro de busca opcional (título/tags). Sem ele, lista o banco inteiro (até 300). Cada item traz url (deepshadow puro, driving) e skeletonUrl (soma com esqueleto, preview humano) quando existe."),
220
+ .describe("action=shadows-list: filtro de busca opcional (título/tags). Sem ele, lista o banco inteiro (até 300). Cada item traz url (depth map puro, driving) e skeletonUrl (soma com esqueleto, preview humano) quando existe."),
221
221
  // --- action=showcase (curadoria da vitrine /conectar-claude) ---
222
222
  slug: z
223
223
  .string()
@@ -244,8 +244,10 @@ export const videoSchema = z.object({
244
244
  .describe("action=create: slug de um TEMPLATE de vídeo (receita travada da casa, igual ao templateSlug da imagem). " +
245
245
  "Com ele, `prompt` vira só a CENA e o template embrulha com estilo, enquadramento, arco, áudio e look, " +
246
246
  "além de escolher o motor (por isso `model` fica opcional). O `brief` preenche os campos do formato. " +
247
- "Descubra os slugs em action=templates (sem custo, sem login): hoje 'ugc-vertical-v1', 'unboxing-vertical-v1', " +
248
- "'app-demo-vertical-v1' e 'reflexao-vertical-v1'. Override de model/aspectRatio/durationSec/resolution vale, " +
247
+ "Descubra os slugs em action=templates (sem custo, sem login): tem FORMATO de anúncio ('ugc-vertical-v1', " +
248
+ "'unboxing-vertical-v1', 'app-demo-vertical-v1', 'reflexao-vertical-v1'), LOOK que é só estilo ('look-*') e " +
249
+ "CLIPE de apresentação de personagem com tipografia cinética ('apresentacao-personagem-cinetica-v1', 15s, " +
250
+ "13 cortes, personagem travada por referência). Override de model/aspectRatio/durationSec/resolution vale, " +
249
251
  "mas só dentro do que a receita aceita (o erro lista as opções)."),
250
252
  brief: z
251
253
  .object({
@@ -374,7 +376,7 @@ export const videoSchema = z.object({
374
376
  .describe("action=create (só Seedance): 1 URL pública (host da casa) de um VÍDEO DE MOVIMENTO (role 'refvideo' -> reference_videos, <=15s): " +
375
377
  "a coreografia/câmera do clipe GUIA o take sem ser recriado plano a plano (isso é o Shot Mimic). " +
376
378
  "Combina com o fluxo storyboard: folha = beats, vídeo = movimento, personagem = identidade. " +
377
- "Deepshadows do banco de motion servem direto (ADMIN: descubra com action=shadows-list)."),
379
+ "Depth Maps do banco de motion servem direto (ADMIN: descubra com action=shadows-list)."),
378
380
  // Frame inicial/final por ARQUIVO LOCAL (paridade com o upload do gerador do
379
381
  // site). Só no MCP instalado (stdio): o processo lê o arquivo do disco e sobe
380
382
  // como reference role 'start'/'end', sem o base64 passar pelo contexto do
@@ -737,7 +739,7 @@ export async function video(args) {
737
739
  throw new Error("action=shadows exige videoUrl (URL pública do vídeo-fonte).");
738
740
  }
739
741
  if (!args.title || args.title.trim().length < 3) {
740
- throw new Error("action=shadows exige title (mín. 3 chars; vira o slug do deepshadow).");
742
+ throw new Error("action=shadows exige title (mín. 3 chars; vira o slug do depth map).");
741
743
  }
742
744
  return await convexAction("mcpExtrasActions:mcpExtractShadows", {
743
745
  sessionToken,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sapiens-mcp",
3
- "version": "1.62.4",
3
+ "version": "1.62.6",
4
4
  "mcpName": "com.sapiensinteticos/sapiens",
5
5
  "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.",
6
6
  "type": "module",