korean-stats-mcp 1.4.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.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +301 -0
  3. package/dist/api/client.d.ts +65 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +143 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/types.d.ts +157 -0
  8. package/dist/api/types.d.ts.map +1 -0
  9. package/dist/api/types.js +5 -0
  10. package/dist/api/types.js.map +1 -0
  11. package/dist/cache/index.d.ts +55 -0
  12. package/dist/cache/index.d.ts.map +1 -0
  13. package/dist/cache/index.js +102 -0
  14. package/dist/cache/index.js.map +1 -0
  15. package/dist/config/index.d.ts +46 -0
  16. package/dist/config/index.d.ts.map +1 -0
  17. package/dist/config/index.js +54 -0
  18. package/dist/config/index.js.map +1 -0
  19. package/dist/data/quickStatsParams.d.ts +76 -0
  20. package/dist/data/quickStatsParams.d.ts.map +1 -0
  21. package/dist/data/quickStatsParams.js +1344 -0
  22. package/dist/data/quickStatsParams.js.map +1 -0
  23. package/dist/index.d.ts +13 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +56 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/prompts/index.d.ts +5 -0
  28. package/dist/prompts/index.d.ts.map +1 -0
  29. package/dist/prompts/index.js +5 -0
  30. package/dist/prompts/index.js.map +1 -0
  31. package/dist/prompts/statisticsAssistant.d.ts +25 -0
  32. package/dist/prompts/statisticsAssistant.d.ts.map +1 -0
  33. package/dist/prompts/statisticsAssistant.js +43 -0
  34. package/dist/prompts/statisticsAssistant.js.map +1 -0
  35. package/dist/resources/categoryTree.d.ts +18 -0
  36. package/dist/resources/categoryTree.d.ts.map +1 -0
  37. package/dist/resources/categoryTree.js +80 -0
  38. package/dist/resources/categoryTree.js.map +1 -0
  39. package/dist/resources/index.d.ts +6 -0
  40. package/dist/resources/index.d.ts.map +1 -0
  41. package/dist/resources/index.js +6 -0
  42. package/dist/resources/index.js.map +1 -0
  43. package/dist/resources/keyIndicators.d.ts +20 -0
  44. package/dist/resources/keyIndicators.d.ts.map +1 -0
  45. package/dist/resources/keyIndicators.js +108 -0
  46. package/dist/resources/keyIndicators.js.map +1 -0
  47. package/dist/server-http.d.ts +10 -0
  48. package/dist/server-http.d.ts.map +1 -0
  49. package/dist/server-http.js +134 -0
  50. package/dist/server-http.js.map +1 -0
  51. package/dist/server.d.ts +10 -0
  52. package/dist/server.d.ts.map +1 -0
  53. package/dist/server.js +194 -0
  54. package/dist/server.js.map +1 -0
  55. package/dist/tools/analyzeTimeSeries.d.ts +70 -0
  56. package/dist/tools/analyzeTimeSeries.d.ts.map +1 -0
  57. package/dist/tools/analyzeTimeSeries.js +204 -0
  58. package/dist/tools/analyzeTimeSeries.js.map +1 -0
  59. package/dist/tools/chains.d.ts +197 -0
  60. package/dist/tools/chains.d.ts.map +1 -0
  61. package/dist/tools/chains.js +369 -0
  62. package/dist/tools/chains.js.map +1 -0
  63. package/dist/tools/compareStatistics.d.ts +62 -0
  64. package/dist/tools/compareStatistics.d.ts.map +1 -0
  65. package/dist/tools/compareStatistics.js +190 -0
  66. package/dist/tools/compareStatistics.js.map +1 -0
  67. package/dist/tools/fetchKosisExcel.d.ts +62 -0
  68. package/dist/tools/fetchKosisExcel.d.ts.map +1 -0
  69. package/dist/tools/fetchKosisExcel.js +366 -0
  70. package/dist/tools/fetchKosisExcel.js.map +1 -0
  71. package/dist/tools/getRecommendedStats.d.ts +41 -0
  72. package/dist/tools/getRecommendedStats.d.ts.map +1 -0
  73. package/dist/tools/getRecommendedStats.js +251 -0
  74. package/dist/tools/getRecommendedStats.js.map +1 -0
  75. package/dist/tools/getStatisticsData.d.ts +75 -0
  76. package/dist/tools/getStatisticsData.d.ts.map +1 -0
  77. package/dist/tools/getStatisticsData.js +305 -0
  78. package/dist/tools/getStatisticsData.js.map +1 -0
  79. package/dist/tools/getStatisticsList.d.ts +69 -0
  80. package/dist/tools/getStatisticsList.d.ts.map +1 -0
  81. package/dist/tools/getStatisticsList.js +336 -0
  82. package/dist/tools/getStatisticsList.js.map +1 -0
  83. package/dist/tools/getTableInfo.d.ts +66 -0
  84. package/dist/tools/getTableInfo.d.ts.map +1 -0
  85. package/dist/tools/getTableInfo.js +85 -0
  86. package/dist/tools/getTableInfo.js.map +1 -0
  87. package/dist/tools/index.d.ts +14 -0
  88. package/dist/tools/index.d.ts.map +1 -0
  89. package/dist/tools/index.js +19 -0
  90. package/dist/tools/index.js.map +1 -0
  91. package/dist/tools/quickStats.d.ts +71 -0
  92. package/dist/tools/quickStats.d.ts.map +1 -0
  93. package/dist/tools/quickStats.js +490 -0
  94. package/dist/tools/quickStats.js.map +1 -0
  95. package/dist/tools/quickTrend.d.ts +61 -0
  96. package/dist/tools/quickTrend.d.ts.map +1 -0
  97. package/dist/tools/quickTrend.js +328 -0
  98. package/dist/tools/quickTrend.js.map +1 -0
  99. package/dist/tools/searchStatistics.d.ts +41 -0
  100. package/dist/tools/searchStatistics.d.ts.map +1 -0
  101. package/dist/tools/searchStatistics.js +318 -0
  102. package/dist/tools/searchStatistics.js.map +1 -0
  103. package/dist/utils/dataFormatter.d.ts +40 -0
  104. package/dist/utils/dataFormatter.d.ts.map +1 -0
  105. package/dist/utils/dataFormatter.js +142 -0
  106. package/dist/utils/dataFormatter.js.map +1 -0
  107. package/dist/utils/errorHandler.d.ts +33 -0
  108. package/dist/utils/errorHandler.d.ts.map +1 -0
  109. package/dist/utils/errorHandler.js +94 -0
  110. package/dist/utils/errorHandler.js.map +1 -0
  111. package/dist/utils/metaLookup.d.ts +93 -0
  112. package/dist/utils/metaLookup.d.ts.map +1 -0
  113. package/dist/utils/metaLookup.js +170 -0
  114. package/dist/utils/metaLookup.js.map +1 -0
  115. package/dist/utils/queryParser.d.ts +45 -0
  116. package/dist/utils/queryParser.d.ts.map +1 -0
  117. package/dist/utils/queryParser.js +244 -0
  118. package/dist/utils/queryParser.js.map +1 -0
  119. package/dist/utils/regions.d.ts +70 -0
  120. package/dist/utils/regions.d.ts.map +1 -0
  121. package/dist/utils/regions.js +261 -0
  122. package/dist/utils/regions.js.map +1 -0
  123. package/package.json +60 -0
