sapiens-mcp 1.91.2 → 1.91.3

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
@@ -75,7 +75,7 @@ export const TOOLS = {
75
75
  handler: image,
76
76
  },
77
77
  sapiens_meta: {
78
- description: "Utilitários transversais: start (porta de entrada do primeiro contato — sem login ensina a conectar, com login mostra saldo/tier + primeiros poderes com exemplo pronto + 'comece por aqui'), login (conecta a conta com o código de sapiensinteticos.com/conectar-claude, salva a sessão localmente; ela vale 90 dias e renova sozinha a cada uso), logout (desconecta de verdade: revoga a chave no servidor e apaga o token local), whoami (tier user/admin + saldo + email), credits (saldo agregado), subscription (plan + status + saldo por bucket subscription/grants/free + warnings low/critical), formats (schemas por formato), health (inclui a versão do MCP), version (qual versão do sapiens-mcp está REALMENTE rodando + se é a última do npm; não exige login; use pra saber se o client pegou a versão nova ou ficou preso em cache do npx), app_url (URLs canônicas). Use credits/subscription antes de gerar imagem pra avisar se vai estourar.",
78
+ description: "Utilitários transversais: start (porta de entrada do primeiro contato — sem login ensina a conectar, com login mostra saldo/tier + primeiros poderes com exemplo pronto + 'comece por aqui'), login (conecta a conta com o código de sapiensinteticos.com/conectar-claude, salva a sessão localmente; ela vale 90 dias e renova sozinha a cada uso), logout (desconecta de verdade: revoga a chave no servidor e apaga o token local), whoami (tier user/admin + saldo + email), credits (saldo agregado), subscription (plan + status + saldo por bucket subscription/grants/free + warnings low/critical), formats (schemas por formato), health (inclui a versão do MCP), version (qual versão do sapiens-mcp está REALMENTE rodando + se é a última do npm; não exige login; use pra saber se o client pegou a versão nova ou ficou preso em cache do npx), app_url (URLs canônicas), precos (a tabela de preço do membro: cada motor em Sinapses e no equivalente em dólar, médio e faixa conforme o pacote, com o detalhe por resolução e por segundo de vídeo, o link do card em /motores e o preço da API quando o motor também está nela; midia recorta, busca filtra pelo nome, midia=texto lista os modelos de texto da API por milhão de tokens. Use quando pedirem pra comparar o Sapiens com fal.ai, WaveSpeed ou outro provedor: compare o usd com o preço de lá e mostre a faixa). Use credits/subscription antes de gerar imagem pra avisar se vai estourar.",
79
79
  schema: metaSchema,
80
80
  handler: meta,
81
81
  },
@@ -277,7 +277,7 @@ REGRA DE OURO:
277
277
  - DUAS PORTAS, lado a lado: Sinapse (sapiens_image, sapiens_video: nada pra configurar) ou a CHAVE DA PESSOA num provedor (fal, Kie, WaveSpeed, Replicate, OpenRouter, Sogni, a própria placa), que custa zero aqui. No MCP instalado, sapiens_pontes gera com a chave que mora na máquina dela (fal, Kie, WaveSpeed, Replicate, OpenRouter) e traz a peça pro acervo; no remoto, ela gera no harness dela e traz por sapiens_gallery action=ingest. sapiens_meta action=pontes diz o que ela já tem configurado: se tiver chave, ofereça as duas portas antes de gastar Sinapse. A chave NUNCA passa pelo Sapiens (nem em arg, nem no chat). Skill 'pontes'.
278
278
  - 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').
279
279
  - "sessionToken expirado" = refaça login: sapiens_meta action=login com o código de sapiensinteticos.com/conectar-claude.
280
- - 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.
280
+ - 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. Comparar com outro provedor em dólar: sapiens_meta action=precos, nunca câmbio chutado.
281
281
 
282
282
  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.
283
283
 
package/dist/skills.js CHANGED
@@ -72,7 +72,8 @@ Não despeje a lista inteira de tools. O start guia.
72
72
  - \`sapiens_meta action=whoami\`: tier (user/admin) e saldo.
73
73
  - \`sapiens_meta action=formats\`: os schemas por formato.
74
74
  - \`sapiens_meta action=version\`: qual versão está rodando de verdade e se é a última. Não exige login.
75
- - \`sapiens_image action=models\` e \`sapiens_video action=models\`: catálogo vivo com o preço ATUAL. Consulte em vez de chutar custo.`,
75
+ - \`sapiens_image action=models\` e \`sapiens_video action=models\`: catálogo vivo com o preço ATUAL. Consulte em vez de chutar custo.
76
+ - \`sapiens_meta action=precos\`: a tabela de preço em dólar (médio e faixa conforme o pacote, por resolução e por segundo de vídeo, com o preço da API ao lado). É ela que responde "sai mais barato aqui ou na fal.ai / WaveSpeed?": compare o \`usd\` com o preço de lá, nunca um câmbio chutado.`,
76
77
  },
