# πŸ“¦ @goodandready/dsh-vision-bridge

Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ Vision-мост для DeepSeek Harness: Ρ€Π°Π±ΠΎΡ‚Π° с изобраТСниями Π² Ρ‡Π°Ρ‚Π΅ с тСкстовыми модСлями

npm version license DSH Plugin Node version

ВсС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π°Π²Ρ‚ΠΎΡ€Π°

πŸ‡¬πŸ‡§ English β€’ πŸ‡·πŸ‡Ί Русский β€’ πŸ‡¨πŸ‡³ δΈ­ζ–‡θ―΄ζ˜Ž

⭐ Если Π²Π°ΠΌ нравится этот ΠΏΠ»Π°Π³ΠΈΠ½, ΠΏΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π΅ΠΌΡƒ Π·Π²Π΅Π·Π΄Ρƒ Π½Π° GitHub β€” это ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ ΠΌΠ½Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½ Π²Π°ΠΌ ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠΎΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ мСня Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ дальшС.

πŸ› Если Π²Ρ‹ нашли Π±Π°Π³ ΠΈΠ»ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», создайтС issue Π½Π° GitHub Π½Π° любом языкС β€” я Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€ΡŽ вашС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΈΠ΄Π΅ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… вСрсий ΠΏΠ»Π°Π³ΠΈΠ½Π°.
--- ## ⚑ ΠžΠ±Π·ΠΎΡ€ ΠΈ Ρ€Π΅ΡˆΠ°Π΅ΠΌΠ°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠŸΡ€ΠΈ ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΈ с чисто тСкстовыми Ρ‡Π°Ρ‚-модСлями (любой provider/model, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ тСкст) Π² **DeepSeek Harness** ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ прикрСплСния ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ: 1. Π’ **DSH 0.1.2-alpha.2+** ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ сСссий Π½Π° бэкСндС выполняСт ΡΡ‚Ρ€ΠΎΠ³ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΌΠΎΠ΄Π°Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ (`ctx.llm.resolveModelInfo`). Если Ρƒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³Π° Π² `inputModalities` отсутствуСт `'image'`, сСрвСр Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ отклоняСт запрос с ошибкой `session/attachment-invalid` (Β«Model does not support image inputΒ»). 2. ВСкстовыС Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Ρ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сырых Π±Π»ΠΎΠΊΠΎΠ² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ Π΄ΠΈΠ°Π»ΠΎΠ³ сбоСм. ### Как `dsh-vision-bridge` Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ `dsh-vision-bridge` выступаСт ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ прокси-мостом Π²Π½ΡƒΡ‚Ρ€ΠΈ срСды Cordis: * **Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ мост ΠΌΠΎΠ΄Π°Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ (v0.5.3+)**: ΠžΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ `ctx.llm.resolveModelInfo` ΠΈ `ctx.llm.listModels`, благодаря Ρ‡Π΅ΠΌΡƒ ядро сСссий DSH Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ для Π»ΡŽΠ±Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, ΠΊΠΎΠ³Π΄Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ vision-bridge. * **АвтоматичСская ΠΏΠΎΠ΄ΠΌΠ΅Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (`agent/pre-step` ΠΈ `llm/stream`)**: ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΡƒΡŽ vision-модСль (provider/model ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈΠ»ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ OpenAI-совмСстимый endpoint), ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ тСкстовоС описаниС ΠΈ подставляСт Π΅Π³ΠΎ Π² контСкст Π²ΠΈΠ΄Π° `[ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠΈΠ» ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. ОписаниС: ...]` для тСкстовой Ρ‡Π°Ρ‚-ΠΌΠΎΠ΄Π΅Π»ΠΈ. * **ΠŸΡ€ΡΠΌΠΎΠΉ пропуск (Native Passthrough)**: АвтоматичСски распознаСт ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ изобраТСния Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ описания. * **~40 спСциализированных инструмСнтов**: ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ инструмСнты OCR, Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска (grounding), Π°Π½Π°Π»ΠΈΠ·Π° UI, извлСчСния Ρ‚Π°Π±Π»ΠΈΡ†/Ρ„ΠΎΡ€ΠΌΡƒΠ», QR-ΠΊΠΎΠ΄ΠΎΠ², UI-flow ΠΈ консСнсуса. --- ## πŸ—οΈ АрхитСктура ```mermaid graph LR User["ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ отправляСт ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Web UI"] --> Gateway["DSH Session Controller"] Gateway --> BridgeCheck{"Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ мост (v0.5.3)"} BridgeCheck -->|"inputModalities + image"| SessionAllowed["Запрос принят шлюзом"] SessionAllowed --> Hook["Π₯ΡƒΠΊ agent/pre-step"] Hook --> CheckNative{"МодСль Ρ‡Π°Ρ‚Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ vision?"} CheckNative -->|"Π”Π° (Native Passthrough)"| NativeLLM["ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° сырого изобраТСния Π² LLM"] CheckNative -->|"НСт (ВСкстовая модСль)"| VisionRouter["ΠšΠ°Π½Π°Π»Ρ‹ Vision Bridge"] VisionRouter --> VisionModel["Vision-модСль\n(DSH / OpenAI / Ollama / Webhook)"] VisionModel --> Description["ГСнСрация описания ΠΈ OCR"] Description --> Rewrite["Π—Π°ΠΌΠ΅Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π½Π° тСкстовый ΠΌΠ°Ρ€ΠΊΠ΅Ρ€"] Rewrite --> ChatModel["ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΎΠ±ΠΎΠ³Π°Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ тСкста Π² модСль Ρ‡Π°Ρ‚Π°"] ChatModel --> Answer["ΠžΡ‚Π²Π΅Ρ‚ ассистСнта Π² Π²Π΅Π±-Ρ‡Π°Ρ‚Π΅"] ``` --- ## ✨ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ возмоТности ### 1. Π Π΅ΠΆΠΈΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ * **`hybrid` (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ)**: АвтоматичСскоС описаниС ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² Ρ‡Π°Ρ‚Π΅ + Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ~40 инструмСнтов для явных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π°Π³Π΅Π½Ρ‚ΠΎΠΌ. * **`llm`**: Волько Π°Π²Ρ‚ΠΎ-ΠΏΠΎΠ΄ΠΌΠ΅Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² контСкстС сообщСний; инструмСнты Ρ‚Π°ΠΊΠΆΠ΅ доступны для Π²Ρ‹Π·ΠΎΠ²Π°. * **`tools`**: Авто-ΠΏΠΎΠ΄ΠΌΠ΅Π½Π° Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π° β€” модСль Ρ‡Π°Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ `describe_image` ΠΈΠ»ΠΈ OCR инструмСнты. ### 2. Многоканальная ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ (Multi-Channel Fallback) Π¦Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… vision-ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² с автоматичСским ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈ сбоях (fallback) ΠΈ Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΎΠΊ (circuit breaker): * `dsh-catalog`: Автопоиск ΠΈΠ»ΠΈ явный Π²Ρ‹Π±ΠΎΡ€ vision-ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° DSH. * `openai-compatible`: Π›ΡŽΠ±Ρ‹Π΅ OpenAI-совмСстимыС API с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ vision (vLLM, SGLang, OpenRouter). * `ollama`: АвтообнаруТСниС ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ инфСрСнс Ρ‡Π΅Ρ€Π΅Π· Π»ΡŽΠ±ΡƒΡŽ vision-модСль, Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ Π² локальном Ollama. * `webhook` / `custom`: Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ HTTP/JSON-RPC сСрвисы. ### 3. ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ описаний (LRU Cache) ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΏΠΎ Ρ…ΡΡˆΡƒ `hash(Π±Π°ΠΉΡ‚Ρ‹ + ΠΏΡ€ΠΎΠΌΠΏΡ‚ + модСль + Ρ€Π΅ΠΆΠΈΠΌ)` экономит Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΠΈ ускоряСт ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Π΅ запросы ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ. ### 4. Набор инструмСнтов (~40 инструмСнтов) | ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ | Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ | НазначСниС | |---|---|---| | **Π‘Π°Π·ΠΎΠ²Ρ‹Π΅** | `describe_image`, `read_image`, `inspect_image` | Анализ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎ ID влоТСния, Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ ΠΈΠ»ΠΈ URL. | | **ГСомСтрия ΠΈ поиск** | `vision_ground`, `vision_crop`, `vision_detect`, `vision_compare`, `vision_present` | ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ bounding box (шкала 0–1000), дСтСкция ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΌΡƒΠ»ΡŒΡ‚ΠΈ-сравнСниС. | | **OCR ΠΈ тСкст** | `vision_ocr`, `vision_ocr_local`, `vision_long_ocr`, `vision_trace`, `vision_colors`, `vision_extract_foreground` | РаспознаваниС тСкста, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ„Ρ„Π»Π°ΠΉΠ½ Tesseract OCR, склСйка Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ΠΎΠ², вСкторизация SVG. | | **Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ·** | `vision_describe_structured`, `vision_vqa`, `vision_ui_layout`, `vision_translate_image` | Π’Ρ‹Π΄Π°Ρ‡Π° JSON (`{summary, ocr, layout, entities}`), ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π½Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ вопросы, Ρ€Π°Π·Π±ΠΎΡ€ вСрстки UI. | | **ΠŸΠΈΠΊΡΠ΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ** | `vision_pixel_diff`, `vision_quality_check` | БСмантичСскоС сравнСниС, ΠΎΡ†Π΅Π½ΠΊΠ° качСства (Ρ€Π΅Π·ΠΊΠΎΡΡ‚ΡŒ/ΠΎΡΠ²Π΅Ρ‰Ρ‘Π½Π½ΠΎΡΡ‚ΡŒ). | | **Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ Intelligence** | `vision_extract_formula`, `vision_extract_table`, `vision_scan_barcode`, `vision_extract_structured`, `vision_audit_accessibility` | Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΡƒΠ» Π² LaTeX, Ρ‚Π°Π±Π»ΠΈΡ† Π² Markdown/HTML, сканированиС QR/ΡˆΡ‚Ρ€ΠΈΡ…ΠΊΠΎΠ΄ΠΎΠ², JSON Schema экстрактор, Π°ΡƒΠ΄ΠΈΡ‚ доступности WCAG. | | **Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΈ, ΠšΠΎΠ½ΡΠ΅Π½ΡΡƒΡ ΠΈ ΠŸΠ°ΠΌΡΡ‚ΡŒ** | `vision_ui_flow`, `vision_consensus`, `vision_memory_search` | РСконструкция Π³Ρ€Π°Ρ„Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… сцСнариСв (User Journey / Mermaid), ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠΎΠ΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ консСнсус (устранСниС Π³Π°Π»Π»ΡŽΡ†ΠΈΠ½Π°Ρ†ΠΈΠΉ), сСмантичСский поиск ΠΏΠΎ памяти ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. | | **ВлоТСния (v0.5.33)** | `vision_attach_pages`, `vision_attach_frames`, `vision_attach_images` | ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΡŽΡ‚ страницы PDF, ΠΊΠ°Π΄Ρ€Ρ‹ Π²ΠΈΠ΄Π΅ΠΎ ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅/ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Π΅ изобраТСния ΠΊΠ°ΠΊ влоТСния Π² Π΄ΠΈΠ°Π»ΠΎΠ³ β€” Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‡Π°Ρ‚-модСль с Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ Π·Ρ€Π΅Π½ΠΈΠ΅ΠΌ смотрСла пиксСли сама. | --- ## πŸ“¦ Установка ```bash dsh plugin --profile web add @goodandready/dsh-vision-bridge ``` ПослС установки пСрСзапуститС Web UI. ΠšΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ° настроСк доступна Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ **Настройки β†’ ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹ β†’ vision-bridge**. --- ## βš™οΈ ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ (`settings.yaml`) ```yaml dsh-vision-bridge: # Π Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹: 'hybrid' | 'llm' | 'tools' mode: hybrid # ΠŸΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ ΠΈ модСль (пусто = Π°Π²Ρ‚ΠΎΠ²Ρ‹Π±ΠΎΡ€ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° DSH) visionProvider: "" visionModel: "" # ΠŸΡ€ΠΎΠΏΡƒΡΠΊ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ для Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… vision-ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ('prefer' | 'never' | 'always') nativePassthrough: prefer hideRedundantTools: true # ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ компСнсационныС инструмСнты, Ссли модСль ΠΈ Ρ‚Π°ΠΊ Π²ΠΈΠ΄ΠΈΡ‚ изобраТСния attachMaxItems: 8 # сколько страниц/ΠΊΠ°Π΄Ρ€ΠΎΠ²/Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ attach-Π²Ρ‹Π·ΠΎΠ² # LRU-ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ описаний cacheEnabled: true cacheMaxEntries: 200 # Π’Π°ΠΉΠΌΠ°ΡƒΡ‚ запроса Π² миллисСкундах timeoutMs: 120000 # Бписок Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² channels: [] channelFallback: sequential # 'sequential' | 'parallel-race' ``` ### ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ | ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | Π’ΠΈΠΏ | По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ | ОписаниС | |---|---|---|---| | `mode` | `string` | `"hybrid"` | Π Π΅ΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (`hybrid`, `llm`, `tools`). | | `visionProvider` | `string` | `""` | ID vision-ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π° (пусто = Π°Π²Ρ‚ΠΎ-Π²Ρ‹Π±ΠΎΡ€). | | `visionModel` | `string` | `""` | ID vision-ΠΌΠΎΠ΄Π΅Π»ΠΈ (пусто = Π°Π²Ρ‚ΠΎ-Π²Ρ‹Π±ΠΎΡ€). | | `nativePassthrough` | `string` | `"prefer"` | ПовСдСниС для ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ с Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ Π·Ρ€Π΅Π½ΠΈΠ΅ΠΌ (`prefer`, `never`, `always`). | | `hideRedundantTools` | `boolean` | `true` | Π‘ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ компСнсационныС инструмСнты Ρƒ Π°Π³Π΅Π½Ρ‚Π°, Ρ‡ΡŒΡ модСль ΠΈ Ρ‚Π°ΠΊ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ изобраТСния; ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ инструмСнты. | | `attachMaxItems` | `number` | `8` | Бколько ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ² `vision_attach_*` (страницы PDF, ΠΊΠ°Π΄Ρ€Ρ‹ Π²ΠΈΠ΄Π΅ΠΎ, Ρ„Π°ΠΉΠ»Ρ‹). Жёсткий ΠΏΠΎΡ‚ΠΎΠ»ΠΎΠΊ 32. | | `cacheEnabled` | `boolean` | `true` | Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ LRU-кэш описаний. | | `cacheMaxEntries` | `number` | `200` | ΠŸΡ€Π΅Π΄Π΅Π» числа записСй Π² памяти. | | `timeoutMs` | `number` | `120000` | Π’Π°ΠΉΠΌΠ°ΡƒΡ‚ выполнСния Π² миллисСкундах. | | `channelFallback` | `string` | `"sequential"` | ΠœΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠ°Π½Π°Π»ΠΎΠ² (`sequential`, `parallel-race`); порядок β€” Ρ‡Π΅Ρ€Π΅Π· `channelOrderMode`. | --- ### 15. πŸ›‘οΈ Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΈ интСграция с ядром (`v0.5.27`) * **ΠœΠ°ΡΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСкрСтов**: Π­Π½Π΄ΠΏΠΎΠΈΠ½Ρ‚ `GET /channels` маскируСт API-ΠΊΠ»ΡŽΡ‡ΠΈ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² (`sk-p...7890` ΠΈΠ»ΠΈ `********`) ΠΈ ΠΎΡ‚Π΄Π°Ρ‘Ρ‚ Ρ„Π»Π°Π³ `hasApiKey: true`. ΠŸΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ маски ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· `POST /channels` ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ сохраняСтся Π±Π΅Π· пСрСзаписи. * **Π“Π°Ρ€Π΄ ΠΎΡ‚ CSRF ΠΈ мСТсайтовых Π°Ρ‚Π°ΠΊ**: ВсС ΠΌΡƒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈ ΠΏΠ»Π°Ρ‚Π½Ρ‹Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ (`/config`, `/channels`, `/upload-pdf`, `/test`, `/bench`, `/batch`, `DELETE /journal`, `DELETE /cache`, `/doctor?probe=1`) ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `sec-fetch-site` Ρ‡Π΅Ρ€Π΅Π· `isTrustedSettingsRequest` ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ cross-site Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠΌ `403 Forbidden: same-origin only`. ΠžΡ‚Ρ‡Ρ‘Ρ‚ `GET /doctor` ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ статичСский (Π±Π΅Π· ΠΏΡ€ΠΎΠ± ΠΊΠ°Π½Π°Π»ΠΎΠ²). * **SSRF-ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°**: URL-источники, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ модСлью, ΡΠΊΠ°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· `safeFetch` β€” Π½Π΅-http(s) схСмы, localhost-ΠΈΠΌΠ΅Π½Π° ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅/loopback/link-local хосты (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ IPv4-mapped IPv6 ΠΈ NAT64) ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΡΡŽΡ‚ΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚Π΅; Ρ‚Π΅Π»Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹. `allowedUrlHosts` β€” явный allowlist Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ эндпоинта. * **apiKeyRef**: ΠΊΠ°Π½Π°Π» ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° credential/env-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ПО Π˜ΠœΠ•ΠΠ˜ вмСсто ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ `apiKey` Π² настройках; Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСзолвится Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π°. `GET /channels` ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ маскируСт значСния; сохранСниС маскированных ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΌΠ°Ρ‚Ρ‡ΠΈΠ½Π³ΠΎΠΌ ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ ΠΊΠ°Π½Π°Π»Π°. * **ΠŸΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ Ρ‡Π΅ΡΡ‚Π½ΠΎΡΡ‚ΡŒ**: настройки `maskPII`, `stripEXIF`, `auditLog`, `consensusEnabled` Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ end-to-end; Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ Π±Π»ΡŽΡ€Π° Π»ΠΈΡ† / NSFW / Ρ‚Π°ΠΉΠ»ΠΈΠ½Π³Π° ΠΈ пустыС прСсСты ΡƒΠ΄Π°Π»Π΅Π½Ρ‹. * **РСактивная привязка ΠΊ settingsScope**: ΠšΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ° настроСк Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ связываСтся со стандартным сСрвисом ядра `ctx.settingsScope.bind({ namespace: 'dsh-vision-bridge' })` со ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡΠΌΠΈ ΡΠ½Π°ΠΏΡˆΠΎΡ‚ΠΎΠ². --- ## πŸ“ ИзмСнСния Π² v0.5.30 Π Π΅Π»ΠΈΠ· бСзопасности ΠΈ чСстности. ΠšΡ€Π°Ρ‚ΠΊΠΎ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ: * **SSRF-ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°**: URL-источники, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ модСлью (`describe_image` urls, `inspect_image`, headless-chrome инструмСнты), ΡΠΊΠ°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· слой ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ β€” Π½Π΅-http(s) схСмы, localhost-ΠΈΠΌΠ΅Π½Π° ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅/loopback/link-local хосты (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ IPv4-mapped IPv6 ΠΈ NAT64) ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΡΡŽΡ‚ΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚Π΅; Ρ‚Π΅Π»Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹. Новая настройка `allowedUrlHosts` (Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ hostname-allowlist) Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ доступ ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌΡƒ эндпоинту. * **`apiKeyRef`**: ΠΊΠ°Π½Π°Π»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° credential-сСрвис ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния ПО Π˜ΠœΠ•ΠΠ˜ β€” ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ `apiKey` Π² `settings.yaml` большС Π½Π΅ трСбуСтся. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ inline-ΠΊΠ»ΡŽΡ‡ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ; сохранСниС маскированных ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΌΠ°Ρ‚Ρ‡ΠΈΠ½Π³ΠΎΠΌ ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ ΠΊΠ°Π½Π°Π»Π°, Π° Π½Π΅ ΠΏΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. * **Π“Π°Ρ€Π΄Ρ‹ Ρ€ΠΎΡƒΡ‚ΠΎΠ²**: `POST /bench`, `POST /batch`, `DELETE /batch/:id`, `DELETE /journal`, `DELETE /cache` Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ same-origin, ΠΊΠ°ΠΊ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΡƒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹. `GET /doctor` ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ статичСский; ΠΏΡ€ΠΎΠ±Ρ‹ ΠΊΠ°Π½Π°Π»ΠΎΠ² β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с `?probe=1` (Π½ΡƒΠΆΠ΅Π½ same-origin). * **Π§Π΅ΡΡ‚Π½ΠΎΡΡ‚ΡŒ настроСк**: `maskPII`, `stripEXIF`, `auditLog`, `consensusEnabled` Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ end-to-end. Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ `blurFaces`, `nsfwFilter`, `tileLargeImages`/`tileThreshold` ΠΈ пустыС прСсСты Local/Cloud/LM Studio ΡƒΠ΄Π°Π»Π΅Π½Ρ‹. Changed in v0.5.30: Ссли Π²Ρ‹ Π½Π° Π½ΠΈΡ… рассчитывали β€” эффСкта Ρƒ Π½ΠΈΡ… Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π»ΠΎ. * **Английский β€” исходный язык**: всС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ строки Π½Π° английском; Π·Π°ΡˆΠΈΡ‚Ρ‹ΠΉ русский ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΡƒΠ΄Π°Π»Ρ‘Π½ β€” русский Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Π°Ρ‘Ρ‚ translation-ΠΏΠ»Π°Π³ΠΈΠ½. * **Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ядра**: чистоС ядро (схСма ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° + Ρ…Π΅Π»ΠΏΠ΅Ρ€Ρ‹) ΠΏΠ΅Ρ€Π΅Π΅Ρ…Π°Π»ΠΎ Π² `lib/vision-core.js`; `lib/index.js` Ρ€Π΅-экспортируСт Π΅Π³ΠΎ β€” Π±Π΅Π· измСнСния API. Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π° рСгрСссия v0.5.13 с пустым ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠΌ `describe_image`; снова Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ `vision_annotate`; pHash-кэш большС Π½Π΅ ΠΏΡƒΡ‚Π°Π΅Ρ‚ ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ изобраТСния. --- ## πŸ“ ИзмСнСния Π² v0.5.31 ВСхничСский Ρ€Π΅Π»ΠΈΠ· β€” Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ повСдСния. * **ВнутрСнняя структура**: рСгистрации инструмСнтов пСрСнСсСны Π² Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ `lib/tools/*` (core / grounding / ocr / document / analysis / media); `lib/index.js` Ρ€Π΅-экспортируСт всё ΠΊΠ°ΠΊ Ρ€Π°Π½ΡŒΡˆΠ΅. Π€Π°ΠΉΠ»Ρ‹ мСньшС, зависимости хоста ΠΈ Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² явныС. * **Π£ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠΈ настроСк**: отказоустойчивая рСгистрация Π»ΠΎΠΊΠ°Π»ΠΈ, ΡƒΠ±Ρ€Π°Π½ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ sidebar-fallback, доступ ΠΊ сСрвисам ΠΏΠ»Π°Π³ΠΈΠ½Π° Ρ‡Π΅Ρ€Π΅Π· Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ `ctx.get`, `/config` ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΏΠΎΠ»Π΅ΠΉ (`cacheMaxEntries`, `channelFallback`). --- ## πŸ“ ИзмСнСния Π² v0.5.32 Π Π΅Π»ΠΈΠ· ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹. * **ВнутрСнняя структура**: рСгистрации ~44 инструмСнтов пСрСнСсСны Π² Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ `lib/tools/*` (core / grounding / ocr / document / analysis / media) с явными зависимостями; `lib/index.js` остаётся Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π²Ρ…ΠΎΠ΄Π° хоста. * **Ѐиксы ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ**: Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½Π½Ρ‹Π΅ Π±Π°Ρ‚Ρ‡ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· 10 ΠΌΠΈΠ½ΡƒΡ‚ (устранён рост памяти); `/upload-pdf` отклоняСт payload Π²Ρ‹ΡˆΠ΅ Π½ΠΎΠ²ΠΎΠΉ настройки `maxPdfBytes` (20 ΠœΠΈΠ‘ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) вмСсто Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚Π΅Π»; `vision_memory_search` ΠΈΡ‰Π΅Ρ‚ ΠΏΠΎ собствСнному описанию ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Ρ‚Ρ‚Π°Ρ‡ΠΌΠ΅Π½Ρ‚Π° (Ρ€Π°Π½ΡŒΡˆΠ΅ всС совпадали ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ); ΠΌΡ‘Ρ€Ρ‚Π²Ρ‹ΠΉ ΠΊΠΎΠ΄ хоста ΡƒΠ΄Π°Π»Ρ‘Π½; ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΆΡƒΡ€Π½Π°Π»Π° согласованы ΠΌΠ΅ΠΆΠ΄Ρƒ путями. * **Настройки**: новая `maxPdfBytes` (Тёсткий Π»ΠΈΠΌΠΈΡ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ PDF). ## πŸ“ ИзмСнСния Π² v0.5.33 Π Π΅Π»ΠΈΠ· Π² сторону Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ зрСния: мост Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с тСкстовыми модСлями, Π½ΠΎ ΠΈ с Ρ‚Π΅ΠΌΠΈ, ΠΊΡ‚ΠΎ Π²ΠΈΠ΄ΠΈΡ‚ изобраТСния сам. * **Attach-Π΄ΠΎΠΌΠ΅Π½ (`vision_attach_pages`, `vision_attach_frames`, `vision_attach_images`)**: страницы PDF, Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π΄Ρ€Ρ‹ Π²ΠΈΠ΄Π΅ΠΎ ΠΈ изобраТСния ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΈ ΠΏΠΎ URL ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΡŽΡ‚ΡΡ **влоТСниями Π² Π΄ΠΈΠ°Π»ΠΎΠ³**, поэтому модСль с Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ Π·Ρ€Π΅Π½ΠΈΠ΅ΠΌ смотрит пиксСли сама, Π° Π½Π΅ ΠΏΠ»Π°Ρ‚ΠΈΡ‚ Π·Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ vision-Π²Ρ‹Π·ΠΎΠ². КаТдоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ сТимаСтся ΠΏΠΎ настройкам `imageMaxWidth`/`imageMaxHeight`/`imageQuality` ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ `maxImageBytes`; для URL дСйствуСт Ρ‚Π° ΠΆΠ΅ SSRF-ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°, для Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡƒΡ‚Π΅ΠΉ β€” `allowedImageDirs`. * **Π’Ρ‹Π΄Π°Ρ‡Π° инструмСнтов ΠΏΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈ**: Π½Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π΅, Π³Π΄Π΅ Ρ‡Π°Ρ‚-модСль ΠΈ Ρ‚Π°ΠΊ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ изобраТСния, компСнсационныС инструмСнты моста ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ Π°Π³Π΅Π½Ρ‚Π° (ΠΎΠ½ΠΈ Π΅ΠΌΡƒ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹) ΠΈ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅; Π½Π° тСкстовом ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π΅ вмСсто Π½ΠΈΡ… ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ attach-инструмСнты, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ такая модСль влоТСния Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚. ПовСдСниСм управляСт новая настройка `hideRedundantTools` (Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ). * **НовыС настройки Π² ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ΅**: Π³Ρ€ΡƒΠΏΠΏΠ° **Attachments** ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ `attachMaxItems` (Ρ†Π΅Π»ΠΎΠ΅ 1–32, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 8 β€” сколько ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ²) ΠΈ `hideRedundantTools`. Оба поля ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ сохранСнии, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π½Π΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° отклоняСтся с понятным сообщСниСм. Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ Π² ΠΆΠΈΠ²ΠΎΠΉ снимок настроСк, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€ΠΎΡƒΡ‚. * **Batch API**: `DELETE /batch/:id` освобоТдаСт Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½Π½Ρ‹ΠΉ batch сразу, ΠΏΠΎΠ΄ Ρ‚ΠΎΠΉ ΠΆΠ΅ same-origin Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ, Ρ‡Ρ‚ΠΎ start/cancel. Π’Π°ΠΉΠΌΠ΅Ρ€ TTL записи batch большС Π½Π΅ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠΉ процСсс β€” Π½Π°Π±ΠΎΡ€ тСстов сократился с 10 ΠΌΠΈΠ½ΡƒΡ‚ Π΄ΠΎ ~3,5 сСкунд. * **Π Π΅ΠΆΠΈΠΌ tools**: изобраТСния, ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Ρ‘Π½Π½Ρ‹Π΅ Π² Ρ‡Π°Ρ‚Π΅, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄ΠΎ Π³Π΅ΠΉΡ‚Π° санитайзинга, поэтому инструмСнты ΠΏΠΎ ID влоТСния (ΠΈ алиас `read_image`) Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ `tools`; Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Ρ‚Π°ΠΌ Π±Ρ‹Π»ΠΈ нСдоступны. * **Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡ**: ΠΎΠ΄ΠΈΠ½ Π½Π΅Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ источник большС Π½Π΅ ΠΎΠ±Ρ€Ρ‹Π²Π°Π΅Ρ‚ `vision_attach_images` β€” ΠΎΠ½ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² `Skipped N: <имя>: <ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°>`, Π° Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹Π΅ источники ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»ΡΡŽΡ‚ΡΡ; ΠΎΡ‚ΠΊΠ°Π· fetch-ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ остаётся Тёсткой ошибкой. ВСкстовый слой PDF Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ появляСтся (`pdftotext` Π½Π΅ опрСдСлялся, ΠΈ слой ΠΌΠΎΠ»Ρ‡Π° Π½Π΅ отдавался). ΠžΠ±Ρ€Π΅Π·ΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° страниц ΠΈΠ»ΠΈ числа ΠΊΠ°Π΄Ρ€ΠΎΠ² Π»ΠΈΠΌΠΈΡ‚ΠΎΠΌ отраТаСтся Π² `truncated` ΠΈ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠΈ. * **Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅**: CI ставит poppler Π±Π΅Π· `sudo`, ΠΈΠ΄Ρ‘Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ³ΠΎΠ½ Π½Π° ΠΊΠΎΠΌΠΌΠΈΡ‚, сСриализация ΠΏΠΎ ref ΠΈ установка ffmpeg для ΠΊΠ°Π΄Ρ€ΠΎΠ²Ρ‹Ρ… тСстов; Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ появился шаблон PR ΠΈ ΠΈΠ³Π½ΠΎΡ€ `.worktrees/`. --- ## πŸ“ ИзмСнСния Π² v0.6.0 ΠšΡ€ΡƒΠΏΠ½Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ· ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ, надёТности ΠΈ инфраструктуры ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°. * **One-Click Π°Π²Ρ‚ΠΎΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· настроСк**: Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ эндпоинт `/api/dsh-vision-bridge/update` ΠΈ Π±Π»ΠΎΠΊ управлСния Π² ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ΅ настроСк (`UpdaterBlock` Π² `settings.plugin.item`). ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсии Π² npm, ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΡŽ процСсса ΠΈ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ пСрСзапускС с Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ ΠΎΡ‚ ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (loopback ΠΈ CSRF origin gates). * **УстранСниС пустых catch ΠΈ ΠΎΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ**: устранСны всС 76 Π½Π΅Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… пустых Π±Π»ΠΎΠΊΠΎΠ² catch Π² ядрС ΠΈ инструмСнтах. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ…Π΅Π»ΠΏΠ΅Ρ€ `bestEffort(label, fn, fallback)` для бСзопасных ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, явная ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (`smartOptimizeImage` Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ `preprocessed: boolean` ΠΈ `warnings: string[]`), Π° Ρ‚Π°ΠΊΠΆΠ΅ прозрачная фиксация Π΄Π΅Π³Ρ€Π°Π΄Π°Ρ†ΠΈΠΈ. * **Π¦Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ scoped-ΠΈΠΌΠ΅Π½ΠΈ**: скоуп `@goodandready/dsh-vision-bridge` строго синхронизирован Π² манифСстС `package.json`, ΠΏΠ°Ρ‚Ρ‡Π΅ `cordis.patch.yml`, Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… ядра `vision-core.js`. * **Π£ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ бСзопасности настроСк**: ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ измСнСния настроСк ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Ρ‘Π½ Π½Π° строгий fail-closed Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ (`isTrustedSettingsRequest`), ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰ΠΈΠΉ loopback-источник, CSRF-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈ Bearer-Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, отклоняя Π»ΡŽΠ±Ρ‹Π΅ ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ внСшниС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ. * **ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚Π΅ΠΌΡ‹ DSH**: стили клиСнтских ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈ диагностичСских экранов ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Ρ‹ Π½Π° Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π΄ΠΈΠ·Π°ΠΉΠ½-систСмы DSH (`--dsw-alias-*`), устранСны Ρ…Π°Ρ€Π΄ΠΊΠΎΠ΄-Ρ†Π²Π΅Ρ‚Π°. * **Банитизация ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅Π»ΠΈΠ·Π°**: Π²Π½Π΅Π΄Ρ€Ρ‘Π½ reproducible ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ (`publish.sh`) ΠΈ `.gitattributes` Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹, Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ отсутствиС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π² ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΌ GitHub ΠΈ npm. --- ## πŸ“ ИзмСнСния Π² v0.6.2 Π Π΅Π»ΠΈΠ· надёТности, прозрачности ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ видимости Π΄Π΅Π³Ρ€Π°Π΄Π°Ρ†ΠΈΠΈ. * **РСальноС Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ bestEffort**: устранСны всС Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ `/* bestEffort ... */ void err`; сбои Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· `bestEffort(label, fn)` Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ `console.debug`. * **ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΎ Π΄Π΅Π³Ρ€Π°Π΄Π°Ρ†ΠΈΠΈ (warnings)**: всС инструмСнты ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ `warnings: string[]` Π² схСмах `output.schema` ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ прСдупрСТдСния ΠΏΡ€ΠΈ сбоях парсинга JSON ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚Π°Ρ… Π½Π° сырой Π²Ρ‹Π²ΠΎΠ΄. * **ΠŸΡ€ΠΎΠ±Ρ€ΠΎΡ сбоСв ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ**: ошибки этапов deskew, enhance, stripEXIF ΠΈ compressImage ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ инструмСнтам Π² Π²ΠΈΠ΄Π΅ `warnings`. * **ВСстовый ΡΡŒΡŽΡ‚**: Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π½Π°Π±ΠΎΡ€ тСстов `test/issue-314-besteffort-warnings.test.js`, ΠΎΠ±Ρ‰Π΅Π΅ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ выросло Π΄ΠΎ 329 тСстов (104 ΡΡŒΡŽΡ‚Π°, 0 fail). --- ## πŸ“„ ЛицСнзия MIT Β© [GooDAnDReaDY](https://github.com/GooDAnDReaDY)