bps-mcp-server 0.16.3 → 0.16.4

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.
Files changed (96) hide show
  1. package/README.md +19 -3
  2. package/dist/client/allstats-client.d.ts +2 -0
  3. package/dist/client/allstats-client.d.ts.map +1 -1
  4. package/dist/client/allstats-client.js +62 -34
  5. package/dist/client/allstats-client.js.map +1 -1
  6. package/dist/client/bps-client.d.ts +14 -5
  7. package/dist/client/bps-client.d.ts.map +1 -1
  8. package/dist/client/bps-client.js +215 -23
  9. package/dist/client/bps-client.js.map +1 -1
  10. package/dist/client/endpoints.d.ts +7 -0
  11. package/dist/client/endpoints.d.ts.map +1 -1
  12. package/dist/client/endpoints.js +43 -5
  13. package/dist/client/endpoints.js.map +1 -1
  14. package/dist/client/fields.d.ts +27 -0
  15. package/dist/client/fields.d.ts.map +1 -0
  16. package/dist/client/fields.js +105 -0
  17. package/dist/client/fields.js.map +1 -0
  18. package/dist/client/types.d.ts +46 -22
  19. package/dist/client/types.d.ts.map +1 -1
  20. package/dist/index.js +19 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/resources/domain.resources.js +2 -2
  23. package/dist/resources/domain.resources.js.map +1 -1
  24. package/dist/server.js +1 -1
  25. package/dist/server.js.map +1 -1
  26. package/dist/services/data-formatter.d.ts +5 -1
  27. package/dist/services/data-formatter.d.ts.map +1 -1
  28. package/dist/services/data-formatter.js +55 -38
  29. package/dist/services/data-formatter.js.map +1 -1
  30. package/dist/services/dynamic-data-utils.d.ts +35 -0
  31. package/dist/services/dynamic-data-utils.d.ts.map +1 -0
  32. package/dist/services/dynamic-data-utils.js +132 -0
  33. package/dist/services/dynamic-data-utils.js.map +1 -0
  34. package/dist/services/file-store.d.ts +5 -1
  35. package/dist/services/file-store.d.ts.map +1 -1
  36. package/dist/services/file-store.js +16 -5
  37. package/dist/services/file-store.js.map +1 -1
  38. package/dist/services/intent-detector.d.ts.map +1 -1
  39. package/dist/services/intent-detector.js +10 -10
  40. package/dist/services/intent-detector.js.map +1 -1
  41. package/dist/services/learning.d.ts +2 -0
  42. package/dist/services/learning.d.ts.map +1 -1
  43. package/dist/services/learning.js +30 -9
  44. package/dist/services/learning.js.map +1 -1
  45. package/dist/services/variable-search.d.ts +50 -0
  46. package/dist/services/variable-search.d.ts.map +1 -0
  47. package/dist/services/variable-search.js +482 -0
  48. package/dist/services/variable-search.js.map +1 -0
  49. package/dist/tools/allstats.tools.d.ts.map +1 -1
  50. package/dist/tools/allstats.tools.js +13 -3
  51. package/dist/tools/allstats.tools.js.map +1 -1
  52. package/dist/tools/analysis.tools.d.ts.map +1 -1
  53. package/dist/tools/analysis.tools.js +291 -533
  54. package/dist/tools/analysis.tools.js.map +1 -1
  55. package/dist/tools/csa.tools.d.ts.map +1 -1
  56. package/dist/tools/csa.tools.js +13 -4
  57. package/dist/tools/csa.tools.js.map +1 -1
  58. package/dist/tools/dynamic-data.tools.d.ts.map +1 -1
  59. package/dist/tools/dynamic-data.tools.js +66 -23
  60. package/dist/tools/dynamic-data.tools.js.map +1 -1
  61. package/dist/tools/glossary.tools.d.ts +2 -1
  62. package/dist/tools/glossary.tools.d.ts.map +1 -1
  63. package/dist/tools/glossary.tools.js +30 -1
  64. package/dist/tools/glossary.tools.js.map +1 -1
  65. package/dist/tools/infographic.tools.d.ts.map +1 -1
  66. package/dist/tools/infographic.tools.js +7 -9
  67. package/dist/tools/infographic.tools.js.map +1 -1
  68. package/dist/tools/news.tools.d.ts.map +1 -1
  69. package/dist/tools/news.tools.js +2 -7
  70. package/dist/tools/news.tools.js.map +1 -1
  71. package/dist/tools/publication.tools.d.ts.map +1 -1
  72. package/dist/tools/publication.tools.js +12 -4
  73. package/dist/tools/publication.tools.js.map +1 -1
  74. package/dist/tools/reference.tools.d.ts.map +1 -1
  75. package/dist/tools/reference.tools.js +3 -1
  76. package/dist/tools/reference.tools.js.map +1 -1
  77. package/dist/tools/search.tools.d.ts.map +1 -1
  78. package/dist/tools/search.tools.js +71 -7
  79. package/dist/tools/search.tools.js.map +1 -1
  80. package/dist/tools/smart.tools.d.ts.map +1 -1
  81. package/dist/tools/smart.tools.js +352 -414
  82. package/dist/tools/smart.tools.js.map +1 -1
  83. package/dist/tools/static-table.tools.d.ts.map +1 -1
  84. package/dist/tools/static-table.tools.js +4 -3
  85. package/dist/tools/static-table.tools.js.map +1 -1
  86. package/dist/tools/trade.tools.d.ts.map +1 -1
  87. package/dist/tools/trade.tools.js +53 -7
  88. package/dist/tools/trade.tools.js.map +1 -1
  89. package/dist/utils/error.d.ts.map +1 -1
  90. package/dist/utils/error.js +5 -0
  91. package/dist/utils/error.js.map +1 -1
  92. package/dist/utils/html.d.ts +9 -0
  93. package/dist/utils/html.d.ts.map +1 -0
  94. package/dist/utils/html.js +77 -0
  95. package/dist/utils/html.js.map +1 -0
  96. package/package.json +10 -10
