answer42 0.7.0__tar.gz → 0.8.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. {answer42-0.7.0 → answer42-0.8.1}/PKG-INFO +19 -4
  2. {answer42-0.7.0 → answer42-0.8.1}/README.md +18 -3
  3. {answer42-0.7.0 → answer42-0.8.1}/docs/architecture.md +6 -3
  4. {answer42-0.7.0 → answer42-0.8.1}/pyproject.toml +1 -1
  5. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/assets/MCPTestClient.cf +0 -0
  6. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/assets/MCPTestManager.cf +0 -0
  7. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/html_agent.py +314 -29
  8. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/runtime.py +69 -1
  9. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/server.py +170 -15
  10. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/tool_groups.py +1 -1
  11. {answer42-0.7.0 → answer42-0.8.1}/.gitignore +0 -0
  12. {answer42-0.7.0 → answer42-0.8.1}/LICENSE +0 -0
  13. {answer42-0.7.0 → answer42-0.8.1}/credentials.example.json +0 -0
  14. {answer42-0.7.0 → answer42-0.8.1}/docs/agent-installation.md +0 -0
  15. {answer42-0.7.0 → answer42-0.8.1}/docs/assets/answer42-logo.png +0 -0
  16. {answer42-0.7.0 → answer42-0.8.1}/docs/assets/platform42-logo.svg +0 -0
  17. {answer42-0.7.0 → answer42-0.8.1}/docs/installation.md +0 -0
  18. {answer42-0.7.0 → answer42-0.8.1}/scripts/build_cf.py +0 -0
  19. {answer42-0.7.0 → answer42-0.8.1}/scripts/e2e_http_smoke.py +0 -0
  20. {answer42-0.7.0 → answer42-0.8.1}/scripts/e2e_stable.py +0 -0
  21. {answer42-0.7.0 → answer42-0.8.1}/scripts/openclaw_mcp_autoreload.py +0 -0
  22. {answer42-0.7.0 → answer42-0.8.1}/scripts/rag_cli.py +0 -0
  23. {answer42-0.7.0 → answer42-0.8.1}/scripts/read_webclient_start_info.py +0 -0
  24. {answer42-0.7.0 → answer42-0.8.1}/src/cf/ConfigDumpInfo.xml +0 -0
  25. {answer42-0.7.0 → answer42-0.8.1}/src/cf/Configuration.xml +0 -0
  26. {answer42-0.7.0 → answer42-0.8.1}/src/cf/DataProcessors/MCPTestManager/Ext/ObjectModule.bsl +0 -0
  27. {answer42-0.7.0 → answer42-0.8.1}/src/cf/DataProcessors/MCPTestManager/Forms//320/244/320/276/321/200/320/274/320/260/Ext/Form/Module.bsl" +0 -0
  28. {answer42-0.7.0 → answer42-0.8.1}/src/cf/DataProcessors/MCPTestManager/Forms//320/244/320/276/321/200/320/274/320/260/Ext/Form.xml" +0 -0
  29. {answer42-0.7.0 → answer42-0.8.1}/src/cf/DataProcessors/MCPTestManager/Forms//320/244/320/276/321/200/320/274/320/260.xml" +0 -0
  30. {answer42-0.7.0 → answer42-0.8.1}/src/cf/DataProcessors/MCPTestManager.xml +0 -0
  31. {answer42-0.7.0 → answer42-0.8.1}/src/cf/Ext/ManagedApplicationModule.bsl +0 -0
  32. {answer42-0.7.0 → answer42-0.8.1}/src/cf/Languages//320/240/321/203/321/201/321/201/320/272/320/270/320/271.xml" +0 -0
  33. {answer42-0.7.0 → answer42-0.8.1}/src/client_cf/Catalogs//320/237/320/241_/320/222/320/273/320/260/320/264/320/265/320/273/320/265/321/206.xml" +0 -0
  34. {answer42-0.7.0 → answer42-0.8.1}/src/client_cf/Catalogs//320/237/320/241_/320/241/320/277/321/200/320/260/320/262/320/276/321/207/320/275/320/270/320/2721.xml" +0 -0
  35. {answer42-0.7.0 → answer42-0.8.1}/src/client_cf/ConfigDumpInfo.xml +0 -0
  36. {answer42-0.7.0 → answer42-0.8.1}/src/client_cf/Configuration.xml +0 -0
  37. {answer42-0.7.0 → answer42-0.8.1}/src/client_cf/Languages//320/240/321/203/321/201/321/201/320/272/320/270/320/271.xml" +0 -0
  38. {answer42-0.7.0 → answer42-0.8.1}/src/client_cf/Reports//320/237/320/241_/320/241/320/277/320/270/321/201/320/276/320/272/320/255/320/273/320/265/320/274/320/265/320/275/321/202/320/276/320/262/Ext/ManagerModule.bsl" +0 -0
  39. {answer42-0.7.0 → answer42-0.8.1}/src/client_cf/Reports//320/237/320/241_/320/241/320/277/320/270/321/201/320/276/320/272/320/255/320/273/320/265/320/274/320/265/320/275/321/202/320/276/320/262/Ext/ObjectModule.bsl" +0 -0
  40. {answer42-0.7.0 → answer42-0.8.1}/src/client_cf/Reports//320/237/320/241_/320/241/320/277/320/270/321/201/320/276/320/272/320/255/320/273/320/265/320/274/320/265/320/275/321/202/320/276/320/262/Templates//320/236/321/201/320/275/320/276/320/262/320/275/320/260/321/217/320/241/321/205/320/265/320/274/320/260/320/232/320/276/320/274/320/277/320/276/320/275/320/276/320/262/320/272/320/270/320/224/320/260/320/275/320/275/321/213/321/205/Ext/Template.xml" +0 -0
  41. {answer42-0.7.0 → answer42-0.8.1}/src/client_cf/Reports//320/237/320/241_/320/241/320/277/320/270/321/201/320/276/320/272/320/255/320/273/320/265/320/274/320/265/320/275/321/202/320/276/320/262/Templates//320/236/321/201/320/275/320/276/320/262/320/275/320/260/321/217/320/241/321/205/320/265/320/274/320/260/320/232/320/276/320/274/320/277/320/276/320/275/320/276/320/262/320/272/320/270/320/224/320/260/320/275/320/275/321/213/321/205.xml" +0 -0
  42. {answer42-0.7.0 → answer42-0.8.1}/src/client_cf/Reports//320/237/320/241_/320/241/320/277/320/270/321/201/320/276/320/272/320/255/320/273/320/265/320/274/320/265/320/275/321/202/320/276/320/262.xml" +0 -0
  43. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/__init__.py +0 -0
  44. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/assets/__init__.py +0 -0
  45. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/auth.py +0 -0
  46. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/bridge.py +0 -0
  47. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/credentials.py +0 -0
  48. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/credentials_cli.py +0 -0
  49. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/os_support.py +0 -0
  50. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/platform.py +0 -0
  51. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/protocol.py +0 -0
  52. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/rag/__init__.py +0 -0
  53. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/rag/detect.py +0 -0
  54. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/rag/dump.py +0 -0
  55. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/rag/model.py +0 -0
  56. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/rag/parsers.py +0 -0
  57. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/rag/service.py +0 -0
  58. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/rag/store.py +0 -0
  59. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/rag/summary_backend.py +0 -0
  60. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/rag/summary_vector.py +0 -0
  61. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/recorder.py +0 -0
  62. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/release_helper.py +0 -0
  63. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/skill_installer.py +0 -0
  64. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/webclient_probe.py +0 -0
  65. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/webkit_patch.py +0 -0
  66. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/win_desktop.py +0 -0
  67. {answer42-0.7.0 → answer42-0.8.1}/src/mcp_1c/window_control.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: answer42
