sih-br-mcp 0.12.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.md +101 -0
- package/dist/cache.d.ts +108 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +270 -0
- package/dist/cache.js.map +1 -0
- package/dist/data/brazil-regions.json +68 -0
- package/dist/data/cid-chapters.json +163 -0
- package/dist/data/csap-groups-cid9.json +4281 -0
- package/dist/data/csap-groups.json +262 -0
- package/dist/db/duckdb.d.ts +263 -0
- package/dist/db/duckdb.d.ts.map +1 -0
- package/dist/db/duckdb.js +837 -0
- package/dist/db/duckdb.js.map +1 -0
- package/dist/freshness.d.ts +101 -0
- package/dist/freshness.d.ts.map +1 -0
- package/dist/freshness.js +303 -0
- package/dist/freshness.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1504 -0
- package/dist/index.js.map +1 -0
- package/dist/provenance.d.ts +217 -0
- package/dist/provenance.d.ts.map +1 -0
- package/dist/provenance.js +534 -0
- package/dist/provenance.js.map +1 -0
- package/dist/utils/age-groups.d.ts +164 -0
- package/dist/utils/age-groups.d.ts.map +1 -0
- package/dist/utils/age-groups.js +112 -0
- package/dist/utils/age-groups.js.map +1 -0
- package/dist/utils/population.d.ts +39 -0
- package/dist/utils/population.d.ts.map +1 -0
- package/dist/utils/population.js +114 -0
- package/dist/utils/population.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proveniência das respostas do sih-br-mcp (contrato @sbissoli/mcp-provenance v1).
|
|
3
|
+
*
|
|
4
|
+
* Cadeia dos cubos SIH: Ministério da Saúde / DATASUS (arquivos RD no FTP)
|
|
5
|
+
* -> healthbr-data (Parquet 1:1, manifesto com hash e data de download)
|
|
6
|
+
* -> healthbr-data scripts/pipeline/sih-cubos/build-aggregations.R (cubos
|
|
7
|
+
* por ano de internação; até 2026-09-08 o builder vivia neste repositório)
|
|
8
|
+
* -> este servidor (filtra e soma).
|
|
9
|
+
*
|
|
10
|
+
* O elo que amarra a resposta à versão dos arquivos é o sidecar
|
|
11
|
+
* `sih_provenance_<ano>.json` gravado ao lado de cada cubo pelo script R.
|
|
12
|
+
* Dele saem `retrieved_at` (data de download do .dbc mais recente no
|
|
13
|
+
* espelho — extração no upstream, não o instante da chamada) e
|
|
14
|
+
* `data_vintage`. Por isso o bloco é determinístico e o golden pode
|
|
15
|
+
* gravá-lo.
|
|
16
|
+
*/
|
|
17
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
import { createProvenanceContext, } from "@sbissoli/mcp-provenance";
|
|
20
|
+
import { configuredDataDirectory, getDataDirectory } from "./db/duckdb.js";
|
|
21
|
+
import { CUBES_BASE_URL, cachedCubesManifest } from "./cache.js";
|
|
22
|
+
import { cubeFreshness, describeBehind, getFreshness } from "./freshness.js";
|
|
23
|
+
import csapGroups from "./data/csap-groups.json" with { type: "json" };
|
|
24
|
+
import csapGroupsCid9 from "./data/csap-groups-cid9.json" with { type: "json" };
|
|
25
|
+
import cidChapters from "./data/cid-chapters.json" with { type: "json" };
|
|
26
|
+
export const SERVER_VERSION = "0.10.0";
|
|
27
|
+
export const provenance = createProvenanceContext({
|
|
28
|
+
metaNamespace: "br.sbissoli.sih",
|
|
29
|
+
locale: "pt-BR",
|
|
30
|
+
defaultMode: "concise",
|
|
31
|
+
});
|
|
32
|
+
const SIDECAR_RE = /^sih_provenance_(\d{4})\.json$/;
|
|
33
|
+
let sidecars = null;
|
|
34
|
+
/** Lê os sidecars da pasta de cubos em uso (uma vez por processo). */
|
|
35
|
+
export function loadSidecars() {
|
|
36
|
+
if (sidecars)
|
|
37
|
+
return sidecars;
|
|
38
|
+
// Sem Parquet na pasta configurada (SIH_DATA_DIR só com sidecars — é assim
|
|
39
|
+
// que o job `decide` do produtor, no healthbr-data, mede o frescor dos
|
|
40
|
+
// cubos publicados), o sidecar ainda vale: é o registro de safra, e é dele
|
|
41
|
+
// que o frescor parte. Por isso a pasta CONFIGURADA tem precedência sempre
|
|
42
|
+
// que tiver sidecar; só sem nenhum (o caso normal desde a 0.11.0: data/
|
|
43
|
+
// não versiona sidecar — o estado é o canal) é que vale a pasta em uso — o cache local, que ensureYears() enche com o
|
|
44
|
+
// sidecar junto do Parquet. Desde a 0.7.0 getDataDirectory() não lança mais
|
|
45
|
+
// erro quando data/ está sem cubo (devolve o cache, possivelmente vazio),
|
|
46
|
+
// então cair no catch não servia mais de critério (run 34071934742).
|
|
47
|
+
const listIn = (dir) => existsSync(dir) ? readdirSync(dir).filter((f) => SIDECAR_RE.test(f)).sort() : [];
|
|
48
|
+
let dir = configuredDataDirectory();
|
|
49
|
+
let files = listIn(dir);
|
|
50
|
+
if (files.length === 0) {
|
|
51
|
+
try {
|
|
52
|
+
dir = getDataDirectory();
|
|
53
|
+
files = listIn(dir);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
files = [];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
sidecars = files.map((f) => JSON.parse(readFileSync(join(dir, f), "utf8")));
|
|
60
|
+
return sidecars;
|
|
61
|
+
}
|
|
62
|
+
/** Força a releitura dos sidecars (testes; e o cache local, que grava sidecar novo ao baixar um ano). */
|
|
63
|
+
export function resetSidecars() {
|
|
64
|
+
sidecars = null;
|
|
65
|
+
}
|
|
66
|
+
// =============================================================================
|
|
67
|
+
// RAÇA/COR POR ANO
|
|
68
|
+
// =============================================================================
|
|
69
|
+
/**
|
|
70
|
+
* Anos cujo cubo NÃO tem raça/cor: RACA_COR só entra no leiaute da AIH em
|
|
71
|
+
* 2008, e o builder >= 2.4.0 grava `race` nulo nesses cubos e o registra em
|
|
72
|
+
* `columns_missing` no sidecar (1998–2007). Ano sem sidecar conta como tendo.
|
|
73
|
+
*/
|
|
74
|
+
export function yearsWithoutRace() {
|
|
75
|
+
return loadSidecars()
|
|
76
|
+
.filter((s) => (s.columns_missing ?? []).includes("RACA_COR"))
|
|
77
|
+
.map((s) => s.cube_year)
|
|
78
|
+
.sort((a, b) => a - b);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Nota para a resposta de uma ferramenta que filtra ou agrupa por raça quando
|
|
82
|
+
* algum ano consultado não tem a coluna. Sem `years` (a consulta cobre tudo
|
|
83
|
+
* que está carregado), valem os anos carregados.
|
|
84
|
+
*/
|
|
85
|
+
export function raceNotes(years, loadedYears) {
|
|
86
|
+
const missing = yearsWithoutRace();
|
|
87
|
+
if (missing.length === 0)
|
|
88
|
+
return [];
|
|
89
|
+
const asked = years && years.length > 0 ? years : loadedYears;
|
|
90
|
+
const hit = missing.filter((y) => asked.includes(y));
|
|
91
|
+
if (hit.length === 0)
|
|
92
|
+
return [];
|
|
93
|
+
return [
|
|
94
|
+
`Raça/cor não existe no SIH-RD de ${hit.join(", ")} (RACA_COR entrou no leiaute da AIH em 2008): nessas linhas \`race\` é nulo — o filtro \`race\` não as alcança e, no agrupamento por \`race\`, elas formam o grupo null.`,
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
// =============================================================================
|
|
98
|
+
// ERA ANTIGA 1992–1997 (builder >= 2.5.0; docs/analise-002 e analise-003)
|
|
99
|
+
// =============================================================================
|
|
100
|
+
function sortedYears(pred) {
|
|
101
|
+
return loadSidecars()
|
|
102
|
+
.filter(pred)
|
|
103
|
+
.map((s) => s.cube_year)
|
|
104
|
+
.sort((a, b) => a - b);
|
|
105
|
+
}
|
|
106
|
+
/** Anos cujo cubo tem internações em CID-9 (sidecar `cid_revision["9"] > 0`; 1992–1997). */
|
|
107
|
+
export function yearsCid9() {
|
|
108
|
+
return sortedYears((s) => (s.cid_revision?.["9"] ?? 0) > 0);
|
|
109
|
+
}
|
|
110
|
+
/** Anos cujo `uf` é a UF do ARQUIVO (estabelecimento), não de residência (sidecar `uf_basis = "arquivo"`; 1992–1997). */
|
|
111
|
+
export function yearsUfArquivo() {
|
|
112
|
+
return sortedYears((s) => s.uf_basis === "arquivo");
|
|
113
|
+
}
|
|
114
|
+
/** Anos cujo `value` está, em alguma competência, em moeda anterior ao real (Cr$ ou CR$; 1992–1994). */
|
|
115
|
+
export function yearsPreReal() {
|
|
116
|
+
return sortedYears((s) => (s.currency ?? []).some((c) => c.code !== "BRL"));
|
|
117
|
+
}
|
|
118
|
+
/** Internações que entraram sem DT_INTER (data = competência), por ano (1992 e 1993). */
|
|
119
|
+
export function dateImputedByYear() {
|
|
120
|
+
const out = {};
|
|
121
|
+
for (const s of loadSidecars()) {
|
|
122
|
+
if ((s.records_date_imputed ?? 0) > 0)
|
|
123
|
+
out[s.cube_year] = s.records_date_imputed;
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
127
|
+
/** Anos da lista que a consulta alcança: os pedidos ou, sem pedido, os carregados. */
|
|
128
|
+
function hitYears(list, years, loadedYears) {
|
|
129
|
+
const asked = years && years.length > 0 ? years : loadedYears;
|
|
130
|
+
return list.filter((y) => asked.includes(y));
|
|
131
|
+
}
|
|
132
|
+
const fmtInt = (n) => String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ".");
|
|
133
|
+
/**
|
|
134
|
+
* Notas para a resposta de uma ferramenta que alcança anos da era antiga
|
|
135
|
+
* (1992–1997): `uf` do arquivo e diagnóstico em CID-9 sempre que algum ano da
|
|
136
|
+
* era entra; ICSAP derivada, moeda da época, município nulo e mês imputado só
|
|
137
|
+
* quando a ferramenta usa a dimensão (`aspects`). Sem `years`, valem os anos
|
|
138
|
+
* carregados. Vazio para 1998+ — o golden (fixture 2023) não muda.
|
|
139
|
+
*/
|
|
140
|
+
export function eraNotes(years, loadedYears, aspects = {}) {
|
|
141
|
+
const notes = [];
|
|
142
|
+
const ufa = hitYears(yearsUfArquivo(), years, loadedYears);
|
|
143
|
+
if (ufa.length > 0) {
|
|
144
|
+
notes.push(`Em ${ufa.join(", ")} \`uf\` é a UF do ARQUIVO (estabelecimento), não de residência: MUNIC_RES não existe no SIH-RD de 1992–1993 e é vazio até nov/1994 (sidecar uf_basis = "arquivo"; docs/analise-002-sih-1992-1997.md). Séries por UF não são estritamente comparáveis com 1998+ (a diferença é a internação fora da UF de residência).`);
|
|
145
|
+
if (aspects.municipality) {
|
|
146
|
+
notes.push(`\`municipality_code\` é nulo em ${ufa.join(", ")}: o filtro por município não alcança esses anos e, no agrupamento por município, eles formam o grupo null.`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const c9 = hitYears(yearsCid9(), years, loadedYears);
|
|
150
|
+
if (c9.length > 0) {
|
|
151
|
+
notes.push(`Diagnóstico em CID-9 em ${c9.join(", ")} (cid_revision = 9): \`cid_group\` é a categoria CID-9 de 3 dígitos ("466", "E883", "V01"), não o código CID-10, e \`cid_chapter\` é o capítulo CID-10 equivalente (src/data/cid9-chapters.json). Em 1997 convivem linhas em CID-9 e em CID-10 (internações faturadas em 1998), separáveis por \`cid_revision\`.`);
|
|
152
|
+
if (aspects.icsap) {
|
|
153
|
+
notes.push(`ICSAP de ${c9.join(", ")} pela lista CID-9 DERIVADA e NÃO OFICIAL (src/data/csap-groups-cid9.json; docs/analise-003-icsap-cid9.md), validada na fronteira 1997/98 (razão global 1,05): g03 (anemia) e g05 (ouvido, nariz e garganta) NÃO são comparáveis com 1998+. Em 1997, as internações faturadas em jan–fev/1998 (cid_revision = 10) têm ICSAP subestimado (adaptação à CID-10).`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (aspects.value) {
|
|
157
|
+
const pr = hitYears(yearsPreReal(), years, loadedYears);
|
|
158
|
+
if (pr.length > 0) {
|
|
159
|
+
notes.push(`\`value\` em ${pr.join(", ")} é NOMINAL na moeda da competência de faturamento (Cr$ cruzeiro até 1993-06, CR$ cruzeiro real 1993-07..1994-06, R$ desde 1994-07; sidecar currency): não somar nem comparar entre moedas nem com anos posteriores.`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (aspects.month) {
|
|
163
|
+
const di = dateImputedByYear();
|
|
164
|
+
const hit = hitYears(Object.keys(di).map(Number), years, loadedYears);
|
|
165
|
+
if (hit.length > 0) {
|
|
166
|
+
notes.push(`Internações sem DT_INTER na fonte em ${hit.map((y) => `${y} (${fmtInt(di[y])})`).join(", ")} (competências 1992-01..04 e 1993-01) entraram com mês = competência de faturamento (sidecar records_date_imputed).`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return notes;
|
|
170
|
+
}
|
|
171
|
+
// =============================================================================
|
|
172
|
+
// FONTES
|
|
173
|
+
// =============================================================================
|
|
174
|
+
const DATASUS_FTP_DIR = "ftp://ftp.datasus.gov.br/dissemin/publicos/SIHSUS/200801_/Dados/";
|
|
175
|
+
const SIH_SOURCE = {
|
|
176
|
+
name: "Ministério da Saúde — DATASUS, SIH/SUS (AIH reduzida, RD)",
|
|
177
|
+
agency: "Ministério da Saúde",
|
|
178
|
+
database: "SIH/SUS",
|
|
179
|
+
endpoint: DATASUS_FTP_DIR,
|
|
180
|
+
};
|
|
181
|
+
const SIH_LICENSE = {
|
|
182
|
+
id: null,
|
|
183
|
+
name: "Dados abertos do DATASUS (Ministério da Saúde); redistribuição em Parquet pelo healthbr-data sob CC-BY-4.0",
|
|
184
|
+
url: null,
|
|
185
|
+
terms_url: "https://datasus.saude.gov.br/transferencia-de-arquivos/",
|
|
186
|
+
verified_at: "2026-09-05",
|
|
187
|
+
};
|
|
188
|
+
/** Data em que as tabelas de referência (CSAP, CID) entraram no repositório. */
|
|
189
|
+
const REFERENCE_SNAPSHOT_AT = "2026-01-21T00:00:00Z";
|
|
190
|
+
/**
|
|
191
|
+
* Safra dos arquivos de população da FIXTURE (tests/fixtures/sih/pop_uf.parquet,
|
|
192
|
+
* Projeção 2024, gerado em 2026-09-07) — só vale quando não há manifesto do
|
|
193
|
+
* canal carregado (cache desligado); com o canal, o `built_at` do bloco
|
|
194
|
+
* `population` do manifesto é que responde.
|
|
195
|
+
*/
|
|
196
|
+
const POPULATION_BUILT_AT = "2026-09-07T00:00:00Z";
|
|
197
|
+
const IBGE_PROJECAO_2024_URL = "https://ftp.ibge.gov.br/Projecao_da_Populacao/Projecao_da_Populacao_2024/projecoes_2024_tab1_idade_simples.xlsx";
|
|
198
|
+
function safraOf(iso) {
|
|
199
|
+
return iso.slice(0, 10);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Marca de frescor no vintage — o modo concise não mostra `notices`, então a
|
|
203
|
+
* única chave do bloco que o leitor vê é esta. Só aparece quando o cubo está
|
|
204
|
+
* ATRÁS do espelho (ver src/freshness.ts); em dia, pendente, desligado ou sem
|
|
205
|
+
* rede não acrescenta nada, para o golden (que roda com a checagem desligada)
|
|
206
|
+
* continuar byte-idêntico.
|
|
207
|
+
*/
|
|
208
|
+
function behindMark(year) {
|
|
209
|
+
const c = cubeFreshness(year);
|
|
210
|
+
if (!c || !c.behind)
|
|
211
|
+
return "";
|
|
212
|
+
return ` [ATRÁS do espelho healthbr-data: ${describeBehind(c, getFreshness().manifest_last_updated_remote)}]`;
|
|
213
|
+
}
|
|
214
|
+
function vintageOf(s) {
|
|
215
|
+
const first = s.competencias[0];
|
|
216
|
+
const last = s.competencias[s.competencias.length - 1];
|
|
217
|
+
const janela = s.window
|
|
218
|
+
? `internações de ${s.cube_year} em competências ${first} a ${last}${s.window.complete ? "" : " (janela INCOMPLETA)"}`
|
|
219
|
+
: `competências ${first} a ${last}`;
|
|
220
|
+
return `${s.cube_year}: ${janela}, UF de arquivo ${s.ufs_arquivo.join("/")}, safra healthbr-data ${safraOf(s.retrieved_at)}${behindMark(s.cube_year)}`;
|
|
221
|
+
}
|
|
222
|
+
/** Avisos de frescor (bloco canônico/detailed). Vazio quando não há o que dizer. */
|
|
223
|
+
function freshnessNotices(used) {
|
|
224
|
+
const f = getFreshness();
|
|
225
|
+
if (f.status === "stale") {
|
|
226
|
+
return used
|
|
227
|
+
.map((s) => cubeFreshness(s.cube_year))
|
|
228
|
+
.filter((c) => !!c && c.behind)
|
|
229
|
+
.map((c) => `Cubo ${c.cube_year} está ATRÁS do espelho healthbr-data: ${describeBehind(c, f.manifest_last_updated_remote)}. ` +
|
|
230
|
+
`Os números vêm dos arquivos da safra do sidecar; rebuild pendente.`);
|
|
231
|
+
}
|
|
232
|
+
if (f.status === "unknown") {
|
|
233
|
+
return [`Frescor dos cubos não verificado contra o espelho healthbr-data (${f.error ?? "sem resposta"}).`];
|
|
234
|
+
}
|
|
235
|
+
return [];
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Bloco dos cubos SIH. `years` restringe aos anos consultados; sem anos (ou
|
|
239
|
+
* sem sidecar para eles) o bloco descreve tudo que o servidor tem carregado.
|
|
240
|
+
*/
|
|
241
|
+
export function sihProvenance(years) {
|
|
242
|
+
const all = loadSidecars();
|
|
243
|
+
const wanted = years && years.length > 0 ? all.filter((s) => years.includes(s.cube_year)) : all;
|
|
244
|
+
const used = wanted.length > 0 ? wanted : all;
|
|
245
|
+
if (used.length === 0) {
|
|
246
|
+
return provenance.build({
|
|
247
|
+
source: SIH_SOURCE,
|
|
248
|
+
source_url: DATASUS_FTP_DIR,
|
|
249
|
+
license: SIH_LICENSE,
|
|
250
|
+
dataset: { id: "sih/rd", version: null, name: "SIH/SUS — AIH reduzida (RD)" },
|
|
251
|
+
data_vintage: null,
|
|
252
|
+
retrieved_at: new Date(),
|
|
253
|
+
citation: "Ministério da Saúde. Sistema de Informações Hospitalares do SUS (SIH/SUS), AIH reduzida. Brasília: DATASUS. Agregado por sih-br-mcp v" +
|
|
254
|
+
SERVER_VERSION +
|
|
255
|
+
" (safra não determinável).",
|
|
256
|
+
derived: true,
|
|
257
|
+
derivation_note: "Cubos agregados por sih-br-mcp; sem sih_provenance_<ano>.json ao lado dos cubos, a safra dos arquivos de origem não é determinável.",
|
|
258
|
+
notices: [
|
|
259
|
+
"Sidecar de proveniência ausente: retrieved_at é o instante da chamada, não a extração no upstream.",
|
|
260
|
+
],
|
|
261
|
+
served_from_cache: null,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
const retrievedAt = used.map((s) => s.retrieved_at).sort().at(-1);
|
|
265
|
+
const manifestVersion = used.map((s) => s.distributor.manifest_last_updated).sort().at(-1);
|
|
266
|
+
const builtAt = used.map((s) => s.built_at).sort().at(-1);
|
|
267
|
+
const files = used.reduce((n, s) => n + s.partitions.length, 0);
|
|
268
|
+
const first = used[0];
|
|
269
|
+
return provenance.build({
|
|
270
|
+
source: SIH_SOURCE,
|
|
271
|
+
source_url: DATASUS_FTP_DIR,
|
|
272
|
+
license: SIH_LICENSE,
|
|
273
|
+
dataset: {
|
|
274
|
+
id: "sih/rd",
|
|
275
|
+
version: manifestVersion,
|
|
276
|
+
name: "SIH/SUS — AIH reduzida (RD), microdados por competência e UF",
|
|
277
|
+
},
|
|
278
|
+
data_vintage: used.map(vintageOf).join("; "),
|
|
279
|
+
retrieved_at: retrievedAt,
|
|
280
|
+
citation: `Ministério da Saúde. Sistema de Informações Hospitalares do SUS (SIH/SUS), AIH reduzida. Brasília: DATASUS. ` +
|
|
281
|
+
`Microdados redistribuídos em Parquet por healthbr-data (Bissoli, 2026; CC-BY-4.0), safra ${safraOf(retrievedAt)}; ` +
|
|
282
|
+
`agregados por sih-br-mcp v${SERVER_VERSION}.`,
|
|
283
|
+
derived: true,
|
|
284
|
+
derivation_note: `Agregação em cubos por ano de internação (causas, séries mensais, ICSAP) a partir de ${files} arquivo(s) RD do FTP do DATASUS, ` +
|
|
285
|
+
`lidos do espelho healthbr-data (${first.distributor.bucket}; manifesto de ${manifestVersion}); ` +
|
|
286
|
+
`year/month pela data de internação (DT_INTER), lendo as competências do ano e os ${first.window?.months_after ?? 0} meses seguintes ` +
|
|
287
|
+
`(cobertura esperada 99,7–99,9% do ano; dezembro 99,3–99,7%); cubos gerados em ${builtAt} por ${first.builder.script} v${first.builder.version}. ` +
|
|
288
|
+
`Hash MD5 e data de download de cada .dbc de origem em sih_provenance_<ano>.json.`,
|
|
289
|
+
notices: freshnessNotices(used),
|
|
290
|
+
served_from_cache: null,
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
/** Lista Brasileira de ICSAP (Portaria MS/SAS 221/2008), transcrita em src/data. */
|
|
294
|
+
export function csapProvenance() {
|
|
295
|
+
return provenance.build({
|
|
296
|
+
source: {
|
|
297
|
+
name: "Ministério da Saúde — Portaria MS/SAS nº 221/2008 (Lista Brasileira de ICSAP)",
|
|
298
|
+
agency: "Ministério da Saúde",
|
|
299
|
+
database: "Saúde Legis",
|
|
300
|
+
endpoint: null,
|
|
301
|
+
},
|
|
302
|
+
source_url: csapGroups.metadata.url,
|
|
303
|
+
license: {
|
|
304
|
+
id: null,
|
|
305
|
+
name: "Ato normativo público (Portaria MS/SAS nº 221, de 17 de abril de 2008)",
|
|
306
|
+
url: null,
|
|
307
|
+
terms_url: null,
|
|
308
|
+
verified_at: null,
|
|
309
|
+
},
|
|
310
|
+
dataset: {
|
|
311
|
+
id: "portaria-sas-221-2008",
|
|
312
|
+
version: null,
|
|
313
|
+
name: csapGroups.metadata.description,
|
|
314
|
+
},
|
|
315
|
+
data_vintage: "Portaria MS/SAS nº 221/2008, 19 grupos (g01–g19), transcrição em src/data/csap-groups.json",
|
|
316
|
+
retrieved_at: REFERENCE_SNAPSHOT_AT,
|
|
317
|
+
citation: "BRASIL. Ministério da Saúde. Secretaria de Atenção à Saúde. Portaria nº 221, de 17 de abril de 2008. Lista Brasileira de Internações por Condições Sensíveis à Atenção Primária.",
|
|
318
|
+
derived: false,
|
|
319
|
+
served_from_cache: null,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Lista ICSAP em CID-9 DERIVADA da Portaria 221/2008 para o SIH de 1992–1997
|
|
324
|
+
* (src/data/csap-groups-cid9.json; docs/analise-003-icsap-cid9.md). Não é ato
|
|
325
|
+
* normativo: é tabela deste projeto, validada na fronteira 1997/98.
|
|
326
|
+
*/
|
|
327
|
+
export function csapCid9Provenance() {
|
|
328
|
+
const m = csapGroupsCid9.metadata;
|
|
329
|
+
return provenance.build({
|
|
330
|
+
source: {
|
|
331
|
+
name: "sih-br-mcp — lista ICSAP em CID-9 derivada da Portaria MS/SAS nº 221/2008 (NÃO oficial)",
|
|
332
|
+
agency: "sih-br-mcp (Sidney Bissoli)",
|
|
333
|
+
database: "src/data/csap-groups-cid9.json",
|
|
334
|
+
endpoint: null,
|
|
335
|
+
},
|
|
336
|
+
source_url: "https://github.com/SidneyBissoli/sih-br-mcp/blob/master/docs/analise-003-icsap-cid9.md",
|
|
337
|
+
license: {
|
|
338
|
+
id: "MIT",
|
|
339
|
+
name: "Tabela derivada deste projeto (MIT); listas de origem citadas no JSON: Caminal 2004, AHRQ PQI v6.0 (2016), CIHI 2008, tabelas CID-9 do DATASUS",
|
|
340
|
+
url: null,
|
|
341
|
+
terms_url: null,
|
|
342
|
+
verified_at: null,
|
|
343
|
+
},
|
|
344
|
+
dataset: {
|
|
345
|
+
id: "icsap-cid9-derivada",
|
|
346
|
+
version: m.generated_at,
|
|
347
|
+
name: `Lista ICSAP em CID-9 derivada (1992–1997): ${m.total_groups} grupos, ${m.total_rubrics} rubricas, ${m.total_codes6} códigos de 6 dígitos`,
|
|
348
|
+
},
|
|
349
|
+
data_vintage: `derivada e validada na fronteira 1997/98 em ${m.generated_at}; razão global de participação 1,05; g03 e g05 com comparabilidade baixa`,
|
|
350
|
+
retrieved_at: REFERENCE_SNAPSHOT_AT,
|
|
351
|
+
citation: "BISSOLI, S. Lista ICSAP em CID-9 derivada da Portaria MS/SAS nº 221/2008 para o SIH/SUS de 1992–1997 (docs/analise-003-icsap-cid9.md). sih-br-mcp, 2026. Não oficial.",
|
|
352
|
+
derived: true,
|
|
353
|
+
derivation_note: "Correspondência MANUAL por rubrica CID-9 (OMS 1975) ↔ CID-10 para cada um dos 19 grupos da Portaria 221/2008, conferida nos rótulos do DATASUS e nas listas de origem em CID-9 (Caminal 2004, AHRQ PQI v6.0/2016, CIHI 2008; GEMs só em 514); " +
|
|
354
|
+
"perímetro da Portaria manda (485/486, 482.4, 483, 558, 590.2, 430/431, 410 ficam fora). Validada empiricamente na fronteira 1997/98 (participação por grupo em CID-9 vs CID-10): razão global 1,05; g03 e g05 com comparabilidade baixa por mudança de prática de codificação. Não é ato normativo.",
|
|
355
|
+
served_from_cache: null,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Método do % ICSAP: o pacote R csapAIH (Fúlvio B. Nedel) — mesma lista da
|
|
360
|
+
* Portaria 221/2008, mas com o universo de cálculo que a literatura brasileira
|
|
361
|
+
* usa (fora: procedimento obstétrico, parto O80–O84, longa permanência). O
|
|
362
|
+
* builder >= 2.6.0 grava a marca `exclusion` nos cubos (src/data/csap-universe.json).
|
|
363
|
+
*/
|
|
364
|
+
export function csapAihProvenance() {
|
|
365
|
+
return provenance.build({
|
|
366
|
+
source: {
|
|
367
|
+
name: "csapAIH — Classificar Condições Sensíveis à Atenção Primária (pacote R, Fúlvio B. Nedel)",
|
|
368
|
+
agency: "Fúlvio Borges Nedel",
|
|
369
|
+
database: "github.com/fulvionedel/csapAIH",
|
|
370
|
+
endpoint: null,
|
|
371
|
+
},
|
|
372
|
+
source_url: "https://github.com/fulvionedel/csapAIH",
|
|
373
|
+
license: {
|
|
374
|
+
id: "GPL-3.0",
|
|
375
|
+
name: "GPL (>= 3) — método reproduzido em tabela (src/data/csap-universe.json), não código copiado",
|
|
376
|
+
url: null,
|
|
377
|
+
terms_url: null,
|
|
378
|
+
verified_at: null,
|
|
379
|
+
},
|
|
380
|
+
dataset: {
|
|
381
|
+
id: "csapaih-universo",
|
|
382
|
+
version: "0.0.4.8",
|
|
383
|
+
name: "Universo do % ICSAP como csapAIH::csapAIH() (procobst.rm, parto.rm, longa.rm)",
|
|
384
|
+
},
|
|
385
|
+
data_vintage: "csapAIH 0.0.4.8 (2026-01-16): fora do numerador e do denominador as internações por procedimento obstétrico (10 códigos SIGTAP; tabela antiga do SIH até 2007 por PROCOBST.CNV do DATASUS), com diagnóstico de parto O80–O84 (CID-9: 650, 669.5–669.7) e as AIH de longa permanência (IDENT = 5)",
|
|
386
|
+
retrieved_at: REFERENCE_SNAPSHOT_AT,
|
|
387
|
+
citation: "NEDEL, F. B. csapAIH: Classificar Condições Sensíveis à Atenção Primária. Pacote R, versão 0.0.4.8, 2026. https://github.com/fulvionedel/csapAIH",
|
|
388
|
+
derived: true,
|
|
389
|
+
derivation_note: "Universo reproduzido em tabela versionada e conferido contra o próprio pacote em 2023/RR (48.480 AIH): mesmas 38.020 internações no universo, 18 dos 19 grupos idênticos; o g01 difere em 18 AIH porque a regex da listaBRMS do pacote inclui B55–B56 e omite B05–B06 e B77.x, contra a Portaria — este servidor segue a Portaria (= listaBRAlfradique do pacote).",
|
|
390
|
+
served_from_cache: null,
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
/** Capítulos da CID-10 (OMS), transcritos em src/data. */
|
|
394
|
+
export function cidProvenance() {
|
|
395
|
+
return provenance.build({
|
|
396
|
+
source: {
|
|
397
|
+
name: "OMS — CID-10, capítulos (versão " + cidChapters.metadata.version + ")",
|
|
398
|
+
agency: "Organização Mundial da Saúde",
|
|
399
|
+
database: "CID-10",
|
|
400
|
+
endpoint: null,
|
|
401
|
+
},
|
|
402
|
+
source_url: "https://icd.who.int/browse10/2019/en",
|
|
403
|
+
license: {
|
|
404
|
+
id: null,
|
|
405
|
+
name: "Classificação pública da OMS; capítulos transcritos em src/data/cid-chapters.json",
|
|
406
|
+
url: null,
|
|
407
|
+
terms_url: null,
|
|
408
|
+
verified_at: null,
|
|
409
|
+
},
|
|
410
|
+
dataset: { id: "cid-10-capitulos", version: cidChapters.metadata.version, name: "CID-10 — capítulos I a XXII" },
|
|
411
|
+
data_vintage: "CID-10 versão " + cidChapters.metadata.version,
|
|
412
|
+
retrieved_at: REFERENCE_SNAPSHOT_AT,
|
|
413
|
+
citation: "Organização Mundial da Saúde. Classificação Estatística Internacional de Doenças e Problemas Relacionados à Saúde, 10ª revisão (CID-10), versão " +
|
|
414
|
+
cidChapters.metadata.version +
|
|
415
|
+
".",
|
|
416
|
+
derived: false,
|
|
417
|
+
served_from_cache: null,
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Denominadores populacionais (pop_uf: IBGE, Projeção da População Revisão
|
|
422
|
+
* 2024; pop_uf_agregado/pop_municipios: DATASUS POPBR/POPSVS). Desde a 0.12.0
|
|
423
|
+
* vêm do canal sih/cubos/ (bloco `population` do manifest.json, produzido pelo
|
|
424
|
+
* build-population.R do healthbr-data): `retrieved_at` e a versão são os do
|
|
425
|
+
* manifesto já carregado nesta execução. Sem manifesto (cache desligado —
|
|
426
|
+
* fixture do smoke e do golden; ou população gerada à mão em data/), vale a
|
|
427
|
+
* safra da fixture (POPULATION_BUILT_AT), nunca uma data inventada.
|
|
428
|
+
*/
|
|
429
|
+
export function populationProvenance() {
|
|
430
|
+
const pop = cachedCubesManifest()?.population ?? null;
|
|
431
|
+
const fromChannel = !!pop?.built_at;
|
|
432
|
+
const lastYear = pop?.last_year ?? null;
|
|
433
|
+
return provenance.build({
|
|
434
|
+
source: {
|
|
435
|
+
name: "IBGE — Projeção da População do Brasil e das Unidades da Federação, Revisão 2024 (UF × sexo × idade simples); DATASUS — população residente por município (POPBR/POPSVS, estimativas e censos do IBGE)",
|
|
436
|
+
agency: "IBGE",
|
|
437
|
+
database: "Projeção da População 2024 (FTP do IBGE); POPBR/POPSVS (FTP do DATASUS)",
|
|
438
|
+
endpoint: fromChannel ? CUBES_BASE_URL + "pop_provenance.json" : IBGE_PROJECAO_2024_URL,
|
|
439
|
+
},
|
|
440
|
+
source_url: "https://www.ibge.gov.br/estatisticas/sociais/populacao/9109-projecao-da-populacao.html",
|
|
441
|
+
license: {
|
|
442
|
+
id: null,
|
|
443
|
+
name: "Dados abertos do IBGE e do DATASUS; redistribuição em Parquet pelo healthbr-data sob CC-BY-4.0",
|
|
444
|
+
url: null,
|
|
445
|
+
terms_url: null,
|
|
446
|
+
verified_at: null,
|
|
447
|
+
},
|
|
448
|
+
dataset: {
|
|
449
|
+
id: "sih-cubos-population",
|
|
450
|
+
version: pop?.builder_version ?? null,
|
|
451
|
+
name: "Denominadores populacionais do canal sih/cubos/ (pop_uf 2000+ idade simples; pop_uf_agregado 1991–1999 faixa etária; pop_municipios 1991–2024)",
|
|
452
|
+
},
|
|
453
|
+
data_vintage: fromChannel
|
|
454
|
+
? `Publicados no canal ${CUBES_BASE_URL} pelo build-population.R do healthbr-data em ${safraOf(pop.built_at)}; pop_uf até ${lastYear ?? "o último cubo FECHADO do SIH"} (regra do CONTEXT.md: nunca além do último cubo fechado; intervalo real em get_available_years.population_years)`
|
|
455
|
+
: "Arquivos de população da pasta de dados (fixture ou build local do build-population.R); pop_uf até o último ano de cubo FECHADO do SIH (intervalo em get_available_years.population_years)",
|
|
456
|
+
retrieved_at: fromChannel ? pop.built_at : POPULATION_BUILT_AT,
|
|
457
|
+
citation: "IBGE. Projeção da população do Brasil e das Unidades da Federação por sexo e idade simples — Revisão 2024. Ministério da Saúde/DATASUS. População residente por município (POPBR/POPSVS).",
|
|
458
|
+
derived: true,
|
|
459
|
+
derivation_note: "Denominadores usados no cálculo de taxas; somente soma de estratos (município → UF), sem interpolação nem projeção própria (regras em CONTEXT.md).",
|
|
460
|
+
served_from_cache: fromChannel ? true : null,
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
// =============================================================================
|
|
464
|
+
// ENVELOPE
|
|
465
|
+
// =============================================================================
|
|
466
|
+
/** Anos mencionados nos argumentos (year, years, year_start..year_end). */
|
|
467
|
+
export function yearsFromArgs(args) {
|
|
468
|
+
if (!args || typeof args !== "object")
|
|
469
|
+
return [];
|
|
470
|
+
const a = args;
|
|
471
|
+
const out = new Set();
|
|
472
|
+
const add = (v) => {
|
|
473
|
+
const n = Number(v);
|
|
474
|
+
if (Number.isInteger(n) && n > 1900)
|
|
475
|
+
out.add(n);
|
|
476
|
+
};
|
|
477
|
+
if (Array.isArray(a.years))
|
|
478
|
+
a.years.forEach(add);
|
|
479
|
+
add(a.year);
|
|
480
|
+
const start = Number(a.year_start);
|
|
481
|
+
const end = Number(a.year_end);
|
|
482
|
+
if (Number.isInteger(start) && Number.isInteger(end) && end >= start && end - start < 200) {
|
|
483
|
+
for (let y = start; y <= end; y++)
|
|
484
|
+
add(y);
|
|
485
|
+
}
|
|
486
|
+
return [...out].sort((x, y) => x - y);
|
|
487
|
+
}
|
|
488
|
+
/** Bloco(s) de proveniência de cada ferramenta. */
|
|
489
|
+
export function provenanceFor(tool, args) {
|
|
490
|
+
switch (tool) {
|
|
491
|
+
case "list_csap_groups":
|
|
492
|
+
case "classify_as_csap":
|
|
493
|
+
return csapProvenance();
|
|
494
|
+
case "list_cid_chapters":
|
|
495
|
+
return cidProvenance();
|
|
496
|
+
case "get_icsap":
|
|
497
|
+
case "get_icsap_indicators":
|
|
498
|
+
case "rank_csap_groups":
|
|
499
|
+
case "compare_icsap_trends": {
|
|
500
|
+
// 0.9.0: quando a consulta alcança ano em CID-9 (1992–1997), a lista
|
|
501
|
+
// derivada entra como terceira fonte, marcada como derivada e não oficial
|
|
502
|
+
const years = yearsFromArgs(args);
|
|
503
|
+
const blocks = [sihProvenance(years), csapProvenance()];
|
|
504
|
+
if (yearsCid9().some((y) => years.length === 0 || years.includes(y)))
|
|
505
|
+
blocks.push(csapCid9Provenance());
|
|
506
|
+
// 0.10.0: o método do percentual (universo csapAIH) é fonte da resposta
|
|
507
|
+
blocks.push(csapAihProvenance());
|
|
508
|
+
return blocks;
|
|
509
|
+
}
|
|
510
|
+
case "get_hospitalization_rates":
|
|
511
|
+
return [sihProvenance(yearsFromArgs(args)), populationProvenance()];
|
|
512
|
+
default:
|
|
513
|
+
return sihProvenance(yearsFromArgs(args));
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Envelopa o resultado de uma ferramenta com o bloco de proveniência.
|
|
518
|
+
* O JSON do texto é o próprio structuredContent (com `provenance` e
|
|
519
|
+
* `attribution`), para clientes que só leem texto; não há rodapé em parte
|
|
520
|
+
* separada porque os scripts de smoke/golden juntam as partes e fazem
|
|
521
|
+
* JSON.parse do todo.
|
|
522
|
+
*/
|
|
523
|
+
export function withProvenance(result, p) {
|
|
524
|
+
const data = result && typeof result === "object" && !Array.isArray(result)
|
|
525
|
+
? result
|
|
526
|
+
: { result };
|
|
527
|
+
const r = provenance.result(data, p);
|
|
528
|
+
return {
|
|
529
|
+
content: [{ type: "text", text: JSON.stringify(r.structuredContent, null, 2) }],
|
|
530
|
+
structuredContent: r.structuredContent,
|
|
531
|
+
_meta: r._meta,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
//# sourceMappingURL=provenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provenance.js","sourceRoot":"","sources":["../src/provenance.ts"],"names":[],"mappings":"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"}
|