@goodandready/dsh-russian-lang 0.2.25 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +9 -9
  2. package/README.ru.md +9 -9
  3. package/lib/client.js +130 -22
  4. package/lib/locales/plugins/01-token-dashboard.json +1 -1
  5. package/lib/locales/plugins/10-kanban.json +1 -1
  6. package/lib/locales/plugins/13-agent-teams.json +1 -1
  7. package/lib/locales/plugins/16-usage-stats.json +1 -1
  8. package/lib/locales/plugins/23-moa.json +1 -1
  9. package/lib/locales/plugins/24-personal-directive.json +1 -1
  10. package/lib/locales/plugins/33-messenger-gateway.json +1 -1
  11. package/lib/locales/plugins/35-gitea.json +1 -1
  12. package/lib/locales/plugins/36-cost-meter.json +1 -1
  13. package/lib/locales/plugins/37-time-machine.json +1 -1
  14. package/lib/locales/plugins/38-context-lens.json +1 -1
  15. package/lib/locales/plugins/39-shadow-auditor.json +1 -1
  16. package/lib/locales/plugins/40-clinebot.json +1 -1
  17. package/lib/locales/plugins/41-lanmode.json +1 -1
  18. package/lib/locales/plugins/42-plugin-console.json +1 -1
  19. package/lib/locales/plugins/46-memory-brain.json +1 -1
  20. package/lib/locales/plugins/49-dsml-guard.json +1 -1
  21. package/lib/locales/plugins/49-usage-guard.json +1 -1
  22. package/lib/locales/plugins/50-automode.json +1 -1
  23. package/lib/locales/plugins/54-workshop-market.json +1 -1
  24. package/lib/locales/plugins/57-live-canvas.json +1 -1
  25. package/lib/locales/plugins/58-grok-xsearch.json +1 -1
  26. package/lib/locales/plugins/59-goal.json +1 -1
  27. package/lib/locales/plugins/62-model-search.json +1 -1
  28. package/lib/locales/plugins/63-agent-orchestrator.json +1 -1
  29. package/lib/locales/plugins/64-key-limits.json +1 -1
  30. package/lib/locales/plugins/66-tts.json +1 -1
  31. package/lib/locales/plugins/67-voice.json +1 -1
  32. package/lib/locales/plugins/68-image-gen.json +1 -1
  33. package/lib/locales/plugins/69-plugin-notify.json +1 -1
  34. package/lib/locales/plugins/71-memory-meter.json +1 -1
  35. package/lib/locales/plugins/75-test-pilot.json +1 -0
  36. package/lib/locales/plugins/76-visualize.json +1 -0
  37. package/package.json +3 -3
  38. package/lib/locales/plugins/44-goal.json +0 -1
package/README.md CHANGED
@@ -5,16 +5,16 @@
5
5
  <h3>Полная русская локализация, умная типографика и исправление раскладки клавиатуры для DeepSeek Harness</h3>
6
6
 
7
7
  <p align="center">
8
- <a href="https://www.npmjs.com/package/@goodandready/dsh-russian-lang"><img src="https://img.shields.io/badge/npm-v0.2.24-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="npm version"></a>
8
+ <a href="https://www.npmjs.com/package/@goodandready/dsh-russian-lang"><img src="https://img.shields.io/badge/npm-v0.2.25-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="npm version"></a>
9
9
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-10b981.svg?style=for-the-badge&color=10b981&labelColor=064e3b" alt="license"></a>
10
10
  <a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/DSH-Plugin-8b5cf6.svg?style=for-the-badge&labelColor=2e1065" alt="DSH Plugin"></a>
11
11
  <a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-20%2B-f59e0b.svg?style=for-the-badge&labelColor=451a03" alt="Node version"></a>
12
12
  </p>
13
13
 
14
14
  <p align="center">
15
- <img src="https://img.shields.io/badge/DSH-v0.1.5--rc.2%2B-blue.svg?style=for-the-badge&labelColor=1e1b4b" alt="DSH v0.1.6-alpha.1+">
15
+ <img src="https://img.shields.io/badge/DSH-v0.1.6--alpha.2%2B-blue.svg?style=for-the-badge&labelColor=1e1b4b" alt="DSH v0.1.6-alpha.2+">
16
16
  <img src="https://img.shields.io/badge/Покрытие-100%25-10b981.svg?style=for-the-badge&labelColor=064e3b" alt="Покрытие 100%">
17
- <img src="https://img.shields.io/badge/Ключей_UI-6808-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="6808 ключей">
17
+ <img src="https://img.shields.io/badge/Ключей_UI-8735-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="8735 ключей">
18
18
  <img src="https://img.shields.io/badge/Ручная_вычитка-100%25-0ea5e9.svg?style=for-the-badge&labelColor=082f49" alt="100% ручная вычитка">
19
19
  </p>
20
20
 
@@ -55,9 +55,9 @@ graph LR
55
55
  DSH[Web UI Интерфейс] --> Loader[Загрузчик локализации dsh-russian-lang]
56
56
  end
57
57
 
58
- subgraph TranslationLayer [Слой перевода и адаптации — 6808 ключей / 100% вычитано]
59
- Loader --> CoreDict[30+ Пространств имён ядра DSH / 1225 ключа]
60
- Loader --> PluginDict[30+ Плагинов экосистемы DSH / 5404 ключ]
58
+ subgraph TranslationLayer [Слой перевода и адаптации — 8735 ключей / 100% вычитано]
59
+ Loader --> CoreDict[49 Пространств имён ядра DSH / 2146 ключей]
60
+ Loader --> PluginDict[60+ Плагинов экосистемы DSH / 6589 ключей]
61
61
  Loader --> PluralEngine[Движок грамматических Plural-форм: 1/2/5]
62
62
  end
63
63
 
@@ -88,7 +88,7 @@ graph LR
88
88
 
89
89
  ## ✨ Полный обзор возможностей
90
90
 
91
- ### 1. 🌐 100% покрытие ядра DSH (30+ Пространств имён, 1225 ключа)
91
+ ### 1. 🌐 100% покрытие ядра DSH (49 Пространств имён, 2146 ключей)
92
92
  * **Диалоги и переписка (`conversation`)**: лента сообщений, ветки обсуждений, карточки вызова инструментов, статус генерации и рассуждений (thinking traces).
93
93
  * **Модели и провайдеры (`settings.models`)**: каталог моделей, параметры инференса, управление токенами и ключами API.
94
94
  * **Трейсы рассуждений (`trajectory`)**: детальные шаги, параметры вызовов инструментов, временные метки и визуализация размышлений модели.
@@ -97,9 +97,9 @@ graph LR
97
97
  * **Планировщик и инвентарь (`schedule.catalog`, `settings.pluginInventory`, `settings.plugins`)**: фоновые задания, периодичность, фильтры и каталог установленных плагинов.