3
- Version: 0.7.0
3
+ Version: 0.8.1
4
4
  Summary: Answer42 — The Answer to Life, Universe, and 1C — UI Driver. MCP-powered 1C:Enterprise UI automation: click, fill, navigate, test, and introspect managed forms through the test-client API
5
5
  Author: Marvin (AI Assistant), 42Clouds, and contributors
6
6
  Author-email: "Kosolapov Stanislav (proDOOMman)" <prodoomman@gmail.com>
@@ -229,7 +229,17 @@ answer42
229
229
 
230
230
  **Статический HTML** — инструменты группы `forms` через API клиента тестирования: `html_field_content` (HTML поля в том виде, в каком страница загрузилась, и её видимый текст), `html_field_click_link`, `html_field_input`.
231
231
 
232
- **Живые страницы** — группа `html`. `start_session` по умолчанию (`html_agent=true`) готовит мост к встроенному WebKit клиента; `html_agent=false` его не запускает.
232
+ **Живые страницы** — группа `html`. Способ доступа к встроенному WebKit клиента выбирает параметр `start_session(html_mode=...)` (значение по умолчанию можно задать переменной `ONEC_MCP_HTML_MODE`):
233
+
234
+ | `html_mode` | Где | Как |
235
+ |---|---|---|
236
+ | `auto` (по умолчанию) | везде | Linux — `remote`; Windows — `patched`, если в Web Inspector платформы установлен актуальный мост, иначе `console` |
237
+ | `console` | Windows | горячая клавиша инспектора и короткий загрузчик, введённый в его консоль |
238
+ | `patched` | Windows, Linux | мост, встроенный в интерфейс инспектора: на Windows — в Web Inspector платформы (сначала `answer42 webkit-inspector install`, см. ниже), на Linux — подставляется для сессии, ничего устанавливать не нужно |
239
+ | `remote` | Linux | удалённый отладчик WebKitGTK (`WEBKIT_INSPECTOR_SERVER`) |
240
+ | `disabled` | везде | мост не запускается, инструменты `html_*` недоступны |
241
+
242
+ Явно выбранный режим не подменяется другим: если он недоступен (`patched` без моста в платформе, режим другой ОС), `start_session` сразу возвращает ошибку с подсказкой. Мост ничего не делает, пока не вызван инструмент `html_*`: на Windows инспектор открывается только при первом вызове, на Linux клиент запускается со встроенным сервером отладки.
233
243
 
