sapiens-mcp 1.93.0 → 1.93.2

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
@@ -225,7 +225,7 @@ export const TOOLS = {
225
225
  handler: trilhas,
226
226
  },
227
227
  sapiens_distribution: {
228
- description: "Despachar peças (Distribution Workflow) — a peça pronta entra na FILA com canal, copy e a aba de quem ela é. ADMIN-ONLY: despacho depende de rede conectada e hoje só a casa tem. NADA aqui posta em rede nenhuma; quem despacha é a tela em /experimentos/distribution-workflow, que é onde a conta conectada mora. A ABA (`voice`) responde de quem é a peça: sapiens (a casa), helen-ailith, borderless, ou o slug de um personagem seu — slug livre, então personagem novo ganha aba sozinho na primeira peça dele, sem deploy. Em queue, aba ausente = o servidor deriva do personagem da peça e cai em sapiens quando não há. Sub-actions: queue (põe na fila: title e channel obrigatórios, mais copy/hashtags/assetUrl/notes; replyText é o comentário que sai junto do post, onde vai o link, e só o X (resposta no fio) e a Página do LinkedIn (primeiro comentário) publicam, o resto recusa; num canal do Instagram, format instagram_story faz a peça sair como STORY: uma mídia só, sem legenda nem link, some em 24h). Em queue, DOIS campos que parecem opcionais e não são: `lang` diz em que língua a copy já está, e sem ele canal de rede internacional reescreve a sua copy sozinho, dois segundos depois, na voz da casa; `assetPageAssetId` é o imageId da obra da casa, e sem ele a peça só encontra a obra se a assetUrl bater letra a letra, então versão web de um master nasce órfã de ficha, list (o que está na fila, filtrável por status e por aba, com copy, hashtags e notas de cada peça; fila maior que o limit se lê inteira pelo cursor antesDe=proximoCursor), voices (as abas que existem hoje com a contagem de cada uma), status (move a peça de lane: fila, agendado, postado, descartado; postado aceita postUrl e fecha o rastro, agendado aceita scheduledFor em ms), edit (reescreve a peça da FILA sem tirar ela do lugar: itemId e só o que muda, copy, title, publicTitle, hashtags, notes, lang, replyText, assetUrl/assetKind ou assets; é o gesto pra corrigir legenda, nunca descartar e enfileirar de novo; texto de peça postada o servidor recusa), sign (liga ou desliga a ASSINATURA da peça, imagem e vídeo do CDN da casa, com o carimbo da LINHAGEM de quem assina: sint.fyi/<endereço dela> no canto e o fecho de 2s no vídeo, ou a marca própria dela sem nada da casa; itemId, e signed com true de default; o carimbo da casa é recusado em peça +18 e praça adulta, a marca própria passa; o carimbo leva uns 30s e até lá a peça não sai; em queue, signed:true já enfileira assinada), bio (lê ou troca a BIO de uma conta da casa no Bluesky, channel bluesky ou bluesky-2 a bluesky-5: sem texto só lê; bioLine acrescenta uma linha no fim sem mexer no resto e não repete linha que já está lá; bio reescreve a inteira; teto de 256; ESTA sub-action muda o perfil público na hora, e bio não aceita hiperlink, o endereço aparece escrito), lineages (o CADASTRO das linhagens, o mesmo da aba Teia: de cada personagem, produto e da casa, a mãe no Bluesky onde a peça nasce, as contas próprias, as galerias que a mãe alimenta sozinha, as fichas e o post do dia, mais as regras que a teia desdobra e as vagas de conta ainda sem dona), lineage-new (nasce uma linhagem: nome obrigatório, grupo, artigo, lang; nasce sem mãe, então nada viaja sozinho até o lineage-save dar a mãe), lineage-save (slug e só o que muda: mae, contas rede->canal, galerias, fichaIds, rotina, contaNaCasa, assinatura {estilo casa|propria|nenhuma, marca, padrao}; o servidor recusa conta que já é de outra linhagem e canal de outra rede, e a vaga assumida ganha o nome da linhagem), lineage-archive (slug + arquivada), tree (a ÁRVORE DE CONTAS, o formulário de quem existe onde: linhagem × rede, com o email, o @, o canal e o estado de cada conta, ligada, desligada, fora, falta ou dispensa, mais o passo pra ligar cada rede; slug filtra uma linhagem), tree-mark (slug + celulas [{rede, handle, canal, dispensada}]: registra o email ou o @ que existe lá fora, associa a conta da casa ou dispensa rede opcional, a linhagem inteira de uma vez e tudo ou nada; X, Instagram, Bluesky, email e Telegram são obrigatórias e não se dispensam), garimpo (o ACERVO em famílias pra escolher o que vai pra fila: só as candidatas saem, a versão velha de um corte ou upscale vem marcada como substituída, as irmãs da mesma ideia vêm agrupadas pra escolha no olho, o painel cortado vem em recortes (o original e os quadros em ordem, que só saem juntos em carrossel), e cada família diz por onde já saiu; paraCanal tira o que já foi pro canal pedido, soResumo conta sem listar, página por cursor em antesDe; o passo a passo é a skill distribuir). Sem custo em Sinapses: isto organiza, não gera. A copy segue a voz de QUEM ASSINA a peça, que não é sempre a voz da casa: peça da Helen fala como a Helen. E a peça sai pela CONTA de quem assina ela: conta extra da mesma rede é um canal próprio (bluesky-2 é outra conta no Bluesky, instagram-pro outra no Instagram), então case o canal com a aba antes de despachar.",
228
+ description: "Despachar peças (Distribution Workflow) — a peça pronta entra na FILA com canal, copy e a aba de quem ela é. ADMIN-ONLY: despacho depende de rede conectada e hoje só a casa tem. NADA aqui posta em rede nenhuma; quem despacha é a tela em /experimentos/distribution-workflow, que é onde a conta conectada mora. A ABA (`voice`) responde de quem é a peça: sapiens (a casa), helen-ailith, borderless, ou o slug de um personagem seu — slug livre, então personagem novo ganha aba sozinho na primeira peça dele, sem deploy. Em queue, aba ausente = o servidor deriva do personagem da peça e cai em sapiens quando não há. Sub-actions: queue (põe na fila: title e channel obrigatórios, mais copy/hashtags/assetUrl/notes; replyText é o comentário que sai junto do post, onde vai o link, e só o X (resposta no fio) e a Página do LinkedIn (primeiro comentário) publicam, o resto recusa; num canal do Instagram, format instagram_story faz a peça sair como STORY: uma mídia só, sem legenda nem link, some em 24h; num Reel, videoCoverUrl é a CAPA da casa, que pela API só entra aqui). Em queue, DOIS campos que parecem opcionais e não são: `lang` diz em que língua a copy já está, e sem ele canal de rede internacional reescreve a sua copy sozinho, dois segundos depois, na voz da casa; `assetPageAssetId` é o imageId da obra da casa, e sem ele a peça só encontra a obra se a assetUrl bater letra a letra, então versão web de um master nasce órfã de ficha, list (o que está na fila, filtrável por status e por aba, com copy, hashtags e notas de cada peça; fila maior que o limit se lê inteira pelo cursor antesDe=proximoCursor), voices (as abas que existem hoje com a contagem de cada uma), status (move a peça de lane: fila, agendado, postado, descartado; postado aceita postUrl e fecha o rastro, agendado aceita scheduledFor em ms), edit (reescreve a peça da FILA sem tirar ela do lugar: itemId e só o que muda, copy, title, publicTitle, hashtags, notes, lang, replyText, assetUrl/assetKind, assets ou videoCoverUrl; é o gesto pra corrigir legenda, nunca descartar e enfileirar de novo; texto de peça postada o servidor recusa), sign (liga ou desliga a ASSINATURA da peça, imagem e vídeo do CDN da casa, com o carimbo da LINHAGEM de quem assina: sint.fyi/<endereço dela> no canto e o fecho de 2s no vídeo, ou a marca própria dela sem nada da casa; itemId, e signed com true de default; o carimbo da casa é recusado em peça +18 e praça adulta, a marca própria passa; o carimbo leva uns 30s e até lá a peça não sai; em queue, signed:true já enfileira assinada), bio (lê ou troca a BIO de uma conta da casa no Bluesky, channel bluesky ou bluesky-2 a bluesky-5: sem texto só lê; bioLine acrescenta uma linha no fim sem mexer no resto e não repete linha que já está lá; bio reescreve a inteira; teto de 256; ESTA sub-action muda o perfil público na hora, e bio não aceita hiperlink, o endereço aparece escrito), lineages (o CADASTRO das linhagens, o mesmo da aba Teia: de cada personagem, produto e da casa, a mãe no Bluesky onde a peça nasce, as contas próprias, as galerias que a mãe alimenta sozinha, as fichas e o post do dia, mais as regras que a teia desdobra e as vagas de conta ainda sem dona), lineage-new (nasce uma linhagem: nome obrigatório, grupo, artigo, lang; nasce sem mãe, então nada viaja sozinho até o lineage-save dar a mãe), lineage-save (slug e só o que muda: mae, contas rede->canal, galerias, fichaIds, rotina, contaNaCasa, assinatura {estilo casa|propria|nenhuma, marca, padrao}; o servidor recusa conta que já é de outra linhagem e canal de outra rede, e a vaga assumida ganha o nome da linhagem), lineage-archive (slug + arquivada), tree (a ÁRVORE DE CONTAS, o formulário de quem existe onde: linhagem × rede, com o email, o @, o canal e o estado de cada conta, ligada, desligada, fora, falta ou dispensa, mais o passo pra ligar cada rede; slug filtra uma linhagem), tree-mark (slug + celulas [{rede, handle, canal, dispensada}]: registra o email ou o @ que existe lá fora, associa a conta da casa ou dispensa rede opcional, a linhagem inteira de uma vez e tudo ou nada; X, Instagram, Bluesky, email e Telegram são obrigatórias e não se dispensam), garimpo (o ACERVO em famílias pra escolher o que vai pra fila: só as candidatas saem, a versão velha de um corte ou upscale vem marcada como substituída, as irmãs da mesma ideia vêm agrupadas pra escolha no olho, o painel cortado vem em recortes (o original e os quadros em ordem, que só saem juntos em carrossel), e cada família diz por onde já saiu; paraCanal tira o que já foi pro canal pedido, soResumo conta sem listar, página por cursor em antesDe; o passo a passo é a skill distribuir). Sem custo em Sinapses: isto organiza, não gera. A copy segue a voz de QUEM ASSINA a peça, que não é sempre a voz da casa: peça da Helen fala como a Helen. E a peça sai pela CONTA de quem assina ela: conta extra da mesma rede é um canal próprio (bluesky-2 é outra conta no Bluesky, instagram-pro outra no Instagram), então case o canal com a aba antes de despachar.",
229
229
  schema: distributionSchema,
230
230
  handler: distribution,
231
231
  },
