smart-web-mcp 0.20.0 → 0.20.1

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/CHANGELOG.md CHANGED
@@ -70,6 +70,17 @@ The format is based on Keep a Changelog[^1] and this project uses SemVer.
70
70
 
71
71
  ### Fixed
72
72
 
73
+ - `smartcrawl` docs summaries now suppress previous/next pager links from ranked results while still allowing pagination traversal, preventing duplicated navigation context from outranking relevant docs pages in configured MCP smokes.
74
+ - `kr_public_restroom` now returns structured coordinate guidance when neither `lat`/`lon` nor Kakao geocoding are available, instead of raising an MCP tool error.
75
+ - `smartfetch target=naver_blog` now treats invalid/deleted Naver Blog error shells as partial `blocked_or_unavailable` results with explicit guidance instead of rendering CSS/font declarations and asset links as successful post text.
76
+ - `kr_stock` default searches now fall back across recent KRX base dates when today's dataset has not published yet, so common lookups such as 삼성전자 do not return false empty results on non-trading or delayed-data days.
77
+ - `smartfetch target=naver_cafe_post` now replaces Naver Cafe JavaScript/chrome shell fallbacks with concise unavailable/authwall guidance when the public article JSON endpoint is unavailable, while preserving successful public article JSON extraction and readable browser primary content.
78
+ - `kr_public_restroom` now fetches the official public-restroom dataset as CSV/plain text through the current `localCode` route with EUC-KR fallback decoding; current no-coordinate datasets return structured unavailable guidance instead of a raw MCP tool error.
79
+ - `kr_real_estate` transaction empty states now render explicit no-result/retry guidance, and k-skill-proxy/국토교통부 upstream failures return structured unavailable diagnostics instead of raw MCP tool errors.
80
+ - `kr_fine_dust` now returns structured unavailable/quota guidance for k-skill-proxy or AirKorea upstream failures instead of raising a raw MCP tool error, while preserving redacted diagnostics.
81
+ - `kr_stock` empty search results and `kr_weather` zero-item forecasts now render explicit text-channel guidance while preserving existing structured results.
82
+ - Korean proxy/client error text now redacts credential-like query parameters such as `serviceKey` and `KakaoAK` authorization tokens before surfacing upstream failures in MCP output, preserving quota/status context without leaking API keys.
83
+ - `kr_law` now treats Beopmang upstream-origin 530 / `error code: 1033` responses as a structured temporary-unavailable result with clear retry guidance, and `search-precedents` now uses the current `/api/v4/case?action=search` contract instead of the stale tools action.
73
84
  - `kr_food_safety` now calls the current k-skill-proxy food-safety routes (`search`, `inspection-fail`, and `health-food-ingredient`) with the `query` parameter and renders the current result fields.
74
85
  - `kr_coupang` no-secret hosted fallback now sends direct Retention Corp JSON-RPC method payloads with top-level query arguments and parses the current `best_fit`/`shortlist` response shape while preserving legacy nested-envelope parsing.
75
86
  - `kr_geeknews` text headings now show returned and total item counts when list output is limited, while preserving `structuredContent.total` and `limit`.
@@ -84,6 +95,7 @@ The format is based on Keep a Changelog[^1] and this project uses SemVer.
84
95
  - `smartfetch` assessment now ignores benign interactive UI phrases in page chrome when deterministic extraction already has complete primary content, avoiding unnecessary web-task handoffs for docs pages such as MDN.
85
96
  - `smartfetch` archive fallback now rejects archive.md search/index pages that have no snapshot, and blocked fetches keep handoff guidance even when only reference metadata is available.
86
97
  - `smartsearch` MCP calls now honor `contextMaxCharacters` as a rendered text-channel cap, keeping oversized search summaries out of `content[0].text` while preserving full results in `structuredContent`.
98
+ - Wikidocs unavailable/error shells are now reported as partial `blocked_or_unavailable` results with explicit guidance instead of treating CSS/error-container text as successful article content.
87
99
  - Built package bin targets now keep executable permissions after `npm run build`, so local `npm link` / Hermes stdio MCP installs can launch `smart-web-mcp` directly instead of failing with permission denied.
88
100
  - `smartcrawl` export reruns now validate prior manifest identity before trusting it as an ownership marker for non-empty output directories.
89
101
  - `smartcrawl` export reruns now require complete prior manifests before bypassing the non-empty output directory guard.
@@ -96,6 +108,26 @@ The format is based on Keep a Changelog[^1] and this project uses SemVer.
96
108
  - Korean public API helpers now validate outbound URLs and redirects before fetching, blocking localhost, private, and reserved targets unless `network.allowPrivateHosts` is explicitly enabled.
97
109
  - CI now declares read-only default repository permissions, Dependabot auto-merge pins the reusable workflow without forwarding all caller secrets, and the workflow check enforces those guards.