77
78
  {
78
79
  name: "voz-da-casa",
@@ -946,8 +947,9 @@ Baixe e leia ANTES de escrever o código. Num agente com pasta de skills, ele en
946
947
  ## O que vale saber já
947
948
 
948
949
  - Base: \`https://www.sapiensinteticos.com/api/v1\`, com \`Authorization: Bearer <chave>\`. No SDK da OpenAI, só troque o \`baseURL\`.
949
- - Preço: abaixo do oficial de quem fez o modelo. Quando a oferta da hora sai mais cara, a chamada paga um pouco mais, nunca acima do máximo que \`GET /models\` mostra. O valor de cada chamada volta no header \`x-sapiens-charge-usd\`.
950
+ - Preço: abaixo do oficial de quem fez o modelo. Quando a oferta da hora sai mais cara, a chamada paga um pouco mais, nunca acima do máximo que \`GET /models\` mostra. O valor de cada chamada volta no header \`x-sapiens-charge-usd\`. Pra pôr o preço ao lado de outro provedor (fal.ai, WaveSpeed) e do mesmo motor dentro do app, em Sinapses: \`sapiens_meta action=precos\`.
950
951
  - Vídeo cota de graça antes (\`POST /videos/quote\`), aceita \`webhook_url\` pra avisar quando termina e devolve a \`url\` do mp4 guardado. Falha do motor volta pro saldo sozinha.
952
+ - Saldo que acabou volta 402 \`insufficient_balance\` com \`recharge_url\` no erro: o código da pessoa deve mostrar esse link (recarga no cartão ou em stablecoin) em vez de só falhar.
951
953
  - Uma chamada de teste antes de qualquer lote. Nunca vídeo em laço.`,
952
954
  },
953
955
  ];
