sapiens-mcp 1.45.0 → 1.46.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/prompts.js +2 -2
- package/dist/registry.js +1 -1
- package/dist/skills.js +10 -19
- package/dist/tools/character.js +12 -2
- package/dist/tools/gallery.js +1 -1
- package/dist/tools/image.js +1 -16
- package/dist/tools/studios.js +6 -6
- package/dist/tools/video.js +9 -1
- package/package.json +1 -1
package/dist/prompts.js
CHANGED
|
@@ -89,8 +89,8 @@ export const SAPIENS_PROMPTS = [
|
|
|
89
89
|
build: (a) => `Quero uma imagem de: "${a.cena}". Monte o prompt na regra da casa (full-bleed, ` +
|
|
90
90
|
"sujeito oversized 70%+ do frame, sem moldura/margem, sem 'tarot card'). Confira " +
|
|
91
91
|
"modelo e preço com sapiens_image action=models e meu saldo com sapiens_meta " +
|
|
92
|
-
"action=credits; me diga o custo antes de gerar. Se eu
|
|
93
|
-
"
|
|
92
|
+
"action=credits; me diga o custo antes de gerar. Se eu pedir 'na minha marca' ou " +
|
|
93
|
+
"'com fulano', use brandSlug ou influencerId. Depois de gerar, me mostre a url e " +
|
|
94
94
|
"ofereça publicar na galeria (sapiens_gallery action=publish).",
|
|
95
95
|
},
|
|
96
96
|
];
|
package/dist/registry.js
CHANGED
|
@@ -143,7 +143,7 @@ export const TOOLS = {
|
|
|
143
143
|
handler: brand,
|
|
144
144
|
},
|
|
145
145
|
sapiens_character: {
|
|
146
|
-
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
|
|
146
|
+
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.",
|
|
147
147
|
schema: characterSchema,
|
|
148
148
|
handler: character,
|
|
149
149
|
},
|
package/dist/skills.js
CHANGED
|
@@ -263,33 +263,24 @@ Aí não é geração base, é o Studio dela. Veja a skill \`studio\`.`,
|
|
|
263
263
|
{
|
|
264
264
|
name: "studio",
|
|
265
265
|
title: "Meu Studio e a Emancipação",
|
|
266
|
-
description: "O studio é
|
|
266
|
+
description: "O studio é a PÁGINA de portfólio da pessoa (obra, time, endereço público). Puxe quando ela falar do studio dela, quiser mostrar a casa, montar time, ou pedir casa própria.",
|
|
267
267
|
body: `## O que o studio é
|
|
268
268
|
|
|
269
|
-
O studio é
|
|
269
|
+
O studio é a **página de portfólio** da pessoa: um endereço público (\`sapiensinteticos.com/studios/<slug>\`) com a obra, o time e o que a casa faz. Não é uma paleta de ferramentas, não tem níveis, e **não é identidade de geração**: isso morreu.
|
|
270
270
|
|
|
271
|
-
|
|
271
|
+
Uma pessoa pode ter até 4 studios e integrar até 4. \`sapiens_studios action=mine\` mostra o primário dela: nome, endereço público, marca e tamanho do time. O servidor resolve pela SESSÃO, você nunca passa id.
|
|
272
272
|
|
|
273
|
-
|
|
274
|
-
- **A identidade de geração.** Marca e personagem-operador, que o \`useStudio\` aplica.
|
|
273
|
+
Quem edita a página (obra, time, sobre, capa, logo, folha) é o membro, na própria página, no modo edição. Você não edita isso pelo MCP.
|
|
275
274
|
|
|
276
|
-
|
|
275
|
+
## O studio NÃO entra na geração
|
|
277
276
|
|
|
278
|
-
|
|
277
|
+
Gerar imagem "no studio dela" não existe. Se ela pedir "na minha marca" ou "do meu jeito", o caminho é explícito e é seu:
|
|
279
278
|
|
|
280
|
-
**
|
|
279
|
+
- **marca da casa** → \`sapiens_image\` com \`brandSlug\` (veja \`sapiens_brand\`);
|
|
280
|
+
- **personagem dela** → \`influencerId\` (veja \`sapiens_character\`);
|
|
281
|
+
- **o traço da casa** → \`templateSlug\`.
|
|
281
282
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
**Geração avulsa:** \`sapiens_image\` SEM \`useStudio\` (\`studioApplied=false\`). Pra teste solto ou pedido fora da identidade.
|
|
285
|
-
|
|
286
|
-
Ou é studio, ou é base. Não misture na mesma peça.
|
|
287
|
-
|
|
288
|
-
## Antes de criar no studio
|
|
289
|
-
|
|
290
|
-
\`sapiens_studios action=mine\` mostra nome, endereço público, marca, operador e o tamanho do time.
|
|
291
|
-
|
|
292
|
-
Se você pediu \`useStudio=true\` e voltou \`studioApplied=false\`, a pessoa ainda não fundou uma casa: avise e aponte /dashboard/studio.
|
|
283
|
+
Pergunte qual, não adivinhe.
|
|
293
284
|
|
|
294
285
|
## O time
|
|
295
286
|
|
package/dist/tools/character.js
CHANGED
|
@@ -24,6 +24,9 @@ import { convexQuery, convexMutation, convexAction, getSessionToken } from "../c
|
|
|
24
24
|
* - remove_image: tira UMA imagem do próprio personagem (por url).
|
|
25
25
|
* - set_main_image: define a principal (por url, entre as que já existem).
|
|
26
26
|
* - reorder_images: reordena as imagens (posição 0 = principal).
|
|
27
|
+
* - generate_sheet: desenha a ficha do personagem (COBRA), vertical ou
|
|
28
|
+
* horizontal (`orientation`). A ficha entra na galeria dele e
|
|
29
|
+
* já serve de referência; elas acumulam.
|
|
27
30
|
* - delete: apaga o próprio personagem (permanente).
|
|
28
31
|
*
|
|
29
32
|
* Fluxo típico de criação: create → add_image (1+) → set_card (opcional) →
|
|
@@ -72,7 +75,7 @@ export const characterSchema = z.object({
|
|
|
72
75
|
.describe("Pra create/set_card: a 'alma' do personagem (personalidade, jeito de falar, contexto). Usado no chat e como guia de geração."),
|
|
73
76
|
imageUrl: httpUrl()
|
|
74
77
|
.optional()
|
|
75
|
-
.describe("Pra add_image: URL pública da imagem (Bunny CDN / Convex storage). Use a `url` que sapiens_image/sapiens_gallery devolvem. Pra remove_image/set_main_image: a url da imagem JÁ no personagem (pegue via action=get, campo imageUrls)."),
|
|
78
|
+
.describe("Pra add_image: URL pública da imagem (Bunny CDN / Convex storage). Use a `url` que sapiens_image/sapiens_gallery devolvem. Pra remove_image/set_main_image: a url da imagem JÁ no personagem (pegue via action=get, campo imageUrls, ou sheetUrls pra apagar uma ficha)."),
|
|
76
79
|
orderedUrls: z
|
|
77
80
|
.array(z.string())
|
|
78
81
|
.optional()
|
|
@@ -89,6 +92,10 @@ export const characterSchema = z.object({
|
|
|
89
92
|
.boolean()
|
|
90
93
|
.optional()
|
|
91
94
|
.describe("Pra set_visibility: true = público no Explorar (gera slug), false = privado."),
|
|
95
|
+
orientation: z
|
|
96
|
+
.enum(["portrait", "landscape"])
|
|
97
|
+
.optional()
|
|
98
|
+
.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."),
|
|
92
99
|
});
|
|
93
100
|
export async function character(args) {
|
|
94
101
|
// -------- list_public: catálogo global (sessionToken opcional, marca `mine`) --------
|
|
@@ -243,7 +250,9 @@ export async function character(args) {
|
|
|
243
250
|
}
|
|
244
251
|
// -------- generate_sheet: a ficha (página-pôster) do personagem --------
|
|
245
252
|
// 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
|
|
253
|
+
// NÃO repita às cegas: confira em action=get (campo imageUrls) se a peça caiu.
|
|
254
|
+
// A ficha entra na galeria do personagem, então já vira referência das
|
|
255
|
+
// próximas gerações sem passo extra.
|
|
247
256
|
if (args.action === "generate_sheet") {
|
|
248
257
|
if (!args.characterId)
|
|
249
258
|
throw new Error("action=generate_sheet exige characterId.");
|
|
@@ -251,6 +260,7 @@ export async function character(args) {
|
|
|
251
260
|
return await convexAction("characterSheetActions:mcpGenerateCharacterSheet", {
|
|
252
261
|
sessionToken,
|
|
253
262
|
influencerId: args.characterId,
|
|
263
|
+
orientation: args.orientation,
|
|
254
264
|
});
|
|
255
265
|
}
|
|
256
266
|
// -------- delete: apaga o próprio personagem (permanente) --------
|
package/dist/tools/gallery.js
CHANGED
|
@@ -80,7 +80,7 @@ export const gallerySchema = z.object({
|
|
|
80
80
|
prompt: z
|
|
81
81
|
.string()
|
|
82
82
|
.optional()
|
|
83
|
-
.describe("action=ingest: o
|
|
83
|
+
.describe("action=ingest: o PROMPT DE GERAÇÃO, copiado inteiro do motor externo, exatamente como foi enviado. É o que a ficha mostra e a busca acha, e é o que permite regerar a peça depois. NÃO escreva aqui nota, resumo, título ou comentário sobre a peça: isso deixa a ficha sem sentido pra quem abrir. Re-ingerir a mesma sourceUrl com um prompt novo CORRIGE o que já está gravado, sem duplicar."),
|
|
84
84
|
aspectRatio: z
|
|
85
85
|
.string()
|
|
86
86
|
.optional()
|
package/dist/tools/image.js
CHANGED
|
@@ -77,14 +77,10 @@ export const imageSchema = z.object({
|
|
|
77
77
|
.string()
|
|
78
78
|
.optional()
|
|
79
79
|
.describe("Slug de um template de imagem (super-prompt travado da casa). Quando setado, o `prompt` vira só a CENA (quem + pose + objeto-conceito) e o template embrulha com o estilo + fundo + enquadramento + ref de traço da casa. Ex: 'retrato-sapiens-v1' = retrato editorial cartoon de UM personagem no grid verde Sapiens (mesma 'mão' dos artigos). O template define model/aspect/size default (sobreponíveis) e injeta a ref da Helen como âncora de traço quando você não passa referenceImageUrls própria (passar refs = trocar quem aparece, mantendo o estilo). Mutuamente exclusivo com brandSlug. Vale em action=generate, mode=create."),
|
|
80
|
-
useStudio: z
|
|
81
|
-
.boolean()
|
|
82
|
-
.optional()
|
|
83
|
-
.describe("Quando true, gera SEGUINDO o studio do user (o 'Meu Studio', ÚNICO, resolvido pela sessão — você NÃO passa id): marca + personagem-operador + a vibe + os presets do bloco de imagem entram sozinhos (o explícito sempre vence). O retorno traz studioApplied: true se aplicou o studio, false se caiu no Sapiens base (sem studio montado — aí avise o user). É o 'criar no meu studio' do Nível 2, e gerar assim faz o studio evoluir. SEM useStudio = geração base, fora da identidade dele: não misture. Cheque o studio com sapiens_studios action=mine. Vale em action=generate."),
|
|
84
80
|
influencerId: z
|
|
85
81
|
.string()
|
|
86
82
|
.optional()
|
|
87
|
-
.describe("ID de personagem (influencer) pra character-lock
|
|
83
|
+
.describe("ID de personagem (influencer) pra character-lock: a imagem sai com ESSE personagem. Descubra o id com sapiens_character."),
|
|
88
84
|
loraIntensity: z
|
|
89
85
|
.enum(["suave", "medio", "forte"])
|
|
90
86
|
.optional()
|
|
@@ -216,25 +212,14 @@ export async function image(args) {
|
|
|
216
212
|
brandSlug: args.brandSlug,
|
|
217
213
|
brandMark: args.brandMark,
|
|
218
214
|
templateSlug: args.templateSlug,
|
|
219
|
-
useStudio: args.useStudio,
|
|
220
215
|
influencerId: args.influencerId,
|
|
221
216
|
loraIntensity: args.loraIntensity,
|
|
222
217
|
});
|
|
223
|
-
const studioApplied = result?.studioApplied === true;
|
|
224
218
|
return {
|
|
225
219
|
imageId: result?.imageId,
|
|
226
220
|
url: result?.url,
|
|
227
221
|
webUrl: result?.imageId ? `https://sapiensinteticos.com/imagem/${result.imageId}` : undefined,
|
|
228
222
|
mimeType: result?.mimeType,
|
|
229
|
-
// studioApplied=true só quando useStudio achou e aplicou o studio do user.
|
|
230
|
-
// false = geração base. É o sinal pra não confundir studio com base.
|
|
231
|
-
studioApplied,
|
|
232
|
-
// Pediu o studio mas não há um montado: caiu no base, avise o user.
|
|
233
|
-
...(args.useStudio && !studioApplied
|
|
234
|
-
? {
|
|
235
|
-
note: "Você pediu o seu studio, mas não há um montado: gerei no Sapiens base. Monte o seu studio em sapiensinteticos.com/dashboard/studio (ferramentas + marca + a vibe).",
|
|
236
|
-
}
|
|
237
|
-
: {}),
|
|
238
223
|
// Não incluir base64 no retorno (polui contexto). Quem quiser bytes
|
|
239
224
|
// chama sapiens_gallery action=get com includeBase64=true.
|
|
240
225
|
};
|
package/dist/tools/studios.js
CHANGED
|
@@ -15,7 +15,7 @@ import { convexAction, convexQuery, getSessionToken } from "../convexClient.js";
|
|
|
15
15
|
export const studiosSchema = z.object({
|
|
16
16
|
action: z
|
|
17
17
|
.enum(["list", "get", "publishable_url", "mine", "emancipar", "module"])
|
|
18
|
-
.describe("mine = o SEU studio (
|
|
18
|
+
.describe("mine = o SEU studio (a página de portfólio da sua casa): nome, endereço público, marca, operador e tamanho do time. list/get = catálogo de estúdios da casa. publishable_url = URL de artigo. " +
|
|
19
19
|
"emancipar = INICIA a Emancipação (Nível 3 do Studio): puxa o blueprint-mestre pra VOCÊ (Claude) construir a casa PRÓPRIA do membro, na infra DELE (Vercel + Convex + domínio dele), FORA do Sapiens. Devolve a identidade do studio dele já hidratada + o índice de módulos + o guia da Fundação. " +
|
|
20
20
|
"module = puxa o guia de UM módulo de infra pra continuar a construção (ex: fundacao, sapiens-connect, midia, telegram, email, auth)."),
|
|
21
21
|
studio: z
|
|
@@ -149,11 +149,11 @@ const STUDIOS = {
|
|
|
149
149
|
},
|
|
150
150
|
};
|
|
151
151
|
export async function studios(args) {
|
|
152
|
-
// action=mine: o studio PRIMÁRIO do user logado (
|
|
153
|
-
// dele), resumo non-PII
|
|
154
|
-
//
|
|
155
|
-
//
|
|
156
|
-
//
|
|
152
|
+
// action=mine: o studio PRIMÁRIO do user logado (a página de portfólio da casa
|
|
153
|
+
// dele), resumo non-PII. Os campos `level`/`levelLabel`/`tools`/`imageVibe`/
|
|
154
|
+
// `studioMcpRuns` vêm vazios: os níveis e as ferramentas à la carte morreram
|
|
155
|
+
// quando o studio virou página, e a geração ancorada (`useStudio`) morreu com
|
|
156
|
+
// ela; só continuam no retorno porque pacotes já publicados os imprimem.
|
|
157
157
|
if (args.action === "mine") {
|
|
158
158
|
const sessionToken = getSessionToken();
|
|
159
159
|
const studio = await convexAction("desktopMcp:studioMine", { sessionToken });
|
package/dist/tools/video.js
CHANGED
|
@@ -57,6 +57,12 @@ import { httpUrl } from "../schema.js";
|
|
|
57
57
|
* Motor puro: SEM áudio, SEM referência, SEM frame final.
|
|
58
58
|
* - sapiens-video-hailuo-pro Hailuo 2.3 Pro — o mesmo em 1080p, 5s fixo (duração não é param).
|
|
59
59
|
* É o 1080p mais barato da casa depois do Seedance 1.0 Fast.
|
|
60
|
+
* - sapiens-video-h3 MiniMax H3 — 2K (2560x1440) com ÁUDIO nativo, 5/6/8/10s (t2v/i2v),
|
|
61
|
+
* frame final (role 'end'). O menor custo por pixel da prateleira.
|
|
62
|
+
* Áudio vem sempre e já está no preço (não tem toggle). NÃO aceita
|
|
63
|
+
* imagem de referência: no H3 isso é outro endpoint, ainda fora.
|
|
64
|
+
* O provider faz até 15s; a casa para em 10 (o render de 5s leva
|
|
65
|
+
* ~3min e o poll do backend morre em 8).
|
|
60
66
|
* - sapiens-video-wan WAN 2.5 — imagem que fala/canta (áudio+lip-sync nativo), 5/10s (i2v)
|
|
61
67
|
* - sapiens-video-kling-motion Kling Motion — transfere o movimento de um vídeo pra uma imagem
|
|
62
68
|
* (PRECISA de pessoa com tronco visível na imagem E no vídeo;
|
|
@@ -93,6 +99,7 @@ const VIDEO_MODELS = [
|
|
|
93
99
|
"sapiens-video-kling",
|
|
94
100
|
"sapiens-video-hailuo",
|
|
95
101
|
"sapiens-video-hailuo-pro",
|
|
102
|
+
"sapiens-video-h3",
|
|
96
103
|
"sapiens-video-wan",
|
|
97
104
|
"sapiens-video-kling-motion",
|
|
98
105
|
"sapiens-video-shot-mimic",
|
|
@@ -199,6 +206,7 @@ export const videoSchema = z.object({
|
|
|
199
206
|
.describe("action=create: modelo de vídeo. 'sapiens-video-seedance' (cinematográfico+áudio, t2v/i2v), " +
|
|
200
207
|
"'sapiens-video-kling' (anima imagem, i2v/t2v), 'sapiens-video-wan' (imagem que fala, i2v), " +
|
|
201
208
|
"'sapiens-video-hailuo' (MiniMax, física e movimento, 768p 6/10s) e 'sapiens-video-hailuo-pro' (o mesmo em 1080p, 5s fixo) — os dois sem áudio, sem referência e sem frame final, " +
|
|
209
|
+
"'sapiens-video-h3' (MiniMax H3: 2K com áudio nativo, 5 a 10s, t2v/i2v e frame final; áudio incluso sem toggle, não aceita imagem de referência), " +
|
|
202
210
|
"'sapiens-video-kling-motion' (motion transfer, precisa pessoa na imagem E no vídeo de movimento; vídeo de referência MÁX 10s, cobra pela duração do clipe), " +
|
|
203
211
|
"'sapiens-video-shot-mimic' (recria o plano do vídeo de referência com seu personagem: mesma câmera, mesmos cortes; 'driving' = previs/clipe do plano MÁX 15s, 'start' = personagem), " +
|
|
204
212
|
"'sapiens-video-lite/fast/quality' (Veo 3.1), " +
|
|
@@ -206,7 +214,7 @@ export const videoSchema = z.object({
|
|
|
206
214
|
durationSec: z
|
|
207
215
|
.number()
|
|
208
216
|
.optional()
|
|
209
|
-
.describe("action=create (modelos WaveSpeed): duração em segundos. Seedance/Shot Mimic 4-15, Kling 3-15, WAN 5/10. " +
|
|
217
|
+
.describe("action=create (modelos WaveSpeed): duração em segundos. Seedance/Shot Mimic 4-15, Kling 3-15, WAN 5/10, H3 5/6/8/10. " +
|
|
210
218
|
"Sem isso usa a config mais barata. O preço escala com a duração. " +
|
|
211
219
|
"action=shadows: duração do vídeo-fonte, se souber (cobra 200/s; sem ela, flat ~2000)."),
|
|
212
220
|
resolution: z
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sapiens-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.46.0",
|
|
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": {
|