smart-web-mcp 0.9.2 → 0.11.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 (67) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/browser-session.d.ts +4 -0
  3. package/dist/browser-session.js +121 -6
  4. package/dist/browser-session.js.map +1 -1
  5. package/dist/korea/coupang.d.ts +46 -0
  6. package/dist/korea/coupang.js +165 -0
  7. package/dist/korea/coupang.js.map +1 -0
  8. package/dist/korea/dart.d.ts +53 -0
  9. package/dist/korea/dart.js +105 -0
  10. package/dist/korea/dart.js.map +1 -0
  11. package/dist/korea/drug-safety.d.ts +33 -0
  12. package/dist/korea/drug-safety.js +60 -0
  13. package/dist/korea/drug-safety.js.map +1 -0
  14. package/dist/korea/fine-dust.d.ts +27 -0
  15. package/dist/korea/fine-dust.js +88 -0
  16. package/dist/korea/fine-dust.js.map +1 -0
  17. package/dist/korea/food-safety.d.ts +21 -0
  18. package/dist/korea/food-safety.js +50 -0
  19. package/dist/korea/food-safety.js.map +1 -0
  20. package/dist/korea/geeknews.d.ts +31 -0
  21. package/dist/korea/geeknews.js +144 -0
  22. package/dist/korea/geeknews.js.map +1 -0
  23. package/dist/korea/index.d.ts +16 -0
  24. package/dist/korea/index.js +17 -0
  25. package/dist/korea/index.js.map +1 -0
  26. package/dist/korea/law.d.ts +41 -0
  27. package/dist/korea/law.js +85 -0
  28. package/dist/korea/law.js.map +1 -0
  29. package/dist/korea/naver-news.d.ts +38 -0
  30. package/dist/korea/naver-news.js +67 -0
  31. package/dist/korea/naver-news.js.map +1 -0
  32. package/dist/korea/naver-shopping.d.ts +39 -0
  33. package/dist/korea/naver-shopping.js +51 -0
  34. package/dist/korea/naver-shopping.js.map +1 -0
  35. package/dist/korea/proxy-client.d.ts +20 -0
  36. package/dist/korea/proxy-client.js +88 -0
  37. package/dist/korea/proxy-client.js.map +1 -0
  38. package/dist/korea/public-restroom.d.ts +44 -0
  39. package/dist/korea/public-restroom.js +184 -0
  40. package/dist/korea/public-restroom.js.map +1 -0
  41. package/dist/korea/real-estate.d.ts +56 -0
  42. package/dist/korea/real-estate.js +95 -0
  43. package/dist/korea/real-estate.js.map +1 -0
  44. package/dist/korea/spellcheck.d.ts +32 -0
  45. package/dist/korea/spellcheck.js +142 -0
  46. package/dist/korea/spellcheck.js.map +1 -0
  47. package/dist/korea/stock.d.ts +59 -0
  48. package/dist/korea/stock.js +84 -0
  49. package/dist/korea/stock.js.map +1 -0
  50. package/dist/korea/subway.d.ts +29 -0
  51. package/dist/korea/subway.js +47 -0
  52. package/dist/korea/subway.js.map +1 -0
  53. package/dist/korea/weather.d.ts +35 -0
  54. package/dist/korea/weather.js +92 -0
  55. package/dist/korea/weather.js.map +1 -0
  56. package/dist/korea/zipcode.d.ts +25 -0
  57. package/dist/korea/zipcode.js +70 -0
  58. package/dist/korea/zipcode.js.map +1 -0
  59. package/dist/mcp-server.js +389 -1
  60. package/dist/mcp-server.js.map +1 -1
  61. package/dist/settings.d.ts +7 -0
  62. package/dist/settings.js +1 -0
  63. package/dist/settings.js.map +1 -1
  64. package/dist/smartfetch.d.ts +7 -0
  65. package/dist/smartfetch.js +16 -8
  66. package/dist/smartfetch.js.map +1 -1
  67. package/package.json +2 -2
