smart-web-mcp 0.36.0 → 0.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -8,6 +8,8 @@ The format is based on Keep a Changelog[^1] and this project uses SemVer.
8
8
 
9
9
  ### Added
10
10
 
11
+ - Added `kr_aliexpress`, a no-secret MCP product search tool that scrapes AliExpress public search pages for product candidates, current storefront prices, images, and links with delivery/coupon/customs caveats.
12
+ - `kr_place_search` now provides Korean map-style local recommendations by merging Kakao Local, Google Places, and Naver Local candidates with distance/rating/review-count ranking for 맛집, 카페, 산책, and dog-walk use cases.
11
13
  - Removed hosted API-key provider lanes (Firecrawl, Exa, Tavily, Browserless) from the smart-web runtime/benchmark surface so the default product remains no-secret/local-first.
12
14
  - `smartfetch` now accepts an MCP `output_budget` preset (`compact`, `balanced`, or `full`) and `fetch.outputBudget.preset` settings, so token-sensitive hosts can request smaller structured payloads without hand-tuning every numeric cap.
13
15
  - Added MCP host-profile guidance for Hermes/Raon, Codex, OpenCode, and Claude Code, including budget-control precedence and compact/balanced/full follow-up retrieval guidance.
@@ -158,6 +160,20 @@ The format is based on Keep a Changelog[^1] and this project uses SemVer.
158
160
  - Korean public API helpers now validate outbound URLs and redirects before fetching, blocking localhost, private, and reserved targets unless `network.allowPrivateHosts` is explicitly enabled.
159
161
  - 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.
160
162
 
