@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.
- package/LICENSE +21 -0
- package/README.md +237 -0
- package/dist/Application/Dependencies/clock.d.ts +3 -0
- package/dist/Application/Dependencies/clock.js +2 -0
- package/dist/Application/Dependencies/clock.js.map +1 -0
- package/dist/Application/Dependencies/logger.d.ts +8 -0
- package/dist/Application/Dependencies/logger.js +2 -0
- package/dist/Application/Dependencies/logger.js.map +1 -0
- package/dist/Application/Dependencies/yandex-maps-review-collector.d.ts +6 -0
- package/dist/Application/Dependencies/yandex-maps-review-collector.js +2 -0
- package/dist/Application/Dependencies/yandex-maps-review-collector.js.map +1 -0
- package/dist/Application/Dtos/yandex-maps-place-reviews.dto.d.ts +33 -0
- package/dist/Application/Dtos/yandex-maps-place-reviews.dto.js +4 -0
- package/dist/Application/Dtos/yandex-maps-place-reviews.dto.js.map +1 -0
- package/dist/Application/Normalization/normalize-yandex-maps-place-reviews-input.d.ts +2 -0
- package/dist/Application/Normalization/normalize-yandex-maps-place-reviews-input.js +81 -0
- package/dist/Application/Normalization/normalize-yandex-maps-place-reviews-input.js.map +1 -0
- package/dist/Application/ToolCallHandlers/get-yandex-maps-place-reviews-tool-call-handler.d.ts +13 -0
- package/dist/Application/ToolCallHandlers/get-yandex-maps-place-reviews-tool-call-handler.js +24 -0
- package/dist/Application/ToolCallHandlers/get-yandex-maps-place-reviews-tool-call-handler.js.map +1 -0
- package/dist/Cli/setup-playwright-command.d.ts +7 -0
- package/dist/Cli/setup-playwright-command.js +66 -0
- package/dist/Cli/setup-playwright-command.js.map +1 -0
- package/dist/Cli/setup-playwright.d.ts +2 -0
- package/dist/Cli/setup-playwright.js +4 -0
- package/dist/Cli/setup-playwright.js.map +1 -0
- package/dist/Composition/create-tool-call-handlers.d.ts +8 -0
- package/dist/Composition/create-tool-call-handlers.js +22 -0
- package/dist/Composition/create-tool-call-handlers.js.map +1 -0
- package/dist/Infrastructure/Clock/system-clock.d.ts +4 -0
- package/dist/Infrastructure/Clock/system-clock.js +6 -0
- package/dist/Infrastructure/Clock/system-clock.js.map +1 -0
- package/dist/Infrastructure/Logging/pino-app-logger.d.ts +12 -0
- package/dist/Infrastructure/Logging/pino-app-logger.js +39 -0
- package/dist/Infrastructure/Logging/pino-app-logger.js.map +1 -0
- package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-collector.d.ts +26 -0
- package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-collector.js +196 -0
- package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-collector.js.map +1 -0
- package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-contracts.d.ts +24 -0
- package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-contracts.js +2 -0
- package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-contracts.js.map +1 -0
- package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-navigator.d.ts +20 -0
- package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-navigator.js +306 -0
- package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-navigator.js.map +1 -0
- package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-parser.d.ts +8 -0
- package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-parser.js +93 -0
- package/dist/Infrastructure/YandexMaps/playwright-yandex-maps-review-parser.js.map +1 -0
- package/dist/Infrastructure/YandexMaps/yandex-maps-review-dom.d.ts +7 -0
- package/dist/Infrastructure/YandexMaps/yandex-maps-review-dom.js +18 -0
- package/dist/Infrastructure/YandexMaps/yandex-maps-review-dom.js.map +1 -0
- package/dist/Schemas/yandex-maps-place-reviews-config.schema.d.ts +5 -0
- package/dist/Schemas/yandex-maps-place-reviews-config.schema.js +12 -0
- package/dist/Schemas/yandex-maps-place-reviews-config.schema.js.map +1 -0
- package/dist/Schemas/yandex-maps-place-reviews-parameters.schema.d.ts +5 -0
- package/dist/Schemas/yandex-maps-place-reviews-parameters.schema.js +13 -0
- package/dist/Schemas/yandex-maps-place-reviews-parameters.schema.js.map +1 -0
- package/dist/Tools/yandex-maps-place-reviews.tool.d.ts +7 -0
- package/dist/Tools/yandex-maps-place-reviews.tool.js +23 -0
- package/dist/Tools/yandex-maps-place-reviews.tool.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/openclaw.plugin.json +44 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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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"}
|
package/dist/Application/ToolCallHandlers/get-yandex-maps-place-reviews-tool-call-handler.d.ts
ADDED
|
@@ -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
|
package/dist/Application/ToolCallHandlers/get-yandex-maps-place-reviews-tool-call-handler.js.map
ADDED
|
@@ -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":"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"}
|
|
@@ -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 @@
|
|
|
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"}
|