234
244
  | Инструмент | Что делает |
235
245
  |---|---|
@@ -241,6 +251,7 @@ answer42
241
251
  | `html_wait` | дождаться появления или исчезновения текста / элемента |
242
252
  | `html_eval` | выполнить произвольный JavaScript в странице — **только с `--dev-tools`** (см. ниже) |
243
253
  | `html_console` | ошибки и предупреждения консоли страницы и скрипты, которые эта сборка WebKit не разбирает (например `?.`) |
254
+ | `html_download` | скачать файл по ссылке страницы изнутри страницы (с её cookie и сеансом) и сохранить в каталог сессии: путь, размер, тип, HTTP-статус |
244
255
  | `html_inspector_patch` | Windows: встроить мост в Web Inspector установленных платформ 1С или убрать его (необязательно, см. ниже) |
245
256
 
246
257
  Если живых страниц несколько, нужная выбирается параметром `page` (id из `html_pages` или часть URL / заголовка).
@@ -250,8 +261,12 @@ answer42
250
261
  Как это устроено:
251
262
 
252
263
  - **Windows.** Встроенный WebKit клиента 1С не имеет сервера удалённой отладки, но его Web Inspector открывается по Ctrl+Alt+Shift+F12. При первом вызове `html_*` Answer42 открывает инспектор поля (он встраивается в нижнюю часть формы), переключает его на вкладку Console и вводит в консоль короткий загрузчик. Загрузчик подключается к локальному WebSocket Answer42 по одноразовому токену, получает мост и выполняет операции в странице. Подключение к странице занимает около 2–3 секунд. После перезагрузки страницы загрузчик вводится заново. Платформа используется как установлена.
253
- - **Windows, мост в инспекторе платформы (необязательно).** `answer42 webkit-inspector install` (или инструмент `html_inspector_patch(action="install")`) встраивает мост в Web Inspector установленной платформы: `bin\WebKit.resources\WebInspectorUI\Main.html` подключает `Answer42Bridge.js`. Каталог платформы доступен на запись только администратору, поэтому команда сама запрашивает права через UAC — одно подтверждение на все выбранные платформы — и разрешает текущему пользователю менять файл с портом сессии; сессиям права администратора больше не нужны. Если процесс Answer42 запущен из среды, которая не может показать запрос UAC (например, из песочницы агента), через 90 секунд команда вернёт ошибку с готовой командой для PowerShell, запущенного от имени администратора. После этого интерфейс инспектора подключается к Answer42 сам: в консоль ничего не вводится, мост переживает перезагрузку страницы, а `html_console` видит сообщения с момента её загрузки. Если инспектор открывает человек, мост ничего не делает. `answer42 webkit-inspector status` показывает состояние платформ, `uninstall` возвращает исходные файлы; без моста (или после обновления платформы) Answer42 вводит загрузчик, как обычно. Ключ `--version` выбирает платформу, без него — все установленные.
254
- - **Linux.** HTML-поля рисует системный WebKitGTK. Answer42 запускает тест-клиент с `WEBKIT_INSPECTOR_SERVER=127.0.0.1:<порт>` и подключается к удалённому отладчику WebKitGTK напрямую: окна инспектора и ввода с клавиатуры нет.
264
+ - **Windows, мост в инспекторе платформы (`html_mode=patched`).** `answer42 webkit-inspector install` (или инструмент `html_inspector_patch(action="install")`) встраивает мост в Web Inspector установленной платформы: `bin\WebKit.resources\WebInspectorUI\Main.html` подключает `Answer42Bridge.js`. Каталог платформы доступен на запись только администратору, поэтому команда сама запрашивает права через UAC — одно подтверждение на все выбранные платформы — и разрешает текущему пользователю менять файл с портом сессии; сессиям права администратора больше не нужны. Если процесс Answer42 запущен из среды, которая не может показать запрос UAC (например, из песочницы агента), через 90 секунд команда вернёт ошибку с готовой командой для PowerShell, запущенного от имени администратора. После этого интерфейс инспектора подключается к Answer42 сам: в консоль ничего не вводится, мост переживает перезагрузку страницы, а `html_console` видит сообщения с момента её загрузки. Если инспектор открывает человек, мост ничего не делает. `answer42 webkit-inspector status` показывает состояние платформ, `uninstall` возвращает исходные файлы. После обновления Answer42 или платформы мост нужно поставить заново: `html_mode=patched` с устаревшим мостом не запускается. Ключ `--version` выбирает платформу, без него — все установленные.
265
+ - **Linux, `remote` (по умолчанию).** HTML-поля рисует системный WebKitGTK. Answer42 запускает тест-клиент с `WEBKIT_INSPECTOR_SERVER=127.0.0.1:<порт>` и подключается к удалённому отладчику WebKitGTK напрямую: окна инспектора и ввода с клавиатуры нет.
266
+ - **Linux, `patched`.** Инспектор WebKitGTK в 1С открывается той же клавишей Ctrl+Alt+Shift+F12 и встраивается в форму. Интерфейс инспектора вшит в системную `libwebkit2gtk`, поэтому Answer42 его не меняет: переменная GLib `G_RESOURCE_OVERLAYS` подставляет тест-клиенту из каталога сессии один файл инспектора (`localizedStrings.js`) с мостом. Answer42 ставит фокус в HTML-поле средствами клиента тестирования и отправляет клавишу через `xdotool`, после чего интерфейс инспектора подключается сам (около 1 с). Нужен `xdotool`; на живом дисплее горячая клавиша уходит в окно 1С.
267
+ - **Linux, `console`** не поддерживается: встроенный инспектор WebKitGTK не отдельное окно X11, поэтому клавиши уходят в элемент с фокусом — в саму страницу. В проверке набранный загрузчик попал в поле ввода чата и был отправлен как сообщение.
268
+
269
+ **Внешний браузер на Linux.** Ссылки и файлы, которые 1С открывает «снаружи» (например, «Скачать» в HTML-поле или `ЗапуститьПриложение`), платформа открывает через `xdg-open` и ждёт его завершения, а `xdg-open` ждёт браузер, который ему пришлось запустить. Без Answer42 клиент 1С висел, пока не закроют Chrome, а с ним вставали мост тест-клиента и инструменты `html_*`. Поэтому тест-клиент получает в `PATH` обёртку `xdg-open` от Answer42: она записывает адрес и сразу возвращает управление, а на настоящем дисплее открывает адрес в браузере отдельно от клиента. Записанные адреса видны в `external_opens` ответов `html_field_click_link` и `session_status`; файл по такому адресу скачивает `html_download`. `ONEC_MCP_EXTERNAL_OPEN`: `auto` (по умолчанию: на собственном Xvfb Answer42 только записывать, на настоящем дисплее ещё и открывать), `open`, `record`, `off` (без обёртки).
255
270
 