163
+ ## [0.38.0](https://github.com/jojo-labs/smart-web/compare/v0.37.0...v0.38.0) (2026-07-03)
164
+
165
+
166
+ ### Features
167
+
168
+ * add AliExpress shopping tool ([#404](https://github.com/jojo-labs/smart-web/issues/404)) ([7909682](https://github.com/jojo-labs/smart-web/commit/79096824b62145a99a4a04887e4c1b47fd885e83))
169
+
170
+ ## [0.37.0](https://github.com/jojo-labs/smart-web/compare/v0.36.0...v0.37.0) (2026-06-27)
171
+
172
+
173
+ ### Features
174
+
175
+ * add Korean place search MCP tool ([#401](https://github.com/jojo-labs/smart-web/issues/401)) ([6c8e3ec](https://github.com/jojo-labs/smart-web/commit/6c8e3ec8f9152a0146313efa3e5079456e785bbf))
176
+
161
177
  ## [0.36.0](https://github.com/jojo-labs/smart-web/compare/v0.35.1...v0.36.0) (2026-06-25)
162
178
 
163
179
 
@@ -0,0 +1,43 @@
1
+ /**
2
+ * AliExpress product keyword search using the public no-secret storefront HTML.
3
+ *
4
+ * This complements smartfetch URL support for AliExpress item/search pages with a
5
+ * first-class MCP search tool for shopping workflows. It does not use affiliate
6
+ * links or credentials; prices are best-effort public storefront text.
7
+ */
8
+ import { type SearchResult } from "../shared.js";
9
+ export type AliExpressItem = {
10
+ title: string;
11
+ price_text?: string;
12
+ url: string;
13
+ image_url?: string;
14
+ rating?: string;
15
+ sold_count?: string;
16
+ source: "aliexpress_html" | "search_fallback";
17
+ };
18
+ export type AliExpressResult = {
19
+ source: "aliexpress";
20
+ query: string;
21
+ locale: "ko" | "en";
22
+ currency: "KRW" | "USD";
23
+ ship_to: string;
24
+ search_url: string;
25
+ items: AliExpressItem[];
26
+ warnings: string[];
27
+ note: string;
28
+ };
29
+ export declare function parseAliExpressSearchHtml(html: string, baseUrl: string, limit?: number): AliExpressItem[];
30
+ export declare function aliExpressItemsFromSearchResults(results: SearchResult[], baseUrl: string, limit?: number): AliExpressItem[];
31
+ export declare function runAliExpress(options: {
32
+ query: string;
33
+ limit?: number;
34
+ locale?: "ko" | "en";
35
+ currency?: "KRW" | "USD";
36
+ shipTo?: string;
37
+ timeoutMs?: number;
38
+ searchFallback?: (query: string, locale: "ko" | "en", limit: number, timeoutMs: number) => Promise<SearchResult[]>;
39
+ }): Promise<AliExpressResult | {
40
+ ok: false;
41
+ message: string;
42
+ }>;
43
+ export declare function renderAliExpress(result: AliExpressResult): string;
@@ -0,0 +1,254 @@
1
+ /**
2
+ * AliExpress product keyword search using the public no-secret storefront HTML.
3
+ *
4
+ * This complements smartfetch URL support for AliExpress item/search pages with a
5
+ * first-class MCP search tool for shopping workflows. It does not use affiliate
6
+ * links or credentials; prices are best-effort public storefront text.
7
+ */
8
+ import { absolutizeUrl, decodeHtml, stripTags } from "../shared.js";
9
+ import { runSmartsearch } from "../smartsearch.js";
10
+ import { httpGetDecodedText } from "./proxy-client.js";
11
+ function normalizeSpace(value) {
12
+ return String(value || "").replace(/\s+/g, " ").trim();
13
+ }
14
+ function cleanTitle(value) {
15
+ return normalizeSpace(decodeHtml(value))
16
+ .replace(/^[-–—:\s]+/, "")
17
+ .replace(/\s*\|\s*AliExpress.*$/i, "");
18
+ }
19
+ function slugifyQuery(query) {
20
+ return encodeURIComponent(normalizeSpace(query).toLowerCase().replace(/\s+/g, "-"));
21
+ }
22
+ function canonicalAliExpressUrl(url, baseUrl) {
23
+ const absolute = absolutizeUrl(url, baseUrl);
24
+ try {
25
+ const parsed = new URL(absolute);
26
+ const match = parsed.pathname.match(/^(\/item\/\d+\.html)/i);
27
+ if (match?.[1])
28
+ return `${parsed.origin}${match[1]}`;
29
+ return `${parsed.origin}${parsed.pathname}`;
30
+ }
31
+ catch {
32
+ return absolute;
33
+ }
34
+ }
35
+ function aliExpressSearchUrl(query, locale) {
36
+ const host = locale === "ko" ? "ko.aliexpress.com" : "www.aliexpress.com";
37
+ return `https://${host}/w/wholesale-${slugifyQuery(query)}.html`;
38
+ }
39
+ function attrValues(html, name) {
40
+ const values = [];
41
+ const pattern = new RegExp(`${name}=(?:"([^"]*)"|'([^']*)')`, "gi");
42
+ for (const match of html.matchAll(pattern)) {
43
+ const value = normalizeSpace(decodeHtml(String(match[1] || match[2] || "")));
44
+ if (value)
45
+ values.push(value);
46
+ }
47
+ return values;
48
+ }
49
+ function firstPrice(value) {
50
+ const normalized = normalizeSpace(value);
51
+ const patterns = [
52
+ /(₩\s?[0-9][0-9,]*(?:\.[0-9]{1,2})?)/,
53
+ /(KRW\s?[0-9][0-9,]*(?:\.[0-9]{1,2})?)/i,
54
+ /(US\s?\$\s?[0-9][0-9,.]*)/i,
55
+ /(\$\s?[0-9][0-9,.]*)/,
56
+ ];
57
+ for (const pattern of patterns) {
58
+ const match = normalized.match(pattern);
59
+ if (match?.[1])
60
+ return normalizeSpace(match[1]);
61
+ }
62
+ return "";
63
+ }
64
+ function firstRating(value) {
65
+ const match = normalizeSpace(value).match(/([0-9](?:\.[0-9])?)\s*(?:\/\s*5|점|stars?)/i);
66
+ return match?.[1];
67
+ }
68
+ function firstSoldCount(value) {
69
+ const match = normalizeSpace(value).match(/([0-9][0-9,.]*(?:만|천|k|m)?\+?)\s*(?:개\s*)?(?:판매|sold)/i);
70
+ return match?.[1];
71
+ }
72
+ function blockedAliExpressShell(html) {
73
+ const text = normalizeSpace(stripTags(html).slice(0, 3000)).toLowerCase();
74
+ return /_____tmd_____\/punish|x5secdata|punish\?|captcha|verify|robot|unusual traffic/i.test(html) || /captcha|robot|unusual traffic|verify/.test(text);
75
+ }
76
+ function noisyTitle(value) {
77
+ const normalized = normalizeSpace(value).toLowerCase();
78
+ if (!normalized || normalized.length < 4)
79
+ return true;
80
+ if (firstPrice(normalized))
81
+ return true;
82
+ return /^(aliexpress|shop now|buy now|add to cart|장바구니|구매|바로가기|무료 배송|free shipping)$/i.test(normalized);
83
+ }
84
+ function bestTitle(texts) {
85
+ const candidates = Array.from(new Set(texts
86
+ .map(cleanTitle)
87
+ .flatMap((text) => {
88
+ const price = firstPrice(text);
89
+ return price ? [text.slice(0, text.indexOf(price)), text] : [text];
90
+ })
91
+ .map(cleanTitle)
92
+ .filter((text) => !noisyTitle(text))))
93
+ .sort((a, b) => b.length - a.length);
94
+ return candidates[0] || "";
95
+ }
96
+ function productAccumulators(html, baseUrl) {
97
+ const map = new Map();
98
+ const anchorPattern = /<a\b[^>]*href=(?:"([^"]+)"|'([^']+)'|([^\s>]+))[^>]*>([\s\S]*?)<\/a>/gi;
99
+ for (const match of html.matchAll(anchorPattern)) {
100
+ const href = String(match[1] || match[2] || match[3] || "");
101
+ const url = canonicalAliExpressUrl(href, baseUrl);
102
+ if (!/\/item\/\d+\.html$/i.test(url))
103
+ continue;
104
+ const inner = String(match[4] || "");
105
+ const start = Math.max(0, Number(match.index || 0) - 240);
106
+ const end = Math.min(html.length, Number(match.index || 0) + String(match[0] || "").length + 320);
107
+ const window = html.slice(start, end);
108
+ const existing = map.get(url) || { url, texts: [], snippets: [], images: [] };
109
+ existing.texts.push(stripTags(inner));
110
+ existing.texts.push(...attrValues(inner, "alt"));
111
+ existing.snippets.push(stripTags(window));
112
+ existing.images.push(...attrValues(inner, "src").map((src) => absolutizeUrl(src, baseUrl)).filter(Boolean));
113
+ map.set(url, existing);
114
+ }
115
+ return Array.from(map.values());
116
+ }
117
+ export function parseAliExpressSearchHtml(html, baseUrl, limit = 10) {
118
+ const items = [];
119
+ for (const entry of productAccumulators(html, baseUrl)) {
120
+ const title = bestTitle(entry.texts) || bestTitle(entry.snippets);
121
+ if (!title)
122
+ continue;
123
+ const joined = normalizeSpace(entry.texts.join(" "));
124
+ const price = firstPrice(joined);
125
+ const rating = firstRating(joined);
126
+ const soldCount = firstSoldCount(joined);
127
+ const image = entry.images.find((url) => /alicdn|aliexpress-media/i.test(url));
128
+ items.push({
129
+ title,
130
+ url: entry.url,
131
+ ...(price ? { price_text: price } : {}),
132
+ ...(image ? { image_url: image } : {}),
133
+ ...(rating ? { rating } : {}),
134
+ ...(soldCount ? { sold_count: soldCount } : {}),
135
+ source: "aliexpress_html",
136
+ });
137
+ }
138
+ const seen = new Set();
139
+ return items.filter((item) => {
140
+ if (seen.has(item.url))
141
+ return false;
142
+ seen.add(item.url);
143
+ return true;
144
+ }).slice(0, limit);
145
+ }
146
+ export function aliExpressItemsFromSearchResults(results, baseUrl, limit = 10) {
147
+ const items = results.map((result) => {
148
+ const url = canonicalAliExpressUrl(result.url, baseUrl);
149
+ if (!/\/item\/\d+\.html$/i.test(url))
150
+ return null;
151
+ const rawTitle = cleanTitle(result.title
152
+ .replace(/\s*[-|]\s*AliExpress.*$/i, "")
153
+ .replace(/^[0-9][0-9,.]*\s*US\s?\$\s*[0-9][0-9,.]*\s*(?:%\s*OFF\|?|[0-9]+%\s*OFF\|?)?/i, "")
154
+ .replace(/^US\s?\$\s*[0-9][0-9,.]*\s*/i, "")
155
+ .replace(/^%\s*OFF\|?/i, "")
156
+ .replace(/^[0-9]+%\s*OFF\|/i, ""));
157
+ const title = rawTitle || cleanTitle(result.snippet);
158
+ if (!title || noisyTitle(title))
159
+ return null;
160
+ const price = firstPrice(`${result.title} ${result.snippet}`);
161
+ return {
162
+ title,
163
+ url,
164
+ ...(price ? { price_text: price } : {}),
165
+ source: "search_fallback",
166
+ };
167
+ }).filter((item) => Boolean(item));
168
+ const seen = new Set();
169
+ return items.filter((item) => {
170
+ if (seen.has(item.url))
171
+ return false;
172
+ seen.add(item.url);
173
+ return true;
174
+ }).slice(0, limit);
175
+ }
176
+ async function defaultAliExpressSearchFallback(query, locale, limit, timeoutMs) {
177
+ const host = locale === "ko" ? "ko.aliexpress.com" : "www.aliexpress.com";
178
+ const search = await runSmartsearch({ query: `site:${host}/item ${query}`, numResults: Math.min(Math.max(limit, 3), 10), timeoutMs: Math.min(timeoutMs, 12000), searchType: "fast" });
179
+ return search.results || [];
180
+ }
181
+ export async function runAliExpress(options) {
182
+ const { query, limit = 10, locale = "ko", currency = locale === "ko" ? "KRW" : "USD", shipTo = locale === "ko" ? "KR" : "US", timeoutMs = 20000, searchFallback = defaultAliExpressSearchFallback } = options;
183
+ const normalizedQuery = normalizeSpace(query);
184
+ if (normalizedQuery.length < 2)
185
+ return { ok: false, message: "검색어는 2글자 이상이어야 합니다." };
186
+ const searchUrl = aliExpressSearchUrl(normalizedQuery, locale);
187
+ const result = await httpGetDecodedText(searchUrl, {
188
+ accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
189
+ }, timeoutMs);
190
+ if (!result.ok)
191
+ return { ok: false, message: `AliExpress search failed: ${result.message}` };
192
+ const warnings = [];
193
+ let items = parseAliExpressSearchHtml(result.data, searchUrl, Math.min(limit, 30));
194
+ const blockedShell = blockedAliExpressShell(result.data);
195
+ if (items.length === 0) {
196
+ if (blockedShell)
197
+ warnings.push("AliExpress가 공개 검색 HTML 대신 봇/검증 셸을 반환해 smartsearch fallback 결과를 사용했습니다.");
198
+ try {
199
+ const fallbackResults = await searchFallback(normalizedQuery, locale, Math.min(limit, 30), timeoutMs);
200
+ items = aliExpressItemsFromSearchResults(fallbackResults, searchUrl, Math.min(limit, 30));
201
+ if (items.length > 0 && warnings.length === 0)
202
+ warnings.push("AliExpress 공개 검색 HTML에서 상품 카드를 추출하지 못해 smartsearch fallback 결과를 사용했습니다.");
203
+ }
204
+ catch (error) {
205
+ const message = error instanceof Error ? error.message : String(error);
206
+ warnings.push(`smartsearch fallback failed: ${message}`);
207
+ }
208
+ }
209
+ return {
210
+ source: "aliexpress",
211
+ query: normalizedQuery,
212
+ locale,
213
+ currency,
214
+ ship_to: shipTo,
215
+ search_url: searchUrl,
216
+ items,
217
+ warnings,
218
+ note: "AliExpress 공개 검색 페이지 기준입니다. 가격·배송비·쿠폰·통관·환율·재고는 실시간으로 달라질 수 있습니다.",
219
+ };
220
+ }
221
+ export function renderAliExpress(result) {
222
+ const lines = [
223
+ `# AliExpress — "${result.query}"`,
224
+ `지역/통화: ${result.ship_to}/${result.currency} | 공개 검색 페이지 기준`,
225
+ "",
226
+ ];
227
+ if (result.items.length === 0) {
228
+ lines.push("검색 결과를 추출하지 못했습니다. AliExpress가 지역/봇 차단 화면을 반환했을 수 있습니다.");
229
+ lines.push(`[검색 페이지](${result.search_url})`);
230
+ lines.push("");
231
+ for (const warning of result.warnings)
232
+ lines.push(`_주의: ${warning}_`);
233
+ if (result.warnings.length > 0)
234
+ lines.push("");
235
+ lines.push(`_${result.note}_`);
236
+ return lines.join("\n");
237
+ }
238
+ for (const warning of result.warnings)
239
+ lines.push(`_주의: ${warning}_`);
240
+ if (result.warnings.length > 0)
241
+ lines.push("");
242
+ for (const [index, item] of result.items.entries()) {
243
+ lines.push(`${index + 1}. **${item.title}**${item.price_text ? ` — ${item.price_text}` : ""}`);
244
+ if (item.rating)
245
+ lines.push(` - 평점: ${item.rating}`);
246
+ if (item.sold_count)
247
+ lines.push(` - 판매: ${item.sold_count}`);
248
+ lines.push(` - [보러가기](${item.url})`);
249
+ lines.push("");
250
+ }
251
+ lines.push(`_${result.note}_`);
252
+ return lines.join("\n");
253
+ }
254
+ //# sourceMappingURL=aliexpress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aliexpress.js","sourceRoot":"","sources":["../../src/korea/aliexpress.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ export { runAliExpress, renderAliExpress } from "./aliexpress.js";
1
2
  export { runGeeknews, renderGeeknews } from "./geeknews.js";
2
3
  export { runSubway, renderSubway } from "./subway.js";
3
4
  export { runWeather, renderWeather } from "./weather.js";
@@ -13,4 +14,5 @@ export { runCoupang, renderCoupang } from "./coupang.js";
13
14
  export { runSpellCheck, renderSpellCheck } from "./spellcheck.js";
14
15
  export { runZipcode, renderZipcode } from "./zipcode.js";
15
16
  export { runLaw, renderLaw } from "./law.js";
17
+ export { runPlaceSearch, renderPlaceSearch } from "./place-search.js";
16
18
  export { runPublicRestroom, renderPublicRestroom } from "./public-restroom.js";
@@ -1,3 +1,4 @@
1
+ export { runAliExpress, renderAliExpress } from "./aliexpress.js";
1
2
  export { runGeeknews, renderGeeknews } from "./geeknews.js";
2
3
  export { runSubway, renderSubway } from "./subway.js";
3
4
  export { runWeather, renderWeather } from "./weather.js";
@@ -13,5 +14,6 @@ export { runCoupang, renderCoupang } from "./coupang.js";
13
14
  export { runSpellCheck, renderSpellCheck } from "./spellcheck.js";
14
15
  export { runZipcode, renderZipcode } from "./zipcode.js";
15
16
  export { runLaw, renderLaw } from "./law.js";
17
+ export { runPlaceSearch, renderPlaceSearch } from "./place-search.js";
16
18
  export { runPublicRestroom, renderPublicRestroom } from "./public-restroom.js";
17
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/korea/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC3E,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/korea/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC3E,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,67 @@
1
+ export type PlaceIntent = "auto" | "food" | "cafe" | "walk" | "dog_walk" | "errand" | "date" | "work";
2
+ export type PlaceSort = "blended" | "relevance" | "distance" | "rating" | "review_count";
3
+ export type PlaceProvider = "kakao" | "google" | "naver";
4
+ export type PlaceSearchOptions = {
5
+ query?: string;
6
+ location?: string;
7
+ lat?: number;
8
+ lon?: number;
9
+ radiusM?: number;
10
+ limit?: number;
11
+ intent?: PlaceIntent;
12
+ sort?: PlaceSort;
13
+ providers?: PlaceProvider[];
14
+ timeoutMs?: number;
15
+ };
16
+ export type PlaceSearchAnchor = {
17
+ label: string;
18
+ lat: number;
19
+ lon: number;
20
+ provider: "input" | "kakao" | "google";
21
+ };
22
+ export type ProviderError = {
23
+ provider: PlaceProvider | "anchor";
24
+ code: string;
25
+ status: number;
26
+ message: string;
27
+ };
28
+ export type PlaceItem = {
29
+ name: string;
30
+ category?: string;
31
+ address?: string;
32
+ road_address?: string;
33
+ lat?: number;
34
+ lon?: number;
35
+ distance_m?: number;
36
+ phone?: string;
37
+ rating?: number;
38
+ review_count?: number;
39
+ blog_review_count?: number;
40
+ open_now?: boolean;
41
+ business_status?: string;
42
+ google_place_id?: string;
43
+ kakao_place_id?: string;
44
+ naver_mapx?: string;
45
+ naver_mapy?: string;
46
+ links: Partial<Record<PlaceProvider, string>>;
47
+ providers: PlaceProvider[];
48
+ score: number;
49
+ score_reasons: string[];
50
+ };
51
+ export type PlaceSearchResult = {
52
+ source: "kr-place-search";
53
+ query: string;
54
+ intent: PlaceIntent;
55
+ sort: PlaceSort;
56
+ location_hint?: string;
57
+ anchor?: PlaceSearchAnchor;
58
+ radius_m: number;
59
+ providers_requested: PlaceProvider[];
60
+ providers_used: PlaceProvider[];
61
+ provider_errors: ProviderError[];
62
+ total: number;
63
+ items: PlaceItem[];
64
+ warning?: string;
65
+ };
66
+ export declare function runPlaceSearch(options: PlaceSearchOptions): Promise<PlaceSearchResult>;
67
+ export declare function renderPlaceSearch(result: PlaceSearchResult): string;