@sharleysoft/openclaw-yandex-maps-places-review 0.1.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 (64) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +237 -0
  3. package/dist/Application/Dependencies/clock.d.ts +3 -0
  4. package/dist/Application/Dependencies/clock.js +2 -0
  5. package/dist/Application/Dependencies/clock.js.map +1 -0
  6. package/dist/Application/Dependencies/logger.d.ts +8 -0
  7. package/dist/Application/Dependencies/logger.js +2 -0
  8. package/dist/Application/Dependencies/logger.js.map +1 -0
  9. package/dist/Application/Dependencies/yandex-maps-review-collector.d.ts +6 -0
  10. package/dist/Application/Dependencies/yandex-maps-review-collector.js +2 -0
  11. package/dist/Application/Dependencies/yandex-maps-review-collector.js.map +1 -0
  12. package/dist/Application/Dtos/yandex-maps-place-reviews.dto.d.ts +33 -0
  13. package/dist/Application/Dtos/yandex-maps-place-reviews.dto.js +4 -0
  14. package/dist/Application/Dtos/yandex-maps-place-reviews.dto.js.map +1 -0
  15. package/dist/Application/Normalization/normalize-yandex-maps-place-reviews-input.d.ts +2 -0
  16. package/dist/Application/Normalization/normalize-yandex-maps-place-reviews-input.js +81 -0
  17. package/dist/Application/Normalization/normalize-yandex-maps-place-reviews-input.js.map +1 -0
  18. package/dist/Application/ToolCallHandlers/get-yandex-maps-place-reviews-tool-call-handler.d.ts +13 -0
  19. package/dist/Application/ToolCallHandlers/get-yandex-maps-place-reviews-tool-call-handler.js +24 -0
  20. package/dist/Application/ToolCallHandlers/get-yandex-maps-place-reviews-tool-call-handler.js.map +1 -0
  21. package/dist/Cli/setup-playwright-command.d.ts +7 -0
  22. package/dist/Cli/setup-playwright-command.js +66 -0
  23. package/dist/Cli/setup-playwright-command.js.map +1 -0
  24. package/dist/Cli/setup-playwright.d.ts +2 -0
  25. package/dist/Cli/setup-playwright.js +4 -0
  26. package/dist/Cli/setup-playwright.js.map +1 -0
  27. package/dist/Composition/create-tool-call-handlers.d.ts +8 -0
  28. package/dist/Composition/create-tool-call-handlers.js +22 -0
  29. package/dist/Composition/create-tool-call-handlers.js.map +1 -0
  30. package/dist/Infrastructure/Clock/system-clock.d.ts +4 -0
  31. package/dist/Infrastructure/Clock/system-clock.js +6 -0
  32. package/dist/Infrastructure/Clock/system-clock.js.map +1 -0
  33. package/dist/Infrastructure/Logging/pino-app-logger.d.ts +12 -0
  34. package/dist/Infrastructure/Logging/pino-app-logger.js +39 -0
  35. package/dist/Infrastructure/Logging/pino-app-logger.js.map +1 -0
  36. package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-collector.d.ts +26 -0
  37. package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-collector.js +196 -0
  38. package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-collector.js.map +1 -0
  39. package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-contracts.d.ts +24 -0
  40. package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-contracts.js +2 -0
  41. package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-contracts.js.map +1 -0
  42. package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-navigator.d.ts +20 -0
  43. package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-navigator.js +306 -0
  44. package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-navigator.js.map +1 -0
  45. package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-parser.d.ts +8 -0
  46. package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-parser.js +93 -0
  47. package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-parser.js.map +1 -0
  48. package/dist/Infrastructure/YandexMaps/yandex-maps-review-dom.d.ts +7 -0
  49. package/dist/Infrastructure/YandexMaps/yandex-maps-review-dom.js +18 -0
  50. package/dist/Infrastructure/YandexMaps/yandex-maps-review-dom.js.map +1 -0
  51. package/dist/Schemas/yandex-maps-place-reviews-config.schema.d.ts +5 -0
  52. package/dist/Schemas/yandex-maps-place-reviews-config.schema.js +12 -0
  53. package/dist/Schemas/yandex-maps-place-reviews-config.schema.js.map +1 -0
  54. package/dist/Schemas/yandex-maps-place-reviews-parameters.schema.d.ts +5 -0
  55. package/dist/Schemas/yandex-maps-place-reviews-parameters.schema.js +13 -0
  56. package/dist/Schemas/yandex-maps-place-reviews-parameters.schema.js.map +1 -0
  57. package/dist/Tools/yandex-maps-place-reviews.tool.d.ts +7 -0
  58. package/dist/Tools/yandex-maps-place-reviews.tool.js +23 -0
  59. package/dist/Tools/yandex-maps-place-reviews.tool.js.map +1 -0
  60. package/dist/index.d.ts +2 -0
  61. package/dist/index.js +11 -0
  62. package/dist/index.js.map +1 -0
  63. package/openclaw.plugin.json +44 -0
  64. package/package.json +83 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OpenClaw Yandex Maps Places Review contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,237 @@