98
98
  * **Права доступа и безопасность (`permission.access`, `plan`, `skill`)**: пресеты прав (полный доступ, только чтение, запись в рабочую область), выполнение планов и навыки.
99
99
 
100
- > **О качестве перевода.** Все **6808 ключей интерфейса (722 ядра + 5583 плагинов) переведены на 100% и вычитаны вручную**. Черновой машинный перевод полностью замещён проверенными формулировками (`draft = 0`). Перевод регулярно валидируется автоматическими линтерами целостности плейсхолдеров, проверкой соблюдения глоссария (`glossary.json`) и детекторами переполнения верстки. Нашли неточность — кнопка «Сообщить о проблеме перевода» в карточке настроек создаёт готовый issue.
100
+ > **О качестве перевода.** Все **8735 ключей интерфейса (2146 ядра + 6589 плагинов) переведены на 100% и вычитаны вручную**. Черновой машинный перевод полностью замещён проверенными формулировками (`draft = 0`). Перевод регулярно валидируется автоматическими линтерами целостности плейсхолдеров, проверкой соблюдения глоссария (`glossary.json`) и детекторами переполнения верстки. Нашли неточность — кнопка «Сообщить о проблеме перевода» в карточке настроек создаёт готовый issue.
101
101
 
102
- ### 2. 🧩 Встроенный перевод 30+ плагинов экосистемы DSH (5404 ключ)
102
+ ### 2. 🧩 Встроенный перевод 60+ плагинов экосистемы DSH (6589 ключей)
103
103
  Локализация автоматически распространяется на все ключевые плагины экосистемы DeepSeek Harness:
104
104
  * **`dsh-session-control`** — расширенное управление сессиями: закрепление диалогов, архив по периодам, просмотр расшифровок и фильтрация шума;
105
105
  * **`dsh-kanban` и `task-board`** — канбан-доски задач, карточки, чек-листы, дедлайны, критерии готовности (DoD) и шлюз приёмки (Acceptance Gate);
package/README.ru.md CHANGED
@@ -5,16 +5,16 @@
5
5
  <h3>Полная русская локализация, умная типографика и исправление раскладки клавиатуры для DeepSeek Harness</h3>
6
6
 
7
7
  <p align="center">
8
- <a href="https://www.npmjs.com/package/@goodandready/dsh-russian-lang"><img src="https://img.shields.io/badge/npm-v0.2.24-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="npm version"></a>
8
+ <a href="https://www.npmjs.com/package/@goodandready/dsh-russian-lang"><img src="https://img.shields.io/badge/npm-v0.2.25-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="npm version"></a>
9
9
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-10b981.svg?style=for-the-badge&color=10b981&labelColor=064e3b" alt="license"></a>
10
10
  <a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/DSH-Plugin-8b5cf6.svg?style=for-the-badge&labelColor=2e1065" alt="DSH Plugin"></a>
11
11
  <a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-20%2B-f59e0b.svg?style=for-the-badge&labelColor=451a03" alt="Node version"></a>
12
12
  </p>
13
13
 
14
14
  <p align="center">
15
- <img src="https://img.shields.io/badge/DSH-v0.1.5--rc.1%2B-blue.svg?style=for-the-badge&labelColor=1e1b4b" alt="DSH v0.1.5-rc.1+">
15
+ <img src="https://img.shields.io/badge/DSH-v0.1.6--alpha.2%2B-blue.svg?style=for-the-badge&labelColor=1e1b4b" alt="DSH v0.1.6-alpha.2+">
16
16
  <img src="https://img.shields.io/badge/Покрытие-100%25-10b981.svg?style=for-the-badge&labelColor=064e3b" alt="Покрытие 100%">
17
- <img src="https://img.shields.io/badge/Ключей_UI-6002-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="6002 ключей">
17
+ <img src="https://img.shields.io/badge/Ключей_UI-8735-6366f1.svg?style=for-the-badge&labelColor=1e1b4b" alt="8735 ключей">
18
18
  <img src="https://img.shields.io/badge/Ручная_вычитка-100%25-0ea5e9.svg?style=for-the-badge&labelColor=082f49" alt="100% ручная вычитка">
19
19
  </p>
20
20
 
@@ -55,9 +55,9 @@ graph LR
55
55
  DSH[Web UI Интерфейс] --> Loader[Загрузчик локализации dsh-russian-lang]
56
56
  end
57
57
 
58
- subgraph TranslationLayer [Слой перевода и адаптации — 6002 ключей / 100% вычитано]
59
- Loader --> CoreDict[30+ Пространств имён ядра DSH / 1225 ключа]
60
- Loader --> PluginDict[30+ Плагинов экосистемы DSH / 4777 ключ]
58
+ subgraph TranslationLayer [Слой перевода и адаптации — 8735 ключей / 100% вычитано]
59
+ Loader --> CoreDict[49 Пространств имён ядра DSH / 2146 ключей]
60
+ Loader --> PluginDict[60+ Плагинов экосистемы DSH / 6589 ключей]
61
61
  Loader --> PluralEngine[Движок грамматических Plural-форм: 1/2/5]
62
62
  end
63
63
 
@@ -88,7 +88,7 @@ graph LR
88
88
 
89
89
  ## ✨ Полный обзор возможностей
90
90
 
91
- ### 1. 🌐 100% покрытие ядра DSH (30+ Пространств имён, 1225 ключа)
91
+ ### 1. 🌐 100% покрытие ядра DSH (49 Пространств имён, 2146 ключей)
92
92
  * **Диалоги и переписка (`conversation`)**: лента сообщений, ветки обсуждений, карточки вызова инструментов, статус генерации и рассуждений (thinking traces).
93
93
  * **Модели и провайдеры (`settings.models`)**: каталог моделей, параметры инференса, управление токенами и ключами API.
94
94
  * **Трейсы рассуждений (`trajectory`)**: детальные шаги, параметры вызовов инструментов, временные метки и визуализация размышлений модели.
@@ -97,9 +97,9 @@ graph LR
97
97
  * **Планировщик и инвентарь (`schedule.catalog`, `settings.pluginInventory`, `settings.plugins`)**: фоновые задания, периодичность, фильтры и каталог установленных плагинов.
98
98
  * **Права доступа и безопасность (`permission.access`, `plan`, `skill`)**: пресеты прав (полный доступ, только чтение, запись в рабочую область), выполнение планов и навыки.
99
99
 
