sapiens-mcp 1.45.0 → 1.46.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/prompts.js CHANGED
@@ -89,8 +89,8 @@ export const SAPIENS_PROMPTS = [
89
89
  build: (a) => `Quero uma imagem de: "${a.cena}". Monte o prompt na regra da casa (full-bleed, ` +
90
90
  "sujeito oversized 70%+ do frame, sem moldura/margem, sem 'tarot card'). Confira " +
91
91
  "modelo e preço com sapiens_image action=models e meu saldo com sapiens_meta " +
92
- "action=credits; me diga o custo antes de gerar. Se eu tiver studio montado e " +
93
- "pedir 'do meu jeito', use useStudio=true. Depois de gerar, me mostre a url e " +
92
+ "action=credits; me diga o custo antes de gerar. Se eu pedir 'na minha marca' ou " +
93
+ "'com fulano', use brandSlug ou influencerId. Depois de gerar, me mostre a url e " +
94
94
  "ofereça publicar na galeria (sapiens_gallery action=publish).",
95
95
  },
96
96
  ];
package/dist/registry.js CHANGED
@@ -143,7 +143,7 @@ export const TOOLS = {
143
143
  handler: brand,
144
144
  },
145
145
  sapiens_character: {
146
- description: "Personagens (character sheets) do Sapiens — a tabela `influencers`: personagem reutilizável com imagens (pra character-lock em geração) + alma (systemPrompt), tudo amarrado à conta do dono do token (sem admin). Sub-actions: list_public (catálogo global de personagens públicos do Explorar; cada um traz mainImageUrl/imageUrls usáveis direto como referenceImageUrls em sapiens_image; sem custo, sem login), get (detalhe de 1 por characterId — público+ativo qualquer um vê, draft/privado só o dono; systemPrompt só volta pro dono), list_mine (os personagens do próprio user, inclui drafts/privados), create (cria rascunho na conta: name + gender + opcional title/systemPrompt), add_image (adiciona imagem ao próprio personagem via imageUrl público OU sourceImageId da galeria; 1ª vira principal), set_card (edita alma/título/nome do próprio), activate (publica, sai de draft, exige ≥1 imagem), set_visibility (isPublic true=Explorar+slug / false=privado). GESTÃO de imagem (por url, pegue as urls atuais em action=get campo imageUrls): remove_image (tira uma), set_main_image (define a principal), reorder_images (nova ordem via orderedUrls, posição 0=principal), e delete (apaga o personagem, permanente). FICHA (generate_sheet, COBRA 450 Sinapses): desenha a página-pôster do personagem, uma folha com pose, expressões, trocas de roupa e os adereços dele, no traço das imagens que ele tem (exige pelo menos uma). A personalidade sai da alma (systemPrompt) e é ela que escolhe roupa e objeto, então personagem com alma escrita rende ficha melhor. Cada geração é um estilo NOVO e elas acumulam no personagem (campo sheets em action=get), não se sobrescrevem. É geração síncrona: se voltar Timeout, cheque action=get antes de repetir, senão cobra duas vezes. Fluxo de criação: create → add_image (1+) → set_card (opcional) → activate → set_visibility isPublic=true. Pra usar um personagem público como referência numa geração, pegue mainImageUrl em list_public/get e passe em sapiens_image referenceImageUrls.",
146
+ description: "Personagens (character sheets) do Sapiens — a tabela `influencers`: personagem reutilizável com imagens (pra character-lock em geração) + alma (systemPrompt), tudo amarrado à conta do dono do token (sem admin). Sub-actions: list_public (catálogo global de personagens públicos do Explorar; cada um traz mainImageUrl/imageUrls usáveis direto como referenceImageUrls em sapiens_image; sem custo, sem login), get (detalhe de 1 por characterId — público+ativo qualquer um vê, draft/privado só o dono; systemPrompt só volta pro dono), list_mine (os personagens do próprio user, inclui drafts/privados), create (cria rascunho na conta: name + gender + opcional title/systemPrompt), add_image (adiciona imagem ao próprio personagem via imageUrl público OU sourceImageId da galeria; 1ª vira principal), set_card (edita alma/título/nome do próprio), activate (publica, sai de draft, exige ≥1 imagem), set_visibility (isPublic true=Explorar+slug / false=privado). GESTÃO de imagem (por url, pegue as urls atuais em action=get campo imageUrls): remove_image (tira uma), set_main_image (define a principal), reorder_images (nova ordem via orderedUrls, posição 0=principal), e delete (apaga o personagem, permanente). FICHA (generate_sheet, COBRA 450 Sinapses): desenha a página-pôster do personagem no traço das imagens que ele já tem (exige pelo menos uma), em duas orientações (arg `orientation`): 'portrait' (default) é a página de processo, pose, expressões, trocas de roupa e adereços soltos na folha; 'landscape' é a prancha larga, com a volta completa à esquerda, a figura grande no meio, poses à direita, estudos de silhueta, expressão e detalhe embaixo e um painel CHARACTER ID na ponta. A personalidade sai da alma (systemPrompt) e é ela que escolhe roupa e objeto, então personagem com alma escrita rende ficha melhor. Cada geração é um estilo NOVO e elas acumulam no personagem (campo sheetUrls em action=get), nenhuma apaga a anterior, e a ficha já entra na galeria dele como referência das próximas gerações. É geração síncrona: se voltar Timeout, cheque action=get antes de repetir, senão cobra duas vezes. Fluxo de criação: create → add_image (1+) → set_card (opcional) → activate → set_visibility isPublic=true. Pra usar um personagem público como referência numa geração, pegue mainImageUrl em list_public/get e passe em sapiens_image referenceImageUrls.",
147
147
  schema: characterSchema,
148
148
  handler: character,
149
149
  },
