@goodandready/dsh-russian-lang 0.2.26 → 0.3.1

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 (52) hide show
  1. package/README.md +1 -1
  2. package/bin/dsh-i18n.mjs +247 -0
  3. package/lib/client.js +785 -410
  4. package/lib/index.js +69 -13
  5. package/lib/locales/plugins/01-token-dashboard.json +1 -1
  6. package/lib/locales/plugins/10-kanban.json +1 -1
  7. package/lib/locales/plugins/13-agent-teams.json +1 -1
  8. package/lib/locales/plugins/16-usage-stats.json +1 -1
  9. package/lib/locales/plugins/23-moa.json +1 -1
  10. package/lib/locales/plugins/24-personal-directive.json +1 -1
  11. package/lib/locales/plugins/33-messenger-gateway.json +1 -1
  12. package/lib/locales/plugins/35-gitea.json +1 -1
  13. package/lib/locales/plugins/36-cost-meter.json +1 -1
  14. package/lib/locales/plugins/37-time-machine.json +1 -1
  15. package/lib/locales/plugins/38-context-lens.json +1 -1
  16. package/lib/locales/plugins/39-shadow-auditor.json +1 -1
  17. package/lib/locales/plugins/40-clinebot.json +1 -1
  18. package/lib/locales/plugins/41-lanmode.json +1 -1
  19. package/lib/locales/plugins/42-plugin-console.json +1 -1
  20. package/lib/locales/plugins/46-memory-brain.json +1 -1
  21. package/lib/locales/plugins/48-task-tracker.json +1 -1
  22. package/lib/locales/plugins/49-dsml-guard.json +1 -1
  23. package/lib/locales/plugins/49-usage-guard.json +1 -1
  24. package/lib/locales/plugins/50-automode.json +1 -1
  25. package/lib/locales/plugins/54-workshop-market.json +1 -1
  26. package/lib/locales/plugins/56-cron.json +1 -1
  27. package/lib/locales/plugins/57-live-canvas.json +1 -1
  28. package/lib/locales/plugins/58-grok-xsearch.json +1 -1
  29. package/lib/locales/plugins/59-goal.json +1 -1
  30. package/lib/locales/plugins/60-model-sync.json +1 -1
  31. package/lib/locales/plugins/61-issue-reporter.json +1 -1
  32. package/lib/locales/plugins/62-model-search.json +1 -1
  33. package/lib/locales/plugins/63-agent-orchestrator.json +1 -1
  34. package/lib/locales/plugins/64-key-limits.json +1 -1
  35. package/lib/locales/plugins/65-subscriptions.json +1 -1
  36. package/lib/locales/plugins/66-tts.json +1 -1
  37. package/lib/locales/plugins/67-voice.json +1 -1
  38. package/lib/locales/plugins/68-image-gen.json +1 -1
  39. package/lib/locales/plugins/69-plugin-notify.json +1 -1
  40. package/lib/locales/plugins/70-hypotheses.json +1 -1
  41. package/lib/locales/plugins/71-memory-meter.json +1 -1
  42. package/lib/locales/plugins/72-server-monitor.json +1 -70
  43. package/lib/locales/plugins/73-agentrouter.json +1 -1
  44. package/lib/locales/plugins/75-test-pilot.json +1 -0
  45. package/lib/locales/plugins/76-visualize.json +1 -0
  46. package/lib/locales/plugins/77-github-ops.json +1 -0
  47. package/lib/locales/plugins/78-web-gateway.json +1 -0
  48. package/lib/locales/plugins/79-approval-gate.json +1 -0
  49. package/lib/locales.js +50 -12
  50. package/lib/pure.js +251 -13
  51. package/package.json +7 -3
  52. package/lib/locales/plugins/44-goal.json +0 -1
package/lib/index.js CHANGED
@@ -1,15 +1,38 @@
1
+ import crypto from 'node:crypto'
1
2
  import { registerPluginUpdater } from './plugin-updater.js'
2
3
  import { registerTranslator } from './translator.js'
3
- import { getCoreDictionaries, getPluginDictionaries, getZhRuMap } from './locales.js'
4
+ import { getCoreDictionaries, getPluginDictionaries, getPluginDictionariesByNames, getZhRuMap } from './locales.js'
4
5
  // dsh-russian-lang — серверная половина.
5
6
  //
6
7
  // Словари и переключатель живут в браузере (lib/client.js). Хосту переводить
7
8
  // нечего, но у выбора языка есть сохраняемая настройка: регистрируем её схему
8
- // в собственном namespace, чтобы запись переживала браузеры и машины через
9
+ // в собственном namespace, чтобы запись переживала браузеры и машины череж
9
10
  // штатный механизм настроек DSH.
10
11
  import z from '@deepseek-ai/schemastery'
11
12
  import { SYSTEM_PROMPT_PRESETS } from './pure.js'
12
13
 
14
+
15
+ const sendJsonWithEtag = (request, response, obj, maxAge = 300) => {
16
+ const body = Buffer.from(JSON.stringify(obj), 'utf-8')
17
+ const etag = '"' + crypto.createHash('md5').update(body).digest('hex') + '"'
18
+ const ifNoneMatch = request?.headers?.['if-none-match']
19
+ if (ifNoneMatch && (ifNoneMatch === etag || ifNoneMatch === '*' || ifNoneMatch === `W/${etag}`)) {
20
+ response.writeHead(304, {
21
+ 'etag': etag,
22
+ 'cache-control': `public, max-age=${maxAge}, must-revalidate`,
23
+ })
24
+ response.end()
25
+ return
26
+ }
27
+ response.writeHead(200, {
28
+ 'content-type': 'application/json; charset=utf-8',
29
+ 'etag': etag,
30
+ 'cache-control': `public, max-age=${maxAge}, must-revalidate`,
31
+ 'content-length': body.length,
32
+ })
33
+ response.end(body)
34
+ }
35
+
13
36
  export const name = '@goodandready/dsh-russian-lang'
14
37
 
