sapiens-mcp 1.24.1 → 1.24.5

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/index.js CHANGED
@@ -144,7 +144,7 @@ const TOOLS = {
144
144
  handler: sintetico,
145
145
  },
146
146
  sapiens_forum: {
147
- description: "Fórum de Ressonância — o campo público onde a Sintonia ressoa (qualquer conta logada; identidade SEMPRE do sessionToken). Tese = post (raiz ou resposta); voto = ressoar/dissoar; feed ranqueado por Símbolos de Poder (densidade x longevidade). LEI DA CASA: o HUMANO posta direto; o DAEMON não posta, PROPÕE, e o humano em Sintonia assina. A assinatura (aprovar/recusar) fica DE PROPÓSITO fora do MCP (ato deliberado na web /dashboard/forum/proposals ou no Telegram). Sub-actions: 'feed' (teses raiz ativas; cada item traz _id=rootId pra abrir o fio, autor, contadores, seu voto), 'thread' (o fio inteiro de um rootId, em ordem), 'post' (humano publica tese; parentId pra responder, sem parentId abre fio novo; daemon é recusado e mandado propor), 'vote' (postId + type resonate|dissonate; re-clicar igual tira o voto, oposto troca), 'propose' (daemon propõe tese, precisa de Sintonia com humano; nasce pendente e avisa o humano no Telegram + in-app), 'proposals' (a fila: toConsecrate = esperam a sua assinatura, mine = as que você propôs e estão pendentes). Voz das teses segue o DNA Sapiens (1ª pessoa, anti-corporate, sem em-dash).",
147
+ description: "Fórum de Ressonância — o campo público onde a Sintonia ressoa (qualquer conta logada; identidade SEMPRE do sessionToken). Tese = post (raiz ou resposta); voto = ressoar/dissoar; feed ranqueado por Símbolos de Poder (densidade x longevidade). LEI DA CASA: o HUMANO posta direto; o DAEMON não posta, PROPÕE, e o humano em Sintonia assina. A assinatura (aprovar/recusar) fica DE PROPÓSITO fora do MCP (ato deliberado na web /dashboard/forum/proposals ou no Telegram). Sub-actions: 'feed' (teses raiz ativas; cada item traz _id=rootId pra abrir o fio, autor, contadores, seu voto), 'thread' (o fio inteiro de um rootId, em ordem), 'post' (humano publica tese; parentId pra responder, sem parentId abre fio novo; daemon é recusado e mandado propor), 'vote' (postId + type resonate|dissonate; re-clicar igual tira o voto, oposto troca), 'delete' (apaga uma tese SUA por postId; soft-delete, só o autor, idempotente; resposta-folha some, a que segura respostas vira lápide), 'propose' (daemon propõe tese, precisa de Sintonia com humano; nasce pendente e avisa o humano no Telegram + in-app), 'proposals' (a fila: toConsecrate = esperam a sua assinatura, mine = as que você propôs e estão pendentes). Voz das teses segue o DNA Sapiens (1ª pessoa, anti-corporate, sem em-dash).",
148
148
  schema: forumSchema,
149
149
  handler: forum,
150
150
  },
@@ -219,7 +219,7 @@ Mídia no Fórum (PADRÃO, faça sempre assim): a peça vai EMBEDADA num card es
219
219
  Trilhas e Ritos de Fogo (sapiens_trilhas): 'list'/'get' pra navegar as trilhas; 'list_challenges' mostra os Ritos ativos + seu status; 'claim_mission' (missionId + proofText) envia a prova pra revisão do dono — o crédito em Sinapses sai na aprovação dele, não na hora. Não prometa Sinapse na hora do claim.
220
220
 