100
- > **О качестве перевода.** Все **6002 ключей интерфейса (722 ядра + 3989 плагинов) переведены на 100% и вычитаны вручную**. Черновой машинный перевод полностью замещён проверенными формулировками (`draft = 0`). Перевод регулярно валидируется автоматическими линтерами целостности плейсхолдеров, проверкой соблюдения глоссария (`glossary.json`) и детекторами переполнения верстки. Нашли неточность — кнопка «Сообщить о проблеме перевода» в карточке настроек создаёт готовый issue.
100
+ > **О качестве перевода.** Все **8735 ключей интерфейса (2146 ядра + 6589 плагинов) переведены на 100% и вычитаны вручную**. Черновой машинный перевод полностью замещён проверенными формулировками (`draft = 0`). Перевод регулярно валидируется автоматическими линтерами целостности плейсхолдеров, проверкой соблюдения глоссария (`glossary.json`) и детекторами переполнения верстки. Нашли неточность — кнопка «Сообщить о проблеме перевода» в карточке настроек создаёт готовый issue.
101
101
 
102
- ### 2. 🧩 Встроенный перевод 30+ плагинов экосистемы DSH (4777 ключ)
102
+ ### 2. 🧩 Встроенный перевод 60+ плагинов экосистемы DSH (6589 ключей)
103
103
  Локализация автоматически распространяется на все ключевые плагины экосистемы DeepSeek Harness:
104
104
  * **`dsh-session-control`** — расширенное управление сессиями: закрепление диалогов, архив по периодам, просмотр расшифровок и фильтрация шума;
105
105
  * **`dsh-kanban` и `task-board`** — канбан-доски задач, карточки, чек-листы, дедлайны, критерии готовности (DoD) и шлюз приёмки (Acceptance Gate);
package/lib/client.js CHANGED
@@ -525,6 +525,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
525
525
  RU['russian-lang'] = {"cardTitle": "Русская локализация", "cardSub": "Язык интерфейса, типографика, раскладка", "badgeRu": "🟢 RU активен", "badgeEn": "⚪ EN активен", "badgeCoverage": "🟢 100% (7,902 ключа)", "badgeSmartUx": "⚡ Smart UX активен", "secLanguage": "🌐 Язык интерфейса", "secLanguageDesc": "Нативное переключение языка интерфейса DSH на русский без перезагрузки страницы.", "enabled": "Русский язык включён", "enabledDesc": "Переключает язык интерфейса DeepSeek Harness на русский.", "quickSwitchNote": "Быстрый переключатель RU ⇄ EN доступен в шапке сессии рядом с кнопками диалога.", "secTypography": "✍️ Умная типографика и ввод (Smart UX)", "secTypographyDesc": "Автоматическое улучшение текстов по нормам русской типографики во время диалога и набора.", "typography": "Типографика вывода", "typographyDesc": "Исправляет типографику ответов модели: кавычки-«ёлочки», тире («—») вместо дефисов, неразрывные пробелы после предлогов.", "yo": "Буква «ё»", "yoDesc": "Восстанавливать «ё» в частых словах (ещё, чёрный, идёт и др.), написанных через «е». Неоднозначные слова (все/всё) не трогаются.", "liveInput": "Живая типографика инпута", "liveInputDesc": "Автоматически заменять \"\" на «» и -- на — прямо во время набора промпта (код в бэктиках игнорируется).", "slashAliases": "Русские алиасы команд", "slashAliasesDesc": "Поддержка русских команд: /цель -> /goal, /сжать -> /compact, /план -> /plan, /справка -> /help, /память -> /memory.", "altLHintText": "Мгновенная конвертация раскладки текущего поля (ghbdtn ⇄ привет, /vjltkm ⇄ /model). В углу поля ввода также отображается метка раскладки.", "secAgentPrompt": "🤖 Системный промпт агента", "secAgentPromptDesc": "Официальная секция расширения DSH systemPrompt для ведения диалога на русском языке.", "agentPrompt": "Русский промпт агента", "agentPromptDesc": "Добавляет в системный промпт инструкцию отвечать по-русски в выбранном стиле.", "agentPromptPreset": "Стиль ответов агента", "presetExpert": "Технический эксперт (строгая терминология, чистый код)", "presetWriter": "Технический писатель (Markdown, таблицы, ГОСТ)", "presetConcise": "Лаконичный режим (кратко, без лишней воды)", "secUpdater": "🔄 Обновление языкового пакета", "secUpdaterDesc": "Проверка наличия новых релизов в реестре npm и обновление в один клик.", "updaterCurrent": "Текущая версия: v{version}", "updaterLatest": "Доступна новая версия: v{version}", "updaterUpToDate": "Установлена актуальная версия", "updaterChecking": "Проверка…", "updaterCheckBtn": "Проверить обновления", "updaterBtn": "Обновить до v{version} в 1 клик", "updaterUpdating": "Установка обновления…", "updaterSuccess": "✅ Плагин успешно обновлён! Перезапустите DSH для применения.", "updaterFailed": "❌ Не удалось проверить/обновить плагин. Проверьте сеть или логи сервера.", "badgeUpdateAvailable": "Доступно обновление", "badgeUpToDate": "Актуальная версия", "secTranslator": "🌐 Перевод сообщений ассистента", "secTranslatorDesc": "Настройка перевода ответов модели в чате на русский язык (локально в Docker или онлайн).", "translateEngine": "Движок перевода", "engineOff": "Выключен (по умолчанию, без сетевых вызовов)", "engineLocal": "Локальный LibreTranslate (приватно, ~600 МБ RAM)", "engineGoogle": "Google Translate (онлайн)", "googleWarn": "⚠️ Внимание: при онлайн-переводе текст сообщений ассистента передаётся на публичные серверы Google для перевода на лету. Не используйте для конфиденциальных данных.", "localStatusRunning": "🟢 Контейнер LibreTranslate активен", "localStatusStopped": "⚪ Контейнер LibreTranslate не запущен", "localStartBtn": "Запустить LibreTranslate в Docker (~600 МБ RAM)", "localStarting": "Запуск контейнера…", "localInfo": "LibreTranslate запускается изолированно в Docker на сервере, потребляет ~500–700 МБ RAM и переводит на 100% локально.", "secSupport": "📊 Покрытие экосистемы и поддержка", "secSupportDesc": "Словари синхронизированы с DSH v0.1.6-alpha.1. 100.0% UI-покрытие ядра и всех установленных плагинов (7,902 ключа) без черновых машинных переводов.", "statNamespaces": "Пространств имён", "statCoreKeys": "Ключей ядра", "statPluginKeys": "Ключей плагинов", "overridesCount": "Своих переопределений", "statusLoading": "Настройки загружаются…", "statusUnavailable": "Настройки недоступны на этом хосте", "translateTurn": "Перевести на русский", "reportIssue": "Сообщить о неточности перевода", "exportMdHint": "Экспорт диалога в Markdown доступен по кнопке [ 📥 MD ] в шапке сессии.", "translateTurnHint": "Перевод ответов ассистента на русский доступен по кнопке [ RU ↗ ] на блоках сообщений."}
526
526
 
527
527
  const SETTINGS_NS_NAME = 'russian-lang'
528
+ const ROW_CONFIG_KEY = '@goodandready/dsh-russian-lang#russian-lang'
528
529
 