package/dist/skills.js CHANGED
@@ -964,7 +964,32 @@ Baixe e leia ANTES de escrever o código. Num agente com pasta de skills, ele en
964
964
  - Preço: o de cada modelo está em \`GET /models\`; vídeo cota de graça em \`POST /videos/quote\`. O valor de uma chamada pode variar um pouco com a oferta da hora. O valor de cada chamada volta no header \`x-sapiens-charge-usd\`. Pra pôr o preço da API ao lado de outro provedor (fal.ai, WaveSpeed): \`sapiens_meta action=precos\`, parte \`api\`.
965
965
  - 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.
966
966
  - 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.
967
- - Uma chamada de teste antes de qualquer lote. Nunca vídeo em laço.`,
967
+ - Uma chamada de teste antes de qualquer lote. Nunca vídeo em laço.
968
+
969
+ ## Decidir o modelo: sapiens-auto, Laya e Jev Router
970
+
971
+ Três peças da API pra quem não quer escolher modelo na mão, ou quer uma decisão barata antes de chamar um modelo caro. Não são de uso casual: cada uma tem um jeito próprio de cobrar e um limite que o código da pessoa precisa respeitar. O preço de cada uma está em \`sapiens_meta action=precos\` com \`midia=decidir\` (só ela) ou \`midia=texto\` (junto do texto), parte \`api.decidir\`, e em \`GET /models\`.
972
+
973
+ ### sapiens-auto (no POST /chat/completions)
974
+
975
+ - \`model: "sapiens-auto"\` e a casa escolhe o modelo de texto da conversa: código vai pra um modelo forte em código, prova e conta pesada pro topo, conversa e pergunta curta pra um modelo leve, o resto pra um do meio.
976
+ - Cobra o preço do modelo escolhido, sem taxa a mais. O \`model\` da resposta diz qual atendeu, e o \`x-sapiens-charge-usd\` diz quanto custou. A faixa de preço (do candidato mais barato ao mais caro) está na tabela.
977
+ - A escolha vale pra conversa inteira por 2 horas: as falas seguintes ficam no mesmo modelo, mesmo que fiquem triviais. A casa reconhece a conversa pelo começo dela, sem guardar o texto.
978
+ - Cuidado: quem joga no sapiens-auto texto que não escreveu (email, página, mensagem de terceiro) deixa esse texto puxar a conversa pra faixa de topo, que custa dezenas de vezes a leve. Pra agente que lê conteúdo de fora, ponha teto de gasto por dia na API key (Developers) ou fixe o modelo.
979
+ - Quem precisa de um modelo previsível (avaliação, lote com orçamento fechado) manda o id do modelo, não o sapiens-auto.
980
+
981
+ ### Laya (POST /systemone)
982
+
983
+ - Decide sem gerar texto, no contrato System One (o mesmo do Jev): \`state\` (texto ou objeto) e \`questions\`, cada uma \`noul\` (sim ou não), \`choice\` (uma das opções de \`criteria\`) ou \`score\` (um nível de uma escala). Modelo: \`laya-multilingual\`, aberto, 100+ línguas.
984
+ - Cobra só a entrada. Até 4 perguntas por chamada. Uma pergunta curta decide em cerca de meio segundo; o tempo cresce com o tamanho do \`state\`.
985
+ - Uma decisão por vez na máquina: com fila cheia volta 503, sem cobrar. Lote vai em sequência, nunca em paralelo, e o código trata o 503 esperando e tentando de novo.
986
+ - Sem ajuste fino, o Laya erra mais que um modelo de texto em classificação aberta, às vezes com confiança alta. Serve pra triagem barata e em volume. Antes de pôr no fluxo da pessoa, rode uma amostra do caso dela e confira as respostas.
987
+ - Quem já usa o SDK do Jev troca a URL base pela da API e o modelo por \`laya-multilingual\`.
988
+
989
+ ### Jev Router (no POST /chat/completions)
990
+
991
+ - \`model: "jev-router"\`: o router da TypeSafe escolhe o modelo e o esforço de raciocínio de cada pedido. O \`model\` da resposta é o que ele escolheu.
992
+ - Preço variável, o do modelo que ele escolher. Não dá pra cotar antes: leia o \`x-sapiens-charge-usd\` de cada chamada e, em lote, confira o gasto do dia em \`GET /balance\`.`,
968
993
  },
