bps-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/LICENSE +21 -0
- package/README.md +197 -0
- package/dist/auth/api-key.provider.d.ts +12 -0
- package/dist/auth/api-key.provider.d.ts.map +1 -0
- package/dist/auth/api-key.provider.js +28 -0
- package/dist/auth/api-key.provider.js.map +1 -0
- package/dist/auth/factory.d.ts +4 -0
- package/dist/auth/factory.d.ts.map +1 -0
- package/dist/auth/factory.js +13 -0
- package/dist/auth/factory.js.map +1 -0
- package/dist/auth/oauth2.provider.d.ts +22 -0
- package/dist/auth/oauth2.provider.d.ts.map +1 -0
- package/dist/auth/oauth2.provider.js +64 -0
- package/dist/auth/oauth2.provider.js.map +1 -0
- package/dist/auth/types.d.ts +13 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/client/bps-client.d.ts +93 -0
- package/dist/client/bps-client.d.ts.map +1 -0
- package/dist/client/bps-client.js +255 -0
- package/dist/client/bps-client.js.map +1 -0
- package/dist/client/endpoints.d.ts +57 -0
- package/dist/client/endpoints.d.ts.map +1 -0
- package/dist/client/endpoints.js +166 -0
- package/dist/client/endpoints.js.map +1 -0
- package/dist/client/types.d.ts +273 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/config/defaults.d.ts +24 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +26 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/domain-aliases.d.ts +6 -0
- package/dist/config/domain-aliases.d.ts.map +1 -0
- package/dist/config/domain-aliases.js +105 -0
- package/dist/config/domain-aliases.js.map +1 -0
- package/dist/config/index.d.ts +71 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +52 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/analysis.prompts.d.ts +3 -0
- package/dist/prompts/analysis.prompts.d.ts.map +1 -0
- package/dist/prompts/analysis.prompts.js +171 -0
- package/dist/prompts/analysis.prompts.js.map +1 -0
- package/dist/resources/domain.resources.d.ts +5 -0
- package/dist/resources/domain.resources.d.ts.map +1 -0
- package/dist/resources/domain.resources.js +62 -0
- package/dist/resources/domain.resources.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +43 -0
- package/dist/server.js.map +1 -0
- package/dist/services/attribution.d.ts +3 -0
- package/dist/services/attribution.d.ts.map +1 -0
- package/dist/services/attribution.js +8 -0
- package/dist/services/attribution.js.map +1 -0
- package/dist/services/cache.d.ts +21 -0
- package/dist/services/cache.d.ts.map +1 -0
- package/dist/services/cache.js +47 -0
- package/dist/services/cache.js.map +1 -0
- package/dist/services/data-formatter.d.ts +13 -0
- package/dist/services/data-formatter.d.ts.map +1 -0
- package/dist/services/data-formatter.js +166 -0
- package/dist/services/data-formatter.js.map +1 -0
- package/dist/services/domain-resolver.d.ts +22 -0
- package/dist/services/domain-resolver.d.ts.map +1 -0
- package/dist/services/domain-resolver.js +101 -0
- package/dist/services/domain-resolver.js.map +1 -0
- package/dist/tools/census.tools.d.ts +4 -0
- package/dist/tools/census.tools.d.ts.map +1 -0
- package/dist/tools/census.tools.js +28 -0
- package/dist/tools/census.tools.js.map +1 -0
- package/dist/tools/csa.tools.d.ts +4 -0
- package/dist/tools/csa.tools.d.ts.map +1 -0
- package/dist/tools/csa.tools.js +77 -0
- package/dist/tools/csa.tools.js.map +1 -0
- package/dist/tools/domain.tools.d.ts +5 -0
- package/dist/tools/domain.tools.d.ts.map +1 -0
- package/dist/tools/domain.tools.js +44 -0
- package/dist/tools/domain.tools.js.map +1 -0
- package/dist/tools/dynamic-data.tools.d.ts +5 -0
- package/dist/tools/dynamic-data.tools.d.ts.map +1 -0
- package/dist/tools/dynamic-data.tools.js +136 -0
- package/dist/tools/dynamic-data.tools.js.map +1 -0
- package/dist/tools/glossary.tools.d.ts +4 -0
- package/dist/tools/glossary.tools.d.ts.map +1 -0
- package/dist/tools/glossary.tools.js +32 -0
- package/dist/tools/glossary.tools.js.map +1 -0
- package/dist/tools/infographic.tools.d.ts +4 -0
- package/dist/tools/infographic.tools.d.ts.map +1 -0
- package/dist/tools/infographic.tools.js +60 -0
- package/dist/tools/infographic.tools.js.map +1 -0
- package/dist/tools/news.tools.d.ts +4 -0
- package/dist/tools/news.tools.d.ts.map +1 -0
- package/dist/tools/news.tools.js +55 -0
- package/dist/tools/news.tools.js.map +1 -0
- package/dist/tools/publication.tools.d.ts +4 -0
- package/dist/tools/publication.tools.d.ts.map +1 -0
- package/dist/tools/publication.tools.js +101 -0
- package/dist/tools/publication.tools.js.map +1 -0
- package/dist/tools/reference.tools.d.ts +4 -0
- package/dist/tools/reference.tools.d.ts.map +1 -0
- package/dist/tools/reference.tools.js +20 -0
- package/dist/tools/reference.tools.js.map +1 -0
- package/dist/tools/search.tools.d.ts +4 -0
- package/dist/tools/search.tools.d.ts.map +1 -0
- package/dist/tools/search.tools.js +22 -0
- package/dist/tools/search.tools.js.map +1 -0
- package/dist/tools/static-table.tools.d.ts +4 -0
- package/dist/tools/static-table.tools.d.ts.map +1 -0
- package/dist/tools/static-table.tools.js +47 -0
- package/dist/tools/static-table.tools.js.map +1 -0
- package/dist/tools/trade.tools.d.ts +4 -0
- package/dist/tools/trade.tools.d.ts.map +1 -0
- package/dist/tools/trade.tools.js +25 -0
- package/dist/tools/trade.tools.js.map +1 -0
- package/dist/tools/utility.tools.d.ts +4 -0
- package/dist/tools/utility.tools.d.ts.map +1 -0
- package/dist/tools/utility.tools.js +10 -0
- package/dist/tools/utility.tools.js.map +1 -0
- package/dist/transport/stdio.d.ts +3 -0
- package/dist/transport/stdio.d.ts.map +1 -0
- package/dist/transport/stdio.js +9 -0
- package/dist/transport/stdio.js.map +1 -0
- package/dist/utils/error.d.ts +13 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +38 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pagination.d.ts +11 -0
- package/dist/utils/pagination.d.ts.map +1 -0
- package/dist/utils/pagination.js +19 -0
- package/dist/utils/pagination.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerPrompts(server) {
|
|
3
|
+
server.prompt("compare_regions", "Template untuk membandingkan data statistik antar wilayah", {
|
|
4
|
+
region_a: z.string().describe("Nama wilayah pertama (misal: Jawa Timur)"),
|
|
5
|
+
region_b: z.string().describe("Nama wilayah kedua (misal: Jawa Barat)"),
|
|
6
|
+
indicator: z.string().optional().describe("Indikator yang dibandingkan (misal: kemiskinan, pengangguran). Kosongkan untuk ringkasan umum"),
|
|
7
|
+
year: z.string().optional().describe("Tahun data (misal: 2023). Kosongkan untuk data terbaru"),
|
|
8
|
+
}, async ({ region_a, region_b, indicator, year }) => {
|
|
9
|
+
const indicatorText = indicator ?? "indikator utama (kemiskinan, pengangguran, pertumbuhan ekonomi, IPM)";
|
|
10
|
+
const yearText = year ?? "terbaru yang tersedia";
|
|
11
|
+
return {
|
|
12
|
+
messages: [
|
|
13
|
+
{
|
|
14
|
+
role: "user",
|
|
15
|
+
content: {
|
|
16
|
+
type: "text",
|
|
17
|
+
text: `Bandingkan data statistik ${indicatorText} antara ${region_a} dan ${region_b} untuk tahun ${yearText}.
|
|
18
|
+
|
|
19
|
+
Langkah:
|
|
20
|
+
1. Gunakan tool resolve_domain untuk mendapatkan kode domain kedua wilayah
|
|
21
|
+
2. Gunakan tool list_variables atau list_strategic_indicators untuk menemukan variabel yang relevan
|
|
22
|
+
3. Gunakan tool get_dynamic_data untuk mengambil data kedua wilayah
|
|
23
|
+
4. Sajikan perbandingan dalam format tabel yang mudah dipahami
|
|
24
|
+
5. Berikan analisis singkat tentang perbedaan yang ditemukan
|
|
25
|
+
|
|
26
|
+
Format output yang diharapkan:
|
|
27
|
+
- Tabel perbandingan dengan kolom: Indikator | ${region_a} | ${region_b} | Selisih
|
|
28
|
+
- Ringkasan analisis 2-3 kalimat`,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
server.prompt("trend_analysis", "Template untuk analisis tren data statistik multi-tahun", {
|
|
35
|
+
region: z.string().describe("Nama wilayah (misal: Indonesia, Jawa Timur)"),
|
|
36
|
+
indicator: z.string().describe("Indikator yang dianalisis (misal: inflasi, kemiskinan, pengangguran)"),
|
|
37
|
+
start_year: z.string().optional().describe("Tahun awal (misal: 2019)"),
|
|
38
|
+
end_year: z.string().optional().describe("Tahun akhir (misal: 2023)"),
|
|
39
|
+
}, async ({ region, indicator, start_year, end_year }) => {
|
|
40
|
+
const startText = start_year ?? "2019";
|
|
41
|
+
const endText = end_year ?? "2023";
|
|
42
|
+
return {
|
|
43
|
+
messages: [
|
|
44
|
+
{
|
|
45
|
+
role: "user",
|
|
46
|
+
content: {
|
|
47
|
+
type: "text",
|
|
48
|
+
text: `Analisis tren ${indicator} di ${region} dari tahun ${startText} sampai ${endText}.
|
|
49
|
+
|
|
50
|
+
Langkah:
|
|
51
|
+
1. Gunakan tool resolve_domain untuk mendapatkan kode domain wilayah
|
|
52
|
+
2. Gunakan tool list_variables atau search untuk menemukan variabel ${indicator}
|
|
53
|
+
3. Gunakan tool get_dynamic_data dengan parameter th="${startText},${Number(startText) + 1},${Number(startText) + 2},...,${endText}" untuk mengambil data multi-tahun
|
|
54
|
+
4. Sajikan data dalam tabel time-series
|
|
55
|
+
5. Identifikasi tren (naik/turun/fluktuatif) dan titik-titik penting
|
|
56
|
+
|
|
57
|
+
Format output yang diharapkan:
|
|
58
|
+
- Tabel: Tahun | Nilai | Perubahan (%)
|
|
59
|
+
- Grafik ASCII sederhana jika memungkinkan
|
|
60
|
+
- Analisis tren 3-5 kalimat, termasuk faktor-faktor yang mungkin mempengaruhi`,
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
server.prompt("poverty_profile", "Template profil kemiskinan suatu daerah", {
|
|
67
|
+
region: z.string().describe("Nama wilayah (misal: Jawa Timur, Surabaya)"),
|
|
68
|
+
year: z.string().optional().describe("Tahun data (misal: 2023)"),
|
|
69
|
+
}, async ({ region, year }) => {
|
|
70
|
+
const yearText = year ?? "terbaru";
|
|
71
|
+
return {
|
|
72
|
+
messages: [
|
|
73
|
+
{
|
|
74
|
+
role: "user",
|
|
75
|
+
content: {
|
|
76
|
+
type: "text",
|
|
77
|
+
text: `Buatkan profil kemiskinan ${region} tahun ${yearText}.
|
|
78
|
+
|
|
79
|
+
Langkah:
|
|
80
|
+
1. Gunakan resolve_domain untuk mendapatkan kode domain
|
|
81
|
+
2. Cari data berikut menggunakan list_variables dan get_dynamic_data:
|
|
82
|
+
- Persentase penduduk miskin
|
|
83
|
+
- Jumlah penduduk miskin (ribu jiwa)
|
|
84
|
+
- Garis kemiskinan (Rp/kapita/bulan)
|
|
85
|
+
- Indeks Kedalaman Kemiskinan (P1)
|
|
86
|
+
- Indeks Keparahan Kemiskinan (P2)
|
|
87
|
+
3. Jika tersedia, bandingkan dengan angka nasional
|
|
88
|
+
4. Cari BRS terkait kemiskinan menggunakan list_press_releases
|
|
89
|
+
|
|
90
|
+
Format output:
|
|
91
|
+
- Ringkasan data kemiskinan dalam tabel
|
|
92
|
+
- Perbandingan dengan rata-rata nasional
|
|
93
|
+
- Tren 3 tahun terakhir jika data tersedia
|
|
94
|
+
- Sumber BRS terkait`,
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
});
|
|
100
|
+
server.prompt("economic_overview", "Template ringkasan ekonomi daerah", {
|
|
101
|
+
region: z.string().describe("Nama wilayah (misal: DKI Jakarta, Bali)"),
|
|
102
|
+
year: z.string().optional().describe("Tahun data (misal: 2023)"),
|
|
103
|
+
}, async ({ region, year }) => {
|
|
104
|
+
const yearText = year ?? "terbaru";
|
|
105
|
+
return {
|
|
106
|
+
messages: [
|
|
107
|
+
{
|
|
108
|
+
role: "user",
|
|
109
|
+
content: {
|
|
110
|
+
type: "text",
|
|
111
|
+
text: `Buatkan ringkasan ekonomi ${region} tahun ${yearText}.
|
|
112
|
+
|
|
113
|
+
Langkah:
|
|
114
|
+
1. Gunakan resolve_domain untuk mendapatkan kode domain
|
|
115
|
+
2. Kumpulkan data indikator ekonomi utama menggunakan list_strategic_indicators dan get_dynamic_data:
|
|
116
|
+
- PDRB (nominal dan riil)
|
|
117
|
+
- Pertumbuhan ekonomi (%)
|
|
118
|
+
- Inflasi (%)
|
|
119
|
+
- Tingkat Pengangguran Terbuka (TPT)
|
|
120
|
+
- Indeks Pembangunan Manusia (IPM)
|
|
121
|
+
- Gini Ratio
|
|
122
|
+
3. Jika tersedia, cari data ekspor/impor menggunakan get_trade_data
|
|
123
|
+
4. Cari publikasi terkait menggunakan list_publications
|
|
124
|
+
|
|
125
|
+
Format output:
|
|
126
|
+
- Dashboard indikator ekonomi utama (tabel)
|
|
127
|
+
- Perbandingan dengan tahun sebelumnya dan nasional
|
|
128
|
+
- Highlight 3-5 poin penting
|
|
129
|
+
- Sumber data dan publikasi terkait`,
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
server.prompt("population_stats", "Template statistik kependudukan", {
|
|
136
|
+
region: z.string().describe("Nama wilayah (misal: Indonesia, Jawa Barat)"),
|
|
137
|
+
year: z.string().optional().describe("Tahun data (misal: 2023)"),
|
|
138
|
+
}, async ({ region, year }) => {
|
|
139
|
+
const yearText = year ?? "terbaru";
|
|
140
|
+
return {
|
|
141
|
+
messages: [
|
|
142
|
+
{
|
|
143
|
+
role: "user",
|
|
144
|
+
content: {
|
|
145
|
+
type: "text",
|
|
146
|
+
text: `Tampilkan statistik kependudukan ${region} tahun ${yearText}.
|
|
147
|
+
|
|
148
|
+
Langkah:
|
|
149
|
+
1. Gunakan resolve_domain untuk mendapatkan kode domain
|
|
150
|
+
2. Kumpulkan data kependudukan menggunakan get_dynamic_data dan list_strategic_indicators:
|
|
151
|
+
- Jumlah penduduk
|
|
152
|
+
- Laju pertumbuhan penduduk
|
|
153
|
+
- Kepadatan penduduk (jiwa/km²)
|
|
154
|
+
- Rasio jenis kelamin
|
|
155
|
+
- Dependency ratio
|
|
156
|
+
- Angka harapan hidup
|
|
157
|
+
3. Jika tersedia, cari data sensus menggunakan list_census_events dan list_census_topics
|
|
158
|
+
4. Cari tabel statis terkait menggunakan list_static_tables dengan keyword "penduduk"
|
|
159
|
+
|
|
160
|
+
Format output:
|
|
161
|
+
- Tabel ringkasan demografi
|
|
162
|
+
- Perbandingan dengan sensus sebelumnya jika tersedia
|
|
163
|
+
- Distribusi umur dan jenis kelamin jika data tersedia
|
|
164
|
+
- Sumber data dan catatan metodologi`,
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
};
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=analysis.prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.prompts.js","sourceRoot":"","sources":["../../src/prompts/analysis.prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { BpsClient } from "../client/bps-client.js";
|
|
3
|
+
import type { DomainResolver } from "../services/domain-resolver.js";
|
|
4
|
+
export declare function registerResources(server: McpServer, client: BpsClient, _resolver: DomainResolver): void;
|
|
5
|
+
//# sourceMappingURL=domain.resources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.resources.d.ts","sourceRoot":"","sources":["../../src/resources/domain.resources.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAMrE,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,cAAc,GACxB,IAAI,CA+EN"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
function firstValue(v) {
|
|
3
|
+
return Array.isArray(v) ? v[0] : v;
|
|
4
|
+
}
|
|
5
|
+
export function registerResources(server, client, _resolver) {
|
|
6
|
+
server.resource("provinces", "bps://domains/provinces", { description: "Daftar seluruh provinsi di Indonesia beserta kode domain BPS" }, async () => {
|
|
7
|
+
const result = await client.listDomains("prov");
|
|
8
|
+
const lines = result.data.map((d) => `${d.domain_id}\t${d.domain_name}`);
|
|
9
|
+
return {
|
|
10
|
+
contents: [
|
|
11
|
+
{
|
|
12
|
+
uri: "bps://domains/provinces",
|
|
13
|
+
mimeType: "text/plain",
|
|
14
|
+
text: `kode_domain\tnama\n${lines.join("\n")}`,
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
server.resource("regencies-by-province", new ResourceTemplate("bps://domains/regencies/{prov_id}", {
|
|
20
|
+
list: async () => {
|
|
21
|
+
const provinces = await client.listDomains("prov");
|
|
22
|
+
return {
|
|
23
|
+
resources: provinces.data.map((p) => ({
|
|
24
|
+
uri: `bps://domains/regencies/${p.domain_id}`,
|
|
25
|
+
name: `Kab/Kota di ${p.domain_name}`,
|
|
26
|
+
description: `Daftar kabupaten/kota di provinsi ${p.domain_name}`,
|
|
27
|
+
mimeType: "text/plain",
|
|
28
|
+
})),
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
}), { description: "Daftar kabupaten/kota untuk provinsi tertentu" }, async (uri, variables) => {
|
|
32
|
+
const provId = firstValue(variables.prov_id);
|
|
33
|
+
const result = await client.listDomains("kabbyprov", provId);
|
|
34
|
+
const lines = result.data.map((d) => `${d.domain_id}\t${d.domain_name}`);
|
|
35
|
+
return {
|
|
36
|
+
contents: [
|
|
37
|
+
{
|
|
38
|
+
uri: uri.href,
|
|
39
|
+
mimeType: "text/plain",
|
|
40
|
+
text: `kode_domain\tnama\n${lines.join("\n")}`,
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
server.resource("subjects-by-domain", new ResourceTemplate("bps://subjects/{domain}", {
|
|
46
|
+
list: undefined,
|
|
47
|
+
}), { description: "Daftar subjek statistik untuk domain/wilayah tertentu" }, async (uri, variables) => {
|
|
48
|
+
const domain = firstValue(variables.domain);
|
|
49
|
+
const result = await client.listSubjects(domain);
|
|
50
|
+
const lines = result.data.map((s) => `${s.sub_id}\t${s.title}${s.ntabel ? ` (${s.ntabel} tabel)` : ""}`);
|
|
51
|
+
return {
|
|
52
|
+
contents: [
|
|
53
|
+
{
|
|
54
|
+
uri: uri.href,
|
|
55
|
+
mimeType: "text/plain",
|
|
56
|
+
text: `sub_id\tjudul\n${lines.join("\n")}`,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=domain.resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.resources.js","sourceRoot":"","sources":["../../src/resources/domain.resources.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { Config } from "./config/index.js";
|
|
3
|
+
import type { IAuthProvider } from "./auth/types.js";
|
|
4
|
+
import type { ICacheProvider } from "./services/cache.js";
|
|
5
|
+
import { BpsClient } from "./client/bps-client.js";
|
|
6
|
+
import { DomainResolver } from "./services/domain-resolver.js";
|
|
7
|
+
export declare function createServer(config: Config, auth: IAuthProvider, cache: ICacheProvider | null): {
|
|
8
|
+
server: McpServer;
|
|
9
|
+
client: BpsClient;
|
|
10
|
+
resolver: DomainResolver;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAiB/D,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,cAAc,GAAG,IAAI,GAC3B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,CA2BpE"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { BpsClient } from "./client/bps-client.js";
|
|
3
|
+
import { DomainResolver } from "./services/domain-resolver.js";
|
|
4
|
+
import { registerDomainTools } from "./tools/domain.tools.js";
|
|
5
|
+
import { registerDynamicDataTools } from "./tools/dynamic-data.tools.js";
|
|
6
|
+
import { registerStaticTableTools } from "./tools/static-table.tools.js";
|
|
7
|
+
import { registerPublicationTools } from "./tools/publication.tools.js";
|
|
8
|
+
import { registerReferenceTools } from "./tools/reference.tools.js";
|
|
9
|
+
import { registerTradeTools } from "./tools/trade.tools.js";
|
|
10
|
+
import { registerSearchTools } from "./tools/search.tools.js";
|
|
11
|
+
import { registerUtilityTools } from "./tools/utility.tools.js";
|
|
12
|
+
import { registerInfographicTools } from "./tools/infographic.tools.js";
|
|
13
|
+
import { registerCensusTools } from "./tools/census.tools.js";
|
|
14
|
+
import { registerCsaTools } from "./tools/csa.tools.js";
|
|
15
|
+
import { registerNewsTools } from "./tools/news.tools.js";
|
|
16
|
+
import { registerGlossaryTools } from "./tools/glossary.tools.js";
|
|
17
|
+
import { registerResources } from "./resources/domain.resources.js";
|
|
18
|
+
import { registerPrompts } from "./prompts/analysis.prompts.js";
|
|
19
|
+
export function createServer(config, auth, cache) {
|
|
20
|
+
const server = new McpServer({
|
|
21
|
+
name: "bps-statistics",
|
|
22
|
+
version: "0.1.0",
|
|
23
|
+
});
|
|
24
|
+
const client = new BpsClient(auth, cache, config);
|
|
25
|
+
const resolver = new DomainResolver(client);
|
|
26
|
+
registerDomainTools(server, client, resolver);
|
|
27
|
+
registerDynamicDataTools(server, client, config);
|
|
28
|
+
registerStaticTableTools(server, client);
|
|
29
|
+
registerPublicationTools(server, client);
|
|
30
|
+
registerReferenceTools(server, client);
|
|
31
|
+
registerTradeTools(server, client);
|
|
32
|
+
registerSearchTools(server, client);
|
|
33
|
+
registerInfographicTools(server, client);
|
|
34
|
+
registerCensusTools(server, client);
|
|
35
|
+
registerCsaTools(server, client);
|
|
36
|
+
registerNewsTools(server, client);
|
|
37
|
+
registerGlossaryTools(server, client);
|
|
38
|
+
registerUtilityTools(server, cache);
|
|
39
|
+
registerResources(server, client, resolver);
|
|
40
|
+
registerPrompts(server);
|
|
41
|
+
return { server, client, resolver };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,IAAmB,EACnB,KAA4B;IAE5B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;IAE5C,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9C,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAEpC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5C,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../../src/services/attribution.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,IAAI,GAAE,KAAK,GAAG,KAAa,GAAG,MAAM,CAElE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,KAAK,GAAG,KAAa,GAAG,MAAM,CAEnF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ATTRIBUTION, ATTRIBUTION_EN } from "../config/defaults.js";
|
|
2
|
+
export function getAttribution(lang = "ind") {
|
|
3
|
+
return lang === "eng" ? ATTRIBUTION_EN : ATTRIBUTION;
|
|
4
|
+
}
|
|
5
|
+
export function appendAttribution(text, lang = "ind") {
|
|
6
|
+
return `${text}\n\n---\n${getAttribution(lang)}`;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=attribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribution.js","sourceRoot":"","sources":["../../src/services/attribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,UAAU,cAAc,CAAC,OAAsB,KAAK;IACxD,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAsB,KAAK;IACzE,OAAO,GAAG,IAAI,YAAY,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ICacheProvider {
|
|
2
|
+
get(key: string): Promise<string | null>;
|
|
3
|
+
set(key: string, value: string, ttlSeconds: number): Promise<void>;
|
|
4
|
+
delete(key: string): Promise<void>;
|
|
5
|
+
clear(): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* In-memory LRU cache with TTL support.
|
|
9
|
+
* Used for stdio transport. For Cloudflare Workers, use KVCache instead.
|
|
10
|
+
*/
|
|
11
|
+
export declare class InMemoryCache implements ICacheProvider {
|
|
12
|
+
private cache;
|
|
13
|
+
private readonly maxEntries;
|
|
14
|
+
constructor(maxEntries?: number);
|
|
15
|
+
get(key: string): Promise<string | null>;
|
|
16
|
+
set(key: string, value: string, ttlSeconds: number): Promise<void>;
|
|
17
|
+
delete(key: string): Promise<void>;
|
|
18
|
+
clear(): Promise<void>;
|
|
19
|
+
get size(): number;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/services/cache.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAOD;;;GAGG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,UAAU,GAAE,MAAY;IAI9B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAexC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAelE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory LRU cache with TTL support.
|
|
3
|
+
* Used for stdio transport. For Cloudflare Workers, use KVCache instead.
|
|
4
|
+
*/
|
|
5
|
+
export class InMemoryCache {
|
|
6
|
+
cache = new Map();
|
|
7
|
+
maxEntries;
|
|
8
|
+
constructor(maxEntries = 500) {
|
|
9
|
+
this.maxEntries = maxEntries;
|
|
10
|
+
}
|
|
11
|
+
async get(key) {
|
|
12
|
+
const entry = this.cache.get(key);
|
|
13
|
+
if (!entry)
|
|
14
|
+
return null;
|
|
15
|
+
if (Date.now() > entry.expiresAt) {
|
|
16
|
+
this.cache.delete(key);
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
// Move to end for LRU
|
|
20
|
+
this.cache.delete(key);
|
|
21
|
+
this.cache.set(key, entry);
|
|
22
|
+
return entry.value;
|
|
23
|
+
}
|
|
24
|
+
async set(key, value, ttlSeconds) {
|
|
25
|
+
// Evict oldest if at capacity
|
|
26
|
+
if (this.cache.size >= this.maxEntries && !this.cache.has(key)) {
|
|
27
|
+
const firstKey = this.cache.keys().next().value;
|
|
28
|
+
if (firstKey !== undefined) {
|
|
29
|
+
this.cache.delete(firstKey);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
this.cache.set(key, {
|
|
33
|
+
value,
|
|
34
|
+
expiresAt: Date.now() + ttlSeconds * 1000,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async delete(key) {
|
|
38
|
+
this.cache.delete(key);
|
|
39
|
+
}
|
|
40
|
+
async clear() {
|
|
41
|
+
this.cache.clear();
|
|
42
|
+
}
|
|
43
|
+
get size() {
|
|
44
|
+
return this.cache.size;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/services/cache.ts"],"names":[],"mappings":"AAYA;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7B,UAAU,CAAS;IAEpC,YAAY,aAAqB,GAAG;QAClC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,UAAkB;QACtD,8BAA8B;QAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BpsDynamicDataResponse } from "../client/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Format BPS dynamic data response into human/LLM-readable text.
|
|
4
|
+
*
|
|
5
|
+
* BPS datacontent keys are concatenated IDs: {vervar}{var}{turvar}{th}
|
|
6
|
+
* We resolve them using the metadata arrays in the response.
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatDynamicData(response: BpsDynamicDataResponse, domain: string, lang?: "ind" | "eng"): string;
|
|
9
|
+
/**
|
|
10
|
+
* Format a simple list of items into readable text.
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatList<T>(items: T[], formatter: (item: T) => string, title: string, lang?: "ind" | "eng"): string;
|
|
13
|
+
//# sourceMappingURL=data-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-formatter.d.ts","sourceRoot":"","sources":["../../src/services/data-formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAqF,MAAM,oBAAoB,CAAC;AAapJ;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,sBAAsB,EAChC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,KAAK,GAAG,KAAa,GAC1B,MAAM,CAyFR;AA4FD;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,KAAK,EAAE,CAAC,EAAE,EACV,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC9B,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,KAAK,GAAG,KAAa,GAC1B,MAAM,CAYR"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { appendAttribution } from "./attribution.js";
|
|
2
|
+
/**
|
|
3
|
+
* Format BPS dynamic data response into human/LLM-readable text.
|
|
4
|
+
*
|
|
5
|
+
* BPS datacontent keys are concatenated IDs: {vervar}{var}{turvar}{th}
|
|
6
|
+
* We resolve them using the metadata arrays in the response.
|
|
7
|
+
*/
|
|
8
|
+
export function formatDynamicData(response, domain, lang = "ind") {
|
|
9
|
+
const datacontent = response.datacontent;
|
|
10
|
+
if (!datacontent || Object.keys(datacontent).length === 0) {
|
|
11
|
+
return appendAttribution(lang === "ind"
|
|
12
|
+
? "Tidak ada data yang ditemukan untuk parameter yang diberikan."
|
|
13
|
+
: "No data found for the given parameters.", lang);
|
|
14
|
+
}
|
|
15
|
+
// Build lookup maps
|
|
16
|
+
const varMap = buildMap(response.var, (v) => [String(v.var_id), v]);
|
|
17
|
+
const vervarMap = buildMap(response.vervar, (v) => [String(v.kode_vervar), v]);
|
|
18
|
+
const turvarMap = buildMap(response.turvar, (v) => [String(v.kode_turvar), v]);
|
|
19
|
+
const periodMap = buildMap(response.tahun, (v) => [String(v.th_id), v]);
|
|
20
|
+
const turthMap = buildMap(response.turtahun, (v) => [String(v.turth_id), v]);
|
|
21
|
+
const rows = [];
|
|
22
|
+
for (const [key, value] of Object.entries(datacontent)) {
|
|
23
|
+
const row = resolveDatacontentKey(key, value, varMap, vervarMap, turvarMap, periodMap, turthMap);
|
|
24
|
+
if (row)
|
|
25
|
+
rows.push(row);
|
|
26
|
+
}
|
|
27
|
+
if (rows.length === 0) {
|
|
28
|
+
return appendAttribution("Data tersedia tetapi tidak dapat di-parse.", lang);
|
|
29
|
+
}
|
|
30
|
+
// Format as text table
|
|
31
|
+
const lines = [];
|
|
32
|
+
// Title from variables
|
|
33
|
+
const varNames = [...new Set(rows.map((r) => r.variable))];
|
|
34
|
+
if (varNames.length > 0) {
|
|
35
|
+
lines.push(`## ${varNames.join(", ")}`);
|
|
36
|
+
lines.push(`**Domain:** ${domain}`);
|
|
37
|
+
lines.push("");
|
|
38
|
+
}
|
|
39
|
+
// Group by variable
|
|
40
|
+
const grouped = new Map();
|
|
41
|
+
for (const row of rows) {
|
|
42
|
+
const key = row.variable;
|
|
43
|
+
if (!grouped.has(key))
|
|
44
|
+
grouped.set(key, []);
|
|
45
|
+
grouped.get(key).push(row);
|
|
46
|
+
}
|
|
47
|
+
for (const [varName, varRows] of grouped) {
|
|
48
|
+
if (grouped.size > 1) {
|
|
49
|
+
lines.push(`### ${varName}`);
|
|
50
|
+
}
|
|
51
|
+
// Build a readable table
|
|
52
|
+
const hasVervar = varRows.some((r) => r.verticalVariable);
|
|
53
|
+
const hasTurvar = varRows.some((r) => r.derivedVariable);
|
|
54
|
+
// Header
|
|
55
|
+
const headers = [];
|
|
56
|
+
if (hasVervar)
|
|
57
|
+
headers.push("Kategori");
|
|
58
|
+
headers.push("Periode");
|
|
59
|
+
if (hasTurvar)
|
|
60
|
+
headers.push("Turunan");
|
|
61
|
+
headers.push("Nilai");
|
|
62
|
+
lines.push("| " + headers.join(" | ") + " |");
|
|
63
|
+
lines.push("| " + headers.map(() => "---").join(" | ") + " |");
|
|
64
|
+
// Sort rows by period
|
|
65
|
+
varRows.sort((a, b) => a.period.localeCompare(b.period));
|
|
66
|
+
for (const row of varRows) {
|
|
67
|
+
const cols = [];
|
|
68
|
+
if (hasVervar)
|
|
69
|
+
cols.push(row.verticalVariable ?? "-");
|
|
70
|
+
cols.push(row.period);
|
|
71
|
+
if (hasTurvar)
|
|
72
|
+
cols.push(row.derivedVariable ?? "-");
|
|
73
|
+
cols.push(formatValue(row.value));
|
|
74
|
+
lines.push("| " + cols.join(" | ") + " |");
|
|
75
|
+
}
|
|
76
|
+
lines.push("");
|
|
77
|
+
}
|
|
78
|
+
// Unit info
|
|
79
|
+
const units = [...new Set(rows.map((r) => r.unit).filter(Boolean))];
|
|
80
|
+
if (units.length > 0) {
|
|
81
|
+
lines.push(`**Satuan:** ${units.join(", ")}`);
|
|
82
|
+
}
|
|
83
|
+
return appendAttribution(lines.join("\n"), lang);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Try to resolve a datacontent key into labeled row.
|
|
87
|
+
* BPS key format is typically concatenated numeric IDs.
|
|
88
|
+
*/
|
|
89
|
+
function resolveDatacontentKey(key, value, varMap, vervarMap, turvarMap, periodMap, turthMap) {
|
|
90
|
+
// Strategy: try to match known IDs from the metadata maps
|
|
91
|
+
// The key is a concatenation, so we iterate possible splits
|
|
92
|
+
let matchedVar;
|
|
93
|
+
let matchedVervar;
|
|
94
|
+
let matchedTurvar;
|
|
95
|
+
let matchedPeriod;
|
|
96
|
+
let matchedTurth;
|
|
97
|
+
// Try matching against known IDs
|
|
98
|
+
for (const [id, v] of varMap) {
|
|
99
|
+
if (key.includes(id)) {
|
|
100
|
+
matchedVar = v;
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
for (const [id, v] of vervarMap) {
|
|
105
|
+
if (key.includes(id)) {
|
|
106
|
+
matchedVervar = v;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
for (const [id, v] of turvarMap) {
|
|
111
|
+
if (key.includes(id)) {
|
|
112
|
+
matchedTurvar = v;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (const [id, v] of periodMap) {
|
|
117
|
+
if (key.includes(id)) {
|
|
118
|
+
matchedPeriod = v;
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
for (const [id, v] of turthMap) {
|
|
123
|
+
if (key.includes(id)) {
|
|
124
|
+
matchedTurth = v;
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
variable: matchedVar?.title ?? "Data",
|
|
130
|
+
verticalVariable: matchedVervar?.label_vervar,
|
|
131
|
+
derivedVariable: matchedTurvar?.label_turvar,
|
|
132
|
+
period: matchedPeriod?.th_name ?? "N/A",
|
|
133
|
+
derivedPeriod: matchedTurth?.turth_name,
|
|
134
|
+
value,
|
|
135
|
+
unit: matchedVar?.unit,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function buildMap(items, keyFn) {
|
|
139
|
+
const map = new Map();
|
|
140
|
+
if (items) {
|
|
141
|
+
for (const item of items) {
|
|
142
|
+
const [key, val] = keyFn(item);
|
|
143
|
+
map.set(key, val);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return map;
|
|
147
|
+
}
|
|
148
|
+
function formatValue(value) {
|
|
149
|
+
if (typeof value === "number") {
|
|
150
|
+
return value.toLocaleString("id-ID");
|
|
151
|
+
}
|
|
152
|
+
return String(value);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Format a simple list of items into readable text.
|
|
156
|
+
*/
|
|
157
|
+
export function formatList(items, formatter, title, lang = "ind") {
|
|
158
|
+
if (items.length === 0) {
|
|
159
|
+
return appendAttribution(lang === "ind"
|
|
160
|
+
? `Tidak ada ${title.toLowerCase()} yang ditemukan.`
|
|
161
|
+
: `No ${title.toLowerCase()} found.`, lang);
|
|
162
|
+
}
|
|
163
|
+
const lines = [`## ${title}`, "", ...items.map((item, i) => `${i + 1}. ${formatter(item)}`), ""];
|
|
164
|
+
return appendAttribution(lines.join("\n"), lang);
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=data-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-formatter.js","sourceRoot":"","sources":["../../src/services/data-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { BpsClient } from "../client/bps-client.js";
|
|
2
|
+
import type { BpsDomain } from "../client/types.js";
|
|
3
|
+
export declare class DomainResolver {
|
|
4
|
+
private readonly client;
|
|
5
|
+
private domains;
|
|
6
|
+
private nameIndex;
|
|
7
|
+
private loaded;
|
|
8
|
+
constructor(client: BpsClient);
|
|
9
|
+
ensureLoaded(): Promise<void>;
|
|
10
|
+
private loadDomains;
|
|
11
|
+
/**
|
|
12
|
+
* Resolve a query (name, alias, or code) to a BPS domain code.
|
|
13
|
+
* Returns null if no match found.
|
|
14
|
+
*/
|
|
15
|
+
resolve(query: string): Promise<{
|
|
16
|
+
domainId: string;
|
|
17
|
+
domainName: string;
|
|
18
|
+
} | null>;
|
|
19
|
+
/** Get all loaded domains */
|
|
20
|
+
getDomains(): BpsDomain[];
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=domain-resolver.d.ts.map
|