package/dist/skills.js CHANGED
@@ -263,33 +263,24 @@ Aí não é geração base, é o Studio dela. Veja a skill \`studio\`.`,
263
263
  {
264
264
  name: "studio",
265
265
  title: "Meu Studio e a Emancipação",
266
- description: "O studio é o perfil de EMPRESA da pessoa (obra, time, endereço público) e é também a identidade que o useStudio aplica na geração. Puxe quando ela disser 'do meu jeito', 'na minha marca', falar do studio dela, ou pedir casa própria.",
266
+ description: "O studio é a PÁGINA de portfólio da pessoa (obra, time, endereço público). Puxe quando ela falar do studio dela, quiser mostrar a casa, montar time, ou pedir casa própria.",
267
267
  body: `## O que o studio é
268
268
 
269
- O studio é o **perfil de empresa** da pessoa: um endereço público (\`sapiensinteticos.com/studios/<slug>\`) com a obra, o time e o que a casa faz. Não é uma paleta de ferramentas, e não tem níveis: isso morreu.
269
+ O studio é a **página de portfólio** da pessoa: um endereço público (\`sapiensinteticos.com/studios/<slug>\`) com a obra, o time e o que a casa faz. Não é uma paleta de ferramentas, não tem níveis, e **não é identidade de geração**: isso morreu.
270
270
 
271
- Duas coisas moram nele, e vale separar:
271
+ Uma pessoa pode ter até 4 studios e integrar até 4. \`sapiens_studios action=mine\` mostra o primário dela: nome, endereço público, marca e tamanho do time. O servidor resolve pela SESSÃO, você nunca passa id.
272
272
 
273
- - **A página.** Obra, time, sobre, capa, logo, folha. Quem edita é o membro, na própria página, no modo edição. Você não edita isso pelo MCP.
274
- - **A identidade de geração.** Marca e personagem-operador, que o \`useStudio\` aplica.
273
+ Quem edita a página (obra, time, sobre, capa, logo, folha) é o membro, na própria página, no modo edição. Você não edita isso pelo MCP.
275
274
 
276
- Uma pessoa pode ter até 4 studios e integrar até 4. O que o \`useStudio\` aplica é o **primário** dela; o servidor resolve pela SESSÃO, você nunca passa id.
275
+ ## O studio NÃO entra na geração
277
276
 
278
- ## Studio vs base: não misture
277
+ Gerar imagem "no studio dela" não existe. Se ela pedir "na minha marca" ou "do meu jeito", o caminho é explícito e é seu:
279
278
 
280
- **Seguindo o studio:** \`sapiens_image\` com \`useStudio=true\`. O servidor acha o studio primário e aplica marca, personagem e vibe sozinho (o que você passar explícito vence). O retorno traz \`studioApplied=true\`.
279
+ - **marca da casa** \`sapiens_image\` com \`brandSlug\` (veja \`sapiens_brand\`);
280
+ - **personagem dela** → \`influencerId\` (veja \`sapiens_character\`);
281
+ - **o traço da casa** → \`templateSlug\`.
281
282
 
282
- Use quando ela disser "no meu studio", "na minha marca", "do meu jeito", "como sempre".
283
-
284
- **Geração avulsa:** \`sapiens_image\` SEM \`useStudio\` (\`studioApplied=false\`). Pra teste solto ou pedido fora da identidade.
285
-
286
- Ou é studio, ou é base. Não misture na mesma peça.
287
-
288
- ## Antes de criar no studio
289
-
290
- \`sapiens_studios action=mine\` mostra nome, endereço público, marca, operador e o tamanho do time.
291
-
292
- Se você pediu \`useStudio=true\` e voltou \`studioApplied=false\`, a pessoa ainda não fundou uma casa: avise e aponte /dashboard/studio.
283
+ Pergunte qual, não adivinhe.
293
284
 
294
285
  ## O time
295
286
 
@@ -24,6 +24,9 @@ import { convexQuery, convexMutation, convexAction, getSessionToken } from "../c
24
24
  * - remove_image: tira UMA imagem do próprio personagem (por url).
25
25
  * - set_main_image: define a principal (por url, entre as que já existem).
26
26
  * - reorder_images: reordena as imagens (posição 0 = principal).
27
+ * - generate_sheet: desenha a ficha do personagem (COBRA), vertical ou
28
+ * horizontal (`orientation`). A ficha entra na galeria dele e
29
+ * já serve de referência; elas acumulam.
27
30
  * - delete: apaga o próprio personagem (permanente).
28
31
  *
29
32
  * Fluxo típico de criação: create → add_image (1+) → set_card (opcional) →
@@ -72,7 +75,7 @@ export const characterSchema = z.object({
72
75
  .describe("Pra create/set_card: a 'alma' do personagem (personalidade, jeito de falar, contexto). Usado no chat e como guia de geração."),
73
76
  imageUrl: httpUrl()
74
77
  .optional()
75
- .describe("Pra add_image: URL pública da imagem (Bunny CDN / Convex storage). Use a `url` que sapiens_image/sapiens_gallery devolvem. Pra remove_image/set_main_image: a url da imagem JÁ no personagem (pegue via action=get, campo imageUrls)."),
78
+ .describe("Pra add_image: URL pública da imagem (Bunny CDN / Convex storage). Use a `url` que sapiens_image/sapiens_gallery devolvem. Pra remove_image/set_main_image: a url da imagem JÁ no personagem (pegue via action=get, campo imageUrls, ou sheetUrls pra apagar uma ficha)."),
76
79
  orderedUrls: z
77
80
  .array(z.string())
78
81
  .optional()
@@ -89,6 +92,10 @@ export const characterSchema = z.object({
89
92
  .boolean()
90
93
  .optional()
91
94
  .describe("Pra set_visibility: true = público no Explorar (gera slug), false = privado."),
95
+ orientation: z
96
+ .enum(["portrait", "landscape"])
97
+ .optional()
98
+ .describe("Pra generate_sheet: 'portrait' (default) é a página de processo vertical, composição livre, sem texto. 'landscape' é a prancha larga: volta completa à esquerda, figura grande no meio, poses à direita, estudos de silhueta/expressão/detalhe embaixo e painel CHARACTER ID na ponta. As duas acumulam no personagem, uma não substitui a outra."),
92
99
  });
93
100
  export async function character(args) {
94
101
  // -------- list_public: catálogo global (sessionToken opcional, marca `mine`) --------
@@ -243,7 +250,9 @@ export async function character(args) {
243
250
  }
244
251
  // -------- generate_sheet: a ficha (página-pôster) do personagem --------
245
252
  // Geração SÍNCRONA que COBRA: cai na regra do timeout. Se voltar Timeout,
246
- // NÃO repita às cegas: confira em action=get (campo sheets) se a peça caiu.
253
+ // NÃO repita às cegas: confira em action=get (campo imageUrls) se a peça caiu.
254
+ // A ficha entra na galeria do personagem, então já vira referência das
255
+ // próximas gerações sem passo extra.
247
256
  if (args.action === "generate_sheet") {
248
257
  if (!args.characterId)
249
258
  throw new Error("action=generate_sheet exige characterId.");
@@ -251,6 +260,7 @@ export async function character(args) {
251
260
  return await convexAction("characterSheetActions:mcpGenerateCharacterSheet", {
252
261
  sessionToken,
253
262
  influencerId: args.characterId,
263
+ orientation: args.orientation,
254
264
  });
255
265
  }
256
266
  // -------- delete: apaga o próprio personagem (permanente) --------
@@ -80,7 +80,7 @@ export const gallerySchema = z.object({
80
80
  prompt: z
81
81
  .string()
82
82
  .optional()
83
- .describe("action=ingest: o prompt que a CASA escreveu pra essa peça. Vira a descrição na galeria e a busca acha por ele."),
83
+ .describe("action=ingest: o PROMPT DE GERAÇÃO, copiado inteiro do motor externo, exatamente como foi enviado. É o que a ficha mostra e a busca acha, e é o que permite regerar a peça depois. NÃO escreva aqui nota, resumo, título ou comentário sobre a peça: isso deixa a ficha sem sentido pra quem abrir. Re-ingerir a mesma sourceUrl com um prompt novo CORRIGE o que já está gravado, sem duplicar."),
84
84
  aspectRatio: z
85
85
  .string()
86
86
  .optional()
@@ -77,14 +77,10 @@ export const imageSchema = z.object({
77
77
  .string()
78
78
  .optional()
79
79
  .describe("Slug de um template de imagem (super-prompt travado da casa). Quando setado, o `prompt` vira só a CENA (quem + pose + objeto-conceito) e o template embrulha com o estilo + fundo + enquadramento + ref de traço da casa. Ex: 'retrato-sapiens-v1' = retrato editorial cartoon de UM personagem no grid verde Sapiens (mesma 'mão' dos artigos). O template define model/aspect/size default (sobreponíveis) e injeta a ref da Helen como âncora de traço quando você não passa referenceImageUrls própria (passar refs = trocar quem aparece, mantendo o estilo). Mutuamente exclusivo com brandSlug. Vale em action=generate, mode=create."),
80
- useStudio: z
81
- .boolean()
82
- .optional()
83
- .describe("Quando true, gera SEGUINDO o studio do user (o 'Meu Studio', ÚNICO, resolvido pela sessão — você NÃO passa id): marca + personagem-operador + a vibe + os presets do bloco de imagem entram sozinhos (o explícito sempre vence). O retorno traz studioApplied: true se aplicou o studio, false se caiu no Sapiens base (sem studio montado — aí avise o user). É o 'criar no meu studio' do Nível 2, e gerar assim faz o studio evoluir. SEM useStudio = geração base, fora da identidade dele: não misture. Cheque o studio com sapiens_studios action=mine. Vale em action=generate."),
84
80
  influencerId: z
85
81
  .string()
86
82
  .optional()
87
- .describe("ID de personagem (influencer) pra character-lock. Normalmente resolvido sozinho do studio quando useStudio=true; passe pra forçar outro personagem."),
83
+ .describe("ID de personagem (influencer) pra character-lock: a imagem sai com ESSE personagem. Descubra o id com sapiens_character."),
88
84
  loraIntensity: z
89
85
  .enum(["suave", "medio", "forte"])
90
86
  .optional()
@@ -216,25 +212,14 @@ export async function image(args) {
216
212
  brandSlug: args.brandSlug,
217
213
  brandMark: args.brandMark,
218
214
  templateSlug: args.templateSlug,
219
- useStudio: args.useStudio,
220
215
  influencerId: args.influencerId,
221
216
  loraIntensity: args.loraIntensity,
222
217
  });
223
- const studioApplied = result?.studioApplied === true;
224
218
  return {
225
219
  imageId: result?.imageId,
226
220
  url: result?.url,
227
221
  webUrl: result?.imageId ? `https://sapiensinteticos.com/imagem/${result.imageId}` : undefined,
228
222
  mimeType: result?.mimeType,
229
- // studioApplied=true só quando useStudio achou e aplicou o studio do user.
230
- // false = geração base. É o sinal pra não confundir studio com base.
231
- studioApplied,
232
- // Pediu o studio mas não há um montado: caiu no base, avise o user.
233
- ...(args.useStudio && !studioApplied
234
- ? {
235
- note: "Você pediu o seu studio, mas não há um montado: gerei no Sapiens base. Monte o seu studio em sapiensinteticos.com/dashboard/studio (ferramentas + marca + a vibe).",
236
- }
237
- : {}),
238
223
  // Não incluir base64 no retorno (polui contexto). Quem quiser bytes
239
224
  // chama sapiens_gallery action=get com includeBase64=true.
240
225
  };
