bps-mcp-server 0.16.3 → 0.17.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/README.md +32 -8
- package/dist/client/allstats-client.d.ts +2 -0
- package/dist/client/allstats-client.d.ts.map +1 -1
- package/dist/client/allstats-client.js +62 -34
- package/dist/client/allstats-client.js.map +1 -1
- package/dist/client/bps-client.d.ts +24 -6
- package/dist/client/bps-client.d.ts.map +1 -1
- package/dist/client/bps-client.js +276 -31
- package/dist/client/bps-client.js.map +1 -1
- package/dist/client/endpoints.d.ts +7 -0
- package/dist/client/endpoints.d.ts.map +1 -1
- package/dist/client/endpoints.js +43 -5
- package/dist/client/endpoints.js.map +1 -1
- package/dist/client/fields.d.ts +27 -0
- package/dist/client/fields.d.ts.map +1 -0
- package/dist/client/fields.js +105 -0
- package/dist/client/fields.js.map +1 -0
- package/dist/client/request-scheduler.d.ts +29 -0
- package/dist/client/request-scheduler.d.ts.map +1 -0
- package/dist/client/request-scheduler.js +75 -0
- package/dist/client/request-scheduler.js.map +1 -0
- package/dist/client/types.d.ts +46 -22
- package/dist/client/types.d.ts.map +1 -1
- package/dist/config/kabkota-indicators.d.ts +30 -0
- package/dist/config/kabkota-indicators.d.ts.map +1 -0
- package/dist/config/kabkota-indicators.js +49 -0
- package/dist/config/kabkota-indicators.js.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/domain.resources.js +2 -2
- package/dist/resources/domain.resources.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +31 -1
- package/dist/server.js.map +1 -1
- package/dist/services/data-formatter.d.ts +33 -1
- package/dist/services/data-formatter.d.ts.map +1 -1
- package/dist/services/data-formatter.js +129 -38
- package/dist/services/data-formatter.js.map +1 -1
- package/dist/services/dynamic-data-utils.d.ts +35 -0
- package/dist/services/dynamic-data-utils.d.ts.map +1 -0
- package/dist/services/dynamic-data-utils.js +132 -0
- package/dist/services/dynamic-data-utils.js.map +1 -0
- package/dist/services/file-store.d.ts +5 -1
- package/dist/services/file-store.d.ts.map +1 -1
- package/dist/services/file-store.js +16 -5
- package/dist/services/file-store.js.map +1 -1
- package/dist/services/intent-detector.d.ts.map +1 -1
- package/dist/services/intent-detector.js +11 -10
- package/dist/services/intent-detector.js.map +1 -1
- package/dist/services/kabkota-ranking.d.ts +61 -0
- package/dist/services/kabkota-ranking.d.ts.map +1 -0
- package/dist/services/kabkota-ranking.js +378 -0
- package/dist/services/kabkota-ranking.js.map +1 -0
- package/dist/services/learning.d.ts +2 -0
- package/dist/services/learning.d.ts.map +1 -1
- package/dist/services/learning.js +30 -9
- package/dist/services/learning.js.map +1 -1
- package/dist/services/variable-search.d.ts +50 -0
- package/dist/services/variable-search.d.ts.map +1 -0
- package/dist/services/variable-search.js +482 -0
- package/dist/services/variable-search.js.map +1 -0
- package/dist/tools/allstats.tools.d.ts.map +1 -1
- package/dist/tools/allstats.tools.js +13 -3
- package/dist/tools/allstats.tools.js.map +1 -1
- package/dist/tools/analysis.tools.d.ts.map +1 -1
- package/dist/tools/analysis.tools.js +368 -541
- package/dist/tools/analysis.tools.js.map +1 -1
- package/dist/tools/csa.tools.d.ts.map +1 -1
- package/dist/tools/csa.tools.js +13 -4
- package/dist/tools/csa.tools.js.map +1 -1
- package/dist/tools/dynamic-data.tools.d.ts.map +1 -1
- package/dist/tools/dynamic-data.tools.js +83 -28
- package/dist/tools/dynamic-data.tools.js.map +1 -1
- package/dist/tools/glossary.tools.d.ts +2 -1
- package/dist/tools/glossary.tools.d.ts.map +1 -1
- package/dist/tools/glossary.tools.js +30 -1
- package/dist/tools/glossary.tools.js.map +1 -1
- package/dist/tools/infographic.tools.d.ts.map +1 -1
- package/dist/tools/infographic.tools.js +7 -9
- package/dist/tools/infographic.tools.js.map +1 -1
- package/dist/tools/news.tools.d.ts.map +1 -1
- package/dist/tools/news.tools.js +2 -7
- package/dist/tools/news.tools.js.map +1 -1
- package/dist/tools/publication.tools.d.ts.map +1 -1
- package/dist/tools/publication.tools.js +12 -4
- package/dist/tools/publication.tools.js.map +1 -1
- package/dist/tools/reference.tools.d.ts.map +1 -1
- package/dist/tools/reference.tools.js +3 -1
- package/dist/tools/reference.tools.js.map +1 -1
- package/dist/tools/search.tools.d.ts.map +1 -1
- package/dist/tools/search.tools.js +71 -7
- package/dist/tools/search.tools.js.map +1 -1
- package/dist/tools/smart.tools.d.ts.map +1 -1
- package/dist/tools/smart.tools.js +364 -416
- package/dist/tools/smart.tools.js.map +1 -1
- package/dist/tools/static-table.tools.d.ts.map +1 -1
- package/dist/tools/static-table.tools.js +4 -3
- package/dist/tools/static-table.tools.js.map +1 -1
- package/dist/tools/trade.tools.d.ts.map +1 -1
- package/dist/tools/trade.tools.js +53 -7
- package/dist/tools/trade.tools.js.map +1 -1
- package/dist/utils/error.d.ts +11 -1
- package/dist/utils/error.d.ts.map +1 -1
- package/dist/utils/error.js +55 -2
- package/dist/utils/error.js.map +1 -1
- package/dist/utils/html.d.ts +9 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js +77 -0
- package/dist/utils/html.js.map +1 -0
- package/package.json +10 -10
package/dist/client/endpoints.js
CHANGED
|
@@ -18,6 +18,44 @@ const PATH_PARAMS = new Set(["domain", "key", "lang", "id", "var", "th", "turvar
|
|
|
18
18
|
const TRADE_PATH_PARAMS = new Set(["sumber", "kodehs", "jenishs", "tahun", "periode", "lang", "key"]);
|
|
19
19
|
/** Parameters that go into the URL path for interoperabilitas endpoints */
|
|
20
20
|
const INTEROP_PATH_PARAMS = new Set(["datasource", "id", "kegiatan", "topik", "wilayah", "key"]);
|
|
21
|
+
/**
|
|
22
|
+
* BPS accepts multiple values separated by semicolons (not commas) and ranges
|
|
23
|
+
* with colons. Users naturally type commas, so normalize them before building
|
|
24
|
+
* the path. See the API error: "'th' parameter is required (integer),
|
|
25
|
+
* separated by colon (:) for range or semicolon (;) for multiple values".
|
|
26
|
+
*/
|
|
27
|
+
const MULTI_VALUE_PARAMS = new Set([
|
|
28
|
+
"var",
|
|
29
|
+
"th",
|
|
30
|
+
"turvar",
|
|
31
|
+
"vervar",
|
|
32
|
+
"turth",
|
|
33
|
+
"subject",
|
|
34
|
+
"subcat",
|
|
35
|
+
"kegiatan",
|
|
36
|
+
"topik",
|
|
37
|
+
"wilayah",
|
|
38
|
+
]);
|
|
39
|
+
export function normalizePathParam(key, value) {
|
|
40
|
+
let normalized = String(value).trim();
|
|
41
|
+
if (MULTI_VALUE_PARAMS.has(key)) {
|
|
42
|
+
normalized = normalized
|
|
43
|
+
.replace(/\s*[,;]\s*/g, ";")
|
|
44
|
+
.replace(/;+/g, ";")
|
|
45
|
+
.replace(/^;|;$/g, "");
|
|
46
|
+
}
|
|
47
|
+
return normalized;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Encode a path segment while leaving the BPS multi-value (`;`) and range (`:`)
|
|
51
|
+
* separators intact. `encodeURIComponent` would turn them into `%3B`/`%3A`,
|
|
52
|
+
* which the API does not accept.
|
|
53
|
+
*/
|
|
54
|
+
export function encodePathValue(value) {
|
|
55
|
+
return encodeURIComponent(String(value))
|
|
56
|
+
.replace(/%3B/gi, ";")
|
|
57
|
+
.replace(/%3A/gi, ":");
|
|
58
|
+
}
|
|
21
59
|
/**
|
|
22
60
|
* Build a list URL: /api/list/model/{model}/param1/val1/.../key/{key}/?queryparams
|
|
23
61
|
*/
|
|
@@ -28,7 +66,7 @@ export function buildListUrl(baseUrl, model, params) {
|
|
|
28
66
|
if (value === undefined || value === "")
|
|
29
67
|
continue;
|
|
30
68
|
if (PATH_PARAMS.has(key)) {
|
|
31
|
-
path += `/${key}/${
|
|
69
|
+
path += `/${key}/${encodePathValue(normalizePathParam(key, value))}`;
|
|
32
70
|
}
|
|
33
71
|
else {
|
|
34
72
|
queryParams[key] = String(value);
|
|
@@ -53,7 +91,7 @@ export function buildViewUrl(baseUrl, model, params) {
|
|
|
53
91
|
if (value === undefined || value === "")
|
|
54
92
|
continue;
|
|
55
93
|
if (PATH_PARAMS.has(key)) {
|
|
56
|
-
path += `/${key}/${
|
|
94
|
+
path += `/${key}/${encodePathValue(normalizePathParam(key, value))}`;
|
|
57
95
|
}
|
|
58
96
|
else {
|
|
59
97
|
queryParams[key] = String(value);
|
|
@@ -75,7 +113,7 @@ export function buildDomainUrl(baseUrl, params) {
|
|
|
75
113
|
for (const [key, value] of Object.entries(params)) {
|
|
76
114
|
if (value === undefined || value === "")
|
|
77
115
|
continue;
|
|
78
|
-
path += `/${key}/${
|
|
116
|
+
path += `/${key}/${encodePathValue(normalizePathParam(key, value))}`;
|
|
79
117
|
}
|
|
80
118
|
if (!path.endsWith("/"))
|
|
81
119
|
path += "/";
|
|
@@ -91,7 +129,7 @@ export function buildTradeUrl(baseUrl, params) {
|
|
|
91
129
|
if (value === undefined || value === "")
|
|
92
130
|
continue;
|
|
93
131
|
if (TRADE_PATH_PARAMS.has(key)) {
|
|
94
|
-
path += `/${key}/${
|
|
132
|
+
path += `/${key}/${encodePathValue(normalizePathParam(key, value))}`;
|
|
95
133
|
}
|
|
96
134
|
else {
|
|
97
135
|
queryParams[key] = String(value);
|
|
@@ -115,7 +153,7 @@ export function buildInteropUrl(baseUrl, datasource, params) {
|
|
|
115
153
|
if (value === undefined || value === "")
|
|
116
154
|
continue;
|
|
117
155
|
if (INTEROP_PATH_PARAMS.has(key)) {
|
|
118
|
-
path += `/${key}/${
|
|
156
|
+
path += `/${key}/${encodePathValue(normalizePathParam(key, value))}`;
|
|
119
157
|
}
|
|
120
158
|
else {
|
|
121
159
|
queryParams[key] = String(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../src/client/endpoints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,mEAAmE;AACnE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE5I,6EAA6E;AAC7E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAEtG,2EAA2E;AAC3E,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;AAEjG;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,KAAa,EACb,MAAmD;IAEnD,IAAI,IAAI,GAAG,GAAG,OAAO,mBAAmB,KAAK,EAAE,CAAC;IAChD,MAAM,WAAW,GAA2B,EAAE,CAAC;IAE/C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QAClD,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,IAAI,IAAI,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../src/client/endpoints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,mEAAmE;AACnE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE5I,6EAA6E;AAC7E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAEtG,2EAA2E;AAC3E,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;AAEjG;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,KAAK;IACL,IAAI;IACJ,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,UAAU;IACV,OAAO;IACP,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,KAAsB;IACpE,IAAI,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,UAAU,GAAG,UAAU;aACpB,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;aAC3B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;aACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAsB;IACpD,OAAO,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACrC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,KAAa,EACb,MAAmD;IAEnD,IAAI,IAAI,GAAG,GAAG,OAAO,mBAAmB,KAAK,EAAE,CAAC;IAChD,MAAM,WAAW,GAA2B,EAAE,CAAC;IAE/C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QAClD,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,IAAI,IAAI,GAAG,IAAI,eAAe,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,IAAI,IAAI,GAAG,CAAC;IAErC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,KAAa,EACb,MAAmD;IAEnD,IAAI,IAAI,GAAG,GAAG,OAAO,mBAAmB,KAAK,EAAE,CAAC;IAChD,MAAM,WAAW,GAA2B,EAAE,CAAC;IAE/C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QAClD,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,IAAI,IAAI,GAAG,IAAI,eAAe,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,IAAI,IAAI,GAAG,CAAC;IAErC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,MAAmD;IAEnD,IAAI,IAAI,GAAG,GAAG,OAAO,aAAa,CAAC;IAEnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QAClD,IAAI,IAAI,IAAI,GAAG,IAAI,eAAe,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;IACvE,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,IAAI,IAAI,GAAG,CAAC;IACrC,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,MAAmD;IAEnD,IAAI,IAAI,GAAG,GAAG,OAAO,eAAe,CAAC;IACrC,MAAM,WAAW,GAA2B,EAAE,CAAC;IAE/C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QAClD,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,IAAI,IAAI,GAAG,IAAI,eAAe,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,IAAI,IAAI,GAAG,CAAC;IAErC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,UAAkB,EAClB,MAAmD;IAEnD,IAAI,IAAI,GAAG,GAAG,OAAO,qCAAqC,UAAU,EAAE,CAAC;IACvE,MAAM,WAAW,GAA2B,EAAE,CAAC;IAE/C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QAClD,IAAI,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,IAAI,IAAI,IAAI,GAAG,IAAI,eAAe,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,IAAI,IAAI,GAAG,CAAC;IAErC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,gDAAgD;IAChD,MAAM,EAAE,QAAQ;IAEhB,qBAAqB;IACrB,OAAO,EAAE,SAAS;IAClB,gBAAgB,EAAE,QAAQ;IAE1B,YAAY;IACZ,QAAQ,EAAE,KAAK;IACf,iBAAiB,EAAE,QAAQ;IAC3B,gBAAgB,EAAE,QAAQ;IAC1B,MAAM,EAAE,IAAI;IACZ,cAAc,EAAE,OAAO;IACvB,IAAI,EAAE,MAAM;IAEZ,eAAe;IACf,IAAI,EAAE,MAAM;IAEZ,gBAAgB;IAChB,YAAY,EAAE,aAAa;IAE3B,gBAAgB;IAChB,aAAa,EAAE,cAAc;IAE7B,cAAc;IACd,WAAW,EAAE,aAAa;IAE1B,sBAAsB;IACtB,mBAAmB,EAAE,YAAY;IAEjC,cAAc;IACd,WAAW,EAAE,aAAa;IAE1B,OAAO;IACP,IAAI,EAAE,MAAM;IAEZ,WAAW;IACX,QAAQ,EAAE,WAAW;IAErB,iDAAiD;IACjD,oBAAoB,EAAE,WAAW;IACjC,WAAW,EAAE,YAAY;IACzB,SAAS,EAAE,gBAAgB;CACnB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BPS WebAPI returns two different metadata shapes:
|
|
3
|
+
*
|
|
4
|
+
* - List endpoints (var, vervar, th, turth, ...) use fields such as
|
|
5
|
+
* `th_id`/`th`, `kode_ver_id`/`vervar`, `turth_id`/`turth`.
|
|
6
|
+
* - The dynamic-data endpoint returns the same metadata as `{ val, label }`.
|
|
7
|
+
*
|
|
8
|
+
* These helpers normalize both shapes so tools and formatters don't have to
|
|
9
|
+
* guess (and don't print "undefined" when the schema differs).
|
|
10
|
+
*/
|
|
11
|
+
export declare function getVariableId(variable: unknown): string;
|
|
12
|
+
export declare function getVariableTitle(variable: unknown): string;
|
|
13
|
+
export declare function getVariableUnit(variable: unknown): string | undefined;
|
|
14
|
+
export declare function getVervarId(vervar: unknown): string;
|
|
15
|
+
export declare function getVervarLabel(vervar: unknown): string;
|
|
16
|
+
export declare function getVervarGroup(vervar: unknown): string;
|
|
17
|
+
export declare function getTurvarId(turvar: unknown): string;
|
|
18
|
+
export declare function getTurvarLabel(turvar: unknown): string;
|
|
19
|
+
export declare function getTurvarGroup(turvar: unknown): string;
|
|
20
|
+
export declare function getPeriodId(period: unknown): string;
|
|
21
|
+
export declare function getPeriodLabel(period: unknown): string;
|
|
22
|
+
export declare function getTurthId(turth: unknown): string;
|
|
23
|
+
export declare function getTurthLabel(turth: unknown): string;
|
|
24
|
+
export declare function isNeutralPeriodLabel(label: string | undefined): boolean;
|
|
25
|
+
/** Format an indicator unit for display, hiding BPS' literal "null". */
|
|
26
|
+
export declare function formatUnit(unit: string | null | undefined): string;
|
|
27
|
+
//# sourceMappingURL=fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/client/fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiBH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAGvD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAG1D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CASrE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGnD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGtD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGtD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGnD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGtD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGtD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGnD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGtD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGjD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGpD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAUvE;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKlE"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BPS WebAPI returns two different metadata shapes:
|
|
3
|
+
*
|
|
4
|
+
* - List endpoints (var, vervar, th, turth, ...) use fields such as
|
|
5
|
+
* `th_id`/`th`, `kode_ver_id`/`vervar`, `turth_id`/`turth`.
|
|
6
|
+
* - The dynamic-data endpoint returns the same metadata as `{ val, label }`.
|
|
7
|
+
*
|
|
8
|
+
* These helpers normalize both shapes so tools and formatters don't have to
|
|
9
|
+
* guess (and don't print "undefined" when the schema differs).
|
|
10
|
+
*/
|
|
11
|
+
function firstDefined(bag, ...keys) {
|
|
12
|
+
if (!bag)
|
|
13
|
+
return undefined;
|
|
14
|
+
for (const key of keys) {
|
|
15
|
+
const value = bag[key];
|
|
16
|
+
if (value !== undefined && value !== null && value !== "")
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
function asString(value) {
|
|
22
|
+
return value === undefined || value === null ? "" : String(value);
|
|
23
|
+
}
|
|
24
|
+
export function getVariableId(variable) {
|
|
25
|
+
const bag = variable;
|
|
26
|
+
return asString(firstDefined(bag, "var_id", "val", "id"));
|
|
27
|
+
}
|
|
28
|
+
export function getVariableTitle(variable) {
|
|
29
|
+
const bag = variable;
|
|
30
|
+
return asString(firstDefined(bag, "title", "label", "var_name"));
|
|
31
|
+
}
|
|
32
|
+
export function getVariableUnit(variable) {
|
|
33
|
+
const bag = variable;
|
|
34
|
+
const unit = asString(firstDefined(bag, "unit", "satuan"));
|
|
35
|
+
if (!unit)
|
|
36
|
+
return undefined;
|
|
37
|
+
const normalized = unit.trim();
|
|
38
|
+
if (!normalized || normalized.toLowerCase() === "null")
|
|
39
|
+
return undefined;
|
|
40
|
+
if (normalized.toLowerCase() === "tidak ada satuan")
|
|
41
|
+
return undefined;
|
|
42
|
+
if (normalized === "-")
|
|
43
|
+
return undefined;
|
|
44
|
+
return normalized;
|
|
45
|
+
}
|
|
46
|
+
export function getVervarId(vervar) {
|
|
47
|
+
const bag = vervar;
|
|
48
|
+
return asString(firstDefined(bag, "kode_vervar", "kode_ver_id", "val", "id"));
|
|
49
|
+
}
|
|
50
|
+
export function getVervarLabel(vervar) {
|
|
51
|
+
const bag = vervar;
|
|
52
|
+
return asString(firstDefined(bag, "label_vervar", "vervar", "label"));
|
|
53
|
+
}
|
|
54
|
+
export function getVervarGroup(vervar) {
|
|
55
|
+
const bag = vervar;
|
|
56
|
+
return asString(firstDefined(bag, "name_group_vervar", "name_group_ver_id"));
|
|
57
|
+
}
|
|
58
|
+
export function getTurvarId(turvar) {
|
|
59
|
+
const bag = turvar;
|
|
60
|
+
return asString(firstDefined(bag, "kode_turvar", "kode_tur_id", "turvar_id", "val", "id"));
|
|
61
|
+
}
|
|
62
|
+
export function getTurvarLabel(turvar) {
|
|
63
|
+
const bag = turvar;
|
|
64
|
+
return asString(firstDefined(bag, "label_turvar", "turvar", "label"));
|
|
65
|
+
}
|
|
66
|
+
export function getTurvarGroup(turvar) {
|
|
67
|
+
const bag = turvar;
|
|
68
|
+
return asString(firstDefined(bag, "name_group_turvar", "name_group_tur_id"));
|
|
69
|
+
}
|
|
70
|
+
export function getPeriodId(period) {
|
|
71
|
+
const bag = period;
|
|
72
|
+
return asString(firstDefined(bag, "th_id", "val", "id"));
|
|
73
|
+
}
|
|
74
|
+
export function getPeriodLabel(period) {
|
|
75
|
+
const bag = period;
|
|
76
|
+
return asString(firstDefined(bag, "th_name", "th", "label"));
|
|
77
|
+
}
|
|
78
|
+
export function getTurthId(turth) {
|
|
79
|
+
const bag = turth;
|
|
80
|
+
return asString(firstDefined(bag, "turth_id", "val", "id"));
|
|
81
|
+
}
|
|
82
|
+
export function getTurthLabel(turth) {
|
|
83
|
+
const bag = turth;
|
|
84
|
+
return asString(firstDefined(bag, "turth_name", "turth", "label"));
|
|
85
|
+
}
|
|
86
|
+
export function isNeutralPeriodLabel(label) {
|
|
87
|
+
if (!label)
|
|
88
|
+
return true;
|
|
89
|
+
const normalized = label.trim().toLowerCase();
|
|
90
|
+
return (normalized === "" ||
|
|
91
|
+
normalized.includes("tahunan") ||
|
|
92
|
+
normalized === "tahun" ||
|
|
93
|
+
normalized === "tidak ada" ||
|
|
94
|
+
normalized === "total");
|
|
95
|
+
}
|
|
96
|
+
/** Format an indicator unit for display, hiding BPS' literal "null". */
|
|
97
|
+
export function formatUnit(unit) {
|
|
98
|
+
if (!unit)
|
|
99
|
+
return "";
|
|
100
|
+
const normalized = String(unit).trim();
|
|
101
|
+
if (!normalized || normalized.toLowerCase() === "null" || normalized === "-")
|
|
102
|
+
return "";
|
|
103
|
+
return normalized;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/client/fields.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global request scheduler.
|
|
3
|
+
*
|
|
4
|
+
* BPS WebAPI rate-limits aggressively: a burst of parallel requests (an LLM
|
|
5
|
+
* happily fires 30 at once) immediately returns HTTP 429 and every subsequent
|
|
6
|
+
* call fails for a while. Agents cannot be trusted to self-throttle, so the
|
|
7
|
+
* throttle lives in the client.
|
|
8
|
+
*
|
|
9
|
+
* Requests are queued, run at most `maxConcurrent` at a time, and spaced by
|
|
10
|
+
* `minGapMs` to keep the requests-per-second rate low.
|
|
11
|
+
*/
|
|
12
|
+
export declare class RequestScheduler {
|
|
13
|
+
private readonly maxConcurrent;
|
|
14
|
+
private readonly minGapMs;
|
|
15
|
+
private active;
|
|
16
|
+
/** Earliest timestamp at which the next request may start. */
|
|
17
|
+
private nextSlotAt;
|
|
18
|
+
private readonly queue;
|
|
19
|
+
constructor(maxConcurrent?: number, minGapMs?: number);
|
|
20
|
+
run<T>(task: () => Promise<T>): Promise<T>;
|
|
21
|
+
/** Current number of queued tasks (useful for diagnostics/tests). */
|
|
22
|
+
get pending(): number;
|
|
23
|
+
get running(): number;
|
|
24
|
+
private acquire;
|
|
25
|
+
private release;
|
|
26
|
+
}
|
|
27
|
+
/** Shared scheduler instance used by every BpsClient request. */
|
|
28
|
+
export declare const defaultScheduler: RequestScheduler;
|
|
29
|
+
//# sourceMappingURL=request-scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-scheduler.d.ts","sourceRoot":"","sources":["../../src/client/request-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,qBAAa,gBAAgB;IAOzB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAP3B,OAAO,CAAC,MAAM,CAAK;IACnB,8DAA8D;IAC9D,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;gBAG5B,aAAa,GAAE,MAAU,EACzB,QAAQ,GAAE,MAAW;IAGlC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAShD,qEAAqE;IACrE,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;YAEa,OAAO;IAoBrB,OAAO,CAAC,OAAO;CAKhB;AAED,iEAAiE;AACjE,eAAO,MAAM,gBAAgB,kBAG5B,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global request scheduler.
|
|
3
|
+
*
|
|
4
|
+
* BPS WebAPI rate-limits aggressively: a burst of parallel requests (an LLM
|
|
5
|
+
* happily fires 30 at once) immediately returns HTTP 429 and every subsequent
|
|
6
|
+
* call fails for a while. Agents cannot be trusted to self-throttle, so the
|
|
7
|
+
* throttle lives in the client.
|
|
8
|
+
*
|
|
9
|
+
* Requests are queued, run at most `maxConcurrent` at a time, and spaced by
|
|
10
|
+
* `minGapMs` to keep the requests-per-second rate low.
|
|
11
|
+
*/
|
|
12
|
+
export class RequestScheduler {
|
|
13
|
+
maxConcurrent;
|
|
14
|
+
minGapMs;
|
|
15
|
+
active = 0;
|
|
16
|
+
/** Earliest timestamp at which the next request may start. */
|
|
17
|
+
nextSlotAt = 0;
|
|
18
|
+
queue = [];
|
|
19
|
+
constructor(maxConcurrent = 4, minGapMs = 40) {
|
|
20
|
+
this.maxConcurrent = maxConcurrent;
|
|
21
|
+
this.minGapMs = minGapMs;
|
|
22
|
+
}
|
|
23
|
+
async run(task) {
|
|
24
|
+
await this.acquire();
|
|
25
|
+
try {
|
|
26
|
+
return await task();
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
this.release();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Current number of queued tasks (useful for diagnostics/tests). */
|
|
33
|
+
get pending() {
|
|
34
|
+
return this.queue.length;
|
|
35
|
+
}
|
|
36
|
+
get running() {
|
|
37
|
+
return this.active;
|
|
38
|
+
}
|
|
39
|
+
async acquire() {
|
|
40
|
+
if (this.active >= this.maxConcurrent) {
|
|
41
|
+
await new Promise((resolve) => this.queue.push(resolve));
|
|
42
|
+
}
|
|
43
|
+
this.active += 1;
|
|
44
|
+
if (this.minGapMs > 0) {
|
|
45
|
+
// Reserve a slot atomically so parallel acquisitions are spaced too,
|
|
46
|
+
// not just queued: otherwise N tasks that grab a free slot at the same
|
|
47
|
+
// moment all fire at once.
|
|
48
|
+
const now = Date.now();
|
|
49
|
+
const startAt = Math.max(now, this.nextSlotAt);
|
|
50
|
+
this.nextSlotAt = startAt + this.minGapMs;
|
|
51
|
+
const wait = startAt - now;
|
|
52
|
+
if (wait > 0) {
|
|
53
|
+
await new Promise((resolve) => setTimeout(resolve, wait));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
release() {
|
|
58
|
+
this.active -= 1;
|
|
59
|
+
const next = this.queue.shift();
|
|
60
|
+
if (next)
|
|
61
|
+
next();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Shared scheduler instance used by every BpsClient request. */
|
|
65
|
+
export const defaultScheduler = new RequestScheduler(readPositiveInt(readEnv("BPS_MAX_CONCURRENCY"), 3), readPositiveInt(readEnv("BPS_MIN_REQUEST_GAP_MS"), 250));
|
|
66
|
+
/** Read an env var without assuming `process` exists (Cloudflare Workers). */
|
|
67
|
+
function readEnv(name) {
|
|
68
|
+
const env = globalThis.process?.env;
|
|
69
|
+
return env?.[name];
|
|
70
|
+
}
|
|
71
|
+
function readPositiveInt(value, fallback) {
|
|
72
|
+
const parsed = Number(value);
|
|
73
|
+
return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : fallback;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=request-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-scheduler.js","sourceRoot":"","sources":["../../src/client/request-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,gBAAgB;IAOR;IACA;IAPX,MAAM,GAAG,CAAC,CAAC;IACnB,8DAA8D;IACtD,UAAU,GAAG,CAAC,CAAC;IACN,KAAK,GAAsB,EAAE,CAAC;IAE/C,YACmB,gBAAwB,CAAC,EACzB,WAAmB,EAAE;QADrB,kBAAa,GAAb,aAAa,CAAY;QACzB,aAAQ,GAAR,QAAQ,CAAa;IACrC,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAI,IAAsB;QACjC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACtC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAEjB,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YACtB,qEAAqE;YACrE,uEAAuE;YACvE,2BAA2B;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,IAAI,CAAC,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC1C,MAAM,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;YAC3B,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;gBACb,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI;YAAE,IAAI,EAAE,CAAC;IACnB,CAAC;CACF;AAED,iEAAiE;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAClD,eAAe,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,EAClD,eAAe,CAAC,OAAO,CAAC,wBAAwB,CAAC,EAAE,GAAG,CAAC,CACxD,CAAC;AAEF,8EAA8E;AAC9E,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,GAAG,GAAI,UAAyE,CAAC,OAAO,EAAE,GAAG,CAAC;IACpG,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB,EAAE,QAAgB;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/E,CAAC"}
|
package/dist/client/types.d.ts
CHANGED
|
@@ -17,8 +17,8 @@ export interface BpsSubject {
|
|
|
17
17
|
title: string;
|
|
18
18
|
subcat_id?: number;
|
|
19
19
|
subcat?: string;
|
|
20
|
-
ntabel?: number;
|
|
21
|
-
nvar?: number;
|
|
20
|
+
ntabel?: number | null;
|
|
21
|
+
nvar?: number | null;
|
|
22
22
|
}
|
|
23
23
|
/** Subject Category */
|
|
24
24
|
export interface BpsSubjectCategory {
|
|
@@ -37,30 +37,53 @@ export interface BpsVariable {
|
|
|
37
37
|
graph_id?: number;
|
|
38
38
|
graph_name?: string;
|
|
39
39
|
}
|
|
40
|
-
/** Vertical Variable */
|
|
40
|
+
/** Vertical Variable (list endpoints use `kode_ver_id`, data endpoints use `val`) */
|
|
41
41
|
export interface BpsVerticalVariable {
|
|
42
|
-
kode_vervar
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
kode_vervar?: number;
|
|
43
|
+
kode_ver_id?: number;
|
|
44
|
+
label_vervar?: string;
|
|
45
|
+
vervar?: string;
|
|
46
|
+
group_vervar?: number;
|
|
47
|
+
group_ver_id?: number;
|
|
48
|
+
name_group_vervar?: string;
|
|
49
|
+
name_group_ver_id?: string;
|
|
50
|
+
val?: number | string;
|
|
51
|
+
label?: string;
|
|
46
52
|
}
|
|
47
53
|
/** Derived Variable */
|
|
48
54
|
export interface BpsDerivedVariable {
|
|
49
|
-
kode_turvar
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
kode_turvar?: number;
|
|
56
|
+
kode_tur_id?: number;
|
|
57
|
+
turvar_id?: number;
|
|
58
|
+
label_turvar?: string;
|
|
59
|
+
turvar?: string;
|
|
60
|
+
group_turvar?: number;
|
|
61
|
+
group_tur_id?: number;
|
|
62
|
+
group_turvar_id?: number;
|
|
63
|
+
name_group_turvar?: string;
|
|
64
|
+
name_group_tur_id?: string;
|
|
65
|
+
val?: number | string;
|
|
66
|
+
label?: string;
|
|
53
67
|
}
|
|
54
|
-
/** Period */
|
|
68
|
+
/** Period (list endpoints use `th`, data endpoints use `label`) */
|
|
55
69
|
export interface BpsPeriod {
|
|
56
|
-
th_id
|
|
57
|
-
th_name
|
|
58
|
-
|
|
70
|
+
th_id?: number;
|
|
71
|
+
th_name?: string;
|
|
72
|
+
th?: string;
|
|
73
|
+
val?: number | string;
|
|
74
|
+
label?: string;
|
|
75
|
+
var_id?: number;
|
|
76
|
+
var_name?: string;
|
|
59
77
|
}
|
|
60
78
|
/** Derived Period */
|
|
61
79
|
export interface BpsDerivedPeriod {
|
|
62
|
-
turth_id
|
|
63
|
-
turth_name
|
|
80
|
+
turth_id?: number;
|
|
81
|
+
turth_name?: string;
|
|
82
|
+
turth?: string;
|
|
83
|
+
group_turth_id?: number;
|
|
84
|
+
name_group_turth?: string;
|
|
85
|
+
val?: number | string;
|
|
86
|
+
label?: string;
|
|
64
87
|
}
|
|
65
88
|
/** Unit */
|
|
66
89
|
export interface BpsUnit {
|
|
@@ -88,7 +111,7 @@ export interface BpsStaticTable {
|
|
|
88
111
|
title: string;
|
|
89
112
|
subj_id: number;
|
|
90
113
|
subj?: string;
|
|
91
|
-
updt_date: string;
|
|
114
|
+
updt_date: string | null;
|
|
92
115
|
size: string;
|
|
93
116
|
excel?: string;
|
|
94
117
|
}
|
|
@@ -99,7 +122,7 @@ export interface BpsStaticTableDetail {
|
|
|
99
122
|
subj_id: number;
|
|
100
123
|
subj?: string;
|
|
101
124
|
table: string;
|
|
102
|
-
updt_date: string;
|
|
125
|
+
updt_date: string | null;
|
|
103
126
|
size: string;
|
|
104
127
|
excel?: string;
|
|
105
128
|
}
|
|
@@ -135,7 +158,7 @@ export interface BpsStrategicIndicator {
|
|
|
135
158
|
name?: string;
|
|
136
159
|
data_source?: string;
|
|
137
160
|
value: number | string;
|
|
138
|
-
unit: string;
|
|
161
|
+
unit: string | null;
|
|
139
162
|
category?: number;
|
|
140
163
|
hash_id?: string;
|
|
141
164
|
periode: string;
|
|
@@ -148,7 +171,7 @@ export interface BpsInfographic {
|
|
|
148
171
|
inf_id: number;
|
|
149
172
|
title: string;
|
|
150
173
|
img: string;
|
|
151
|
-
date: string;
|
|
174
|
+
date: string | null;
|
|
152
175
|
desc: string;
|
|
153
176
|
category: number;
|
|
154
177
|
dl: string;
|
|
@@ -228,7 +251,8 @@ export interface BpsCsaTable {
|
|
|
228
251
|
id_subject: number;
|
|
229
252
|
subject: string;
|
|
230
253
|
id_subcat: number;
|
|
231
|
-
subcat
|
|
254
|
+
subcat?: string;
|
|
255
|
+
subcat_name?: string;
|
|
232
256
|
tablesource: string;
|
|
233
257
|
last_update: string;
|
|
234
258
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oBAAoB;AACpB,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,cAAc;AACd,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crosswalk for indicators that BPS publishes **per kabupaten/kota**, but only
|
|
3
|
+
* inside each provincial domain (there is no national kab/kota table).
|
|
4
|
+
*
|
|
5
|
+
* Without this map a client has to sweep 34 provincial domains, guess a
|
|
6
|
+
* variable name in each one, and still get the wrong table half the time.
|
|
7
|
+
* The var_ids below were verified against BPS WebAPI; when BPS revises a
|
|
8
|
+
* table the sweep falls back to keyword discovery (`searchVariables`).
|
|
9
|
+
*
|
|
10
|
+
* Add new indicators here as they are verified — one entry replaces dozens of
|
|
11
|
+
* discovery calls.
|
|
12
|
+
*/
|
|
13
|
+
export interface KabkotaIndicatorHint {
|
|
14
|
+
/** Stable identifier used in logs/tests. */
|
|
15
|
+
id: string;
|
|
16
|
+
/** Human label for the indicator. */
|
|
17
|
+
label: string;
|
|
18
|
+
/** Query pattern that should use this crosswalk. */
|
|
19
|
+
pattern: RegExp;
|
|
20
|
+
/** Province domain → var_id of the kabupaten/kota table. */
|
|
21
|
+
variables: Record<string, string>;
|
|
22
|
+
/**
|
|
23
|
+
* Province domains that publish the indicator only as province totals
|
|
24
|
+
* (no kab/kota breakdown in WebAPI). They are reported as "not covered".
|
|
25
|
+
*/
|
|
26
|
+
unavailable: Record<string, string>;
|
|
27
|
+
}
|
|
28
|
+
export declare const KABKOTA_INDICATORS: KabkotaIndicatorHint[];
|
|
29
|
+
export declare function findKabkotaIndicator(query: string): KabkotaIndicatorHint | null;
|
|
30
|
+
//# sourceMappingURL=kabkota-indicators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kabkota-indicators.d.ts","sourceRoot":"","sources":["../../src/config/kabkota-indicators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,eAAO,MAAM,kBAAkB,EAAE,oBAAoB,EA4CpD,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAE/E"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export const KABKOTA_INDICATORS = [
|
|
2
|
+
{
|
|
3
|
+
id: "tpt",
|
|
4
|
+
label: "Tingkat Pengangguran Terbuka (TPT) menurut Kabupaten/Kota",
|
|
5
|
+
pattern: /\b(tpt|pengangguran|penganggur|unemployment)\b/i,
|
|
6
|
+
variables: {
|
|
7
|
+
"1100": "206",
|
|
8
|
+
"1200": "44",
|
|
9
|
+
"1300": "139",
|
|
10
|
+
"1400": "42",
|
|
11
|
+
"1500": "844",
|
|
12
|
+
"1800": "47",
|
|
13
|
+
"1900": "95",
|
|
14
|
+
"2100": "224",
|
|
15
|
+
"3200": "73",
|
|
16
|
+
"3300": "64",
|
|
17
|
+
"3500": "54",
|
|
18
|
+
"3600": "157",
|
|
19
|
+
"6100": "51",
|
|
20
|
+
"6200": "389",
|
|
21
|
+
"6300": "37",
|
|
22
|
+
"6400": "59",
|
|
23
|
+
"6500": "115",
|
|
24
|
+
"7200": "92",
|
|
25
|
+
"7300": "466",
|
|
26
|
+
"7400": "395",
|
|
27
|
+
"7500": "184",
|
|
28
|
+
"7600": "520",
|
|
29
|
+
"8100": "108",
|
|
30
|
+
"8200": "250",
|
|
31
|
+
"9100": "270",
|
|
32
|
+
},
|
|
33
|
+
unavailable: {
|
|
34
|
+
"1600": "Hanya tersedia angka provinsi (TPT Sumatera Selatan)",
|
|
35
|
+
"1700": "Hanya tersedia angka provinsi + tabel statis 2022",
|
|
36
|
+
"3100": "DKI Jakarta hanya satu level kota administrasi",
|
|
37
|
+
"3400": "Hanya tersedia angka provinsi (TPT D.I. Yogyakarta)",
|
|
38
|
+
"5100": "Tabel 'Persentase Pengangguran' memakai denominasi berbeda",
|
|
39
|
+
"5200": "Hanya tersedia angka provinsi (TPT NTB)",
|
|
40
|
+
"5300": "Hanya tersedia angka provinsi (TPT NTT)",
|
|
41
|
+
"7100": "Tidak ada tabel TPT kab/kota; hanya jumlah pengangguran (jiwa)",
|
|
42
|
+
"9400": "Tabel TPT kab/kota tersedia sebagai tabel statis, bukan WebAPI",
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
export function findKabkotaIndicator(query) {
|
|
47
|
+
return KABKOTA_INDICATORS.find((indicator) => indicator.pattern.test(query)) ?? null;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=kabkota-indicators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kabkota-indicators.js","sourceRoot":"","sources":["../../src/config/kabkota-indicators.ts"],"names":[],"mappings":"AA4BA,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD;QACE,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,2DAA2D;QAClE,OAAO,EAAE,iDAAiD;QAC1D,SAAS,EAAE;YACT,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,KAAK;SACd;QACD,WAAW,EAAE;YACX,MAAM,EAAE,sDAAsD;YAC9D,MAAM,EAAE,mDAAmD;YAC3D,MAAM,EAAE,gDAAgD;YACxD,MAAM,EAAE,qDAAqD;YAC7D,MAAM,EAAE,4DAA4D;YACpE,MAAM,EAAE,yCAAyC;YACjD,MAAM,EAAE,yCAAyC;YACjD,MAAM,EAAE,gEAAgE;YACxE,MAAM,EAAE,gEAAgE;SACzE;KACF;CACF,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC;AACvF,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -24,6 +24,25 @@ async function main() {
|
|
|
24
24
|
const cache = config.cacheEnabled ? new InMemoryCache(config.cacheMaxEntries) : null;
|
|
25
25
|
const store = new FileStore(undefined, config.apiKey);
|
|
26
26
|
const { server } = createServer(config, auth, cache, store, pkg.version);
|
|
27
|
+
// The learned-variable store writes with a debounce; flush it on shutdown
|
|
28
|
+
// so mappings are not lost when the MCP client closes the process.
|
|
29
|
+
const flushStore = () => {
|
|
30
|
+
try {
|
|
31
|
+
store.flushNow();
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Best effort during shutdown.
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
process.once("exit", flushStore);
|
|
38
|
+
process.once("SIGINT", () => {
|
|
39
|
+
flushStore();
|
|
40
|
+
process.exit(0);
|
|
41
|
+
});
|
|
42
|
+
process.once("SIGTERM", () => {
|
|
43
|
+
flushStore();
|
|
44
|
+
process.exit(0);
|
|
45
|
+
});
|
|
27
46
|
await startStdioTransport(server);
|
|
28
47
|
}
|
|
29
48
|
catch (error) {
|