@@ -0,0 +1,132 @@
1
+ import { getTurvarId, getTurvarLabel, getVariableId, getVervarId, getVervarLabel, } from "../client/fields.js";
2
+ export function getVervarEntries(response) {
3
+ return (response.vervar ?? [])
4
+ .map((vervar) => ({ id: getVervarId(vervar), label: getVervarLabel(vervar) }))
5
+ .filter((entry) => entry.id !== "");
6
+ }
7
+ /**
8
+ * Pick the aggregate row for a response.
9
+ * Examples: INDONESIA (9999), Kota+Desa (poverty), or the domain's own
10
+ * province/city when the data is a national table queried for a region.
11
+ */
12
+ export function selectAggregateVervar(response, domain, domainName) {
13
+ const entries = getVervarEntries(response);
14
+ if (entries.length === 0)
15
+ return null;
16
+ const indonesia = entries.find((entry) => /\bindonesia\b/i.test(entry.label));
17
+ if (indonesia)
18
+ return indonesia.id;
19
+ const combined = entries.find((entry) => /^(kota\s*\+\s*desa|total|jumlah|nasional|semua)$/i.test(entry.label.trim()));
20
+ if (combined)
21
+ return combined.id;
22
+ if (domain !== "0000") {
23
+ const exact = entries.find((entry) => entry.id === domain ||
24
+ (domainName !== undefined && entry.label.trim().toLowerCase() === domainName.trim().toLowerCase()));
25
+ if (exact)
26
+ return exact.id;
27
+ const provinceLike = entries.find((entry) => entry.id === `${domain.slice(0, 2)}99` || entry.id === `${domain.slice(0, 4)}0`);
28
+ if (provinceLike)
29
+ return provinceLike.id;
30
+ if (entries.length === 1)
31
+ return entries[0].id;
32
+ }
33
+ return null;
34
+ }
35
+ /**
36
+ * Find the vervar id at the start of a datacontent key.
37
+ * Prefer the longest known id so "3" does not swallow a "30" category.
38
+ */
39
+ export function extractVervarId(key, response) {
40
+ const ids = getVervarEntries(response).map((entry) => entry.id).sort((a, b) => b.length - a.length);
41
+ for (const id of ids) {
42
+ if (key.startsWith(id))
43
+ return id;
44
+ }
45
+ return null;
46
+ }
47
+ /**
48
+ * Keep every category when the breakdown is small and meaningful (e.g.
49
+ * Kota/Desa/Kota+Desa), but collapse large region breakdowns to the aggregate
50
+ * so `find_data` does not dump hundreds of kabupaten rows.
51
+ */
52
+ export function filterRelevantVervar(response, domain, domainName, maxCategories = 10) {
53
+ const entries = getVervarEntries(response);
54
+ if (entries.length <= maxCategories)
55
+ return response;
56
+ const aggregate = selectAggregateVervar(response, domain, domainName);
57
+ if (!aggregate)
58
+ return response;
59
+ const datacontent = response.datacontent ?? {};
60
+ const filtered = Object.fromEntries(Object.entries(datacontent).filter(([key]) => extractVervarId(key, response) === aggregate));
61
+ if (Object.keys(filtered).length === 0)
62
+ return response;
63
+ return {
64
+ ...response,
65
+ datacontent: filtered,
66
+ vervar: (response.vervar ?? []).filter((vervar) => getVervarId(vervar) === aggregate),
67
+ };
68
+ }
69
+ function getTurvarEntries(response) {
70
+ return (response.turvar ?? [])
71
+ .map((turvar) => ({ id: getTurvarId(turvar), label: getTurvarLabel(turvar) }))
72
+ .filter((entry) => entry.id !== "");
73
+ }
74
+ /** Pick the combined derived-variable row (e.g. "Perkotaan + Perdesaan"). */
75
+ export function selectAggregateTurvar(response) {
76
+ const entries = getTurvarEntries(response);
77
+ if (entries.length === 0)
78
+ return null;
79
+ if (entries.length === 1)
80
+ return entries[0].id;
81
+ const combined = entries.find((entry) => /perkotaan\s*\+\s*perdesaan|perdesaan\s*\+\s*perkotaan|^(total|jumlah|semua)$/i.test(entry.label.trim()));
82
+ return combined?.id ?? null;
83
+ }
84
+ /**
85
+ * Find the derived-variable id inside a datacontent key by stripping the
86
+ * vervar and variable prefixes (avoids "1" matching "12").
87
+ */
88
+ export function extractTurvarId(key, response) {
89
+ const vervarId = extractVervarId(key, response);
90
+ let rest = vervarId ? key.slice(vervarId.length) : key;
91
+ const varIds = (response.var ?? [])
92
+ .map((variable) => getVariableId(variable))
93
+ .filter(Boolean)
94
+ .sort((a, b) => b.length - a.length);
95
+ const varId = varIds.find((id) => rest.startsWith(id));
96
+ if (varId)
97
+ rest = rest.slice(varId.length);
98
+ const turvarIds = getTurvarEntries(response)
99
+ .map((entry) => entry.id)
100
+ .sort((a, b) => b.length - a.length);
101
+ return turvarIds.find((id) => rest.startsWith(id)) ?? null;
102
+ }
103
+ /** Extract the aggregate numeric value (or the only value) from a response. */
104
+ export function getAggregateValue(response, domain, domainName) {
105
+ const datacontent = response.datacontent ?? {};
106
+ const numericEntries = Object.entries(datacontent).filter((entry) => typeof entry[1] === "number");
107
+ if (numericEntries.length === 0)
108
+ return null;
109
+ const aggregateVervar = selectAggregateVervar(response, domain, domainName);
110
+ const aggregateTurvar = selectAggregateTurvar(response);
111
+ if (aggregateVervar || aggregateTurvar) {
112
+ const match = numericEntries.find(([key]) => {
113
+ if (aggregateVervar && extractVervarId(key, response) !== aggregateVervar)
114
+ return false;
115
+ if (aggregateTurvar && extractTurvarId(key, response) !== aggregateTurvar)
116
+ return false;
117
+ return true;
118
+ });
119
+ if (match)
120
+ return match[1];
121
+ }
122
+ // Only safe when there is exactly one numeric value.
123
+ if (numericEntries.length === 1)
124
+ return numericEntries[0][1];
125
+ return null;
126
+ }
127
+ /** Find a vervar label by id (for formatting ranking rows). */
128
+ export function getVervarLabelById(response, id) {
129
+ const entry = getVervarEntries(response).find((candidate) => candidate.id === id);
130
+ return entry?.label ?? null;
131
+ }
132
+ //# sourceMappingURL=dynamic-data-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-data-utils.js","sourceRoot":"","sources":["../../src/services/dynamic-data-utils.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,9 @@ import type { IPersistentStore } from "./persistent-store.js";
2
2
  /**
3
3
  * File-based persistent store for stdio transport.
4
4
  * Reads from disk on init, writes debounced.
5
- * Syncs with remote Worker for shared learning.
5
+ *
6
+ * Remote sync is opt-in: set BPS_WORKER_URL explicitly. The server will not
7
+ * send your BPS API key to a third-party host by default.
6
8
  */