15
38
  const RussianLangSettingsSchema = z.object({
@@ -36,7 +59,7 @@ export function apply(ctx) {
36
59
  })
37
60
 
38
61
  // #68: русский системный промпт агента (опционально). Регистрируем секцию
39
- // промпта, которая задаёт стиль ответов по-русски, когда включён флаг
62
+ // промпта, которая задёт стиль ответов по-русски, когда включён флаг
40
63
  // russian-lang.agentPrompt. Секция — официальная точка расширения ядра.
41
64
  ctx.inject(['settings', 'systemPrompt'], (settingsCtx, prompt) => {
42
65
  const NS = 'russian-lang'
@@ -57,7 +80,7 @@ export function apply(ctx) {
57
80
  sync()
58
81
  })
59
82
 
60
- // Web endpoints: One-click plugin updater, modular plugin dictionary serving, & translator gateway
83
+ // Web endpoints: One-click plugin updater, modular lazy-plugin dictionary serving, & translator gateway
61
84
  if (typeof ctx.inject === 'function') {
62
85
  ctx.inject(['webServer'], (wctx) => {
63
86
  try {
@@ -73,9 +96,44 @@ export function apply(ctx) {
73
96
  let ws = null
74
97
  try { ws = wctx?.webServer } catch (_) { ws = null }
75
98
 
76
- let unregDict = () => {}
99
+ const unregsDict = []
77
100
  if (ws && typeof ws.register === 'function') {
78
- unregDict = ws.register({
101
+ // 1. Core dictionary only (fast-boot, ~135 KB)
102
+ unregsDict.push(ws.register({
103
+ kind: 'exact',
104
+ path: '/api/dsh-russian-lang/dict/core',
105
+ handler: async (request, response) => {
106
+ try {
107
+ const core = getCoreDictionaries()
108
+ const zhRu = getZhRuMap()
109
+ sendJsonWithEtag(request, response, { core, zhRu })
110
+ } catch (err) {
111
+ response.writeHead(500, { 'content-type': 'application/json; charset=utf-8' })
112
+ response.end(JSON.stringify({ error: String(err) }))
113
+ }
114
+ },
115
+ }))
116
+
117
+ // 2. On-demand plugins dictionary serving (query: ?names=p1,p2...)
118
+ unregsDict.push(ws.register({
119
+ kind: 'prefix',
120
+ path: '/api/dsh-russian-lang/dict/plugins',
121
+ handler: async (request, response) => {
122
+ try {
123
+ const url = new URL(request.url, 'http://localhost')
124
+ const namesParam = url.searchParams.get('names') || url.searchParams.get('list') || ''
125
+ const names = namesParam ? namesParam.split(',').map((s) => s.trim()).filter(Boolean) : null
126
+ const plugins = getPluginDictionariesByNames(names)
127
+ sendJsonWithEtag(request, response, { plugins })
128
+ } catch (err) {
129
+ response.writeHead(500, { 'content-type': 'application/json; charset=utf-8' })
130
+ response.end(JSON.stringify({ error: String(err) }))
131
+ }
132
+ },
133
+ }))
134
+
135
+ // 3. Backward compatibility all-dictionaries endpoint
136
+ unregsDict.push(ws.register({
79
137
  kind: 'exact',
80
138
  path: '/api/dsh-russian-lang/dict/all',
81
139
  handler: async (request, response) => {
@@ -83,23 +141,21 @@ export function apply(ctx) {
83
141
  const core = getCoreDictionaries()
84
142
  const plugins = getPluginDictionaries()
85
143
  const zhRu = getZhRuMap()
86
- response.writeHead(200, {
87
- 'content-type': 'application/json; charset=utf-8',
88
- 'cache-control': 'public, max-age=300',
89
- })
90
- response.end(JSON.stringify(Object.assign({}, core, plugins, { core, plugins, zhRu })))
144
+ sendJsonWithEtag(request, response, Object.assign({}, core, plugins, { core, plugins, zhRu }))
91
145
  } catch (err) {
92
146
  response.writeHead(500, { 'content-type': 'application/json; charset=utf-8' })
93
147
  response.end(JSON.stringify({ error: String(err) }))
94
148
  }
95
149
  },
96
- })
150
+ }))
97
151
  }
98
152
 
99
153
  return () => {
100
154
  if (typeof unregUpdater === 'function') unregUpdater()
101
155
  if (typeof unregTranslator === 'function') unregTranslator()
102
- if (typeof unregDict === 'function') unregDict()
156
+ for (const u of unregsDict) {
157
+ if (typeof u === 'function') u()
158
+ }
103
159
  }
104
160
  }
105
161
  if (typeof wctx.effect === 'function') wctx.effect(mount, 'russian-lang: web routes')
@@ -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":"Статистика"}}
@@ -1 +1 @@
1
- {"dsh-kanban":{"DEFAULT_BOARDS.main.title":"Проектная доска","DEFAULT_BOARDS.simple.title":"Простая доска","acceptance.accept":"Принять (Выполнено)","acceptance.acceptAndMerge":"Принять и смержить ветку","acceptance.merging":"Выполняется слияние ветки…","acceptance.reject":"Вернуть на доработку","acceptance.rejectReasonPlaceholder":"Укажите, что необходимо исправить или доработать...","acceptance.rejectSubmit":"Отправить на доработку","acceptance.rejectTitle":"Возврат на доработку","acceptance.rejectedAlert":"Возвращено на доработку: {reason}","acceptance.rejectedBadge":"На доработке","acceptance.title":"Приёмка и проверка задачи","action.exportCsv":"Экспорт доски в CSV","action.resume":"Возобновить выполнение","archive.empty":"В архиве пусто.","archive.hint":"Карточки, отстоявшие свой срок в «Выполнено». Ничего не удалено: возвращённая карточка встаёт в ту же колонку, откуда ушла.","archive.restore":"Вернуть на доску","archive.since":"в архиве {ago}","archiveAfterDays":"Через сколько дней в колонке «Выполнено» карточка уходит в архив. Ноль — не убирать.","batch.hint":"Одна сессия на все. Задачи приходят по очереди: агент берёт следующую, закончив текущую. В «В работе» уезжает только первая — остальные ждут своей очереди там, где лежат.","batch.start":"Запустить","batch.title":"Запустить {n} задач в одном чате","board.allRepos":"Все репозитории","board.archive":"Архив","board.back":"В чат","board.backHint":"Закрыть доску и вернуться в разговор","board.clearFilters":"Снять отборы","board.collapse":"Свернуть колонку","board.empty":"Задач пока нет.","board.expand":"Развернуть колонку","board.export":"Скачать","board.exportHint":"Экспортировать всю доску в файл JSON","board.import":"Импорт","board.imported":"Импортировано {n} задач","board.limit":"предел {n}","board.loading":"Доска загружается…","board.metrics":"Метрики","board.mine":"Мои: {n}","board.mineHint":"Задачи, назначенные на {who}","board.newTask":"Задача","board.noMatch":"Ничего не найдено.","board.noRepo":"без проекта","board.overdueCount":"Просрочено: {n}","board.overdueHint":"Показать только просроченные задачи","board.pickArchive":"В архив","board.pickMove":"Перенести…","board.pickNone":"Снять выбор","board.pickStart":"Запустить выбранные","board.pickUnqueue":"Снять с очереди","board.pickedCount":"выбрано {n}","board.refresh":"Обновить","board.repo":"репозиторий","board.search":"Поиск","board.shown":"показано {shown} из {total}","board.someFailed":"Сделано у {done} из {total}, остальные отказали.","board.sync":"Сверить с Gitea","board.syncing":"Сверяю…","board.waitCount":"Ждут ответа: {n}","board.waitCountHint":"Задачи, где агент задал вопрос или просит разрешения.","board.waiting":"нужен человек","boardName.main":"Проектная доска","boardName.simple":"Простая доска","boardToolEnabled":"Разрешить агенту двигать карточки инструментом board_move.","card.assigneeHint":"Кто взял задачу","card.attach":"Прикрепить файл","card.checklist":"Чеклист","card.comments":"Комментарии","card.created":"Создано {date}","card.deadline":"Срок выполнения","card.deleteConfirm":"Удалить эту карточку?","card.description":"Описание задачи","card.due":"срок {date}","card.dueDate":"Крайний срок","card.edit":"Редактировать","card.labels":"Метки","card.move":"Переместить в колонку","card.pack":"пачка {at} из {total}","card.packHint":"Запущены вместе, одной сессией; агент берёт их в этом порядке.","card.pick":"Отметить для группового запуска","card.priority":"Приоритет","card.progress":"Прогресс","card.queue":"в очередь...","card.revive":"Восстановить","card.stop":"остановить","card.tags":"Теги","card.title":"Название карточки","card.toChat":"перейти в чат","card.unqueue":"снять с очереди","checklist.add":"Добавить","checklist.empty":"Критерии готовности ещё не настроены.","checklist.evidence":"Подтверждение: {text}","checklist.placeholder":"Новый критерий готовности...","checklist.progress":"DoD: {done} из {total}","checklist.required":"Обязательно","checklist.title":"Критерии готовности (DoD)","chip.moveTo":"Перенести в","chip.note":"Оставить заметку","chip.noteHint":"Заметка дописывается в тело задачи. Тело уходит агенту первым сообщением, поэтому заметка до запуска попадёт в работу, а после запуска — нет.","chip.noteSave":"Дописать","chip.openCard":"Перейти к карточке","column.addCard":"+ Добавить карточку","column.backlog":"Бэклог","column.cleanup":"Уборка","column.clear":"Очистить колонку","column.collapse":"Свернуть колонку","column.delete":"Удалить колонку","column.deploy":"Выкатка","column.done":"Выполнено","column.empty":"В этой колонке нет задач","column.expand":"Развернуть колонку","column.in-progress":"В работе","column.limit":"Лимит WIP: {n}","column.rename":"Переименовать колонку","column.review":"Ревью","column.title":"Название колонки","columnNames":"Свои названия колонок парами «идентификатор=Название» через запятую. Пусто — обычные названия.","comments.add":"Опубликовать комментарий","comments.authorAgent":"Агент","comments.authorUser":"Пользователь","comments.empty":"Комментариев пока нет.","comments.placeholder":"Добавьте заметку или отзыв...","comments.title":"Обсуждение и комментарии","console.empty":"Вывод агента пока не записан.","console.tab":"Живая консоль","defaultProjectRoot":"Корень, в котором лежат рабочие копии проектов. Пусто — рабочая папка харнесса.","dialog.archived":"архив","dialog.bodyHint":"Уйдёт агенту первым сообщением при запуске задачи.","dialog.cancel":"Отмена","dialog.create":"Создать","dialog.fromGitea":"Из Gitea","dialog.imported":"уже на доске","dialog.kind":"Какая это задача","dialog.kindPlain":"Не проект","dialog.kindPlainHint":"Заметка, не относящаяся ни к какому репозиторию. Живёт на простой доске и в Gitea не попадает.","dialog.kindProject":"Проект","dialog.kindProjectHint":"В Gitea заводится issue, карточка привязывается к нему и живёт на проектной доске.","dialog.labelsHint":"через запятую","dialog.loadingRepos":"Репозитории загружаются…","dialog.noIssues":"Открытых issue не найдено.","dialog.noRepos":"Репозиториев нет","dialog.own":"Своя задача","dialog.pickRepo":"Выберите репозиторий","dialog.repo":"Репозиторий","dialog.repoNamePlaceholder":"имя нового репозитория, латиницей","dialog.repoNew":"— новый репозиторий —","dialog.repoNewHint":"Будет создан в организации: приватный и пустой, без README и заготовок. Создание репозитория отсюда не отменить.","dialog.taskBody":"Описание","dialog.taskColumn":"Колонка","dialog.taskLabels":"Метки","dialog.taskTitle":"Заголовок","dialog.title":"Новая задача","diff.additions":"Добавлено","diff.author":"Автор","diff.branch":"Ветка: {name}","diff.cherryPick":"Перенести коммит (Cherry-pick)","diff.commits":"Коммиты задачи ({n})","diff.date":"Дата","diff.deletions":"Удалено","diff.empty":"Нет коммитов или изменений файлов для этой задачи.","diff.filesChanged":"Изменено файлов: {n}","diff.hash":"Хеш","diff.hide":"Скрыть просмотр diff","diff.loadFailed":"Не удалось загрузить изменения: {error}","diff.loading":"Загрузка коммитов и diff…","diff.mergeConflict":"Обнаружены конфликты слияния","diff.mergeFailed":"Сбой слияния ветки: {error}","diff.mergeSuccess":"Ветка успешно смержена в основную","diff.message":"Сообщение коммита","diff.resolveConflicts":"Разрешить конфликты","diff.revert":"Откатить коммит","diff.show":"Показать просмотр diff","diff.staged":"Подготовленные изменения","diff.title":"Изменения в ветке задачи","diff.truncated":"Дифф обрезан (превышен лимит)","diff.uncommitted":"Незакоммиченные изменения","diff.view":"Просмотр изменений","discard":"Отменить","epic.addSubtask":"Добавить подзадачу","epic.badge":"Эпик","epic.createGiteaIssues":"Также создать связанные задачи в Gitea","epic.noSubtasks":"Подзадач пока нет.","epic.progress":"Подзадач: {done}/{total}","epic.subtasks":"Подзадачи","epic.triage":"Декомпозировать","epic.triageHelp":"Введите по одному названию подзадачи в строке. Дочерние задачи будут привязаны к этому эпику.","epic.triageSubmit":"Создать подзадачи","epic.triageTitle":"Декомпозиция задачи на подзадачи","error.bad-repo-name":"В имени репозитория допустимы только латинские буквы, цифры, точка, дефис и подчёркивание.","error.badImport":"Неверный формат файла импорта","error.crossSite":"Запрос отклонён как межсайтовый.","error.gitea-unreachable":"Сервер Gitea недоступен","error.giteaAbsent":"Плагин Gitea не установлен, импорт недоступен.","error.giteaUnconfigured":"Сначала настройте Gitea в карточке плагина Gitea.","error.issue-not-created":"Issue не заведён. Если репозиторий был новым, он остался — ничего не удалено.","error.issueNotFound":"Issue не найден.","error.modelNotSelected":"Модель не выбрана — задайте её в настройках или укажите здесь.","error.no-live-sessions":"Нет ни одной идущей сессии, в очередь ставить некуда.","error.permission-refused":"Уровень доступа не принят, задача не запущена.","error.permission-unavailable":"В этой сборке уровней доступа нет — задача не запущена, чтобы не пойти с бо́льшими правами, чем просили.","error.repo-not-created":"Репозиторий не создан; больше ничего не сделано.","error.repo-required":"Выберите репозиторий или назовите новый.","error.session-not-live":"Эта сессия больше не идёт.","error.sessionNotOpened":"Сессия поднята ({id}), но эта сборка не умеет в неё переключиться. Найдите её в списке сессий.","error.startFailed":"Не удалось поднять сессию.","error.task-not-queued":"Задача не стоит в очереди.","error.taskHasNoIssue":"За этой задачей нет issue в Gitea.","error.taskNotFound":"Задача не найдена.","error.titleRequired":"Нужен заголовок.","error.unknown":"Запрос не выполнен.","facet.assignee":"Исполнитель","facet.author":"Автор","facet.priority":"Приоритет","facet.release":"Выпуск","facet.repo":"Репозиторий","facet.risk":"Риск","facet.scope":"Область","facet.signal":"Сигнал","facet.status":"Статус","facet.type":"Тип","field.announceToAgent":"Уведомлять агента об изменениях","field.archiveAfterDays":"Убирать в архив из «Выполнено» через, дней","field.autoSyncSessions":"Автосинхронизация внешних сессий чата","field.boardToolEnabled":"Разрешить агенту двигать карточки","field.columnNames":"Свои названия колонок","field.cronEnabled":"Включить планировщик задач","field.defaultProjectRoot":"Корень проектов","field.giteaOwner":"Организация Gitea","field.giteaTokenRef":"Имя учётной записи","field.giteaUrl":"Адрес инстанса","field.maxConcurrentSessions":"Макс. параллельных сессий агентов","field.permissionGateEnabled":"Контроль прав доступа к доске","field.preventIdleSleep":"Предотвращать засыпание при активных задачах","field.progressDumpEnabled":"Дамп прогресса выполнения","field.pushToGitea":"Закрывать issue в Gitea","field.replyInstruction":"Постоянная приписка","field.sessionDefaultPermission":"Права доступа сессии по умолчанию","field.staleAfterMin":"Считать задачу молчащей после, минут","field.startPrompt":"Шаблон первого сообщения","field.syncIntervalSec":"Сверяться с Gitea раз в, секунд","field.watchRepos":"Сузить подхват до репозиториев","field.webhookSecretRef":"Имя учётной записи для вебхука","field.wipInProgress":"Предел «В работе»","field.wipReview":"Предел «Ревью»","field.workspaceClaimBoundaries":"Границы захвата рабочей области","field.worktreeIsolation":"Изоляция рабочих деревьев (worktree)","field.worktreeRoot":"Корневой каталог worktree","filter.active":"Активные","filter.all":"Все задачи","filter.assignee":"Исполнитель","filter.epics":"Эпики","filter.label":"Метка","filter.overdue":"Просроченные","filter.priority":"Приоритет","filter.review":"На проверке","filter.search":"Поиск задач…","filter.stale":"Без активности","giteaOwner":"Организация Gitea, чьи репозитории смотрит доска. Пусто — определяется сама, если организация одна.","giteaTokenRef":"ИМЯ учётной записи DSH, в которой лежит токен. Сам токен сюда не вводить.","giteaUrl":"Адрес инстанса Gitea или Forgejo, например https://gitea.example.com. Пусто — импорт недоступен.","group.assignee":"По исполнителям","group.general":"Общее","group.gitea":"Gitea","group.limits":"Пределы колонок","group.nobody":"Без исполнителя","group.repo":"По репозиториям","group.sync":"Автоперемещение","hint.announceToAgent":"Автоматически отправлять агенту сообщения о перемещении карточек","hint.archiveAfterDays":"Считается с попадания карточки в «Выполнено». Ноль — оставлять всё на доске.","hint.autoSyncSessions":"Автоматически создавать карточки на доске для стандартных диалогов чата DSH.","hint.boardToolEnabled":"Выключено, пока скилл воркфлоу запрещает этому CLI трогать канбан.","hint.columnNames":"Пары «идентификатор=Название» через запятую, например «backlog=Идеи, review=Проверка». Пусто — обычные названия.","hint.cronEnabled":"Запуск фоновых периодических проверок статусов задач","hint.defaultProjectRoot":"Где лежат рабочие копии проектов. Пусто — рабочая папка харнесса.","hint.giteaOwner":"Чьи репозитории смотрит доска. Пусто — определится сама, пока у токена ровно одна организация.","hint.giteaTokenRef":"ИМЯ учётной записи DSH, в которой лежит токен. Сам токен сюда не вводить.","hint.giteaUrl":"Например https://gitea.example.com. Пусто — импорт недоступен.","hint.label":"Пусто — метка для этой колонки не ставится.","hint.limit":"Ноль — без предела. Превышение подсвечивается, но не запрещается.","hint.permissionGateEnabled":"Требовать подтверждения при выполнении деструктивных операций","hint.preventIdleSleep":"Не усыплять фоновый процесс DSH, пока есть незавершённые задачи","hint.progressDumpEnabled":"Периодически сохранять прогресс выполнения в файл progress.md","hint.pushToGitea":"Карточка, дошедшая до «Выполнено», закрывает свой issue. Меток доска не ставит: стадия и так видна по ветке и pull request.","hint.replyInstruction":"Дописывается к каждому первому сообщению — например язык ответа. Пусто — ничего не добавляется.","hint.sessionDefaultPermission":"Уровень прав, выдаваемый сессиям без явных настроек","hint.staleAfterMin":"Помечаются только задачи с сессией. Ноль отключает отметку.","hint.startPrompt":"Шаблон первого сообщения агенту. Пусто — встроенный шаблон.","hint.syncIntervalSec":"Ноль отключает сверку. Меньше пятнадцати секунд поднимается до пятнадцати.","hint.watchRepos":"Через запятую, «владелец/репо» или просто «репо». Пусто — все репозитории организации, где есть открытые задачи.","hint.webhookSecretRef":"ИМЯ учётной записи DSH с секретом вебхука Gitea. Пусто — остаётся только опрос.","hint.worktreeIsolation":"Создавать отдельный git worktree для каждой задачи","hint.worktreeRoot":"Каталог, в котором создаются временные изолированные worktree","import.error":"Ошибка импорта JSON доски","import.success":"Доска успешно импортирована","label.assigned":"Назначено","label.blocked":"Заблокировано","label.completed":"Выполнено","label.inProgress":"В работе","label.pending":"В очереди","label.review":"На проверке","metrics.columns":"Время в колонках","metrics.completed":"Завершено задач: {n}","metrics.cycleTime":"Среднее время выполнения: {days} дн.","metrics.empty":"Переходов ещё не было — измерять нечего.","metrics.hint":"{n} задач на доске • выполнено за неделю: {week} • за месяц: {month}","metrics.leadTime":"Общее время от создания: {days} дн.","metrics.leadTimeAvg":"Средний Lead Time","metrics.mean":"среднее {time}","metrics.median":"медиана {time}","metrics.noStale":"Ни одна задача не задерживалась так долго.","metrics.stale":"Без движения дольше {days} дн.","metrics.throughput":"Пропускная способность","metrics.total":"Всего задач: {n}","metrics.wip":"Задач в работе (WIP): {n}","metrics.wipLimit":"Лимит задач в работе (WIP)","modal.confirmDelete":"Подтверждение удаления","modal.createTask":"Создание новой задачи","modal.editTask":"Редактирование задачи","move.backlog":"Работа по задаче останавливается: идущий ход агента будет прерван. Если сессии нет, карточка просто переедет.","move.cleanup":"Агент удалит ветку в Gitea, worktree и локальную ветку и запишет это в issue.","move.confirm":"Перенести","move.deploy":"Агент вольёт pull request и выкатит. Сам перенос в эту колонку И ЕСТЬ ваше «ок» на deploy — второй раз агент спрашивать не станет.","move.done":"Задача считается завершённой. Это решение человека: сам агент карточку сюда не переносит.","move.in-progress":"Агент получит команду начать или продолжить реализацию.","move.review":"Агент доведёт работу до ревью: снимет с pull request пометку черновика и запросит проверку.","move.title":"Перенести в «{column}»?","nav.all":"Все доски","nav.back":"Назад к доске","nav.settings":"Настройки доски","order.manual":"Как разложено","order.new":"Сначала новые","order.old":"Сначала старые","panel.agentPreset":"Профиль агента","panel.archive":"В архив","panel.assignDrop":"Отказаться","panel.assignMe":"Взять себе","panel.assignee":"взял {who}","panel.author":"завёл {who}","panel.bodyLoading":"читаю описание…","panel.cleanupWorktree":"Очистить worktree","panel.close":"Закрыть","panel.continue":"Продолжить","panel.continueHint":"У задачи один чат: открывается прежняя сессия, а не новая.","panel.created":"заведена {ago} назад","panel.delete":"Удалить","panel.deleteConfirm":"Удалить «{title}»? Отменить будет нельзя.","panel.due":"Срок","panel.issue":"Issue","panel.labels":"Метки","panel.log":"Переходы","panel.message":"Сообщение агенту","panel.messageHint":"Правьте перед отправкой. Пустое — уйдёт встроенный текст.","panel.model":"Модель","panel.noLog":"Переходов пока нет.","panel.noModels":"У этого провайдера нет моделей","panel.noProviders":"Провайдеров нет","panel.openChat":"Открыть чат","panel.permission":"Уровень доступа","panel.pickModel":"Выберите модель","panel.pickProvider":"Выберите провайдера","panel.pickProviderFirst":"Сначала выберите провайдера","panel.presetDefault":"Как в харнессе по умолчанию","panel.priority":"Приоритет","panel.priorityNone":"Без приоритета","panel.provider":"Провайдер","panel.refresh":"Обновить из Gitea","panel.saveEdit":"Сохранить","panel.start":"Начать","panel.startHint":"Откроется отдельная сессия агента по этой задаче. Ветку и worktree заводит агент после preflight, а не отсюда.","panel.starting":"Запускается…","panel.updated":"последнее изменение {ago} назад","panel.workDir":"Рабочая папка: {path}","panel.workDirHint":"Корень проекта не указан в настройках, поэтому используется эта папка.","panel.worktree":"Worktree: {path}","panel.worktreeDirty":"Незакоммиченные изменения в worktree: {files}","plan.counter":"{done} из {total}","plan.title":"План агента","pr.create":"Создать PR в Gitea","pr.created":"PR #{n} создан","pr.creating":"Создание PR…","pr.view":"Открыть PR","priority.high":"Высокий","priority.highest":"Критический","priority.low":"Низкий","priority.lowest":"Минимальный","priority.medium":"Средний","priority.normal":"Обычный","priority.urgent":"Срочный","queue.add":"В очередь","queue.hint":"Задача встанет в очередь сессии: агент возьмёт её, закончив текущую работу. До этого карточка остаётся там, где лежит.","queue.option":"{title} - задач: {n}","queue.session":"Сессия","queue.title":"Поставить в очередь идущей сессии","reasoning.default":"По умолчанию (модель)","reasoning.high":"Высокое (глубокие рассуждения)","reasoning.label":"Глубина рассуждений","reasoning.low":"Низкая (быстро / экономно)","reasoning.medium":"Средняя (сбалансировано)","replyInstruction":"Постоянная приписка к первому сообщению — например язык ответа. Пусто — ничего не добавляется.","report.artifacts":"Артефакты","report.changedFiles":"Изменённые файлы","report.checksRun":"Проверки и тесты","report.risks":"Риски и примечания","report.summary":"Сводка","report.title":"Отчёт о выполнении","revive.fresh":"Предыдущая сессия завершена, поэтому запущена новая; старый чат больше недоступен.","revive.same":"Предыдущая сессия восстановлена — чат на том месте, где вы остановились.","save":"Сохранить","section.label":"Канбан","settings.autoArchive":"Автоархивация завершённых задач","settings.autoArchiveHint":"Перемещать завершённые задачи в архив через указанное число дней","settings.boardName":"Название доски","settings.columns":"Колонки доски","settings.description":"Описание канбан-доски","settings.general":"Основные настройки","settings.integrations":"Интеграции","settings.loading":"Загрузка настроек доски…","settings.readOnly":"Настройки в этой сессии доступны только для чтения.","settings.save":"Сохранить настройки","settings.saveFailed":"Не сохранены поля: {fields}","settings.saved":"Настройки сохранены","settings.saving":"Сохранение настроек…","settings.unavailable":"Хост не знает пространство настроек dsh-kanban. Перезапустите веб-интерфейс после установки плагина.","slash.hint":"Введите / для списка команд и навыков","staleAfterMin":"После скольких минут молчания задача с сессией помечается тревожно. Ноль — не помечать.","startPrompt":"Шаблон первого сообщения агенту. Пусто — встроенный шаблон.","state.queued":"в очереди · {n}","state.running":"в работе","state.stopped":"остановился","status.active":"Активна","status.archived":"В архиве","status.closed":"Закрыта","status.open":"Открыта","stop.idle":"Агент не работал, останавливать было нечего.","stop.no-session":"У задачи нет сессии.","subtitle":"Доска задач: issue из Gitea и отдельная сессия под задачу","sync.failed":"сверка не проходит","sync.lastSeen":"последняя удачная сверка {ago} назад","sync.never":"сверки с Gitea ещё не было","sync.neverSeen":"удачной сверки с запуска харнесса не было","sync.okAgo":"сверено {ago} назад","sync.running":"сверяемся с Gitea…","syncIntervalSec":"Как часто сверяться с Gitea, в секундах. Ноль — не сверяться.","task.confirmPermission":"Подтвердить права","task.cron":"Расписание Cron","task.nextRun":"Следующий запуск: {date}","task.noRuns":"Запусков ещё не было","task.permissionConfirmed":"Права подтверждены","task.permissionGateWarning":"Требуется подтверждение повышенных прав ({permission})","task.progressDump":"Дамп прогресса (Handover)","task.runs":"История выполнений","template.bugfix":"Исправление бага (Bugfix)","template.feature":"Новая функция (Feature)","template.label":"Шаблон задачи","template.none":"Без шаблона (пусто)","template.refactor":"Рефакторинг (Refactor)","template.release":"Релиз (Подготовка выпуска)","template.security":"Безопасность (Аудит и CVE)","time.day":"{n} дн","time.hour":"{n} ч","time.min":"{n} мин","time.now":"только что","title":"Канбан","view.analytics":"Аналитика","view.archive":"Архив","view.board":"Доска","view.calendar":"Календарь","view.gantt":"Диаграмма Ганта","view.list":"Список","view.table":"Таблица","watchRepos":"Сузить подхват до этих репозиториев, через запятую. Пусто — все репозитории организации, где есть открытые задачи.","wipInProgress":"Предел числа карточек в колонке «В работе». Ноль — без предела.","wipReview":"Предел числа карточек в колонке «Ревью». Ноль — без предела."}}
1
+ {"dsh-kanban":{"DEFAULT_BOARDS.main.title":"Проектная доска","DEFAULT_BOARDS.simple.title":"Простая доска","acceptance.accept":"Принять (Выполнено)","acceptance.acceptAndMerge":"Принять и смержить ветку","acceptance.merging":"Выполняется слияние ветки…","acceptance.reject":"Вернуть на доработку","acceptance.rejectReasonPlaceholder":"Укажите, что необходимо исправить или доработать...","acceptance.rejectSubmit":"Отправить на доработку","acceptance.rejectTitle":"Возврат на доработку","acceptance.rejectedAlert":"Возвращено на доработку: {reason}","acceptance.rejectedBadge":"На доработке","acceptance.title":"Приёмка и проверка задачи","action.exportCsv":"Экспорт доски в CSV","action.resume":"Возобновить выполнение","archive.empty":"В архиве пусто.","archive.hint":"Карточки, отстоявшие свой срок в «Выполнено». Ничего не удалено: возвращённая карточка встаёт в ту же колонку, откуда ушла.","archive.restore":"Вернуть на доску","archive.since":"в архиве {ago}","archiveAfterDays":"Через сколько дней в колонке «Выполнено» карточка уходит в архив. Ноль — не убирать.","batch.hint":"Одна сессия на все. Задачи приходят по очереди: агент берёт следующую, закончив текущую. В «В работе» уезжает только первая — остальные ждут своей очереди там, где лежат.","batch.start":"Запустить","batch.title":"Запустить {n} задач в одном чате","board.allRepos":"Все репозитории","board.archive":"Архив","board.back":"В чат","board.backHint":"Закрыть доску и вернуться в разговор","board.clearFilters":"Снять отборы","board.collapse":"Свернуть колонку","board.empty":"Задач пока нет.","board.expand":"Развернуть колонку","board.export":"Скачать","board.exportHint":"Экспортировать всю доску в файл JSON","board.import":"Импорт","board.imported":"Импортировано {n} задач","board.limit":"предел {n}","board.loading":"Доска загружается…","board.metrics":"Метрики","board.mine":"Мои: {n}","board.mineHint":"Задачи, назначенные на {who}","board.newTask":"Задача","board.noMatch":"Ничего не найдено.","board.noRepo":"без проекта","board.overdueCount":"Просрочено: {n}","board.overdueHint":"Показать только просроченные задачи","board.pickArchive":"В архив","board.pickMove":"Перенести…","board.pickNone":"Снять выбор","board.pickStart":"Запустить выбранные","board.pickUnqueue":"Снять с очереди","board.pickedCount":"выбрано {n}","board.refresh":"Обновить","board.repo":"репозиторий","board.search":"Поиск","board.shown":"показано {shown} из {total}","board.someFailed":"Сделано у {done} из {total}, остальные отказали.","board.sync":"Сверить с Gitea","board.syncing":"Сверяю…","board.waitCount":"Ждут ответа: {n}","board.waitCountHint":"Задачи, где агент задал вопрос или просит разрешения.","board.waiting":"нужен человек","boardName.main":"Проектная доска","boardName.simple":"Простая доска","boardToolEnabled":"Разрешить агенту двигать карточки инструментом board_move.","card.assigneeHint":"Кто взял задачу","card.attach":"Прикрепить файл","card.checklist":"Чеклист","card.comments":"Комментарии","card.created":"Создано {date}","card.deadline":"Срок выполнения","card.deleteConfirm":"Удалить эту карточку?","card.description":"Описание задачи","card.due":"срок {date}","card.dueDate":"Крайний срок","card.edit":"Редактировать","card.labels":"Метки","card.move":"Переместить в колонку","card.pack":"пачка {at} из {total}","card.packHint":"Запущены вместе, одной сессией; агент берёт их в этом порядке.","card.pick":"Отметить для группового запуска","card.priority":"Приоритет","card.progress":"Прогресс","card.queue":"в очередь...","card.revive":"Восстановить","card.stop":"остановить","card.tags":"Теги","card.title":"Название карточки","card.toChat":"перейти в чат","card.unqueue":"снять с очереди","checklist.add":"Добавить","checklist.empty":"Критерии готовности ещё не настроены.","checklist.evidence":"Подтверждение: {text}","checklist.placeholder":"Новый критерий готовности...","checklist.progress":"DoD: {done} из {total}","checklist.required":"Обязательно","checklist.title":"Критерии готовности (DoD)","chip.moveTo":"Перенести в","chip.note":"Оставить заметку","chip.noteHint":"Заметка дописывается в тело задачи. Тело уходит агенту первым сообщением, поэтому заметка до запуска попадёт в работу, а после запуска — нет.","chip.noteSave":"Дописать","chip.openCard":"Перейти к карточке","column.addCard":"+ Добавить карточку","column.backlog":"Бэклог","column.cleanup":"Уборка","column.clear":"Очистить колонку","column.collapse":"Свернуть колонку","column.delete":"Удалить колонку","column.deploy":"Выкатка","column.done":"Выполнено","column.empty":"В этой колонке нет задач","column.expand":"Развернуть колонку","column.in-progress":"В работе","column.limit":"Лимит WIP: {n}","column.rename":"Переименовать колонку","column.review":"Ревью","column.title":"Название колонки","columnNames":"Свои названия колонок парами «идентификатор=Название» через запятую. Пусто — обычные названия.","comments.add":"Опубликовать комментарий","comments.authorAgent":"Агент","comments.authorUser":"Пользователь","comments.empty":"Комментариев пока нет.","comments.placeholder":"Добавьте заметку или отзыв...","comments.title":"Обсуждение и комментарии","console.empty":"Вывод агента пока не записан.","console.tab":"Живая консоль","defaultProjectRoot":"Корень, в котором лежат рабочие копии проектов. Пусто — рабочая папка харнесса.","dialog.archived":"архив","dialog.bodyHint":"Уйдёт агенту первым сообщением при запуске задачи.","dialog.cancel":"Отмена","dialog.create":"Создать","dialog.fromGitea":"Из Gitea","dialog.imported":"уже на доске","dialog.kind":"Какая это задача","dialog.kindPlain":"Не проект","dialog.kindPlainHint":"Заметка, не относящаяся ни к какому репозиторию. Живёт на простой доске и в Gitea не попадает.","dialog.kindProject":"Проект","dialog.kindProjectHint":"В Gitea заводится issue, карточка привязывается к нему и живёт на проектной доске.","dialog.labelsHint":"через запятую","dialog.loadingRepos":"Репозитории загружаются…","dialog.noIssues":"Открытых issue не найдено.","dialog.noRepos":"Репозиториев нет","dialog.own":"Своя задача","dialog.pickRepo":"Выберите репозиторий","dialog.repo":"Репозиторий","dialog.repoNamePlaceholder":"имя нового репозитория, латиницей","dialog.repoNew":"— новый репозиторий —","dialog.repoNewHint":"Будет создан в организации: приватный и пустой, без README и заготовок. Создание репозитория отсюда не отменить.","dialog.taskBody":"Описание","dialog.taskColumn":"Колонка","dialog.taskLabels":"Метки","dialog.taskTitle":"Заголовок","dialog.title":"Новая задача","diff.additions":"Добавлено","diff.author":"Автор","diff.branch":"Ветка: {name}","diff.cherryPick":"Перенести коммит (Cherry-pick)","diff.commits":"Коммиты задачи ({n})","diff.date":"Дата","diff.deletions":"Удалено","diff.empty":"Нет коммитов или изменений файлов для этой задачи.","diff.filesChanged":"Изменено файлов: {n}","diff.hash":"Хеш","diff.hide":"Скрыть просмотр diff","diff.loadFailed":"Не удалось загрузить изменения: {error}","diff.loading":"Загрузка коммитов и diff…","diff.mergeConflict":"Обнаружены конфликты слияния","diff.mergeFailed":"Сбой слияния ветки: {error}","diff.mergeSuccess":"Ветка успешно смержена в основную","diff.message":"Сообщение коммита","diff.resolveConflicts":"Разрешить конфликты","diff.revert":"Откатить коммит","diff.show":"Показать просмотр diff","diff.staged":"Подготовленные изменения","diff.title":"Изменения в ветке задачи","diff.truncated":"Дифф обрезан (превышен лимит)","diff.uncommitted":"Незакоммиченные изменения","diff.view":"Просмотр изменений","discard":"Отменить","epic.addSubtask":"Добавить подзадачу","epic.badge":"Эпик","epic.createGiteaIssues":"Также создать связанные задачи в Gitea","epic.noSubtasks":"Подзадач пока нет.","epic.progress":"Подзадач: {done}/{total}","epic.subtasks":"Подзадачи","epic.triage":"Декомпозировать","epic.triageHelp":"Введите по одному названию подзадачи в строке. Дочерние задачи будут привязаны к этому эпику.","epic.triageSubmit":"Создать подзадачи","epic.triageTitle":"Декомпозиция задачи на подзадачи","error.bad-repo-name":"В имени репозитория допустимы только латинские буквы, цифры, точка, дефис и подчёркивание.","error.badImport":"Неверный формат файла импорта","error.crossSite":"Запрос отклонён как межсайтовый.","error.gitea-unreachable":"Сервер Gitea недоступен","error.giteaAbsent":"Плагин Gitea не установлен, импорт недоступен.","error.giteaUnconfigured":"Сначала настройте Gitea в карточке плагина Gitea.","error.issue-not-created":"Issue не заведён. Если репозиторий был новым, он остался — ничего не удалено.","error.issueNotFound":"Issue не найден.","error.modelNotSelected":"Модель не выбрана — задайте её в настройках или укажите здесь.","error.no-live-sessions":"Нет ни одной идущей сессии, в очередь ставить некуда.","error.permission-refused":"Уровень доступа не принят, задача не запущена.","error.permission-unavailable":"В этой сборке уровней доступа нет — задача не запущена, чтобы не пойти с бо́льшими правами, чем просили.","error.repo-not-created":"Репозиторий не создан; больше ничего не сделано.","error.repo-required":"Выберите репозиторий или назовите новый.","error.session-not-live":"Эта сессия больше не идёт.","error.sessionNotOpened":"Сессия поднята ({id}), но эта сборка не умеет в неё переключиться. Найдите её в списке сессий.","error.startFailed":"Не удалось поднять сессию.","error.task-not-queued":"Задача не стоит в очереди.","error.taskHasNoIssue":"За этой задачей нет issue в Gitea.","error.taskNotFound":"Задача не найдена.","error.titleRequired":"Нужен заголовок.","error.unknown":"Запрос не выполнен.","facet.assignee":"Исполнитель","facet.author":"Автор","facet.priority":"Приоритет","facet.release":"Выпуск","facet.repo":"Репозиторий","facet.risk":"Риск","facet.scope":"Область","facet.signal":"Сигнал","facet.status":"Статус","facet.type":"Тип","field.announceToAgent":"Уведомлять агента об изменениях","field.archiveAfterDays":"Убирать в архив из «Выполнено» через, дней","field.autoSyncSessions":"Автосинхронизация внешних сессий чата","field.boardToolEnabled":"Разрешить агенту двигать карточки","field.columnNames":"Свои названия колонок","field.cronEnabled":"Включить планировщик задач","field.defaultProjectRoot":"Корень проектов","field.giteaOwner":"Организация Gitea","field.giteaTokenRef":"Имя учётной записи","field.giteaUrl":"Адрес инстанса","field.maxConcurrentSessions":"Макс. параллельных сессий агентов","field.permissionGateEnabled":"Контроль прав доступа к доске","field.preventIdleSleep":"Предотвращать засыпание при активных задачах","field.progressDumpEnabled":"Дамп прогресса выполнения","field.pushToGitea":"Закрывать issue в Gitea","field.replyInstruction":"Постоянная приписка","field.sessionDefaultPermission":"Права доступа сессии по умолчанию","field.staleAfterMin":"Считать задачу молчащей после, минут","field.startPrompt":"Шаблон первого сообщения","field.syncIntervalSec":"Сверяться с Gitea раз в, секунд","field.watchRepos":"Сузить подхват до репозиториев","field.webhookSecretRef":"Имя учётной записи для вебхука","field.wipInProgress":"Предел «В работе»","field.wipReview":"Предел «Ревью»","field.workspaceClaimBoundaries":"Границы захвата рабочей области","field.worktreeIsolation":"Изоляция рабочих деревьев (worktree)","field.worktreeRoot":"Корневой каталог worktree","filter.active":"Активные","filter.all":"Все задачи","filter.assignee":"Исполнитель","filter.epics":"Эпики","filter.label":"Метка","filter.overdue":"Просроченные","filter.priority":"Приоритет","filter.review":"На проверке","filter.search":"Поиск задач…","filter.stale":"Без активности","giteaOwner":"Организация Gitea, чьи репозитории смотрит доска. Пусто — определяется сама, если организация одна.","giteaTokenRef":"ИМЯ учётной записи DSH, в которой лежит токен. Сам токен сюда не вводить.","giteaUrl":"Адрес инстанса Gitea или Forgejo, например https://gitea.example.com. Пусто — импорт недоступен.","group.assignee":"По исполнителям","group.general":"Общее","group.gitea":"Gitea","group.limits":"Пределы колонок","group.nobody":"Без исполнителя","group.repo":"По репозиториям","group.sync":"Автоперемещение","hint.announceToAgent":"Автоматически отправлять агенту сообщения о перемещении карточек","hint.archiveAfterDays":"Считается с попадания карточки в «Выполнено». Ноль — оставлять всё на доске.","hint.autoSyncSessions":"Автоматически создавать карточки на доске для стандартных диалогов чата DSH.","hint.boardToolEnabled":"Выключено, пока скилл воркфлоу запрещает этому CLI трогать канбан.","hint.columnNames":"Пары «идентификатор=Название» через запятую, например «backlog=Идеи, review=Проверка». Пусто — обычные названия.","hint.cronEnabled":"Запуск фоновых периодических проверок статусов задач","hint.defaultProjectRoot":"Где лежат рабочие копии проектов. Пусто — рабочая папка харнесса.","hint.giteaOwner":"Чьи репозитории смотрит доска. Пусто — определится сама, пока у токена ровно одна организация.","hint.giteaTokenRef":"ИМЯ учётной записи DSH, в которой лежит токен. Сам токен сюда не вводить.","hint.giteaUrl":"Например https://gitea.example.com. Пусто — импорт недоступен.","hint.label":"Пусто — метка для этой колонки не ставится.","hint.limit":"Ноль — без предела. Превышение подсвечивается, но не запрещается.","hint.permissionGateEnabled":"Требовать подтверждения при выполнении деструктивных операций","hint.preventIdleSleep":"Не усыплять фоновый процесс DSH, пока есть незавершённые задачи","hint.progressDumpEnabled":"Периодически сохранять прогресс выполнения в файл progress.md","hint.pushToGitea":"Карточка, дошедшая до «Выполнено», закрывает свой issue. Меток доска не ставит: стадия и так видна по ветке и pull request.","hint.replyInstruction":"Дописывается к каждому первому сообщению — например язык ответа. Пусто — ничего не добавляется.","hint.sessionDefaultPermission":"Уровень прав, выдаваемый сессиям без явных настроек","hint.staleAfterMin":"Помечаются только задачи с сессией. Ноль отключает отметку.","hint.startPrompt":"Шаблон первого сообщения агенту. Пусто — встроенный шаблон.","hint.syncIntervalSec":"Ноль отключает сверку. Меньше пятнадцати секунд поднимается до пятнадцати.","hint.watchRepos":"Через запятую, «владелец/репо» или просто «репо». Пусто — все репозитории организации, где есть открытые задачи.","hint.webhookSecretRef":"ИМЯ учётной записи DSH с секретом вебхука Gitea. Пусто — остаётся только опрос.","hint.worktreeIsolation":"Создавать отдельный git worktree для каждой задачи","hint.worktreeRoot":"Каталог, в котором создаются временные изолированные worktree","import.error":"Ошибка импорта JSON доски","import.success":"Доска успешно импортирована","label.assigned":"Назначено","label.blocked":"Заблокировано","label.completed":"Выполнено","label.inProgress":"В работе","label.pending":"В очереди","label.review":"На проверке","metrics.columns":"Время в колонках","metrics.completed":"Завершено задач: {n}","metrics.cycleTime":"Среднее время выполнения: {days} дн.","metrics.empty":"Переходов ещё не было — измерять нечего.","metrics.hint":"{n} задач на доске • выполнено за неделю: {week} • за месяц: {month}","metrics.leadTime":"Общее время от создания: {days} дн.","metrics.leadTimeAvg":"Средний Lead Time","metrics.mean":"среднее {time}","metrics.median":"медиана {time}","metrics.noStale":"Ни одна задача не задерживалась так долго.","metrics.stale":"Без движения дольше {days} дн.","metrics.throughput":"Пропускная способность","metrics.total":"Всего задач: {n}","metrics.wip":"Задач в работе (WIP): {n}","metrics.wipLimit":"Лимит задач в работе (WIP)","modal.confirmDelete":"Подтверждение удаления","modal.createTask":"Создание новой задачи","modal.editTask":"Редактирование задачи","move.backlog":"Работа по задаче останавливается: идущий ход агента будет прерван. Если сессии нет, карточка просто переедет.","move.cleanup":"Агент удалит ветку в Gitea, worktree и локальную ветку и запишет это в issue.","move.confirm":"Перенести","move.deploy":"Агент вольёт pull request и выкатит. Сам перенос в эту колонку И ЕСТЬ ваше «ок» на deploy — второй раз агент спрашивать не станет.","move.done":"Задача считается завершённой. Это решение человека: сам агент карточку сюда не переносит.","move.in-progress":"Агент получит команду начать или продолжить реализацию.","move.review":"Агент доведёт работу до ревью: снимет с pull request пометку черновика и запросит проверку.","move.title":"Перенести в «{column}»?","nav.all":"Все доски","nav.back":"Назад к доске","nav.settings":"Настройки доски","order.manual":"Как разложено","order.new":"Сначала новые","order.old":"Сначала старые","panel.agentPreset":"Профиль агента","panel.archive":"В архив","panel.assignDrop":"Отказаться","panel.assignMe":"Взять себе","panel.assignee":"взял {who}","panel.author":"завёл {who}","panel.bodyLoading":"читаю описание…","panel.cleanupWorktree":"Очистить worktree","panel.close":"Закрыть","panel.continue":"Продолжить","panel.continueHint":"У задачи один чат: открывается прежняя сессия, а не новая.","panel.created":"заведена {ago} назад","panel.delete":"Удалить","panel.deleteConfirm":"Удалить «{title}»? Отменить будет нельзя.","panel.due":"Срок","panel.issue":"Issue","panel.labels":"Метки","panel.log":"Переходы","panel.message":"Сообщение агенту","panel.messageHint":"Правьте перед отправкой. Пустое — уйдёт встроенный текст.","panel.model":"Модель","panel.noLog":"Переходов пока нет.","panel.noModels":"У этого провайдера нет моделей","panel.noProviders":"Провайдеров нет","panel.openChat":"Открыть чат","panel.permission":"Уровень доступа","panel.pickModel":"Выберите модель","panel.pickProvider":"Выберите провайдера","panel.pickProviderFirst":"Сначала выберите провайдера","panel.presetDefault":"Как в харнессе по умолчанию","panel.priority":"Приоритет","panel.priorityNone":"Без приоритета","panel.provider":"Провайдер","panel.refresh":"Обновить из Gitea","panel.saveEdit":"Сохранить","panel.start":"Начать","panel.startHint":"Откроется отдельная сессия агента по этой задаче. Ветку и worktree заводит агент после preflight, а не отсюда.","panel.starting":"Запускается…","panel.updated":"последнее изменение {ago} назад","panel.workDir":"Рабочая папка: {path}","panel.workDirHint":"Корень проекта не указан в настройках, поэтому используется эта папка.","panel.worktree":"Worktree: {path}","panel.worktreeDirty":"Незакоммиченные изменения в worktree: {files}","plan.counter":"{done} из {total}","plan.title":"План агента","pr.create":"Создать PR в Gitea","pr.created":"PR #{n} создан","pr.creating":"Создание PR…","pr.view":"Открыть PR","priority.high":"Высокий","priority.highest":"Критический","priority.low":"Низкий","priority.lowest":"Минимальный","priority.medium":"Средний","priority.normal":"Обычный","priority.urgent":"Срочный","queue.add":"В очередь","queue.hint":"Задача встанет в очередь сессии: агент возьмёт её, закончив текущую работу. До этого карточка остаётся там, где лежит.","queue.option":"{title} - задач: {n}","queue.session":"Сессия","queue.title":"Поставить в очередь идущей сессии","reasoning.default":"По умолчанию (модель)","reasoning.high":"Высокое (глубокие рассуждения)","reasoning.label":"Глубина рассуждений","reasoning.low":"Низкая (быстро / экономно)","reasoning.medium":"Средняя (сбалансировано)","replyInstruction":"Постоянная приписка к первому сообщению — например язык ответа. Пусто — ничего не добавляется.","report.artifacts":"Артефакты","report.changedFiles":"Изменённые файлы","report.checksRun":"Проверки и тесты","report.risks":"Риски и примечания","report.summary":"Сводка","report.title":"Отчёт о выполнении","revive.fresh":"Предыдущая сессия завершена, поэтому запущена новая; старый чат больше недоступен.","revive.same":"Предыдущая сессия восстановлена — чат на том месте, где вы остановились.","save":"Сохранить","section.label":"Канбан","settings.autoArchive":"Автоархивация завершённых задач","settings.autoArchiveHint":"Перемещать завершённые задачи в архив через указанное число дней","settings.boardName":"Название доски","settings.columns":"Колонки доски","settings.description":"Описание канбан-доски","settings.general":"Основные настройки","settings.integrations":"Интеграции","settings.loading":"Загрузка настроек доски…","settings.readOnly":"Настройки в этой сессии доступны только для чтения.","settings.save":"Сохранить настройки","settings.saveFailed":"Не сохранены поля: {fields}","settings.saved":"Настройки сохранены","settings.saving":"Сохранение настроек…","settings.subtitle":"Канбан-доска для сессий и задач","settings.unavailable":"Хост не знает пространство настроек dsh-kanban. Перезапустите веб-интерфейс после установки плагина.","slash.hint":"Введите / для списка команд и навыков","staleAfterMin":"После скольких минут молчания задача с сессией помечается тревожно. Ноль — не помечать.","startPrompt":"Шаблон первого сообщения агенту. Пусто — встроенный шаблон.","state.queued":"в очереди · {n}","state.running":"в работе","state.stopped":"остановился","status.active":"Активна","status.archived":"В архиве","status.closed":"Закрыта","status.open":"Открыта","stop.idle":"Агент не работал, останавливать было нечего.","stop.no-session":"У задачи нет сессии.","subtitle":"Доска задач: issue из Gitea и отдельная сессия под задачу","sync.failed":"сверка не проходит","sync.lastSeen":"последняя удачная сверка {ago} назад","sync.never":"сверки с Gitea ещё не было","sync.neverSeen":"удачной сверки с запуска харнесса не было","sync.okAgo":"сверено {ago} назад","sync.running":"сверяемся с Gitea…","syncIntervalSec":"Как часто сверяться с Gitea, в секундах. Ноль — не сверяться.","task.confirmPermission":"Подтвердить права","task.cron":"Расписание Cron","task.nextRun":"Следующий запуск: {date}","task.noRuns":"Запусков ещё не было","task.permissionConfirmed":"Права подтверждены","task.permissionGateWarning":"Требуется подтверждение повышенных прав ({permission})","task.progressDump":"Дамп прогресса (Handover)","task.runs":"История выполнений","template.bugfix":"Исправление бага (Bugfix)","template.feature":"Новая функция (Feature)","template.label":"Шаблон задачи","template.none":"Без шаблона (пусто)","template.refactor":"Рефакторинг (Refactor)","template.release":"Релиз (Подготовка выпуска)","template.security":"Безопасность (Аудит и CVE)","time.day":"{n} дн","time.hour":"{n} ч","time.min":"{n} мин","time.now":"только что","title":"Канбан","updater.check":"Проверить обновления","updater.checking":"Проверка…","updater.current":"Текущая версия","updater.failed":"Ошибка проверки обновлений: ","updater.latest":"Последняя версия","updater.success":"Плагин успешно обновлен! Пожалуйста, перезапустите сервис DSH.","updater.title":"Обновления плагина","updater.upToDate":"Актуальная версия","updater.updateNow":"Обновить до v{version}","updater.updating":"Обновление…","view.analytics":"Аналитика","view.archive":"Архив","view.board":"Доска","view.calendar":"Календарь","view.gantt":"Диаграмма Ганта","view.list":"Список","view.table":"Таблица","watchRepos":"Сузить подхват до этих репозиториев, через запятую. Пусто — все репозитории организации, где есть открытые задачи.","wipInProgress":"Предел числа карточек в колонке «В работе». Ноль — без предела.","wipReview":"Предел числа карточек в колонке «Ревью». Ноль — без предела."}}
@@ -1 +1 @@
1
- {"agentTeams":{"action.openActivityPanel":"Открыть панель активности","activity.badgeAria":"Активность и история команд агентов, {count} записей команд","activity.collapse":"Свернуть панель активности","activity.dockRight":"Закрепить справа","activity.empty":"Нет активности команды","activity.float":"Переключиться на плавающую панель","activity.panelAria":"Панель активности команд агентов","activity.panelButton":"Панель активности","activity.title":"Активность команд агентов","archive.discardedLabel":"План отменен · Архивная история","archive.label":"Завершено · Архивная история","assignment.discarded":"План отклонён","assignment.empty":"Нет задач","assignment.label":"Капитан назначен","assignment.staged":"Запланировано","captain.name":"Капитан","captain.role":"Разделить · Делегировать · Синтезировать","captain.state.awaitingFeedback":"Ожидание отзыва","captain.state.collected":"Все полученные отчеты","captain.state.discarded":"Отменено","captain.state.settled":"Завершено","captain.state.staged":"Ожидает одобрения","captain.state.takeover":"Работаю над {tasks}","captain.state.waiting":"Ожидание отчетов","captain.state.working":"{count} активных","captain.summary":"Назначено {tasks} задач {members} участникам","captain.summary.awaitingFeedback":"Черновой вариант сохранен; ожидаем ваших указаний по доработке в чате","captain.summary.discarded":"План отклонён: {members} участников не созданы и {tasks} задач не выполнены","captain.summary.staged":"Запланировано {tasks} задач и {members} участников; ожидают утверждения","captain.summary.withTakeover":"Назначено {tasks} участникам · Капитан владеет {captainTasks}","card.memberCount":"{count} участников","delegation.aria":"Карта делегирования капитана","dependency.aria":"Цепочка зависимостей задач","dependency.hint.chain":"Наведите для подсветки зависимостей · Нажмите, чтобы закрепить","dependency.hint.parallel":"Нет зависимостей · Нажмите для подробностей","dependency.hint.pinned":"{taskId} закреплена · Esc для сброса","dependency.parallel":"Параллельные задачи","dependency.title":"Зависимости задач","format.listSeparator":",","member.model":"{model}","member.state.delivered":"Доставлено","member.state.failed":"Имеются сбои","member.state.left":"Покинул команду","member.state.notCreated":"Не создано","member.state.pending":"Ожидание","member.state.removed":"Удалено","member.state.staged":"В плане (не создан)","member.state.stopped":"Остановлено","member.state.unassigned":"Ожидание назначения","member.state.waiting":"Ожидание","member.state.working":"Работает","member.status.delivered":"Задачи выполнены","member.status.discarded":"План отклонён; участник не был создан","member.status.executing":"Работа над {taskId}","member.status.executingModel":"Работа над {taskId} · {model}","member.status.idle":"Готовы продолжить","member.status.settled":"Вся назначенная работа выполнена","member.status.staged":"Будет создан после одобрения","member.status.stopped":"Команда остановлена; требуется явное возобновление","member.status.unknown":"Статус неизвестен","member.status.waitingAssignment":"Ожидание назначения работы от капитана","member.status.waitingOn":"Ожидание {taskId} · {assignee}","member.status.waitingPrerequisite":"Ожидание выполнения предварительных условий","member.status.working":"Работа над назначенными задачами","members.collapse":"Свернуть","members.empty":"Пока нет участников; ожидаем, пока капитан соберёт команду","members.expand":"Развернуть","members.toggle":"Участники {count}","plan.addTask":"Добавить задачу","plan.adding":"Добавление…","plan.approve":"Одобрить и запустить","plan.approveConfirm":"Подтвердить запуск","plan.approveConfirmTitle":"Подтвердить запуск команды","plan.approveHint":"Одобрение создаёт {members} участников и планирует {tasks} задачи.","plan.approveTitle":"План готов?","plan.approveWarning":"Маршруты участников и зависимости нельзя редактировать здесь после запуска.","plan.approving":"Создание участников…","plan.badge":"Ожидание подтверждения","plan.cancel":"Отмена","plan.continue":"Вернуться в чат и исправить","plan.dependencies.count":"{count} зависимостей","plan.dependencies.none":"Нет зависимостей","plan.description":"Участники не были созданы, и задачи не были назначены. Отредактируйте черновик здесь или вернитесь в чат и сообщите Капитану, что нужно изменить.","plan.discard":"Отменить этот план","plan.discardConfirm":"Отменить план","plan.discardConfirmTitle":"Отменить этот план?","plan.discardWarning":"План будет завершён и заархивирован. Участники не были созданы, и задачи выполняться не будут.","plan.discarding":"Отмена…","plan.failed":"Операция не удалась: {message}","plan.feedbackHint":"Капитан спросит в чате. После вашего ответа он пересмотрит этот черновик и снова будет ждать одобрения.","plan.feedbackTitle":"Ожидание ваших указаний по исправлению","plan.flow.aria":"Процесс запуска команды","plan.flow.review":"Просмотреть план","plan.flow.run":"Начать работу","plan.flow.spawn":"Создать участников","plan.member.model":"Модель","plan.member.prompt":"Роль подсказки","plan.member.provider":"Провайдер","plan.member.reasoning":"Усилие на рассуждение","plan.member.reasoningHint":"Оставьте пустым для значения по умолчанию; принимает low, medium, high, xhigh и другие.","plan.member.role":"Роль","plan.member.roleFallback":"Роль не установлена","plan.members.count":"{count} участников","plan.members.empty":"Пока нет запланированных участников","plan.members.title":"Участники и маршруты моделей","plan.model.back":"Назад","plan.model.choose":"Выберите модель","plan.model.currentUnavailable":"{provider}/{model} (нет в текущем каталоге)","plan.model.defaultReasoning":"Усилия по умолчанию при рассуждении","plan.model.empty":"Нет доступных моделей","plan.model.loading":"Загрузка моделей…","plan.model.modelDefault":"Модель по умолчанию ({effort})","plan.model.partialFailure":"{count} каталогов провайдеров не удалось загрузить","plan.model.providerDefault":"Провайдер по умолчанию","plan.model.retry":"Повторить","plan.model.route":"Маршрут: {provider}/{model}","plan.model.triggerAria":"Выберите модель участника, текущая {model}, уровень усилий для рассуждений {effort}","plan.newTask":"Новая тема задачи","plan.newTaskLabel":"Добавить запланированную задачу","plan.pendingEdits":"Сохраните текущие изменения перед запуском команды.","plan.readySummary":"{members} участников · {tasks} задач · {links} зависимостей","plan.remove":"Удалить","plan.removeConfirm":"Подтвердите удаление","plan.removeWarning":"Удаление {task} приведет к пересчету зависимостей ниже по цепочке.","plan.removed":"Задача удалена","plan.returnToChat":"Вернуться в чат","plan.save":"Сохранить","plan.saved":"План сохранён","plan.saving":"Сохранение…","plan.task.assignee":"Исполнитель","plan.task.dependencies":"ID задач зависимостей (через запятую)","plan.task.dependenciesHint":"Например, task-1, task-2; циклы отклонены","plan.task.description":"Описание задачи","plan.task.subject":"Тема задачи","plan.task.unassigned":"Общий пул задач","plan.taskAdded":"Задача добавлена","plan.tasks.count":"{count} задач · {links} зависимостей","plan.tasks.empty":"Нет запланированных задач","plan.tasks.title":"Задачи и зависимости","plan.title":"Проверка плана перед запуском","plan.unsaved":"Не сохранено","progress.aria":"Общий прогресс команды","progress.blocked":"■ Ожидание {count}","progress.delivered":"■ Доставлено {count}","progress.running":"■ В процессе {count}","progress.title":"Общий прогресс","task.assignee.unclaimed":"Невостребованные","task.detail.completed":"Завершено и доставлено","task.detail.noDownstream":"Нет последующих задач","task.detail.noPrerequisite":"Нет требований; готовы начать","task.detail.notRun":"План отменён; задача не была выполнена","task.detail.ready":"Предварительные условия выполнены; можно начинать","task.detail.unlocks":"Разблокирует {tasks} после завершения","task.detail.waitingOn":"Ожидание {tasks}","task.model":"Модель: {model}","task.runningAria":"Выполняется","task.status.cancelled":"Отменено","task.status.claimed":"Заявлено","task.status.completed":"Завершено","task.status.failed":"Не удалось","task.status.inProgress":"Выполняется","task.status.notRun":"Не запущено","task.status.pending":"Невостребованные","task.summary.allDelivered":"Все {count} задачи доставлены","task.summary.blocked":"{tasks} ожидают выполнения предварительных условий","task.summary.blockedAndRunning":"{tasks}{more} ожидают выполнения предварительных условий; другая работа уже начата","task.summary.discarded":"{count} запланированных задач отменено; ни одна не выполнена","task.summary.ended":"Итог: {completed} доставлено · {cancelled} отменено · {failed} не удалось","task.summary.failedSettled":"{count} ошибок; автоматический цикл остановлен","task.summary.more":"и ещё {count}","task.summary.ready":"{tasks} готовы к началу","task.summary.running":"{tasks} в процессе выполнения","task.summary.staged":"{count} запланированных задач ожидают утверждения","task.summary.waitingBreakdown":"Ожидание, пока капитан распределит работу","task.summary.waitingSchedule":"Ожидание следующего цикла планирования","team.discarded":"Отклонено","team.ended":"Завершено","team.stats.completed":"{completed}/{total} завершено","team.stats.members":"{count} участников","team.stats.messages":"{count} сообщений","team.stop":"Остановить команду","team.stopCancel":"Продолжать работу","team.stopConfirm":"Остановить команду","team.stopDescription":"Это отменяет {tasks} незавершённых задач и останавливает {members} работающих участников. Завершённые результаты сохраняются.","team.stopFailed":"Не удалось остановить команду: {message}","team.stopRequestFailed":"Сервер не смог остановить эту команду. Попробуйте снова.","team.stopTitle":"Остановить “{team}”?","team.stopped":"Остановлено","team.stopping":"Остановка…"}}
1
+ {"@nanmicoder/dsh-agent-teams":{"action.openActivityPanel":"Открыть панель активности","activity.badgeAria":"Активность и история команд агентов, {count} записей команд","activity.collapse":"Свернуть панель активности","activity.dockRight":"Закрепить справа","activity.empty":"Нет активности команды","activity.float":"Переключиться на плавающую панель","activity.panelAria":"Панель активности команд агентов","activity.panelButton":"Панель активности","activity.title":"Активность команд агентов","archive.discardedLabel":"План отменен · Архивная история","archive.label":"Завершено · Архивная история","assignment.discarded":"План отклонён","assignment.empty":"Нет задач","assignment.label":"Капитан назначен","assignment.staged":"Запланировано","captain.name":"Капитан","captain.role":"Разделить · Делегировать · Синтезировать","captain.state.awaitingFeedback":"Ожидание отзыва","captain.state.collected":"Все полученные отчеты","captain.state.discarded":"Отменено","captain.state.settled":"Завершено","captain.state.staged":"Ожидает одобрения","captain.state.takeover":"Работаю над {tasks}","captain.state.waiting":"Ожидание отчетов","captain.state.working":"{count} активных","captain.summary":"Назначено {tasks} задач {members} участникам","captain.summary.awaitingFeedback":"Черновой вариант сохранен; ожидаем ваших указаний по доработке в чате","captain.summary.discarded":"План отклонён: {members} участников не созданы и {tasks} задач не выполнены","captain.summary.staged":"Запланировано {tasks} задач и {members} участников; ожидают утверждения","captain.summary.withTakeover":"Назначено {tasks} участникам · Капитан владеет {captainTasks}","card.memberCount":"{count} участников","delegation.aria":"Карта делегирования капитана","dependency.aria":"Цепочка зависимостей задач","dependency.hint.chain":"Наведите для подсветки зависимостей · Нажмите, чтобы закрепить","dependency.hint.parallel":"Нет зависимостей · Нажмите для подробностей","dependency.hint.pinned":"{taskId} закреплена · Esc для сброса","dependency.parallel":"Параллельные задачи","dependency.title":"Зависимости задач","format.listSeparator":",","member.model":"{model}","member.state.delivered":"Доставлено","member.state.failed":"Имеются сбои","member.state.left":"Покинул команду","member.state.notCreated":"Не создано","member.state.pending":"Ожидание","member.state.removed":"Удалено","member.state.staged":"В плане (не создан)","member.state.stopped":"Остановлено","member.state.unassigned":"Ожидание назначения","member.state.waiting":"Ожидание","member.state.working":"Работает","member.status.delivered":"Задачи выполнены","member.status.discarded":"План отклонён; участник не был создан","member.status.executing":"Работа над {taskId}","member.status.executingModel":"Работа над {taskId} · {model}","member.status.idle":"Готовы продолжить","member.status.settled":"Вся назначенная работа выполнена","member.status.staged":"Будет создан после одобрения","member.status.stopped":"Команда остановлена; требуется явное возобновление","member.status.unknown":"Статус неизвестен","member.status.waitingAssignment":"Ожидание назначения работы от капитана","member.status.waitingOn":"Ожидание {taskId} · {assignee}","member.status.waitingPrerequisite":"Ожидание выполнения предварительных условий","member.status.working":"Работа над назначенными задачами","members.collapse":"Свернуть","members.empty":"Пока нет участников; ожидаем, пока капитан соберёт команду","members.expand":"Развернуть","members.toggle":"Участники {count}","plan.addTask":"Добавить задачу","plan.adding":"Добавление…","plan.approve":"Одобрить и запустить","plan.approveConfirm":"Подтвердить запуск","plan.approveConfirmTitle":"Подтвердить запуск команды","plan.approveHint":"Одобрение создаёт {members} участников и планирует {tasks} задачи.","plan.approveTitle":"План готов?","plan.approveWarning":"Маршруты участников и зависимости нельзя редактировать здесь после запуска.","plan.approving":"Создание участников…","plan.badge":"Ожидание подтверждения","plan.cancel":"Отмена","plan.continue":"Вернуться в чат и исправить","plan.dependencies.count":"{count} зависимостей","plan.dependencies.none":"Нет зависимостей","plan.description":"Участники не были созданы, и задачи не были назначены. Отредактируйте черновик здесь или вернитесь в чат и сообщите Капитану, что нужно изменить.","plan.discard":"Отменить этот план","plan.discardConfirm":"Отменить план","plan.discardConfirmTitle":"Отменить этот план?","plan.discardWarning":"План будет завершён и заархивирован. Участники не были созданы, и задачи выполняться не будут.","plan.discarding":"Отмена…","plan.failed":"Операция не удалась: {message}","plan.feedbackHint":"Капитан спросит в чате. После вашего ответа он пересмотрит этот черновик и снова будет ждать одобрения.","plan.feedbackTitle":"Ожидание ваших указаний по исправлению","plan.flow.aria":"Процесс запуска команды","plan.flow.review":"Просмотреть план","plan.flow.run":"Начать работу","plan.flow.spawn":"Создать участников","plan.member.model":"Модель","plan.member.prompt":"Роль подсказки","plan.member.provider":"Провайдер","plan.member.reasoning":"Усилие на рассуждение","plan.member.reasoningHint":"Оставьте пустым для значения по умолчанию; принимает low, medium, high, xhigh и другие.","plan.member.role":"Роль","plan.member.roleFallback":"Роль не установлена","plan.members.count":"{count} участников","plan.members.empty":"Пока нет запланированных участников","plan.members.title":"Участники и маршруты моделей","plan.model.back":"Назад","plan.model.choose":"Выберите модель","plan.model.currentUnavailable":"{provider}/{model} (нет в текущем каталоге)","plan.model.defaultReasoning":"Усилия по умолчанию при рассуждении","plan.model.empty":"Нет доступных моделей","plan.model.loading":"Загрузка моделей…","plan.model.modelDefault":"Модель по умолчанию ({effort})","plan.model.partialFailure":"{count} каталогов провайдеров не удалось загрузить","plan.model.providerDefault":"Провайдер по умолчанию","plan.model.retry":"Повторить","plan.model.route":"Маршрут: {provider}/{model}","plan.model.triggerAria":"Выберите модель участника, текущая {model}, уровень усилий для рассуждений {effort}","plan.newTask":"Новая тема задачи","plan.newTaskLabel":"Добавить запланированную задачу","plan.pendingEdits":"Сохраните текущие изменения перед запуском команды.","plan.readySummary":"{members} участников · {tasks} задач · {links} зависимостей","plan.remove":"Удалить","plan.removeConfirm":"Подтвердите удаление","plan.removeWarning":"Удаление {task} приведет к пересчету зависимостей ниже по цепочке.","plan.removed":"Задача удалена","plan.returnToChat":"Вернуться в чат","plan.save":"Сохранить","plan.saved":"План сохранён","plan.saving":"Сохранение…","plan.task.assignee":"Исполнитель","plan.task.dependencies":"ID задач зависимостей (через запятую)","plan.task.dependenciesHint":"Например, task-1, task-2; циклы отклонены","plan.task.description":"Описание задачи","plan.task.subject":"Тема задачи","plan.task.unassigned":"Общий пул задач","plan.taskAdded":"Задача добавлена","plan.tasks.count":"{count} задач · {links} зависимостей","plan.tasks.empty":"Нет запланированных задач","plan.tasks.title":"Задачи и зависимости","plan.title":"Проверка плана перед запуском","plan.unsaved":"Не сохранено","progress.aria":"Общий прогресс команды","progress.blocked":"■ Ожидание {count}","progress.delivered":"■ Доставлено {count}","progress.running":"■ В процессе {count}","progress.title":"Общий прогресс","task.assignee.unclaimed":"Невостребованные","task.detail.completed":"Завершено и доставлено","task.detail.noDownstream":"Нет последующих задач","task.detail.noPrerequisite":"Нет требований; готовы начать","task.detail.notRun":"План отменён; задача не была выполнена","task.detail.ready":"Предварительные условия выполнены; можно начинать","task.detail.unlocks":"Разблокирует {tasks} после завершения","task.detail.waitingOn":"Ожидание {tasks}","task.model":"Модель: {model}","task.runningAria":"Выполняется","task.status.cancelled":"Отменено","task.status.claimed":"Заявлено","task.status.completed":"Завершено","task.status.failed":"Не удалось","task.status.inProgress":"Выполняется","task.status.notRun":"Не запущено","task.status.pending":"Невостребованные","task.summary.allDelivered":"Все {count} задачи доставлены","task.summary.blocked":"{tasks} ожидают выполнения предварительных условий","task.summary.blockedAndRunning":"{tasks}{more} ожидают выполнения предварительных условий; другая работа уже начата","task.summary.discarded":"{count} запланированных задач отменено; ни одна не выполнена","task.summary.ended":"Итог: {completed} доставлено · {cancelled} отменено · {failed} не удалось","task.summary.failedSettled":"{count} ошибок; автоматический цикл остановлен","task.summary.more":"и ещё {count}","task.summary.ready":"{tasks} готовы к началу","task.summary.running":"{tasks} в процессе выполнения","task.summary.staged":"{count} запланированных задач ожидают утверждения","task.summary.waitingBreakdown":"Ожидание, пока капитан распределит работу","task.summary.waitingSchedule":"Ожидание следующего цикла планирования","team.discarded":"Отклонено","team.ended":"Завершено","team.stats.completed":"{completed}/{total} завершено","team.stats.members":"{count} участников","team.stats.messages":"{count} сообщений","team.stop":"Остановить команду","team.stopCancel":"Продолжать работу","team.stopConfirm":"Остановить команду","team.stopDescription":"Это отменяет {tasks} незавершённых задач и останавливает {members} работающих участников. Завершённые результаты сохраняются.","team.stopFailed":"Не удалось остановить команду: {message}","team.stopRequestFailed":"Сервер не смог остановить эту команду. Попробуйте снова.","team.stopTitle":"Остановить “{team}”?","team.stopped":"Остановлено","team.stopping":"Остановка…"},"agentTeams":{"action.openActivityPanel":"Открыть панель активности","activity.badgeAria":"Активность и история команд агентов, {count} записей команд","activity.collapse":"Свернуть панель активности","activity.dockRight":"Закрепить справа","activity.empty":"Нет активности команды","activity.float":"Переключиться на плавающую панель","activity.panelAria":"Панель активности команд агентов","activity.panelButton":"Панель активности","activity.title":"Активность команд агентов","archive.discardedLabel":"План отменен · Архивная история","archive.label":"Завершено · Архивная история","assignment.discarded":"План отклонён","assignment.empty":"Нет задач","assignment.label":"Капитан назначен","assignment.staged":"Запланировано","captain.name":"Капитан","captain.role":"Разделить · Делегировать · Синтезировать","captain.state.awaitingFeedback":"Ожидание отзыва","captain.state.collected":"Все полученные отчеты","captain.state.discarded":"Отменено","captain.state.settled":"Завершено","captain.state.staged":"Ожидает одобрения","captain.state.takeover":"Работаю над {tasks}","captain.state.waiting":"Ожидание отчетов","captain.state.working":"{count} активных","captain.summary":"Назначено {tasks} задач {members} участникам","captain.summary.awaitingFeedback":"Черновой вариант сохранен; ожидаем ваших указаний по доработке в чате","captain.summary.discarded":"План отклонён: {members} участников не созданы и {tasks} задач не выполнены","captain.summary.staged":"Запланировано {tasks} задач и {members} участников; ожидают утверждения","captain.summary.withTakeover":"Назначено {tasks} участникам · Капитан владеет {captainTasks}","card.memberCount":"{count} участников","delegation.aria":"Карта делегирования капитана","dependency.aria":"Цепочка зависимостей задач","dependency.hint.chain":"Наведите для подсветки зависимостей · Нажмите, чтобы закрепить","dependency.hint.parallel":"Нет зависимостей · Нажмите для подробностей","dependency.hint.pinned":"{taskId} закреплена · Esc для сброса","dependency.parallel":"Параллельные задачи","dependency.title":"Зависимости задач","format.listSeparator":",","member.model":"{model}","member.state.delivered":"Доставлено","member.state.failed":"Имеются сбои","member.state.left":"Покинул команду","member.state.notCreated":"Не создано","member.state.pending":"Ожидание","member.state.removed":"Удалено","member.state.staged":"В плане (не создан)","member.state.stopped":"Остановлено","member.state.unassigned":"Ожидание назначения","member.state.waiting":"Ожидание","member.state.working":"Работает","member.status.delivered":"Задачи выполнены","member.status.discarded":"План отклонён; участник не был создан","member.status.executing":"Работа над {taskId}","member.status.executingModel":"Работа над {taskId} · {model}","member.status.idle":"Готовы продолжить","member.status.settled":"Вся назначенная работа выполнена","member.status.staged":"Будет создан после одобрения","member.status.stopped":"Команда остановлена; требуется явное возобновление","member.status.unknown":"Статус неизвестен","member.status.waitingAssignment":"Ожидание назначения работы от капитана","member.status.waitingOn":"Ожидание {taskId} · {assignee}","member.status.waitingPrerequisite":"Ожидание выполнения предварительных условий","member.status.working":"Работа над назначенными задачами","members.collapse":"Свернуть","members.empty":"Пока нет участников; ожидаем, пока капитан соберёт команду","members.expand":"Развернуть","members.toggle":"Участники {count}","plan.addTask":"Добавить задачу","plan.adding":"Добавление…","plan.approve":"Одобрить и запустить","plan.approveConfirm":"Подтвердить запуск","plan.approveConfirmTitle":"Подтвердить запуск команды","plan.approveHint":"Одобрение создаёт {members} участников и планирует {tasks} задачи.","plan.approveTitle":"План готов?","plan.approveWarning":"Маршруты участников и зависимости нельзя редактировать здесь после запуска.","plan.approving":"Создание участников…","plan.badge":"Ожидание подтверждения","plan.cancel":"Отмена","plan.continue":"Вернуться в чат и исправить","plan.dependencies.count":"{count} зависимостей","plan.dependencies.none":"Нет зависимостей","plan.description":"Участники не были созданы, и задачи не были назначены. Отредактируйте черновик здесь или вернитесь в чат и сообщите Капитану, что нужно изменить.","plan.discard":"Отменить этот план","plan.discardConfirm":"Отменить план","plan.discardConfirmTitle":"Отменить этот план?","plan.discardWarning":"План будет завершён и заархивирован. Участники не были созданы, и задачи выполняться не будут.","plan.discarding":"Отмена…","plan.failed":"Операция не удалась: {message}","plan.feedbackHint":"Капитан спросит в чате. После вашего ответа он пересмотрит этот черновик и снова будет ждать одобрения.","plan.feedbackTitle":"Ожидание ваших указаний по исправлению","plan.flow.aria":"Процесс запуска команды","plan.flow.review":"Просмотреть план","plan.flow.run":"Начать работу","plan.flow.spawn":"Создать участников","plan.member.model":"Модель","plan.member.prompt":"Роль подсказки","plan.member.provider":"Провайдер","plan.member.reasoning":"Усилие на рассуждение","plan.member.reasoningHint":"Оставьте пустым для значения по умолчанию; принимает low, medium, high, xhigh и другие.","plan.member.role":"Роль","plan.member.roleFallback":"Роль не установлена","plan.members.count":"{count} участников","plan.members.empty":"Пока нет запланированных участников","plan.members.title":"Участники и маршруты моделей","plan.model.back":"Назад","plan.model.choose":"Выберите модель","plan.model.currentUnavailable":"{provider}/{model} (нет в текущем каталоге)","plan.model.defaultReasoning":"Усилия по умолчанию при рассуждении","plan.model.empty":"Нет доступных моделей","plan.model.loading":"Загрузка моделей…","plan.model.modelDefault":"Модель по умолчанию ({effort})","plan.model.partialFailure":"{count} каталогов провайдеров не удалось загрузить","plan.model.providerDefault":"Провайдер по умолчанию","plan.model.retry":"Повторить","plan.model.route":"Маршрут: {provider}/{model}","plan.model.triggerAria":"Выберите модель участника, текущая {model}, уровень усилий для рассуждений {effort}","plan.newTask":"Новая тема задачи","plan.newTaskLabel":"Добавить запланированную задачу","plan.pendingEdits":"Сохраните текущие изменения перед запуском команды.","plan.readySummary":"{members} участников · {tasks} задач · {links} зависимостей","plan.remove":"Удалить","plan.removeConfirm":"Подтвердите удаление","plan.removeWarning":"Удаление {task} приведет к пересчету зависимостей ниже по цепочке.","plan.removed":"Задача удалена","plan.returnToChat":"Вернуться в чат","plan.save":"Сохранить","plan.saved":"План сохранён","plan.saving":"Сохранение…","plan.task.assignee":"Исполнитель","plan.task.dependencies":"ID задач зависимостей (через запятую)","plan.task.dependenciesHint":"Например, task-1, task-2; циклы отклонены","plan.task.description":"Описание задачи","plan.task.subject":"Тема задачи","plan.task.unassigned":"Общий пул задач","plan.taskAdded":"Задача добавлена","plan.tasks.count":"{count} задач · {links} зависимостей","plan.tasks.empty":"Нет запланированных задач","plan.tasks.title":"Задачи и зависимости","plan.title":"Проверка плана перед запуском","plan.unsaved":"Не сохранено","progress.aria":"Общий прогресс команды","progress.blocked":"■ Ожидание {count}","progress.delivered":"■ Доставлено {count}","progress.running":"■ В процессе {count}","progress.title":"Общий прогресс","task.assignee.unclaimed":"Невостребованные","task.detail.completed":"Завершено и доставлено","task.detail.noDownstream":"Нет последующих задач","task.detail.noPrerequisite":"Нет требований; готовы начать","task.detail.notRun":"План отменён; задача не была выполнена","task.detail.ready":"Предварительные условия выполнены; можно начинать","task.detail.unlocks":"Разблокирует {tasks} после завершения","task.detail.waitingOn":"Ожидание {tasks}","task.model":"Модель: {model}","task.runningAria":"Выполняется","task.status.cancelled":"Отменено","task.status.claimed":"Заявлено","task.status.completed":"Завершено","task.status.failed":"Не удалось","task.status.inProgress":"Выполняется","task.status.notRun":"Не запущено","task.status.pending":"Невостребованные","task.summary.allDelivered":"Все {count} задачи доставлены","task.summary.blocked":"{tasks} ожидают выполнения предварительных условий","task.summary.blockedAndRunning":"{tasks}{more} ожидают выполнения предварительных условий; другая работа уже начата","task.summary.discarded":"{count} запланированных задач отменено; ни одна не выполнена","task.summary.ended":"Итог: {completed} доставлено · {cancelled} отменено · {failed} не удалось","task.summary.failedSettled":"{count} ошибок; автоматический цикл остановлен","task.summary.more":"и ещё {count}","task.summary.ready":"{tasks} готовы к началу","task.summary.running":"{tasks} в процессе выполнения","task.summary.staged":"{count} запланированных задач ожидают утверждения","task.summary.waitingBreakdown":"Ожидание, пока капитан распределит работу","task.summary.waitingSchedule":"Ожидание следующего цикла планирования","team.discarded":"Отклонено","team.ended":"Завершено","team.stats.completed":"{completed}/{total} завершено","team.stats.members":"{count} участников","team.stats.messages":"{count} сообщений","team.stop":"Остановить команду","team.stopCancel":"Продолжать работу","team.stopConfirm":"Остановить команду","team.stopDescription":"Это отменяет {tasks} незавершённых задач и останавливает {members} работающих участников. Завершённые результаты сохраняются.","team.stopFailed":"Не удалось остановить команду: {message}","team.stopRequestFailed":"Сервер не смог остановить эту команду. Попробуйте снова.","team.stopTitle":"Остановить “{team}”?","team.stopped":"Остановлено","team.stopping":"Остановка…"},"dsh-agent-teams":{"action.openActivityPanel":"Открыть панель активности","activity.badgeAria":"Активность и история команд агентов, {count} записей команд","activity.collapse":"Свернуть панель активности","activity.dockRight":"Закрепить справа","activity.empty":"Нет активности команды","activity.float":"Переключиться на плавающую панель","activity.panelAria":"Панель активности команд агентов","activity.panelButton":"Панель активности","activity.title":"Активность команд агентов","archive.discardedLabel":"План отменен · Архивная история","archive.label":"Завершено · Архивная история","assignment.discarded":"План отклонён","assignment.empty":"Нет задач","assignment.label":"Капитан назначен","assignment.staged":"Запланировано","captain.name":"Капитан","captain.role":"Разделить · Делегировать · Синтезировать","captain.state.awaitingFeedback":"Ожидание отзыва","captain.state.collected":"Все полученные отчеты","captain.state.discarded":"Отменено","captain.state.settled":"Завершено","captain.state.staged":"Ожидает одобрения","captain.state.takeover":"Работаю над {tasks}","captain.state.waiting":"Ожидание отчетов","captain.state.working":"{count} активных","captain.summary":"Назначено {tasks} задач {members} участникам","captain.summary.awaitingFeedback":"Черновой вариант сохранен; ожидаем ваших указаний по доработке в чате","captain.summary.discarded":"План отклонён: {members} участников не созданы и {tasks} задач не выполнены","captain.summary.staged":"Запланировано {tasks} задач и {members} участников; ожидают утверждения","captain.summary.withTakeover":"Назначено {tasks} участникам · Капитан владеет {captainTasks}","card.memberCount":"{count} участников","delegation.aria":"Карта делегирования капитана","dependency.aria":"Цепочка зависимостей задач","dependency.hint.chain":"Наведите для подсветки зависимостей · Нажмите, чтобы закрепить","dependency.hint.parallel":"Нет зависимостей · Нажмите для подробностей","dependency.hint.pinned":"{taskId} закреплена · Esc для сброса","dependency.parallel":"Параллельные задачи","dependency.title":"Зависимости задач","format.listSeparator":",","member.model":"{model}","member.state.delivered":"Доставлено","member.state.failed":"Имеются сбои","member.state.left":"Покинул команду","member.state.notCreated":"Не создано","member.state.pending":"Ожидание","member.state.removed":"Удалено","member.state.staged":"В плане (не создан)","member.state.stopped":"Остановлено","member.state.unassigned":"Ожидание назначения","member.state.waiting":"Ожидание","member.state.working":"Работает","member.status.delivered":"Задачи выполнены","member.status.discarded":"План отклонён; участник не был создан","member.status.executing":"Работа над {taskId}","member.status.executingModel":"Работа над {taskId} · {model}","member.status.idle":"Готовы продолжить","member.status.settled":"Вся назначенная работа выполнена","member.status.staged":"Будет создан после одобрения","member.status.stopped":"Команда остановлена; требуется явное возобновление","member.status.unknown":"Статус неизвестен","member.status.waitingAssignment":"Ожидание назначения работы от капитана","member.status.waitingOn":"Ожидание {taskId} · {assignee}","member.status.waitingPrerequisite":"Ожидание выполнения предварительных условий","member.status.working":"Работа над назначенными задачами","members.collapse":"Свернуть","members.empty":"Пока нет участников; ожидаем, пока капитан соберёт команду","members.expand":"Развернуть","members.toggle":"Участники {count}","plan.addTask":"Добавить задачу","plan.adding":"Добавление…","plan.approve":"Одобрить и запустить","plan.approveConfirm":"Подтвердить запуск","plan.approveConfirmTitle":"Подтвердить запуск команды","plan.approveHint":"Одобрение создаёт {members} участников и планирует {tasks} задачи.","plan.approveTitle":"План готов?","plan.approveWarning":"Маршруты участников и зависимости нельзя редактировать здесь после запуска.","plan.approving":"Создание участников…","plan.badge":"Ожидание подтверждения","plan.cancel":"Отмена","plan.continue":"Вернуться в чат и исправить","plan.dependencies.count":"{count} зависимостей","plan.dependencies.none":"Нет зависимостей","plan.description":"Участники не были созданы, и задачи не были назначены. Отредактируйте черновик здесь или вернитесь в чат и сообщите Капитану, что нужно изменить.","plan.discard":"Отменить этот план","plan.discardConfirm":"Отменить план","plan.discardConfirmTitle":"Отменить этот план?","plan.discardWarning":"План будет завершён и заархивирован. Участники не были созданы, и задачи выполняться не будут.","plan.discarding":"Отмена…","plan.failed":"Операция не удалась: {message}","plan.feedbackHint":"Капитан спросит в чате. После вашего ответа он пересмотрит этот черновик и снова будет ждать одобрения.","plan.feedbackTitle":"Ожидание ваших указаний по исправлению","plan.flow.aria":"Процесс запуска команды","plan.flow.review":"Просмотреть план","plan.flow.run":"Начать работу","plan.flow.spawn":"Создать участников","plan.member.model":"Модель","plan.member.prompt":"Роль подсказки","plan.member.provider":"Провайдер","plan.member.reasoning":"Усилие на рассуждение","plan.member.reasoningHint":"Оставьте пустым для значения по умолчанию; принимает low, medium, high, xhigh и другие.","plan.member.role":"Роль","plan.member.roleFallback":"Роль не установлена","plan.members.count":"{count} участников","plan.members.empty":"Пока нет запланированных участников","plan.members.title":"Участники и маршруты моделей","plan.model.back":"Назад","plan.model.choose":"Выберите модель","plan.model.currentUnavailable":"{provider}/{model} (нет в текущем каталоге)","plan.model.defaultReasoning":"Усилия по умолчанию при рассуждении","plan.model.empty":"Нет доступных моделей","plan.model.loading":"Загрузка моделей…","plan.model.modelDefault":"Модель по умолчанию ({effort})","plan.model.partialFailure":"{count} каталогов провайдеров не удалось загрузить","plan.model.providerDefault":"Провайдер по умолчанию","plan.model.retry":"Повторить","plan.model.route":"Маршрут: {provider}/{model}","plan.model.triggerAria":"Выберите модель участника, текущая {model}, уровень усилий для рассуждений {effort}","plan.newTask":"Новая тема задачи","plan.newTaskLabel":"Добавить запланированную задачу","plan.pendingEdits":"Сохраните текущие изменения перед запуском команды.","plan.readySummary":"{members} участников · {tasks} задач · {links} зависимостей","plan.remove":"Удалить","plan.removeConfirm":"Подтвердите удаление","plan.removeWarning":"Удаление {task} приведет к пересчету зависимостей ниже по цепочке.","plan.removed":"Задача удалена","plan.returnToChat":"Вернуться в чат","plan.save":"Сохранить","plan.saved":"План сохранён","plan.saving":"Сохранение…","plan.task.assignee":"Исполнитель","plan.task.dependencies":"ID задач зависимостей (через запятую)","plan.task.dependenciesHint":"Например, task-1, task-2; циклы отклонены","plan.task.description":"Описание задачи","plan.task.subject":"Тема задачи","plan.task.unassigned":"Общий пул задач","plan.taskAdded":"Задача добавлена","plan.tasks.count":"{count} задач · {links} зависимостей","plan.tasks.empty":"Нет запланированных задач","plan.tasks.title":"Задачи и зависимости","plan.title":"Проверка плана перед запуском","plan.unsaved":"Не сохранено","progress.aria":"Общий прогресс команды","progress.blocked":"■ Ожидание {count}","progress.delivered":"■ Доставлено {count}","progress.running":"■ В процессе {count}","progress.title":"Общий прогресс","task.assignee.unclaimed":"Невостребованные","task.detail.completed":"Завершено и доставлено","task.detail.noDownstream":"Нет последующих задач","task.detail.noPrerequisite":"Нет требований; готовы начать","task.detail.notRun":"План отменён; задача не была выполнена","task.detail.ready":"Предварительные условия выполнены; можно начинать","task.detail.unlocks":"Разблокирует {tasks} после завершения","task.detail.waitingOn":"Ожидание {tasks}","task.model":"Модель: {model}","task.runningAria":"Выполняется","task.status.cancelled":"Отменено","task.status.claimed":"Заявлено","task.status.completed":"Завершено","task.status.failed":"Не удалось","task.status.inProgress":"Выполняется","task.status.notRun":"Не запущено","task.status.pending":"Невостребованные","task.summary.allDelivered":"Все {count} задачи доставлены","task.summary.blocked":"{tasks} ожидают выполнения предварительных условий","task.summary.blockedAndRunning":"{tasks}{more} ожидают выполнения предварительных условий; другая работа уже начата","task.summary.discarded":"{count} запланированных задач отменено; ни одна не выполнена","task.summary.ended":"Итог: {completed} доставлено · {cancelled} отменено · {failed} не удалось","task.summary.failedSettled":"{count} ошибок; автоматический цикл остановлен","task.summary.more":"и ещё {count}","task.summary.ready":"{tasks} готовы к началу","task.summary.running":"{tasks} в процессе выполнения","task.summary.staged":"{count} запланированных задач ожидают утверждения","task.summary.waitingBreakdown":"Ожидание, пока капитан распределит работу","task.summary.waitingSchedule":"Ожидание следующего цикла планирования","team.discarded":"Отклонено","team.ended":"Завершено","team.stats.completed":"{completed}/{total} завершено","team.stats.members":"{count} участников","team.stats.messages":"{count} сообщений","team.stop":"Остановить команду","team.stopCancel":"Продолжать работу","team.stopConfirm":"Остановить команду","team.stopDescription":"Это отменяет {tasks} незавершённых задач и останавливает {members} работающих участников. Завершённые результаты сохраняются.","team.stopFailed":"Не удалось остановить команду: {message}","team.stopRequestFailed":"Сервер не смог остановить эту команду. Попробуйте снова.","team.stopTitle":"Остановить “{team}”?","team.stopped":"Остановлено","team.stopping":"Остановка…"}}