sapiens-mcp 1.93.0 → 1.93.1
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 +1 -1
- package/dist/tools/distribution.js +8 -1
- package/package.json +3 -4
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
|
|
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
|
},
|
|
@@ -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
|
|
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,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sapiens-mcp",
|
|
3
|
-
"version": "1.93.
|
|
3
|
+
"version": "1.93.1",
|
|
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/
|
|
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/
|
|
47
|
+
"url": "https://github.com/inhabitants/sapiens-mcp/issues"
|
|
49
48
|
},
|
|
50
49
|
"dependencies": {
|
|
51
50
|
"@modelcontextprotocol/sdk": "^1.0.4",
|