7
9
  export declare class FileStore implements IPersistentStore {
8
10
  private data;
@@ -21,6 +23,8 @@ export declare class FileStore implements IPersistentStore {
21
23
  get(key: string): Promise<string | null>;
22
24
  set(key: string, value: string): Promise<void>;
23
25
  delete(key: string): Promise<void>;
26
+ /** Flush pending changes synchronously (called on process exit). */
27
+ flushNow(): void;
24
28
  getAll(): Promise<Record<string, string>>;
25
29
  merge(entries: Record<string, string>): Promise<void>;
26
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/services/file-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAU9D;;;;GAIG;AACH,qBAAa,SAAU,YAAW,gBAAgB;IAChD,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAO/C,OAAO,CAAC,IAAI;IAaZ,gEAAgE;IAChE,OAAO,CAAC,cAAc;IAyBtB,mEAAmE;IACnE,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,KAAK;IAYP,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIzC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAa5D"}
1
+ {"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/services/file-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQ9D;;;;;;GAMG;AACH,qBAAa,SAAU,YAAW,gBAAgB;IAChD,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAS/C,OAAO,CAAC,IAAI;IAaZ,gEAAgE;IAChE,OAAO,CAAC,cAAc;IAyBtB,mEAAmE;IACnE,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,KAAK;IAYP,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,oEAAoE;IACpE,QAAQ,IAAI,IAAI;IAQV,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIzC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAa5D"}
@@ -6,11 +6,12 @@ const STORE_DIR = join(homedir(), ".bps-mcp");
6
6
  const STORE_FILE = join(STORE_DIR, "learned-vars.json");
7
7
  const FLUSH_DELAY_MS = 5_000;
8
8
  const SYNC_TIMEOUT_MS = 5_000;
9
- const DEFAULT_WORKER_URL = "https://bps-mcp-server.murphi.my.id";
10
9
  /**
11
10
  * File-based persistent store for stdio transport.
12
11
  * Reads from disk on init, writes debounced.
13
- * Syncs with remote Worker for shared learning.
12
+ *
13
+ * Remote sync is opt-in: set BPS_WORKER_URL explicitly. The server will not
14
+ * send your BPS API key to a third-party host by default.
14
15
  */
15
16
  export class FileStore {
16
17
  data = {};
@@ -19,10 +20,12 @@ export class FileStore {
19
20
  workerUrl;
20
21
  apiKey;
21
22
  constructor(workerUrl, apiKey) {
22
- this.workerUrl = workerUrl || process.env.BPS_WORKER_URL || DEFAULT_WORKER_URL;
23
+ this.workerUrl = workerUrl || process.env.BPS_WORKER_URL || "";
23
24
  this.apiKey = apiKey || process.env.BPS_API_KEY || null;
24
25
  this.load();
25
- this.syncFromWorker();
26
+ if (this.workerUrl && this.apiKey) {
27
+ this.syncFromWorker();
28
+ }
26
29
  }
27
30
  load() {
28
31
  try {
@@ -65,7 +68,7 @@ export class FileStore {
65
68
  }
66
69
  /** Push a single entry to Worker (background, fire-and-forget). */
67
70
  pushToWorker(key, value) {
68
- if (!this.apiKey)
71
+ if (!this.workerUrl || !this.apiKey)
69
72
  return;
70
73
  const endpoint = key.startsWith("period:") ? "/api/learned-periods" : "/api/learned-vars";
71
74
  fetch(`${this.workerUrl}${endpoint}`, {
@@ -117,6 +120,14 @@ export class FileStore {
117
120
  this.scheduleFlush();
118
121
  }
119
122
  }
123
+ /** Flush pending changes synchronously (called on process exit). */
124
+ flushNow() {
125
+ if (this.flushTimer) {
126
+ clearTimeout(this.flushTimer);
127
+ this.flushTimer = null;
128
+ }
129
+ this.flush();
130
+ }
120
131
  async getAll() {
121
132
  return { ...this.data };
122
133
  }
@@ -1 +1 @@
1
- {"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/services/file-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/services/file-store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"intent-detector.d.ts","sourceRoot":"","sources":["../../src/services/intent-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GACjB,cAAc,GACd,YAAY,GACZ,OAAO,GACP,SAAS,GACT,OAAO,GACP,aAAa,GACb,SAAS,CAAC;AAEd,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AA6CD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,YAAY,CAmGd;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,EAAE,CAiCV"}
1
+ {"version":3,"file":"intent-detector.d.ts","sourceRoot":"","sources":["../../src/services/intent-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GACjB,cAAc,GACd,YAAY,GACZ,OAAO,GACP,SAAS,GACT,OAAO,GACP,aAAa,GACb,SAAS,CAAC;AAEd,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AA4CD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,YAAY,CAyGd;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,EAAE,CAiCV"}
@@ -4,12 +4,11 @@
4
4
  */
5
5
  // --- Intent patterns ---
6
6
  const COMPARISON_PATTERNS = [
7
- /\b(bandingkan|banding|vs|versus|dibandingkan|dibanding|membandingkan)\b/i,
7
+ /\b(bandingkan|banding|perbandingan|komparasi|vs|versus|dibandingkan|dibanding|membandingkan)\b/i,
8
8
  /\b(antara)\s+(.+?)\s+(dan|dengan)\s+(.+?)(?:\s|$)/i,
9
9
  /\b(manakah?\s+(yang|lebih))\b/i,
10
10
  /\b(lebih\s+(tinggi|rendah|besar|kecil|baik|buruk))\b/i,
11
11
  /\b(perbedaan|selisih|beda)\b/i,
12
- /\b(dan)\b.*\b(dan)\b/i, // "X dan Y" pattern (2+ regions)
13
12
  ];
14
13
  const TREND_PATTERNS = [
15
14
  /\b(tren|trend|perkembangan|perubahan|fluktuasi|naik\s*turun)\b/i,
@@ -52,11 +51,16 @@ export function detectIntent(query, region, year) {
52
51
  extractedParams.year = `${yearRange[1]},${yearRange[2]}`;
53
52
  }
54
53
  }
55
- // Extract regions for comparison
56
- const comparisonMatch = query.match(/(antara)\s+(.+?)\s+(dan|dengan)\s+(.+?)(?:\s+(pada|tahun|di)|$)/i);
54
+ // Extract regions for comparison: "antara X dan Y", "bandingkan X dan Y",
55
+ // or "X vs Y". Only add them when both sides look like names.
56
+ const comparisonMatch = query.match(/(?:antara|bandingkan|perbandingan|komparasi)\s+(.+?)\s+(?:dan|dengan|vs|versus)\s+(.+?)(?:\s+(?:pada|tahun|di)|[,.;]|$)/i) ||
57
+ query.match(/([a-z][a-z .]+?)\s+(?:vs|versus)\s+([a-z][a-z .]+?)(?:\s+(?:pada|tahun|di)|[,.;]|$)/i);
57
58
  if (comparisonMatch) {
58
- extractedParams.region1 = comparisonMatch[2].trim();
59
- extractedParams.region2 = comparisonMatch[4].trim();
59
+ const stripIndicator = (value) => value
60
+ .replace(/^(kemiskinan|pengangguran|ipm|penduduk|inflasi|pdrb|gini|indeks pembangunan manusia|tingkat pengangguran terbuka)\s+/i, "")
61
+ .trim();
62
+ extractedParams.region1 = stripIndicator(comparisonMatch[1]);
63
+ extractedParams.region2 = stripIndicator(comparisonMatch[2]);
60
64
  }
61
65
  // Score each intent
62
66
  const scores = {
@@ -88,10 +92,6 @@ export function detectIntent(query, region, year) {
88
92
  if (pattern.test(query))
89
93
  scores.publication += 30;
90
94
  }
91
- // Bonus for multiple regions in query
92
- const regionCount = (query.match(/(dan|,|versus|vs)/g) || []).length;
93
- if (regionCount >= 2)
94
- scores.comparison += 20;
95
95
  // Bonus for year range
96
96
  if (year && year.includes(","))
97
97
  scores.trend += 20;
@@ -1 +1 @@
1
- {"version":3,"file":"intent-detector.js","sourceRoot":"","sources":["../../src/services/intent-detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"intent-detector.js","sourceRoot":"","sources":["../../src/services/intent-detector.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@ export interface LearnedVar {
5
5
  title: string;
6
6
  sub_name: string;
7
7
  unit?: string;
8
+ /** Domain the mapping was learned for. BPS variable IDs are domain-specific. */
9
+ domain?: string;
8
10
  }
9
11
  /**
10
12
  * Normalize a user query into a canonical lookup keyword.
@@ -1 +1 @@
1
- {"version":3,"file":"learning.d.ts","sourceRoot":"","sources":["../../src/services/learning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA6FD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMtD;AAmDD;;GAEG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA+B5B;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC,CAGf"}
1
+ {"version":3,"file":"learning.d.ts","sourceRoot":"","sources":["../../src/services/learning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4FD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMtD;AAmDD;;GAEG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA6C5B;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC,CAGf"}
@@ -1,26 +1,25 @@
1
1
  import { logger } from "../utils/logger.js";
2
- import stopwords from "stopwords-iso";
2
+ import stopwords from "stopwords-iso" with { type: "json" };
3
3
  // --- KNOWN_VARS: hardcoded stable var_ids ---
4
4
  const KNOWN_VARS = {
5
5
  miskin: [
6
- { var_id: 184, title: "Persentase Penduduk Miskin", sub_name: "Kemiskinan dan Ketimpangan" },
7
- { var_id: 183, title: "Jumlah Penduduk Miskin (ribu jiwa)", sub_name: "Kemiskinan dan Ketimpangan" },
6
+ { var_id: 184, title: "Persentase Penduduk Miskin (P0)", sub_name: "Kemiskinan dan Ketimpangan" },
7
+ { var_id: 183, title: "Jumlah Penduduk Miskin Menurut Wilayah", sub_name: "Kemiskinan dan Ketimpangan", unit: "Juta Jiwa" },
8
8
  ],
9
9
  garis_kemiskinan: [
10
- { var_id: 195, title: "Garis Kemiskinan", sub_name: "Kemiskinan dan Ketimpangan" }
10
+ { var_id: 195, title: "Garis Kemiskinan (Rupiah/Kapita/Bulan)", sub_name: "Kemiskinan dan Ketimpangan" }
11
11
  ],
12
12
  pengangguran: [
13
- { var_id: 543, title: "Tingkat Pengangguran Terbuka (%)", sub_name: "Tenaga Kerja" },
14
- { var_id: 674, title: "Jumlah Pengangguran (jiwa)", sub_name: "Tenaga Kerja" },
13
+ { var_id: 543, title: "Tingkat Pengangguran Terbuka Menurut Provinsi", sub_name: "Tenaga Kerja", unit: "Persen" },
15
14
  ],
16
15
  ipm: [
17
16
  { var_id: 413, title: "[Metode Baru] Indeks Pembangunan Manusia (IPM)", sub_name: "IPM" },
18
17
  ],
19
18
  gini: [
20
- { var_id: 98, title: "Gini Rasio", sub_name: "Kemiskinan dan Ketimpangan" },
19
+ { var_id: 98, title: "Gini Ratio Menurut Provinsi dan Daerah", sub_name: "Kemiskinan dan Ketimpangan" },
21
20
  ],
22
21
  penduduk: [
23
- { var_id: 1452, title: "Jumlah Penduduk (ribu jiwa)", sub_name: "Kependudukan" },
22
+ { var_id: 2781, title: "Jumlah Penduduk menurut Provinsi dan Jenis Kelamin", sub_name: "Kependudukan" },
24
23
  ],
25
24
  };
26
25
  // --- KEYWORD_ALIASES: map variations to canonical key ---
@@ -157,6 +156,21 @@ export async function lookupVar(query, domain, store) {
157
156
  if (stored) {
158
157
  try {
159
158
  const parsed = JSON.parse(stored);
159
+ // Legacy entries (before `domain` was stored) are only safe for the
160
+ // national domain. Provincial variable IDs are domain-specific; reusing a
161
+ // national ID for a province can point to a completely different table.
162
+ if (parsed.domain === undefined) {
163
+ if (domain !== "0000") {
164
+ logger.debug(`lookupVar: discarding legacy provincial mapping "${storeKey}"`);
165
+ await store.delete(storeKey);
166
+ return null;
167
+ }
168
+ }
169
+ else if (parsed.domain !== domain) {
170
+ logger.debug(`lookupVar: discarding cross-domain mapping "${storeKey}"`);
171
+ await store.delete(storeKey);
172
+ return null;
173
+ }
160
174
  logger.debug(`lookupVar: store hit "${storeKey}" → var_id=${parsed.var_id}`);
161
175
  return parsed;
162
176
  }
@@ -173,7 +187,14 @@ export async function learnVar(query, domain, varData, store) {
173
187
  const normalized = normalizeKeyword(query);
174
188
  const canonical = resolveCanonical(normalized);
175
189
  const key = `${canonical}:${domain}`;
176
- await store.set(key, JSON.stringify(varData));
190
+ const payload = {
191
+ var_id: varData.var_id,
192
+ title: varData.title,
193
+ sub_name: varData.sub_name,
194
+ unit: varData.unit,
195
+ domain,
196
+ };
197
+ await store.set(key, JSON.stringify(payload));
177
198
  logger.debug(`learnVar: saved "${key}" → var_id=${varData.var_id}`);
178
199
  }
179
200
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"learning.js","sourceRoot":"","sources":["../../src/services/learning.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"learning.js","sourceRoot":"","sources":["../../src/services/learning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { BpsClient } from "../client/bps-client.js";
2
+ import type { BpsPeriod } from "../client/types.js";
3
+ import type { IPersistentStore } from "./persistent-store.js";
4
+ import type { LearnedVar } from "./learning.js";
5
+ export interface VariableCandidate extends LearnedVar {
6
+ score: number;
7
+ }
8
+ export interface SearchVariablesOptions {
9
+ maxSubjects?: number;
10
+ maxPagesPerSubject?: number;
11
+ maxCandidates?: number;
12
+ }
13
+ /** Extract root words and synonyms so "kemiskinan" also matches "miskin". */
14
+ export declare function expandQueryTerms(query: string): string[];
15
+ export declare function getSubjectIdsForKeyword(query: string): number[];
16
+ /**
17
+ * Score how well a variable title matches a query.
18
+ * Returns 0 when there is no keyword match at all — generic bonuses such as
19
+ * "title contains 'jumlah' or is short" must never make an unrelated variable
20
+ * win (this previously made "pemeluk agama" return a population variable).
21
+ */
22
+ export declare function computeRelevanceScore(query: string, title: string, subName?: string, definition?: string): number;
23
+ /**
24
+ * Search variables across the subjects that are likely relevant to a query.
25
+ * Returns candidates sorted by relevance (best first).
26
+ */
27
+ export declare function searchVariables(client: BpsClient, domain: string, query: string, options?: SearchVariablesOptions): Promise<VariableCandidate[]>;
28
+ /**
29
+ * Resolve the best variable for a query: learned mapping → full search.
30
+ * Saves a successful mapping for future calls.
31
+ */
32
+ export declare function resolveVariable(client: BpsClient, store: IPersistentStore | null, query: string, domain: string): Promise<LearnedVar | null>;
33
+ export interface ResolvedVariableWithPeriods {
34
+ varData: LearnedVar;
35
+ periods: BpsPeriod[];
36
+ matchedYears: string[];
37
+ candidates: VariableCandidate[];
38
+ }
39
+ export interface ResolveYearsOptions {
40
+ /** Do not trust a learned mapping (e.g. a breakdown query). */
41
+ skipLearned?: boolean;
42
+ maxCandidates?: number;
43
+ }
44
+ /**
45
+ * Resolve a variable and require that it has periods for the requested years.
46
+ * BPS often keeps an old series (e.g. IPM 2014–2019) next to a current one;
47
+ * without this check a 2023 query silently returns 2019 data.
48
+ */
49
+ export declare function resolveVariableForYears(client: BpsClient, store: IPersistentStore | null, query: string, domain: string, years: string[], options?: ResolveYearsOptions): Promise<ResolvedVariableWithPeriods | null>;
50
+ //# sourceMappingURL=variable-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variable-search.d.ts","sourceRoot":"","sources":["../../src/services/variable-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAuEhD,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA2BxD;AAwBD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAO/D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,SAAK,EACZ,UAAU,SAAK,GACd,MAAM,CA8GR;AA0BD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA2F9B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,gBAAgB,GAAG,IAAI,EAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAe5B;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAgBD;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,gBAAgB,GAAG,IAAI,EAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CAgF7C"}