256
271
  Ограничения: на Windows инспектор остаётся встроенным в форму и попадает на скриншоты. `html_console` на Linux и с мостом в инспекторе платформы отдаёт сообщения с момента загрузки страницы, а с загрузчиком в консоли — с момента подключения (`collected_since`); неподдержанный синтаксис в скриптах страницы находит проверка скриптов (`check_scripts`). Встроенный WebKit Windows-клиента 1С не поддерживает часть современного JavaScript (например `?.`), а WebKitGTK на Linux — поддерживает: одна и та же страница может работать в одном клиенте и ломаться в другом.
257
272
 
@@ -187,7 +187,17 @@ answer42
187
187
 
188
188
  **Статический HTML** — инструменты группы `forms` через API клиента тестирования: `html_field_content` (HTML поля в том виде, в каком страница загрузилась, и её видимый текст), `html_field_click_link`, `html_field_input`.
189
189
 
190
- **Живые страницы** — группа `html`. `start_session` по умолчанию (`html_agent=true`) готовит мост к встроенному WebKit клиента; `html_agent=false` его не запускает.
190
+ **Живые страницы** — группа `html`. Способ доступа к встроенному WebKit клиента выбирает параметр `start_session(html_mode=...)` (значение по умолчанию можно задать переменной `ONEC_MCP_HTML_MODE`):
191
+
192
+ | `html_mode` | Где | Как |
193
+ |---|---|---|
194
+ | `auto` (по умолчанию) | везде | Linux — `remote`; Windows — `patched`, если в Web Inspector платформы установлен актуальный мост, иначе `console` |
195
+ | `console` | Windows | горячая клавиша инспектора и короткий загрузчик, введённый в его консоль |
196
+ | `patched` | Windows, Linux | мост, встроенный в интерфейс инспектора: на Windows — в Web Inspector платформы (сначала `answer42 webkit-inspector install`, см. ниже), на Linux — подставляется для сессии, ничего устанавливать не нужно |
197
+ | `remote` | Linux | удалённый отладчик WebKitGTK (`WEBKIT_INSPECTOR_SERVER`) |
198
+ | `disabled` | везде | мост не запускается, инструменты `html_*` недоступны |
199
+
200
+ Явно выбранный режим не подменяется другим: если он недоступен (`patched` без моста в платформе, режим другой ОС), `start_session` сразу возвращает ошибку с подсказкой. Мост ничего не делает, пока не вызван инструмент `html_*`: на Windows инспектор открывается только при первом вызове, на Linux клиент запускается со встроенным сервером отладки.
191
201
 
192
202
  | Инструмент | Что делает |
193
203
  |---|---|
@@ -199,6 +209,7 @@ answer42
199
209
  | `html_wait` | дождаться появления или исчезновения текста / элемента |
200
210
  | `html_eval` | выполнить произвольный JavaScript в странице — **только с `--dev-tools`** (см. ниже) |
201
211
  | `html_console` | ошибки и предупреждения консоли страницы и скрипты, которые эта сборка WebKit не разбирает (например `?.`) |
212
+ | `html_download` | скачать файл по ссылке страницы изнутри страницы (с её cookie и сеансом) и сохранить в каталог сессии: путь, размер, тип, HTTP-статус |
202
213
  | `html_inspector_patch` | Windows: встроить мост в Web Inspector установленных платформ 1С или убрать его (необязательно, см. ниже) |