969
994
  ];
970
995
  export const SKILLS = Object.fromEntries(SKILL_LIST.map((s) => [s.name, s]));
@@ -139,6 +139,7 @@ const CHANNELS = [
139
139
  "tiktok-up-2",
140
140
  "youtube-up-2",
141
141
  "instagram-up-2",
142
+ "instagram-up-3",
142
143
  // O X do Obsolete Human, pelo Buffer próprio do selo. O linkedin-page-2 saiu
143
144
  // em 11/10/2026: o selo não tem LinkedIn, e o servidor recusa o canal com o
144
145
  // motivo (convex/shared/canaisAposentados.ts) pra quem roda versão velha.
@@ -209,6 +210,10 @@ export const distributionSchema = z.object({
209
210
  .max(4)
210
211
  .optional()
211
212
  .describe("queue, só YouTube: título e descrição em OUTRA língua, que o YouTube mostra pra quem assiste nela. A língua do vídeo é a da peça (lang en vira en, pt vira pt-BR), e localização na mesma língua do vídeo é ignorada. Ex: [{lang:'pt-BR', title:'...', description:'...'}]."),
213
+ videoCoverUrl: z
214
+ .string()
215
+ .optional()
216
+ .describe("queue/edit: a CAPA do vídeo, a imagem que o perfil do Instagram mostra no lugar de um quadro qualquer do Reel. Pela API ela só entra na hora de postar: Reel publicado só troca de capa à mão no app, então a capa nasce com a peça. É o molde de capa da casa (skill thumbnail, --formato reel, 1080x1920): renderize, suba com sapiens_gallery action=upload filePath=<o .jpg> e passe a url que ela devolve. Imagem (jpg, png, webp) num host da casa, e só em peça que leva vídeo; o servidor recusa o resto. Só o Reels do Instagram publica (instagram, instagram-pro, instagram-3..8 e instagram-up*); story e carrossel ignoram. Nas outras redes o campo viaja sem efeito: ponha a capa na MÃE do Bluesky e a teia leva até a filha do Instagram. Em edit, string vazia tira a capa."),
212
217
  assetUrl: z
213
218
  .string()
214
219
  .optional()
@@ -423,6 +428,7 @@ export async function distribution(args) {
423
428
  publicTitle: args.publicTitle,
424
429
  captionTracks: args.captionTracks,
425
430
  localizations: args.localizations,
431
+ videoCoverUrl: args.videoCoverUrl,
426
432
  assetUrl: args.assetUrl,
427
433
  assetKind: args.assetKind,
428
434
  assets: args.assets,
@@ -504,10 +510,11 @@ export async function distribution(args) {
504
510
  assetUrl: args.assetUrl,
505
511
  assetKind: args.assetKind,
506
512
  assets: args.assets,
513
+ videoCoverUrl: args.videoCoverUrl,
507
514
  };
508
515
  const mudou = Object.entries(campos).filter(([, v]) => v !== undefined);
509
516
  if (mudou.length === 0) {
510
- throw new Error("action=edit: mande ao menos um campo pra trocar (copy, title, publicTitle, hashtags, notes, lang, replyText, assetUrl/assetKind ou assets).");
517
+ throw new Error("action=edit: mande ao menos um campo pra trocar (copy, title, publicTitle, hashtags, notes, lang, replyText, assetUrl/assetKind, assets ou videoCoverUrl).");
511
518
  }
512
519
  await convexMutation("distributionMcp:mcpUpdateItem", {
513
520
  sessionToken,
@@ -65,9 +65,9 @@ export const metaSchema = z.object({
65
65
  .optional()
66
66
  .describe("Código XXXX-XXXX gerado (logado) em sapiensinteticos.com/conectar-claude. Só pra action=login."),
67
67
  midia: z
68
- .enum(["imagem", "video", "musica", "voz", "texto"])
68
+ .enum(["imagem", "video", "musica", "voz", "texto", "decidir"])
69
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)."),
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, junto da parte `decidir`). midia=decidir traz só quem escolhe o modelo na API: o Laya, o sapiens-auto e o Jev Router."),
71
71
  busca: z
72
72
  .string()
73
73
  .optional()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sapiens-mcp",
3
- "version": "1.93.0",
3
+ "version": "1.93.2",
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",
@@ -41,11 +41,10 @@
41
41
  },
42
42
  "repository": {
43
43
  "type": "git",
44
- "url": "git+https://github.com/inhabitants/sapiensinteticos.git",
45
- "directory": "tools/mcp-sapiens"
44
+ "url": "git+https://github.com/inhabitants/sapiens-mcp.git"
46
45
  },
47
46
  "bugs": {
48
- "url": "https://github.com/inhabitants/sapiensinteticos/issues"
47
+ "url": "https://github.com/inhabitants/sapiens-mcp/issues"
49
48
  },
50
49
  "dependencies": {
51
50
  "@modelcontextprotocol/sdk": "^1.0.4",