@@ -15,7 +15,7 @@ import { convexAction, convexQuery, getSessionToken } from "../convexClient.js";
15
15
  export const studiosSchema = z.object({
16
16
  action: z
17
17
  .enum(["list", "get", "publishable_url", "mine", "emancipar", "module"])
18
- .describe("mine = o SEU studio (o perfil de empresa da sua casa): nome, endereço público, marca, operador e tamanho do time, pra você gerar com useStudio. list/get = catálogo de estúdios da casa. publishable_url = URL de artigo. " +
18
+ .describe("mine = o SEU studio (a página de portfólio da sua casa): nome, endereço público, marca, operador e tamanho do time. list/get = catálogo de estúdios da casa. publishable_url = URL de artigo. " +
19
19
  "emancipar = INICIA a Emancipação (Nível 3 do Studio): puxa o blueprint-mestre pra VOCÊ (Claude) construir a casa PRÓPRIA do membro, na infra DELE (Vercel + Convex + domínio dele), FORA do Sapiens. Devolve a identidade do studio dele já hidratada + o índice de módulos + o guia da Fundação. " +
20
20
  "module = puxa o guia de UM módulo de infra pra continuar a construção (ex: fundacao, sapiens-connect, midia, telegram, email, auth)."),
21
21
  studio: z
@@ -149,11 +149,11 @@ const STUDIOS = {
149
149
  },
150
150
  };
151
151
  export async function studios(args) {
152
- // action=mine: o studio PRIMÁRIO do user logado (o perfil de empresa da casa
153
- // dele), resumo non-PII pro Claude saber o que está montado antes de gerar
154
- // com useStudio. Os campos `level`/`levelLabel`/`tools` vêm vazios: os níveis
155
- // e as ferramentas à la carte morreram quando o studio virou company page, e
156
- // eles só continuam no retorno porque pacotes já publicados os imprimem.
152
+ // action=mine: o studio PRIMÁRIO do user logado (a página de portfólio da casa
153
+ // dele), resumo non-PII. Os campos `level`/`levelLabel`/`tools`/`imageVibe`/
154
+ // `studioMcpRuns` vêm vazios: os níveis e as ferramentas à la carte morreram
155
+ // quando o studio virou página, e a geração ancorada (`useStudio`) morreu com
156
+ // ela; só continuam no retorno porque pacotes já publicados os imprimem.
157
157
  if (args.action === "mine") {
158
158
  const sessionToken = getSessionToken();
159
159
  const studio = await convexAction("desktopMcp:studioMine", { sessionToken });
@@ -57,6 +57,12 @@ import { httpUrl } from "../schema.js";
57
57
  * Motor puro: SEM áudio, SEM referência, SEM frame final.
58
58
  * - sapiens-video-hailuo-pro Hailuo 2.3 Pro — o mesmo em 1080p, 5s fixo (duração não é param).
59
59
  * É o 1080p mais barato da casa depois do Seedance 1.0 Fast.
60
+ * - sapiens-video-h3 MiniMax H3 — 2K (2560x1440) com ÁUDIO nativo, 5/6/8/10s (t2v/i2v),
61
+ * frame final (role 'end'). O menor custo por pixel da prateleira.
62
+ * Áudio vem sempre e já está no preço (não tem toggle). NÃO aceita
63
+ * imagem de referência: no H3 isso é outro endpoint, ainda fora.
64
+ * O provider faz até 15s; a casa para em 10 (o render de 5s leva
65
+ * ~3min e o poll do backend morre em 8).
60
66
  * - sapiens-video-wan WAN 2.5 — imagem que fala/canta (áudio+lip-sync nativo), 5/10s (i2v)
61
67
  * - sapiens-video-kling-motion Kling Motion — transfere o movimento de um vídeo pra uma imagem
62
68
  * (PRECISA de pessoa com tronco visível na imagem E no vídeo;
@@ -93,6 +99,7 @@ const VIDEO_MODELS = [
93
99
  "sapiens-video-kling",
94
100
  "sapiens-video-hailuo",
95
101
  "sapiens-video-hailuo-pro",
102
+ "sapiens-video-h3",
96
103
  "sapiens-video-wan",
97
104
  "sapiens-video-kling-motion",
98
105
  "sapiens-video-shot-mimic",
@@ -199,6 +206,7 @@ export const videoSchema = z.object({
199
206
  .describe("action=create: modelo de vídeo. 'sapiens-video-seedance' (cinematográfico+áudio, t2v/i2v), " +
200
207
  "'sapiens-video-kling' (anima imagem, i2v/t2v), 'sapiens-video-wan' (imagem que fala, i2v), " +
201
208
  "'sapiens-video-hailuo' (MiniMax, física e movimento, 768p 6/10s) e 'sapiens-video-hailuo-pro' (o mesmo em 1080p, 5s fixo) — os dois sem áudio, sem referência e sem frame final, " +
209
+ "'sapiens-video-h3' (MiniMax H3: 2K com áudio nativo, 5 a 10s, t2v/i2v e frame final; áudio incluso sem toggle, não aceita imagem de referência), " +
202
210
  "'sapiens-video-kling-motion' (motion transfer, precisa pessoa na imagem E no vídeo de movimento; vídeo de referência MÁX 10s, cobra pela duração do clipe), " +
203
211
  "'sapiens-video-shot-mimic' (recria o plano do vídeo de referência com seu personagem: mesma câmera, mesmos cortes; 'driving' = previs/clipe do plano MÁX 15s, 'start' = personagem), " +
204
212
  "'sapiens-video-lite/fast/quality' (Veo 3.1), " +
@@ -206,7 +214,7 @@ export const videoSchema = z.object({
206
214
  durationSec: z
207
215
  .number()
208
216
  .optional()
209
- .describe("action=create (modelos WaveSpeed): duração em segundos. Seedance/Shot Mimic 4-15, Kling 3-15, WAN 5/10. " +
217
+ .describe("action=create (modelos WaveSpeed): duração em segundos. Seedance/Shot Mimic 4-15, Kling 3-15, WAN 5/10, H3 5/6/8/10. " +
210
218
  "Sem isso usa a config mais barata. O preço escala com a duração. " +
211
219
  "action=shadows: duração do vídeo-fonte, se souber (cobra 200/s; sem ela, flat ~2000)."),
212
220
  resolution: z
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sapiens-mcp",
3
- "version": "1.45.0",
3
+ "version": "1.46.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": {