203
214
 
204
215
  Если живых страниц несколько, нужная выбирается параметром `page` (id из `html_pages` или часть URL / заголовка).
@@ -208,8 +219,12 @@ answer42
208
219
  Как это устроено:
209
220
 
210
221
  - **Windows.** Встроенный WebKit клиента 1С не имеет сервера удалённой отладки, но его Web Inspector открывается по Ctrl+Alt+Shift+F12. При первом вызове `html_*` Answer42 открывает инспектор поля (он встраивается в нижнюю часть формы), переключает его на вкладку Console и вводит в консоль короткий загрузчик. Загрузчик подключается к локальному WebSocket Answer42 по одноразовому токену, получает мост и выполняет операции в странице. Подключение к странице занимает около 2–3 секунд. После перезагрузки страницы загрузчик вводится заново. Платформа используется как установлена.
211
- - **Windows, мост в инспекторе платформы (необязательно).** `answer42 webkit-inspector install` (или инструмент `html_inspector_patch(action="install")`) встраивает мост в Web Inspector установленной платформы: `bin\WebKit.resources\WebInspectorUI\Main.html` подключает `Answer42Bridge.js`. Каталог платформы доступен на запись только администратору, поэтому команда сама запрашивает права через UAC — одно подтверждение на все выбранные платформы — и разрешает текущему пользователю менять файл с портом сессии; сессиям права администратора больше не нужны. Если процесс Answer42 запущен из среды, которая не может показать запрос UAC (например, из песочницы агента), через 90 секунд команда вернёт ошибку с готовой командой для PowerShell, запущенного от имени администратора. После этого интерфейс инспектора подключается к Answer42 сам: в консоль ничего не вводится, мост переживает перезагрузку страницы, а `html_console` видит сообщения с момента её загрузки. Если инспектор открывает человек, мост ничего не делает. `answer42 webkit-inspector status` показывает состояние платформ, `uninstall` возвращает исходные файлы; без моста (или после обновления платформы) Answer42 вводит загрузчик, как обычно. Ключ `--version` выбирает платформу, без него — все установленные.
212
- - **Linux.** HTML-поля рисует системный WebKitGTK. Answer42 запускает тест-клиент с `WEBKIT_INSPECTOR_SERVER=127.0.0.1:<порт>` и подключается к удалённому отладчику WebKitGTK напрямую: окна инспектора и ввода с клавиатуры нет.
222
+ - **Windows, мост в инспекторе платформы (`html_mode=patched`).** `answer42 webkit-inspector install` (или инструмент `html_inspector_patch(action="install")`) встраивает мост в Web Inspector установленной платформы: `bin\WebKit.resources\WebInspectorUI\Main.html` подключает `Answer42Bridge.js`. Каталог платформы доступен на запись только администратору, поэтому команда сама запрашивает права через UAC — одно подтверждение на все выбранные платформы — и разрешает текущему пользователю менять файл с портом сессии; сессиям права администратора больше не нужны. Если процесс Answer42 запущен из среды, которая не может показать запрос UAC (например, из песочницы агента), через 90 секунд команда вернёт ошибку с готовой командой для PowerShell, запущенного от имени администратора. После этого интерфейс инспектора подключается к Answer42 сам: в консоль ничего не вводится, мост переживает перезагрузку страницы, а `html_console` видит сообщения с момента её загрузки. Если инспектор открывает человек, мост ничего не делает. `answer42 webkit-inspector status` показывает состояние платформ, `uninstall` возвращает исходные файлы. После обновления Answer42 или платформы мост нужно поставить заново: `html_mode=patched` с устаревшим мостом не запускается. Ключ `--version` выбирает платформу, без него — все установленные.
223
+ - **Linux, `remote` (по умолчанию).** HTML-поля рисует системный WebKitGTK. Answer42 запускает тест-клиент с `WEBKIT_INSPECTOR_SERVER=127.0.0.1:<порт>` и подключается к удалённому отладчику WebKitGTK напрямую: окна инспектора и ввода с клавиатуры нет.
224
+ - **Linux, `patched`.** Инспектор WebKitGTK в 1С открывается той же клавишей Ctrl+Alt+Shift+F12 и встраивается в форму. Интерфейс инспектора вшит в системную `libwebkit2gtk`, поэтому Answer42 его не меняет: переменная GLib `G_RESOURCE_OVERLAYS` подставляет тест-клиенту из каталога сессии один файл инспектора (`localizedStrings.js`) с мостом. Answer42 ставит фокус в HTML-поле средствами клиента тестирования и отправляет клавишу через `xdotool`, после чего интерфейс инспектора подключается сам (около 1 с). Нужен `xdotool`; на живом дисплее горячая клавиша уходит в окно 1С.
225
+ - **Linux, `console`** не поддерживается: встроенный инспектор WebKitGTK не отдельное окно X11, поэтому клавиши уходят в элемент с фокусом — в саму страницу. В проверке набранный загрузчик попал в поле ввода чата и был отправлен как сообщение.
226
+
227
+ **Внешний браузер на Linux.** Ссылки и файлы, которые 1С открывает «снаружи» (например, «Скачать» в HTML-поле или `ЗапуститьПриложение`), платформа открывает через `xdg-open` и ждёт его завершения, а `xdg-open` ждёт браузер, который ему пришлось запустить. Без Answer42 клиент 1С висел, пока не закроют Chrome, а с ним вставали мост тест-клиента и инструменты `html_*`. Поэтому тест-клиент получает в `PATH` обёртку `xdg-open` от Answer42: она записывает адрес и сразу возвращает управление, а на настоящем дисплее открывает адрес в браузере отдельно от клиента. Записанные адреса видны в `external_opens` ответов `html_field_click_link` и `session_status`; файл по такому адресу скачивает `html_download`. `ONEC_MCP_EXTERNAL_OPEN`: `auto` (по умолчанию: на собственном Xvfb Answer42 только записывать, на настоящем дисплее ещё и открывать), `open`, `record`, `off` (без обёртки).
213
228
 