@@ -134,11 +134,12 @@ const CHANNELS = [
134
134
  "tiktok-up",
135
135
  "youtube-up",
136
136
  "instagram-up",
137
- // X e LinkedIn do Obsolete Human, pelo Buffer próprio do selo.
137
+ // O X do Obsolete Human, pelo Buffer próprio do selo. O linkedin-page-2 saiu
138
+ // em 11/10/2026: o selo não tem LinkedIn, e o servidor recusa o canal com o
139
+ // motivo (convex/shared/canaisAposentados.ts) pra quem roda versão velha.
138
140
  "x-buffer-2",
139
141
  "x-buffer-3",
140
142
  "x-buffer-4",
141
- "linkedin-page-2",
142
143
  // Vagas numeradas de conta extra.
143
144
  "instagram-3",
144
145
  "instagram-4",
@@ -178,7 +179,7 @@ export const distributionSchema = z.object({
178
179
  channel: z
179
180
  .enum(CHANNELS)
180
181
  .optional()
181
- .describe("queue: o canal de destino. Obrigatório. Conta extra da mesma rede é um canal próprio: bluesky-2 a bluesky-5 são OUTRAS contas no Bluesky, telegram-2 é o canal da Aria, telegram-3 o da Arak, telegram-4 o da Helen e telegram-5 o do Borderless no Telegram (o telegram é o da casa), instagram-pro e instagram-3..5 outras no Instagram, x-buffer-2 e linkedin-page-2 o X e o LinkedIn do Obsolete Human (selo de arte, em inglês, voice obsolete-human), e assim por diante. A peça sai pela conta de quem assina ela, então case o canal com a aba (`voice`) antes de despachar: peça de personagem no canal de outro só aparece como erro depois de publicada, no perfil errado. Case também o canal com a MÍDIA (ver assetKind): canal de vídeo não recebe foto, canal de imagem não recebe vídeo, e o servidor recusa na fila."),
182
+ .describe("queue: o canal de destino. Obrigatório. Conta extra da mesma rede é um canal próprio: bluesky-2 a bluesky-5 são OUTRAS contas no Bluesky, telegram-2 é o canal da Aria, telegram-3 o da Arak, telegram-4 o da Helen e telegram-5 o do Borderless no Telegram (o telegram é o da casa), instagram-pro e instagram-3..5 outras no Instagram, x-buffer-2 o X do Obsolete Human (selo de arte, em inglês, voice obsolete-human), e assim por diante. A peça sai pela conta de quem assina ela, então case o canal com a aba (`voice`) antes de despachar: peça de personagem no canal de outro só aparece como erro depois de publicada, no perfil errado. Case também o canal com a MÍDIA (ver assetKind): canal de vídeo não recebe foto, canal de imagem não recebe vídeo, e o servidor recusa na fila."),
182
183
  copy: z
183
184
  .string()
184
185
  .optional()
@@ -186,7 +187,7 @@ export const distributionSchema = z.object({
186
187
  replyText: z
187
188
  .string()
188
189
  .optional()
189
- .describe("queue: o COMENTÁRIO que sai junto do post, pra onde vai o link (a copy fica sem ele e fecha apontando pro comentário). Só dois lugares publicam: o X pelo Buffer (x-buffer, x-buffer-2..4) e o X da API própria (x), como resposta no mesmo fio, teto 280; e a Página do LinkedIn pelo Buffer (linkedin-page, linkedin-page-2), como primeiro comentário, teto 1250. Threads (threads, threads-pro, threads-3..5), LinkedIn Perfil (linkedin) e o resto NÃO publicam comentário: lá o link mora na própria copy. O servidor recusa a peça com replyText num canal que não publica, e recusa o comentário acima do teto com a contagem; nada é cortado calado."),
190
+ .describe("queue: o COMENTÁRIO que sai junto do post, pra onde vai o link (a copy fica sem ele e fecha apontando pro comentário). Só dois lugares publicam: o X pelo Buffer (x-buffer, x-buffer-2..4) e o X da API própria (x), como resposta no mesmo fio, teto 280; e a Página do LinkedIn pelo Buffer (linkedin-page), como primeiro comentário, teto 1250. Threads (threads, threads-pro, threads-3..5), LinkedIn Perfil (linkedin) e o resto NÃO publicam comentário: lá o link mora na própria copy. O servidor recusa a peça com replyText num canal que não publica, e recusa o comentário acima do teto com a contagem; nada é cortado calado."),
190
191
  hashtags: z.array(z.string()).optional().describe("queue/edit: sem o #, o servidor limpa. Em edit, a lista troca a inteira (vazia tira todas)."),
191
192
  publicTitle: z
192
193
  .string()
@@ -58,11 +58,20 @@ export const metaSchema = z.object({
58
58
  "subscription",
59
59
  "version",
60
60
  "pontes",
61
+ "precos",
61
62
  ]),
62
63
  code: z
63
64
  .string()
64
65
  .optional()
65
66
  .describe("Código XXXX-XXXX gerado (logado) em sapiensinteticos.com/conectar-claude. Só pra action=login."),
67
+ midia: z
68
+ .enum(["imagem", "video", "musica", "voz", "texto"])
69
+ .optional()
70
+ .describe("Só pra action=precos: recorta a tabela numa mídia. Sem ela vêm imagem, vídeo, música e voz (o texto da API é longo e só vem com midia=texto)."),
71
+ busca: z
72
+ .string()
73
+ .optional()
74
+ .describe("Só pra action=precos: filtra pelo nome do motor ou do modelo da API (ex: 'seedance', 'nano banana'), sem acento nem caixa."),
66
75
  });
67
76
  const APP_URL = "https://sapiensinteticos.com";
68
77
  const FORMAT_GUIDE = {
@@ -587,6 +596,19 @@ export async function meta(args) {
587
596
  };
588
597
  }
589
598
  const sessionToken = getSessionToken();
599
+ if (args.action === "precos") {
600
+ // A tabela do membro: Sinapses, o dólar da loja (médio e faixa por pacote)
601
+ // e o preço da API quando o motor também está nela. É o que o agente usa
602
+ // pra comparar com fal.ai e WaveSpeed sem chutar câmbio.
603
+ const tabela = await convexQuery("precos:mcpTabela", {
604
+ sessionToken,
605
+ ...(args.midia ? { midia: args.midia } : {}),
606
+ ...(args.busca ? { busca: args.busca } : {}),
607
+ });
608
+ if (!tabela)
609
+ return { ok: false, error: "A tabela de preço é só pra conta ativa." };
610
+ return tabela;
611
+ }
590
612
  if (args.action === "whoami") {
591
613
  // mcpGetMySubscription usa requireMcpSession sem admin (qualquer logado
592
614
  // com token de acesso cheio; chave da voz e OAuth de parceira não passam),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sapiens-mcp",
3
- "version": "1.91.2",
3
+ "version": "1.91.3",
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",