529
530
  function apply(ctx) {
530
531
  const runtime = ctx.locale
@@ -862,7 +863,12 @@ const exportSessionToMarkdown = (session, options = {}) => {
862
863
  'Visualization streaming preview': 'Предпросмотр визуализации',
863
864
  'Security Auditor Shield': 'Защитный щит аудитора',
864
865
  'Shield: Safe': 'Щит: Безопасно',
865
- 'Shield: Alert': 'Щит: Тревога'
866
+ 'Shield: Alert': 'Щит: Тревога',
867
+ 'e.g. Implement report export and cover with unit tests': 'Например: Реализовать экспорт отчёта и покрыть юнит-тестами',
868
+ 'e.g. Implement report export and cover with unit tests...': 'Например: Реализовать экспорт отчёта и покрыть юнит-тестами…',
869
+ 'e.g. Implement user profile settings card with theme tokens': 'Например: Реализовать карточку настроек профиля с токенами темы',
870
+ 'Detailed functional specs, acceptance criteria, constraints...': 'Детальная функциональная спецификация, критерии приёмки, ограничения…',
871
+ 'Specific instructions, questions, or requirements for this specialist...': 'Конкретные инструкции, вопросы или требования для данного специалиста…',
866
872
  }
867
873
  const DOM_EN_TEXT = {
868
874
  'Scheduled tasks': 'Задачи по расписанию',
@@ -904,6 +910,83 @@ const exportSessionToMarkdown = (session, options = {}) => {
904
910
  'SSH: Remote': 'SSH: Удалённо',
905
911
  '7/7 rot': '7/7 рот.',
906
912
  'Smoke chat': 'Тестовый чат',
913
+ 'Quick Launch Goal': 'Быстрый запуск цели',
914
+ 'Define the objective for the agent in autonomous mode:': 'Сформулируйте задачу для автономной работы агента:',
915
+ 'Fix Bug': 'Исправление бага',
916
+ 'Refactor (YAGNI)': 'Рефакторинг (YAGNI)',
917
+ 'Tests & Coverage': 'Тесты и покрытие',
918
+ 'Code Review': 'Ревью кода',
919
+ 'New Feature': 'Новая функция',
920
+ 'Security Audit': 'Аудит безопасности',
921
+ 'Docs & Contract': 'Документация и контракт',
922
+ 'Upgrade Deps': 'Обновление зависимостей',
923
+ 'Dead Code': 'Мёртвый код',
924
+ 'Performance': 'Производительность',
925
+ 'Start Goal': 'Запустить цель',
926
+
927
+ 'Launch Multi-Agent Orchestrator': 'Запуск мультиагентного оркестратора',
928
+ 'Full DAG Pipeline': 'Полный DAG-пайплайн',
929
+ 'Direct Specialist Subagent': 'Прямой субагент-специалист',
930
+ 'Objective Title': 'Название задачи',
931
+ 'Scope & Requirements': 'Объём и требования',
932
+ 'Topology Scenario': 'Топологический сценарий',
933
+ 'Auto (Infer based on prompt complexity)': 'Авто (определить по сложности задачи)',
934
+ 'Hotfix (1 Stage: Triage & Minimal Fix)': 'Хотфикс (1 этап: анализ и точечный фикс)',
935
+ 'Simple (2 Stages: Spec + Exec)': 'Простой (2 этапа: ТЗ + реализация)',
936
+ 'Medium (4 Stages: Spec -> Design -> Code -> QA)': 'Средний (4 этапа: ТЗ -> Дизайн -> Код -> Тестирование)',
937
+ 'Complex (6 Stages: Full Engineering Lifecycle)': 'Сложный (6 этапов: полный инженерный цикл)',
938
+ 'Enterprise (7 Stages: R&D Spike -> Fullstack -> Gate)': 'Enterprise (7 этапов: R&D исследование -> Фулстек -> Гейт приёмки)',
939
+ 'Target Specialist Role': 'Роль целевого специалиста',
940
+ 'UI/UX Interface Designer': 'UI/UX дизайнер интерфейсов',
941
+ 'System Architect (DESIGN.md / ADR)': 'Системный архитектор (DESIGN.md / ADR)',
942
+ 'Technical Spec Analyst': 'Аналитик технических спецификаций',
943
+ 'Senior Frontend Developer': 'Ведущий frontend-разработчик',
944
+ 'Senior Backend Developer': 'Ведущий backend-разработчик',
945
+ 'QA Automation Engineer': 'Инженер автоматизации тестирования',
946
+ 'Refactoring & Complexity Specialist': 'Специалист по рефакторингу и сложности',
947
+ 'Hotfix & Diagnostic Engineer': 'Инженер хотфиксов и диагностики',
948
+ 'Documentation Specialist': 'Технический писатель / Документация',
949
+ 'Spike & R&D Researcher': 'Исследователь R&D и прототипирования',
950
+ 'DevOps & Tooling Specialist': 'DevOps и инфраструктурный специалист',
951
+ 'Instructions for Subagent': 'Инструкции для субагента',
952
+ 'Start Pipeline': 'Запустить пайплайн',
953
+ 'Delegate Subagent': 'Делегировать субагенту',
954
+ 'Dispatching...': 'Отправка…',
955
+
956
+ 'Discounted rate active': 'Действует сниженный тариф',
957
+ 'off-peak': 'непиковый',
958
+ 'peak': 'пиковый',
959
+ 'Context cache saved:': 'Сэкономлено на кэше:',
960
+ '1M tokens, $': '1 млн токенов, $',
961
+ 'Input (cache hit)': 'Ввод (попадание в кэш)',
962
+ 'Input (cache miss)': 'Ввод (промах кэша)',
963
+ 'Output': 'Вывод',
964
+ 'SESSION TOKENS': 'ТОКЕНЫ СЕССИИ',
965
+ 'SPEND BY MODEL': 'РАСХОД ПО МОДЕЛЯМ',
966
+ 'Session total:': 'Всего за сессию:',
967
+ 'Copy Summary': 'Скопировать сводку',
968
+
969
+ 'Context Lens': 'Линза контекста',
970
+ 'Saved tokens': 'Сэкономлено токенов',
971
+ '% Saved': '% экономии',
972
+ 'ops': 'операций',
973
+ 'Budget': 'Бюджет',
974
+ 'Active focus': 'Активный фокус',
975
+ 'No focus paths set': 'Пути фокусировки не заданы',
976
+
977
+ 'Status': 'Статус',
978
+ 'Graph & CI': 'Граф и CI',
979
+ 'Events & PRs': 'События и PR',
980
+ 'Branch': 'Ветка',
981
+ 'Sync': 'Синхронизация',
982
+ 'Up to date with remote (@{upstream})': 'Синхронизировано с удалённым репозиторием (@{upstream})',
983
+ 'Up to date with remote': 'Синхронизировано с удалённым репозиторием',
984
+ 'Clean': 'Чисто',
985
+ 'No modified or untracked files in the working directory.': 'В рабочем каталоге нет изменённых или неотслеживаемых файлов.',
986
+ 'RECENT COMMITS': 'ПОСЛЕДНИЕ КОММИТЫ',
987
+
988
+ 'Active jobs': 'Активные задачи',
989
+ 'No active jobs': 'Нет активных задач',
907
990
  'Register in Models': 'Зарегистрировать в моделях',
908
991
  'Base URL': 'Базовый URL',
909
992
  'API key env / credential name': 'Имя переменной окружения / ключа API',
@@ -1297,9 +1380,10 @@ const exportSessionToMarkdown = (session, options = {}) => {
1297
1380
  layoutHintEl = document.createElement('div')
1298
1381
  layoutHintEl.dataset.russianLangLayout = '1'
1299
1382
  Object.assign(layoutHintEl.style, {
1300
- position: 'fixed', zIndex: '99999', background: '#fff', color: '#000',
1301
- border: '1px solid #888', borderRadius: '8px', padding: '6px 10px',
1302
- fontSize: '13px', boxShadow: '0 2px 8px rgba(0,0,0,.2)', cursor: 'pointer'
1383
+ position: 'fixed', zIndex: '99999', background: 'var(--dsw-alias-bg-layer-3)',
1384
+ color: 'var(--dsw-alias-label-primary)',
1385
+ border: '1px solid var(--dsw-alias-border-l2)', borderRadius: '8px', padding: '6px 10px',
1386
+ fontSize: '13px', boxShadow: 'var(--dsw-alias-shadow-l2)', cursor: 'pointer'
1303
1387
  })
1304
1388
  const label = direction === 'cyr2lat' ? 'Команда, не та раскладка' : 'Не та раскладка'
1305
1389
  layoutHintEl.textContent = label + ': ' + converted
@@ -1328,8 +1412,8 @@ const exportSessionToMarkdown = (session, options = {}) => {
1328
1412
  layoutBadgeEl.type = 'button'
1329
1413
  layoutBadgeEl.dataset.russianLangLayoutBadge = '1'
1330
1414
  Object.assign(layoutBadgeEl.style, {
1331
- position: 'fixed', zIndex: '99998', background: 'var(--dsw-alias-bg-layer-3, #fff)',
1332
- color: 'var(--dsw-alias-label-secondary, #666)', border: '1px solid var(--dsw-alias-border-l2, #888)',
1415
+ position: 'fixed', zIndex: '99998', background: 'var(--dsw-alias-bg-layer-3)',
1416
+ color: 'var(--dsw-alias-label-secondary)', border: '1px solid var(--dsw-alias-border-l2)',
1333
1417
  borderRadius: '6px', padding: '1px 6px', fontSize: '11px', cursor: 'pointer',
1334
1418
  fontFamily: 'monospace', lineHeight: '1.4', fontWeight: '600'
1335
1419
  })
@@ -1523,6 +1607,24 @@ const exportSessionToMarkdown = (session, options = {}) => {
1523
1607
  } catch (err) { console.warn('dsh-russian-lang: toggle failed', err) }
1524
1608
  }
1525
1609
  try {
1610
+ ctx.slots.inject('plugins.item', () =>
1611
+ ctx.slots.register({
1612
+ name: 'plugins.item',
1613
+ id: SETTINGS_NS_NAME,
1614
+ order: 60,
1615
+ label: () => 'Russian language',
1616
+ locale: SETTINGS_NS_NAME,
1617
+ inject: () => ({ scope, runtime, toggleRu }),
1618
+ }, SettingsCard),
1619
+ )
1620
+ ctx.slots.inject('plugins.row.config', () =>
1621
+ ctx.slots.register({
1622
+ name: 'plugins.row.config',
1623
+ key: ROW_CONFIG_KEY,
1624
+ locale: SETTINGS_NS_NAME,
1625
+ inject: () => ({ scope, runtime, toggleRu }),
1626
+ }, SettingsCard),
1627
+ )
1526
1628
  ctx.slots.inject('settings.plugin.item', () =>
1527
1629
  ctx.slots.register({
1528
1630
  name: 'settings.plugin.item',
@@ -1691,7 +1793,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1691
1793
  const [loading, setLoading] = React.useState(false)
1692
1794
  const [open, setOpen] = React.useState(false)
1693
1795
  const [upStatus, setUpStatus] = React.useState({
1694
- currentVersion: '0.2.25',
1796
+ currentVersion: '0.2.26',
1695
1797
  latestVersion: undefined,
1696
1798
  updateAvailable: false
1697
1799
  })
@@ -1851,7 +1953,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1851
1953
  '<button type="button" class="rl-trans-btn rl-btn-close" title="Закрыть">✕</button>' +
1852
1954
  '</div>' +
1853
1955
  '</div>' +
1854
- '<div class="rl-trans-body"' + (isErr ? ' style="color: var(--dsw-alias-color-warning, #eab308); font-size: 13px;"' : '') + '></div>'
1956
+ '<div class="rl-trans-body"' + (isErr ? ' style="color: var(--dsw-alias-state-warning-primary); font-size: 13px;"' : '') + '></div>'
1855
1957
  box.querySelector('.rl-trans-body').textContent = displayText
1856
1958
 
1857
1959
  const copyBtn = box.querySelector('.rl-btn-copy')
@@ -1971,11 +2073,17 @@ const exportSessionToMarkdown = (session, options = {}) => {
1971
2073
  const presetKey = value.agentPromptPreset || 'technical_expert'
1972
2074
  const presetInfo = typeof SYSTEM_PROMPT_PRESETS !== 'undefined' ? SYSTEM_PROMPT_PRESETS[presetKey] : null
1973
2075
 
1974
- return React.createElement('div', { className: 'rl-card' },
2076
+ if (props && props.view === 'summary') {
2077
+ return React.createElement('div', { className: 'rl-sub' }, statusLine || t('cardSub'))
2078
+ }
2079
+ const page = !!(props && props.view === 'page')
2080
+
2081
+ return React.createElement('div', { className: page ? 'rl-page-seat' : 'rl-card' },
1975
2082
  React.createElement('button', {
1976
2083
  type: 'button',
1977
2084
  className: 'rl-head',
1978
- 'aria-expanded': String(open),
2085
+ style: page ? { display: 'none' } : undefined,
2086
+ 'aria-expanded': page ? 'true' : String(open),
1979
2087
  onClick: () => setOpen(!open),
1980
2088
  },
1981
2089
  React.createElement('span', { className: 'rl-head-main' },
@@ -1990,7 +2098,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
1990
2098
  React.createElement('span', {
1991
2099
  className: 'rl-chev' + (open ? ' rl-chev-open' : ''),
1992
2100
  }, React.createElement(Chevron, null))),
1993
- open && React.createElement('div', { className: 'rl-body' },
2101
+ (page || open) && React.createElement('div', { className: 'rl-body' },
1994
2102
  React.createElement('div', { className: 'rl-page' },
1995
2103
 
1996
2104
  React.createElement('div', { className: 'rl-section-card' },
@@ -2132,9 +2240,9 @@ const exportSessionToMarkdown = (session, options = {}) => {
2132
2240
  React.createElement('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', flexWrap: 'wrap', gap: '8px' } },
2133
2241
  React.createElement('div', null,
2134
2242
  React.createElement('div', { style: { fontWeight: 600, color: 'var(--dsw-alias-label-primary)' } },
2135
- t('updaterCurrent').replace('{version}', upStatus.currentVersion || '0.2.25')),
2243
+ t('updaterCurrent').replace('{version}', upStatus.currentVersion || '0.2.26')),
2136
2244
  upStatus.updateAvailable
2137
- ? React.createElement('div', { style: { color: 'var(--dsw-alias-color-warning, #eab308)', marginTop: '2px', fontWeight: 500 } },
2245
+ ? React.createElement('div', { style: { color: 'var(--dsw-alias-state-warning-primary)', marginTop: '2px', fontWeight: 500 } },
2138
2246
  t('updaterLatest').replace('{version}', upStatus.latestVersion || ''))
2139
2247
  : React.createElement('div', { style: { color: 'var(--dsw-alias-label-secondary)', marginTop: '2px' } },
2140
2248
  t('updaterUpToDate'))
@@ -2156,8 +2264,8 @@ const exportSessionToMarkdown = (session, options = {}) => {
2156
2264
  upMsg ? React.createElement('div', {
2157
2265
  style: {
2158
2266
  marginTop: '10px', padding: '8px 12px', borderRadius: '8px',
2159
- background: upMsg.type === 'ok' ? 'rgba(34, 197, 94, 0.12)' : 'rgba(239, 68, 68, 0.12)',
2160
- color: upMsg.type === 'ok' ? '#16a34a' : '#dc2626', fontSize: '12px', fontWeight: 500
2267
+ background: upMsg.type === 'ok' ? 'color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent)' : 'color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)',
2268
+ color: upMsg.type === 'ok' ? 'var(--dsw-alias-state-success-primary)' : 'var(--dsw-alias-state-error-primary)', fontSize: '12px', fontWeight: 500
2161
2269
  }
2162
2270
  }, upMsg.text) : null
2163
2271
  )
@@ -2193,8 +2301,8 @@ const exportSessionToMarkdown = (session, options = {}) => {
2193
2301
  value.translateEngine === 'google' ? React.createElement('div', {
2194
2302
  style: {
2195
2303
  marginTop: '10px', padding: '8px 12px', borderRadius: '8px',
2196
- background: 'rgba(234, 179, 8, 0.12)', border: '1px solid rgba(234, 179, 8, 0.3)',
2197
- color: 'var(--dsw-alias-color-warning, #eab308)', fontSize: '12px', fontWeight: 500, lineHeight: 1.4
2304
+ background: 'color-mix(in srgb, var(--dsw-alias-state-warning-primary) 12%, transparent)', border: '1px solid color-mix(in srgb, var(--dsw-alias-state-warning-primary) 30%, transparent)',
2305
+ color: 'var(--dsw-alias-state-warning-primary)', fontSize: '12px', fontWeight: 500, lineHeight: 1.4
2198
2306
  }
2199
2307
  }, t('googleWarn')) : null,
2200
2308
  value.translateEngine === 'local' ? React.createElement('div', {
@@ -2215,8 +2323,8 @@ const exportSessionToMarkdown = (session, options = {}) => {
2215
2323
  transMsg ? React.createElement('div', {
2216
2324
  style: {
2217
2325
  marginTop: '6px', padding: '8px 12px', borderRadius: '8px',
2218
- background: transMsg.type === 'ok' ? 'rgba(34, 197, 94, 0.12)' : 'rgba(239, 68, 68, 0.12)',
2219
- color: transMsg.type === 'ok' ? '#16a34a' : '#dc2626', fontSize: '12px', fontWeight: 500
2326
+ background: transMsg.type === 'ok' ? 'color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent)' : 'color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)',
2327
+ color: transMsg.type === 'ok' ? 'var(--dsw-alias-state-success-primary)' : 'var(--dsw-alias-state-error-primary)', fontSize: '12px', fontWeight: 500
2220
2328
  }
2221
2329
  }, transMsg.text) : null
2222
2330
  ) : null
@@ -2245,7 +2353,7 @@ const exportSessionToMarkdown = (session, options = {}) => {
2245
2353
  ),
2246
2354
  React.createElement('div', { className: 'rl-actions-row' },
2247
2355
  React.createElement('a', {
2248
- href: makeIssueUrl({}, '0.2.25'),
2356
+ href: makeIssueUrl({}, '0.2.26'),
2249
2357
  target: '_blank',
2250
2358
  rel: 'noopener noreferrer',
2251
2359
  className: 'rl-btn rl-btn-primary'
@@ -2277,8 +2385,8 @@ const exportSessionToMarkdown = (session, options = {}) => {
2277
2385
  '.rl-grid-2{display:grid;grid-template-columns:repeat(auto-fit, minmax(280px, 1fr));gap:10px}',
2278
2386
  '.rl-grid-3{display:grid;grid-template-columns:repeat(auto-fit, minmax(140px, 1fr));gap:10px}',
2279
2387
  '.rl-badge{font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid var(--dsw-alias-border-l2);display:inline-flex;align-items:center;gap:4px;font-weight:500}',
2280
- '.rl-badge-ok{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary);background:rgba(16,185,129,0.08)}',
2281
- '.rl-badge-warn{border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary);background:rgba(245,158,11,0.08)}',
2388
+ '.rl-badge-ok{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 8%, transparent)}',
2389
+ '.rl-badge-warn{border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary);background:color-mix(in srgb, var(--dsw-alias-state-warning-primary) 8%, transparent)}',
2282
2390
  '.rl-badge-dim{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-3)}',
2283
2391
  '.rl-item-card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:8px;padding:10px 12px;display:flex;flex-direction:column;gap:4px}',
2284
2392
  '.rl-item-head{display:flex;align-items:center;justify-content:space-between;gap:8px}',
@@ -1 +1 @@
1
- {"usageDashboard":{"buckets.cacheRead":"Чтение кэша","buckets.cacheWrite":"Запись в кэш","buckets.caption":"Четыре непересекающиеся корзины тарификации · всего {total} ток","buckets.output":"Выход","buckets.title":"Состав токенов","buckets.uncachedInput":"Вход мимо кэша","composition.caption":"Оценка по эвристике, не по счёту; в сумму занятости не сойдётся","composition.messages":"Сообщения","composition.system":"Системный промпт","composition.title":"Состав контекста","composition.tools":"Схемы инструментов","efficiency.llm":"Время модели","efficiency.steps":"Шаги","efficiency.stepsValue":"{steps}","efficiency.throughput":"Скорость выдачи","efficiency.title":"Эффективность запросов","efficiency.tool":"Время инструментов","efficiency.ttft":"Первый токен, среднее","efficiency.ttftOver":"шагов: {steps}","efficiency.turns":"Ходы","efficiency.turnsValue":"{turns}","empty.usage":"Расхода токенов пока нет","empty.usageHint":"Цифры появятся, когда сессия сделает первый запрос к модели.","overview.billedInput":"Оплаченный вход","overview.billedInputSub":"мимо кэша {uncached} · из кэша {cached}","overview.cacheHit":"Попадания в кэш","overview.cacheHitSub":"прочитано {read} из {total} ток","overview.context":"Контекст занят","overview.contextSub":"{used} из {window} ток","overview.contextUnknown":"Размер окна модели неизвестен","overview.output":"Выход","overview.outputSub":"всего {total} ток","scope.aria":"Охват статистики","scope.session":"Эта сессия","scope.sessions":"Все сессии","sessions.currentTag":"Текущая","sessions.detail.noData":"Данные по этой сессии загружаются или их нет","sessions.detail.title":"Подробности сессии","sessions.empty":"Расход по сессиям не записан","sessions.inactive":"Простаивает","sessions.running":"Работает","sessions.selectHint":"Выберите строку, чтобы посмотреть сессию","sessions.subagentTag":"Субагент","sessions.summary.input":"Оплаченный вход, всего","sessions.summary.output":"Выход, всего","sessions.summary.sessions":"Сессий с расходом","sessions.summary.sessionsValue":"{count}","sessions.summary.totalValue":"всего сессий: {count}","sessions.summary.turns":"Ходов всего","sessions.summary.turnsValue":"{turns}","sessions.table.cacheHit":"Попаданий в кэш","sessions.table.input":"Оплаченный вход","sessions.table.output":"Выход","sessions.table.session":"Сессия","sessions.table.status":"Состояние","sessions.table.turns":"Ходы","sessions.table.updated":"Изменена","steps.cacheRead":"Кэш Ч","steps.cacheWrite":"Кэш З","steps.caption":"Только загруженное окно, новые сверху; итог считает то же окно","steps.done":"Готово","steps.empty":"В загруженном окне шагов нет","steps.input":"Вход","steps.interrupted":"Прервано","steps.model":"Модель","steps.output":"Выход","steps.reasoning":"Рассуждения","steps.sortBy":"Сортировать по «{column}»","steps.status":"Состояние","steps.title":"Подробности по шагам","steps.tps":"ток/с","steps.ttft":"Первый токен","steps.turn":"Ход.шаг","steps.windowTotal":"Итог по окну","time.daysAgo":"{n} дн назад","time.hoursAgo":"{n} ч назад","time.justNow":"только что","time.minutesAgo":"{n} мин назад","view.usage":"Статистика"}}
1
+ {"@dsh-external/dsh-token-dashboard":{"buckets.cacheRead":"Чтение кэша","buckets.cacheWrite":"Запись в кэш","buckets.caption":"Четыре непересекающиеся корзины тарификации · всего {total} ток","buckets.output":"Выход","buckets.title":"Состав токенов","buckets.uncachedInput":"Вход мимо кэша","composition.caption":"Оценка по эвристике, не по счёту; в сумму занятости не сойдётся","composition.messages":"Сообщения","composition.system":"Системный промпт","composition.title":"Состав контекста","composition.tools":"Схемы инструментов","efficiency.llm":"Время модели","efficiency.steps":"Шаги","efficiency.stepsValue":"{steps}","efficiency.throughput":"Скорость выдачи","efficiency.title":"Эффективность запросов","efficiency.tool":"Время инструментов","efficiency.ttft":"Первый токен, среднее","efficiency.ttftOver":"шагов: {steps}","efficiency.turns":"Ходы","efficiency.turnsValue":"{turns}","empty.usage":"Расхода токенов пока нет","empty.usageHint":"Цифры появятся, когда сессия сделает первый запрос к модели.","overview.billedInput":"Оплаченный вход","overview.billedInputSub":"мимо кэша {uncached} · из кэша {cached}","overview.cacheHit":"Попадания в кэш","overview.cacheHitSub":"прочитано {read} из {total} ток","overview.context":"Контекст занят","overview.contextSub":"{used} из {window} ток","overview.contextUnknown":"Размер окна модели неизвестен","overview.output":"Выход","overview.outputSub":"всего {total} ток","scope.aria":"Охват статистики","scope.session":"Эта сессия","scope.sessions":"Все сессии","sessions.currentTag":"Текущая","sessions.detail.noData":"Данные по этой сессии загружаются или их нет","sessions.detail.title":"Подробности сессии","sessions.empty":"Расход по сессиям не записан","sessions.inactive":"Простаивает","sessions.running":"Работает","sessions.selectHint":"Выберите строку, чтобы посмотреть сессию","sessions.subagentTag":"Субагент","sessions.summary.input":"Оплаченный вход, всего","sessions.summary.output":"Выход, всего","sessions.summary.sessions":"Сессий с расходом","sessions.summary.sessionsValue":"{count}","sessions.summary.totalValue":"всего сессий: {count}","sessions.summary.turns":"Ходов всего","sessions.summary.turnsValue":"{turns}","sessions.table.cacheHit":"Попаданий в кэш","sessions.table.input":"Оплаченный вход","sessions.table.output":"Выход","sessions.table.session":"Сессия","sessions.table.status":"Состояние","sessions.table.turns":"Ходы","sessions.table.updated":"Изменена","steps.cacheRead":"Кэш Ч","steps.cacheWrite":"Кэш З","steps.caption":"Только загруженное окно, новые сверху; итог считает то же окно","steps.done":"Готово","steps.empty":"В загруженном окне шагов нет","steps.input":"Вход","steps.interrupted":"Прервано","steps.model":"Модель","steps.output":"Выход","steps.reasoning":"Рассуждения","steps.sortBy":"Сортировать по «{column}»","steps.status":"Состояние","steps.title":"Подробности по шагам","steps.tps":"ток/с","steps.ttft":"Первый токен","steps.turn":"Ход.шаг","steps.windowTotal":"Итог по окну","time.daysAgo":"{n} дн назад","time.hoursAgo":"{n} ч назад","time.justNow":"только что","time.minutesAgo":"{n} мин назад","view.usage":"Статистика"},"dsh-token-dashboard":{"buckets.cacheRead":"Чтение кэша","buckets.cacheWrite":"Запись в кэш","buckets.caption":"Четыре непересекающиеся корзины тарификации · всего {total} ток","buckets.output":"Выход","buckets.title":"Состав токенов","buckets.uncachedInput":"Вход мимо кэша","composition.caption":"Оценка по эвристике, не по счёту; в сумму занятости не сойдётся","composition.messages":"Сообщения","composition.system":"Системный промпт","composition.title":"Состав контекста","composition.tools":"Схемы инструментов","efficiency.llm":"Время модели","efficiency.steps":"Шаги","efficiency.stepsValue":"{steps}","efficiency.throughput":"Скорость выдачи","efficiency.title":"Эффективность запросов","efficiency.tool":"Время инструментов","efficiency.ttft":"Первый токен, среднее","efficiency.ttftOver":"шагов: {steps}","efficiency.turns":"Ходы","efficiency.turnsValue":"{turns}","empty.usage":"Расхода токенов пока нет","empty.usageHint":"Цифры появятся, когда сессия сделает первый запрос к модели.","overview.billedInput":"Оплаченный вход","overview.billedInputSub":"мимо кэша {uncached} · из кэша {cached}","overview.cacheHit":"Попадания в кэш","overview.cacheHitSub":"прочитано {read} из {total} ток","overview.context":"Контекст занят","overview.contextSub":"{used} из {window} ток","overview.contextUnknown":"Размер окна модели неизвестен","overview.output":"Выход","overview.outputSub":"всего {total} ток","scope.aria":"Охват статистики","scope.session":"Эта сессия","scope.sessions":"Все сессии","sessions.currentTag":"Текущая","sessions.detail.noData":"Данные по этой сессии загружаются или их нет","sessions.detail.title":"Подробности сессии","sessions.empty":"Расход по сессиям не записан","sessions.inactive":"Простаивает","sessions.running":"Работает","sessions.selectHint":"Выберите строку, чтобы посмотреть сессию","sessions.subagentTag":"Субагент","sessions.summary.input":"Оплаченный вход, всего","sessions.summary.output":"Выход, всего","sessions.summary.sessions":"Сессий с расходом","sessions.summary.sessionsValue":"{count}","sessions.summary.totalValue":"всего сессий: {count}","sessions.summary.turns":"Ходов всего","sessions.summary.turnsValue":"{turns}","sessions.table.cacheHit":"Попаданий в кэш","sessions.table.input":"Оплаченный вход","sessions.table.output":"Выход","sessions.table.session":"Сессия","sessions.table.status":"Состояние","sessions.table.turns":"Ходы","sessions.table.updated":"Изменена","steps.cacheRead":"Кэш Ч","steps.cacheWrite":"Кэш З","steps.caption":"Только загруженное окно, новые сверху; итог считает то же окно","steps.done":"Готово","steps.empty":"В загруженном окне шагов нет","steps.input":"Вход","steps.interrupted":"Прервано","steps.model":"Модель","steps.output":"Выход","steps.reasoning":"Рассуждения","steps.sortBy":"Сортировать по «{column}»","steps.status":"Состояние","steps.title":"Подробности по шагам","steps.tps":"ток/с","steps.ttft":"Первый токен","steps.turn":"Ход.шаг","steps.windowTotal":"Итог по окну","time.daysAgo":"{n} дн назад","time.hoursAgo":"{n} ч назад","time.justNow":"только что","time.minutesAgo":"{n} мин назад","view.usage":"Статистика"},"usageDashboard":{"buckets.cacheRead":"Чтение кэша","buckets.cacheWrite":"Запись в кэш","buckets.caption":"Четыре непересекающиеся корзины тарификации · всего {total} ток","buckets.output":"Выход","buckets.title":"Состав токенов","buckets.uncachedInput":"Вход мимо кэша","composition.caption":"Оценка по эвристике, не по счёту; в сумму занятости не сойдётся","composition.messages":"Сообщения","composition.system":"Системный промпт","composition.title":"Состав контекста","composition.tools":"Схемы инструментов","efficiency.llm":"Время модели","efficiency.steps":"Шаги","efficiency.stepsValue":"{steps}","efficiency.throughput":"Скорость выдачи","efficiency.title":"Эффективность запросов","efficiency.tool":"Время инструментов","efficiency.ttft":"Первый токен, среднее","efficiency.ttftOver":"шагов: {steps}","efficiency.turns":"Ходы","efficiency.turnsValue":"{turns}","empty.usage":"Расхода токенов пока нет","empty.usageHint":"Цифры появятся, когда сессия сделает первый запрос к модели.","overview.billedInput":"Оплаченный вход","overview.billedInputSub":"мимо кэша {uncached} · из кэша {cached}","overview.cacheHit":"Попадания в кэш","overview.cacheHitSub":"прочитано {read} из {total} ток","overview.context":"Контекст занят","overview.contextSub":"{used} из {window} ток","overview.contextUnknown":"Размер окна модели неизвестен","overview.output":"Выход","overview.outputSub":"всего {total} ток","scope.aria":"Охват статистики","scope.session":"Эта сессия","scope.sessions":"Все сессии","sessions.currentTag":"Текущая","sessions.detail.noData":"Данные по этой сессии загружаются или их нет","sessions.detail.title":"Подробности сессии","sessions.empty":"Расход по сессиям не записан","sessions.inactive":"Простаивает","sessions.running":"Работает","sessions.selectHint":"Выберите строку, чтобы посмотреть сессию","sessions.subagentTag":"Субагент","sessions.summary.input":"Оплаченный вход, всего","sessions.summary.output":"Выход, всего","sessions.summary.sessions":"Сессий с расходом","sessions.summary.sessionsValue":"{count}","sessions.summary.totalValue":"всего сессий: {count}","sessions.summary.turns":"Ходов всего","sessions.summary.turnsValue":"{turns}","sessions.table.cacheHit":"Попаданий в кэш","sessions.table.input":"Оплаченный вход","sessions.table.output":"Выход","sessions.table.session":"Сессия","sessions.table.status":"Состояние","sessions.table.turns":"Ходы","sessions.table.updated":"Изменена","steps.cacheRead":"Кэш Ч","steps.cacheWrite":"Кэш З","steps.caption":"Только загруженное окно, новые сверху; итог считает то же окно","steps.done":"Готово","steps.empty":"В загруженном окне шагов нет","steps.input":"Вход","steps.interrupted":"Прервано","steps.model":"Модель","steps.output":"Выход","steps.reasoning":"Рассуждения","steps.sortBy":"Сортировать по «{column}»","steps.status":"Состояние","steps.title":"Подробности по шагам","steps.tps":"ток/с","steps.ttft":"Первый токен","steps.turn":"Ход.шаг","steps.windowTotal":"Итог по окну","time.daysAgo":"{n} дн назад","time.hoursAgo":"{n} ч назад","time.justNow":"только что","time.minutesAgo":"{n} мин назад","view.usage":"Статистика"}}