@@ -0,0 +1,105 @@
1
+ /**
2
+ * 금감원 DART 전자공시 조회 — direct API, requires API_K_DART env var
3
+ * API base: https://opendart.fss.or.kr/api/
4
+ */
5
+ import { httpGet } from "./proxy-client.js";
6
+ const DART_BASE = "https://opendart.fss.or.kr/api";
7
+ function dartKey() {
8
+ return process.env["API_K_DART"] ?? null;
9
+ }
10
+ async function dartGet(endpoint, params, timeoutMs = 20000) {
11
+ const key = dartKey();
12
+ if (!key) {
13
+ return { ok: false, message: "API_K_DART 환경변수가 없습니다. https://opendart.fss.or.kr 에서 발급하세요." };
14
+ }
15
+ const url = new URL(`${DART_BASE}/${endpoint}`);
16
+ url.searchParams.set("crtfc_key", key);
17
+ for (const [k, v] of Object.entries(params)) {
18
+ if (v)
19
+ url.searchParams.set(k, v);
20
+ }
21
+ const result = await httpGet(url.toString(), {}, timeoutMs);
22
+ if (!result.ok)
23
+ return { ok: false, message: result.message };
24
+ const d = result.data;
25
+ if (d["status"] && d["status"] !== "000") {
26
+ return { ok: false, message: `DART API 오류: [${d["status"]}] ${String(d["message"] ?? "")}` };
27
+ }
28
+ return { ok: true, data: result.data };
29
+ }
30
+ export async function runDart(options) {
31
+ const { action, corp_code, bgn_de, end_de, bsns_year, reprt_code = "11011", fs_div = "CFS", pblntf_ty, page_no = 1, page_count = 10, timeoutMs = 20000, } = options;
32
+ if (action === "company") {
33
+ if (!corp_code)
34
+ return { ok: false, message: "corp_code가 필요합니다." };
35
+ const result = await dartGet("company.json", { corp_code }, timeoutMs);
36
+ if (!result.ok)
37
+ return result;
38
+ return { source: "dart", status: "000", message: "정상", action, data: result.data };
39
+ }
40
+ if (action === "financials") {
41
+ if (!corp_code)
42
+ return { ok: false, message: "corp_code가 필요합니다." };
43
+ if (!bsns_year)
44
+ return { ok: false, message: "bsns_year(사업연도)가 필요합니다." };
45
+ const result = await dartGet("fnlttSinglAcntAll.json", { corp_code, bsns_year, reprt_code, fs_div }, timeoutMs);
46
+ if (!result.ok)
47
+ return result;
48
+ return { source: "dart", status: "000", message: "정상", action, data: result.data };
49
+ }
50
+ // disclosures (list.json)
51
+ const today = new Date().toISOString().slice(0, 10).replace(/-/g, "");
52
+ const threeMonthsAgo = new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10).replace(/-/g, "");
53
+ const params = {
54
+ bgn_de: bgn_de ?? threeMonthsAgo,
55
+ end_de: end_de ?? today,
56
+ page_no: String(page_no),
57
+ page_count: String(page_count),
58
+ sort: "date",
59
+ sort_mth: "desc",
60
+ };
61
+ if (corp_code)
62
+ params["corp_code"] = corp_code;
63
+ if (pblntf_ty)
64
+ params["pblntf_ty"] = pblntf_ty;
65
+ const result = await dartGet("list.json", params, timeoutMs);
66
+ if (!result.ok)
67
+ return result;
68
+ return { source: "dart", status: "000", message: "정상", action, data: result.data };
69
+ }
70
+ export function renderDart(result) {
71
+ if (result.action === "company") {
72
+ const d = result.data;
73
+ return [
74
+ `# DART 기업개황 — ${String(d["corp_name"] ?? "")}`,
75
+ d["corp_name_eng"] ? `영문명: ${String(d["corp_name_eng"])}` : "",
76
+ `종목코드: ${String(d["stock_code"] ?? "-")}`,
77
+ `대표자: ${String(d["ceo_nm"] ?? "-")}`,
78
+ `업종코드: ${String(d["induty_code"] ?? "-")}`,
79
+ `설립일: ${String(d["est_dt"] ?? "-")}`,
80
+ `결산월: ${String(d["acc_mt"] ?? "-")}월`,
81
+ d["adres"] ? `주소: ${String(d["adres"])}` : "",
82
+ d["hm_url"] ? `홈페이지: ${String(d["hm_url"])}` : "",
83
+ "",
84
+ "_금감원 DART 공시 데이터 기준 / 투자 조언 아님_",
85
+ ].filter((l) => l !== "").join("\n");
86
+ }
87
+ if (result.action === "financials") {
88
+ const list = (result.data["list"] ?? []);
89
+ const lines = ["# DART 재무제표", ""];
90
+ for (const item of list.slice(0, 20)) {
91
+ lines.push(`- **${String(item["account_nm"] ?? "")}**: ${String(item["thstrm_amount"] ?? "")}`);
92
+ }
93
+ lines.push("\n_금감원 DART 공시 데이터 기준 / 투자 조언 아님_");
94
+ return lines.join("\n");
95
+ }
96
+ // disclosures
97
+ const list = (result.data["list"] ?? []);
98
+ const lines = ["# DART 공시 목록", `총 ${String(result.data["total_count"] ?? "?")}건`, ""];
99
+ for (const item of list) {
100
+ lines.push(`- **${item.report_nm}** — ${item.corp_name} (${item.rcept_dt})`);
101
+ }
102
+ lines.push("\n_금감원 DART 공시 데이터 기준 / 투자 조언 아님_");
103
+ return lines.join("\n");
104
+ }
105
+ //# sourceMappingURL=dart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dart.js","sourceRoot":"","sources":["../../src/korea/dart.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAE3C,MAAM,SAAS,GAAG,gCAAgC,CAAA;AAmClD,SAAS,OAAO;IACd,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAA;AAC1C,CAAC;AAED,KAAK,UAAU,OAAO,CAAoC,QAAgB,EAAE,MAA8B,EAAE,SAAS,GAAG,KAAK;IAC3H,MAAM,GAAG,GAAG,OAAO,EAAE,CAAA;IACrB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,6DAA6D,EAAE,CAAA;IAC9F,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAC,CAAA;IAC/C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;IACtC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACnC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAI,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAA;IAC9D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAA;IAE7D,MAAM,CAAC,GAAG,MAAM,CAAC,IAA+B,CAAA;IAChD,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;QACzC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAA;IAC9F,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAc7B;IACC,MAAM,EACJ,MAAM,EACN,SAAS,EACT,MAAM,EACN,MAAM,EACN,SAAS,EACT,UAAU,GAAG,OAAO,EACpB,MAAM,GAAG,KAAK,EACd,SAAS,EACT,OAAO,GAAG,CAAC,EACX,UAAU,GAAG,EAAE,EACf,SAAS,GAAG,KAAK,GAClB,GAAG,OAAO,CAAA;IAEX,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAA;QAClE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,EAAE,SAAS,CAAC,CAAA;QACtE,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAA;QAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAA+B,EAAE,CAAA;IAC/G,CAAC;IAED,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC5B,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAA;QAClE,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAA;QACxE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,wBAAwB,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,CAAA;QAC/G,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAA;QAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAA+B,EAAE,CAAA;IAC/G,CAAC;IAED,0BAA0B;IAC1B,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACrE,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACnH,MAAM,MAAM,GAA2B;QACrC,MAAM,EAAE,MAAM,IAAI,cAAc;QAChC,MAAM,EAAE,MAAM,IAAI,KAAK;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;QAC9B,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,MAAM;KACjB,CAAA;IACD,IAAI,SAAS;QAAE,MAAM,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;IAC9C,IAAI,SAAS;QAAE,MAAM,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;IAE9C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;IAC5D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAA;IAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAA+B,EAAE,CAAA;AAC/G,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAkB;IAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAA;QACrB,OAAO;YACL,iBAAiB,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE;YAC/C,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YAC9D,SAAS,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE;YACzC,QAAQ,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE;YACpC,SAAS,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE;YAC1C,QAAQ,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE;YACpC,QAAQ,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG;YACrC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YAC7C,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACjD,EAAE;YACF,iCAAiC;SAClC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACtC,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAA8B,CAAA;QACrE,MAAM,KAAK,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;QACjC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QACjG,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;QAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,cAAc;IACd,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAqB,CAAA;IAC5D,MAAM,KAAK,GAAG,CAAC,cAAc,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IACrF,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,QAAQ,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;IAC9E,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;IAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Drug safety info (식약처 의약품) via k-skill-proxy
3
+ * Endpoint: GET /v1/mfds/drug-safety/lookup?itemName=타이레놀
4
+ *
5
+ * Policy: always surface red flags first. This tool returns data only.
6
+ * Do NOT use for emergency diagnosis — always refer to 119/응급실 when needed.
7
+ */
8
+ export type DrugItem = {
9
+ item_name?: string;
10
+ entp_name?: string;
11
+ efcy_qesitm?: string;
12
+ use_method_qesitm?: string;
13
+ atpn_qesitm?: string;
14
+ intrc_qesitm?: string;
15
+ se_qesitm?: string;
16
+ deposit_method_qesitm?: string;
17
+ item_image?: string;
18
+ source?: string;
19
+ };
20
+ export type DrugSafetyResult = {
21
+ source: "drug-safety";
22
+ query: string[];
23
+ total: number;
24
+ items: DrugItem[];
25
+ };
26
+ export declare function runDrugSafety(options: {
27
+ itemNames: string[];
28
+ timeoutMs?: number;
29
+ }): Promise<DrugSafetyResult | {
30
+ ok: false;
31
+ message: string;
32
+ }>;
33
+ export declare function renderDrugSafety(result: DrugSafetyResult): string;
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Drug safety info (식약처 의약품) via k-skill-proxy
3
+ * Endpoint: GET /v1/mfds/drug-safety/lookup?itemName=타이레놀
4
+ *
5
+ * Policy: always surface red flags first. This tool returns data only.
6
+ * Do NOT use for emergency diagnosis — always refer to 119/응급실 when needed.
7
+ */
8
+ import { proxyGet } from "./proxy-client.js";
9
+ export async function runDrugSafety(options) {
10
+ const { itemNames, timeoutMs = 20000 } = options;
11
+ if (!itemNames.length)
12
+ return { ok: false, message: "itemName이 필요합니다." };
13
+ const allItems = [];
14
+ for (const itemName of itemNames) {
15
+ const result = await proxyGet("/v1/mfds/drug-safety/lookup", { itemName }, timeoutMs);
16
+ if (!result.ok) {
17
+ if (allItems.length === 0)
18
+ return { ok: false, message: `Drug safety lookup failed: ${result.message}` };
19
+ continue;
20
+ }
21
+ const items = (result.data["items"] ?? result.data["list"] ?? [result.data]);
22
+ allItems.push(...items);
23
+ }
24
+ return {
25
+ source: "drug-safety",
26
+ query: itemNames,
27
+ total: allItems.length,
28
+ items: allItems,
29
+ };
30
+ }
31
+ export function renderDrugSafety(result) {
32
+ const lines = [
33
+ "⚠️ **이 정보는 참고용입니다. 최종 판단은 약사·의료진에게 확인하세요. 응급 증상(호흡곤란·의식저하·심한 발진)은 즉시 119.**",
34
+ "",
35
+ `# 의약품 안전 정보 — ${result.query.join(", ")}`,
36
+ `총 ${result.total}건`,
37
+ "",
38
+ ];
39
+ for (const item of result.items) {
40
+ lines.push(`## ${item.item_name ?? "?"}`);
41
+ if (item.entp_name)
42
+ lines.push(`- 제조사: ${item.entp_name}`);
43
+ if (item.efcy_qesitm)
44
+ lines.push(`\n**효능·효과**: ${item.efcy_qesitm}`);
45
+ if (item.use_method_qesitm)
46
+ lines.push(`\n**용법·용량**: ${item.use_method_qesitm}`);
47
+ if (item.atpn_qesitm)
48
+ lines.push(`\n**주의사항**: ${item.atpn_qesitm}`);
49
+ if (item.intrc_qesitm)
50
+ lines.push(`\n**상호작용**: ${item.intrc_qesitm}`);
51
+ if (item.se_qesitm)
52
+ lines.push(`\n**이상반응**: ${item.se_qesitm}`);
53
+ if (item.deposit_method_qesitm)
54
+ lines.push(`\n**보관법**: ${item.deposit_method_qesitm}`);
55
+ lines.push("");
56
+ }
57
+ lines.push("_식약처 e약은요 공식 데이터 기준_");
58
+ return lines.join("\n");
59
+ }
60
+ //# sourceMappingURL=drug-safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drug-safety.js","sourceRoot":"","sources":["../../src/korea/drug-safety.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAsB5C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAGnC;IACC,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,OAAO,CAAA;IAChD,IAAI,CAAC,SAAS,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAExE,MAAM,QAAQ,GAAe,EAAE,CAAA;IAC/B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAA0B,6BAA6B,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAA;QAC9G,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,8BAA8B,MAAM,CAAC,OAAO,EAAE,EAAE,CAAA;YACxG,SAAQ;QACV,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAe,CAAA;QAC1F,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAA;IACzB,CAAC;IAED,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,QAAQ,CAAC,MAAM;QACtB,KAAK,EAAE,QAAQ;KAChB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,MAAM,KAAK,GAAG;QACZ,6EAA6E;QAC7E,EAAE;QACF,iBAAiB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC1C,KAAK,MAAM,CAAC,KAAK,GAAG;QACpB,EAAE;KACH,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC,CAAA;QACzC,IAAI,IAAI,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;QAC1D,IAAI,IAAI,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QACpE,IAAI,IAAI,CAAC,iBAAiB;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAA;QAChF,IAAI,IAAI,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QACnE,IAAI,IAAI,CAAC,YAAY;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,YAAY,EAAE,CAAC,CAAA;QACrE,IAAI,IAAI,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;QAC/D,IAAI,IAAI,CAAC,qBAAqB;YAAE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAA;QACtF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Fine dust / air quality (에어코리아) via k-skill-proxy
3
+ * Proxy endpoint: GET /v1/fine-dust/report?regionHint=서울 강남구
4
+ */
5
+ export type FineDustResult = {
6
+ source: "fine-dust";
7
+ station: string;
8
+ region_hint: string;
9
+ queried_at: string;
10
+ pm10: string;
11
+ pm10_grade: string;
12
+ pm25: string;
13
+ pm25_grade: string;
14
+ overall_grade: string;
15
+ retrieval_method: string;
16
+ candidate_stations?: string[];
17
+ ambiguous?: boolean;
18
+ };
19
+ export declare function runFineDust(options: {
20
+ regionHint?: string;
21
+ stationName?: string;
22
+ timeoutMs?: number;
23
+ }): Promise<FineDustResult | {
24
+ ok: false;
25
+ message: string;
26
+ }>;
27
+ export declare function renderFineDust(result: FineDustResult): string;
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Fine dust / air quality (에어코리아) via k-skill-proxy
3
+ * Proxy endpoint: GET /v1/fine-dust/report?regionHint=서울 강남구
4
+ */
5
+ import { proxyGet } from "./proxy-client.js";
6
+ const GRADE_MAP = {
7
+ "1": "좋음",
8
+ "2": "보통",
9
+ "3": "나쁨",
10
+ "4": "매우나쁨",
11
+ good: "좋음",
12
+ normal: "보통",
13
+ bad: "나쁨",
14
+ very_bad: "매우나쁨",
15
+ };
16
+ function gradeLabel(raw) {
17
+ const s = String(raw ?? "");
18
+ return GRADE_MAP[s] ?? s;
19
+ }
20
+ export async function runFineDust(options) {
21
+ const { regionHint, stationName, timeoutMs = 15000 } = options;
22
+ const params = {};
23
+ if (stationName) {
24
+ params["stationName"] = stationName;
25
+ }
26
+ else if (regionHint) {
27
+ params["regionHint"] = regionHint;
28
+ }
29
+ else {
30
+ return { ok: false, message: "regionHint 또는 stationName이 필요합니다." };
31
+ }
32
+ const result = await proxyGet("/v1/fine-dust/report", params, timeoutMs);
33
+ if (!result.ok) {
34
+ return { ok: false, message: `Fine dust lookup failed: ${result.message}` };
35
+ }
36
+ const d = result.data;
37
+ // Ambiguous location — multiple candidates returned
38
+ if (d["ambiguous_location"] === true || d["candidate_stations"]) {
39
+ const candidates = d["candidate_stations"] ?? [];
40
+ return {
41
+ source: "fine-dust",
42
+ station: "",
43
+ region_hint: regionHint ?? stationName ?? "",
44
+ queried_at: new Date().toISOString(),
45
+ pm10: "",
46
+ pm10_grade: "",
47
+ pm25: "",
48
+ pm25_grade: "",
49
+ overall_grade: "",
50
+ retrieval_method: String(d["retrieval_method"] ?? ""),
51
+ candidate_stations: candidates,
52
+ ambiguous: true,
53
+ };
54
+ }
55
+ return {
56
+ source: "fine-dust",
57
+ station: String(d["stationName"] ?? d["station"] ?? ""),
58
+ region_hint: regionHint ?? stationName ?? "",
59
+ queried_at: String(d["dataTime"] ?? d["queried_at"] ?? new Date().toISOString()),
60
+ pm10: String(d["pm10Value"] ?? d["pm10"] ?? ""),
61
+ pm10_grade: gradeLabel(d["pm10Grade"] ?? d["pm10_grade"]),
62
+ pm25: String(d["pm25Value"] ?? d["pm25"] ?? ""),
63
+ pm25_grade: gradeLabel(d["pm25Grade"] ?? d["pm25_grade"]),
64
+ overall_grade: gradeLabel(d["khaiGrade"] ?? d["overall_grade"] ?? d["grade"]),
65
+ retrieval_method: String(d["retrieval_method"] ?? d["fallback"] ?? "proxy"),
66
+ };
67
+ }
68
+ export function renderFineDust(result) {
69
+ if (result.ambiguous) {
70
+ const lines = [`# 미세먼지 — 위치 확인 필요`, `"${result.region_hint}"에 해당하는 측정소가 여러 개입니다.`, ""];
71
+ lines.push("측정소 후보:");
72
+ for (const s of result.candidate_stations ?? [])
73
+ lines.push(`- ${s}`);
74
+ lines.push("\n`stationName` 파라미터로 위 중 하나를 지정해서 재조회하세요.");
75
+ return lines.join("\n");
76
+ }
77
+ const lines = [
78
+ `# 미세먼지 — ${result.station || result.region_hint}`,
79
+ `조회 시점: ${result.queried_at}`,
80
+ "",
81
+ `- PM10: ${result.pm10} μg/m³ (${result.pm10_grade})`,
82
+ `- PM2.5: ${result.pm25} μg/m³ (${result.pm25_grade})`,
83
+ `- 통합대기: **${result.overall_grade}**`,
84
+ `- 조회방식: ${result.retrieval_method}`,
85
+ ];
86
+ return lines.join("\n");
87
+ }
88
+ //# sourceMappingURL=fine-dust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fine-dust.js","sourceRoot":"","sources":["../../src/korea/fine-dust.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Food safety info (식약처/식품안전나라) via k-skill-proxy
3
+ * Endpoints: /v1/mfds/food-safety/recall, /v1/mfds/food-safety/unfit, /v1/mfds/food-safety/functional-ingredient
4
+ */
5
+ export type FoodSafetyResult = {
6
+ source: "food-safety";
7
+ action: string;
8
+ query: string;
9
+ total: number;
10
+ items: Record<string, unknown>[];
11
+ };
12
+ export declare function runFoodSafety(options: {
13
+ action: "recall" | "unfit" | "functional-ingredient";
14
+ query: string;
15
+ limit?: number;
16
+ timeoutMs?: number;
17
+ }): Promise<FoodSafetyResult | {
18
+ ok: false;
19
+ message: string;
20
+ }>;
21
+ export declare function renderFoodSafety(result: FoodSafetyResult): string;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Food safety info (식약처/식품안전나라) via k-skill-proxy
3
+ * Endpoints: /v1/mfds/food-safety/recall, /v1/mfds/food-safety/unfit, /v1/mfds/food-safety/functional-ingredient
4
+ */
5
+ import { proxyGet } from "./proxy-client.js";
6
+ export async function runFoodSafety(options) {
7
+ const { action, query, limit = 20, timeoutMs = 20000 } = options;
8
+ const pathMap = {
9
+ recall: "/v1/mfds/food-safety/recall",
10
+ unfit: "/v1/mfds/food-safety/unfit",
11
+ "functional-ingredient": "/v1/mfds/food-safety/functional-ingredient",
12
+ };
13
+ const path = pathMap[action];
14
+ if (!path)
15
+ return { ok: false, message: `Unknown action: ${action}` };
16
+ const result = await proxyGet(path, { q: query, limit: String(limit) }, timeoutMs);
17
+ if (!result.ok)
18
+ return { ok: false, message: `Food safety lookup failed: ${result.message}` };
19
+ const items = (result.data["items"] ?? result.data["list"] ?? []);
20
+ const total = typeof result.data["total"] === "number" ? result.data["total"] : items.length;
21
+ return { source: "food-safety", action, query, total, items };
22
+ }
23
+ export function renderFoodSafety(result) {
24
+ const actionLabel = {
25
+ recall: "회수·판매중지",
26
+ unfit: "검사부적합",
27
+ "functional-ingredient": "기능성 원료 인정현황",
28
+ };
29
+ const lines = [
30
+ "⚠️ **응급 증상(혈변·탈수·호흡곤란·의식저하)은 즉시 119.**",
31
+ "",
32
+ `# 식품 안전 정보 — ${actionLabel[result.action] ?? result.action}`,
33
+ `검색어: "${result.query}" | 총 ${result.total}건`,
34
+ "",
35
+ ];
36
+ if (result.items.length === 0) {
37
+ lines.push("조회 결과가 없습니다.");
38
+ return lines.join("\n");
39
+ }
40
+ for (const item of result.items.slice(0, 20)) {
41
+ const name = String(item["prdlst_nm"] ?? item["item_name"] ?? item["name"] ?? item["PRDUCT_NM"] ?? "?");
42
+ const maker = String(item["bssh_nm"] ?? item["entp_name"] ?? item["ENTP_NM"] ?? "");
43
+ const reason = String(item["recalls_reason"] ?? item["unfit_reason"] ?? item["reason"] ?? item["RECALL_REASON"] ?? "");
44
+ const date = String(item["recalls_dt"] ?? item["dt"] ?? item["DATE"] ?? "");
45
+ lines.push(`- **${name}**${maker ? ` (${maker})` : ""}${reason ? ` — ${reason}` : ""}${date ? ` [${date}]` : ""}`);
46
+ }
47
+ lines.push("\n_식약처/식품안전나라 공식 데이터 기준_");
48
+ return lines.join("\n");
49
+ }
50
+ //# sourceMappingURL=food-safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"food-safety.js","sourceRoot":"","sources":["../../src/korea/food-safety.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * GeekNews (news.hada.io) — public RSS/Atom feed
3
+ * Feed: https://feeds.feedburner.com/geeknews-feed
4
+ */
5
+ export type GeeknewsItem = {
6
+ id: string;
7
+ title: string;
8
+ link: string;
9
+ author: string;
10
+ published: string;
11
+ summary: string;
12
+ };
13
+ export type GeeknewsResult = {
14
+ source: "geeknews";
15
+ query: string | null;
16
+ limit: number;
17
+ total: number;
18
+ items: GeeknewsItem[];
19
+ feed_url: string;
20
+ };
21
+ export declare function runGeeknews(options: {
22
+ action?: "list" | "search" | "detail";
23
+ query?: string;
24
+ id?: string;
25
+ limit?: number;
26
+ timeoutMs?: number;
27
+ }): Promise<GeeknewsResult | {
28
+ ok: false;
29
+ message: string;
30
+ }>;
31
+ export declare function renderGeeknews(result: GeeknewsResult): string;
@@ -0,0 +1,144 @@
1
+ /**
2
+ * GeekNews (news.hada.io) — public RSS/Atom feed
3
+ * Feed: https://feeds.feedburner.com/geeknews-feed
4
+ */
5
+ import { httpGetText } from "./proxy-client.js";
6
+ const GEEKNEWS_FEED = "https://feeds.feedburner.com/geeknews-feed";
7
+ const GEEKNEWS_HOME = "https://news.hada.io";
8
+ function stripHtml(html) {
9
+ return html.replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
10
+ }
11
+ function decodeXmlEntities(text) {
12
+ return text
13
+ .replace(/&amp;/g, "&")
14
+ .replace(/&lt;/g, "<")
15
+ .replace(/&gt;/g, ">")
16
+ .replace(/&quot;/g, '"')
17
+ .replace(/&#39;/g, "'")
18
+ .replace(/&apos;/g, "'")
19
+ .replace(/&nbsp;/g, " ")
20
+ .replace(/&#(\d+);/g, (_m, n) => String.fromCharCode(parseInt(n, 10)));
21
+ }
22
+ function extractXml(text, tag) {
23
+ const match = text.match(new RegExp(`<${tag}(?:[^>]*)>([\\s\\S]*?)<\\/${tag}>`, "i"));
24
+ return match ? decodeXmlEntities(stripHtml(match[1] || "")).trim() : "";
25
+ }
26
+ function extractCdata(text, tag) {
27
+ const match = text.match(new RegExp(`<${tag}[^>]*>(?:<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>|([\\s\\S]*?))<\\/${tag}>`, "i"));
28
+ const raw = match?.[1] ?? match?.[2] ?? "";
29
+ return decodeXmlEntities(stripHtml(raw)).trim();
30
+ }
31
+ function extractLink(block) {
32
+ const atomLink = block.match(/<link[^>]+href=["']([^"']+)["']/i)?.[1];
33
+ if (atomLink)
34
+ return atomLink.trim();
35
+ const rssLink = extractXml(block, "link");
36
+ if (rssLink)
37
+ return rssLink.trim();
38
+ return "";
39
+ }
40
+ function extractId(block) {
41
+ const guid = extractXml(block, "guid");
42
+ if (guid)
43
+ return guid;
44
+ const id = extractXml(block, "id");
45
+ if (id)
46
+ return id;
47
+ return extractLink(block);
48
+ }
49
+ function parseItems(feedXml) {
50
+ const items = [];
51
+ const blockPattern = /<(?:item|entry)\b[^>]*>([\s\S]*?)<\/(?:item|entry)>/gi;
52
+ for (const blockMatch of feedXml.matchAll(blockPattern)) {
53
+ const block = blockMatch[1] || "";
54
+ const title = extractCdata(block, "title") || extractXml(block, "title");
55
+ const link = extractLink(block);
56
+ const author = extractCdata(block, "author") || extractXml(block, "author") || extractXml(block, "dc:creator") || "GeekNews";
57
+ const published = extractXml(block, "pubDate") || extractXml(block, "published") || extractXml(block, "updated") || "";
58
+ const summary = extractCdata(block, "description") || extractCdata(block, "summary") || extractXml(block, "description") || extractXml(block, "summary") || "";
59
+ const id = extractId(block);
60
+ if (title || link) {
61
+ items.push({
62
+ id: id || link,
63
+ title,
64
+ link: link || GEEKNEWS_HOME,
65
+ author,
66
+ published,
67
+ summary: summary.slice(0, 1000),
68
+ });
69
+ }
70
+ }
71
+ return items;
72
+ }
73
+ function matchesQuery(item, query) {
74
+ const q = query.toLowerCase();
75
+ return (item.title.toLowerCase().includes(q) ||
76
+ item.summary.toLowerCase().includes(q) ||
77
+ item.author.toLowerCase().includes(q) ||
78
+ item.link.toLowerCase().includes(q) ||
79
+ item.id.toLowerCase().includes(q));
80
+ }
81
+ export async function runGeeknews(options) {
82
+ const { action = "list", query, id, limit = 20, timeoutMs = 15000 } = options;
83
+ const feedResult = await httpGetText(GEEKNEWS_FEED, {
84
+ accept: "application/rss+xml, application/atom+xml, text/xml, */*",
85
+ }, timeoutMs);
86
+ if (!feedResult.ok) {
87
+ return { ok: false, message: `Failed to fetch GeekNews feed: ${feedResult.message}` };
88
+ }
89
+ const allItems = parseItems(feedResult.data);
90
+ if (action === "detail" && id) {
91
+ const found = allItems.find((item) => item.id === id ||
92
+ item.link === id ||
93
+ item.id.includes(id) ||
94
+ item.link.includes(id));
95
+ const matched = found ? [found] : [];
96
+ return {
97
+ source: "geeknews",
98
+ query: id,
99
+ limit: 1,
100
+ total: matched.length,
101
+ items: matched,
102
+ feed_url: GEEKNEWS_FEED,
103
+ };
104
+ }
105
+ if (action === "search" && query) {
106
+ const filtered = allItems.filter((item) => matchesQuery(item, query)).slice(0, limit);
107
+ return {
108
+ source: "geeknews",
109
+ query,
110
+ limit,
111
+ total: filtered.length,
112
+ items: filtered,
113
+ feed_url: GEEKNEWS_FEED,
114
+ };
115
+ }
116
+ // list
117
+ return {
118
+ source: "geeknews",
119
+ query: null,
120
+ limit,
121
+ total: allItems.length,
122
+ items: allItems.slice(0, limit),
123
+ feed_url: GEEKNEWS_FEED,
124
+ };
125
+ }
126
+ export function renderGeeknews(result) {
127
+ const lines = [`# GeekNews (${result.total} items)`];
128
+ if (result.query)
129
+ lines.push(`Query: ${result.query}`);
130
+ lines.push("");
131
+ for (const item of result.items) {
132
+ lines.push(`## ${item.title}`);
133
+ lines.push(`- Link: ${item.link}`);
134
+ if (item.author && item.author !== "GeekNews")
135
+ lines.push(`- Author: ${item.author}`);
136
+ if (item.published)
137
+ lines.push(`- Published: ${item.published}`);
138
+ if (item.summary)
139
+ lines.push(`\n${item.summary}`);
140
+ lines.push("");
141
+ }
142
+ return lines.join("\n");
143
+ }
144
+ //# sourceMappingURL=geeknews.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geeknews.js","sourceRoot":"","sources":["../../src/korea/geeknews.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export { runGeeknews, renderGeeknews } from "./geeknews.js";
2
+ export { runSubway, renderSubway } from "./subway.js";
3
+ export { runWeather, renderWeather } from "./weather.js";
4
+ export { runFineDust, renderFineDust } from "./fine-dust.js";
5
+ export { runStock, renderStock } from "./stock.js";
6
+ export { runDart, renderDart } from "./dart.js";
7
+ export { runRealEstate, renderRealEstate } from "./real-estate.js";
8
+ export { runDrugSafety, renderDrugSafety } from "./drug-safety.js";
9
+ export { runFoodSafety, renderFoodSafety } from "./food-safety.js";
10
+ export { runNaverNews, renderNaverNews } from "./naver-news.js";
11
+ export { runNaverShopping, renderNaverShopping } from "./naver-shopping.js";
12
+ export { runCoupang, renderCoupang } from "./coupang.js";
13
+ export { runSpellCheck, renderSpellCheck } from "./spellcheck.js";
14
+ export { runZipcode, renderZipcode } from "./zipcode.js";
15
+ export { runLaw, renderLaw } from "./law.js";
16
+ export { runPublicRestroom, renderPublicRestroom } from "./public-restroom.js";
@@ -0,0 +1,17 @@
1
+ export { runGeeknews, renderGeeknews } from "./geeknews.js";
2
+ export { runSubway, renderSubway } from "./subway.js";
3
+ export { runWeather, renderWeather } from "./weather.js";
4
+ export { runFineDust, renderFineDust } from "./fine-dust.js";
5
+ export { runStock, renderStock } from "./stock.js";
6
+ export { runDart, renderDart } from "./dart.js";
7
+ export { runRealEstate, renderRealEstate } from "./real-estate.js";
8
+ export { runDrugSafety, renderDrugSafety } from "./drug-safety.js";
9
+ export { runFoodSafety, renderFoodSafety } from "./food-safety.js";
10
+ export { runNaverNews, renderNaverNews } from "./naver-news.js";
11
+ export { runNaverShopping, renderNaverShopping } from "./naver-shopping.js";
12
+ export { runCoupang, renderCoupang } from "./coupang.js";
13
+ export { runSpellCheck, renderSpellCheck } from "./spellcheck.js";
14
+ export { runZipcode, renderZipcode } from "./zipcode.js";
15
+ export { runLaw, renderLaw } from "./law.js";
16
+ export { runPublicRestroom, renderPublicRestroom } from "./public-restroom.js";
17
+ //# sourceMappingURL=index.js.map