214
229
  Ограничения: на Windows инспектор остаётся встроенным в форму и попадает на скриншоты. `html_console` на Linux и с мостом в инспекторе платформы отдаёт сообщения с момента загрузки страницы, а с загрузчиком в консоли — с момента подключения (`collected_since`); неподдержанный синтаксис в скриптах страницы находит проверка скриптов (`check_scripts`). Встроенный WebKit Windows-клиента 1С не поддерживает часть современного JavaScript (например `?.`), а WebKitGTK на Linux — поддерживает: одна и та же страница может работать в одном клиенте и ломаться в другом.
215
230
 
@@ -91,7 +91,7 @@ class SessionState:
91
91
 
92
92
  `dynamic_list_sort_by_column` — отдельный быстрый tool для сортировки уже открытого динамического списка по видимой колонке через API списка. Он не является fallback-веткой `dynamic_list_set_settings`.
93
93
  - табличные документы: `tabular_documents` (список или ячейки одного документа по `name`/`title`), `tabular_document_save`;
94
- - HTML-поля: `html_field_content`, `html_field_click_link`, `html_field_input` (API тест-клиента) и живые страницы `html_pages`, `html_text`, `html_query`, `html_click`, `html_type`, `html_wait`, `html_console` (через `mcp_1c.html_agent`); `html_eval` (произвольный JavaScript) и `dev_eval` (произвольный BSL) регистрируются только с `--dev-tools` / `ONEC_MCP_DEV_TOOLS=1` (`DEV_TOOL_NAMES`, `_register_dev_tools`);
94
+ - HTML-поля: `html_field_content`, `html_field_click_link`, `html_field_input` (API тест-клиента) и живые страницы `html_pages`, `html_text`, `html_query`, `html_click`, `html_type`, `html_wait`, `html_console` (через `mcp_1c.html_agent`); `html_download` (файл по ссылке страницы, запросом изнутри страницы); `html_eval` (произвольный JavaScript) и `dev_eval` (произвольный BSL) регистрируются только с `--dev-tools` / `ONEC_MCP_DEV_TOOLS=1` (`DEV_TOOL_NAMES`, `_register_dev_tools`);
95
95
  - доказательная запись: `recording_start`, `recording_capture`, `recording_stop`;
96
96
  - RAG: `rag_source_add`, `rag_sources_add_from_directory`, `rag_source_roots_list`, `rag_sources_list`, `rag_available_configurations`, `rag_snapshot_create`, `rag_snapshots_list`, `rag_index_build`, `rag_lookup_object`, `rag_query`, `rag_session_autoconfigure`.
97
97
 