1
+ # OpenClaw Yandex Maps Places Review
2
+
3
+ Tool-плагин для OpenClaw, который собирает последние публичные отзывы заведения на Яндекс Картах через Playwright.
4
+
5
+ Плагин не использует API Яндекса. Он открывает публичную страницу заведения в браузере, переходит на страницу отзывов, пытается отсортировать отзывы по новизне и возвращает найденные отзывы в JSON.
6
+
7
+ ## Возможности
8
+
9
+ - Tool `yandex_maps_place_reviews`.
10
+ - Принимает ссылку на заведение в Яндекс Картах.
11
+ - Возвращает последние `N` отзывов, по умолчанию `100`.
12
+ - Если отзывов меньше запрошенного количества или Яндекс перестал догружать список, возвращает доступные отзывы и warning.
13
+ - Для каждого отзыва возвращает `url`, если ссылку удалось извлечь, `date` и `text`.
14
+ - Поддерживает уровни логирования через config плагина.
15
+ - Есть обычные тесты, live-тест и headed live-тест с видимым браузером.
16
+
17
+ ## Требования
18
+
19
+ - Node.js `22.19+`; рекомендуется Node.js `24`.
20
+ - npm.
21
+ - OpenClaw `2026.6.11+` для установки плагина.
22
+ - Playwright Chromium.
23
+
24
+ Проверьте версию Node:
25
+
26
+ ```powershell
27
+ node --version
28
+ ```
29
+
30
+ Если нужен portable Node на Windows, скачайте архив Node.js 24 с https://nodejs.org/dist/latest-v24.x/, распакуйте его в удобную директорию и добавьте эту директорию в `PATH` текущей сессии:
31
+
32
+ ```powershell
33
+ $env:PATH="D:\Tools\node-v24.x.x-win-x64;$env:PATH"
34
+ node --version
35
+ npm --version
36
+ ```
37
+
38
+ После этого все команды ниже можно выполнять как обычные `npm` / `npx`.
39
+
40
+ ## Установка в OpenClaw
41
+
42
+ На Ubuntu установите плагин, Chromium и необходимые системные библиотеки:
43
+
44
+ ```bash
45
+ openclaw plugins install npm:@sharleysoft/openclaw-yandex-maps-places-review
46
+ npx --yes @sharleysoft/openclaw-yandex-maps-places-review@latest setup --with-deps
47
+ openclaw plugins enable yandex-maps-places-review
48
+ openclaw plugins inspect yandex-maps-places-review --runtime --json
49
+ ```
50
+
51
+ Setup-команду нужно запускать от того же Unix-пользователя, под которым работает OpenClaw Gateway: Playwright хранит Chromium в пользовательском cache. Флаг `--with-deps` устанавливает системные Linux-пакеты и может запросить `sudo`.
52
+
53
+ На Windows и macOS системные Linux-пакеты не нужны:
54
+
55
+ ```powershell
56
+ openclaw plugins install npm:@sharleysoft/openclaw-yandex-maps-places-review
57
+ npx --yes @sharleysoft/openclaw-yandex-maps-places-review@latest setup
58
+ openclaw plugins enable yandex-maps-places-review
59
+ openclaw plugins inspect yandex-maps-places-review --runtime --json
60
+ ```
61
+
62
+ Если Gateway не перезапустился автоматически, выполните:
63
+
64
+ ```bash
65
+ openclaw gateway restart
66
+ ```
67
+
68
+ Обновление плагина:
69
+
70
+ ```bash
71
+ openclaw plugins update yandex-maps-places-review
72
+ npx --yes @sharleysoft/openclaw-yandex-maps-places-review@latest setup --with-deps
73
+ openclaw plugins inspect yandex-maps-places-review --runtime --json
74
+ ```
75
+
76
+ После обновления setup-команда повторно проверяет и устанавливает Chromium, требуемый новой версией Playwright. На Windows и macOS используйте её без `--with-deps`.
77
+
78
+ ## Локальная разработка
79
+
80
+ ### Установка зависимостей
81
+
82
+ ```powershell
83
+ npm install
84
+ npx cross-env PLAYWRIGHT_BROWSERS_PATH=0 playwright install chromium
85
+ ```
86
+
87
+ ### Сборка и проверки
88
+
89
+ ```powershell
90
+ npm run build
91
+ npm run test:unit
92
+ npm run test:live
93
+ npm test
94
+ npm run plugin:build
95
+ npm run plugin:validate
96
+ ```
97
+
98
+ Полная локальная проверка:
99
+
100
+ ```powershell
101
+ npm run verify
102
+ ```
103
+
104
+ ## Использование tool
105
+
106
+ Имя tool:
107
+
108
+ ```text
109
+ yandex_maps_place_reviews
110
+ ```
111
+
112
+ Параметры:
113
+
114
+ - `url` - ссылка на заведение в Яндекс Картах.
115
+ - `count` - необязательное количество последних отзывов, по умолчанию `100`, минимум `1`, максимум `500`.
116
+
117
+ Поддерживаются как канонические ссылки вида `https://yandex.ru/maps/org/...`, так и share/POI-ссылки вида `https://yandex.com/maps/213/moscow/?mode=poi&poi%5Buri%5D=ymapsbm1%3A%2F%2Forg%3Foid%3D...&tab=reviews`.
118
+
119
+ Config плагина:
120
+
121
+ - `logLevel` - необязательный уровень логирования: `silent`, `error`, `warn`, `info`, `debug`.
122
+
123
+ Формат результата:
124
+
125
+ ```json
126
+ {
127
+ "sourceUrl": "https://yandex.ru/maps/org/example/123/reviews/",
128
+ "requestedCount": 100,
129
+ "fetchedAt": "2026-07-07T00:00:00.000Z",
130
+ "reviews": [
131
+ {
132
+ "url": "https://yandex.ru/maps/org/example/123/reviews/abc",
133
+ "date": "2026-07-06T12:00:00.000Z",
134
+ "text": "Текст отзыва"
135
+ }
136
+ ],
137
+ "stats": {
138
+ "attempts": 1,
139
+ "captchaReloads": 0,
140
+ "scrolls": 1,
141
+ "duplicatesSkipped": 0,
142
+ "logLevel": "info"
143
+ },
144
+ "warnings": []
145
+ }
146
+ ```
147
+
148
+ ## Посмотреть output вручную
149
+
150
+ Headless-режим:
151
+
152
+ ```powershell
153
+ $env:LOG_LEVEL='silent'
154
+ npm run run:tool -- "https://yandex.ru/maps/org/tri_vokzala_depo/168713437054/" 100
155
+ ```
156
+
157
+ Видимый браузер:
158
+
159
+ ```powershell
160
+ $env:HEADED='1'
161
+ $env:LOG_LEVEL='silent'
162
+ npm run run:tool -- "https://yandex.ru/maps/org/tri_vokzala_depo/168713437054/" 100
163
+ ```
164
+
165
+ ## Live-тесты
166
+
167
+ Headless live-тест:
168
+
169
+ ```powershell
170
+ $env:YANDEX_MAPS_PLACE_URL="https://yandex.ru/maps/org/tri_vokzala_depo/168713437054/"
171
+ $env:YANDEX_MAPS_REVIEW_COUNT="100"
172
+ npm run test:live
173
+ ```
174
+
175
+ Live-тест с видимым браузером:
176
+
177
+ ```powershell
178
+ $env:YANDEX_MAPS_PLACE_URL="https://yandex.ru/maps/org/tri_vokzala_depo/168713437054/"
179
+ $env:YANDEX_MAPS_REVIEW_COUNT="100"
180
+ npm run test:headed
181
+ ```
182
+
183
+ После успешной проверки команда сохраняет полный JSON-результат в `artifacts/yandex-maps-reviews.headed.json`. Путь можно переопределить:
184
+
185
+ ```powershell
186
+ $env:YANDEX_MAPS_OUTPUT_FILE="artifacts/my-place-reviews.json"
187
+ npm run test:headed
188
+ ```
189
+
190
+ `npm test` запускает стабильные unit/component-тесты без обращения к Яндекс Картам. Live-проверка запускается отдельно через `npm run test:live` и запрашивает минимум 60 отзывов. `YANDEX_MAPS_PLACE_URL` и `YANDEX_MAPS_REVIEW_COUNT` позволяют переопределить страницу и количество; count для live-теста должен быть от 60 до 500. Недоступность сети, CAPTCHA или изменение DOM приводят к падению live-теста.
191
+
192
+ Live-тест является обязательным release gate: workflow не публикует npm-пакет и не создаёт GitHub Release, пока тест не завершится успешно.
193
+
194
+ ## Выпуск новой версии
195
+
196
+ Release workflow запускается тегом, который должен точно совпадать с версией package и manifest:
197
+
198
+ ```bash
199
+ npm version patch --no-git-tag-version
200
+ # Обновите version в openclaw.plugin.json тем же значением.
201
+ npm run verify
202
+ git add package.json package-lock.json openclaw.plugin.json
203
+ git commit -m "release: v0.1.1"
204
+ git tag v0.1.1
205
+ git push origin master --tags
206
+ ```
207
+
208
+ Workflow на `ubuntu-latest` устанавливает Chromium, выполняет unit/component- и обязательный live-тест, валидирует manifest, устанавливает собранный `.tgz` через `npm-pack:`, публикует этот же проверенный архив в npm и только после этого создаёт GitHub Release.
209
+
210
+ Для самого первого выпуска, пока npm-пакет ещё не существует, Trusted Publisher настроить нельзя. Создайте временный granular npm token с разрешением publish и bypass 2FA, сохраните его как secret `NPM_TOKEN` в GitHub environment `npm` и создайте тег `v0.1.0`. После успешного workflow:
211
+
212
+ 1. Настройте для npm-пакета Trusted Publisher: GitHub repository `PavelRubis/OpenClawYandexMapsPlacesReview`, workflow `release.yml`, environment `npm`, permission `npm publish`.
213
+ 2. Удалите secret `NPM_TOKEN`.
214
+ 3. В настройках npm запретите обычную token-based публикацию.
215
+
216
+ Следующие версии публикуются через GitHub OIDC без постоянного npm-токена. Если live-тест упал из-за временной внешней ошибки, допускается rerun workflow. Если потребовалось изменение кода, существующий тег не переписывается — выпускается новая patch-версия.
217
+
218
+ ## Структура проекта
219
+
220
+ - `src/Tools` - тонкие OpenClaw tool adapters.
221
+ - `src/Application` - DTO, нормализация входа, dependency interfaces и tool call handlers.
222
+ - `src/Infrastructure` - Playwright collector, logging и clock implementations.
223
+ - `src/Composition` - сборка handlers и infrastructure.
224
+ - `src/Schemas` - TypeBox-схемы config и parameters.
225
+ - `src/Tests` - application, infrastructure, plugin и live collector tests.
226
+ - `scripts/run-tool.ts` - ручной запуск handler-а через composition root и печать JSON output.
227
+
228
+ ## Ограничения
229
+
230
+ - Плагин не решает CAPTCHA автоматически.
231
+ - Если Яндекс показывает challenge/CAPTCHA, collector замедляется, перезагружает страницу и пытается продолжить после последнего найденного отзыва.
232
+ - Если список перестал догружаться, collector возвращает уже найденные отзывы с warning.
233
+ - DOM Яндекс Карт может меняться; обязательный live-тест обнаруживает такие изменения при каждом запуске `npm test`.
234
+
235
+ ## Лицензия
236
+
237
+ MIT. См. [LICENSE](./LICENSE).
@@ -0,0 +1,3 @@
1
+ export interface Clock {
2
+ now(): Date;
3
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.js","sourceRoot":"","sources":["../../../src/Application/Dependencies/clock.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { LogLevel } from "../Dtos/yandex-maps-place-reviews.dto.js";
2
+ export interface AppLogger {
3
+ level: LogLevel;
4
+ error(message: string, meta?: unknown): void;
5
+ warn(message: string, meta?: unknown): void;
6
+ info(message: string, meta?: unknown): void;
7
+ debug(message: string, meta?: unknown): void;
8
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/Application/Dependencies/logger.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { CollectYandexMapsPlaceReviewsInputDto, GetYandexMapsPlaceReviewsOutputDto } from "../Dtos/yandex-maps-place-reviews.dto.js";
2
+ export interface YandexMapsReviewCollector {
3
+ collect(input: CollectYandexMapsPlaceReviewsInputDto, options?: {
4
+ signal?: AbortSignal;
5
+ }): Promise<GetYandexMapsPlaceReviewsOutputDto>;
6
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=yandex-maps-review-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yandex-maps-review-collector.js","sourceRoot":"","sources":["../../../src/Application/Dependencies/yandex-maps-review-collector.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ export declare const DEFAULT_REVIEW_COUNT = 100;
2
+ export declare const MIN_REVIEW_COUNT = 1;
3
+ export declare const MAX_REVIEW_COUNT = 500;
4
+ export type LogLevel = "silent" | "error" | "warn" | "info" | "debug";
5
+ export type YandexMapsReviewDto = {
6
+ url?: string;
7
+ date: string;
8
+ text: string;
9
+ };
10
+ export type GetYandexMapsPlaceReviewsInputDto = {
11
+ url: string;
12
+ count?: number;
13
+ headed?: boolean;
14
+ };
15
+ export type CollectYandexMapsPlaceReviewsInputDto = {
16
+ url: string;
17
+ count: number;
18
+ headed?: boolean;
19
+ };
20
+ export type GetYandexMapsPlaceReviewsOutputDto = {
21
+ sourceUrl: string;
22
+ requestedCount: number;
23
+ fetchedAt: string;
24
+ reviews: YandexMapsReviewDto[];
25
+ stats: {
26
+ attempts: number;
27
+ captchaReloads: number;
28
+ scrolls: number;
29
+ duplicatesSkipped: number;
30
+ logLevel: LogLevel;
31
+ };
32
+ warnings?: string[];
33
+ };
@@ -0,0 +1,4 @@
1
+ export const DEFAULT_REVIEW_COUNT = 100;
2
+ export const MIN_REVIEW_COUNT = 1;
3
+ export const MAX_REVIEW_COUNT = 500;
4
+ //# sourceMappingURL=yandex-maps-place-reviews.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yandex-maps-place-reviews.dto.js","sourceRoot":"","sources":["../../../src/Application/Dtos/yandex-maps-place-reviews.dto.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type CollectYandexMapsPlaceReviewsInputDto, type GetYandexMapsPlaceReviewsInputDto } from "../Dtos/yandex-maps-place-reviews.dto.js";
2
+ export declare function normalizeYandexMapsPlaceReviewsInput(input: GetYandexMapsPlaceReviewsInputDto): CollectYandexMapsPlaceReviewsInputDto;
@@ -0,0 +1,81 @@
1
+ import { DEFAULT_REVIEW_COUNT, MAX_REVIEW_COUNT, MIN_REVIEW_COUNT, } from "../Dtos/yandex-maps-place-reviews.dto.js";
2
+ const ALLOWED_HOSTS = new Set(["yandex.ru", "yandex.com", "yandex.by", "yandex.kz", "yandex.uz"]);
3
+ export function normalizeYandexMapsPlaceReviewsInput(input) {
4
+ return {
5
+ url: normalizeYandexMapsReviewsUrl(input.url),
6
+ count: normalizeReviewCount(input.count),
7
+ ...(input.headed === undefined ? {} : { headed: input.headed }),
8
+ };
9
+ }
10
+ function normalizeReviewCount(count) {
11
+ if (count === undefined) {
12
+ return DEFAULT_REVIEW_COUNT;
13
+ }
14
+ if (!Number.isInteger(count)) {
15
+ throw new Error("count must be an integer.");
16
+ }
17
+ if (count < MIN_REVIEW_COUNT || count > MAX_REVIEW_COUNT) {
18
+ throw new Error(`count must be between ${MIN_REVIEW_COUNT} and ${MAX_REVIEW_COUNT}.`);
19
+ }
20
+ return count;
21
+ }
22
+ function normalizeYandexMapsReviewsUrl(input) {
23
+ if (!input.trim()) {
24
+ throw new Error("url must not be empty.");
25
+ }
26
+ let parsed;
27
+ try {
28
+ parsed = new URL(input);
29
+ }
30
+ catch {
31
+ throw new Error("url must be an absolute Yandex Maps URL.");
32
+ }
33
+ const host = parsed.hostname.replace(/^www\./, "");
34
+ if (!ALLOWED_HOSTS.has(host) || !parsed.pathname.startsWith("/maps/")) {
35
+ throw new Error("url must point to a Yandex Maps place page.");
36
+ }
37
+ parsed.hash = "";
38
+ if (isPoiShareUrl(parsed)) {
39
+ parsed.searchParams.set("tab", "reviews");
40
+ parsed.searchParams.delete("source");
41
+ for (const key of [...parsed.searchParams.keys()]) {
42
+ if (key.toLowerCase().startsWith("utm_")) {
43
+ parsed.searchParams.delete(key);
44
+ }
45
+ }
46
+ return parsed.toString();
47
+ }
48
+ const parts = parsed.pathname.split("/").filter(Boolean);
49
+ if (!parts.includes("org")) {
50
+ throw new Error("url must point to a Yandex Maps place page.");
51
+ }
52
+ parsed.search = "";
53
+ const reviewsIndex = parts.indexOf("reviews");
54
+ if (reviewsIndex !== -1) {
55
+ parts.length = reviewsIndex + 1;
56
+ }
57
+ else {
58
+ parts.push("reviews");
59
+ }
60
+ parsed.pathname = `/${parts.join("/")}/`;
61
+ return parsed.toString();
62
+ }
63
+ function isPoiShareUrl(url) {
64
+ if (url.searchParams.get("mode") !== "poi") {
65
+ return false;
66
+ }
67
+ const poiUri = url.searchParams.get("poi[uri]");
68
+ if (poiUri === null) {
69
+ return false;
70
+ }
71
+ try {
72
+ const parsedPoi = new URL(poiUri);
73
+ return (parsedPoi.protocol === "ymapsbm1:" &&
74
+ parsedPoi.hostname === "org" &&
75
+ /^\d+$/.test(parsedPoi.searchParams.get("oid") ?? ""));
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ }
81
+ //# sourceMappingURL=normalize-yandex-maps-place-reviews-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-yandex-maps-place-reviews-input.js","sourceRoot":"","sources":["../../../src/Application/Normalization/normalize-yandex-maps-place-reviews-input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Clock } from "../Dependencies/clock.js";
2
+ import type { AppLogger } from "../Dependencies/logger.js";
3
+ import type { YandexMapsReviewCollector } from "../Dependencies/yandex-maps-review-collector.js";
4
+ import type { GetYandexMapsPlaceReviewsInputDto, GetYandexMapsPlaceReviewsOutputDto } from "../Dtos/yandex-maps-place-reviews.dto.js";
5
+ export declare class GetYandexMapsPlaceReviewsToolCallHandler {
6
+ private readonly collector;
7
+ private readonly clock;
8
+ private readonly logger;
9
+ constructor(collector: YandexMapsReviewCollector, clock: Clock, logger: AppLogger);
10
+ handle(input: GetYandexMapsPlaceReviewsInputDto, options?: {
11
+ signal?: AbortSignal;
12
+ }): Promise<GetYandexMapsPlaceReviewsOutputDto>;
13
+ }
@@ -0,0 +1,24 @@
1
+ import { normalizeYandexMapsPlaceReviewsInput } from "../Normalization/normalize-yandex-maps-place-reviews-input.js";
2
+ export class GetYandexMapsPlaceReviewsToolCallHandler {
3
+ collector;
4
+ clock;
5
+ logger;
6
+ constructor(collector, clock, logger) {
7
+ this.collector = collector;
8
+ this.clock = clock;
9
+ this.logger = logger;
10
+ }
11
+ async handle(input, options) {
12
+ options?.signal?.throwIfAborted();
13
+ const normalizedInput = normalizeYandexMapsPlaceReviewsInput(input);
14
+ this.logger.info("Handling Yandex Maps reviews tool call.", {
15
+ count: normalizedInput.count,
16
+ headed: Boolean(normalizedInput.headed),
17
+ requestedAt: this.clock.now().toISOString(),
18
+ });
19
+ return this.collector.collect(normalizedInput, {
20
+ signal: options?.signal,
21
+ });
22
+ }
23
+ }
24
+ //# sourceMappingURL=get-yandex-maps-place-reviews-tool-call-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-yandex-maps-place-reviews-tool-call-handler.js","sourceRoot":"","sources":["../../../src/Application/ToolCallHandlers/get-yandex-maps-place-reviews-tool-call-handler.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,oCAAoC,EAAE,MAAM,+DAA+D,CAAC;AAErH,MAAM,OAAO,wCAAwC;IAEhC;IACA;IACA;IAHnB,YACmB,SAAoC,EACpC,KAAY,EACZ,MAAiB;QAFjB,cAAS,GAAT,SAAS,CAA2B;QACpC,UAAK,GAAL,KAAK,CAAO;QACZ,WAAM,GAAN,MAAM,CAAW;IACjC,CAAC;IAEJ,KAAK,CAAC,MAAM,CACV,KAAwC,EACxC,OAEC;QAED,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QAElC,MAAM,eAAe,GAAG,oCAAoC,CAAC,KAAK,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE;YAC1D,KAAK,EAAE,eAAe,CAAC,KAAK;YAC5B,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC;YACvC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;SAC5C,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAC3B,eAAe,EACf;YACE,MAAM,EAAE,OAAO,EAAE,MAAM;SACxB,CACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ export type SetupCommand = {
2
+ showHelp: boolean;
3
+ playwrightArgs: string[];
4
+ withDepsIgnored: boolean;
5
+ };
6
+ export declare function createSetupCommand(args: string[], platform?: NodeJS.Platform): SetupCommand;
7
+ export declare function runSetup(args?: string[], platform?: NodeJS.Platform): number;
@@ -0,0 +1,66 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { createRequire } from "node:module";
3
+ import { dirname, join } from "node:path";
4
+ export function createSetupCommand(args, platform = process.platform) {
5
+ if (args.includes("--help") || args.includes("-h")) {
6
+ return { showHelp: true, playwrightArgs: [], withDepsIgnored: false };
7
+ }
8
+ const [command, ...options] = args;
9
+ if (command !== "setup") {
10
+ throw new Error('Expected the command "setup".');
11
+ }
12
+ const supportedOptions = new Set(["--with-deps"]);
13
+ const unsupportedOption = options.find((option) => !supportedOptions.has(option));
14
+ if (unsupportedOption !== undefined) {
15
+ throw new Error(`Unknown setup option: ${unsupportedOption}`);
16
+ }
17
+ const withDeps = options.includes("--with-deps");
18
+ const installSystemDependencies = withDeps && platform === "linux";
19
+ return {
20
+ showHelp: false,
21
+ playwrightArgs: ["install", ...(installSystemDependencies ? ["--with-deps"] : []), "chromium"],
22
+ withDepsIgnored: withDeps && !installSystemDependencies,
23
+ };
24
+ }
25
+ export function runSetup(args = process.argv.slice(2), platform = process.platform) {
26
+ let command;
27
+ try {
28
+ command = createSetupCommand(args, platform);
29
+ }
30
+ catch (error) {
31
+ console.error(error instanceof Error ? error.message : String(error));
32
+ printUsage();
33
+ return 2;
34
+ }
35
+ if (command.showHelp) {
36
+ printUsage();
37
+ return 0;
38
+ }
39
+ if (command.withDepsIgnored) {
40
+ console.info("--with-deps installs OS packages only on Linux; continuing with the Chromium installation.");
41
+ }
42
+ const require = createRequire(import.meta.url);
43
+ const playwrightPackageJson = require.resolve("playwright/package.json");
44
+ const playwrightCli = join(dirname(playwrightPackageJson), "cli.js");
45
+ const result = spawnSync(process.execPath, [playwrightCli, ...command.playwrightArgs], {
46
+ stdio: "inherit",
47
+ });
48
+ if (result.error !== undefined) {
49
+ console.error(`Could not start Playwright: ${result.error.message}`);
50
+ return 1;
51
+ }
52
+ if (result.signal !== null) {
53
+ console.error(`Playwright was terminated by ${result.signal}.`);
54
+ return 1;
55
+ }
56
+ return result.status ?? 1;
57
+ }
58
+ function printUsage() {
59
+ console.info(`Usage:
60
+ openclaw-yandex-maps-places-review setup [--with-deps]
61
+
62
+ Options:
63
+ --with-deps Install required OS packages on Linux before installing Chromium.
64
+ --help Show this help.`);
65
+ }
66
+ //# sourceMappingURL=setup-playwright-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-playwright-command.js","sourceRoot":"","sources":["../../src/Cli/setup-playwright-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQ1C,MAAM,UAAU,kBAAkB,CAAC,IAAc,EAAE,WAA4B,OAAO,CAAC,QAAQ;IAC7F,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IACxE,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;IACnC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IAClD,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAClF,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,yBAAyB,iBAAiB,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACjD,MAAM,yBAAyB,GAAG,QAAQ,IAAI,QAAQ,KAAK,OAAO,CAAC;IAEnE,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,cAAc,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;QAC9F,eAAe,EAAE,QAAQ,IAAI,CAAC,yBAAyB;KACxD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAA4B,OAAO,CAAC,QAAQ;IAC3G,IAAI,OAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,OAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,4FAA4F,CAAC,CAAC;IAC7G,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACzE,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,QAAQ,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,aAAa,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,EAAE;QACrF,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,+BAA+B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,gCAAgC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,CAAC,IAAI,CAAC;;;;;+BAKgB,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { runSetup } from "./setup-playwright-command.js";
3
+ process.exitCode = runSetup();
4
+ //# sourceMappingURL=setup-playwright.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-playwright.js","sourceRoot":"","sources":["../../src/Cli/setup-playwright.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEzD,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { LogLevel } from "../Application/Dtos/yandex-maps-place-reviews.dto.js";
2
+ import { GetYandexMapsPlaceReviewsToolCallHandler } from "../Application/ToolCallHandlers/get-yandex-maps-place-reviews-tool-call-handler.js";
3
+ export type PluginConfig = {
4
+ logLevel?: LogLevel;
5
+ };
6
+ export declare function createToolCallHandlers(config?: PluginConfig): {
7
+ getYandexMapsPlaceReviews: GetYandexMapsPlaceReviewsToolCallHandler;
8
+ };
@@ -0,0 +1,22 @@
1
+ import { GetYandexMapsPlaceReviewsToolCallHandler } from "../Application/ToolCallHandlers/get-yandex-maps-place-reviews-tool-call-handler.js";
2
+ import { SystemClock } from "../Infrastructure/Clock/system-clock.js";
3
+ import { PinoAppLogger } from "../Infrastructure/Logging/pino-app-logger.js";
4
+ import { PlaywrightYandexMapsReviewCollector } from "../Infrastructure/YandexMaps/playwright-yandex-maps-review-collector.js";
5
+ import { PlaywrightYandexMapsReviewNavigator } from "../Infrastructure/YandexMaps/playwright-yandex-maps-review-navigator.js";
6
+ import { PlaywrightYandexMapsReviewParser } from "../Infrastructure/YandexMaps/playwright-yandex-maps-review-parser.js";
7
+ export function createToolCallHandlers(config = {}) {
8
+ const logger = new PinoAppLogger(config.logLevel ?? "info");
9
+ const clock = new SystemClock();
10
+ const navigator = new PlaywrightYandexMapsReviewNavigator(logger);
11
+ const parser = new PlaywrightYandexMapsReviewParser();
12
+ const collector = new PlaywrightYandexMapsReviewCollector({
13
+ logger,
14
+ clock,
15
+ navigator,
16
+ parser,
17
+ });
18
+ return {
19
+ getYandexMapsPlaceReviews: new GetYandexMapsPlaceReviewsToolCallHandler(collector, clock, logger),
20
+ };
21
+ }
22
+ //# sourceMappingURL=create-tool-call-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-tool-call-handlers.js","sourceRoot":"","sources":["../../src/Composition/create-tool-call-handlers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wCAAwC,EAAE,MAAM,oFAAoF,CAAC;AAC9I,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAC7E,OAAO,EAAE,mCAAmC,EAAE,MAAM,yEAAyE,CAAC;AAC9H,OAAO,EAAE,mCAAmC,EAAE,MAAM,yEAAyE,CAAC;AAC9H,OAAO,EAAE,gCAAgC,EAAE,MAAM,sEAAsE,CAAC;AAMxH,MAAM,UAAU,sBAAsB,CAAC,SAAuB,EAAE;IAC9D,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,mCAAmC,CAAC,MAAM,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,IAAI,gCAAgC,EAAE,CAAC;IACtD,MAAM,SAAS,GAAG,IAAI,mCAAmC,CAAC;QACxD,MAAM;QACN,KAAK;QACL,SAAS;QACT,MAAM;KACP,CAAC,CAAC;IAEH,OAAO;QACL,yBAAyB,EAAE,IAAI,wCAAwC,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC;KAClG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Clock } from "../../Application/Dependencies/clock.js";
2
+ export declare class SystemClock implements Clock {
3
+ now(): Date;
4
+ }
@@ -0,0 +1,6 @@
1
+ export class SystemClock {
2
+ now() {
3
+ return new Date();
4
+ }
5
+ }
6
+ //# sourceMappingURL=system-clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-clock.js","sourceRoot":"","sources":["../../../src/Infrastructure/Clock/system-clock.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAW;IACtB,GAAG;QACD,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;CACF"}