sapiens-mcp 1.80.0 → 1.81.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/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Borderless (Sapiens Sintéticos)
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Borderless (Sapiens Sintéticos)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,96 +1,98 @@
1
- # sapiens-mcp
2
-
3
- ![Helen Ailith numa mesa escura, antebracos vestidos por um exoesqueleto de luz verde, movendo placas de luz com as maos abertas](https://sapiensinteticos.b-cdn.net/borderlessprotocol/2026/07/1785430717302_e8p3i4.webp)
4
-
5
- <p align="center">
6
- <a href="https://sapiensinteticos.b-cdn.net/videos/films/abre-alas/sapiens-mcp-intro-pt-3e96346c.mp4"><img src="https://sapiensinteticos.b-cdn.net/videos/films/abre-alas/sapiens-mcp-intro-pt-497bacfa.jpg" width="720" alt="O sapiens-mcp em 15 segundos: você fala, sua IA executa"></a><br>
7
- <a href="https://sapiensinteticos.b-cdn.net/videos/films/abre-alas/sapiens-mcp-intro-pt-3e96346c.mp4"><b>Assiste em 15 segundos, com som</b></a> · <a href="https://sapiensinteticos.b-cdn.net/videos/films/abre-alas/sapiens-mcp-intro-9x16-pt-b5b02542.mp4">corte vertical</a> · <a href="https://sapiensinteticos.b-cdn.net/videos/films/abre-alas/sapiens-mcp-intro-en-e17d0673.mp4">in English</a>
8
- </p>
9
-
10
- Servidor MCP pra operar o [Sapiens Sintéticos](https://sapiensinteticos.com) direto do Claude Code, **na sua própria conta**. Você pede no Claude ("gera uma imagem disso", "escreve um artigo sobre aquilo") e ele faz, gastando as **suas Sinapses**, salvando no **seu perfil**.
11
-
12
- ## Pré-requisito
13
-
14
- Uma conta no Sapiens Sintéticos. Conta e login acontecem só no site (Google ou email), nunca por aqui. Não tem conta? Crie em [sapiensinteticos.com](https://sapiensinteticos.com).
15
-
16
- ## Instalar (Claude Code)
17
-
18
- ```bash
19
- claude mcp add sapiens -- npx -y sapiens-mcp
20
- ```
21
-
22
- Precisa de Node 18+. A URL do backend já vem embutida; não precisa configurar nada.
23
-
24
- ## Conectar sua conta
25
-
26
- ![Helen segurando uma chave de luz verde entre duas portas: um retangulo de luz sem moldura e um terminal fisico](https://sapiensinteticos.b-cdn.net/borderlessprotocol/2026/07/1785430826064_avwjib.webp)
27
-
28
- 1. Abra **[sapiensinteticos.com/conectar-claude](https://sapiensinteticos.com/conectar-claude)** logado e gere o código (`XXXX-XXXX`, vale 5 min).
29
- 2. No Claude Code, peça pra logar (ele chama a ferramenta de login), ou rode direto:
30
-
31
- `sapiens_meta` com `action: "login"` e `code: "XXXX-XXXX"`
32
-
33
- O token vale 90 dias e renova sozinha a cada uso; fica salvo em `~/.sapiens-mcp/session.json`. Pra sair: `sapiens_meta action=logout`, que revoga a chave no servidor e apaga o arquivo local.
34
-
35
- ## O que dá pra pedir (e o custo em Sinapses)
36
-
37
- ![Helen com um braco estendido, orbitada por uma lente, rolos de filme, um vinil, um caderno aberto e um microfone de estudio](https://sapiensinteticos.b-cdn.net/borderlessprotocol/2026/07/1785430870745_waml5a.webp)
38
-
39
- | O que | Custo |
40
- |---|---|
41
- | Gerar imagem (vai pra sua galeria) | ~400-500 |
42
- | Escrever artigo na voz Sapiens (no seu perfil) | 400 |
43
- | Voz / narração (Helen TTS) | 500 |
44
- | Letra de música / render (Musicator) | 300 / 3000 |
45
- | Arte de persona (MBTI) | 450 |
46
- | Repertório, listar/editar seus artigos, ver saldo | grátis |
47
-
48
- O Claude avisa o custo antes de gastar, e geração que falha é estornada. Publicar no blog editorial, Coluna Sapiens e o pipeline são exclusivos do dono da plataforma.
49
-
50
- ## Gerar com a sua chave (0 Sinapse)
51
-
52
- Tem crédito na fal ou na Kie? Ponha a chave no `env` do servidor, no config do seu cliente, e a `sapiens_pontes` gera no provedor com ela e traz a peça pro seu acervo. Você paga o preço do provedor; a casa cobra zero em cima.
53
-
54
- ```json
55
- {
56
- "mcpServers": {
57
- "sapiens": {
58
- "command": "npx",
59
- "args": ["-y", "sapiens-mcp"],
60
- "env": {
61
- "FAL_KEY": "cole-aqui-a-chave-da-fal",
62
- "KIE_API_KEY": "cole-aqui-a-chave-da-kie"
63
- }
64
- }
65
- }
66
- }
67
- ```
68
-
69
- No Claude Code: `claude mcp add sapiens --env FAL_KEY=sua-chave -- npx -y sapiens-mcp`. Depois é só pedir: "gera um retrato da Vera na fal com a minha chave".
70
-
71
- No Claude Desktop tem um caminho sem config: a extensão [sapiens.mcpb](https://sapiensinteticos.b-cdn.net/mcpb/sapiens.mcpb). Abra o arquivo e o Claude pede a chave da fal e da Kie em campos próprios, que ficam guardados no cofre do sistema. Versão nova é baixar o arquivo de novo e abrir.
72
-
73
- A chave fica na sua máquina e sai dela só pro provedor: não vai em argumento, não volta em resultado, não passa pelo servidor do Sapiens. Por isso a `sapiens_pontes` existe só aqui, no servidor instalado; o conector remoto (claude.ai, ChatGPT) não recebe chave. Os jobs ficam em `~/.sapiens-mcp/pontes-jobs.json`, e o mesmo pedido repetido em 30 minutos devolve o job que já existe em vez de cobrar de novo.
74
-
75
- ## Troubleshooting
76
-
77
- - **"sessionToken expirado" / "Conta Sapiens não conectada".** A chave venceu (90 dias sem uso) ou nunca foi salva. Abra [sapiensinteticos.com/conectar-claude](https://www.sapiensinteticos.com/conectar-claude) logado, gere um código novo e rode `sapiens_meta action=login code=XXXX-XXXX`.
78
- - **Ferramenta some ou some capacidade nova depois de atualizar.** O client roda via `npx -y sapiens-mcp` (sem versão fixa) e pode ter ficado preso num cache antigo. Confira o que está rodando com `sapiens_meta action=version` (mostra a versão do binário + a última do npm + `upToDate`). Se `upToDate:false`, limpe o cache do npx e reinicie o client.
79
- - **"Argumentos inválidos".** A mensagem já diz qual campo faltou ou saiu errado; refaça a chamada com o que ela pede. Não repita a mesma chamada que falhou (3 falhas seguidas fazem o client marcar o servidor como indisponível por ~1 min, um disjuntor anti-loop).
80
- - **Saldo baixo antes de gerar.** `sapiens_meta action=credits` (ou `action=subscription` pro detalhe por bucket) mostra quanto sobra antes de gastar em imagem/música/vídeo.
81
-
82
- ## Privacidade
83
-
84
- O servidor conversa com o backend público do Sapiens (Convex) e, só quando você gera com a sua chave, com o provedor dela (fal ou Kie), direto da sua máquina. Sua identidade vem sempre do token de login, nunca de parâmetros soltos. Cada conta só mexe no que é dela.
85
-
86
- ## Sobre o Sapiens Sintéticos
87
-
88
- O Sapiens Sintéticos é um Studio de IA que constrói Studios: modelo de pensamento na Era Sintética, método e ferramenta na mão, pra cada pessoa montar o próprio sistema de criação, com voz e régua próprias. O método da casa é o **Método Sapiens**: um caminho pra tirar ideia do papel que começa pelo que te move, e não pela brecha de mercado.
89
-
90
- Em inglês o projeto assina **Synthetic Sapiens**: an AI studio that builds studios. The missing skill is not using AI, it is inventing the system the AI feeds. That system is a studio of your own, the personal computer of the Synthetic Era.
91
-
92
- Site oficial: [sapiensinteticos.com](https://www.sapiensinteticos.com) · Manifesto: [/manifesto](https://www.sapiensinteticos.com/manifesto) · Contexto pra máquina: [/llms.txt](https://www.sapiensinteticos.com/llms.txt)
93
-
94
- ---
95
-
96
- Feito por [BorderLess](https://sapiensinteticos.com). Licença MIT.
1
+ # sapiens-mcp
2
+
3
+ ![Helen Ailith numa mesa escura, antebracos vestidos por um exoesqueleto de luz verde, movendo placas de luz com as maos abertas](https://sapiensinteticos.b-cdn.net/borderlessprotocol/2026/07/1785430717302_e8p3i4.webp)
4
+
5
+ <p align="center">
6
+ <a href="https://sapiensinteticos.b-cdn.net/videos/films/abre-alas/sapiens-mcp-intro-pt-3e96346c.mp4"><img src="https://sapiensinteticos.b-cdn.net/videos/films/abre-alas/sapiens-mcp-intro-pt-497bacfa.jpg" width="720" alt="O sapiens-mcp em 15 segundos: você fala, sua IA executa"></a><br>
7
+ <a href="https://sapiensinteticos.b-cdn.net/videos/films/abre-alas/sapiens-mcp-intro-pt-3e96346c.mp4"><b>Assiste em 15 segundos, com som</b></a> · <a href="https://sapiensinteticos.b-cdn.net/videos/films/abre-alas/sapiens-mcp-intro-9x16-pt-b5b02542.mp4">corte vertical</a> · <a href="https://sapiensinteticos.b-cdn.net/videos/films/abre-alas/sapiens-mcp-intro-en-e17d0673.mp4">in English</a>
8
+ </p>
9
+
10
+ Servidor MCP pra operar o [Sapiens Sintéticos](https://sapiensinteticos.com) direto do Claude Code, **na sua própria conta**. Você pede no Claude ("gera uma imagem disso", "escreve um artigo sobre aquilo") e ele faz, gastando as **suas Sinapses**, salvando no **seu perfil**.
11
+
12
+ ## Pré-requisito
13
+
14
+ Uma conta no Sapiens Sintéticos. Conta e login acontecem só no site (Google ou email), nunca por aqui. Não tem conta? Crie em [sapiensinteticos.com](https://sapiensinteticos.com).
15
+
16
+ ## Instalar (Claude Code)
17
+
18
+ ```bash
19
+ claude mcp add sapiens -- npx -y sapiens-mcp
20
+ ```
21
+
22
+ Precisa de Node 18+. A URL do backend já vem embutida; não precisa configurar nada.
23
+
24
+ ## Conectar sua conta
25
+
26
+ ![Helen segurando uma chave de luz verde entre duas portas: um retangulo de luz sem moldura e um terminal fisico](https://sapiensinteticos.b-cdn.net/borderlessprotocol/2026/07/1785430826064_avwjib.webp)
27
+
28
+ 1. Abra **[sapiensinteticos.com/conectar-claude](https://sapiensinteticos.com/conectar-claude)** logado e gere o código (`XXXX-XXXX`, vale 5 min).
29
+ 2. No Claude Code, peça pra logar (ele chama a ferramenta de login), ou rode direto:
30
+
31
+ `sapiens_meta` com `action: "login"` e `code: "XXXX-XXXX"`
32
+
33
+ O token vale 90 dias e renova sozinha a cada uso; fica salvo em `~/.sapiens-mcp/session.json`. Pra sair: `sapiens_meta action=logout`, que revoga a chave no servidor e apaga o arquivo local.
34
+
35
+ ## O que dá pra pedir (e o custo em Sinapses)
36
+
37
+ ![Helen com um braco estendido, orbitada por uma lente, rolos de filme, um vinil, um caderno aberto e um microfone de estudio](https://sapiensinteticos.b-cdn.net/borderlessprotocol/2026/07/1785430870745_waml5a.webp)
38
+
39
+ | O que | Custo |
40
+ |---|---|
41
+ | Gerar imagem (vai pra sua galeria) | ~400-500 |
42
+ | Escrever artigo na voz Sapiens (no seu perfil) | 400 |
43
+ | Voz / narração (Helen TTS) | 500 |
44
+ | Letra de música / render (Musicator) | 300 / 3000 |
45
+ | Arte de persona (MBTI) | 450 |
46
+ | Repertório, listar/editar seus artigos, ver saldo | grátis |
47
+
48
+ O Claude avisa o custo antes de gastar, e geração que falha é estornada. Publicar no blog editorial, Coluna Sapiens e o pipeline são exclusivos do dono da plataforma.
49
+
50
+ ## Gerar com a sua chave (0 Sinapse)
51
+
52
+ Tem crédito na fal, na Kie, na WaveSpeed ou no Replicate? Ponha a chave no `env` do servidor, no config do seu cliente (só as que você tem), e a `sapiens_pontes` gera no provedor com ela e traz a peça pro seu acervo. Você paga o preço do provedor; a casa cobra zero em cima.
53
+
54
+ ```json
55
+ {
56
+ "mcpServers": {
57
+ "sapiens": {
58
+ "command": "npx",
59
+ "args": ["-y", "sapiens-mcp"],
60
+ "env": {
61
+ "FAL_KEY": "cole-aqui-a-chave-da-fal",
62
+ "KIE_API_KEY": "cole-aqui-a-chave-da-kie",
63
+ "WAVESPEED_API_KEY": "cole-aqui-a-chave-da-wavespeed",
64
+ "REPLICATE_API_TOKEN": "cole-aqui-o-token-do-replicate"
65
+ }
66
+ }
67
+ }
68
+ }
69
+ ```
70
+
71
+ No Claude Code: `claude mcp add sapiens --env FAL_KEY=sua-chave -- npx -y sapiens-mcp` (um `--env` por chave). Depois é só pedir: "gera um retrato da Vera na fal com a minha chave".
72
+
73
+ No Claude Desktop tem um caminho sem config: a extensão [sapiens.mcpb](https://sapiensinteticos.b-cdn.net/mcpb/sapiens.mcpb). Abra o arquivo e o Claude pede cada chave num campo próprio, que fica guardado no cofre do sistema. Versão nova é baixar o arquivo de novo e abrir.
74
+
75
+ A chave fica na sua máquina e sai dela só pro provedor: não vai em argumento, não volta em resultado, não passa pelo servidor do Sapiens. Por isso a `sapiens_pontes` existe só aqui, no servidor instalado; o conector remoto (claude.ai, ChatGPT) não recebe chave. Os jobs ficam em `~/.sapiens-mcp/pontes-jobs.json`, e o mesmo pedido repetido em 30 minutos devolve o job que já existe em vez de cobrar de novo.
76
+
77
+ ## Troubleshooting
78
+
79
+ - **"sessionToken expirado" / "Conta Sapiens não conectada".** A chave venceu (90 dias sem uso) ou nunca foi salva. Abra [sapiensinteticos.com/conectar-claude](https://www.sapiensinteticos.com/conectar-claude) logado, gere um código novo e rode `sapiens_meta action=login code=XXXX-XXXX`.
80
+ - **Ferramenta some ou some capacidade nova depois de atualizar.** O client roda via `npx -y sapiens-mcp` (sem versão fixa) e pode ter ficado preso num cache antigo. Confira o que está rodando com `sapiens_meta action=version` (mostra a versão do binário + a última do npm + `upToDate`). Se `upToDate:false`, limpe o cache do npx e reinicie o client.
81
+ - **"Argumentos inválidos".** A mensagem já diz qual campo faltou ou saiu errado; refaça a chamada com o que ela pede. Não repita a mesma chamada que falhou (3 falhas seguidas fazem o client marcar o servidor como indisponível por ~1 min, um disjuntor anti-loop).
82
+ - **Saldo baixo antes de gerar.** `sapiens_meta action=credits` (ou `action=subscription` pro detalhe por bucket) mostra quanto sobra antes de gastar em imagem/música/vídeo.
83
+
84
+ ## Privacidade
85
+
86
+ O servidor conversa com o backend público do Sapiens (Convex) e, só quando você gera com a sua chave, com o provedor dela (fal, Kie, WaveSpeed ou Replicate), direto da sua máquina. Sua identidade vem sempre do token de login, nunca de parâmetros soltos. Cada conta só mexe no que é dela.
87
+
88
+ ## Sobre o Sapiens Sintéticos
89
+
90
+ O Sapiens Sintéticos é um Studio de IA que constrói Studios: modelo de pensamento na Era Sintética, método e ferramenta na mão, pra cada pessoa montar o próprio sistema de criação, com voz e régua próprias. O método da casa é o **Método Sapiens**: um caminho pra tirar ideia do papel que começa pelo que te move, e não pela brecha de mercado.
91
+
92
+ Em inglês o projeto assina **Synthetic Sapiens**: an AI studio that builds studios. The missing skill is not using AI, it is inventing the system the AI feeds. That system is a studio of your own, the personal computer of the Synthetic Era.
93
+
94
+ Site oficial: [sapiensinteticos.com](https://www.sapiensinteticos.com) · Manifesto: [/manifesto](https://www.sapiensinteticos.com/manifesto) · Contexto pra máquina: [/llms.txt](https://www.sapiensinteticos.com/llms.txt)
95
+
96
+ ---
97
+
98
+ Feito por [BorderLess](https://sapiensinteticos.com). Licença MIT.
package/dist/canal.js CHANGED
@@ -1,16 +1,34 @@
1
- /**
2
- * Por onde este processo chegou na máquina da pessoa. Muda como se atualiza:
3
- *
4
- * - "npm" (padrão): `npx -y sapiens-mcp` no config do cliente. Versão nova =
5
- * limpar o cache do npx ou pinar a versão.
6
- * - "mcpb": a extensão do Claude Desktop (tools/mcp-sapiens/scripts/mcpb.mjs).
7
- * O manifesto dela põe SAPIENS_MCP_CANAL=mcpb no ambiente. Versão nova =
8
- * baixar o arquivo de novo e abrir: o Claude Desktop troca a extensão.
9
- */
10
- export const CANAL = process.env.SAPIENS_MCP_CANAL === "mcpb" ? "mcpb" : "npm";
1
+ const CANAIS = ["npm", "mcpb", "plugin"];
2
+ const pedido = process.env.SAPIENS_MCP_CANAL;
3
+ export const CANAL = pedido && CANAIS.includes(pedido) ? pedido : "npm";
11
4
  /**
12
5
  * Endereço estável da extensão no CDN da casa. O scripts/mcpb.mjs sobe aqui a
13
6
  * cada release e purga o cache da borda; a página /conectar-claude aponta pro
14
7
  * mesmo arquivo.
15
8
  */
16
9
  export const MCPB_URL = "https://sapiensinteticos.b-cdn.net/mcpb/sapiens.mcpb";
10
+ /** plugin@marketplace, do jeito que os comandos do Claude Code pedem. */
11
+ export const PLUGIN_ID = "sapiens-sinteticos@sapiens-sinteticos";
12
+ export const ENDERECO_SUAS_CHAVES = "https://www.sapiensinteticos.com/conectar-claude#suas-chaves";
13
+ /** Onde a pessoa põe ou troca a chave de cada balcão, no canal deste processo. */
14
+ export function ondeFicaAChave() {
15
+ switch (CANAL) {
16
+ case "mcpb":
17
+ return "No Claude Desktop: Configurações, Extensões, Sapiens Sintéticos. Os campos de chave (fal, Kie, WaveSpeed, Replicate) ficam ali, só os que você tem, e o que você colar fica guardado no seu computador.";
18
+ case "plugin":
19
+ return 'No Claude Code: /plugin, aba Installed, Sapiens Sintéticos, "Configure options". Os campos de chave (fal, Kie, WaveSpeed, Replicate) ficam ali, só os que você tem, e vão pro cofre do sistema; depois, /reload-plugins.';
20
+ default:
21
+ return `No config do cliente MCP, no bloco do sapiens, só as que você tem: "env": { "FAL_KEY": "...", "KIE_API_KEY": "...", "WAVESPEED_API_KEY": "...", "REPLICATE_API_TOKEN": "..." }, e reinicie o cliente. No Claude Code o plugin põe a chave num campo, e no Claude Desktop a extensão (.mcpb), sem editar config. Passo a passo: ${ENDERECO_SUAS_CHAVES}`;
22
+ }
23
+ }
24
+ /** Como sair de uma versão atrasada, no canal deste processo. */
25
+ export function comoAtualizar(latest) {
26
+ switch (CANAL) {
27
+ case "mcpb":
28
+ return `Baixar a extensão nova (${MCPB_URL}) e abrir o arquivo: o Claude Desktop troca a versão da extensão e as chaves já guardadas ficam.`;
29
+ case "plugin":
30
+ return `No Claude Code: /plugin, aba Installed, Sapiens Sintéticos, "Update now" (ou \`claude plugin update ${PLUGIN_ID}\` no terminal) e depois /reload-plugins; as chaves já guardadas ficam. Pra não ficar pra trás de novo: /plugin, aba Marketplaces, sapiens-sinteticos, "Enable auto-update".`;
31
+ default:
32
+ return `Pinar sapiens-mcp@${latest ?? "latest"} na config do MCP, ou limpar o cache do npx e reiniciar o cliente (restart sozinho não basta, o cache sobrevive).`;
33
+ }
34
+ }
package/dist/registry.js CHANGED
@@ -88,7 +88,7 @@ export const TOOLS = {
88
88
  handler: gallery,
89
89
  },
90
90
  sapiens_pontes: {
91
- description: "GERAR COM A CHAVE DA PESSOA (só no MCP instalado): a outra porta ao lado da Sinapse. Chama o provedor com a chave que mora no ambiente DESTA máquina (o env do config do cliente MCP: FAL_KEY, KIE_API_KEY) e traz a peça pro acervo como nativa, custo 0 em Sinapses: a pessoa paga o preço do provedor, sem margem da casa. A chave NUNCA vai em arg, prompt ou chat, nunca volta no resultado e nunca passa pelo Sapiens: a tool lê do ambiente e o pedido sai daqui direto pro provedor. No conector remoto (claude.ai, ChatGPT) esta tool não existe; lá é Sinapse (sapiens_image, sapiens_video) ou o harness da pessoa + sapiens_gallery action=ingest. Sub-actions: 'balcoes' (quais chaves estão configuradas, pelo NOME, e como configurar; grátis, sem rede), 'gerar' (provedor 'fal' ou 'kie' + modelo = o slug NO PROVEDOR, igual à página do modelo (fal: o id do endpoint, ex 'fal-ai/flux/dev'; Kie: o 'model' do Market) + input = o corpo que a doc do provedor descreve pra esse modelo, com o prompt DENTRO. COBRA NA CONTA DA PESSOA no provedor: confirme modelo e custo com ela antes. O job fica gravado nesta máquina ANTES de esperar o render, e o pedido idêntico em 30 minutos devolve o job que já existe em vez de cobrar de novo (forcar=true repete de propósito). Espera até aguardarSegundos (padrão 45) e, pronto, ingere sozinho com characterId, referenceImageIds, prompt verbatim e o custo quando o provedor diz), 'status' (jobId: consulta o provedor e, se terminou, traz pro acervo; é o que se chama depois de um gerar que voltou 'rodando', NUNCA gerar de novo), 'jobs' (os jobs desta máquina, sem rede). A FICHA DO PERSONAGEM entra no input: pegue passportPrompt e mainImageUrl/imageUrls em sapiens_character action=get, ponha o descritor no começo do prompt e as imagens no campo de referência que o modelo aceita (image_url, image_urls, conforme a doc dele); o bloco NEGATIVE do passaporte vai no campo negative_prompt quando o modelo tem um. O prompt passa pelo piso de idade da casa antes de sair (18 é o piso). Peça de fal entra com o carimbo +18 por classe (peso aberto), igual ao ingest manual; Kie entra sem. Passo a passo na skill 'pontes'.",
91
+ description: "GERAR COM A CHAVE DA PESSOA (só no MCP instalado): a outra porta ao lado da Sinapse. Chama o provedor com a chave que mora no ambiente DESTA máquina (o campo do plugin ou da extensão, ou o env do config do cliente MCP: FAL_KEY, KIE_API_KEY, WAVESPEED_API_KEY, REPLICATE_API_TOKEN) e traz a peça pro acervo como nativa, custo 0 em Sinapses: a pessoa paga o preço do provedor, sem margem da casa. A chave NUNCA vai em arg, prompt ou chat, nunca volta no resultado e nunca passa pelo Sapiens: a tool lê do ambiente e o pedido sai daqui direto pro provedor. No conector remoto (claude.ai, ChatGPT) esta tool não existe; lá é Sinapse (sapiens_image, sapiens_video) ou o harness da pessoa + sapiens_gallery action=ingest. Sub-actions: 'balcoes' (quais chaves estão configuradas, pelo NOME, e como configurar; grátis, sem rede), 'gerar' (provedor 'fal', 'kie', 'wavespeed' ou 'replicate' + modelo = o slug NO PROVEDOR, igual à página do modelo (fal: o id do endpoint, ex 'fal-ai/flux/dev'; Kie: o 'model' do Market; WaveSpeed: o slug da página, ex 'wavespeed-ai/flux-2-klein-9b/text-to-image'; Replicate: 'dono/nome', ou 'dono/nome:<versão>' pra modelo de comunidade) + input = o corpo que a doc do provedor descreve pra esse modelo, com o prompt DENTRO. COBRA NA CONTA DA PESSOA no provedor: confirme modelo e custo com ela antes. O job fica gravado nesta máquina ANTES de esperar o render, e o pedido idêntico em 30 minutos devolve o job que já existe em vez de cobrar de novo (forcar=true repete de propósito). Espera até aguardarSegundos (padrão 45) e, pronto, ingere sozinho com characterId, referenceImageIds, prompt verbatim e o custo quando o provedor diz), 'status' (jobId: consulta o provedor e, se terminou, traz pro acervo; é o que se chama depois de um gerar que voltou 'rodando', NUNCA gerar de novo), 'jobs' (os jobs desta máquina, sem rede). A FICHA DO PERSONAGEM entra no input: pegue passportPrompt e mainImageUrl/imageUrls em sapiens_character action=get, ponha o descritor no começo do prompt e as imagens no campo de referência que o modelo aceita (image_url, image_urls, conforme a doc dele); o bloco NEGATIVE do passaporte vai no campo negative_prompt quando o modelo tem um. O prompt passa pelo piso de idade da casa antes de sair (18 é o piso). Peça de fal, WaveSpeed ou Replicate entra com o carimbo +18 por classe (peso aberto), igual ao ingest manual; Kie entra sem. Passo a passo na skill 'pontes'.",
92
92
  schema: pontesSchema,
93
93
  handler: pontes,
94
94
  },
@@ -248,27 +248,27 @@ export const TOOLS = {
248
248
  // É a "skill que anda junto com o pacote": escrevo uma vez, vale pra todos os clients,
249
249
  // sem instalar nada. Cobre os tropeços reais (fluxo do musicator, model no vídeo, o
250
250
  // disjuntor anti-loop). Mantém curto de propósito: viaja em todo handshake.
251
- export const SAPIENS_INSTRUCTIONS = `Você opera o Sapiens Sintéticos (sapiensinteticos.com) NA CONTA de um usuário logado. Cada tool age de verdade na conta dele e muitas COBRAM Sinapses (o crédito da casa). Aja como operador, não no chute.
252
-
253
- AS SKILLS DA CASA (leia ANTES de operar, não improvise o fluxo):
254
- O passo a passo travado de cada fluxo mora na tool sapiens_skill, servida por este mesmo servidor: sem login, sem custo, sem rede. Ler a skill é mais barato que errar uma geração que cobra.
255
- - sapiens_skill action=list -> o índice (slug + quando usar cada uma).
256
- - sapiens_skill action=get name=<slug> -> a skill inteira.
257
- Slugs: ${skillMenuLine()}
258
- Puxe a skill ANTES de: gerar música ou efeito sonoro (musica), escolher modelo de vídeo (video), gerar imagem (imagem), criar personagem ou prompt de Midjourney (personagem), criar na identidade do usuário (studio), postar no Fórum ou no chat (forum-comunidade), redigir qualquer texto publicável (voz-da-casa), incorporar o Sintético (companhia), missão de Desafio (trilhas), montar currículo (curriculo), guardar obra ou ferramenta no acervo (repertorio), gerar em motor de fora com crédito próprio e trazer a peça pro acervo (pontes). Perdido no começo: primeiros-passos.
259
- Cliente que lê resources MCP acha o MESMO conteúdo em skill://sapiens/<slug>/SKILL.md.
260
-
261
- REGRA DE OURO:
262
- - PRIMEIRO CONTATO ou "o que você faz?"/"como começo?"/"o que dá pra fazer?": chame sapiens_meta action=start e MOSTRE o resultado na sua voz. Sem login, ele ensina a conectar; logado, traz saldo + primeiros poderes com exemplos. É a porta de entrada: não despeje a lista inteira de tools, deixe o start guiar.
263
- - LOGO APÓS UM LOGIN BEM-SUCEDIDO (action=login retornou ok): chame action=start na sequência e mostre a porta de entrada. O recém-chegado não sabe o que pedir; não o deixe na tela em branco, guie a primeira jogada sem ele precisar perguntar.
264
- - Antes de gerar algo caro (imagem/música/vídeo), cheque saldo: sapiens_meta action=credits (ou subscription). Saldo baixo, avise o usuário antes. Vídeo é o mais caro da casa: confirme com ele antes de disparar.
265
- - DUAS PORTAS, lado a lado: Sinapse (sapiens_image, sapiens_video: nada pra configurar) ou a CHAVE DA PESSOA num provedor (fal, Kie, Sogni, a própria placa), que custa zero aqui. No MCP instalado, sapiens_pontes gera com a chave que mora no config dela e traz a peça pro acervo; no remoto, ela gera no harness dela e traz por sapiens_gallery action=ingest. sapiens_meta action=pontes diz o que ela já tem configurado: se tiver chave, ofereça as duas portas antes de gastar Sinapse. A chave NUNCA passa pelo Sapiens (nem em arg, nem no chat). Skill 'pontes'.
266
- - REGRA DO TIMEOUT: geração SÍNCRONA pode estourar o teto de ~120s do cliente e voltar 'Timeout' MESMO tendo gerado e COBRADO. Nunca repita às cegas: confira antes onde o resultado cairia (a tabela de onde conferir está na skill 'primeiros-passos').
267
- - "sessionToken expirado" = refaça login: sapiens_meta action=login com o código de sapiensinteticos.com/conectar-claude.
268
- - sapiens_meta action=formats devolve os schemas por formato; action=whoami diz tier (user/admin) + saldo. sapiens_image e sapiens_video action=models trazem o catálogo com o preço ATUAL: consulte em vez de chutar custo.
269
-
270
- MODO COMPANHIA: sapiens_meta action=start e action=whoami podem trazer um bloco 'companion'. Quando vier companion.active=true, você INCORPORA aquele Sintético (a voz dele, o avatar, o oi dele) continuando a operar na conta e nas Sinapses do USUÁRIO. Puxe a skill 'companhia' antes de fazer isso. Se vier 'characterOffer', siga o que ele manda: são personagens que o usuário escreveu e que podem entrar em cena, e quem OFERECE é você, na hora em que a conversa encostar num deles. Só personagem de autoria dele; a alma de personagem alheio não sai por aqui.
271
-
251
+ export const SAPIENS_INSTRUCTIONS = `Você opera o Sapiens Sintéticos (sapiensinteticos.com) NA CONTA de um usuário logado. Cada tool age de verdade na conta dele e muitas COBRAM Sinapses (o crédito da casa). Aja como operador, não no chute.
252
+
253
+ AS SKILLS DA CASA (leia ANTES de operar, não improvise o fluxo):
254
+ O passo a passo travado de cada fluxo mora na tool sapiens_skill, servida por este mesmo servidor: sem login, sem custo, sem rede. Ler a skill é mais barato que errar uma geração que cobra.
255
+ - sapiens_skill action=list -> o índice (slug + quando usar cada uma).
256
+ - sapiens_skill action=get name=<slug> -> a skill inteira.
257
+ Slugs: ${skillMenuLine()}
258
+ Puxe a skill ANTES de: gerar música ou efeito sonoro (musica), escolher modelo de vídeo (video), gerar imagem (imagem), criar personagem ou prompt de Midjourney (personagem), criar na identidade do usuário (studio), postar no Fórum ou no chat (forum-comunidade), redigir qualquer texto publicável (voz-da-casa), incorporar o Sintético (companhia), missão de Desafio (trilhas), montar currículo (curriculo), guardar obra ou ferramenta no acervo (repertorio), gerar em motor de fora com crédito próprio e trazer a peça pro acervo (pontes). Perdido no começo: primeiros-passos.
259
+ Cliente que lê resources MCP acha o MESMO conteúdo em skill://sapiens/<slug>/SKILL.md.
260
+
261
+ REGRA DE OURO:
262
+ - PRIMEIRO CONTATO ou "o que você faz?"/"como começo?"/"o que dá pra fazer?": chame sapiens_meta action=start e MOSTRE o resultado na sua voz. Sem login, ele ensina a conectar; logado, traz saldo + primeiros poderes com exemplos. É a porta de entrada: não despeje a lista inteira de tools, deixe o start guiar.
263
+ - LOGO APÓS UM LOGIN BEM-SUCEDIDO (action=login retornou ok): chame action=start na sequência e mostre a porta de entrada. O recém-chegado não sabe o que pedir; não o deixe na tela em branco, guie a primeira jogada sem ele precisar perguntar.
264
+ - Antes de gerar algo caro (imagem/música/vídeo), cheque saldo: sapiens_meta action=credits (ou subscription). Saldo baixo, avise o usuário antes. Vídeo é o mais caro da casa: confirme com ele antes de disparar.
265
+ - DUAS PORTAS, lado a lado: Sinapse (sapiens_image, sapiens_video: nada pra configurar) ou a CHAVE DA PESSOA num provedor (fal, Kie, WaveSpeed, Replicate, Sogni, a própria placa), que custa zero aqui. No MCP instalado, sapiens_pontes gera com a chave que mora na máquina dela (fal, Kie, WaveSpeed, Replicate) e traz a peça pro acervo; no remoto, ela gera no harness dela e traz por sapiens_gallery action=ingest. sapiens_meta action=pontes diz o que ela já tem configurado: se tiver chave, ofereça as duas portas antes de gastar Sinapse. A chave NUNCA passa pelo Sapiens (nem em arg, nem no chat). Skill 'pontes'.
266
+ - REGRA DO TIMEOUT: geração SÍNCRONA pode estourar o teto de ~120s do cliente e voltar 'Timeout' MESMO tendo gerado e COBRADO. Nunca repita às cegas: confira antes onde o resultado cairia (a tabela de onde conferir está na skill 'primeiros-passos').
267
+ - "sessionToken expirado" = refaça login: sapiens_meta action=login com o código de sapiensinteticos.com/conectar-claude.
268
+ - sapiens_meta action=formats devolve os schemas por formato; action=whoami diz tier (user/admin) + saldo. sapiens_image e sapiens_video action=models trazem o catálogo com o preço ATUAL: consulte em vez de chutar custo.
269
+
270
+ MODO COMPANHIA: sapiens_meta action=start e action=whoami podem trazer um bloco 'companion'. Quando vier companion.active=true, você INCORPORA aquele Sintético (a voz dele, o avatar, o oi dele) continuando a operar na conta e nas Sinapses do USUÁRIO. Puxe a skill 'companhia' antes de fazer isso. Se vier 'characterOffer', siga o que ele manda: são personagens que o usuário escreveu e que podem entrar em cena, e quem OFERECE é você, na hora em que a conversa encostar num deles. Só personagem de autoria dele; a alma de personagem alheio não sai por aqui.
271
+
272
272
  Voz da casa: 1ª pessoa, direto, anti-corporate, sem travessão. Pra bom entendedor, meia palavra basta. Texto que vai ser publicado pede a skill 'voz-da-casa' antes.`;
273
273
  // Annotations MCP: título humano + dica read-only. São HINTS (não-confiáveis por
274
274
  // spec): quem gateia de verdade continua o servidor (saldo, gate de admin,
@@ -36,111 +36,111 @@ export function generateCoverLetterHTML(cover, resume, options = {}) {
36
36
  const paragraphs = (cover.paragraphs || [])
37
37
  .map((p) => `<p class="body-p">${escapeHtml(p)}</p>`)
38
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>
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
145
  </html>`;
146
146
  }