sapiens-mcp 1.43.0 → 1.43.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 CHANGED
@@ -28,6 +28,7 @@ import { support, supportSchema } from "./tools/support.js";
28
28
  import { atlas, atlasSchema } from "./tools/atlas.js";
29
29
  import { reference, referenceSchema } from "./tools/reference.js";
30
30
  import { trilhas, trilhasSchema } from "./tools/trilhas.js";
31
+ import { semana, semanaSchema } from "./tools/semana.js";
31
32
  import { shareDrop, shareDropSchema } from "./tools/shareDrop.js";
32
33
  import { skill, skillSchema } from "./tools/skill.js";
33
34
  import { describeConvexError } from "./convexClient.js";
@@ -141,7 +142,7 @@ export const TOOLS = {
141
142
  handler: brand,
142
143
  },
143
144
  sapiens_character: {
144
- 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). 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.",
145
+ 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 só com pose, expressões, trocas de roupa e os adereços dele, no traço das imagens que ele já 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.",
145
146
  schema: characterSchema,
146
147
  handler: character,
147
148
  },
@@ -190,6 +191,11 @@ export const TOOLS = {
190
191
  schema: trilhasSchema,
191
192
  handler: trilhas,
192
193
  },
194
+ sapiens_semana: {
195
+ description: "O ofício da SUA semana na casa: o que você produziu e quanto XP isso rendeu. Identidade SEMPRE pelo sessionToken. Sub-actions: 'get' (quais labs você utilizou nesta semana, quantas peças em cada, o XP de ofício já pago, quanto a Casa Cheia renderia no fecho, e se sobrou semana anterior por fechar), 'fechar' (fecha as semanas pendentes e credita a Casa Cheia de cada uma). Como a régua funciona: cada peça pronta anda o contador do lab e paga em degraus (1a, 3a, 7a, 15a, 30a peça da semana, com retorno decrescente); no fecho, a LARGURA paga à parte, 2 labs valem 20 XP, 5 valem 200, 8 valem 560, então usar labs diferentes rende mais que repetir o mesmo. Esta tool PAGA XP, não cobra Sinapses. Idempotente: chamar 'fechar' duas vezes não credita duas vezes.",
196
+ schema: semanaSchema,
197
+ handler: semana,
198
+ },
193
199
  sapiens_share: {
194
200
  description: "Share Drop (ADMIN-ONLY): sobe um HTML single-file (doctype + CSS/JS inline) e recebe o link curto sint.fyi/s/<code> pra mandar pra alguém abrir no navegador sem instalar nada. O PONTO: publicar um artefato e depois RE-PUBLICAR no MESMO link quantas vezes quiser (action=update com o code) — edita o HTML aqui no Claude, joga pro ar, atualiza o mesmo arquivo. Sub-actions: 'list' (links ativos: code + url + título + tamanho + isActive/hasPassword/requireLogin), 'upload' (cria link NOVO a partir de html ou htmlPath → devolve {code, url}), 'update' (re-publica no MESMO code: mesma url, conteúdo novo, apaga o blob antigo), 'delete' (tira do ar — o link vira 404), 'settings' (isActive liga/desliga, password senha string vazia remove, requireLogin exige conta logada). O HTML entra por `html` (conteúdo string, funciona no stdio e no remoto) OU `htmlPath` (caminho absoluto de um .html local, SÓ no MCP instalado/stdio). Título sai do <title> do HTML se não passar `title` (ou keepTitle=true no update pra manter o atual). Sem custo em Sinapses. Espelha a mesa /dashboard/admin/share-drop.",
195
201
  schema: shareDropSchema,
@@ -271,6 +277,7 @@ const TOOL_TITLES = {
271
277
  sapiens_atlas: "Atlas Ecossistema IA",
272
278
  sapiens_reference: "Referências",
273
279
  sapiens_trilhas: "Trilhas & Desafios",
280
+ sapiens_semana: "Minha Semana",
274
281
  sapiens_instagram: "Auto-DM Instagram",
275
282
  sapiens_share: "Share Drop",
276
283
  };
package/dist/skills.js CHANGED
@@ -92,6 +92,27 @@ Primeira pessoa. Opinião explícita. Conversa, não palestra. Analogia concreta
92
92
  - "Neste artigo vamos abordar", "vamos explorar", "sem mais delongas".
93
93
  - Tom influencer, promessa de atalho mágico, receita pronta.
94
94
  - Fechar tudo com CTA. O texto termina quando a ideia termina.
95
+ - **Definir por negação** ("não é X, é Y", "nada de Z"). A casa só afirma: diz Y direto.
96
+
97
+ ## Tiques de IA que a casa corta
98
+
99
+ O modelo repete esses porque soam competentes. Todos caem.
100
+
101
+ - **Falsa revelação**: "o que ninguém te conta", "a parte que todo mundo pula". Corta o setup, a afirmação fica de pé sozinha.
102
+ - **Atribuição vaga**: "especialistas concordam", "estudos mostram". Nomeia a fonte ou corta a frase.
103
+ - **Inflar importância**: "divisor de águas", "marca um momento decisivo". Fala o fato e deixa quem lê julgar o tamanho.
104
+ - **Análise em gerúndio**: "reforçando o compromisso do time", "evidenciando", "destacando". Troca pela consequência concreta.
105
+ - **Revelação com dois-pontos**: "O detalhe que faz funcionar: um agente separado corrige." Vira frase normal.
106
+ - **Setup retórico**: "e se eu te dissesse", "pensa comigo", "plot twist", e pergunta que o próprio texto responde na linha seguinte.
107
+ - **Frase vazia**: "vale destacar", "é importante notar", "no final das contas", "quando se trata de", "nos dias de hoje".
108
+ - **Rodízio de sinônimo**: o agente, depois o assistente, depois a ferramenta, tudo pra mesma coisa. Repetir a palavra certa é precisão.
109
+ - **Kicker de falsa profundidade**: a última linha "funda" que vira aforismo. Deleta, não reescreve numa metáfora melhor. Termina na frase concreta que já estava lá.
110
+
111
+ Hedge não entra nessa lista: "ao meu ver", "por enquanto", "talvez" assinam a voz e ficam.
112
+
113
+ ## Revisar sem apagar a pessoa
114
+
115
+ Revisão é a menor edição que resolve. Corrige o tique, o erro e o trecho ilegível, e deixa em paz a frase que já funciona. Não deixa todo parágrafo igualmente arrumado, assimetria é sinal de humano. Não inventa número, exemplo nem opinião que não estava no original.
95
116
 
96
117
  ## O que manter
97
118
 
@@ -231,7 +252,7 @@ Refs valem pros modelos robustos (nano-banana-2, gpt-image-2-*, grok-2-image*).
231
252
 
232
253
  ## Cuidados
233
254
 
234
- - \`generate\` é SÍNCRONA e cobra ao concluir. Modelo pesado (Pro, gpt-image-2-high, Grok quality, 2K/4K) cai na regra do timeout: cheque \`sapiens_gallery action=list\` antes de repetir, senão cobra duas vezes.
255
+ - \`generate\` é SÍNCRONA e cobra ao concluir. Modelo pesado (Pro, gpt-image-2-high, Grok quality, Seedream 5.0 Pro, 2K/4K) cai na regra do timeout: cheque \`sapiens_gallery action=list\` antes de repetir, senão cobra duas vezes. O \`seedream-5-0-pro\` foi medido em ~140s, ACIMA do teto de 120s do cliente, então o Timeout nele é o esperado e a imagem está lá.
235
256
  - \`request_generation\` NÃO gera imagem: só cria a row pendente e debita, pra modelos \`sapiens-video-*\` antes de chamar vídeo ou shorts.
236
257
  - Uma imagem só vira pública (e ganha página indexável) com \`sapiens_gallery action=publish\`.
237
258
 
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { httpUrl } from "../schema.js";
3
- import { convexQuery, convexMutation, getSessionToken } from "../convexClient.js";
3
+ import { convexQuery, convexMutation, convexAction, getSessionToken } from "../convexClient.js";
4
4
  /**
5
5
  * sapiens_character — personagens (character sheets) do Sapiens.
6
6
  *
@@ -42,12 +42,13 @@ export const characterSchema = z.object({
42
42
  "remove_image",
43
43
  "set_main_image",
44
44
  "reorder_images",
45
+ "generate_sheet",
45
46
  "delete",
46
47
  ]),
47
48
  characterId: z
48
49
  .string()
49
50
  .optional()
50
- .describe("ID do personagem (influencers:_id). Obrigatório em get/add_image/set_card/activate/set_visibility. Descubra via list_public ou list_mine."),
51
+ .describe("ID do personagem (influencers:_id). Obrigatório em get/add_image/set_card/activate/set_visibility/generate_sheet. Descubra via list_public ou list_mine."),
51
52
  limit: z
52
53
  .number()
53
54
  .int()
@@ -240,6 +241,18 @@ export async function character(args) {
240
241
  orderedUrls: args.orderedUrls,
241
242
  });
242
243
  }
244
+ // -------- generate_sheet: a ficha (página-pôster) do personagem --------
245
+ // 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.
247
+ if (args.action === "generate_sheet") {
248
+ if (!args.characterId)
249
+ throw new Error("action=generate_sheet exige characterId.");
250
+ const sessionToken = getSessionToken();
251
+ return await convexAction("characterSheetActions:mcpGenerateCharacterSheet", {
252
+ sessionToken,
253
+ influencerId: args.characterId,
254
+ });
255
+ }
243
256
  // -------- delete: apaga o próprio personagem (permanente) --------
244
257
  if (args.action === "delete") {
245
258
  if (!args.characterId)
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ import { convexQuery, convexMutation, getSessionToken, } from "../convexClient.js";
3
+ /**
4
+ * sapiens_semana — o ofício da semana do membro pelo Claude.
5
+ *
6
+ * A casa passou a medir PRODUÇÃO: cada peça pronta anda o contador do lab, e no
7
+ * fecho da semana a LARGURA (quantos labs diferentes você usou) paga um bônus que
8
+ * cresce a cada lab novo. Quem opera a casa pelo connector é justamente quem
9
+ * produz em várias frentes, então a régua precisa existir aqui também.
10
+ *
11
+ * Sub-actions:
12
+ * - get: como está a semana (labs utilizados, quanto a Casa Cheia renderia
13
+ * no fecho, e se sobrou semana anterior pra fechar).
14
+ * - fechar: fecha as semanas pendentes e credita a Casa Cheia de cada uma.
15
+ *
16
+ * Identidade SEMPRE pelo sessionToken. Sem custo em Sinapses: isto PAGA XP, não
17
+ * cobra. Idempotente no servidor, então chamar duas vezes não credita duas vezes.
18
+ */
19
+ export const semanaSchema = z.object({
20
+ action: z.enum(["get", "fechar"]),
21
+ });
22
+ export async function semana(args) {
23
+ const sessionToken = getSessionToken();
24
+ if (args.action === "get") {
25
+ const s = await convexQuery("labs:mcpGetMinhaSemana", { sessionToken });
26
+ if (!s)
27
+ throw new Error("Não consegui ler sua semana. Confira o login.");
28
+ const usados = (s.labs ?? []).filter((l) => l.usado);
29
+ const vazios = (s.labs ?? []).filter((l) => !l.usado);
30
+ return {
31
+ semana: s.weekKey,
32
+ labsUtilizados: usados.map((l) => ({
33
+ lab: l.label,
34
+ pecas: l.pieces,
35
+ pago: l.pago,
36
+ })),
37
+ labsAindaVazios: vazios.map((l) => l.label),
38
+ xpDeOficioNaSemana: s.oficioDaSemana,
39
+ casaCheiaSeFecharAgora: s.casaCheiaPrevista,
40
+ semanasPendentes: s.semanasPendentes ?? [],
41
+ note: (s.semanasPendentes?.length ?? 0) > 0
42
+ ? "Tem semana fechada esperando: action=fechar credita a Casa Cheia dela."
43
+ : "A Casa Cheia da semana corrente é creditada quando ela virar e você fechar.",
44
+ comoFunciona: "Cada lab paga por peça pronta em degraus (1a, 3a, 7a, 15a, 30a da semana). No fecho, a largura paga à parte: 2 labs valem 20 XP, 5 valem 200, 8 valem 560. Usar labs diferentes rende mais que repetir o mesmo.",
45
+ };
46
+ }
47
+ if (args.action === "fechar") {
48
+ const r = await convexMutation("labs:mcpFecharMinhaSemana", {
49
+ sessionToken,
50
+ });
51
+ if (!r?.fechadas) {
52
+ return {
53
+ fechadas: 0,
54
+ xp: 0,
55
+ note: "Não tinha semana pendente. A semana corrente só fecha depois que ela virar.",
56
+ };
57
+ }
58
+ return {
59
+ fechadas: r.fechadas,
60
+ xpCreditado: r.xp,
61
+ note: `Casa cheia creditada: +${r.xp} XP em ${r.fechadas} semana(s). O servidor fecha até 12 por chamada, então repita se ainda sobrar.`,
62
+ };
63
+ }
64
+ throw new Error("action inválida. Use get ou fechar.");
65
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sapiens-mcp",
3
- "version": "1.43.0",
3
+ "version": "1.43.1",
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": {