@@ -119,6 +119,8 @@ Windows-аналог Xvfb: скрытые рабочие столы (`CreateDesk
119
119
 
120
120
  ### `mcp_1c.html_agent`
121
121
 
122
+ Режим задаёт `start_session(html_mode=...)` (`resolve_mode`): `auto` — `remote` на Linux, а на Windows `HtmlInspector.check_platform` выбирает `patched`, если в Web Inspector платформы клиента установлен актуальный мост, иначе `console`; `console` и `patched` — только Windows, `remote` — только Linux. На Linux `console` отклоняется: клавиши через XTEST уходят в элемент с фокусом, а встроенный инспектор WebKitGTK — не отдельное окно X11, поэтому загрузчик попал бы в саму страницу. `patched` на Linux подставляет через `G_RESOURCE_OVERLAYS` файл `Localizations/en.lproj/localizedStrings.js` интерфейса инспектора (пустой словарь строк — интерфейс показывает английские ключи — плюс конфиг и `LINUX_BRIDGE_JS`, который учитывает домен `Target`); фокус в поле ставит `activate_field` клиента тестирования (`_HtmlFieldDriver` в `mcp_1c.server`), клавишу отправляет `xdotool`. `disabled` не запускает мост. Явно выбранный режим строгий: `patched` без актуального моста в платформе отклоняется ещё до запуска клиента (`HtmlInspector.check_platform`), а при сбое подключения нет отката на другой режим.
123
+
122
124
  Мост к живым страницам HTML-полей. API тест-клиента отдаёт только HTML, с которым страница загрузилась, поэтому для страниц, которые рисуют себя скриптами, Answer42 работает со встроенным WebKit клиента напрямую. Операции над страницей — одна самодостаточная ES5-функция `OPS_JS` (`info`, `text`, `html`, `query`, `click`, `type`, `eval`, `hook_console`, `console`, `check_scripts`), которая выполняется в странице и возвращает JSON. `HtmlInspector` — состояние моста сессии: страницы `p1`, `p2`, …, выбор страницы, ошибки подключения.
123
125
 
124
126
  ```mermaid
@@ -136,11 +138,11 @@ flowchart LR
136
138
  end
137
139
  ```
138
140
 
139
- **Windows.** Встроенный WebKit (старый Windows-порт WebKit1) не имеет сервера удалённой отладки, но в нём включены developer extras. `find_webviews` перечисляет окна `WebViewWindowClass` процесса тест-клиента (на скрытом рабочем столе — через `EnumDesktopWindows`). Для каждого нового WebView Answer42 отправляет Ctrl+Alt+Shift+F12. Модификаторы попадают в состояние клавиатуры потока окна (`AttachThreadInput` + `SetKeyboardState`), а сами клавиши отправляются `SendMessageTimeout`: вызов возвращается, когда окно обработало сообщение, поэтому паузы не нужны (`SendInput` на скрытый рабочий стол не доходит). 1С встраивает интерфейс инспектора в форму ещё одним WebView; всё, что появилось после горячей клавиши, запоминается как интерфейс инспектора и само не инспектируется. Признак того, что интерфейс загрузился, — заголовок скрытого окна `WebInspectorWindowClass`: WebKit меняет его на «Web Inspector — <адрес>», когда интерфейс сообщает адрес страницы (около 1,4 с после горячей клавиши).
141
+ **Windows.** Встроенный WebKit (старый Windows-порт WebKit1) не имеет сервера удалённой отладки, но в нём включены developer extras. `find_webviews` перечисляет окна `WebViewWindowClass` процесса тест-клиента (на скрытом рабочем столе — через `EnumDesktopWindows`). Для каждого нового WebView Answer42 отправляет Ctrl+Alt+Shift+F12. Модификаторы попадают в состояние клавиатуры потока окна (`AttachThreadInput` + `SetKeyboardState`), а сами клавиши отправляются `SendMessageTimeout`: вызов возвращается, когда окно обработало сообщение, поэтому паузы не нужны (`SendInput` на скрытый рабочий стол не доходит). 1С встраивает интерфейс инспектора в форму ещё одним WebView; всё, что появилось после горячей клавиши, запоминается как интерфейс инспектора и само не инспектируется. Если за 3 с интерфейс инспектора не появился, клавиша нажимается снова (`HOTKEY_REPEAT_SECONDS`; повторное нажатие безопасно — инспектор открывается один); если WebView поля за это время исчезло (клиент пересоздал поле), `open_inspectors` сразу делает второй проход по актуальному списку WebView. Признак того, что интерфейс загрузился, — заголовок скрытого окна `WebInspectorWindowClass`: WebKit меняет его на «Web Inspector — <адрес>», когда интерфейс сообщает адрес страницы (около 1,4 с после горячей клавиши).
140
142
 
141
143
  Дальше `_type_into_console`: `WM_SETFOCUS` делает интерфейс инспектора активным для WebKit, не трогая фокус внутри его документа; Ctrl+Alt+C открывает вкладку Console, которая сама ставит фокус в строку ввода (инспектор запоминает вкладку). На вкладку Elements ввод попадать не должен: её дерево DOM забирает фокус, когда догружается, и набранные в нём клавиши, особенно Enter, правят DOM страницы. Esc тоже нельзя — его первой обрабатывает 1С и закрывает форму. Загрузчик `loader_js` (около 110 символов) вводится за комментарием `//`: автодополнение консоли асинхронно отвечает на набранный код и может заменить набранное после него, но внутри комментария не срабатывает. Home и два Delete снимают `//`, Enter выполняет строку. Загрузчик открывает WebSocket с одноразовым токеном в адресе, сервер в ответ присылает `PAGE_BRIDGE_JS`, который выполняет присланные выражения через `eval`. Подключение к странице занимает около 2–3 секунд; время по этапам — в `last_connect` статуса моста. Мост живёт в странице: после перезагрузки следующий вызов вводит загрузчик заново.
142
144
 
143
- **Windows, мост в инспекторе платформы** (`mcp_1c.webkit_patch`, необязательно). `install` дописывает в `WebKit.resources\WebInspectorUI\Main.html` платформы `Answer42BridgeConfig.js` и `Answer42Bridge.js` (исходный `Main.html` сохраняется рядом). Каталог в Program Files доступен на запись только администратору, поэтому модуль перезапускает себя с повышением прав (`ShellExecuteEx` с `runas`, одно подтверждение UAC на все платформы) и выдаёт текущему пользователю право менять `Answer42BridgeConfig.js` (`icacls`). Перед тем как открыть инспектор, сессия записывает в этот файл свой порт и одноразовый токен (под файловой блокировкой: платформу могут делить несколько сессий) и очищает его сразу после. Мост в интерфейсе инспектора подключается к `HtmlInspector` по пути `/answer42-inspector/<токен>`, отправляет в бэкенд сообщения протокола с id от `BRIDGE_BASE_ID` и возвращает ответы на них, а также копии `Console.messageAdded`; остальное идёт в обычный интерфейс инспектора. Операции над страницей — `Runtime.evaluate` с `returnByValue`; мост переживает перезагрузку страницы, а сообщения консоли видны с её загрузки. Если платформа не пропатчена, патч устарел или инспектор уже открыт, используется ввод в консоль.
145
+ **Windows, мост в инспекторе платформы** (`mcp_1c.webkit_patch`, необязательно). `install` дописывает в `WebKit.resources\WebInspectorUI\Main.html` платформы `Answer42BridgeConfig.js` и `Answer42Bridge.js` (исходный `Main.html` сохраняется рядом). Каталог в Program Files доступен на запись только администратору, поэтому модуль перезапускает себя с повышением прав (`ShellExecuteEx` с `runas`, одно подтверждение UAC на все платформы) и выдаёт текущему пользователю право менять `Answer42BridgeConfig.js` (`icacls`). Перед тем как открыть инспектор, сессия записывает в этот файл свой порт и одноразовый токен (под файловой блокировкой: платформу могут делить несколько сессий) и очищает его сразу после. Мост в интерфейсе инспектора подключается к `HtmlInspector` по пути `/answer42-inspector/<токен>`, отправляет в бэкенд сообщения протокола с id от `BRIDGE_BASE_ID` и возвращает ответы на них, а также копии `Console.messageAdded`; остальное идёт в обычный интерфейс инспектора. Операции над страницей — `Runtime.evaluate` с `returnByValue`; мост переживает перезагрузку страницы, а сообщения консоли видны с её загрузки. Режим включается явно (`html_mode=patched`); если инспектор поля уже открыт без моста, его нужно закрыть.
144
146
 
145
147
  **Linux.** HTML-поля рисует системный WebKitGTK (`libwebkit2gtk-4.0`). `HtmlInspector.client_env()` добавляет тест-клиенту `WEBKIT_INSPECTOR_SERVER=127.0.0.1:<свободный порт>` (`runtime.start_test_client(extra_env=...)`). `RemoteInspectorClient` подключается к этому серверу как фронтенд: сообщения — размер (uint32 BE), флаг порядка байт, имя и параметры GVariant (`SetupInspectorClient`, `SetTargetList (ta(tsssb))`, `Setup (tt)`, `SendMessageToBackend (tts)`, `SendMessageToFrontend (tts)`). Каждая страница — цель `WebPage`; протокол инспектора мультиплексирован доменом `Target`, поэтому `Runtime.evaluate` уходит в `Target.sendMessageToTarget` текущей page-цели (она меняется при навигации, `Target.didCommitProvisionalTarget`). Домен `Console` включается на каждой page-цели, и WebKit отдаёт сообщения с момента загрузки страницы. Пустые скрытые страницы `about:blank` пропускаются. Некорректное сообщение может уронить клиент 1С, поэтому отправляются только перечисленные формы сообщений.
146
148
 
@@ -266,6 +268,7 @@ MCP-инструмент `rag_sources_add_from_directory(path, watch=true)` ищ
266
268
  | `ONEC_MCP_WS_HOST` | WebSocket host | `127.0.0.1` |
267
269
  | `ONEC_MCP_WS_PORT` | WebSocket port | `8765` |
268
270
  | `ONEC_MCP_REQUEST_TIMEOUT` | Таймаут запроса, сек | `60` |
271
+ | `ONEC_MCP_EXTERNAL_OPEN` | Linux: что делать с адресами и файлами, которые тест-клиент открывает через `xdg-open` (обёртка `runtime.external_open_env`): `auto` — на собственном Xvfb только записывать в `external_opens`, на настоящем дисплее ещё и открывать отдельно от клиента; `open`; `record`; `off` — без обёртки | `auto` |
269
272
  | `ONEC_MCP_WINDOWS_DESKTOP` | Windows: `hidden` — запускать менеджер и клиент 1С на скрытых рабочих столах сессии; `current` — на текущем рабочем столе | `current` |
270
273
  | `ONEC_MCP_DATA_DIR` | Рабочая директория | OS tempdir + `answer42` (`/tmp/answer42` on Linux, `%TEMP%\answer42` on Windows) |
271
274
  | `MCP_1C_RAG_DB` | Путь к RAG SQLite | `build/rag/onec-rag.sqlite` |
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "answer42"
3
- version = "0.7.0"
3
+ version = "0.8.1"
4
4
  description = "Answer42 — The Answer to Life, Universe, and 1C — UI Driver. MCP-powered 1C:Enterprise UI automation: click, fill, navigate, test, and introspect managed forms through the test-client API"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"