sapiens-mcp 1.47.0 → 1.48.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/registry.js +2 -2
- package/dist/resume/coverLetter.js +146 -0
- package/dist/resume/template.js +2 -0
- package/dist/tools/character.js +29 -0
- package/dist/tools/gallery.js +5 -0
- package/package.json +1 -1
package/dist/registry.js
CHANGED
|
@@ -70,7 +70,7 @@ export const TOOLS = {
|
|
|
70
70
|
handler: repertorio,
|
|
71
71
|
},
|
|
72
72
|
sapiens_gallery: {
|
|
73
|
-
description: "Browse, publicação e upload das imagens do user. Sub-actions: list (últimas N imagens, com prompt/model/url + isPublic), get (1 imagem com metadados, opcionalmente base64), publish (torna a PRÓPRIA imagem pública: entra na galeria pública + feed Pinterest, e ganha página indexável /imagem/<id> se o modelo não for degen — devolve publicPageUrl), unpublish (volta a privada), upload (traz pra galeria uma peça gerada FORA da casa, por sourceUrl https, filePath local ou base64; ADMIN por ora), refs (acopla peças da casa como REFERÊNCIA numa peça que já existe, de upload ou de ingest; ADMIN, e só na própria peça). Use list/get pra reusar imagem como referência (passe o imageId em sapiens_image mode=edit ou mode=variation) ou pra mostrar pro user o que ele já tem; publish quando o user quer divulgar a imagem dele. IMPORTANTE sobre upload: a peça entra PRIVADA e continua privada — o servidor recusa publicar e recusa compartilhar na comunidade, porque ela é do usuário e a responsabilidade é dele. O caminho pra ela virar coisa pública é usar como referência numa geração daqui e publicar o resultado. O refs escreve só proveniência (de que ficha/folha a peça nasceu): não promove nada, e um upload continua sem publicar depois de ganhar referência.",
|
|
73
|
+
description: "Browse, publicação e upload das imagens do user. Sub-actions: list (últimas N imagens, com prompt/model/url + isPublic), get (1 imagem com metadados, opcionalmente base64), publish (torna a PRÓPRIA imagem pública: entra na galeria pública + feed Pinterest, e ganha página indexável /imagem/<id> se o modelo não for degen — devolve publicPageUrl), unpublish (volta a privada), upload (traz pra galeria uma peça gerada FORA da casa, por sourceUrl https, filePath local ou base64; ADMIN por ora), ingest (peça que a CASA dirigiu e um motor externo só renderizou: entra NATIVA na timeline, publica e vai pra comunidade, com custo 0 em Sinapses e o custo real guardado em externalCost; carrega o prompt inteiro, as referências da casa (referenceImageIds) e o personagem (characterId), e é idempotente por sourceUrl, então re-ingerir corrige a ficha em vez de duplicar; ADMIN), refs (acopla peças da casa como REFERÊNCIA numa peça que já existe, de upload ou de ingest; ADMIN, e só na própria peça). Use list/get pra reusar imagem como referência (passe o imageId em sapiens_image mode=edit ou mode=variation) ou pra mostrar pro user o que ele já tem; publish quando o user quer divulgar a imagem dele. IMPORTANTE sobre upload: a peça entra PRIVADA e continua privada — o servidor recusa publicar e recusa compartilhar na comunidade, porque ela é do usuário e a responsabilidade é dele. O caminho pra ela virar coisa pública é usar como referência numa geração daqui e publicar o resultado. O refs escreve só proveniência (de que ficha/folha a peça nasceu): não promove nada, e um upload continua sem publicar depois de ganhar referência.",
|
|
74
74
|
schema: gallerySchema,
|
|
75
75
|
handler: gallery,
|
|
76
76
|
},
|
|
@@ -145,7 +145,7 @@ export const TOOLS = {
|
|
|
145
145
|
handler: brand,
|
|
146
146
|
},
|
|
147
147
|
sapiens_character: {
|
|
148
|
-
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.",
|
|
148
|
+
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. FIGURINHAS (generate_stickers, COBRA 550 Sinapses): desenha 5 figurinhas do personagem DE UMA VEZ. Uma folha só, em 2K, com as cinco figuras separadas sobre um fundo verde chroma, recortada por código em peças 512x512 transparentes abaixo de 100KB (o teto do WhatsApp). É por isso que sai o preço de UMA imagem em 2K e não de cinco: quem paga é a folha. As peças entram no pack do personagem (um por personagem, os lotes acumulam) e já ficam no picker de expressão do dono, no chat e no Fórum. Arg `moods`: até 5 humores do vocabulário comum por slug (kkkkk, amei, isso, hmm, chega, que, aff, bora, socorro, seinao, valeu, ainao, seila, ideia, calma, contatudo, perfeito, euavisei, naovourir, zzz, somaisum, sextou, merecido, quedia, tudobem); faltando, a casa completa com os mais usados. Arg `hint`: direcionamento curto do autor (roupa, adereço, clima), até 140 caracteres. Sem legenda queimada na imagem, de propósito: modelo erra acento em português, então o rótulo fica na row e serve de busca no picker. Exige pelo menos uma imagem no personagem (é dela que sai a cara) e é geração síncrona: se voltar Timeout, cheque sapiens_gallery antes de repetir. Quando a resposta vem com ok=false, a folha foi gerada e paga mas o corte falhou; ela está na galeria e o recorte de novo é de graça, pela web. Publicar o pack na vitrine e o carimbo da casa (que é o que põe no picker de todo mundo) são gestos da web, não desta tool. 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.",
|
|
149
149
|
schema: characterSchema,
|
|
150
150
|
handler: character,
|
|
151
151
|
},
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Carta de apresentação — o template irmão do Currículo PRO.
|
|
3
|
+
*
|
|
4
|
+
* Mesma casa do currículo (fonte única no pacote, código puro data -> HTML,
|
|
5
|
+
* nada persiste em servidor): recebe o TEXTO estruturado que a IA (ou a
|
|
6
|
+
* pessoa) escreveu + os dados de identidade do currículo, e devolve uma folha
|
|
7
|
+
* A4 de uma página na mesma linha visual do tema escolhido. O PDF sai igual ao
|
|
8
|
+
* do currículo: abrir no navegador e salvar como PDF.
|
|
9
|
+
*/
|
|
10
|
+
import { RESUME_THEMES } from "./template.js";
|
|
11
|
+
function escapeHtml(text) {
|
|
12
|
+
if (text === null || text === undefined)
|
|
13
|
+
return "";
|
|
14
|
+
return String(text)
|
|
15
|
+
.replace(/&/g, "&")
|
|
16
|
+
.replace(/</g, "<")
|
|
17
|
+
.replace(/>/g, ">")
|
|
18
|
+
.replace(/"/g, """);
|
|
19
|
+
}
|
|
20
|
+
function contactLine(resume) {
|
|
21
|
+
return [resume.location, resume.phone, resume.email, resume.linkedin?.label]
|
|
22
|
+
.filter(Boolean)
|
|
23
|
+
.map(escapeHtml)
|
|
24
|
+
.join(" · ");
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Gera o documento HTML completo da carta. `resume` é o mesmo objeto do
|
|
28
|
+
* currículo (só identidade/contato são lidos); `theme` casa a carta com a
|
|
29
|
+
* folha escolhida.
|
|
30
|
+
*/
|
|
31
|
+
export function generateCoverLetterHTML(cover, resume, options = {}) {
|
|
32
|
+
const theme = options.theme && RESUME_THEMES[options.theme] ? options.theme : "pro";
|
|
33
|
+
const spec = RESUME_THEMES[theme];
|
|
34
|
+
const lang = cover.language === "en" ? "en" : "pt";
|
|
35
|
+
const title = lang === "en" ? "Cover Letter" : "Carta de Apresentação";
|
|
36
|
+
const paragraphs = (cover.paragraphs || [])
|
|
37
|
+
.map((p) => `<p class="body-p">${escapeHtml(p)}</p>`)
|
|
38
|
+
.join("\n");
|
|
39
|
+
return `<!DOCTYPE html>
|
|
40
|
+
<html lang="${lang === "en" ? "en" : "pt-BR"}">
|
|
41
|
+
<head>
|
|
42
|
+
<meta charset="UTF-8">
|
|
43
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
44
|
+
<title>${escapeHtml(resume.name)} · ${title}</title>
|
|
45
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
46
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
47
|
+
<link href="https://fonts.googleapis.com/css2?${spec.fontsQuery}&display=swap" rel="stylesheet">
|
|
48
|
+
<style>
|
|
49
|
+
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
|
|
50
|
+
html { font-size: 15.5px; -webkit-font-smoothing: antialiased; }
|
|
51
|
+
body {
|
|
52
|
+
font-family: ${spec.bodyFamily};
|
|
53
|
+
color: #1B1E23;
|
|
54
|
+
background: ${spec.pageBg};
|
|
55
|
+
line-height: 1.6;
|
|
56
|
+
padding: 2.2rem 1rem;
|
|
57
|
+
}
|
|
58
|
+
.sheet {
|
|
59
|
+
max-width: 760px;
|
|
60
|
+
margin: 0 auto;
|
|
61
|
+
background: #fff;
|
|
62
|
+
border-radius: 12px;
|
|
63
|
+
overflow: hidden;
|
|
64
|
+
box-shadow: 0 1px 2px rgba(20,22,27,.05), 0 14px 44px rgba(20,22,27,.09);
|
|
65
|
+
padding: 3rem 3.2rem 2.6rem;
|
|
66
|
+
position: relative;
|
|
67
|
+
}
|
|
68
|
+
.sheet::before {
|
|
69
|
+
content: '';
|
|
70
|
+
position: absolute;
|
|
71
|
+
top: 0; left: 0; right: 0;
|
|
72
|
+
height: 3px;
|
|
73
|
+
background: ${spec.accent};
|
|
74
|
+
}
|
|
75
|
+
.head { border-bottom: 1px solid #E5E6E8; padding-bottom: 1.2rem; margin-bottom: 1.6rem; }
|
|
76
|
+
.head-name {
|
|
77
|
+
font-family: ${spec.displayFamily};
|
|
78
|
+
font-size: 1.7rem;
|
|
79
|
+
font-weight: 700;
|
|
80
|
+
letter-spacing: -0.02em;
|
|
81
|
+
margin-bottom: .15rem;
|
|
82
|
+
}
|
|
83
|
+
.head-title {
|
|
84
|
+
font-size: .78rem;
|
|
85
|
+
font-weight: 700;
|
|
86
|
+
text-transform: uppercase;
|
|
87
|
+
letter-spacing: .14em;
|
|
88
|
+
color: ${spec.accent};
|
|
89
|
+
margin-bottom: .55rem;
|
|
90
|
+
}
|
|
91
|
+
.head-contact { font-size: .76rem; color: #82868E; }
|
|
92
|
+
.doc-label {
|
|
93
|
+
font-size: .68rem;
|
|
94
|
+
font-weight: 700;
|
|
95
|
+
text-transform: uppercase;
|
|
96
|
+
letter-spacing: .16em;
|
|
97
|
+
color: #82868E;
|
|
98
|
+
display: flex;
|
|
99
|
+
align-items: center;
|
|
100
|
+
gap: .65rem;
|
|
101
|
+
margin-bottom: 1.2rem;
|
|
102
|
+
}
|
|
103
|
+
.doc-label::before { content: ''; width: 22px; height: 3px; border-radius: 2px; background: ${spec.accent}; }
|
|
104
|
+
.date-line { font-size: .8rem; color: #82868E; margin-bottom: 1.4rem; }
|
|
105
|
+
.subject { font-size: .92rem; font-weight: 700; margin-bottom: 1.2rem; }
|
|
106
|
+
.greeting { font-size: .9rem; margin-bottom: 1rem; }
|
|
107
|
+
.body-p { font-size: .88rem; color: #4A4E57; line-height: 1.8; margin-bottom: 1rem; text-align: justify; }
|
|
108
|
+
.closing { margin-top: 1.6rem; font-size: .9rem; }
|
|
109
|
+
.signature {
|
|
110
|
+
margin-top: .4rem;
|
|
111
|
+
font-family: ${spec.displayFamily};
|
|
112
|
+
font-size: 1.05rem;
|
|
113
|
+
font-weight: 700;
|
|
114
|
+
}
|
|
115
|
+
@media (max-width: 640px) {
|
|
116
|
+
body { padding: .5rem; }
|
|
117
|
+
.sheet { border-radius: 0; padding: 1.8rem 1.4rem; }
|
|
118
|
+
}
|
|
119
|
+
@media print {
|
|
120
|
+
@page { margin: 0.7in; size: A4; }
|
|
121
|
+
html { font-size: 13px; }
|
|
122
|
+
body { padding: 0; background: white; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
|
|
123
|
+
.sheet { max-width: 100%; border-radius: 0; box-shadow: none; padding: 0; }
|
|
124
|
+
.sheet::before { display: none; }
|
|
125
|
+
.body-p { break-inside: avoid; }
|
|
126
|
+
}
|
|
127
|
+
</style>
|
|
128
|
+
</head>
|
|
129
|
+
<body>
|
|
130
|
+
<div class="sheet">
|
|
131
|
+
<header class="head">
|
|
132
|
+
<h1 class="head-name">${escapeHtml(resume.name)}</h1>
|
|
133
|
+
${resume.title ? `<p class="head-title">${escapeHtml(resume.title)}</p>` : ""}
|
|
134
|
+
<p class="head-contact">${contactLine(resume)}</p>
|
|
135
|
+
</header>
|
|
136
|
+
<p class="doc-label">${title}</p>
|
|
137
|
+
${cover.dateLine ? `<p class="date-line">${escapeHtml(cover.dateLine)}</p>` : ""}
|
|
138
|
+
${cover.subject ? `<p class="subject">${escapeHtml(cover.subject)}</p>` : ""}
|
|
139
|
+
<p class="greeting">${escapeHtml(cover.greeting)}</p>
|
|
140
|
+
${paragraphs}
|
|
141
|
+
<p class="closing">${escapeHtml(cover.closing)}</p>
|
|
142
|
+
<p class="signature">${escapeHtml(resume.name)}</p>
|
|
143
|
+
</div>
|
|
144
|
+
</body>
|
|
145
|
+
</html>`;
|
|
146
|
+
}
|
package/dist/resume/template.js
CHANGED
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
* com timeline de experiência), 'moderno' e 'minimal' são a folha clássica de
|
|
16
16
|
* coluna única.
|
|
17
17
|
*/
|
|
18
|
+
// A carta de apresentação mora ao lado e sai pela mesma porta (sapiens-mcp/resume).
|
|
19
|
+
export { generateCoverLetterHTML } from "./coverLetter.js";
|
|
18
20
|
export const RESUME_THEMES = {
|
|
19
21
|
pro: {
|
|
20
22
|
label: "PRO",
|
package/dist/tools/character.js
CHANGED
|
@@ -27,6 +27,9 @@ import { convexQuery, convexMutation, convexAction, getSessionToken } from "../c
|
|
|
27
27
|
* - generate_sheet: desenha a ficha do personagem (COBRA), vertical ou
|
|
28
28
|
* horizontal (`orientation`). A ficha entra na galeria dele e
|
|
29
29
|
* já serve de referência; elas acumulam.
|
|
30
|
+
* - generate_stickers: desenha 5 figurinhas do personagem de uma vez (COBRA).
|
|
31
|
+
* Uma folha no chroma verde, recortada por código em peças
|
|
32
|
+
* 512x512 transparentes, que entram no pack dele.
|
|
30
33
|
* - delete: apaga o próprio personagem (permanente).
|
|
31
34
|
*
|
|
32
35
|
* Fluxo típico de criação: create → add_image (1+) → set_card (opcional) →
|
|
@@ -46,6 +49,7 @@ export const characterSchema = z.object({
|
|
|
46
49
|
"set_main_image",
|
|
47
50
|
"reorder_images",
|
|
48
51
|
"generate_sheet",
|
|
52
|
+
"generate_stickers",
|
|
49
53
|
"delete",
|
|
50
54
|
]),
|
|
51
55
|
characterId: z
|
|
@@ -96,6 +100,15 @@ export const characterSchema = z.object({
|
|
|
96
100
|
.enum(["portrait", "landscape"])
|
|
97
101
|
.optional()
|
|
98
102
|
.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."),
|
|
103
|
+
moods: z
|
|
104
|
+
.array(z.string())
|
|
105
|
+
.optional()
|
|
106
|
+
.describe("Pra generate_stickers: até 5 humores do vocabulário comum, por slug. Faltando ou inválido, a casa completa com os mais usados. Slugs: kkkkk, amei, isso, hmm, chega, que, aff, bora, socorro, seinao, valeu, ainao, seila, ideia, calma, contatudo, perfeito, euavisei, naovourir, zzz, somaisum, sextou, merecido, quedia, tudobem."),
|
|
107
|
+
hint: z
|
|
108
|
+
.string()
|
|
109
|
+
.max(140)
|
|
110
|
+
.optional()
|
|
111
|
+
.describe("Pra generate_stickers: direcionamento curto do autor (roupa, adereço, clima). Tempera a folha, não substitui a receita. Máximo 140 caracteres."),
|
|
99
112
|
});
|
|
100
113
|
export async function character(args) {
|
|
101
114
|
// -------- list_public: catálogo global (sessionToken opcional, marca `mine`) --------
|
|
@@ -263,6 +276,22 @@ export async function character(args) {
|
|
|
263
276
|
orientation: args.orientation,
|
|
264
277
|
});
|
|
265
278
|
}
|
|
279
|
+
// -------- generate_stickers: 5 figurinhas do personagem, de uma folha só --------
|
|
280
|
+
// Geração SÍNCRONA que COBRA: cai na regra do timeout. Se voltar Timeout, NÃO
|
|
281
|
+
// repita às cegas: a folha pode ter saído (confira em sapiens_gallery).
|
|
282
|
+
// Quando o corte falha depois da geração, a resposta volta com ok=false e o
|
|
283
|
+
// sheetImageId da folha paga — o recorte de novo é grátis e mora na web.
|
|
284
|
+
if (args.action === "generate_stickers") {
|
|
285
|
+
if (!args.characterId)
|
|
286
|
+
throw new Error("action=generate_stickers exige characterId.");
|
|
287
|
+
const sessionToken = getSessionToken();
|
|
288
|
+
return await convexAction("stickerActions:mcpGenerateStickerBatch", {
|
|
289
|
+
sessionToken,
|
|
290
|
+
influencerId: args.characterId,
|
|
291
|
+
moods: args.moods,
|
|
292
|
+
hint: args.hint,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
266
295
|
// -------- delete: apaga o próprio personagem (permanente) --------
|
|
267
296
|
if (args.action === "delete") {
|
|
268
297
|
if (!args.characterId)
|
package/dist/tools/gallery.js
CHANGED
|
@@ -105,6 +105,10 @@ export const gallerySchema = z.object({
|
|
|
105
105
|
.union([z.array(z.string()), z.string()])
|
|
106
106
|
.optional()
|
|
107
107
|
.describe("action=ingest/refs: generatedImages:_id das peças DA CASA que serviram de referência (folha de storyboard, ficha de personagem, frame inicial). Ficam acopladas à peça e aparecem na ficha dela: é o que prova que a receita saiu daqui. Só peça sua entra, no máximo 8. Aceita lista ou os ids separados por vírgula."),
|
|
108
|
+
characterId: z
|
|
109
|
+
.string()
|
|
110
|
+
.optional()
|
|
111
|
+
.describe("action=ingest: o personagem de quem é a peça (influencers:_id, ache com sapiens_character action=list_mine). A peça nasce ligada à ficha, igual ao que sai dos motores da casa: conta no personagem e resolve a miniatura dele. Re-ingerir a mesma sourceUrl com characterId AMARRA uma peça que já entrou sem personagem, sem trocar o id. Aceita personagem seu ou público."),
|
|
108
112
|
replace: z
|
|
109
113
|
.boolean()
|
|
110
114
|
.optional()
|
|
@@ -290,6 +294,7 @@ export async function gallery(args) {
|
|
|
290
294
|
aspectRatio: args.aspectRatio,
|
|
291
295
|
size: args.size,
|
|
292
296
|
referenceImageIds: normalizeRefIds(args.referenceImageIds),
|
|
297
|
+
characterId: args.characterId,
|
|
293
298
|
});
|
|
294
299
|
return {
|
|
295
300
|
...result,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sapiens-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.48.0",
|
|
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",
|