# πŸ“¦ @goodandready/dsh-key-limits

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π»ΠΈΠΌΠΈΡ‚ΠΎΠ² ΠΊΠ²ΠΎΡ‚, Ρ‚Π°Ρ€ΠΈΡ„Π½Ρ‹Ρ… ΠΏΠ»Π°Π½ΠΎΠ² ΠΈ балансов API-ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для DeepSeek Harness

npm version license DSH Plugin Node version

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

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

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

πŸ› Если Π²Ρ‹ нашли Π±Π°Π³ ΠΈΠ»ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, создайтС Issue Π½Π° GitHub Π½Π° любом языкС β€” я Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€ΡŽ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… вСрсий ΠΏΠ»Π°Π³ΠΈΠ½Π°.
--- ## ⚑ ΠžΠ±Π·ΠΎΡ€ ΠΈ Ρ€Π΅ΡˆΠ°Π΅ΠΌΠ°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ исслСдоватСли искусствСнного ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚Π° рСгулярно Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с дСсятком Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² LLM, ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ ΠΊΠ²ΠΎΡ‚Π°ΠΌΠΈ ΠΈ Ρ‚Π°Ρ€ΠΈΡ„Π½Ρ‹ΠΌΠΈ подписками ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ (OpenCode GO, Ollama Cloud, Qwen Cloud, Kimi, GLM, MiniMax, Cline, DeepSeek, OpenRouter, Command Code). Π‘Π΅Π· наглядного ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΊΠ²ΠΎΡ‚ нСпосрСдствСнно Π² DeepSeek Harness (DSH): - БСссии Π΄ΠΈΠ°Π»ΠΎΠ³Π° Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ ΠΏΠ°Π΄Π°ΡŽΡ‚ с ошибками посрСди Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°, ΠΊΠΎΠ³Π΄Π° 5-часовоС ΠΎΠΊΠ½ΠΎ ΠΈΠ»ΠΈ мСсячный Π»ΠΈΠΌΠΈΡ‚ ΠΊΡ€Π΅Π΄ΠΈΡ‚ΠΎΠ² исчСрпан. - ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚, ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡ привязан ΠΊ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ‡Π°Ρ‚Π°. - ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ дСсяткам Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² ΠΎΡ‚Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹. `dsh-key-limits` Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту Π·Π°Π΄Π°Ρ‡Ρƒ, обСспСчивая нСнавязчивый Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ остатков ΠΊΠ²ΠΎΡ‚ ΠΈ балансов прямо Π² Π²Π΅Π±-интСрфСйсС DSH. Плагин Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΉ бухгалтСрский ΡƒΡ‡Ρ‘Ρ‚ ΠΈ тяТСлыС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… расходов, Ρ„ΠΎΠΊΡƒΡΠΈΡ€ΡƒΡΡΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° ΠΆΠΈΠ²ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ Π»ΠΈΠΌΠΈΡ‚ΠΎΠ². --- ## πŸ—οΈ АрхитСктура ΠΈ схСма двиТСния Π΄Π°Π½Π½Ρ‹Ρ… ```mermaid graph LR subgraph Client ["ΠšΠ»ΠΈΠ΅Π½Ρ‚ Web UI (DSH)"] FC["FloatChip (ΠŸΠ»Π°Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ‡ΠΈΠΏ)"] CB["ActiveKeyButton (Кнопка Π² строкС Π²Π²ΠΎΠ΄Π°)"] SC["ΠšΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ° настроСк (settings.plugin.item)"] M["ΠœΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΊΠ½Π° (ВсС Π»ΠΈΠΌΠΈΡ‚Ρ‹ / Активный ΠΊΠ»ΡŽΡ‡)"] end subgraph Backend ["БэкСнд ΠΏΠ»Π°Π³ΠΈΠ½Π° (Cordis)"] Router["HTTP API (/dsh-key-limits)"] CredStore["Π—Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…"] Updater["Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ One-Click Updater"] end subgraph Providers ["ΠŸΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹ ΠΈ РССстры"] P1["OpenCode GO / Ollama / Qwen"] P2["Command Code / Cline / GLM"] P3["DeepSeek / OpenRouter / MiniMax"] NPM["РССстр npmjs.org"] end FC -->|Клик| M CB -->|Клик| M M -->|ΠžΠΏΡ€ΠΎΡ ΠΊΠ²ΠΎΡ‚ Ρ€Π°Π· Π² 60с| Router SC -->|Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ| Router SC -->|ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° обновлСния| Updater Router --> CredStore Router -->|ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ опрос (Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ 12с)| P1 Router -->|ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ опрос (Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ 12с)| P2 Router -->|ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ опрос (Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ 12с)| P3 Updater -->|ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° вСрсий ΠΈ установка| NPM ``` --- ## ✨ Π˜ΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π±ΠΎΡ€ возмоТностСй ### 1. ΠŸΠ»Π°Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ‡ΠΈΠΏ (`FloatChip`) - **ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€**: ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΉΡΡ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ ΠΊΠ²ΠΎΡ‚Ρ‹ срСди всСх ΠΊΠ»ΡŽΡ‡Π΅ΠΉ (ΠΈΠ»ΠΈ ΠΎΠ±Ρ‰Π΅Π΅ число Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ²). - **Π‘Π²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ с Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ ΠΎΡ‚ Π²Ρ‹Π»Π΅Ρ‚Π°**: пСрСтаскиваСтся ΠΌΡ‹ΡˆΡŒΡŽ ΠΈ ТСстами с Π°Π²Ρ‚ΠΎΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π³Ρ€Π°Π½ΠΈΡ†Π°ΠΌΠΈ ΠΎΠΊΠ½Π° (`viewport clamping`). ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² `localStorage`. - **Окно всСх Π»ΠΈΠΌΠΈΡ‚ΠΎΠ²**: ΠΊΠ»ΠΈΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ список всСх 9 Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² с полосами заполнСния, Π΄Π°Ρ‚Π°ΠΌΠΈ сброса ΠΈ Ρ‚Π°Ρ€ΠΈΡ„Π°ΠΌΠΈ. ### 2. Кнопка Π² строкС Π²Π²ΠΎΠ΄Π° сообщСний (`ActiveKeyButton`) - ВстроСна Π² панСль Π²Π²ΠΎΠ΄Π° сообщСний (`conversation.composer.bar`, ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ 10). - АвтоматичСски инспСктируСт модСль Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³Π° ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ ΠΈΠ»ΠΈ Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹ΠΉ баланс ΠΈΠΌΠ΅Π½Π½ΠΎ для Π½Π΅Ρ‘. - Клик ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠΎΠ΄Π°Π»ΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°. ### 3. ΠžΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΡΡ‚ΡŒ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² ΠΈ «Активный всСгда свСрху» - **Π ΡƒΡ‡Π½ΠΎΠΉ порядок (`order`)**: Π² настройках ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ½ΠΎΠΏΠΎΠΊ β–² / β–Ό. - **Π—Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ (`activeOnTop`)**: Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚, привязанный ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌΡƒ Ρ‡Π°Ρ‚Ρƒ, автоматичСски выводится Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠ΅ мСсто. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ. ### 4. ЧСловСкопонятный Ρ‚Π°ΠΉΠΌΠ΅Ρ€ сброса (`fmtReset`) - Если Π΄ΠΎ сброса большС 24 часов: ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΄Π½ΠΈ, часы ΠΈ ΠΌΠΈΠ½ΡƒΡ‚Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `5Π΄ 5Ρ‡ 19ΠΌ`). - Если мСньшС 24 часов: Ρ‚ΠΎΠ»ΡŒΠΊΠΎ часы ΠΈ ΠΌΠΈΠ½ΡƒΡ‚Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `4Ρ‡ 59ΠΌ`). - Для ΠΈΡΡ‚Π΅ΠΊΡˆΠΈΡ… ΠΎΠΊΠΎΠ½ выводится статус обновлСния. ### 5. Π‘ΠΏΠΎΠΊΠΎΠΉΠ½Ρ‹ΠΉ ΠΈ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ - Π’Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ отступ **12px** ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π½Π°ΠΏΠ»Ρ‹Π²Ρ‹ Π³Ρ€Π°Π½ΠΈΡ† ΠΈ слипаниС. - ΠΠ΅ΠΉΡ‚Ρ€Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΠ½Π° Ρ‚Π΅ΠΌΡ‹ для Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… остатков (>30%), ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰ΠΈΠ΅ янтарный (<30%) ΠΈ красный (<15%) Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ исчСрпания. - АккуратныС прогрСсс-Π±Π°Ρ€Ρ‹ высотой 5px. ### 6. Π˜Π½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΡƒΠ»Π° ΠΈ прСдиктивная Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ° - **Π˜Π½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π·Π΄ΠΎΡ€ΠΎΠ²ΡŒΡ ΠΏΡƒΠ»Π° Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ²**: Ambient-сводка ΠΏΠΎ ΠΏΡƒΠ»Π°ΠΌ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² (`healthy / warning / exhausted`) с ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½Ρ‹ΠΌ выявлСниСм исчСрпанных ΠΈΠ»ΠΈ нСдоступных ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. - **Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ расхода (Burn Rate) ΠΈ врСмя Π΄ΠΎ исчСрпания**: Расчёт скорости расхода ΠΊΠ²ΠΎΡ‚Ρ‹ Π² час (`%/h`) ΠΈ автоматичСский ΠΏΡ€ΠΎΠ³Π½ΠΎΠ· Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΎΡˆΠ΅Π½ΠΈΡ (`ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ ~X.X Ρ‡`) Π½Π° основС 24-часовых ΡΠΊΠΎΠ»ΡŒΠ·ΡΡ‰ΠΈΡ… снимков Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅. - **ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ отсчёт Π΄ΠΎ сброса Π»ΠΈΠΌΠΈΡ‚Π°**: Π’ Ρ‚ΡƒΠ»Ρ‚ΠΈΠΏΠ΅ ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ‡ΠΈΠΏΠ° ΠΈ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… подписок выводится Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π΄ΠΎ блиТайшСго ΠΎΠΊΠ½Π° сброса (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `Бброс Ρ‡Π΅Ρ€Π΅Π· 2h 15m`). - **24-часовой SVG-спарклайн расхода**: ΠšΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ встроСнный Π³Ρ€Π°Ρ„ΠΈΠΊ Ρ‚Ρ€Π΅Π½Π΄Π° расхода ΠΊΠ²ΠΎΡ‚Ρ‹ с динамичСской подсвСткой Ρ†Π²Π΅Ρ‚Π°ΠΌΠΈ систСмной Ρ‚Π΅ΠΌΡ‹. ### 7. Π Π΅ΠΆΠΈΠΌ привязки ΠΊ ΡƒΠ³Π»Ρƒ (Docked), Ρ…ΠΎΡ‚ΠΊΠ΅ΠΉ Alt+K ΠΈ Danger Toast - **Π Π΅ΠΆΠΈΠΌ Docked**: Кнопка Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Ρ‡ΠΈΠΏΠ° ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΏΡ€ΠΈΠΆΠΈΠΌΠ°Π΅Ρ‚ Π΅Π³ΠΎ ΠΊ ΠΏΡ€Π°Π²ΠΎΠΌΡƒ Π½ΠΈΠΆΠ½Π΅ΠΌΡƒ ΡƒΠ³Π»Ρƒ ΠΈ фиксируСт ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‡ΠΈΠΏ Π½Π΅ мСшал ΠΏΡ€ΠΈ пСрСтаскивании. - **Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ…ΠΎΡ‚ΠΊΠ΅ΠΉ `Alt+K`**: ΠœΠ³Π½ΠΎΠ²Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² модального ΠΎΠΊΠ½Π° со всСми Π»ΠΈΠΌΠΈΡ‚Π°ΠΌΠΈ ΠΈΠ· любого мСста Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ пространства. - **ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Danger Toast**: НСнавязчивоС Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΊΠ²ΠΎΡ‚Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΏΠ°Π΄Π°Π΅Ρ‚ Π½ΠΈΠΆΠ΅ 15%, прСдотвращая Π²Π½Π΅Π·Π°ΠΏΠ½Ρ‹Π΅ ΠΎΠ±Ρ€Ρ‹Π²Ρ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ. ### 8. Π—Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ бэкап ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ (Refresh All) - **Π—Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ экспорт ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚**: Π’Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ° всСх Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ подписок Π² Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ AES-256-GCM Ρ„Π°ΠΉΠ» с Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΌ для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ пСрСноса ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ станциями ΠΈΠ»ΠΈ профилями. - **ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ всСх Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² (Refresh All)**: Кнопка Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ модального Ρ…Π°Π±Π° ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ всСх ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² с Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠ΅ΠΉ вращСния ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°. ### 9. ВстроСнноС Π°Π²Ρ‚ΠΎΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠΊ - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° наличия Π½ΠΎΠ²ΠΎΠΉ вСрсии Π² ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ΅ настроСк. - Установка Ρ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΠΎΠΉ вСрсии ΠΈΠ· npm Π±Π΅Π· Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄. - Π—Π°Ρ‰ΠΈΡ‚Π°: Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ loopback-запросы с ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΌ Origin. ### 10. Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° хранСния сСкрСтов - **Π˜Π·ΠΎΠ»ΡΡ†ΠΈΡ сСкрСтов**: ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ API-ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈ сСссионныС ΠΊΡƒΠΊΠΈ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ollama Cloud) хранятся ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π² Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½ΠΎΠΌ сСрвисС `credentials` ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ DSH. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» `subs.json` содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Π΅Π·Π»ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ссылки. - **Π‘Ρ‚Ρ€ΠΎΠ³ΠΈΠ΅ ΠΏΡ€Π°Π²Π° доступа**: Π€Π°ΠΉΠ» Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… `subs.json` ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΠ±ΠΌΠ΅Π½Π° ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ доступа `0600` (Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Ρƒ процСсса), прСдотвращая Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ…. - **ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° памяти ΠΏΡ€ΠΈ ΠΎΡ‚Π·Ρ‹Π²Π΅**: Кэш сСкрСтов Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти сбрасываСтся ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ опросом; ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΎΠ·Π²Π°Π½Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ Π½Π΅ Π·Π°Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² памяти ΠΈ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ (`POST /export`). - **Π—Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ ΠΏΡ€ΠΈ Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚Π°Ρ…**: Π‘Π΅Ρ‚Π΅Π²ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ опроса ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ `redirect: 'error'`, блокируя ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° сторонниС Π΄ΠΎΠΌΠ΅Π½Ρ‹ ΠΏΡ€ΠΈ HTTP 301/302/307. - **Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΎΡ‚ΠΊΠ°Ρ‚**: Ошибки записи Π½Π° диск Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΎΡ‚ΠΊΠ°Ρ‚ структур Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ чСстный HTTP 500 вмСсто Π»ΠΎΠΆΠ½ΠΎΠ³ΠΎ сообщСния ΠΎΠ± успСхС. --- ## πŸ”Œ ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹ | ID ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π° | НазваниС | Π’ΠΈΠΏΡ‹ ΠΎΠΊΠΎΠ½ ΠΊΠ²ΠΎΡ‚ | ΠœΠ΅Ρ‚ΠΎΠ΄ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ | |---------------|----------|----------------|-------------------| | `commandcode` | Command Code | Π‘ΠΊΠΎΠ»ΡŒΠ·ΡΡ‰Π΅Π΅ 5Ρ‡ / НСдСля / ΠœΠ΅ΡΡΡ† (Ρ‚Π°Ρ€ΠΈΡ„Ρ‹ GOAT, Pro, Max) | API-ΠΊΠ»ΡŽΡ‡ (`user_...` ΠΈΠ»ΠΈ Ρ‚ΠΎΠΊΠ΅Π½) | | `opencode-go` | OpenCode GO | Π‘ΠΊΠΎΠ»ΡŒΠ·ΡΡ‰Π΅Π΅ 5Ρ‡ / НСдСля / ΠœΠ΅ΡΡΡ† | БСссионная ΠΊΡƒΠΊΠ° (`auth`) ΠΈ Workspace ID | | `ollama` | Ollama Cloud | БСссия / НСдСля / ΠœΠ΅ΡΡΡ† | API-ΠΊΠ»ΡŽΡ‡ ΠΈ сСссионная ΠΊΡƒΠΊΠ° | | `qwen` | Qwen Cloud | 5 часов / 1 нСдСля (Token Plan) | БСссионная ΠΊΡƒΠΊΠ° ΠΈ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ `sec_token` | | `kimi` | Kimi for Coding | ΠΠ΅Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π»ΠΈΠΌΠΈΡ‚ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² | API-ΠΊΠ»ΡŽΡ‡ (`sk-kimi-...`) | | `glm` | GLM (Z.ai) | Π”Π½Π΅Π²Π½ΠΎΠΉ / ΠœΠ΅ΡΡΡ‡Π½Ρ‹ΠΉ Π»ΠΈΠΌΠΈΡ‚ | API-ΠΊΠ»ΡŽΡ‡ Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π° | | `minimax` | MiniMax Coding Plan | ΠšΠ²ΠΎΡ‚Π° Coding Plan | API-ΠΊΠ»ΡŽΡ‡ (`sk-cp-...`) | | `cline` | Cline | 5 часов / НСдСля / ΠœΠ΅ΡΡΡ† | Bearer API Ρ‚ΠΎΠΊΠ΅Π½ | | `siliconflow` | SiliconFlow (SiliconCloud) | Баланс ΠΈ бонусы ($ / Β₯) | API-ΠΊΠ»ΡŽΡ‡ (`sk-...`) | | `anthropic` | Anthropic | Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (Requests/Tokens) | API-ΠΊΠ»ΡŽΡ‡ (`sk-ant-...`) | | `groq` | Groq | Π›ΠΈΠΌΠΈΡ‚Ρ‹ RPM ΠΈ TPM | API-ΠΊΠ»ΡŽΡ‡ (`gsk_...`) | | `gemini` | Google Gemini | Π”ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ API ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ | API-ΠΊΠ»ΡŽΡ‡ (`AIza...`) | | `deepseek` | DeepSeek | Баланс Π»ΠΈΡ†Π΅Π²ΠΎΠ³ΠΎ счёта ($ / Β₯) | API-ΠΊΠ»ΡŽΡ‡ (`sk-...`) | | `openrouter` | OpenRouter | Баланс Π»ΠΈΡ†Π΅Π²ΠΎΠ³ΠΎ счёта ($ credits) | API-ΠΊΠ»ΡŽΡ‡ (`sk-or-...`) | --- ## πŸ“¦ Быстрая установка Установка ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π² ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ DSH: ```bash dsh plugin --profile web add @goodandready/dsh-key-limits ``` ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊ Π²Π΅Π±-интСрфСйса: ```bash dsh web --profile web ``` --- ## βš™οΈ ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ```yaml # Основная настройка: Настройки -> ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹ -> Key Limits (ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ° настроСк) ΠΈΠ»ΠΈ конфигурация профиля. # ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… вСрсий: ~/.dsh/profiles/web/settings.yaml plugins: '@goodandready/dsh-key-limits': storageDir: ~/.dsh/storages/dsh-key-limits refreshHours: 24 ui: floatChip: true composerBar: true activeOnTop: true order: [] ``` ### Π’Π°Π±Π»ΠΈΡ†Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² | ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | Π’ΠΈΠΏ | По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ | ОписаниС | |----------|-----|--------------|----------| | `storageDir` | `string` | `~/.dsh/storages/dsh-key-limits` | ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ хранСния Ρ„Π°ΠΉΠ»Π° ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… подписок `subs.json`. | | `refreshHours` | `number` | `24` | Π˜Π½Ρ‚Π΅Ρ€Π²Π°Π» Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ опроса ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² Π² часах. | | `ui.floatChip` | `boolean` | `true` | ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ»Π°Π²Π°ΡŽΡ‰ΠΈΠΉ пСрСтаскиваСмый Ρ‡ΠΈΠΏ-ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π² интСрфСйсС. | | `ui.composerBar` | `boolean` | `true` | ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Π² строкС Π²Π²ΠΎΠ΄Π° сообщСний (composer bar). | | `ui.activeOnTop` | `boolean` | `true` | АвтоматичСски Π·Π°ΠΊΡ€Π΅ΠΏΠ»ΡΡ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Π² Π΄ΠΈΠ°Π»ΠΎΠ³Π΅ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ Π½Π° самом Π²Π΅Ρ€Ρ…Ρƒ списка. | | `ui.order` | `string[]` | `[]` | ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ порядок отобраТСния ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡Π΅ΠΊ (массив ID подписок). | --- ## 🌐 ΠœΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ REST API | ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΈ ΠΏΡƒΡ‚ΡŒ | Доступ / Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ | ОписаниС | |--------------|-------------------|----------| | `GET /dsh-key-limits/health` | Loopback / Same-Origin | ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° работоспособности сСрвиса (`{ ok: true, name: "dsh-key-limits", status: "healthy" }`) | | `GET /dsh-key-limits/config` | Public / Web | ΠŸΡƒΠ±Π»ΠΈΡ‡Π½Π°Ρ конфигурация UI ΠΈ схСмы ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² | | `GET /dsh-key-limits/active-sub` | Public / Web | ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° подписки ΠΊ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ сСссии (`?sessionId=`) | | `GET /dsh-key-limits/subs` | Public / Web | Бписок всСх настроСнных подписок, ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈ балансов | | `POST /dsh-key-limits/subs` | Loopback / Same-Origin | Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ подписки | | `POST /dsh-key-limits/refresh-all` | Loopback / Same-Origin | ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ всСх подписок (Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ выполнСния / in-flight lock) | | `POST /dsh-key-limits/export` | Loopback / Same-Origin | Экспорт Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΌ бэкапа подписок (AES-256-GCM) | | `POST /dsh-key-limits/import` | Loopback / Same-Origin | Π”Π΅ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ бэкапа с Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ | | `GET /dsh-key-limits/update` | Loopback / Same-Origin | ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° наличия Π½ΠΎΠ²Ρ‹Ρ… вСрсий ΠΏΠ»Π°Π³ΠΈΠ½Π° Π² npm | | `POST /dsh-key-limits/update` | Loopback / Same-Origin | Запуск автоматичСского обновлСния Ρ‡Π΅Ρ€Π΅Π· npm | --- ## πŸ› οΈ Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈ тСстированиС > **ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅**: ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹ΠΉ npm-ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈ Ρ€Π΅Π»ΠΈΠ·Π½Ρ‹ΠΉ Π°Ρ€Ρ…ΠΈΠ² содСрТат Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π°ΠΉΠ»Ρ‹ Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ° (`lib/`, `cordis.patch.yml`, Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΈ Π»ΠΈΡ†Π΅Π½Π·ΠΈΡŽ). Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ (`src/client/`, `test/` ΠΈ скрипты сборки) находится Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Для запуска тСстов ΠΈΠ»ΠΈ пСрСсборки клиСнтского Π±Π°Π½Π΄Π»Π° ΠΊΠ»ΠΎΠ½ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. ```bash # Π‘Π±ΠΎΡ€ΠΊΠ° ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚Π½ΠΎΠ³ΠΎ клиСнтского Π±Π°Π½Π΄Π»Π° ΠΈΠ· src/client/ Π² lib/client.js npm run build:client # Запуск ΠΎΡ„Π»Π°ΠΉΠ½-тСстов npm test ``` ### Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ``` . β”œβ”€β”€ lib/ β”‚ β”œβ”€β”€ index.js # Π’ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Cordis-ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ HTTP β”‚ β”œβ”€β”€ client.js # Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ клиСнтский Π±Π°Π½Π΄Π» β”‚ β”œβ”€β”€ cards.js # Π Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡Π΅ΠΊ β”‚ β”œβ”€β”€ subs.js # ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ подписок ΠΈ нормализация β”‚ β”œβ”€β”€ provider-fetchers.js # ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ„Π΅Ρ‚Ρ‡Π΅Ρ€Ρ‹ ΠΈ парсСры HTML β”‚ β”œβ”€β”€ provider-extra-fetchers.js # Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ Ρ„Π΅Ρ‚Ρ‡Π΅Ρ€Ρ‹ (SiliconFlow, Anthropic, Groq, Gemini) β”‚ β”œβ”€β”€ crypto-backup.js # Экспорт ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ бэкапа AES-256-GCM β”‚ β”œβ”€β”€ paths.js # Π Π΅Π·ΠΎΠ»Π²Π΅Ρ€ ΠΏΡƒΡ‚Π΅ΠΉ хранСния β”‚ └── plugin-updater.js # БСзопасный Π°ΠΏΠ΄Π΅ΠΉΡ‚Π΅Ρ€ β”œβ”€β”€ src/client/ # Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½ΠΎΠ³ΠΎ интСрфСйса β”‚ β”œβ”€β”€ 01-prelude.js # Π˜Π·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ CSS ΠΈ инициализация React β”‚ β”œβ”€β”€ 02-locale.js # Π‘Π»ΠΎΠ²Π°Ρ€ΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (en, zh; ru Ρ‡Π΅Ρ€Π΅Π· dsh-russian-lang) β”‚ β”œβ”€β”€ 03-format.js # Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Π΅ ΡˆΠΊΠ°Π»Ρ‹ β”‚ β”œβ”€β”€ 04-modals.js # AllLimitsModal ΠΈ OneLimitModal β”‚ β”œβ”€β”€ 05-bar.js # Кнопка ActiveKeyButton Π² строкС Π²Π²ΠΎΠ΄Π° β”‚ β”œβ”€β”€ 06-float.js # Draggable FloatChip β”‚ β”œβ”€β”€ 07-settings.js # ΠšΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ° настроСк, сортировка ΠΈ Π°ΠΏΠ΄Π΅ΠΉΡ‚Π΅Ρ€ β”‚ └── 08-apply.js # Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΈ рСгистрация слотов DSH β”œβ”€β”€ cordis.patch.yml # ΠœΠ°Π½ΠΈΡ„Π΅ΡΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° для Cordis └── test/ # Набор тСстов ``` --- ## πŸ“„ ЛицСнзия MIT Β© [GooDAnDReaDY](https://github.com/GooDAnDReaDY)