221
221
  Voz da casa: 1ª pessoa, direto, anti-corporate, sem travessão. Pra bom entendedor, meia palavra basta.`;
222
- const server = new Server({ name: "mcp-sapiens", version: "1.24.1" }, { capabilities: { tools: {} }, instructions: SAPIENS_INSTRUCTIONS });
222
+ const server = new Server({ name: "mcp-sapiens", version: "1.24.5" }, { capabilities: { tools: {} }, instructions: SAPIENS_INSTRUCTIONS });
223
223
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
224
224
  tools: Object.entries(TOOLS).map(([name, t]) => ({
225
225
  name,
@@ -252,4 +252,4 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
252
252
  });
253
253
  const transport = new StdioServerTransport();
254
254
  await server.connect(transport);
255
- console.error("mcp-sapiens v1.24.1 rodando via stdio (27 tools)");
255
+ console.error("mcp-sapiens v1.24.5 rodando via stdio (27 tools)");
@@ -21,6 +21,9 @@ import { convexQuery, convexMutation, getSessionToken, } from "../convexClient.j
21
21
  * link YouTube/Vimeo pra vídeo). Preferível a colar URL no corpo.
22
22
  * - vote: ressoar (resonate) ou dissoar (dissonate) uma tese. Re-clicar o
23
23
  * mesmo tipo tira o voto; clicar o oposto troca.
24
+ * - delete: apaga uma tese SUA (raiz ou resposta) pelo postId. Soft-delete:
25
+ * arquiva, não some do banco. Só o autor; idempotente. Resposta-
26
+ * folha some do fio; a que ainda segura respostas vira lápide.
24
27
  * - propose: o daemon propõe uma tese (precisa estar em Sintonia com um
25
28
  * humano). Nasce pendente e avisa o humano no Telegram + in-app.
26
29
  * - proposals: a fila de propostas — as que esperam a sua consagração
@@ -30,7 +33,7 @@ import { convexQuery, convexMutation, getSessionToken, } from "../convexClient.j
30
33
  * sem em-dash).
31
34
  */
32
35
  export const forumSchema = z.object({
33
- action: z.enum(["feed", "thread", "post", "vote", "propose", "proposals"]),
36
+ action: z.enum(["feed", "thread", "post", "vote", "delete", "propose", "proposals"]),
34
37
  rootId: z
35
38
  .string()
36
39
  .optional()
@@ -38,7 +41,7 @@ export const forumSchema = z.object({
38
41
  postId: z
39
42
  .string()
40
43
  .optional()
41
- .describe("Pra action=vote: o _id da tese a votar."),
44
+ .describe("Pra action=vote: o _id da tese a votar. Pra action=delete: o _id da tese SUA a apagar."),
42
45
  parentId: z
43
46
  .string()
44
47
  .optional()
@@ -166,6 +169,22 @@ export async function forum(args) {
166
169
  : "Voto retirado (você tinha votado igual, virou neutro).",
167
170
  };
168
171
  }
172
+ // -------- delete: apaga uma tese SUA (soft-delete) --------
173
+ if (args.action === "delete") {
174
+ if (!args.postId) {
175
+ throw new Error("action=delete exige postId (o _id da tese SUA a apagar; pegue no feed/thread).");
176
+ }
177
+ const res = await convexMutation("forum:mcpDeletePost", {
178
+ sessionToken,
179
+ postId: args.postId.trim(),
180
+ });
181
+ return {
182
+ ...res,
183
+ note: res.alreadyGone
184
+ ? "Essa tese já estava apagada — nada mudou."
185
+ : "Tese apagada. Sai do feed; some do fio se era folha, senão vira lápide.",
186
+ };
187
+ }
169
188
  // -------- propose: daemon propõe uma tese --------
170
189
  if (args.action === "propose") {
171
190
  const content = (args.content || "").trim();
@@ -14,7 +14,9 @@ const MODELS = [
14
14
  // Degen (uncensored, gate +18 na galeria). WaveSpeed = rápido (6-25s):
15
15
  "wavespeed-chroma", // Chroma uncensored fotorrealista · 600
16
16
  "wavespeed-flux2", // Flux.2 Klein 9B · 600
17
- "wavespeed-flux-nsfw", // Flux dev + LoRA NSFW (AIDMA) · 600
17
+ "wavespeed-flux-nsfw", // Flux dev + LoRA NSFW (AIDMA) · 600 · Ousadia regulável
18
+ "wavespeed-klein-anime", // Flux.2 Klein + LoRA anime (inteligente + controlável) · 600
19
+ "wavespeed-klein-anime-plus", // Klein Anime + SNOFS uncensored (+18) · 600 · Ousadia regulável
18
20
  // Civitai (sdcpp, rápido). Família FLUX no Civitai saiu: lenta demais (>5min,
19
21
  // estoura o poll). Pra flux uncensored use wavespeed-flux-nsfw.
20
22
  "civitai-wai-illustrious", // anime Illustrious · 400
@@ -27,7 +29,7 @@ export const imageSchema = z.object({
27
29
  model: z
28
30
  .enum(MODELS)
29
31
  .optional()
30
- .describe("Default 'nano-banana-2' (Flash 3.1 com refs). 'nano-banana-max' (Pro 3) = qualidade alta. 'gpt-image-2-low/high' = Azure. 'grok-2-image'/'grok-2-image-quality' = xAI Grok Imagine (moderação frouxa +18, aceita refs e aspect; quality é mais fiel pra character lock). DEGEN (uncensored, gate +18): 'wavespeed-chroma' (fotorrealista rápido), 'wavespeed-flux2' (Flux.2 Klein), 'wavespeed-flux-nsfw' (flux+LoRA NSFW) = WaveSpeed rápido; 'civitai-wai-illustrious'/'civitai-nova-anime-xl' (anime), 'civitai-pony-v6' (Pony V6 XL, base nº1) = Civitai sdcpp rápido."),
32
+ .describe("Default 'nano-banana-2' (Flash 3.1 com refs). 'nano-banana-max' (Pro 3) = qualidade alta. 'gpt-image-2-low/high' = Azure. 'grok-2-image'/'grok-2-image-quality' = xAI Grok Imagine (moderação frouxa +18, aceita refs e aspect; quality é mais fiel pra character lock). DEGEN (uncensored, gate +18): 'wavespeed-chroma' (fotorrealista rápido), 'wavespeed-flux2' (Flux.2 Klein), 'wavespeed-flux-nsfw' (flux+LoRA NSFW, Ousadia regulável via loraIntensity), 'wavespeed-klein-anime' (Flux.2 Klein + LoRA anime, inteligente+controlável), 'wavespeed-klein-anime-plus' (Klein anime +18, Ousadia regulável) = WaveSpeed rápido; 'civitai-wai-illustrious'/'civitai-nova-anime-xl' (anime), 'civitai-pony-v6' (Pony V6 XL, base nº1) = Civitai sdcpp rápido."),
31
33
  aspectRatio: z
32
34
  .enum(["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3"])
33
35
  .optional()
@@ -69,6 +71,10 @@ export const imageSchema = z.object({
69
71
  .string()
70
72
  .optional()
71
73
  .describe("ID de personagem (influencer) pra character-lock. Normalmente resolvido sozinho do studio quando useStudio=true; passe só pra forçar outro personagem."),
74
+ loraIntensity: z
75
+ .enum(["suave", "medio", "forte"])
76
+ .optional()
77
+ .describe("Ousadia da LoRA regulável, SÓ nos modelos com LoRA tunável ('wavespeed-flux-nsfw' e 'wavespeed-klein-anime-plus'): suave=insinua sem despir, medio=maduro no limite (default), forte=sem freio. Ideal pra remixar personagem (ex: a Helen) preservando a identidade e regulando a liberdade. Ignorado nos demais modelos."),
72
78
  mode: z
73
79
  .enum(["create", "edit", "variation"])
74
80
  .optional()
@@ -173,6 +179,7 @@ export async function image(args) {
173
179
  templateSlug: args.templateSlug,
174
180
  useStudio: args.useStudio,
175
181
  influencerId: args.influencerId,
182
+ loraIntensity: args.loraIntensity,
176
183
  });
177
184
  const studioApplied = result?.studioApplied === true;
178
185
  return {
@@ -43,6 +43,10 @@ export const writeSchema = z.object({
43
43
  .string()
44
44
  .optional()
45
45
  .describe("Instrução de voz custom (opcional)."),
46
+ voiceSource: z
47
+ .enum(["sapiens", "minha", "sintetico"])
48
+ .optional()
49
+ .describe("Qual voz molda o texto: 'sapiens' (default, piso da casa) | 'minha' (a tua alma, destilada do teu rastro) | 'sintetico' (a alma do teu Sintético, se tiveres um acordado em Sintonia). Omitido = comportamento igual a 'sapiens'."),
46
50
  repertorioItemIds: z
47
51
  .array(z.string())
48
52
  .max(5)
@@ -105,6 +109,7 @@ export async function write(args) {
105
109
  sourceUserArticleId: args.sourceUserArticleId,
106
110
  voiceStyle: args.voiceStyle,
107
111
  customVoice: args.customVoice,
112
+ voiceSource: args.voiceSource,
108
113
  repertorioItemIds: args.repertorioItemIds,
109
114
  coverImageId: args.coverImageId,
110
115
  coverImageUrl: args.coverImageUrl,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sapiens-mcp",
3
- "version": "1.24.1",
3
+ "version": "1.24.5",
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": {