98
110
 
111
+ ## [0.20.1](https://github.com/jojo-labs/smart-web/compare/v0.20.0...v0.20.1) (2026-06-20)
112
+
113
+
114
+ ### Bug Fixes
115
+
116
+ * catch smartcrawl docs pager prefixes ([#308](https://github.com/jojo-labs/smart-web/issues/308)) ([97be1da](https://github.com/jojo-labs/smart-web/commit/97be1da9386e8f3ccc9e3a8bb07112aa2df3901c))
117
+ * clarify Korean empty specialist output ([4985c2e](https://github.com/jojo-labs/smart-web/commit/4985c2eb586330c3432bfe0e26d0fd2fb2138c00))
118
+ * clarify real estate empty results ([#305](https://github.com/jojo-labs/smart-web/issues/305)) ([ef94ede](https://github.com/jojo-labs/smart-web/commit/ef94edea67d7de883fe3e36c8a3487bdf010e8f0))
119
+ * fall back kr stock default dates ([#303](https://github.com/jojo-labs/smart-web/issues/303)) ([ce84fa8](https://github.com/jojo-labs/smart-web/commit/ce84fa81ffe023a9e0055a7398085c19f2f4bd9f))
120
+ * handle law upstream unavailable ([ac56187](https://github.com/jojo-labs/smart-web/commit/ac56187687b02e4900a19fdf9605d7a3b7248c00))
121
+ * harden public restroom CSV loading ([#297](https://github.com/jojo-labs/smart-web/issues/297)) ([270518d](https://github.com/jojo-labs/smart-web/commit/270518d5b914e8dc41650a0001cc5208a6d5bf7a))
122
+ * mark Naver Blog error shells unavailable ([#301](https://github.com/jojo-labs/smart-web/issues/301)) ([dca2fab](https://github.com/jojo-labs/smart-web/commit/dca2fab892f235384ddd9303de0d34fa714c53d1))
123
+ * mark Wikidocs error shells unavailable ([#298](https://github.com/jojo-labs/smart-web/issues/298)) ([dbf5e0c](https://github.com/jojo-labs/smart-web/commit/dbf5e0c5308b60afa333799ec2d979e23e023770))
124
+ * redact Korean proxy error credentials ([#295](https://github.com/jojo-labs/smart-web/issues/295)) ([bc218e5](https://github.com/jojo-labs/smart-web/commit/bc218e588ceafce9e6401a41dbd87d61986f69e4))
125
+ * return structured fine dust proxy errors ([#304](https://github.com/jojo-labs/smart-web/issues/304)) ([e0a0f7f](https://github.com/jojo-labs/smart-web/commit/e0a0f7f98770b2f5b96b2c831b4b48b5eff5b46d))
126
+ * return structured restroom coordinate guidance ([2474dba](https://github.com/jojo-labs/smart-web/commit/2474dbac28177a055a7871f669040722d38c81f8))
127
+ * suppress Naver Cafe chrome fallback text ([#300](https://github.com/jojo-labs/smart-web/issues/300)) ([511c284](https://github.com/jojo-labs/smart-web/commit/511c28480f931ed240f6a0bc86fd4c0b831d7ec3))
128
+ * suppress Naver Cafe shell fallback text ([#299](https://github.com/jojo-labs/smart-web/issues/299)) ([00aa4f4](https://github.com/jojo-labs/smart-web/commit/00aa4f4c7c1cee1428f12b0e644469e05ab8df1b))
129
+ * suppress smartcrawl docs pager results ([#307](https://github.com/jojo-labs/smart-web/issues/307)) ([37464e7](https://github.com/jojo-labs/smart-web/commit/37464e7021fe42bca0a36fc2818ff315d91861a5))
130
+
99
131
  ## [0.20.0](https://github.com/jojo-labs/smart-web/compare/v0.19.0...v0.20.0) (2026-06-20)
100
132
 
101
133
 
@@ -2,6 +2,11 @@
2
2
  * Fine dust / air quality (에어코리아) via k-skill-proxy
3
3
  * Proxy endpoint: GET /v1/fine-dust/report?regionHint=서울 강남구
4
4
  */
5
+ export type FineDustDataError = {
6
+ code: string;
7
+ status: number;
8
+ message: string;
9
+ };
5
10
  export type FineDustResult = {
6
11
  source: "fine-dust";
7
12
  station: string;
@@ -15,6 +20,8 @@ export type FineDustResult = {
15
20
  retrieval_method: string;
16
21
  candidate_stations?: string[];
17
22
  ambiguous?: boolean;
23
+ warning?: string;
24
+ data_error?: FineDustDataError;
18
25
  };
19
26
  export declare function runFineDust(options: {
20
27
  regionHint?: string;
@@ -17,6 +17,24 @@ function gradeLabel(raw) {
17
17
  const s = String(raw ?? "");
18
18
  return GRADE_MAP[s] ?? s;
19
19
  }
20
+ function compactDiagnosticMessage(message) {
21
+ try {
22
+ const parsed = JSON.parse(message);
23
+ if (parsed && typeof parsed === "object" && "message" in parsed) {
24
+ const nested = parsed.message;
25
+ if (typeof nested === "string" && nested.trim())
26
+ return compactDiagnosticMessage(nested);
27
+ }
28
+ }
29
+ catch {
30
+ // Fall through to generic compaction.
31
+ }
32
+ return message
33
+ .replace(/<[^>]+>/g, " ")
34
+ .replace(/\s+/g, " ")
35
+ .trim()
36
+ .slice(0, 220);
37
+ }
20
38
  export async function runFineDust(options) {
21
39
  const { regionHint, stationName, timeoutMs = 15000 } = options;
22
40
  const params = {};
@@ -31,7 +49,24 @@ export async function runFineDust(options) {
31
49
  }
32
50
  const result = await proxyGet("/v1/fine-dust/report", params, timeoutMs);
33
51
  if (!result.ok) {
34
- return { ok: false, message: `Fine dust lookup failed: ${result.message}` };
52
+ return {
53
+ source: "fine-dust",
54
+ station: stationName ?? "",
55
+ region_hint: regionHint ?? stationName ?? "",
56
+ queried_at: new Date().toISOString(),
57
+ pm10: "",
58
+ pm10_grade: "",
59
+ pm25: "",
60
+ pm25_grade: "",
61
+ overall_grade: "",
62
+ retrieval_method: "proxy",
63
+ warning: "에어코리아 미세먼지 데이터를 지금 불러올 수 없습니다. 잠시 후 다시 시도하세요.",
64
+ data_error: {
65
+ code: result.code,
66
+ status: result.status,
67
+ message: compactDiagnosticMessage(result.message),
68
+ },
69
+ };
35
70
  }
36
71
  const d = result.data;
37
72
  // Ambiguous location — multiple candidates returned
@@ -66,6 +101,19 @@ export async function runFineDust(options) {
66
101
  };
67
102
  }
68
103
  export function renderFineDust(result) {
104
+ if (result.warning) {
105
+ const status = result.data_error?.status ? ` / HTTP ${result.data_error.status}` : "";
106
+ const lines = [
107
+ `# 미세먼지 — ${result.station || result.region_hint || "조회 불가"}`,
108
+ result.warning,
109
+ "",
110
+ "k-skill-proxy 또는 에어코리아 상류 서비스가 호출 한도나 일시적인 프록시 오류를 반환했을 수 있습니다. 잠시 후 다시 시도하거나 지역/측정소 이름을 확인해 주세요.",
111
+ ];
112
+ if (result.data_error) {
113
+ lines.push(`진단: ${result.data_error.code}${status} - ${result.data_error.message}`);
114
+ }
115
+ return lines.join("\n");
116
+ }
69
117
  if (result.ambiguous) {
70
118
  const lines = [`# 미세먼지 — 위치 확인 필요`, `"${result.region_hint}"에 해당하는 측정소가 여러 개입니다.`, ""];
71
119
  lines.push("측정소 후보:");
@@ -1 +1 @@
1
- {"version":3,"file":"fine-dust.js","sourceRoot":"","sources":["../../src/korea/fine-dust.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fine-dust.js","sourceRoot":"","sources":["../../src/korea/fine-dust.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,13 @@ export type LawArticle = {
18
18
  article: string;
19
19
  content: string;
20
20
  };
21
+ export type LawUnavailable = {
22
+ code: "beopmang_origin_unavailable";
23
+ status: number;
24
+ reason: "origin_530";
25
+ message: string;
26
+ next_action: string;
27
+ };
21
28
  export type LawSearchResult = {
22
29
  source: "korean-law";
23
30
  action: "search" | "get-text" | "search-precedents";
@@ -26,6 +33,7 @@ export type LawSearchResult = {
26
33
  items?: LawItem[];
27
34
  article?: LawArticle;
28
35
  precedents?: Record<string, unknown>[];
36
+ unavailable?: LawUnavailable;
29
37
  };
30
38
  export declare function runLaw(options: {
31
39
  action: "search" | "get-text" | "search-precedents";
package/dist/korea/law.js CHANGED
@@ -5,13 +5,46 @@
5
5
  */
6
6
  import { httpGet } from "./proxy-client.js";
7
7
  const BEOPMANG_BASE = "https://api.beopmang.org/api/v4";
8
+ function isOriginUnavailable(error) {
9
+ return error.status === 530 ||
10
+ error.code === "http_530" ||
11
+ /error code:\s*1033/i.test(error.message) ||
12
+ /(?:upstream[- ]origin|origin)\s*530/i.test(error.message);
13
+ }
14
+ function unavailableResult(action, query, error) {
15
+ return {
16
+ source: "korean-law",
17
+ action,
18
+ query,
19
+ total: 0,
20
+ unavailable: {
21
+ code: "beopmang_origin_unavailable",
22
+ status: error.status,
23
+ reason: "origin_530",
24
+ message: "법망 upstream origin is temporarily unavailable.",
25
+ next_action: "잠시 후 재시도하거나, api.beopmang.org 복구 전까지 다른 공식 한국 법령 정보 출처를 사용하세요.",
26
+ },
27
+ };
28
+ }
29
+ function normalizePrecedent(item) {
30
+ return {
31
+ id: String(item["case_id"] ?? item["precedent_id"] ?? item["id"] ?? ""),
32
+ title: String(item["title"] ?? item["case_title"] ?? item["case_name"] ?? item["name"] ?? ""),
33
+ case_number: String(item["case_number"] ?? item["case_no"] ?? item["number"] ?? ""),
34
+ court: String(item["court"] ?? item["court_name"] ?? ""),
35
+ date: String(item["date"] ?? item["judgment_date"] ?? item["judgement_date"] ?? ""),
36
+ summary: String(item["summary"] ?? item["snippet"] ?? item["abstract"] ?? ""),
37
+ };
38
+ }
8
39
  export async function runLaw(options) {
9
40
  const { action, query, law_id, article, limit = 10, timeoutMs = 20000 } = options;
10
41
  if (action === "search") {
11
42
  if (!query)
12
43
  return { ok: false, message: "검색어(query)가 필요합니다." };
13
- const url = `${BEOPMANG_BASE}/law?action=search&q=${encodeURIComponent(query)}&limit=${limit}`;
44
+ const url = `${BEOPMANG_BASE}/law?action=search&mode=keyword&q=${encodeURIComponent(query)}&limit=${limit}`;
14
45
  const result = await httpGet(url, {}, timeoutMs);
46
+ if (!result.ok && isOriginUnavailable(result))
47
+ return unavailableResult(action, query, result);
15
48
  if (!result.ok)
16
49
  return { ok: false, message: `Law search failed: ${result.message}` };
17
50
  const items = (result.data["laws"] ?? result.data["items"] ?? result.data["results"] ?? [])
@@ -33,6 +66,8 @@ export async function runLaw(options) {
33
66
  params.set("article", article);
34
67
  const url = `${BEOPMANG_BASE}/law?${params.toString()}`;
35
68
  const result = await httpGet(url, {}, timeoutMs);
69
+ if (!result.ok && isOriginUnavailable(result))
70
+ return unavailableResult(action, article ?? "전문", result);
36
71
  if (!result.ok)
37
72
  return { ok: false, message: `Law text lookup failed: ${result.message}` };
38
73
  const d = result.data;
@@ -47,14 +82,29 @@ export async function runLaw(options) {
47
82
  // search-precedents
48
83
  if (!query)
49
84
  return { ok: false, message: "검색어(query)가 필요합니다." };
50
- const url = `${BEOPMANG_BASE}/tools?action=search_precedents&q=${encodeURIComponent(query)}&limit=${limit}`;
85
+ const url = `${BEOPMANG_BASE}/case?action=search&q=${encodeURIComponent(query)}&limit=${limit}`;
51
86
  const result = await httpGet(url, {}, timeoutMs);
87
+ if (!result.ok && isOriginUnavailable(result))
88
+ return unavailableResult(action, query, result);
52
89
  if (!result.ok)
53
90
  return { ok: false, message: `Precedent search failed: ${result.message}` };
54
- const precedents = (result.data["precedents"] ?? result.data["items"] ?? []);
91
+ const precedents = (result.data["cases"] ?? result.data["precedents"] ?? result.data["items"] ?? result.data["results"] ?? [])
92
+ .map(normalizePrecedent);
55
93
  return { source: "korean-law", action: "search-precedents", query, total: precedents.length, precedents };
56
94
  }
57
95
  export function renderLaw(result) {
96
+ if (result.unavailable) {
97
+ const label = result.action === "search-precedents" ? "판례 검색" : result.action === "get-text" ? "법령 본문 조회" : "법령 검색";
98
+ return [
99
+ `# ${label} — "${result.query}"`,
100
+ "",
101
+ "법망(api.beopmang.org)을 일시적으로 사용할 수 없습니다.",
102
+ `원인: ${result.unavailable.reason} (${result.unavailable.code})`,
103
+ `권장 다음 조치: ${result.unavailable.next_action}`,
104
+ "",
105
+ "_법망(api.beopmang.org) upstream 상태 기준_",
106
+ ].join("\n");
107
+ }
58
108
  if (result.action === "search") {
59
109
  const lines = [`# 법령 검색 — "${result.query}"`, `${result.total}건`, ""];
60
110
  for (const item of result.items ?? []) {
@@ -1 +1 @@
1
- {"version":3,"file":"law.js","sourceRoot":"","sources":["../../src/korea/law.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"law.js","sourceRoot":"","sources":["../../src/korea/law.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ export type KrResult<T> = {
15
15
  } | KrError;
16
16
  export declare function proxyGet<T = unknown>(path: string, params?: Record<string, string>, timeoutMs?: number): Promise<KrResult<T>>;
17
17
  export declare function httpGetText(url: string, headers?: Record<string, string>, timeoutMs?: number): Promise<KrResult<string>>;
18
+ export declare function httpGetDecodedText(url: string, headers?: Record<string, string>, timeoutMs?: number, encodings?: string[]): Promise<KrResult<string>>;
18
19
  export declare function httpGet<T = unknown>(url: string, headers?: Record<string, string>, timeoutMs?: number): Promise<KrResult<T>>;
19
20
  export declare function httpPost<T = unknown>(url: string, body: string, headers?: Record<string, string>, timeoutMs?: number): Promise<KrResult<T>>;
20
21
  export declare function formatError(err: KrError): string;
@@ -7,17 +7,26 @@ const DEFAULT_PROXY = "https://k-skill-proxy.nomadamas.org";
7
7
  const DEFAULT_TIMEOUT_MS = 15000;
8
8
  const MAX_REDIRECTS = 5;
9
9
  const BROWSER_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36";
10
+ const REDACTED = "[redacted]";
11
+ const CREDENTIAL_QUERY_PARAM = "(?:serviceKey|apiKey|apikey|api_key|key|token|access_token|client_secret|clientSecret|authorization|auth|authToken|auth_token)";
12
+ const CREDENTIAL_QUERY_RE = new RegExp(`([?&;]|&amp;)(${CREDENTIAL_QUERY_PARAM})=([^&#\\s"'<>\\\\}]*)`, "gi");
13
+ const KAKAO_AUTH_RE = /\bKakaoAK\s+[\w.+/=-]+/gi;
10
14
  export function proxyBase() {
11
15
  return (process.env["KSKILL_PROXY_BASE_URL"] || DEFAULT_PROXY).replace(/\/+$/, "");
12
16
  }
13
17
  function invalidUrlError(message) {
14
- return { ok: false, status: 0, message, code: "invalid_url" };
18
+ return { ok: false, status: 0, message: redactErrorMessage(message), code: "invalid_url" };
15
19
  }
16
20
  function allowPrivateHosts() {
17
21
  return configFlag("network.allowPrivateHosts");
18
22
  }
19
23
  function blockedUrlError(message) {
20
- return { ok: false, status: 0, message, code: "blocked_url" };
24
+ return { ok: false, status: 0, message: redactErrorMessage(message), code: "blocked_url" };
25
+ }
26
+ function redactErrorMessage(message) {
27
+ return message
28
+ .replace(CREDENTIAL_QUERY_RE, (_match, separator, key) => `${separator}${key}=${REDACTED}`)
29
+ .replace(KAKAO_AUTH_RE, `KakaoAK ${REDACTED}`);
21
30
  }
22
31
  function isRedirectStatus(status) {
23
32
  return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;
@@ -70,7 +79,7 @@ async function validatedFetchText(url, init, timeoutMs, options = {}) {
70
79
  if (!isRedirectStatus(res.status)) {
71
80
  const text = await res.text();
72
81
  if (!res.ok) {
73
- return { ok: false, status: res.status, message: text.slice(0, 500), code: `http_${res.status}` };
82
+ return { ok: false, status: res.status, message: redactErrorMessage(text.slice(0, 500)), code: `http_${res.status}` };
74
83
  }
75
84
  return { ok: true, data: text };
76
85
  }
@@ -81,7 +90,7 @@ async function validatedFetchText(url, init, timeoutMs, options = {}) {
81
90
  catch {
82
91
  // Ignore best-effort stream cleanup failures.
83
92
  }
84
- return { ok: false, status: res.status, message: `Redirects are not allowed while requesting URL: ${url}`, code: "redirect_not_allowed" };
93
+ return { ok: false, status: res.status, message: redactErrorMessage(`Redirects are not allowed while requesting URL: ${url}`), code: "redirect_not_allowed" };
85
94
  }
86
95
  if (hop === MAX_REDIRECTS) {
87
96
  try {
@@ -90,7 +99,7 @@ async function validatedFetchText(url, init, timeoutMs, options = {}) {
90
99
  catch {
91
100
  // Ignore best-effort stream cleanup failures.
92
101
  }
93
- return { ok: false, status: res.status, message: `Too many redirects while requesting URL: ${url}`, code: "too_many_redirects" };
102
+ return { ok: false, status: res.status, message: redactErrorMessage(`Too many redirects while requesting URL: ${url}`), code: "too_many_redirects" };
94
103
  }
95
104
  const location = res.headers.get("location");
96
105
  try {
@@ -104,16 +113,92 @@ async function validatedFetchText(url, init, timeoutMs, options = {}) {
104
113
  currentUrl = new URL(location, currentUrl).toString();
105
114
  currentInit = redirectInit(res.status, currentInit);
106
115
  }
107
- return { ok: false, status: 0, message: `Too many redirects while requesting URL: ${url}`, code: "too_many_redirects" };
116
+ return { ok: false, status: 0, message: redactErrorMessage(`Too many redirects while requesting URL: ${url}`), code: "too_many_redirects" };
108
117
  }
109
118
  catch (err) {
110
119
  const message = err instanceof Error ? err.message : String(err);
111
- return { ok: false, status: 0, message, code: err instanceof Error && err.name === "AbortError" ? "timeout" : "network_error" };
120
+ return { ok: false, status: 0, message: redactErrorMessage(message), code: err instanceof Error && err.name === "AbortError" ? "timeout" : "network_error" };
112
121
  }
113
122
  finally {
114
123
  clearTimeout(timer);
115
124
  }
116
125
  }
126
+ async function validatedFetchBytes(url, init, timeoutMs, options = {}) {
127
+ const controller = new AbortController();
128
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
129
+ let currentUrl = url;
130
+ let currentInit = init;
131
+ const followRedirects = options.followRedirects !== false;
132
+ try {
133
+ for (let hop = 0; hop <= MAX_REDIRECTS; hop++) {
134
+ const validation = await validateOutboundUrl(currentUrl, { allowPrivateHosts: allowPrivateHosts() });
135
+ if (!validation.ok)
136
+ return blockedUrlError(validation.message);
137
+ const res = await fetch(currentUrl, {
138
+ ...currentInit,
139
+ signal: controller.signal,
140
+ redirect: "manual",
141
+ });
142
+ if (!isRedirectStatus(res.status)) {
143
+ const bytes = new Uint8Array(await res.arrayBuffer());
144
+ if (!res.ok) {
145
+ const text = new TextDecoder("utf-8").decode(bytes.slice(0, 500));
146
+ return { ok: false, status: res.status, message: redactErrorMessage(text), code: `http_${res.status}` };
147
+ }
148
+ return { ok: true, data: bytes };
149
+ }
150
+ if (!followRedirects) {
151
+ try {
152
+ await res.body?.cancel();
153
+ }
154
+ catch {
155
+ // Ignore best-effort stream cleanup failures.
156
+ }
157
+ return { ok: false, status: res.status, message: redactErrorMessage(`Redirects are not allowed while requesting URL: ${url}`), code: "redirect_not_allowed" };
158
+ }
159
+ if (hop === MAX_REDIRECTS) {
160
+ try {
161
+ await res.body?.cancel();
162
+ }
163
+ catch {
164
+ // Ignore best-effort stream cleanup failures.
165
+ }
166
+ return { ok: false, status: res.status, message: redactErrorMessage(`Too many redirects while requesting URL: ${url}`), code: "too_many_redirects" };
167
+ }
168
+ const location = res.headers.get("location");
169
+ try {
170
+ await res.body?.cancel();
171
+ }
172
+ catch {
173
+ // Ignore best-effort stream cleanup failures.
174
+ }
175
+ if (!location)
176
+ return { ok: false, status: res.status, message: "Redirect response did not include a Location header", code: "redirect_missing_location" };
177
+ currentUrl = new URL(location, currentUrl).toString();
178
+ currentInit = redirectInit(res.status, currentInit);
179
+ }
180
+ return { ok: false, status: 0, message: redactErrorMessage(`Too many redirects while requesting URL: ${url}`), code: "too_many_redirects" };
181
+ }
182
+ catch (err) {
183
+ const message = err instanceof Error ? err.message : String(err);
184
+ return { ok: false, status: 0, message: redactErrorMessage(message), code: err instanceof Error && err.name === "AbortError" ? "timeout" : "network_error" };
185
+ }
186
+ finally {
187
+ clearTimeout(timer);
188
+ }
189
+ }
190
+ function decodeBytes(bytes, encodings) {
191
+ const candidates = encodings.length > 0 ? encodings : ["utf-8"];
192
+ for (const encoding of candidates) {
193
+ try {
194
+ return new TextDecoder(encoding, { fatal: true }).decode(bytes);
195
+ }
196
+ catch {
197
+ // Try the next explicit candidate.
198
+ }
199
+ }
200
+ return new TextDecoder(candidates[candidates.length - 1] ?? "utf-8").decode(bytes);
201
+ }
117
202
  export async function proxyGet(path, params = {}, timeoutMs = DEFAULT_TIMEOUT_MS) {
118
203
  const proxyUrl = buildProxyUrl(path);
119
204
  if (!proxyUrl.ok)
@@ -134,6 +219,16 @@ export async function httpGetText(url, headers = {}, timeoutMs = DEFAULT_TIMEOUT
134
219
  },
135
220
  }, timeoutMs);
136
221
  }
222
+ export async function httpGetDecodedText(url, headers = {}, timeoutMs = DEFAULT_TIMEOUT_MS, encodings = ["utf-8"]) {
223
+ const result = await validatedFetchBytes(url, {
224
+ headers: {
225
+ "user-agent": BROWSER_UA,
226
+ "accept-language": "ko-KR,ko;q=0.9,en;q=0.8",
227
+ ...headers,
228
+ },
229
+ }, timeoutMs);
230
+ return result.ok ? { ok: true, data: decodeBytes(result.data, encodings) } : result;
231
+ }
137
232
  export async function httpGet(url, headers = {}, timeoutMs = DEFAULT_TIMEOUT_MS) {
138
233
  const result = await httpGetText(url, { accept: "application/json, */*", ...headers }, timeoutMs);
139
234
  if (!result.ok)
@@ -158,6 +253,6 @@ export async function httpPost(url, body, headers = {}, timeoutMs = DEFAULT_TIME
158
253
  return result.ok ? { ok: true, data: result.data } : result;
159
254
  }
160
255
  export function formatError(err) {
161
- return `[${err.code}] ${err.message}`;
256
+ return `[${err.code}] ${redactErrorMessage(err.message)}`;
162
257
  }
163
258
  //# sourceMappingURL=proxy-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"proxy-client.js","sourceRoot":"","sources":["../../src/korea/proxy-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proxy-client.js","sourceRoot":"","sources":["../../src/korea/proxy-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAE9D,MAAM,aAAa,GAAG,qCAAqC,CAAA;AAC3D,MAAM,kBAAkB,GAAG,KAAK,CAAA;AAChC,MAAM,aAAa,GAAG,CAAC,CAAA;AACvB,MAAM,UAAU,GAAG,iHAAiH,CAAA;AACpI,MAAM,QAAQ,GAAG,YAAY,CAAA;AAC7B,MAAM,sBAAsB,GAAG,gIAAgI,CAAA;AAC/J,MAAM,mBAAmB,GAAG,IAAI,MAAM,CAAC,iBAAiB,sBAAsB,wBAAwB,EAAE,IAAI,CAAC,CAAA;AAC7G,MAAM,aAAa,GAAG,0BAA0B,CAAA;AAEhD,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AACpF,CAAC;AAWD,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAA;AAC5F,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,UAAU,CAAC,2BAA2B,CAAC,CAAA;AAChD,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAA;AAC5F,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,OAAO,OAAO;SACX,OAAO,CAAC,mBAAmB,EAAE,CAAC,MAAM,EAAE,SAAiB,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,SAAS,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;SAC1G,OAAO,CAAC,aAAa,EAAE,WAAW,QAAQ,EAAE,CAAC,CAAA;AAClD,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAA;AAC/F,CAAC;AAED,SAAS,YAAY,CAAC,MAAc,EAAE,IAAiB;IACrD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;IACzD,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;QACpG,MAAM,IAAI,GAAgB,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;QACpD,OAAO,IAAI,CAAC,IAAI,CAAA;QAChB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,EAAE,CAAA;QACxB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;QAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClE,OAAO,eAAe,CAAC,8CAA8C,CAAC,CAAA;QACxE,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,eAAe,CAAC,qEAAqE,CAAC,CAAA;QAC/F,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,eAAe,CAAC,kDAAkD,CAAC,CAAA;QAC5E,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,CAAA;IAC7C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,IAAiB,EAAE,SAAiB,EAAE,UAAyC,EAAE;IAC9H,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;IAC7D,IAAI,UAAU,GAAG,GAAG,CAAA;IACpB,IAAI,WAAW,GAAG,IAAI,CAAA;IACtB,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,KAAK,KAAK,CAAA;IAEzD,IAAI,CAAC;QACH,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC;YAC9C,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAA;YACpG,IAAI,CAAC,UAAU,CAAC,EAAE;gBAAE,OAAO,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;YAE9D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;gBAClC,GAAG,WAAW;gBACd,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,QAAQ,EAAE,QAAQ;aACnB,CAAC,CAAA;YAEF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;gBAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAA;gBACvH,CAAC;gBACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;YACjC,CAAC;YAED,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;gBAC1B,CAAC;gBAAC,MAAM,CAAC;oBACP,8CAA8C;gBAChD,CAAC;gBACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,mDAAmD,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAA;YAC/J,CAAC;YAED,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;gBAC1B,CAAC;gBAAC,MAAM,CAAC;oBACP,8CAA8C;gBAChD,CAAC;gBACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,4CAA4C,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAA;YACtJ,CAAC;YAED,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YAC5C,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;YACD,IAAI,CAAC,QAAQ;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,qDAAqD,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAA;YAE1J,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAA;YACrD,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QACrD,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,4CAA4C,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAA;IAC7I,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,EAAE,CAAA;IAC9J,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,GAAW,EAAE,IAAiB,EAAE,SAAiB,EAAE,UAAyC,EAAE;IAC/H,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;IAC7D,IAAI,UAAU,GAAG,GAAG,CAAA;IACpB,IAAI,WAAW,GAAG,IAAI,CAAA;IACtB,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,KAAK,KAAK,CAAA;IAEzD,IAAI,CAAC;QACH,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC;YAC9C,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAA;YACpG,IAAI,CAAC,UAAU,CAAC,EAAE;gBAAE,OAAO,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;YAE9D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;gBAClC,GAAG,WAAW;gBACd,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,QAAQ,EAAE,QAAQ;aACnB,CAAC,CAAA;YAEF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;gBACrD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;oBACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAA;gBACzG,CAAC;gBACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;YAClC,CAAC;YAED,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;gBAC1B,CAAC;gBAAC,MAAM,CAAC;oBACP,8CAA8C;gBAChD,CAAC;gBACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,mDAAmD,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAA;YAC/J,CAAC;YAED,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;gBAC1B,CAAC;gBAAC,MAAM,CAAC;oBACP,8CAA8C;gBAChD,CAAC;gBACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,4CAA4C,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAA;YACtJ,CAAC;YAED,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YAC5C,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;YACD,IAAI,CAAC,QAAQ;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,qDAAqD,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAA;YAE1J,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAA;YACrD,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QACrD,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,4CAA4C,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAA;IAC7I,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,EAAE,CAAA;IAC9J,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAiB,EAAE,SAAmB;IACzD,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IAC/D,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACpF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAc,IAAY,EAAE,SAAiC,EAAE,EAAE,SAAS,GAAG,kBAAkB;IAC3H,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IACpC,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAA;IACjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAClC,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,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC3E,CAAC;IACD,OAAO,OAAO,CAAI,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,UAAkC,EAAE,EAAE,SAAS,GAAG,kBAAkB;IACjH,OAAO,kBAAkB,CAAC,GAAG,EAAE;QAC7B,OAAO,EAAE;YACP,YAAY,EAAE,UAAU;YACxB,iBAAiB,EAAE,yBAAyB;YAC5C,GAAG,OAAO;SACX;KACF,EAAE,SAAS,CAAC,CAAA;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,UAAkC,EAAE,EAAE,SAAS,GAAG,kBAAkB,EAAE,YAAsB,CAAC,OAAO,CAAC;IACzJ,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE;QAC5C,OAAO,EAAE;YACP,YAAY,EAAE,UAAU;YACxB,iBAAiB,EAAE,yBAAyB;YAC5C,GAAG,OAAO;SACX;KACF,EAAE,SAAS,CAAC,CAAA;IACb,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;AACrF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAc,GAAW,EAAE,UAAkC,EAAE,EAAE,SAAS,GAAG,kBAAkB;IAC1H,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,uBAAuB,EAAE,GAAG,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;IACjG,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAA;IAC7B,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAM,EAAE,CAAA;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,aAAa,EAAE,CAAA;IAC7F,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAc,GAAW,EAAE,IAAY,EAAE,UAAkC,EAAE,EAAE,SAAS,GAAG,kBAAkB;IACzI,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE;QAC3C,MAAM,EAAE,MAAM;QACd,IAAI;QACJ,OAAO,EAAE;YACP,YAAY,EAAE,UAAU;YACxB,iBAAiB,EAAE,yBAAyB;YAC5C,GAAG,OAAO;SACX;KACF,EAAE,SAAS,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAA;IACzC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAoB,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;AAC7E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAA;AAC3D,CAAC"}
@@ -25,6 +25,12 @@ export type RestroomResult = {
25
25
  radius_km: number;
26
26
  total: number;
27
27
  items: NearbyRestroom[];
28
+ warning?: string;
29
+ data_error?: {
30
+ code: string;
31
+ status: number;
32
+ message: string;
33
+ };
28
34
  };
29
35
  export type NearbyRestroom = RestroomRow & {
30
36
  distance_m: number;
@@ -37,8 +43,5 @@ export declare function runPublicRestroom(options: {
37
43
  radiusKm?: number;
38
44
  limit?: number;
39
45
  timeoutMs?: number;
40
- }): Promise<RestroomResult | {
41
- ok: false;
42
- message: string;
43
- }>;
46
+ }): Promise<RestroomResult>;
44
47
  export declare function renderPublicRestroom(result: RestroomResult): string;