@gyramais/mcp-server 0.1.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/bin/gyra-mcp-internal.d.ts +3 -0
- package/dist/bin/gyra-mcp-internal.d.ts.map +1 -0
- package/dist/bin/gyra-mcp-internal.js +8 -0
- package/dist/bin/gyra-mcp-internal.js.map +1 -0
- package/dist/bin/gyra-mcp.d.ts +7 -0
- package/dist/bin/gyra-mcp.d.ts.map +1 -0
- package/dist/bin/gyra-mcp.js +7 -0
- package/dist/bin/gyra-mcp.js.map +1 -0
- package/dist/enrichments/auth.enrichment.d.ts +3 -0
- package/dist/enrichments/auth.enrichment.d.ts.map +1 -0
- package/dist/enrichments/auth.enrichment.js +20 -0
- package/dist/enrichments/auth.enrichment.js.map +1 -0
- package/dist/enrichments/credential.enrichment.d.ts +3 -0
- package/dist/enrichments/credential.enrichment.d.ts.map +1 -0
- package/dist/enrichments/credential.enrichment.js +62 -0
- package/dist/enrichments/credential.enrichment.js.map +1 -0
- package/dist/enrichments/credit-policy.enrichment.d.ts +3 -0
- package/dist/enrichments/credit-policy.enrichment.d.ts.map +1 -0
- package/dist/enrichments/credit-policy.enrichment.js +48 -0
- package/dist/enrichments/credit-policy.enrichment.js.map +1 -0
- package/dist/enrichments/index.d.ts +10 -0
- package/dist/enrichments/index.d.ts.map +1 -0
- package/dist/enrichments/index.js +23 -0
- package/dist/enrichments/index.js.map +1 -0
- package/dist/enrichments/insight.enrichment.d.ts +3 -0
- package/dist/enrichments/insight.enrichment.d.ts.map +1 -0
- package/dist/enrichments/insight.enrichment.js +37 -0
- package/dist/enrichments/insight.enrichment.js.map +1 -0
- package/dist/enrichments/public-endpoints.d.ts +15 -0
- package/dist/enrichments/public-endpoints.d.ts.map +1 -0
- package/dist/enrichments/public-endpoints.js +44 -0
- package/dist/enrichments/public-endpoints.js.map +1 -0
- package/dist/enrichments/report.enrichment.d.ts +3 -0
- package/dist/enrichments/report.enrichment.d.ts.map +1 -0
- package/dist/enrichments/report.enrichment.js +133 -0
- package/dist/enrichments/report.enrichment.js.map +1 -0
- package/dist/enrichments/section.enrichment.d.ts +3 -0
- package/dist/enrichments/section.enrichment.d.ts.map +1 -0
- package/dist/enrichments/section.enrichment.js +24 -0
- package/dist/enrichments/section.enrichment.js.map +1 -0
- package/dist/enrichments/types.d.ts +26 -0
- package/dist/enrichments/types.d.ts.map +1 -0
- package/dist/enrichments/types.js +2 -0
- package/dist/enrichments/types.js.map +1 -0
- package/dist/enrichments/webhook.enrichment.d.ts +3 -0
- package/dist/enrichments/webhook.enrichment.d.ts.map +1 -0
- package/dist/enrichments/webhook.enrichment.js +61 -0
- package/dist/enrichments/webhook.enrichment.js.map +1 -0
- package/dist/scripts/enrich-spec.d.ts +3 -0
- package/dist/scripts/enrich-spec.d.ts.map +1 -0
- package/dist/scripts/enrich-spec.js +128 -0
- package/dist/scripts/enrich-spec.js.map +1 -0
- package/dist/scripts/fetch-spec.d.ts +3 -0
- package/dist/scripts/fetch-spec.d.ts.map +1 -0
- package/dist/scripts/fetch-spec.js +34 -0
- package/dist/scripts/fetch-spec.js.map +1 -0
- package/dist/scripts/generate-internal.d.ts +3 -0
- package/dist/scripts/generate-internal.d.ts.map +1 -0
- package/dist/scripts/generate-internal.js +45 -0
- package/dist/scripts/generate-internal.js.map +1 -0
- package/dist/scripts/generate-mintlify.d.ts +3 -0
- package/dist/scripts/generate-mintlify.d.ts.map +1 -0
- package/dist/scripts/generate-mintlify.js +98 -0
- package/dist/scripts/generate-mintlify.js.map +1 -0
- package/dist/scripts/validate-spec.d.ts +3 -0
- package/dist/scripts/validate-spec.d.ts.map +1 -0
- package/dist/scripts/validate-spec.js +67 -0
- package/dist/scripts/validate-spec.js.map +1 -0
- package/dist/src/auth.d.ts +14 -0
- package/dist/src/auth.d.ts.map +1 -0
- package/dist/src/auth.js +50 -0
- package/dist/src/auth.js.map +1 -0
- package/dist/src/client.d.ts +22 -0
- package/dist/src/client.d.ts.map +1 -0
- package/dist/src/client.js +51 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/config.d.ts +13 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +16 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +35 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/server.d.ts +5 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +104 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/tools/index.d.ts +4 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +3 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/param-resolver.d.ts +13 -0
- package/dist/src/tools/param-resolver.d.ts.map +1 -0
- package/dist/src/tools/param-resolver.js +44 -0
- package/dist/src/tools/param-resolver.js.map +1 -0
- package/dist/src/tools/tool-factory.d.ts +18 -0
- package/dist/src/tools/tool-factory.d.ts.map +1 -0
- package/dist/src/tools/tool-factory.js +156 -0
- package/dist/src/tools/tool-factory.js.map +1 -0
- package/package.json +44 -0
- package/spec/openapi-external.json +1007 -0
- package/spec/openapi-internal.json +2087 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export const webhookEnrichments = {
|
|
2
|
+
'WebhookController_create': {
|
|
3
|
+
toolName: 'create_webhook',
|
|
4
|
+
summary: 'Criar webhook para notificacoes',
|
|
5
|
+
description: `Registra uma URL de webhook para receber notificacoes em tempo real.
|
|
6
|
+
|
|
7
|
+
Tipos de webhook disponiveis:
|
|
8
|
+
- REPORT: notificado quando um relatorio muda de status (PENDING → APPROVED/DENIED/ALERT)
|
|
9
|
+
- REPORT_FINISHED: notificado quando o processamento do relatorio finaliza
|
|
10
|
+
- REPORT_STATUS: notificado em cada mudanca de status intermediaria
|
|
11
|
+
- CREDIT_POLICY: notificado quando a politica de credito e avaliada
|
|
12
|
+
- OPTIN: notificado quando um opt-in e processado
|
|
13
|
+
|
|
14
|
+
O webhook recebe um POST na URL configurada com o payload do evento.
|
|
15
|
+
Se apiKey for informada, sera enviada no header api-key da requisicao.
|
|
16
|
+
|
|
17
|
+
RECOMENDADO: Sempre configure um webhook ao criar relatorios. Evita
|
|
18
|
+
a necessidade de polling com get_report.`,
|
|
19
|
+
paramDescriptions: {
|
|
20
|
+
'type': 'Tipo do webhook: REPORT, REPORT_FINISHED, REPORT_STATUS, CREDIT_POLICY ou OPTIN.',
|
|
21
|
+
'url': 'URL completa (https://) que recebera o POST com o payload do evento.',
|
|
22
|
+
'apiKey': 'Chave de API enviada no header api-key para autenticacao (opcional).',
|
|
23
|
+
},
|
|
24
|
+
responseDescription: 'Webhook criado com id, type, url e organizationId.',
|
|
25
|
+
examples: [
|
|
26
|
+
{
|
|
27
|
+
name: 'Webhook para relatorio finalizado',
|
|
28
|
+
params: {
|
|
29
|
+
type: 'REPORT_FINISHED',
|
|
30
|
+
url: 'https://meu-sistema.com/webhooks/gyra',
|
|
31
|
+
apiKey: 'minha-chave-secreta',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
tags: ['webhook'],
|
|
36
|
+
},
|
|
37
|
+
'WebhookController_find': {
|
|
38
|
+
toolName: 'find_webhooks',
|
|
39
|
+
summary: 'Consultar webhooks cadastrados',
|
|
40
|
+
description: `Busca webhooks cadastrados na organizacao.
|
|
41
|
+
|
|
42
|
+
Se webhookId for informado, retorna o webhook especifico.
|
|
43
|
+
Caso contrario, retorna todos os webhooks da organizacao autenticada.`,
|
|
44
|
+
paramDescriptions: {
|
|
45
|
+
'webhookId': 'ID do webhook especifico (opcional). Sem este parametro, retorna todos.',
|
|
46
|
+
},
|
|
47
|
+
responseDescription: 'Webhook(s) com id, type, url, apiKey e organizationId.',
|
|
48
|
+
tags: ['webhook'],
|
|
49
|
+
},
|
|
50
|
+
'WebhookController_delete': {
|
|
51
|
+
toolName: 'delete_webhook',
|
|
52
|
+
summary: 'Deletar webhook',
|
|
53
|
+
description: `Remove um webhook cadastrado. A URL deixa de receber notificacoes imediatamente.`,
|
|
54
|
+
paramDescriptions: {
|
|
55
|
+
'id': 'ID do webhook a remover.',
|
|
56
|
+
},
|
|
57
|
+
responseDescription: 'Confirmacao de remocao.',
|
|
58
|
+
tags: ['webhook'],
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=webhook.enrichment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.enrichment.js","sourceRoot":"","sources":["../../enrichments/webhook.enrichment.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAmC;IAChE,0BAA0B,EAAE;QAC1B,QAAQ,EAAE,gBAAgB;QAC1B,OAAO,EAAE,iCAAiC;QAC1C,WAAW,EAAE;;;;;;;;;;;;;yCAawB;QACrC,iBAAiB,EAAE;YACjB,MAAM,EAAE,kFAAkF;YAC1F,KAAK,EAAE,sEAAsE;YAC7E,QAAQ,EAAE,sEAAsE;SACjF;QACD,mBAAmB,EAAE,oDAAoD;QACzE,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,mCAAmC;gBACzC,MAAM,EAAE;oBACN,IAAI,EAAE,iBAAiB;oBACvB,GAAG,EAAE,uCAAuC;oBAC5C,MAAM,EAAE,qBAAqB;iBAC9B;aACF;SACF;QACD,IAAI,EAAE,CAAC,SAAS,CAAC;KAClB;IAED,wBAAwB,EAAE;QACxB,QAAQ,EAAE,eAAe;QACzB,OAAO,EAAE,gCAAgC;QACzC,WAAW,EAAE;;;sEAGqD;QAClE,iBAAiB,EAAE;YACjB,WAAW,EAAE,yEAAyE;SACvF;QACD,mBAAmB,EAAE,wDAAwD;QAC7E,IAAI,EAAE,CAAC,SAAS,CAAC;KAClB;IAED,0BAA0B,EAAE;QAC1B,QAAQ,EAAE,gBAAgB;QAC1B,OAAO,EAAE,iBAAiB;QAC1B,WAAW,EAAE,kFAAkF;QAC/F,iBAAiB,EAAE;YACjB,IAAI,EAAE,0BAA0B;SACjC;QACD,mBAAmB,EAAE,yBAAyB;QAC9C,IAAI,EAAE,CAAC,SAAS,CAAC;KAClB;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich-spec.d.ts","sourceRoot":"","sources":["../../scripts/enrich-spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Mescla a spec crua do gyra-core com os enrichments curados.
|
|
4
|
+
* Gera spec/openapi-external.json contendo apenas os endpoints publicos.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
import { enrichmentRegistry } from '../enrichments/index.js';
|
|
9
|
+
import { PUBLIC_OPERATION_IDS } from '../enrichments/public-endpoints.js';
|
|
10
|
+
const ROOT = resolve(import.meta.dirname, '..');
|
|
11
|
+
const RAW_PATH = resolve(ROOT, 'spec', 'openapi-raw.json');
|
|
12
|
+
const OUTPUT_PATH = resolve(ROOT, 'spec', 'openapi-external.json');
|
|
13
|
+
function main() {
|
|
14
|
+
if (!existsSync(RAW_PATH)) {
|
|
15
|
+
throw new Error(`Raw spec not found at ${RAW_PATH}. Run fetch-spec first.`);
|
|
16
|
+
}
|
|
17
|
+
const rawSpec = JSON.parse(readFileSync(RAW_PATH, 'utf-8'));
|
|
18
|
+
const publicIds = new Set(PUBLIC_OPERATION_IDS);
|
|
19
|
+
const enrichedPaths = {};
|
|
20
|
+
const usedSchemas = new Set();
|
|
21
|
+
let includedCount = 0;
|
|
22
|
+
let skippedCount = 0;
|
|
23
|
+
// Iterar por todos os paths e operacoes da spec
|
|
24
|
+
for (const [path, methods] of Object.entries(rawSpec.paths)) {
|
|
25
|
+
for (const [method, operation] of Object.entries(methods)) {
|
|
26
|
+
if (method === 'parameters')
|
|
27
|
+
continue; // path-level params
|
|
28
|
+
const operationId = operation.operationId;
|
|
29
|
+
if (!operationId || !publicIds.has(operationId)) {
|
|
30
|
+
skippedCount++;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const enrichment = enrichmentRegistry[operationId];
|
|
34
|
+
if (!enrichment) {
|
|
35
|
+
console.warn(`WARN: ${operationId} in allowlist but no enrichment found. Skipping.`);
|
|
36
|
+
skippedCount++;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
// Clonar operacao e aplicar enrichments
|
|
40
|
+
const enrichedOp = JSON.parse(JSON.stringify(operation));
|
|
41
|
+
// Sobrescrever summary e description
|
|
42
|
+
enrichedOp.summary = enrichment.summary;
|
|
43
|
+
enrichedOp.description = enrichment.description;
|
|
44
|
+
// Enriquecer descricoes de parametros
|
|
45
|
+
if (enrichment.paramDescriptions && enrichedOp.parameters) {
|
|
46
|
+
enrichedOp.parameters = enrichedOp.parameters
|
|
47
|
+
.filter((p) => !enrichment.excludeParams?.includes(p.name))
|
|
48
|
+
.map((p) => {
|
|
49
|
+
if (enrichment.paramDescriptions?.[p.name]) {
|
|
50
|
+
return { ...p, description: enrichment.paramDescriptions[p.name] };
|
|
51
|
+
}
|
|
52
|
+
return p;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// Enriquecer descricoes do requestBody
|
|
56
|
+
if (enrichment.paramDescriptions && enrichedOp.requestBody?.content) {
|
|
57
|
+
for (const contentType of Object.values(enrichedOp.requestBody.content)) {
|
|
58
|
+
if (contentType.schema?.properties) {
|
|
59
|
+
for (const [propName, propSchema] of Object.entries(contentType.schema.properties)) {
|
|
60
|
+
if (enrichment.paramDescriptions[propName]) {
|
|
61
|
+
propSchema.description = enrichment.paramDescriptions[propName];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Track $ref schemas
|
|
66
|
+
if (contentType.schema?.$ref) {
|
|
67
|
+
const refName = contentType.schema.$ref.replace('#/components/schemas/', '');
|
|
68
|
+
usedSchemas.add(refName);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Adicionar response description
|
|
73
|
+
if (enrichment.responseDescription) {
|
|
74
|
+
const successResponse = enrichedOp.responses?.['200'] || enrichedOp.responses?.['201'] || enrichedOp.responses?.['202'];
|
|
75
|
+
if (successResponse) {
|
|
76
|
+
successResponse.description = enrichment.responseDescription;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Adicionar ao path
|
|
80
|
+
if (!enrichedPaths[path]) {
|
|
81
|
+
enrichedPaths[path] = {};
|
|
82
|
+
}
|
|
83
|
+
enrichedPaths[path][method] = enrichedOp;
|
|
84
|
+
includedCount++;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Coletar schemas referenciados recursivamente
|
|
88
|
+
const allSchemas = rawSpec.components?.schemas || {};
|
|
89
|
+
const resolvedSchemas = {};
|
|
90
|
+
function collectSchema(name) {
|
|
91
|
+
if (resolvedSchemas[name] || !allSchemas[name])
|
|
92
|
+
return;
|
|
93
|
+
resolvedSchemas[name] = allSchemas[name];
|
|
94
|
+
// Buscar refs internas do schema
|
|
95
|
+
const schemaStr = JSON.stringify(allSchemas[name]);
|
|
96
|
+
const refs = schemaStr.match(/#\/components\/schemas\/(\w+)/g) || [];
|
|
97
|
+
for (const ref of refs) {
|
|
98
|
+
const refName = ref.replace('#/components/schemas/', '');
|
|
99
|
+
collectSchema(refName);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
for (const schemaName of usedSchemas) {
|
|
103
|
+
collectSchema(schemaName);
|
|
104
|
+
}
|
|
105
|
+
// Montar spec final
|
|
106
|
+
const enrichedSpec = {
|
|
107
|
+
openapi: rawSpec.openapi || '3.0.0',
|
|
108
|
+
info: {
|
|
109
|
+
...rawSpec.info,
|
|
110
|
+
title: 'GYRA+ API - MCP Server',
|
|
111
|
+
description: 'API da Gyra+ para analise de credito. Spec curada para uso com agentes AI via MCP.',
|
|
112
|
+
},
|
|
113
|
+
servers: rawSpec.servers || [{ url: 'https://gyra-core.gyramais.com.br', description: 'Producao' }],
|
|
114
|
+
paths: enrichedPaths,
|
|
115
|
+
components: {
|
|
116
|
+
...rawSpec.components,
|
|
117
|
+
schemas: resolvedSchemas,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
writeFileSync(OUTPUT_PATH, JSON.stringify(enrichedSpec, null, 2));
|
|
121
|
+
console.log(`Enriched spec generated:`);
|
|
122
|
+
console.log(` Included: ${includedCount} operations`);
|
|
123
|
+
console.log(` Skipped: ${skippedCount} operations (internal)`);
|
|
124
|
+
console.log(` Schemas: ${Object.keys(resolvedSchemas).length}`);
|
|
125
|
+
console.log(` Output: ${OUTPUT_PATH}`);
|
|
126
|
+
}
|
|
127
|
+
main();
|
|
128
|
+
//# sourceMappingURL=enrich-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich-spec.js","sourceRoot":"","sources":["../../scripts/enrich-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-spec.d.ts","sourceRoot":"","sources":["../../scripts/fetch-spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Busca a OpenAPI spec live do gyra-core (/api-json)
|
|
4
|
+
* e salva em spec/openapi-raw.json
|
|
5
|
+
*/
|
|
6
|
+
import { writeFileSync, mkdirSync } from 'node:fs';
|
|
7
|
+
import { resolve, dirname } from 'node:path';
|
|
8
|
+
const SPEC_URL = process.env.GYRA_SPEC_URL
|
|
9
|
+
|| process.env.GYRA_BASE_URL
|
|
10
|
+
? `${process.env.GYRA_BASE_URL}/api-json`
|
|
11
|
+
: 'https://gyra-core.gyramais.com.br/api-json';
|
|
12
|
+
const OUTPUT_PATH = resolve(import.meta.dirname, '..', 'spec', 'openapi-raw.json');
|
|
13
|
+
async function main() {
|
|
14
|
+
console.log(`Fetching OpenAPI spec from: ${SPEC_URL}`);
|
|
15
|
+
const response = await fetch(SPEC_URL);
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
throw new Error(`Failed to fetch spec: ${response.status} ${response.statusText}`);
|
|
18
|
+
}
|
|
19
|
+
const spec = await response.json();
|
|
20
|
+
// Validacao basica
|
|
21
|
+
if (!spec.paths || !spec.info) {
|
|
22
|
+
throw new Error('Invalid OpenAPI spec: missing "paths" or "info"');
|
|
23
|
+
}
|
|
24
|
+
const pathCount = Object.keys(spec.paths).length;
|
|
25
|
+
console.log(`Spec fetched: ${spec.info.title} v${spec.info.version} (${pathCount} paths)`);
|
|
26
|
+
mkdirSync(dirname(OUTPUT_PATH), { recursive: true });
|
|
27
|
+
writeFileSync(OUTPUT_PATH, JSON.stringify(spec, null, 2));
|
|
28
|
+
console.log(`Saved to: ${OUTPUT_PATH}`);
|
|
29
|
+
}
|
|
30
|
+
main().catch((err) => {
|
|
31
|
+
console.error('Error fetching spec:', err.message);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=fetch-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-spec.js","sourceRoot":"","sources":["../../scripts/fetch-spec.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa;OACrC,OAAO,CAAC,GAAG,CAAC,aAAa;IAC1B,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,WAAW;IACzC,CAAC,CAAC,4CAA4C,CAAC;AAEnD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAEnF,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,IAAI,GAAQ,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAExC,mBAAmB;IACnB,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,SAAS,CAAC,CAAC;IAE3F,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-internal.d.ts","sourceRoot":"","sources":["../../scripts/generate-internal.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Gera spec/openapi-internal.json contendo TODOS os endpoints.
|
|
4
|
+
* Usa descricoes auto-geradas do Swagger (sem enrichments curados).
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
const ROOT = resolve(import.meta.dirname, '..');
|
|
9
|
+
const RAW_PATH = resolve(ROOT, 'spec', 'openapi-raw.json');
|
|
10
|
+
const OUTPUT_PATH = resolve(ROOT, 'spec', 'openapi-internal.json');
|
|
11
|
+
function main() {
|
|
12
|
+
if (!existsSync(RAW_PATH)) {
|
|
13
|
+
throw new Error(`Raw spec not found at ${RAW_PATH}. Run fetch-spec first.`);
|
|
14
|
+
}
|
|
15
|
+
const rawSpec = JSON.parse(readFileSync(RAW_PATH, 'utf-8'));
|
|
16
|
+
// Enriquecer operacoes que nao tem summary/description
|
|
17
|
+
let enrichedCount = 0;
|
|
18
|
+
for (const [path, methods] of Object.entries(rawSpec.paths)) {
|
|
19
|
+
for (const [method, operation] of Object.entries(methods)) {
|
|
20
|
+
if (method === 'parameters')
|
|
21
|
+
continue;
|
|
22
|
+
// Auto-gerar summary se nao existir
|
|
23
|
+
if (!operation.summary) {
|
|
24
|
+
operation.summary = `${method.toUpperCase()} ${path}`;
|
|
25
|
+
enrichedCount++;
|
|
26
|
+
}
|
|
27
|
+
// Auto-gerar description se nao existir
|
|
28
|
+
if (!operation.description) {
|
|
29
|
+
const tags = operation.tags?.join(', ') || 'general';
|
|
30
|
+
operation.description = `Endpoint ${method.toUpperCase()} ${path} (${tags}). Gerado automaticamente do Swagger.`;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Atualizar info
|
|
35
|
+
rawSpec.info.title = 'GYRA+ API - MCP Server (Internal)';
|
|
36
|
+
rawSpec.info.description = 'API completa da Gyra+ para uso interno. Todos os endpoints expostos.';
|
|
37
|
+
writeFileSync(OUTPUT_PATH, JSON.stringify(rawSpec, null, 2));
|
|
38
|
+
const pathCount = Object.keys(rawSpec.paths).length;
|
|
39
|
+
console.log(`Internal spec generated:`);
|
|
40
|
+
console.log(` Paths: ${pathCount}`);
|
|
41
|
+
console.log(` Auto-enriched: ${enrichedCount} operations`);
|
|
42
|
+
console.log(` Output: ${OUTPUT_PATH}`);
|
|
43
|
+
}
|
|
44
|
+
main();
|
|
45
|
+
//# sourceMappingURL=generate-internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-internal.js","sourceRoot":"","sources":["../../scripts/generate-internal.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,uBAAuB,CAAC,CAAC;AAEnE,SAAS,IAAI;IACX,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,yBAAyB,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5D,uDAAuD;IACvD,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAA8B,CAAC,EAAE,CAAC;YACjF,IAAI,MAAM,KAAK,YAAY;gBAAE,SAAS;YAEtC,oCAAoC;YACpC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACvB,SAAS,CAAC,OAAO,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;gBACtD,aAAa,EAAE,CAAC;YAClB,CAAC;YAED,wCAAwC;YACxC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;gBAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;gBACrD,SAAS,CAAC,WAAW,GAAG,YAAY,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,KAAK,IAAI,uCAAuC,CAAC;YACnH,CAAC;QACH,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,mCAAmC,CAAC;IACzD,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,sEAAsE,CAAC;IAElG,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,oBAAoB,aAAa,aAAa,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-mintlify.d.ts","sourceRoot":"","sources":["../../scripts/generate-mintlify.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Converte spec/openapi-external.json para YAML e copia para gyra-mintlify-api-docs.
|
|
4
|
+
* Substitui o openapi.yaml manual.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
const ROOT = resolve(import.meta.dirname, '..');
|
|
9
|
+
const EXTERNAL_SPEC_PATH = resolve(ROOT, 'spec', 'openapi-external.json');
|
|
10
|
+
const MINTLIFY_PATH = resolve(ROOT, '..', 'gyra-mintlify-api-docs', 'openapi.yaml');
|
|
11
|
+
/**
|
|
12
|
+
* Conversor JSON → YAML simples (sem dependencia externa).
|
|
13
|
+
* Suficiente para OpenAPI specs.
|
|
14
|
+
*/
|
|
15
|
+
function jsonToYaml(obj, indent = 0) {
|
|
16
|
+
const spaces = ' '.repeat(indent);
|
|
17
|
+
if (obj === null || obj === undefined)
|
|
18
|
+
return 'null';
|
|
19
|
+
if (typeof obj === 'boolean')
|
|
20
|
+
return String(obj);
|
|
21
|
+
if (typeof obj === 'number')
|
|
22
|
+
return String(obj);
|
|
23
|
+
if (typeof obj === 'string') {
|
|
24
|
+
// Strings com caracteres especiais precisam de aspas
|
|
25
|
+
if (obj.includes('\n') ||
|
|
26
|
+
obj.includes(':') ||
|
|
27
|
+
obj.includes('#') ||
|
|
28
|
+
obj.includes('{') ||
|
|
29
|
+
obj.includes('}') ||
|
|
30
|
+
obj.includes('[') ||
|
|
31
|
+
obj.includes(']') ||
|
|
32
|
+
obj.includes(',') ||
|
|
33
|
+
obj.includes('*') ||
|
|
34
|
+
obj.includes('&') ||
|
|
35
|
+
obj.includes('!') ||
|
|
36
|
+
obj.includes('|') ||
|
|
37
|
+
obj.includes('>') ||
|
|
38
|
+
obj.includes("'") ||
|
|
39
|
+
obj.startsWith(' ') ||
|
|
40
|
+
obj.endsWith(' ') ||
|
|
41
|
+
obj === '' ||
|
|
42
|
+
obj === 'true' ||
|
|
43
|
+
obj === 'false' ||
|
|
44
|
+
obj === 'null') {
|
|
45
|
+
// Multiline
|
|
46
|
+
if (obj.includes('\n')) {
|
|
47
|
+
const lines = obj.split('\n');
|
|
48
|
+
return `|\n${lines.map(l => `${spaces} ${l}`).join('\n')}`;
|
|
49
|
+
}
|
|
50
|
+
return `'${obj.replace(/'/g, "''")}'`;
|
|
51
|
+
}
|
|
52
|
+
return obj;
|
|
53
|
+
}
|
|
54
|
+
if (Array.isArray(obj)) {
|
|
55
|
+
if (obj.length === 0)
|
|
56
|
+
return '[]';
|
|
57
|
+
const items = obj.map(item => {
|
|
58
|
+
if (typeof item === 'object' && item !== null) {
|
|
59
|
+
const inner = jsonToYaml(item, indent + 1);
|
|
60
|
+
const firstLine = inner.split('\n')[0];
|
|
61
|
+
const rest = inner.split('\n').slice(1).join('\n');
|
|
62
|
+
return `${spaces}- ${firstLine.trim()}${rest ? '\n' + rest : ''}`;
|
|
63
|
+
}
|
|
64
|
+
return `${spaces}- ${jsonToYaml(item, indent + 1)}`;
|
|
65
|
+
});
|
|
66
|
+
return '\n' + items.join('\n');
|
|
67
|
+
}
|
|
68
|
+
if (typeof obj === 'object') {
|
|
69
|
+
const entries = Object.entries(obj);
|
|
70
|
+
if (entries.length === 0)
|
|
71
|
+
return '{}';
|
|
72
|
+
const lines = entries.map(([key, value]) => {
|
|
73
|
+
const yamlValue = jsonToYaml(value, indent + 1);
|
|
74
|
+
if (typeof value === 'object' && value !== null && !Array.isArray(value) && Object.keys(value).length > 0) {
|
|
75
|
+
return `${spaces}${key}:\n${yamlValue}`;
|
|
76
|
+
}
|
|
77
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
78
|
+
return `${spaces}${key}:${yamlValue}`;
|
|
79
|
+
}
|
|
80
|
+
return `${spaces}${key}: ${yamlValue}`;
|
|
81
|
+
});
|
|
82
|
+
return lines.join('\n');
|
|
83
|
+
}
|
|
84
|
+
return String(obj);
|
|
85
|
+
}
|
|
86
|
+
function main() {
|
|
87
|
+
if (!existsSync(EXTERNAL_SPEC_PATH)) {
|
|
88
|
+
throw new Error(`External spec not found at ${EXTERNAL_SPEC_PATH}. Run enrich-spec first.`);
|
|
89
|
+
}
|
|
90
|
+
const spec = JSON.parse(readFileSync(EXTERNAL_SPEC_PATH, 'utf-8'));
|
|
91
|
+
const yaml = jsonToYaml(spec);
|
|
92
|
+
writeFileSync(MINTLIFY_PATH, yaml);
|
|
93
|
+
console.log(`Mintlify spec generated at: ${MINTLIFY_PATH}`);
|
|
94
|
+
const pathCount = Object.keys(spec.paths || {}).length;
|
|
95
|
+
console.log(` Paths: ${pathCount}`);
|
|
96
|
+
}
|
|
97
|
+
main();
|
|
98
|
+
//# sourceMappingURL=generate-mintlify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-mintlify.js","sourceRoot":"","sources":["../../scripts/generate-mintlify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-spec.d.ts","sourceRoot":"","sources":["../../scripts/validate-spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Valida que todos os enrichments referenciam operationIds que existem na spec.
|
|
4
|
+
* Falha se um enrichment aponta para um endpoint que foi removido do gyra-core.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
import { enrichmentRegistry } from '../enrichments/index.js';
|
|
9
|
+
import { PUBLIC_OPERATION_IDS } from '../enrichments/public-endpoints.js';
|
|
10
|
+
const ROOT = resolve(import.meta.dirname, '..');
|
|
11
|
+
const RAW_PATH = resolve(ROOT, 'spec', 'openapi-raw.json');
|
|
12
|
+
function main() {
|
|
13
|
+
if (!existsSync(RAW_PATH)) {
|
|
14
|
+
throw new Error(`Raw spec not found at ${RAW_PATH}. Run fetch-spec first.`);
|
|
15
|
+
}
|
|
16
|
+
const rawSpec = JSON.parse(readFileSync(RAW_PATH, 'utf-8'));
|
|
17
|
+
// Coletar todos os operationIds da spec
|
|
18
|
+
const specOperationIds = new Set();
|
|
19
|
+
for (const [, methods] of Object.entries(rawSpec.paths)) {
|
|
20
|
+
for (const [method, operation] of Object.entries(methods)) {
|
|
21
|
+
if (method === 'parameters')
|
|
22
|
+
continue;
|
|
23
|
+
if (operation.operationId) {
|
|
24
|
+
specOperationIds.add(operation.operationId);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const errors = [];
|
|
29
|
+
const warnings = [];
|
|
30
|
+
// Validar: cada operationId na allowlist existe na spec
|
|
31
|
+
for (const opId of PUBLIC_OPERATION_IDS) {
|
|
32
|
+
if (!specOperationIds.has(opId)) {
|
|
33
|
+
errors.push(`ERRO: operationId "${opId}" esta na allowlist (public-endpoints.ts) mas NAO existe na spec do gyra-core. Endpoint foi removido?`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Validar: cada enrichment tem operationId correspondente na allowlist
|
|
37
|
+
for (const opId of Object.keys(enrichmentRegistry)) {
|
|
38
|
+
if (!PUBLIC_OPERATION_IDS.includes(opId)) {
|
|
39
|
+
warnings.push(`WARN: enrichment para "${opId}" existe mas NAO esta na allowlist. Adicione em public-endpoints.ts ou remova o enrichment.`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Validar: cada operationId na allowlist tem enrichment
|
|
43
|
+
for (const opId of PUBLIC_OPERATION_IDS) {
|
|
44
|
+
if (!enrichmentRegistry[opId]) {
|
|
45
|
+
warnings.push(`WARN: operationId "${opId}" esta na allowlist mas NAO tem enrichment. Tool tera descricao basica.`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Report
|
|
49
|
+
console.log(`\nValidation Report:`);
|
|
50
|
+
console.log(` Spec operations: ${specOperationIds.size}`);
|
|
51
|
+
console.log(` Public allowlist: ${PUBLIC_OPERATION_IDS.length}`);
|
|
52
|
+
console.log(` Enrichments: ${Object.keys(enrichmentRegistry).length}`);
|
|
53
|
+
if (warnings.length > 0) {
|
|
54
|
+
console.log(`\nWarnings (${warnings.length}):`);
|
|
55
|
+
for (const w of warnings)
|
|
56
|
+
console.log(` ${w}`);
|
|
57
|
+
}
|
|
58
|
+
if (errors.length > 0) {
|
|
59
|
+
console.log(`\nErrors (${errors.length}):`);
|
|
60
|
+
for (const e of errors)
|
|
61
|
+
console.error(` ${e}`);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
console.log(`\nValidation passed.`);
|
|
65
|
+
}
|
|
66
|
+
main();
|
|
67
|
+
//# sourceMappingURL=validate-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-spec.js","sourceRoot":"","sources":["../../scripts/validate-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gerenciamento de JWT — acquire, cache e refresh automatico.
|
|
3
|
+
* Baseado no padrao do n8n-nodes-gyramais/GenericFunctions.ts
|
|
4
|
+
*/
|
|
5
|
+
import type { GyraConfig } from './config.js';
|
|
6
|
+
export declare class GyraAuth {
|
|
7
|
+
private token;
|
|
8
|
+
private tokenExpiresAt;
|
|
9
|
+
private config;
|
|
10
|
+
constructor(config: GyraConfig);
|
|
11
|
+
getToken(): Promise<string>;
|
|
12
|
+
private authenticate;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAUxB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;YAenB,YAAY;CA8B3B"}
|
package/dist/src/auth.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export class GyraAuth {
|
|
2
|
+
token = null;
|
|
3
|
+
tokenExpiresAt = 0;
|
|
4
|
+
config;
|
|
5
|
+
constructor(config) {
|
|
6
|
+
this.config = config;
|
|
7
|
+
// Se tem access token estatico, usar direto
|
|
8
|
+
if (config.accessToken) {
|
|
9
|
+
this.token = config.accessToken;
|
|
10
|
+
this.tokenExpiresAt = Infinity; // Nao expira (gerenciado externamente)
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
async getToken() {
|
|
14
|
+
// Token estatico
|
|
15
|
+
if (this.config.accessToken) {
|
|
16
|
+
return this.config.accessToken;
|
|
17
|
+
}
|
|
18
|
+
// Token cacheado ainda valido (com buffer de 60s)
|
|
19
|
+
if (this.token && Date.now() < this.tokenExpiresAt - 60_000) {
|
|
20
|
+
return this.token;
|
|
21
|
+
}
|
|
22
|
+
// Renovar via client credentials
|
|
23
|
+
return this.authenticate();
|
|
24
|
+
}
|
|
25
|
+
async authenticate() {
|
|
26
|
+
const url = `${this.config.baseUrl}/auth/authenticate`;
|
|
27
|
+
const response = await fetch(url, {
|
|
28
|
+
method: 'POST',
|
|
29
|
+
headers: {
|
|
30
|
+
'Content-Type': 'application/json',
|
|
31
|
+
'gyra-client-id': this.config.clientId,
|
|
32
|
+
'gyra-client-secret': this.config.clientSecret,
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
const body = await response.text();
|
|
37
|
+
throw new Error(`Falha na autenticacao (${response.status}): ${body}`);
|
|
38
|
+
}
|
|
39
|
+
const data = await response.json();
|
|
40
|
+
if (!data.accessToken) {
|
|
41
|
+
throw new Error('Resposta de autenticacao invalida: accessToken ausente.');
|
|
42
|
+
}
|
|
43
|
+
this.token = data.accessToken;
|
|
44
|
+
// Default 1h se expiresIn nao informado
|
|
45
|
+
const expiresInMs = (data.expiresIn || 3600) * 1000;
|
|
46
|
+
this.tokenExpiresAt = Date.now() + expiresInMs;
|
|
47
|
+
return this.token;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,QAAQ;IACX,KAAK,GAAkB,IAAI,CAAC;IAC5B,cAAc,GAAW,CAAC,CAAC;IAC3B,MAAM,CAAa;IAE3B,YAAY,MAAkB;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,4CAA4C;QAC5C,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;YAChC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,CAAC,uCAAuC;QACzE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,iBAAiB;QACjB,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACjC,CAAC;QAED,kDAAkD;QAClD,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,GAAG,MAAM,EAAE,CAAC;YAC5D,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAED,iCAAiC;QACjC,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,oBAAoB,CAAC;QAEvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,QAAS;gBACvC,oBAAoB,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa;aAChD;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,IAAI,GAAQ,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAExC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9B,wCAAwC;QACxC,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;QACpD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;QAE/C,OAAO,IAAI,CAAC,KAAM,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client para chamadas ao gyra-core.
|
|
3
|
+
* Adiciona JWT automaticamente via GyraAuth.
|
|
4
|
+
*/
|
|
5
|
+
import type { GyraAuth } from './auth.js';
|
|
6
|
+
import type { GyraConfig } from './config.js';
|
|
7
|
+
export interface ApiResponse {
|
|
8
|
+
status: number;
|
|
9
|
+
data: any;
|
|
10
|
+
ok: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare class GyraClient {
|
|
13
|
+
private auth;
|
|
14
|
+
private baseUrl;
|
|
15
|
+
constructor(config: GyraConfig, auth: GyraAuth);
|
|
16
|
+
request(method: string, path: string, options?: {
|
|
17
|
+
body?: any;
|
|
18
|
+
query?: Record<string, string>;
|
|
19
|
+
headers?: Record<string, string>;
|
|
20
|
+
}): Promise<ApiResponse>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,GAAG,CAAC;IACV,EAAE,EAAE,OAAO,CAAC;CACb;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ;IAKxC,OAAO,CACX,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GACA,OAAO,CAAC,WAAW,CAAC;CA+CxB"}
|