@mcpassure/mcp-anvisa-bulario 0.0.1 → 2.0.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 +21 -0
- package/README.en.md +196 -0
- package/README.md +192 -5
- package/dist/bootstrap.d.ts +11 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +120 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/cache/sqlite-cache.d.ts +13 -0
- package/dist/cache/sqlite-cache.d.ts.map +1 -0
- package/dist/cache/sqlite-cache.js +58 -0
- package/dist/cache/sqlite-cache.js.map +1 -0
- package/dist/cache/types.d.ts +17 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +7 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +16 -0
- package/dist/config.js.map +1 -0
- package/dist/db/dataset.d.ts +15 -0
- package/dist/db/dataset.d.ts.map +1 -0
- package/dist/db/dataset.js +168 -0
- package/dist/db/dataset.js.map +1 -0
- package/dist/db/schema.d.ts +11 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +48 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/domain/repository.d.ts +53 -0
- package/dist/domain/repository.d.ts.map +1 -0
- package/dist/domain/repository.js +68 -0
- package/dist/domain/repository.js.map +1 -0
- package/dist/domain/types.d.ts +2 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +2 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/handlers.d.ts +24 -0
- package/dist/prompts/handlers.d.ts.map +1 -0
- package/dist/prompts/handlers.js +267 -0
- package/dist/prompts/handlers.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +35 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/schemas.d.ts +22 -0
- package/dist/prompts/schemas.d.ts.map +1 -0
- package/dist/prompts/schemas.js +15 -0
- package/dist/prompts/schemas.js.map +1 -0
- package/dist/resources/handlers.d.ts +5 -0
- package/dist/resources/handlers.d.ts.map +1 -0
- package/dist/resources/handlers.js +145 -0
- package/dist/resources/handlers.js.map +1 -0
- package/dist/resources/index.d.ts +4 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +48 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/schemas/tools.d.ts +134 -0
- package/dist/schemas/tools.d.ts.map +1 -0
- package/dist/schemas/tools.js +106 -0
- package/dist/schemas/tools.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +25 -0
- package/dist/server.js.map +1 -0
- package/dist/sources/anvisa-api.d.ts +25 -0
- package/dist/sources/anvisa-api.d.ts.map +1 -0
- package/dist/sources/anvisa-api.js +153 -0
- package/dist/sources/anvisa-api.js.map +1 -0
- package/dist/sources/anvisa-dados-abertos.d.ts +12 -0
- package/dist/sources/anvisa-dados-abertos.d.ts.map +1 -0
- package/dist/sources/anvisa-dados-abertos.js +27 -0
- package/dist/sources/anvisa-dados-abertos.js.map +1 -0
- package/dist/sources/anvisa-portal.d.ts +12 -0
- package/dist/sources/anvisa-portal.d.ts.map +1 -0
- package/dist/sources/anvisa-portal.js +27 -0
- package/dist/sources/anvisa-portal.js.map +1 -0
- package/dist/sources/types.d.ts +56 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +2 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/tools/buscar-por-classe-terapeutica.d.ts +4 -0
- package/dist/tools/buscar-por-classe-terapeutica.d.ts.map +1 -0
- package/dist/tools/buscar-por-classe-terapeutica.js +30 -0
- package/dist/tools/buscar-por-classe-terapeutica.js.map +1 -0
- package/dist/tools/buscar-por-nome.d.ts +4 -0
- package/dist/tools/buscar-por-nome.d.ts.map +1 -0
- package/dist/tools/buscar-por-nome.js +25 -0
- package/dist/tools/buscar-por-nome.js.map +1 -0
- package/dist/tools/buscar-por-principio-ativo.d.ts +4 -0
- package/dist/tools/buscar-por-principio-ativo.d.ts.map +1 -0
- package/dist/tools/buscar-por-principio-ativo.js +25 -0
- package/dist/tools/buscar-por-principio-ativo.js.map +1 -0
- package/dist/tools/consultar-bula.d.ts +14 -0
- package/dist/tools/consultar-bula.d.ts.map +1 -0
- package/dist/tools/consultar-bula.js +60 -0
- package/dist/tools/consultar-bula.js.map +1 -0
- package/dist/tools/filtrar-por-tarja.d.ts +4 -0
- package/dist/tools/filtrar-por-tarja.d.ts.map +1 -0
- package/dist/tools/filtrar-por-tarja.js +29 -0
- package/dist/tools/filtrar-por-tarja.js.map +1 -0
- package/dist/tools/listar-apresentacoes.d.ts +11 -0
- package/dist/tools/listar-apresentacoes.d.ts.map +1 -0
- package/dist/tools/listar-apresentacoes.js +52 -0
- package/dist/tools/listar-apresentacoes.js.map +1 -0
- package/dist/tools/shared.d.ts +106 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +74 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/utils/backoff.d.ts +8 -0
- package/dist/utils/backoff.d.ts.map +1 -0
- package/dist/utils/backoff.js +37 -0
- package/dist/utils/backoff.js.map +1 -0
- package/dist/utils/http.d.ts +24 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +23 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/meta.d.ts +8 -0
- package/dist/utils/meta.d.ts.map +1 -0
- package/dist/utils/meta.js +13 -0
- package/dist/utils/meta.js.map +1 -0
- package/dist/utils/playwright-http.d.ts +2 -0
- package/dist/utils/playwright-http.d.ts.map +1 -0
- package/dist/utils/playwright-http.js +4 -0
- package/dist/utils/playwright-http.js.map +1 -0
- package/package.json +68 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,aAAa,EAAE,KAAK;IACpB,mBAAmB,EAAE,MAAM;IAC3B,UAAU,EAAE,OAAO;IACnB,QAAQ,EAAE,MAAM;CACR,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* config.ts — v2.0
|
|
3
|
+
*
|
|
4
|
+
* Configuração simplificada. O dataset agora é gerenciado pelo bootstrap.ts (R2)
|
|
5
|
+
* ou pelo script sync.ts (CSV direto da ANVISA).
|
|
6
|
+
*
|
|
7
|
+
* Paths migrados:
|
|
8
|
+
* ~/.local/share/mcpassure-anvisa/ → ~/.local/share/mcpassure/anvisa-bulario/
|
|
9
|
+
* %APPDATA%/mcpassure-anvisa/ → %APPDATA%/mcpassure/anvisa-bulario/
|
|
10
|
+
*/
|
|
11
|
+
export type Config = {
|
|
12
|
+
degradedThresholdDays: number;
|
|
13
|
+
};
|
|
14
|
+
export declare function loadConfig(): Config;
|
|
15
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,MAAM,GAAG;IACnB,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,wBAAgB,UAAU,IAAI,MAAM,CAOnC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* config.ts — v2.0
|
|
3
|
+
*
|
|
4
|
+
* Configuração simplificada. O dataset agora é gerenciado pelo bootstrap.ts (R2)
|
|
5
|
+
* ou pelo script sync.ts (CSV direto da ANVISA).
|
|
6
|
+
*
|
|
7
|
+
* Paths migrados:
|
|
8
|
+
* ~/.local/share/mcpassure-anvisa/ → ~/.local/share/mcpassure/anvisa-bulario/
|
|
9
|
+
* %APPDATA%/mcpassure-anvisa/ → %APPDATA%/mcpassure/anvisa-bulario/
|
|
10
|
+
*/
|
|
11
|
+
export function loadConfig() {
|
|
12
|
+
return {
|
|
13
|
+
degradedThresholdDays: Number.parseInt(process.env.MCPASSURE_DEGRADED_THRESHOLD_DAYS ?? "7", 10),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,qBAAqB,EAAE,MAAM,CAAC,QAAQ,CACpC,OAAO,CAAC,GAAG,CAAC,iCAAiC,IAAI,GAAG,EACpD,EAAE,CACH;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Apresentacao, BulaLink, BularioSource, MedicamentoDetalhes, MedicamentoResumo, SearchByClasseTerapeuticaParams, SearchByNameParams, SearchByPrincipalAtivoParams, SearchByTarjaParams } from "../sources/types.js";
|
|
2
|
+
export declare class BularioDatasetSource implements BularioSource {
|
|
3
|
+
readonly name = "anvisa_dados_abertos_sqlite";
|
|
4
|
+
private readonly db;
|
|
5
|
+
constructor(dbPath: string);
|
|
6
|
+
searchByName(params: SearchByNameParams): Promise<MedicamentoResumo[]>;
|
|
7
|
+
searchByPrincipalAtivo(params: SearchByPrincipalAtivoParams): Promise<MedicamentoResumo[]>;
|
|
8
|
+
searchByClasseTerapeutica(params: SearchByClasseTerapeuticaParams): Promise<MedicamentoResumo[]>;
|
|
9
|
+
searchByTarja(params: SearchByTarjaParams): Promise<MedicamentoResumo[]>;
|
|
10
|
+
getDetalhes(numProcesso: string): Promise<MedicamentoDetalhes>;
|
|
11
|
+
getApresentacoes(numProcesso: string): Promise<Apresentacao[]>;
|
|
12
|
+
getBulaLink(_idBulaProtegido: string): Promise<BulaLink>;
|
|
13
|
+
close(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=dataset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset.d.ts","sourceRoot":"","sources":["../../src/db/dataset.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,+BAA+B,EAC/B,kBAAkB,EAClB,4BAA4B,EAC5B,mBAAmB,EAEpB,MAAM,qBAAqB,CAAC;AA+D7B,qBAAa,oBAAqB,YAAW,aAAa;IACxD,QAAQ,CAAC,IAAI,iCAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;gBAE3B,MAAM,EAAE,MAAM;IAK1B,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAgBtE,sBAAsB,CAAC,MAAM,EAAE,4BAA4B,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAgB1F,yBAAyB,CAAC,MAAM,EAAE,+BAA+B,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAgBhG,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAwCxE,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkB9D,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAiC9D,WAAW,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAKxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAIvB"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
// ── Tarja normalisation ───────────────────────────────────────────────────────
|
|
3
|
+
// v2.0: CATEGORIA_REGULATORIA no CSV não mapeia diretamente para LIVRE/VERMELHA/PRETA.
|
|
4
|
+
// As categorias reais do CSV são: "Similar", "Novo", "Genérico", "BAIXO RISCO", etc.
|
|
5
|
+
// O campo tarja (da Portaria 344/98) NÃO está disponível no CSV de dados abertos.
|
|
6
|
+
// Mapeamos heuristicamente pelo tipo de produto e categoria para fins de filtragem.
|
|
7
|
+
const TARJA_KEYWORDS = [
|
|
8
|
+
{ pattern: /psicotr[oó]pic|entorpecente|controle especial/i, tarja: "PRETA" },
|
|
9
|
+
{ pattern: /antimicrobiano|antibiótico|antibi[oó]tic/i, tarja: "VERMELHA" },
|
|
10
|
+
{ pattern: /baixo risco|isento/i, tarja: "LIVRE" },
|
|
11
|
+
];
|
|
12
|
+
function inferTarja(row) {
|
|
13
|
+
const text = [row.categoria_regulatoria, row.classe_terapeutica].filter(Boolean).join(" ");
|
|
14
|
+
for (const { pattern, tarja } of TARJA_KEYWORDS) {
|
|
15
|
+
if (pattern.test(text))
|
|
16
|
+
return tarja;
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
function rowToResumo(row) {
|
|
21
|
+
return {
|
|
22
|
+
numProcesso: row.numero_processo ?? row.numero_registro ?? String(row.rowid),
|
|
23
|
+
nomeProduto: row.nome_produto,
|
|
24
|
+
empresa: row.empresa ?? "",
|
|
25
|
+
dataAtualizacao: row.data_finalizacao ?? undefined,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function rowToDetalhes(row) {
|
|
29
|
+
return {
|
|
30
|
+
numProcesso: row.numero_processo ?? row.numero_registro ?? String(row.rowid),
|
|
31
|
+
nomeProduto: row.nome_produto,
|
|
32
|
+
empresa: row.empresa ?? "",
|
|
33
|
+
dataAtualizacao: row.data_finalizacao ?? undefined,
|
|
34
|
+
tarja: inferTarja(row),
|
|
35
|
+
classesTerapeuticas: row.classe_terapeutica ? [row.classe_terapeutica] : undefined,
|
|
36
|
+
principioAtivo: row.principio_ativo ?? undefined,
|
|
37
|
+
numeroRegistro: row.numero_registro ?? undefined,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// ── BularioDatasetSource ──────────────────────────────────────────────────────
|
|
41
|
+
export class BularioDatasetSource {
|
|
42
|
+
name = "anvisa_dados_abertos_sqlite";
|
|
43
|
+
db;
|
|
44
|
+
constructor(dbPath) {
|
|
45
|
+
this.db = new Database(dbPath, { readonly: true });
|
|
46
|
+
this.db.pragma("journal_mode = WAL");
|
|
47
|
+
}
|
|
48
|
+
searchByName(params) {
|
|
49
|
+
const { nome, pagina = 1, count = 10 } = params;
|
|
50
|
+
const offset = (pagina - 1) * count;
|
|
51
|
+
const term = `%${nome}%`;
|
|
52
|
+
const rows = this.db
|
|
53
|
+
.prepare(`SELECT rowid, * FROM medicamentos
|
|
54
|
+
WHERE nome_produto LIKE ? COLLATE NOCASE
|
|
55
|
+
LIMIT ? OFFSET ?`)
|
|
56
|
+
.all(term, count, offset);
|
|
57
|
+
return Promise.resolve(rows.map(rowToResumo));
|
|
58
|
+
}
|
|
59
|
+
searchByPrincipalAtivo(params) {
|
|
60
|
+
const { principioAtivo, pagina = 1, count = 10 } = params;
|
|
61
|
+
const offset = (pagina - 1) * count;
|
|
62
|
+
const term = `%${principioAtivo}%`;
|
|
63
|
+
const rows = this.db
|
|
64
|
+
.prepare(`SELECT rowid, * FROM medicamentos
|
|
65
|
+
WHERE principio_ativo LIKE ? COLLATE NOCASE
|
|
66
|
+
LIMIT ? OFFSET ?`)
|
|
67
|
+
.all(term, count, offset);
|
|
68
|
+
return Promise.resolve(rows.map(rowToResumo));
|
|
69
|
+
}
|
|
70
|
+
searchByClasseTerapeutica(params) {
|
|
71
|
+
const { classeTerapeutica, pagina = 1, count = 10 } = params;
|
|
72
|
+
const offset = (pagina - 1) * count;
|
|
73
|
+
const term = `%${classeTerapeutica}%`;
|
|
74
|
+
const rows = this.db
|
|
75
|
+
.prepare(`SELECT rowid, * FROM medicamentos
|
|
76
|
+
WHERE classe_terapeutica LIKE ? COLLATE NOCASE
|
|
77
|
+
LIMIT ? OFFSET ?`)
|
|
78
|
+
.all(term, count, offset);
|
|
79
|
+
return Promise.resolve(rows.map(rowToResumo));
|
|
80
|
+
}
|
|
81
|
+
searchByTarja(params) {
|
|
82
|
+
const { tarja, pagina = 1, count = 10 } = params;
|
|
83
|
+
const offset = (pagina - 1) * count;
|
|
84
|
+
// Heuristic tarja mapping — see inferTarja above
|
|
85
|
+
let whereClause;
|
|
86
|
+
let _bindValue;
|
|
87
|
+
if (tarja === "PRETA") {
|
|
88
|
+
whereClause =
|
|
89
|
+
"(classe_terapeutica LIKE ? OR categoria_regulatoria LIKE ?) " +
|
|
90
|
+
"AND (classe_terapeutica LIKE '%PSICOTR%' OR classe_terapeutica LIKE '%ENTORP%' OR " +
|
|
91
|
+
"classe_terapeutica LIKE '%CONTROLE ESPECIAL%')";
|
|
92
|
+
_bindValue = "%";
|
|
93
|
+
}
|
|
94
|
+
else if (tarja === "VERMELHA") {
|
|
95
|
+
whereClause =
|
|
96
|
+
"(classe_terapeutica LIKE '%ANTIMICROBIANO%' OR classe_terapeutica LIKE '%ANTIBI%' " +
|
|
97
|
+
"OR categoria_regulatoria IN ('Similar', 'Novo', 'Genérico', 'Biológico')) " +
|
|
98
|
+
"AND (classe_terapeutica NOT LIKE '%PSICOTR%')";
|
|
99
|
+
_bindValue = "%";
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// LIVRE — baixo risco
|
|
103
|
+
whereClause =
|
|
104
|
+
"categoria_regulatoria LIKE '%BAIXO RISCO%' OR categoria_regulatoria LIKE '%ISENTO%'";
|
|
105
|
+
_bindValue = "%";
|
|
106
|
+
}
|
|
107
|
+
let rows;
|
|
108
|
+
if (tarja === "VERMELHA" || tarja === "PRETA") {
|
|
109
|
+
rows = this.db
|
|
110
|
+
.prepare(`SELECT rowid, * FROM medicamentos WHERE ${whereClause} LIMIT ? OFFSET ?`)
|
|
111
|
+
.all(count, offset);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
rows = this.db
|
|
115
|
+
.prepare(`SELECT rowid, * FROM medicamentos WHERE ${whereClause} LIMIT ? OFFSET ?`)
|
|
116
|
+
.all(count, offset);
|
|
117
|
+
}
|
|
118
|
+
return Promise.resolve(rows.map(rowToResumo));
|
|
119
|
+
}
|
|
120
|
+
getDetalhes(numProcesso) {
|
|
121
|
+
const row = (this.db
|
|
122
|
+
.prepare(`SELECT rowid, * FROM medicamentos
|
|
123
|
+
WHERE numero_processo = ? OR numero_registro = ?
|
|
124
|
+
LIMIT 1`)
|
|
125
|
+
.get(numProcesso, numProcesso) ?? null);
|
|
126
|
+
if (!row) {
|
|
127
|
+
return Promise.reject(new Error(`Medicamento não encontrado para numProcesso: ${numProcesso}`));
|
|
128
|
+
}
|
|
129
|
+
return Promise.resolve(rowToDetalhes(row));
|
|
130
|
+
}
|
|
131
|
+
getApresentacoes(numProcesso) {
|
|
132
|
+
// O CSV de dados abertos não contém apresentações detalhadas.
|
|
133
|
+
// Retornamos a categoria regulatória como informação disponível.
|
|
134
|
+
const row = (this.db
|
|
135
|
+
.prepare(`SELECT rowid, * FROM medicamentos
|
|
136
|
+
WHERE numero_processo = ? OR numero_registro = ?
|
|
137
|
+
LIMIT 1`)
|
|
138
|
+
.get(numProcesso, numProcesso) ?? null);
|
|
139
|
+
if (!row)
|
|
140
|
+
return Promise.resolve([]);
|
|
141
|
+
const apresentacoes = [];
|
|
142
|
+
if (row.categoria_regulatoria) {
|
|
143
|
+
apresentacoes.push({
|
|
144
|
+
descricao: `Categoria: ${row.categoria_regulatoria}`,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
if (row.situacao_registro) {
|
|
148
|
+
apresentacoes.push({
|
|
149
|
+
descricao: `Situação: ${row.situacao_registro}`,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
if (row.principio_ativo) {
|
|
153
|
+
apresentacoes.push({
|
|
154
|
+
descricao: `Princípio Ativo: ${row.principio_ativo}`,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return Promise.resolve(apresentacoes);
|
|
158
|
+
}
|
|
159
|
+
getBulaLink(_idBulaProtegido) {
|
|
160
|
+
// Não disponível no CSV de dados abertos (v2.0 — texto completo em v2.1 via Worker)
|
|
161
|
+
return Promise.resolve({ id: _idBulaProtegido });
|
|
162
|
+
}
|
|
163
|
+
close() {
|
|
164
|
+
this.db.close();
|
|
165
|
+
return Promise.resolve();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=dataset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset.js","sourceRoot":"","sources":["../../src/db/dataset.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema SQLite para o dataset ANVISA Dados Abertos — Medicamentos
|
|
3
|
+
* Fonte: https://dados.anvisa.gov.br/dados/DADOS_ABERTOS_MEDICAMENTOS.csv
|
|
4
|
+
* Colunas CSV (separador `;`, encoding Latin1/ISO-8859-1):
|
|
5
|
+
* TIPO_PRODUTO; NOME_PRODUTO; DATA_FINALIZACAO_PROCESSO; CATEGORIA_REGULATORIA;
|
|
6
|
+
* NUMERO_REGISTRO_PRODUTO; DATA_VENCIMENTO_REGISTRO; NUMERO_PROCESSO;
|
|
7
|
+
* CLASSE_TERAPEUTICA; EMPRESA_DETENTORA_REGISTRO; SITUACAO_REGISTRO; PRINCIPIO_ATIVO
|
|
8
|
+
*/
|
|
9
|
+
export declare const SCHEMA_SQL = "\nPRAGMA journal_mode=WAL;\n\nCREATE TABLE IF NOT EXISTS medicamentos (\n rowid INTEGER PRIMARY KEY AUTOINCREMENT,\n tipo_produto TEXT,\n nome_produto TEXT NOT NULL,\n data_finalizacao TEXT,\n categoria_regulatoria TEXT,\n numero_registro TEXT,\n data_vencimento TEXT,\n numero_processo TEXT,\n classe_terapeutica TEXT,\n empresa TEXT,\n situacao_registro TEXT,\n principio_ativo TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_nome ON medicamentos(nome_produto COLLATE NOCASE);\nCREATE INDEX IF NOT EXISTS idx_principio ON medicamentos(principio_ativo COLLATE NOCASE);\nCREATE INDEX IF NOT EXISTS idx_classe ON medicamentos(classe_terapeutica COLLATE NOCASE);\nCREATE INDEX IF NOT EXISTS idx_empresa ON medicamentos(empresa COLLATE NOCASE);\nCREATE INDEX IF NOT EXISTS idx_num_processo ON medicamentos(numero_processo);\nCREATE INDEX IF NOT EXISTS idx_situacao ON medicamentos(situacao_registro);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS medicamentos_fts USING fts5(\n nome_produto,\n principio_ativo,\n classe_terapeutica,\n content='medicamentos',\n content_rowid='rowid'\n);\n\nCREATE TABLE IF NOT EXISTS dataset_meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n";
|
|
10
|
+
export declare const SCHEMA_VERSION = "2";
|
|
11
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,UAAU,4vCAqCtB,CAAC;AAEF,eAAO,MAAM,cAAc,MAAM,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema SQLite para o dataset ANVISA Dados Abertos — Medicamentos
|
|
3
|
+
* Fonte: https://dados.anvisa.gov.br/dados/DADOS_ABERTOS_MEDICAMENTOS.csv
|
|
4
|
+
* Colunas CSV (separador `;`, encoding Latin1/ISO-8859-1):
|
|
5
|
+
* TIPO_PRODUTO; NOME_PRODUTO; DATA_FINALIZACAO_PROCESSO; CATEGORIA_REGULATORIA;
|
|
6
|
+
* NUMERO_REGISTRO_PRODUTO; DATA_VENCIMENTO_REGISTRO; NUMERO_PROCESSO;
|
|
7
|
+
* CLASSE_TERAPEUTICA; EMPRESA_DETENTORA_REGISTRO; SITUACAO_REGISTRO; PRINCIPIO_ATIVO
|
|
8
|
+
*/
|
|
9
|
+
export const SCHEMA_SQL = `
|
|
10
|
+
PRAGMA journal_mode=WAL;
|
|
11
|
+
|
|
12
|
+
CREATE TABLE IF NOT EXISTS medicamentos (
|
|
13
|
+
rowid INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
14
|
+
tipo_produto TEXT,
|
|
15
|
+
nome_produto TEXT NOT NULL,
|
|
16
|
+
data_finalizacao TEXT,
|
|
17
|
+
categoria_regulatoria TEXT,
|
|
18
|
+
numero_registro TEXT,
|
|
19
|
+
data_vencimento TEXT,
|
|
20
|
+
numero_processo TEXT,
|
|
21
|
+
classe_terapeutica TEXT,
|
|
22
|
+
empresa TEXT,
|
|
23
|
+
situacao_registro TEXT,
|
|
24
|
+
principio_ativo TEXT
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
CREATE INDEX IF NOT EXISTS idx_nome ON medicamentos(nome_produto COLLATE NOCASE);
|
|
28
|
+
CREATE INDEX IF NOT EXISTS idx_principio ON medicamentos(principio_ativo COLLATE NOCASE);
|
|
29
|
+
CREATE INDEX IF NOT EXISTS idx_classe ON medicamentos(classe_terapeutica COLLATE NOCASE);
|
|
30
|
+
CREATE INDEX IF NOT EXISTS idx_empresa ON medicamentos(empresa COLLATE NOCASE);
|
|
31
|
+
CREATE INDEX IF NOT EXISTS idx_num_processo ON medicamentos(numero_processo);
|
|
32
|
+
CREATE INDEX IF NOT EXISTS idx_situacao ON medicamentos(situacao_registro);
|
|
33
|
+
|
|
34
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS medicamentos_fts USING fts5(
|
|
35
|
+
nome_produto,
|
|
36
|
+
principio_ativo,
|
|
37
|
+
classe_terapeutica,
|
|
38
|
+
content='medicamentos',
|
|
39
|
+
content_rowid='rowid'
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
CREATE TABLE IF NOT EXISTS dataset_meta (
|
|
43
|
+
key TEXT PRIMARY KEY,
|
|
44
|
+
value TEXT NOT NULL
|
|
45
|
+
);
|
|
46
|
+
`;
|
|
47
|
+
export const SCHEMA_VERSION = "2";
|
|
48
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCzB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Apresentacao, BulaLink, BularioSource, MedicamentoDetalhes, MedicamentoResumo, SearchByClasseTerapeuticaParams, SearchByNameParams, SearchByPrincipalAtivoParams, SearchByTarjaParams } from "../sources/types.js";
|
|
2
|
+
export type Meta = {
|
|
3
|
+
data_da_base: string;
|
|
4
|
+
fonte: string;
|
|
5
|
+
defasagem_dias: number;
|
|
6
|
+
modo: "cache_local" | "online";
|
|
7
|
+
status?: "ok" | "stale";
|
|
8
|
+
};
|
|
9
|
+
export type ResponseWithMeta<T> = {
|
|
10
|
+
data: T;
|
|
11
|
+
_meta: Meta;
|
|
12
|
+
};
|
|
13
|
+
export declare class AllSourcesFailedError extends Error {
|
|
14
|
+
readonly failures: Array<{
|
|
15
|
+
source: string;
|
|
16
|
+
error: Error;
|
|
17
|
+
}>;
|
|
18
|
+
constructor(failures: Array<{
|
|
19
|
+
source: string;
|
|
20
|
+
error: Error;
|
|
21
|
+
}>);
|
|
22
|
+
}
|
|
23
|
+
export interface IBularioRepository {
|
|
24
|
+
searchByName(params: SearchByNameParams): Promise<ResponseWithMeta<MedicamentoResumo[]>>;
|
|
25
|
+
searchByPrincipalAtivo(params: SearchByPrincipalAtivoParams): Promise<ResponseWithMeta<MedicamentoResumo[]>>;
|
|
26
|
+
searchByClasseTerapeutica(params: SearchByClasseTerapeuticaParams): Promise<ResponseWithMeta<MedicamentoResumo[]>>;
|
|
27
|
+
searchByTarja(params: SearchByTarjaParams): Promise<ResponseWithMeta<MedicamentoResumo[]>>;
|
|
28
|
+
getDetalhes(numProcesso: string): Promise<ResponseWithMeta<MedicamentoDetalhes>>;
|
|
29
|
+
getApresentacoes(numProcesso: string): Promise<ResponseWithMeta<Apresentacao[]>>;
|
|
30
|
+
getBulaLink(idBulaProtegido: string): Promise<ResponseWithMeta<BulaLink>>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* BularioRepository v2.0
|
|
34
|
+
*
|
|
35
|
+
* Accesses the ANVISA dataset directly via BularioDatasetSource (SQLite).
|
|
36
|
+
* The old multi-source + cache pattern is replaced by a single SQLite source.
|
|
37
|
+
* _meta.modo is always "cache_local" (data is pre-synced locally).
|
|
38
|
+
*/
|
|
39
|
+
export declare class BularioRepository implements IBularioRepository {
|
|
40
|
+
private readonly source;
|
|
41
|
+
private readonly degradedThresholdDays;
|
|
42
|
+
private readonly dataBase;
|
|
43
|
+
constructor(source: BularioSource, degradedThresholdDays?: number);
|
|
44
|
+
private buildResponse;
|
|
45
|
+
searchByName(params: SearchByNameParams): Promise<ResponseWithMeta<MedicamentoResumo[]>>;
|
|
46
|
+
searchByPrincipalAtivo(params: SearchByPrincipalAtivoParams): Promise<ResponseWithMeta<MedicamentoResumo[]>>;
|
|
47
|
+
searchByClasseTerapeutica(params: SearchByClasseTerapeuticaParams): Promise<ResponseWithMeta<MedicamentoResumo[]>>;
|
|
48
|
+
searchByTarja(params: SearchByTarjaParams): Promise<ResponseWithMeta<MedicamentoResumo[]>>;
|
|
49
|
+
getDetalhes(numProcesso: string): Promise<ResponseWithMeta<MedicamentoDetalhes>>;
|
|
50
|
+
getApresentacoes(numProcesso: string): Promise<ResponseWithMeta<Apresentacao[]>>;
|
|
51
|
+
getBulaLink(idBulaProtegido: string): Promise<ResponseWithMeta<BulaLink>>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/domain/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { buildMeta } from "../utils/meta.js";
|
|
2
|
+
export class AllSourcesFailedError extends Error {
|
|
3
|
+
failures;
|
|
4
|
+
constructor(failures) {
|
|
5
|
+
const detail = failures.map((f) => `${f.source}: ${f.error.message}`).join("; ");
|
|
6
|
+
super(`Todas as fontes falharam. ${detail}`);
|
|
7
|
+
this.name = "AllSourcesFailedError";
|
|
8
|
+
this.failures = failures;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* BularioRepository v2.0
|
|
13
|
+
*
|
|
14
|
+
* Accesses the ANVISA dataset directly via BularioDatasetSource (SQLite).
|
|
15
|
+
* The old multi-source + cache pattern is replaced by a single SQLite source.
|
|
16
|
+
* _meta.modo is always "cache_local" (data is pre-synced locally).
|
|
17
|
+
*/
|
|
18
|
+
export class BularioRepository {
|
|
19
|
+
source;
|
|
20
|
+
degradedThresholdDays;
|
|
21
|
+
dataBase;
|
|
22
|
+
constructor(source, degradedThresholdDays = 7) {
|
|
23
|
+
this.source = source;
|
|
24
|
+
this.degradedThresholdDays = degradedThresholdDays;
|
|
25
|
+
// Use current date as data_da_base — will be replaced by dataset_meta in a future version
|
|
26
|
+
this.dataBase = new Date().toISOString();
|
|
27
|
+
}
|
|
28
|
+
buildResponse(data) {
|
|
29
|
+
return {
|
|
30
|
+
data,
|
|
31
|
+
_meta: buildMeta({
|
|
32
|
+
dataBase: this.dataBase,
|
|
33
|
+
fonte: this.source.name,
|
|
34
|
+
modo: "cache_local",
|
|
35
|
+
degradedThresholdDays: this.degradedThresholdDays,
|
|
36
|
+
}),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async searchByName(params) {
|
|
40
|
+
const data = await this.source.searchByName(params);
|
|
41
|
+
return this.buildResponse(data);
|
|
42
|
+
}
|
|
43
|
+
async searchByPrincipalAtivo(params) {
|
|
44
|
+
const data = await this.source.searchByPrincipalAtivo(params);
|
|
45
|
+
return this.buildResponse(data);
|
|
46
|
+
}
|
|
47
|
+
async searchByClasseTerapeutica(params) {
|
|
48
|
+
const data = await this.source.searchByClasseTerapeutica(params);
|
|
49
|
+
return this.buildResponse(data);
|
|
50
|
+
}
|
|
51
|
+
async searchByTarja(params) {
|
|
52
|
+
const data = await this.source.searchByTarja(params);
|
|
53
|
+
return this.buildResponse(data);
|
|
54
|
+
}
|
|
55
|
+
async getDetalhes(numProcesso) {
|
|
56
|
+
const data = await this.source.getDetalhes(numProcesso);
|
|
57
|
+
return this.buildResponse(data);
|
|
58
|
+
}
|
|
59
|
+
async getApresentacoes(numProcesso) {
|
|
60
|
+
const data = await this.source.getApresentacoes(numProcesso);
|
|
61
|
+
return this.buildResponse(data);
|
|
62
|
+
}
|
|
63
|
+
async getBulaLink(idBulaProtegido) {
|
|
64
|
+
const data = await this.source.getBulaLink(idBulaProtegido);
|
|
65
|
+
return this.buildResponse(data);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/domain/repository.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAe7C,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,QAAQ,CAA0C;IAE3D,YAAY,QAAiD;QAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,KAAK,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAgBD;;;;;;GAMG;AACH,MAAM,OAAO,iBAAiB;IAIT;IACA;IAJF,QAAQ,CAAS;IAElC,YACmB,MAAqB,EACrB,wBAAwB,CAAC;QADzB,WAAM,GAAN,MAAM,CAAe;QACrB,0BAAqB,GAArB,qBAAqB,CAAI;QAE1C,0FAA0F;QAC1F,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;IAEO,aAAa,CAAI,IAAO;QAC9B,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,SAAS,CAAC;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACvB,IAAI,EAAE,aAAa;gBACnB,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;aAClD,CAAC;SACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA0B;QAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,MAAoC;QAEpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,yBAAyB,CAC7B,MAAuC;QAEvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAA2B;QAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,WAAmB;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,WAAmB;QACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,eAAuB;QACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/domain/types.ts"],"names":[],"mappings":"AACA,YAAY,EACV,YAAY,EACZ,QAAQ,EACR,mBAAmB,EACnB,iBAAiB,EACjB,+BAA+B,EAC/B,kBAAkB,EAClB,4BAA4B,EAC5B,mBAAmB,EACnB,YAAY,EACZ,KAAK,GACN,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/domain/types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { ensureDataset, getDbPath } from "./bootstrap.js";
|
|
4
|
+
import { BularioDatasetSource } from "./db/dataset.js";
|
|
5
|
+
import { BularioRepository } from "./domain/repository.js";
|
|
6
|
+
import { createServer } from "./server.js";
|
|
7
|
+
async function main() {
|
|
8
|
+
// Step 1: Ensure dataset is available (R2 bootstrap or local cache)
|
|
9
|
+
const bootstrapResult = await ensureDataset();
|
|
10
|
+
if (!bootstrapResult.ok) {
|
|
11
|
+
process.stderr.write(`[startup] ERRO: ${bootstrapResult.reason}\n` +
|
|
12
|
+
`Dica: Execute 'npm run sync' para popular o dataset local a partir do CSV da ANVISA.\n`);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
process.stderr.write(`[startup] Dataset pronto (${bootstrapResult.action} v${bootstrapResult.version})\n`);
|
|
16
|
+
// Step 2: Open SQLite dataset
|
|
17
|
+
const dbPath = getDbPath();
|
|
18
|
+
const source = new BularioDatasetSource(dbPath);
|
|
19
|
+
const repository = new BularioRepository(source);
|
|
20
|
+
const server = createServer(repository);
|
|
21
|
+
const transport = new StdioServerTransport();
|
|
22
|
+
async function shutdown() {
|
|
23
|
+
await source.close();
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
process.on("SIGINT", () => {
|
|
27
|
+
void shutdown();
|
|
28
|
+
});
|
|
29
|
+
process.on("SIGTERM", () => {
|
|
30
|
+
void shutdown();
|
|
31
|
+
});
|
|
32
|
+
await server.connect(transport);
|
|
33
|
+
}
|
|
34
|
+
main().catch((err) => {
|
|
35
|
+
process.stderr.write(`Fatal error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,oEAAoE;IACpE,MAAM,eAAe,GAAG,MAAM,aAAa,EAAE,CAAC;IAE9C,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mBAAmB,eAAe,CAAC,MAAM,IAAI;YAC3C,wFAAwF,CAC3F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6BAA6B,eAAe,CAAC,MAAM,KAAK,eAAe,CAAC,OAAO,KAAK,CACrF,CAAC;IAEF,8BAA8B;IAC9B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,KAAK,UAAU,QAAQ;QACrB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { IBularioRepository } from "../domain/repository.js";
|
|
2
|
+
import type { AnalisarApresentacoesInputType, CompararTarjasPorClasseInputType, VerificarMedicamentoCompletoInputType } from "./schemas.js";
|
|
3
|
+
export declare function handleVerificarMedicamentoCompleto(input: VerificarMedicamentoCompletoInputType, repository: IBularioRepository): Promise<Array<{
|
|
4
|
+
role: "user" | "assistant";
|
|
5
|
+
content: {
|
|
6
|
+
type: "text";
|
|
7
|
+
text: string;
|
|
8
|
+
};
|
|
9
|
+
}>>;
|
|
10
|
+
export declare function handleCompararTarjasPorClasse(input: CompararTarjasPorClasseInputType, repository: IBularioRepository): Promise<Array<{
|
|
11
|
+
role: "user" | "assistant";
|
|
12
|
+
content: {
|
|
13
|
+
type: "text";
|
|
14
|
+
text: string;
|
|
15
|
+
};
|
|
16
|
+
}>>;
|
|
17
|
+
export declare function handleAnalisarApresentacoes(input: AnalisarApresentacoesInputType, repository: IBularioRepository): Promise<Array<{
|
|
18
|
+
role: "user" | "assistant";
|
|
19
|
+
content: {
|
|
20
|
+
type: "text";
|
|
21
|
+
text: string;
|
|
22
|
+
};
|
|
23
|
+
}>>;
|
|
24
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/prompts/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,KAAK,EACV,8BAA8B,EAC9B,gCAAgC,EAChC,qCAAqC,EACtC,MAAM,cAAc,CAAC;AAOtB,wBAAsB,kCAAkC,CACtD,KAAK,EAAE,qCAAqC,EAC5C,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAAC,CA+FzF;AAED,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,gCAAgC,EACvC,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAAC,CA8EzF;AAED,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,8BAA8B,EACrC,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAAC,CAwGzF"}
|