@@ -0,0 +1,94 @@
1
+ /**
2
+ * 에러 처리 유틸리티
3
+ */
4
+ export var ErrorCode;
5
+ (function (ErrorCode) {
6
+ ErrorCode["INVALID_API_KEY"] = "INVALID_API_KEY";
7
+ ErrorCode["RATE_LIMIT_EXCEEDED"] = "RATE_LIMIT_EXCEEDED";
8
+ ErrorCode["INVALID_PARAMETER"] = "INVALID_PARAMETER";
9
+ ErrorCode["NO_DATA_FOUND"] = "NO_DATA_FOUND";
10
+ ErrorCode["API_UNAVAILABLE"] = "API_UNAVAILABLE";
11
+ ErrorCode["NETWORK_ERROR"] = "NETWORK_ERROR";
12
+ ErrorCode["UNKNOWN_ERROR"] = "UNKNOWN_ERROR";
13
+ })(ErrorCode || (ErrorCode = {}));
14
+ const ERROR_MESSAGES = {
15
+ [ErrorCode.INVALID_API_KEY]: 'API 키가 유효하지 않습니다. 환경 설정을 확인해주세요.',
16
+ [ErrorCode.RATE_LIMIT_EXCEEDED]: '요청 한도를 초과했습니다. 잠시 후 다시 시도해주세요.',
17
+ [ErrorCode.INVALID_PARAMETER]: '검색 조건이 올바르지 않습니다. 다른 조건으로 시도해주세요.',
18
+ [ErrorCode.NO_DATA_FOUND]: '해당 조건에 맞는 데이터가 없습니다.',
19
+ [ErrorCode.API_UNAVAILABLE]: 'KOSIS 서비스가 일시적으로 응답하지 않습니다. 잠시 후 다시 시도해주세요.',
20
+ [ErrorCode.NETWORK_ERROR]: '네트워크 연결을 확인해주세요.',
21
+ [ErrorCode.UNKNOWN_ERROR]: '알 수 없는 오류가 발생했습니다.',
22
+ };
23
+ /**
24
+ * 사용자 친화적 에러 메시지 반환
25
+ */
26
+ export function getErrorMessage(code) {
27
+ return ERROR_MESSAGES[code] || ERROR_MESSAGES[ErrorCode.UNKNOWN_ERROR];
28
+ }
29
+ /**
30
+ * 에러를 안전하게 처리하고 결과 반환
31
+ */
32
+ export function handleToolError(error) {
33
+ console.error('Tool error:', error);
34
+ if (error instanceof Error) {
35
+ // KOSIS API 에러
36
+ if ('code' in error) {
37
+ const code = error.code;
38
+ return {
39
+ success: false,
40
+ error: getErrorMessage(code),
41
+ code,
42
+ };
43
+ }
44
+ return {
45
+ success: false,
46
+ error: error.message,
47
+ code: ErrorCode.UNKNOWN_ERROR,
48
+ };
49
+ }
50
+ return {
51
+ success: false,
52
+ error: getErrorMessage(ErrorCode.UNKNOWN_ERROR),
53
+ code: ErrorCode.UNKNOWN_ERROR,
54
+ };
55
+ }
56
+ /**
57
+ * 재시도 래퍼 함수
58
+ */
59
+ export async function withRetry(fn, options = {}) {
60
+ const { maxRetries = 3, baseDelay = 1000, maxDelay = 10000 } = options;
61
+ let lastError;
62
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
63
+ try {
64
+ return await fn();
65
+ }
66
+ catch (error) {
67
+ lastError = error;
68
+ // 재시도 불가능한 에러인 경우 즉시 throw
69
+ if (isNonRetryableError(error)) {
70
+ throw error;
71
+ }
72
+ // 마지막 시도가 아니면 대기
73
+ if (attempt < maxRetries - 1) {
74
+ const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);
75
+ await sleep(delay);
76
+ }
77
+ }
78
+ }
79
+ throw lastError;
80
+ }
81
+ function isNonRetryableError(error) {
82
+ if (error instanceof Error && 'code' in error) {
83
+ const code = error.code;
84
+ return [
85
+ ErrorCode.INVALID_API_KEY,
86
+ ErrorCode.INVALID_PARAMETER,
87
+ ].includes(code);
88
+ }
89
+ return false;
90
+ }
91
+ function sleep(ms) {
92
+ return new Promise((resolve) => setTimeout(resolve, ms));
93
+ }
94
+ //# sourceMappingURL=errorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/utils/errorHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ export interface MetaItem {
2
+ ITM_ID: string;
3
+ ITM_NM: string;
4
+ OBJ_NM: string;
5
+ OBJ_ID: string;
6
+ /** OBJ_ID_SN — 분류 순서 (1=objL1, 2=objL2, ...). ITEM 항목은 비어있음 */
7
+ OBJ_ID_SN?: string;
8
+ UP_ITM_ID?: string;
9
+ }
10
+ /**
11
+ * 통계표 분류·항목 메타 조회 (캐싱)
12
+ */
13
+ export declare function fetchTableMeta(orgId: string, tblId: string): Promise<MetaItem[]>;
14
+ export interface MetaGroup {
15
+ objNm: string;
16
+ objId: string;
17
+ objIdSn: string;
18
+ items: MetaItem[];
19
+ }
20
+ /**
21
+ * 메타를 OBJ별로 그룹화
22
+ */
23
+ export declare function groupMetaByObj(meta: MetaItem[]): MetaGroup[];
24
+ /**
25
+ * 분류명(예: "자치구별", "성별") 매칭 + 항목명(예: "광진구") 매칭으로 ITM_ID를 찾는다.
26
+ * objNmHint가 비면 모든 분류 그룹을 후보로 검사.
27
+ *
28
+ * 매칭 규칙(우선순위):
29
+ * 1) ITM_NM 완전 일치
30
+ * 2) ITM_NM이 itmNameQuery로 시작
31
+ * 3) ITM_NM에 itmNameQuery 포함
32
+ */
33
+ export declare function findItmIdInMeta(meta: MetaItem[], itmNameQuery: string, objNmHint?: string): {
34
+ match: MetaItem;
35
+ group: MetaGroup;
36
+ } | null;
37
+ /**
38
+ * objL1/objL2/itmId 자동 채우기
39
+ *
40
+ * regionName이 있으면 분류 중 "자치구별/시군구별/행정구역별/지역별" 류의 OBJ에서 매칭한다.
41
+ * 나머지 분류값은 "기본값"(첫 번째 항목, 보통 합계/전체)을 사용한다.
42
+ *
43
+ * 반환값에 누락된 필드(undefined)는 호출 측에서 처리.
44
+ */
45
+ export interface ResolveResult {
46
+ itmId?: string;
47
+ objL1?: string;
48
+ objL2?: string;
49
+ objL3?: string;
50
+ objL4?: string;
51
+ /** 매칭에 사용된 정보 (디버깅·응답용) */
52
+ resolved: Array<{
53
+ objNm: string;
54
+ itmNm: string;
55
+ itmId: string;
56
+ reason: 'region' | 'default';
57
+ }>;
58
+ /** 매칭 실패시 후보군 */
59
+ candidates?: Record<string, string[]>;
60
+ /** 사용자가 regionName/itemName을 줬는데 어느 OBJ에서도 매칭 못한 경우 */
61
+ unmatched?: {
62
+ regionName?: string;
63
+ itemName?: string;
64
+ };
65
+ }
66
+ export declare function resolveDimensions(orgId: string, tblId: string, options?: {
67
+ regionName?: string;
68
+ itemName?: string;
69
+ /** 추가로 강제할 OBJ_NM → ITM_NM 매핑 (예: { '성별': '여자' }) */
70
+ overrides?: Record<string, string>;
71
+ }): Promise<ResolveResult>;
72
+ /**
73
+ * 메타 요약 — get_table_info 경량화용
74
+ */
75
+ export interface MetaSummary {
76
+ orgId: string;
77
+ tblId: string;
78
+ groups: Array<{
79
+ objNm: string;
80
+ objIdSn: string;
81
+ totalItems: number;
82
+ /** 처음 10개 + 사용자가 자주 찾을 만한 일부 (전국/합계 등) */
83
+ sample: Array<{
84
+ ITM_ID: string;
85
+ ITM_NM: string;
86
+ }>;
87
+ }>;
88
+ }
89
+ export declare function summarizeTableMeta(orgId: string, tblId: string, options?: {
90
+ sampleSize?: number;
91
+ filter?: string;
92
+ }): Promise<MetaSummary>;
93
+ //# sourceMappingURL=metaLookup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metaLookup.d.ts","sourceRoot":"","sources":["../../src/utils/metaLookup.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAUtF;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,CAW5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EAAE,EAChB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAAG,IAAI,CAmB9C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IAC/F,iBAAiB;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtC,uDAAuD;IACvD,SAAS,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;AAID,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,GACL,OAAO,CAAC,aAAa,CAAC,CA4ExB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,0CAA0C;QAC1C,MAAM,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACnD,CAAC,CAAC;CACJ;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,OAAO,CAAC,WAAW,CAAC,CAuBtB"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * 메타 자동 lookup
3
+ *
4
+ * KOSIS 통계표의 분류값(자치구·연령·성별·항목 등) ITM_ID는 통계표마다 다르다.
5
+ * 같은 「서울특별시 기본통계」시리즈에서도 광진구 코드가:
6
+ * DT_201004_O110047 → "001005"
7
+ * DT_201004_O110054 → "13102127569D1.HCD_11050"
8
+ * 식으로 갈린다.
9
+ *
10
+ * 정적 매핑은 불가능하므로 메타 API(getMeta type=ITM)로 OBJ_NM을 가져와
11
+ * 사용자 입력(예: "광진구")에 매칭되는 ITM_ID를 동적으로 찾는다. 캐싱 24h.
12
+ */
13
+ import { getKosisClient } from '../api/client.js';
14
+ import { getCacheManager } from '../cache/index.js';
15
+ /**
16
+ * 통계표 분류·항목 메타 조회 (캐싱)
17
+ */
18
+ export async function fetchTableMeta(orgId, tblId) {
19
+ const cache = getCacheManager();
20
+ return cache.getTableMeta({ orgId, tblId, type: 'ITM' }, async () => {
21
+ const client = getKosisClient();
22
+ const rows = await client.getTableMeta(orgId, tblId, 'ITM');
23
+ return rows;
24
+ });
25
+ }
26
+ /**
27
+ * 메타를 OBJ별로 그룹화
28
+ */
29
+ export function groupMetaByObj(meta) {
30
+ const map = new Map();
31
+ for (const r of meta) {
32
+ const sn = r.OBJ_ID_SN ?? '0';
33
+ const key = `${sn}|${r.OBJ_ID}`;
34
+ if (!map.has(key)) {
35
+ map.set(key, { objNm: r.OBJ_NM, objId: r.OBJ_ID, objIdSn: sn, items: [] });
36
+ }
37
+ map.get(key).items.push(r);
38
+ }
39
+ return [...map.values()].sort((a, b) => a.objIdSn.localeCompare(b.objIdSn));
40
+ }
41
+ /**
42
+ * 분류명(예: "자치구별", "성별") 매칭 + 항목명(예: "광진구") 매칭으로 ITM_ID를 찾는다.
43
+ * objNmHint가 비면 모든 분류 그룹을 후보로 검사.
44
+ *
45
+ * 매칭 규칙(우선순위):
46
+ * 1) ITM_NM 완전 일치
47
+ * 2) ITM_NM이 itmNameQuery로 시작
48
+ * 3) ITM_NM에 itmNameQuery 포함
49
+ */
50
+ export function findItmIdInMeta(meta, itmNameQuery, objNmHint) {
51
+ const q = itmNameQuery.trim();
52
+ if (!q)
53
+ return null;
54
+ const groups = groupMetaByObj(meta);
55
+ const targets = objNmHint
56
+ ? groups.filter((g) => g.objNm === objNmHint || g.objNm.includes(objNmHint))
57
+ : groups;
58
+ for (const tier of [
59
+ (it) => it.ITM_NM === q,
60
+ (it) => it.ITM_NM.startsWith(q),
61
+ (it) => it.ITM_NM.includes(q),
62
+ ]) {
63
+ for (const g of targets) {
64
+ const hit = g.items.find(tier);
65
+ if (hit)
66
+ return { match: hit, group: g };
67
+ }
68
+ }
69
+ return null;
70
+ }
71
+ const REGION_OBJ_HINTS = ['자치구별', '시군구별', '행정구역별', '지역별', '시도별', '구별', '시·군·구별'];
72
+ export async function resolveDimensions(orgId, tblId, options = {}) {
73
+ const meta = await fetchTableMeta(orgId, tblId);
74
+ const groups = groupMetaByObj(meta);
75
+ const resolved = [];
76
+ const out = { resolved };
77
+ // 항목 (ITEM)
78
+ let itemMatched = !options.itemName; // itemName 미지정시는 매칭 시도 자체가 없으므로 true
79
+ const itemGroup = groups.find((g) => g.objId === 'ITEM' || g.objNm === '항목');
80
+ if (itemGroup) {
81
+ let item = itemGroup.items[0];
82
+ if (options.itemName) {
83
+ const r = findItmIdInMeta(meta, options.itemName, itemGroup.objNm);
84
+ if (r) {
85
+ item = r.match;
86
+ itemMatched = true;
87
+ }
88
+ }
89
+ out.itmId = item.ITM_ID;
90
+ resolved.push({ objNm: itemGroup.objNm, itmNm: item.ITM_NM, itmId: item.ITM_ID, reason: options.itemName && itemMatched ? 'region' : 'default' });
91
+ }
92
+ // 분류 1~4
93
+ let regionMatched = !options.regionName; // regionName 미지정시 true (검사 불필요)
94
+ const dimGroups = groups.filter((g) => g.objIdSn !== '0' && g.objId !== 'ITEM');
95
+ const candidates = {};
96
+ for (const g of dimGroups) {
97
+ let picked;
98
+ let reason = 'default';
99
+ // 명시적 override
100
+ const overrideName = options.overrides?.[g.objNm];
101
+ if (overrideName) {
102
+ const r = findItmIdInMeta(meta, overrideName, g.objNm);
103
+ if (r) {
104
+ picked = r.match;
105
+ reason = 'region';
106
+ }
107
+ }
108
+ // 지역명 매칭 (REGION 힌트 분류에 한해)
109
+ if (!picked && options.regionName && REGION_OBJ_HINTS.some((h) => g.objNm.includes(h.replace('별', '')) || g.objNm === h)) {
110
+ const r = findItmIdInMeta(meta, options.regionName, g.objNm);
111
+ if (r) {
112
+ picked = r.match;
113
+ reason = 'region';
114
+ regionMatched = true;
115
+ }
116
+ }
117
+ // 기본값 (첫 항목 — 보통 합계/전체)
118
+ if (!picked) {
119
+ picked = g.items[0];
120
+ }
121
+ if (picked) {
122
+ resolved.push({ objNm: g.objNm, itmNm: picked.ITM_NM, itmId: picked.ITM_ID, reason });
123
+ const sn = parseInt(g.objIdSn || '0', 10);
124
+ if (sn === 1)
125
+ out.objL1 = picked.ITM_ID;
126
+ else if (sn === 2)
127
+ out.objL2 = picked.ITM_ID;
128
+ else if (sn === 3)
129
+ out.objL3 = picked.ITM_ID;
130
+ else if (sn === 4)
131
+ out.objL4 = picked.ITM_ID;
132
+ }
133
+ candidates[g.objNm] = g.items.slice(0, 10).map((it) => it.ITM_NM);
134
+ }
135
+ // 매칭 실패 신호
136
+ if (!regionMatched || !itemMatched) {
137
+ out.unmatched = {};
138
+ if (!regionMatched)
139
+ out.unmatched.regionName = options.regionName;
140
+ if (!itemMatched)
141
+ out.unmatched.itemName = options.itemName;
142
+ }
143
+ out.candidates = candidates;
144
+ return out;
145
+ }
146
+ export async function summarizeTableMeta(orgId, tblId, options = {}) {
147
+ const meta = await fetchTableMeta(orgId, tblId);
148
+ const groups = groupMetaByObj(meta);
149
+ const size = options.sampleSize ?? 10;
150
+ const filter = options.filter?.trim();
151
+ return {
152
+ orgId,
153
+ tblId,
154
+ groups: groups.map((g) => {
155
+ const items = filter
156
+ ? g.items.filter((it) => it.ITM_NM.includes(filter))
157
+ : g.items;
158
+ return {
159
+ objNm: g.objNm,
160
+ objIdSn: g.objIdSn,
161
+ totalItems: g.items.length,
162
+ sample: (filter && items.length === 0 ? g.items : items).slice(0, size).map((it) => ({
163
+ ITM_ID: it.ITM_ID,
164
+ ITM_NM: it.ITM_NM,
165
+ })),
166
+ };
167
+ }),
168
+ };
169
+ }
170
+ //# sourceMappingURL=metaLookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metaLookup.js","sourceRoot":"","sources":["../../src/utils/metaLookup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * 자연어 쿼리 파서
3
+ * 사용자 질문을 KOSIS API 파라미터로 변환
4
+ */
5
+ export declare const TOPIC_MAPPINGS: Record<string, {
6
+ category: string;
7
+ keywords: string[];
8
+ viewCode?: string;
9
+ }>;
10
+ /**
11
+ * 지역명 → 지역코드 매핑 (표준 행정구역 코드)
12
+ *
13
+ * ⚠️ 주의: KOSIS 통계표마다 다른 지역 코드 체계를 사용할 수 있습니다!
14
+ * - 아래 코드는 표준 행정구역 코드입니다
15
+ * - 일부 통계표는 단순화된 코드를 사용합니다 (예: 일부 표에서 부산=21)
16
+ * - 정확한 코드는 get_table_info를 호출하여 확인하세요
17
+ *
18
+ * 표준 행정구역 코드 참조:
19
+ * 00=전국, 11=서울, 26=부산, 27=대구, 28=인천, 29=광주, 30=대전, 31=울산
20
+ * 36=세종, 41=경기, 42=강원, 43=충북, 44=충남, 45=전북, 46=전남, 47=경북, 48=경남, 50=제주
21
+ */
22
+ export declare const REGION_CODES: Record<string, string>;
23
+ export interface ParsedQuery {
24
+ topics: string[];
25
+ regions: string[];
26
+ timeRange?: {
27
+ type: 'recent' | 'specific' | 'range';
28
+ value?: number;
29
+ start?: string;
30
+ end?: string;
31
+ };
32
+ keywords: string[];
33
+ intent: 'search' | 'compare' | 'trend' | 'explain';
34
+ }
35
+ /**
36
+ * 자연어 쿼리 파싱
37
+ */
38
+ export declare function parseQuery(query: string): ParsedQuery;
39
+ export declare const REGION_NAMES: Record<string, string>;
40
+ /**
41
+ * 검색어 생성
42
+ * 지역명이 있는 경우 지역명을 검색어에 포함
43
+ */
44
+ export declare function generateSearchTerms(parsed: ParsedQuery, originalQuery?: string): string[];
45
+ //# sourceMappingURL=queryParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryParser.d.ts","sourceRoot":"","sources":["../../src/utils/queryParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAsEA,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAuC/C,CAAC;AAWF,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE;QACV,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;QACtC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;CACpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA4FrD;AAGD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAE/C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAuBzF"}