copilot-operator 0.1.4 → 0.1.6

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 (47) hide show
  1. package/dist/src/api/operator.controller.js +5 -2
  2. package/dist/src/api/operator.service.js +48 -12
  3. package/dist/src/orchestrator/taskRunner.js +12 -2
  4. package/dist/src/plan/brief.js +1290 -1221
  5. package/dist/src/plan/schema.js +12 -0
  6. package/dist/src/plan/script.js +13 -0
  7. package/dist/src/plan/systemGuide.js +1396 -172
  8. package/dist/src/session/compose.js +5 -1
  9. package/dist/src/session/exports.js +4 -0
  10. package/dist/src/session/store.js +4 -1
  11. package/dist/src/session/story.js +10 -1
  12. package/dist/src/vcs/taskVcs.js +122 -12
  13. package/dist/web/404.html +2 -2
  14. package/dist/web/_next/static/chunks/549-afafecd6bfbb138e.js +1 -0
  15. package/dist/web/_next/static/chunks/56-91cd1709158ebf99.js +1 -0
  16. package/dist/web/_next/static/chunks/867-fc983d08916b4e28.js +1 -0
  17. package/dist/web/_next/static/chunks/app/history/page-b3b4af994c868b5d.js +1 -0
  18. package/dist/web/_next/static/chunks/app/layout-e0174d863960f109.js +1 -0
  19. package/dist/web/_next/static/chunks/app/sessions/view/page-d4213354730a945c.js +1 -0
  20. package/dist/web/_next/static/css/{5a10c60adf9c5336.css → 63fea96806e6b2cb.css} +1 -1
  21. package/dist/web/appearance.html +2 -2
  22. package/dist/web/appearance.txt +25 -24
  23. package/dist/web/defaults.html +2 -2
  24. package/dist/web/defaults.txt +25 -24
  25. package/dist/web/history.html +2 -2
  26. package/dist/web/history.txt +25 -24
  27. package/dist/web/import.html +2 -2
  28. package/dist/web/import.txt +25 -24
  29. package/dist/web/index.html +2 -2
  30. package/dist/web/index.txt +25 -24
  31. package/dist/web/level1.html +2 -2
  32. package/dist/web/level1.txt +25 -24
  33. package/dist/web/presets.html +2 -2
  34. package/dist/web/presets.txt +25 -24
  35. package/dist/web/sessions/view.html +2 -2
  36. package/dist/web/sessions/view.txt +25 -24
  37. package/dist/web/system.html +2 -2
  38. package/dist/web/system.txt +25 -24
  39. package/package.json +4 -3
  40. package/dist/web/_next/static/chunks/549-2086c05135bc9753.js +0 -1
  41. package/dist/web/_next/static/chunks/867-f0e3e152f6f67e45.js +0 -1
  42. package/dist/web/_next/static/chunks/89-382e9b29486d2747.js +0 -1
  43. package/dist/web/_next/static/chunks/app/history/page-8d4f817e36986e3f.js +0 -1
  44. package/dist/web/_next/static/chunks/app/layout-92fa876afe619cf3.js +0 -1
  45. package/dist/web/_next/static/chunks/app/sessions/view/page-185f5fcc383e6619.js +0 -1
  46. /package/dist/web/_next/static/{p9lexLS0u8W5N6VzLavHO → WJ_8hRZsp4VWiDZx8NMUw}/_buildManifest.js +0 -0
  47. /package/dist/web/_next/static/{p9lexLS0u8W5N6VzLavHO → WJ_8hRZsp4VWiDZx8NMUw}/_ssgManifest.js +0 -0
@@ -20,11 +20,15 @@
20
20
  * that names the key, which is how whoever renamed it learns that the persona's script has to
21
21
  * follow.
22
22
  *
23
- * The guide is read by a language model inside a prompt that is already long, so it is a
24
- * selection and not an inventory: the controls an operator is actually told to press, the
25
- * badges they are told to read back, and nothing else. Add to it when a new control is one the
26
- * persona would name — and when adding one, take the label from `web/lib/strings.ts` character
27
- * for character, because the check is unforgiving about it.
23
+ * It is an inventory, and was not always. It began as a selection — the controls an operator is
24
+ * usually told to press — on the reasoning that the prompt is long; but Kerrigan is also told
25
+ * never to name a control the guide does not list, so every control left out was one she would
26
+ * say did not exist. An audit on 2026-09-29 found 144 of 283 labelled controls missing, most of
27
+ * them the newest ones. Now `test/guide.check.ts` reads every page and fails on a control that is
28
+ * neither here nor exempted there with a reason, and it holds the brief under the size a chat will
29
+ * accept. Keep the sentences short: every one of them is pasted into a chat. Take each label from
30
+ * `web/lib/strings.ts` character for character, because the check is unforgiving about it, and say
31
+ * when a control is only there under a condition (a view, a tick, a state).
28
32
  */
29
33
  /**
30
34
  * The screens in the order the operator meets them: the navigation that reaches everything,
@@ -36,14 +40,22 @@ export const SYSTEM_GUIDE = [
36
40
  route: 'every page',
37
41
  nameEn: 'The header and the navigation',
38
42
  nameBg: 'Заглавната лента и навигацията',
39
- purposeEn: 'The links down the side of every page, the language switch, and the two buttons of the box that asks before anything irreversible.',
40
- purposeBg: 'Връзките отстрани на всяка страница, смяната на езика и двата бутона на прозореца, който пита преди нещо необратимо.',
43
+ purposeEn: 'The links down the side of every page, the language switch, the round to-the-top and to-the-bottom buttons of a long page, the box that asks before anything irreversible, and the banner of steps waiting for a decision, which appears on every page.',
44
+ purposeBg: 'Връзките отстрани на всяка страница, смяната на езика, кръглите бутони към началото и края на дълга страница, прозорецът, който пита преди нещо необратимо, и лентата със стъпки, чакащи решение, която се появява на всяка страница.',
41
45
  sections: [
42
46
  {
43
47
  headingKey: 'nav.label',
44
48
  en: 'Main',
45
49
  bg: 'Основно',
46
50
  controls: [
51
+ {
52
+ key: 'a11y.skip',
53
+ kind: 'link',
54
+ en: 'Skip to the content',
55
+ bg: 'Към съдържанието',
56
+ doesEn: 'For keyboard users: the first Tab on a page jumps past the navigation to the content.',
57
+ doesBg: 'За клавиатура: първото Tab на страницата прескача навигацията към съдържанието.',
58
+ },
47
59
  {
48
60
  key: 'nav.sessions',
49
61
  kind: 'link',
@@ -116,6 +128,22 @@ export const SYSTEM_GUIDE = [
116
128
  doesEn: 'Switches the whole interface, and the brief it hands out, between English and Bulgarian.',
117
129
  doesBg: 'Превключва целия интерфейс и заданието, което дава, между английски и български.',
118
130
  },
131
+ {
132
+ key: 'scroll.top',
133
+ kind: 'button',
134
+ en: 'To the top of the page',
135
+ bg: 'Най-горе на страницата',
136
+ doesEn: 'The round ↑ button at the right edge of a page more than two screens long, such as the register: back to the top.',
137
+ doesBg: 'Кръглият бутон ↑ в десния край на страница, по-дълга от два екрана, например регистъра: обратно най-горе.',
138
+ },
139
+ {
140
+ key: 'scroll.bottom',
141
+ kind: 'button',
142
+ en: 'To the bottom of the page',
143
+ bg: 'Най-долу на страницата',
144
+ doesEn: 'The round ↓ button under it: to the bottom of the page.',
145
+ doesBg: 'Кръглият бутон ↓ под него: най-долу на страницата.',
146
+ },
119
147
  ],
120
148
  },
121
149
  {
@@ -139,6 +167,69 @@ export const SYSTEM_GUIDE = [
139
167
  doesEn: 'Closes the question and does nothing; the action is abandoned.',
140
168
  doesBg: 'Затваря въпроса и не прави нищо; действието се отказва.',
141
169
  },
170
+ {
171
+ key: 'dialog.noticeTitle',
172
+ kind: 'note',
173
+ en: 'Notice',
174
+ bg: 'Съобщение',
175
+ doesEn: 'The title of a box that only informs; its one button is "OK".',
176
+ doesBg: 'Заглавието на прозорец, който само съобщава; единственият му бутон е „Добре“.',
177
+ },
178
+ ],
179
+ },
180
+ {
181
+ headingKey: 'approval.waitingHere',
182
+ en: 'A step is waiting for your decision',
183
+ bg: 'Стъпка чака вашето решение',
184
+ controls: [
185
+ {
186
+ key: 'approval.title',
187
+ kind: 'note',
188
+ en: 'Step {n} is waiting for you',
189
+ bg: 'Стъпка {n} чака вашето решение',
190
+ doesEn: 'At the top of every page: one card per waiting step, with its session (a link) and the exact command. The browser tab shows "(n) waiting for you".',
191
+ doesBg: 'Горе на всяка страница: по една карта за всяка чакаща стъпка, със сесията ѝ (връзка) и точната команда. Разделът на браузъра показва „(n) чака вас“.',
192
+ },
193
+ {
194
+ key: 'approval.run',
195
+ kind: 'button',
196
+ en: 'Run',
197
+ bg: 'Изпълни',
198
+ doesEn: 'Runs that one command now and lets the task carry on to its next step.',
199
+ doesBg: 'Изпълнява тази една команда сега и оставя задачата да продължи към следващата си стъпка.',
200
+ },
201
+ {
202
+ key: 'approval.runAll',
203
+ kind: 'button',
204
+ en: 'Run this and the rest without asking',
205
+ bg: 'Изпълни без да питаш повече',
206
+ doesEn: 'Runs it and stops asking until this run ends, after an "are you sure". A downloading command then follows Settings → Execution. Not offered on one.',
207
+ doesBg: 'Изпълнява я и спира да пита до края на пускането, след „сигурен ли си“. Команда, която тегли, после следва Настройки → Изпълнение. Не се предлага на такава.',
208
+ },
209
+ {
210
+ key: 'approval.network',
211
+ kind: 'note',
212
+ en: 'This command downloads from the internet. A run that does not ask still stops for this one (unless Settings → Execution says otherwise), because a later step could run what arrived. Run it only if you know what it fetches and why.',
213
+ bg: 'Тази команда тегли от интернет. Пускане без питане също спира за нея (освен ако Настройки → Изпълнение не казва друго), защото следваща стъпка може да пусне изтегленото. Изпълнете я само ако знаете какво тегли и защо.',
214
+ doesEn: 'On a step that downloads: it waits here even in a run that does not ask, unless Settings → Execution says to refuse or run it. localhost and npm or dotnet installs never wait.',
215
+ doesBg: 'На стъпка, която тегли: чака тук дори при пускане без питане, освен ако Настройки → Изпълнение казва да се отказва или изпълнява. localhost и инсталации през npm или dotnet никога не чакат.',
216
+ },
217
+ {
218
+ key: 'approval.skip',
219
+ kind: 'button',
220
+ en: 'Skip',
221
+ bg: 'Пропусни',
222
+ doesEn: 'Leaves that command unrun and moves the task on to its next step; the chat is told a person skipped it.',
223
+ doesBg: 'Оставя командата неизпълнена и придвижва задачата към следващата стъпка; чатът научава, че човек я е пропуснал.',
224
+ },
225
+ {
226
+ key: 'approval.abort',
227
+ kind: 'button',
228
+ en: 'Abort task',
229
+ bg: 'Прекрати задачата',
230
+ doesEn: 'Ends the whole task here, aborted; its remaining steps are not run.',
231
+ doesBg: 'Прекратява цялата задача тук; останалите ѝ стъпки не се изпълняват.',
232
+ },
142
233
  ],
143
234
  },
144
235
  ],
@@ -155,6 +246,30 @@ export const SYSTEM_GUIDE = [
155
246
  en: '1. Take this to the chat',
156
247
  bg: '1. Занесете това в чата',
157
248
  controls: [
249
+ {
250
+ key: 'plan.title',
251
+ kind: 'note',
252
+ en: 'A plan written by a chat model',
253
+ bg: 'План, написан от чат модел',
254
+ doesEn: 'The heading of the page.',
255
+ doesBg: 'Заглавието на страницата.',
256
+ },
257
+ {
258
+ key: 'plan.briefAsks',
259
+ kind: 'note',
260
+ en: 'The brief does the asking',
261
+ bg: 'Заданието пита вместо вас',
262
+ doesEn: 'Says the brief itself asks the questions; the operator only copies it into a chat.',
263
+ doesBg: 'Казва, че заданието само задава въпросите; операторът само го копира в чат.',
264
+ },
265
+ {
266
+ key: 'plan.persona',
267
+ kind: 'note',
268
+ en: 'Kerrigan, the persona: two levels',
269
+ bg: 'Kerrigan, персоната: две нива',
270
+ doesEn: 'The heading above "Software level (fixed)" and the three editable boxes below it.',
271
+ doesBg: 'Заглавието над „Софтуерно ниво (фиксирано)“ и трите полета за редакция под него.',
272
+ },
158
273
  {
159
274
  key: 'plan.copyBrief',
160
275
  kind: 'button',
@@ -225,6 +340,22 @@ export const SYSTEM_GUIDE = [
225
340
  en: 'How the tasks are carried out: the agent\'s persona',
226
341
  bg: 'Как се изпълняват задачите: персоната на агента',
227
342
  controls: [
343
+ {
344
+ key: 'plan.personaPick',
345
+ kind: 'select',
346
+ en: 'choose one to put it in the box',
347
+ bg: 'изберете, за да я поставите в полето',
348
+ doesEn: 'The empty choice of the saved-persona menu; picking a persona puts its text in the box (after a question if the box has text).',
349
+ doesBg: 'Празният избор в менюто със запазени персони; изборът на персона слага текста ѝ в полето (след въпрос, ако полето има текст).',
350
+ },
351
+ {
352
+ key: 'plan.personaNone',
353
+ kind: 'select',
354
+ en: 'none saved yet',
355
+ bg: 'още няма запазени',
356
+ doesEn: 'Shown in that menu while no persona has been saved.',
357
+ doesBg: 'Показва се в менюто, докато няма запазена персона.',
358
+ },
228
359
  {
229
360
  key: 'plan.personaSaved',
230
361
  kind: 'select',
@@ -319,6 +450,14 @@ export const SYSTEM_GUIDE = [
319
450
  doesEn: 'Creates the sessions and their tasks. Nothing is started, and the box is emptied afterwards.',
320
451
  doesBg: 'Създава сесиите и задачите им. Нищо не се стартира, а полето се изпразва накрая.',
321
452
  },
453
+ {
454
+ key: 'plan.drop',
455
+ kind: 'field',
456
+ en: 'Drop a .json file here',
457
+ bg: 'Пуснете .json файл тук',
458
+ doesEn: 'The answer box also takes a .json file dropped onto it.',
459
+ doesBg: 'Полето за отговора приема и .json файл, пуснат върху него.',
460
+ },
322
461
  {
323
462
  key: 'plan.clear',
324
463
  kind: 'button',
@@ -349,6 +488,38 @@ export const SYSTEM_GUIDE = [
349
488
  en: 'What will be created',
350
489
  bg: 'Какво ще бъде създадено',
351
490
  controls: [
491
+ {
492
+ key: 'plan.notes',
493
+ kind: 'note',
494
+ en: 'Notes from the model',
495
+ bg: 'Бележки от модела',
496
+ doesEn: 'After "Check it": what the chat model wrote for the operator in the plan.',
497
+ doesBg: 'След „Провери“: какво е написал чат моделът за оператора в плана.',
498
+ },
499
+ {
500
+ key: 'plan.warnings',
501
+ kind: 'note',
502
+ en: 'Worth knowing',
503
+ bg: 'Добре е да знаете',
504
+ doesEn: 'After "Check it": things that do not stop the import but are worth reading.',
505
+ doesBg: 'След „Провери“: неща, които не спират внасянето, но е добре да се прочетат.',
506
+ },
507
+ {
508
+ key: 'plan.duplicates',
509
+ kind: 'note',
510
+ en: 'This is already here',
511
+ bg: 'Това вече го има',
512
+ doesEn: 'After "Check it": the same sessions were imported before; "Create the sessions and tasks" then asks before creating copies. Each row links to the earlier session.',
513
+ doesBg: 'След „Провери“: същите сесии вече са внасяни; „Създай сесиите и задачите“ тогава пита, преди да създаде копия. Всеки ред води към по-ранната сесия.',
514
+ },
515
+ {
516
+ key: 'plan.duplicateRow',
517
+ kind: 'link',
518
+ en: '{name} — {tasks} identical task(s), imported {when}',
519
+ bg: '{name} — {tasks} еднакви задачи, внесени {when}',
520
+ doesEn: 'One row per earlier copy: opens that session.',
521
+ doesBg: 'По един ред за всяко по-ранно копие: отваря тази сесия.',
522
+ },
352
523
  {
353
524
  key: 'plan.valid',
354
525
  kind: 'note',
@@ -372,6 +543,14 @@ export const SYSTEM_GUIDE = [
372
543
  doesEn: 'Opens the sessions list with exactly the new sessions ticked; the run still has to be started there.',
373
544
  doesBg: 'Отваря списъка със сесии с отметнати точно новите; пускането пак се стартира оттам.',
374
545
  },
546
+ {
547
+ key: 'plan.imported',
548
+ kind: 'note',
549
+ en: 'Created {sessions} session(s) with {tasks} task(s). Nothing has started.',
550
+ bg: 'Създадени са {sessions} сесия(и) с {tasks} задача(и). Нищо не е стартирано.',
551
+ doesEn: 'After creating: how many sessions and tasks were made. Nothing has started — the operator starts them.',
552
+ doesBg: 'След създаването: колко сесии и задачи са направени. Нищо не е пуснато — операторът ги пуска.',
553
+ },
375
554
  {
376
555
  key: 'plan.toSessions',
377
556
  kind: 'button',
@@ -442,6 +621,30 @@ export const SYSTEM_GUIDE = [
442
621
  doesEn: 'Ticks every session that still has a queued task, oldest first, replacing whatever was ticked.',
443
622
  doesBg: 'Отмята всяка сесия с чакаща задача, от най-старата нататък, и заменя досегашния избор.',
444
623
  },
624
+ {
625
+ key: 'batch.selectNone',
626
+ kind: 'button',
627
+ en: 'Select none',
628
+ bg: 'Изчисти избора',
629
+ doesEn: 'Clears every tick.',
630
+ doesBg: 'Маха всички отметки.',
631
+ },
632
+ {
633
+ key: 'batch.modelKeep',
634
+ kind: 'select',
635
+ en: 'Each session keeps its own',
636
+ bg: 'Всяка сесия със своя',
637
+ doesEn: 'The empty choice of both model menus: every session keeps the model it has.',
638
+ doesBg: 'Празният избор в двете менюта за модел: всяка сесия запазва модела си.',
639
+ },
640
+ {
641
+ key: 'batch.reviewModelKeep',
642
+ kind: 'select',
643
+ en: 'Each session keeps its own',
644
+ bg: 'Всяка сесия си остава със своя',
645
+ doesEn: 'The same empty choice in the review model menu.',
646
+ doesBg: 'Същият празен избор в менюто за модела на рецензията.',
647
+ },
445
648
  {
446
649
  key: 'batch.runName',
447
650
  kind: 'field',
@@ -471,8 +674,8 @@ export const SYSTEM_GUIDE = [
471
674
  kind: 'button',
472
675
  en: 'Run {n} session(s)',
473
676
  bg: 'Пусни {n} сесия(и)',
474
- doesEn: 'Starts the ticked sessions one after another and runs every command without asking; it confirms once first.',
475
- doesBg: 'Пуска отметнатите сесии една след друга и изпълнява всяка команда без питане; първо иска едно потвърждение.',
677
+ doesEn: 'Starts the ticked sessions one after another and runs every command without asking. It asks "are you sure" first, unless Settings → Execution → "Starting a run without supervision" is "Start it without asking".',
678
+ doesBg: 'Пуска отметнатите сесии една след друга и изпълнява всяка команда без питане. Първо пита „сигурен ли си“, освен ако Настройки → Изпълнение → „Пускане без надзор“ е „Пускай, без да питаш“.',
476
679
  },
477
680
  {
478
681
  key: 'batch.runStep',
@@ -503,8 +706,8 @@ export const SYSTEM_GUIDE = [
503
706
  kind: 'button',
504
707
  en: 'Stop after the current step',
505
708
  bg: 'Спри след текущата стъпка',
506
- doesEn: 'Shown while a run is going: ends it once the step in progress finishes. The task it interrupts ends "not done", part-done — say so, and offer the pause instead when the operator only wants to think.',
507
- doesBg: 'Показва се по време на пускане: спира го след текущата стъпка. Задачата, която прекъсва, завършва „неизпълнена“, наполовина — кажи го и предложи паузата, ако операторът само иска да помисли.',
709
+ doesEn: 'While a run is going: ends it after the current step. The task it interrupts ends aborted, part-done — offer the pause instead when the operator only wants to think.',
710
+ doesBg: 'Докато върви пускане: спира го след текущата стъпка. Прекъснатата задача завършва прекратена, наполовина — предложи паузата, ако операторът само иска да помисли.',
508
711
  },
509
712
  {
510
713
  key: 'batch.pause',
@@ -563,58 +766,19 @@ export const SYSTEM_GUIDE = [
563
766
  },
564
767
  ],
565
768
  },
566
- {
567
- headingKey: 'approval.waitingHere',
568
- en: 'A step is waiting for your decision',
569
- bg: 'Стъпка чака вашето решение',
570
- controls: [
571
- {
572
- key: 'approval.run',
573
- kind: 'button',
574
- en: 'Run',
575
- bg: 'Изпълни',
576
- doesEn: 'Runs that one command now and lets the task carry on to its next step.',
577
- doesBg: 'Изпълнява точно тази команда сега и пуска задачата към следващата ѝ стъпка.',
578
- },
579
- {
580
- key: 'approval.runAll',
581
- kind: 'button',
582
- en: 'Run this and the rest without asking',
583
- bg: 'Изпълни без да питаш повече',
584
- doesEn: 'Runs it and stops asking about every command after it until this run ends, except a command that downloads from the internet, which follows the choice in Settings → Execution. Not offered on such a command.',
585
- doesBg: 'Изпълнява я и спира да пита за следващите команди до края на това пускане, освен за команда, която тегли от интернет — за нея важи изборът в Настройки → Изпълнение. Не се предлага на такава команда.',
586
- },
587
- {
588
- key: 'approval.network',
589
- kind: 'note',
590
- en: 'This command downloads from the internet. A run that does not ask still stops for this one (unless Settings → Execution says otherwise), because a later step could run what arrived. Run it only if you know what it fetches and why.',
591
- bg: 'Тази команда тегли от интернет. Пускане без питане също спира за нея (освен ако Настройки → Изпълнение не казва друго), защото следваща стъпка може да пусне изтегленото. Изпълнете я само ако знаете какво тегли и защо.',
592
- doesEn: 'Shown on a step that fetches from the network. Such a step waits here in every run, including one that does not ask, unless Settings → Execution has chosen to refuse or run such commands in a run without supervision; requests to localhost and package installs through npm or dotnet never wait.',
593
- doesBg: 'Показва се на стъпка, която тегли от мрежата. Такава стъпка чака тук при всяко пускане, включително без питане, освен ако в Настройки → Изпълнение не е избрано такива команди да се отказват или изпълняват при пускане без надзор; заявки към localhost и пакети през npm или dotnet никога не чакат.',
594
- },
595
- {
596
- key: 'approval.skip',
597
- kind: 'button',
598
- en: 'Skip',
599
- bg: 'Пропусни',
600
- doesEn: 'Leaves that command unrun and moves the task on to its next step.',
601
- doesBg: 'Оставя командата неизпълнена и мести задачата към следващата ѝ стъпка.',
602
- },
603
- {
604
- key: 'approval.abort',
605
- kind: 'button',
606
- en: 'Abort task',
607
- bg: 'Прекрати задачата',
608
- doesEn: 'Ends the whole task here; its remaining steps are not run.',
609
- doesBg: 'Прекратява цялата задача тук; останалите ѝ стъпки не се изпълняват.',
610
- },
611
- ],
612
- },
613
769
  {
614
770
  headingKey: 'home.sessions',
615
771
  en: 'Sessions',
616
772
  bg: 'Сесии',
617
773
  controls: [
774
+ {
775
+ key: 'home.selectAll',
776
+ kind: 'checkbox',
777
+ en: 'Select every session',
778
+ bg: 'Избери всички сесии',
779
+ doesEn: 'The tick box in the table heading: ticks every session that is not running. Each row has its own tick box, and the session name is a link to its page.',
780
+ doesBg: 'Отметката в заглавието на таблицата: отметва всички сесии, които не вървят. Всеки ред има своя отметка, а името на сесията е връзка към страницата ѝ.',
781
+ },
618
782
  {
619
783
  key: 'home.tickForBoth',
620
784
  kind: 'note',
@@ -687,13 +851,29 @@ export const SYSTEM_GUIDE = [
687
851
  en: 'The strip beside the session name, at the top of the page',
688
852
  bg: 'Лентата до името на сесията, в началото на страницата',
689
853
  controls: [
854
+ {
855
+ key: 'session.crumb',
856
+ kind: 'link',
857
+ en: 'Sessions',
858
+ bg: 'Сесии',
859
+ doesEn: 'Above the name, back to the sessions list on `/`.',
860
+ doesBg: 'Над името, обратно към списъка със сесии на `/`.',
861
+ },
862
+ {
863
+ key: 'session.group',
864
+ kind: 'field',
865
+ en: 'Share a conversation',
866
+ bg: 'Споделяне на разговор',
867
+ doesEn: 'Sessions with the same name here share one Copilot conversation; empty gives this one its own.',
868
+ doesBg: 'Сесиите с едно и също име тук споделят един разговор в Copilot; празно дава на тази собствен.',
869
+ },
690
870
  {
691
871
  key: 'session.run',
692
872
  kind: 'button',
693
873
  en: 'Run {n} task(s)',
694
874
  bg: 'Пусни {n} задача(и)',
695
- doesEn: 'Starts the queued tasks and runs every command without asking; it confirms once first.',
696
- doesBg: 'Пуска чакащите задачи и изпълнява всяка команда без питане; първо иска едно потвърждение.',
875
+ doesEn: 'Starts the queued tasks and runs every command without asking. It asks "are you sure" first, unless Settings → Execution → "Starting a run without supervision" is "Start it without asking".',
876
+ doesBg: 'Пуска чакащите задачи и изпълнява всяка команда без питане. Първо пита „сигурен ли си“, освен ако Настройки → Изпълнение → „Пускане без надзор“ е „Пускай, без да питаш“.',
697
877
  },
698
878
  {
699
879
  key: 'session.runStep',
@@ -719,6 +899,22 @@ export const SYSTEM_GUIDE = [
719
899
  doesEn: 'Puts a running session back to asking for approval before every further command.',
720
900
  doesBg: 'Връща работеща сесия към питане за одобрение преди всяка следваща команда.',
721
901
  },
902
+ {
903
+ key: 'session.modeUnattended',
904
+ kind: 'badge',
905
+ en: 'not asking any more',
906
+ bg: 'вече не пита',
907
+ doesEn: 'Beside "Stop after current step" while this run no longer asks before each command.',
908
+ doesBg: 'До „Спри след текущата стъпка“, докато това пускане вече не пита преди всяка команда.',
909
+ },
910
+ {
911
+ key: 'home.delete',
912
+ kind: 'button',
913
+ en: 'Delete',
914
+ bg: 'Изтрий',
915
+ doesEn: 'Deletes this session after one question; not while it runs. The run folders and the chats stay.',
916
+ doesBg: 'Изтрива тази сесия след един въпрос; не докато върви. Папките на пусканията и чатовете остават.',
917
+ },
722
918
  {
723
919
  key: 'session.openChat',
724
920
  kind: 'link',
@@ -734,6 +930,46 @@ export const SYSTEM_GUIDE = [
734
930
  en: 'Copilot model',
735
931
  bg: 'Модел на Copilot',
736
932
  controls: [
933
+ {
934
+ key: 'model.followsDefault',
935
+ kind: 'select',
936
+ en: 'from Settings: {name}',
937
+ bg: 'от Настройки: {name}',
938
+ doesEn: 'The first choice of the model menu: this session follows the model chosen in Settings, whatever it is at run time.',
939
+ doesBg: 'Първият избор в менюто за модел: сесията следва модела, избран в Настройки, какъвто е при пускането.',
940
+ },
941
+ {
942
+ key: 'model.default',
943
+ kind: 'select',
944
+ en: 'whatever the chat is set to (default)',
945
+ bg: 'каквото е настроено в чата (по подразбиране)',
946
+ doesEn: 'Leaves the chat on whatever model it is already set to.',
947
+ doesBg: 'Оставя чата на модела, на който вече е.',
948
+ },
949
+ {
950
+ key: 'model.makeDefault',
951
+ kind: 'button',
952
+ en: 'Start new sessions on {name}',
953
+ bg: 'Новите сесии да тръгват с {name}',
954
+ doesEn: 'Makes the model chosen here the one every new session starts on (Settings → "Model for new sessions").',
955
+ doesBg: 'Прави избрания тук модел този, с който тръгва всяка нова сесия (Настройки → „Модел за новите сесии“).',
956
+ },
957
+ {
958
+ key: 'model.clearDefault',
959
+ kind: 'button',
960
+ en: 'Stop setting a model on new sessions',
961
+ bg: 'Да не се задава модел на новите сесии',
962
+ doesEn: 'Stops Settings from setting a model on new sessions.',
963
+ doesBg: 'Спира Настройки да задават модел на новите сесии.',
964
+ },
965
+ {
966
+ key: 'model.showDetails',
967
+ kind: 'disclosure',
968
+ en: 'show what the picker said',
969
+ bg: 'покажи какво каза изборът',
970
+ doesEn: 'Unfolds what Copilot\'s model picker showed when it was last read.',
971
+ doesBg: 'Разгъва какво е показал изборът на модел в Copilot при последното четене.',
972
+ },
737
973
  {
738
974
  key: 'model.refresh',
739
975
  kind: 'button',
@@ -749,6 +985,14 @@ export const SYSTEM_GUIDE = [
749
985
  en: 'Level 1: the base prompt',
750
986
  bg: 'Ниво 1: основен prompt',
751
987
  controls: [
988
+ {
989
+ key: 'l1.show',
990
+ kind: 'disclosure',
991
+ en: 'show the prompt',
992
+ bg: 'покажи prompt-а',
993
+ doesEn: 'Unfolds the base prompt this session sends first.',
994
+ doesBg: 'Разгъва основния prompt, който тази сесия изпраща първи.',
995
+ },
752
996
  {
753
997
  key: 'l1.edit',
754
998
  kind: 'link',
@@ -788,6 +1032,14 @@ export const SYSTEM_GUIDE = [
788
1032
  doesEn: 'Makes the runner branch before each task and commit what changed; it needs a real git repository above.',
789
1033
  doesBg: 'Кара изпълнителя да прави клон преди всяка задача и да комитва промененото; иска истинско git хранилище горе.',
790
1034
  },
1035
+ {
1036
+ key: 'vcs.branches',
1037
+ kind: 'note',
1038
+ en: 'How branches are made',
1039
+ bg: 'Как се правят клоновете',
1040
+ doesEn: 'The heading above the two branch radios; they, "Where this session starts" and "Commit when a task finishes" appear only once "Work on branches and commit what was changed" is ticked.',
1041
+ doesBg: 'Заглавието над двата радио бутона за клони; те, „Откъде тръгва тази сесия“ и „Комит при приключване на задача“ се появяват само след отметка на „Работи по клонове…“.',
1042
+ },
791
1043
  {
792
1044
  key: 'vcs.perTask',
793
1045
  kind: 'radio',
@@ -804,6 +1056,78 @@ export const SYSTEM_GUIDE = [
804
1056
  doesEn: 'Every task continues on the branch the task before it left, so later work builds on earlier work.',
805
1057
  doesBg: 'Всяка задача продължава на клона от предишната, така че по-късната работа стъпва на по-ранната.',
806
1058
  },
1059
+ {
1060
+ key: 'vcs.branchName',
1061
+ kind: 'field',
1062
+ en: 'Name of that one branch',
1063
+ bg: 'Име на този един клон',
1064
+ doesEn: 'Only with "One branch for the whole session": the name of that branch, without the prefix; empty builds it from the session name.',
1065
+ doesBg: 'Само с „Един клон за цялата сесия“: името на този клон, без представката; празно го сглобява от името на сесията.',
1066
+ },
1067
+ {
1068
+ key: 'vcs.startFrom',
1069
+ kind: 'note',
1070
+ en: 'Where this session starts',
1071
+ bg: 'Откъде тръгва тази сесия',
1072
+ doesEn: 'The heading above the three start radios.',
1073
+ doesBg: 'Заглавието над трите радио бутона за начало.',
1074
+ },
1075
+ {
1076
+ key: 'vcs.startBranch',
1077
+ kind: 'radio',
1078
+ en: 'From a local branch (main)',
1079
+ bg: 'От локален клон (main)',
1080
+ doesEn: 'The session starts from the local branch in "Local branch to start from" (main when empty). In a plan: "startFrom": "branch" with "baseBranch".',
1081
+ doesBg: 'Сесията тръгва от локалния клон в „Локален клон, от който да тръгне“ (main, ако е празно). В план: "startFrom": "branch" с "baseBranch".',
1082
+ },
1083
+ {
1084
+ key: 'vcs.startPrevious',
1085
+ kind: 'radio',
1086
+ en: 'From the previous session’s branch',
1087
+ bg: 'От клона на предната сесия',
1088
+ doesEn: 'The session carries on from the end of the branch of the session that last committed work in the same repository — in a run, the one before it. In a plan: "startFrom": "previous-session".',
1089
+ doesBg: 'Сесията продължава от края на клона на сесията, която последна е комитнала работа в същото хранилище — при пускане, предната. В план: "startFrom": "previous-session".',
1090
+ },
1091
+ {
1092
+ key: 'vcs.startHead',
1093
+ kind: 'radio',
1094
+ en: 'From wherever the repository is (as until now)',
1095
+ bg: 'Откъдето е хранилището (както досега)',
1096
+ doesEn: 'The old behaviour, and what a session without a choice does: whatever branch is checked out at its first run, often the one the previous session left.',
1097
+ doesBg: 'Старото поведение и това, което прави сесия без избор: какъвто клон е избран при първото ѝ пускане, често оставеният от предната сесия.',
1098
+ },
1099
+ {
1100
+ key: 'vcs.baseBranch',
1101
+ kind: 'field',
1102
+ en: 'Local branch to start from',
1103
+ bg: 'Локален клон, от който да тръгне',
1104
+ doesEn: 'The branch "From a local branch (main)" starts from, and where a chain begins with no earlier session; main when empty. Hidden with "From wherever the repository is (as until now)".',
1105
+ doesBg: 'Клонът, от който тръгва „От локален клон (main)“, и откъдето започва верига без по-ранна сесия; main, ако е празно. Скрит при „Откъдето е хранилището (както досега)“.',
1106
+ },
1107
+ {
1108
+ key: 'vcs.startedPrevious',
1109
+ kind: 'note',
1110
+ en: 'Started from the end of {branch} ({commit}), the branch of the session “{name}”.',
1111
+ bg: 'Тръгна от края на {branch} ({commit}) — клона на сесията „{name}“.',
1112
+ doesEn: 'After the first run: where the session actually started — the end of the previous session\'s branch.',
1113
+ doesBg: 'След първото пускане: откъде сесията реално е тръгнала — от края на клона на предната сесия.',
1114
+ },
1115
+ {
1116
+ key: 'vcs.startedBranch',
1117
+ kind: 'note',
1118
+ en: 'Started from the local branch {branch} ({commit}).',
1119
+ bg: 'Тръгна от локалния клон {branch} ({commit}).',
1120
+ doesEn: 'After the first run: it started from that local branch.',
1121
+ doesBg: 'След първото пускане: тръгнала е от този локален клон.',
1122
+ },
1123
+ {
1124
+ key: 'vcs.startedHead',
1125
+ kind: 'note',
1126
+ en: 'Started from where the repository was ({commit}).',
1127
+ bg: 'Тръгна оттам, където беше хранилището ({commit}).',
1128
+ doesEn: 'After the first run: it started from wherever the repository was.',
1129
+ doesBg: 'След първото пускане: тръгнала е оттам, където е било хранилището.',
1130
+ },
807
1131
  {
808
1132
  key: 'vcs.commit',
809
1133
  kind: 'checkbox',
@@ -812,6 +1136,22 @@ export const SYSTEM_GUIDE = [
812
1136
  doesEn: 'One local commit per task whatever the outcome; unticked leaves the changes loose in the working tree.',
813
1137
  doesBg: 'По един локален комит на задача, независимо от изхода; без отметка промените остават свободни в работното дърво.',
814
1138
  },
1139
+ {
1140
+ key: 'vcs.ready',
1141
+ kind: 'note',
1142
+ en: 'Ready: {dir}, currently on {branch}.',
1143
+ bg: 'Готово: {dir}, в момента на {branch}.',
1144
+ doesEn: 'Version control can work: the folder and the branch HEAD is on.',
1145
+ doesBg: 'Контролът на версиите може да работи: папката и клонът, на който е HEAD.',
1146
+ },
1147
+ {
1148
+ key: 'vcs.notReady',
1149
+ kind: 'note',
1150
+ en: 'Version control is on, but it cannot work yet.',
1151
+ bg: 'Контролът на версиите е включен, но още не може да работи.',
1152
+ doesEn: 'It is on but cannot work yet; the reason follows (for example uncommitted changes, or no such branch).',
1153
+ doesBg: 'Включен е, но още не може да работи; следва причината (например некомитнати промени или липсващ клон).',
1154
+ },
815
1155
  ],
816
1156
  },
817
1157
  {
@@ -866,6 +1206,38 @@ export const SYSTEM_GUIDE = [
866
1206
  doesEn: 'The folder the include and exclude lists below are relative to.',
867
1207
  doesBg: 'Папката, спрямо която са списъците за включване и изключване отдолу.',
868
1208
  },
1209
+ {
1210
+ key: 'mirror.listDirs',
1211
+ kind: 'button',
1212
+ en: 'List directories',
1213
+ bg: 'Покажи директориите',
1214
+ doesEn: 'Lists the root\'s folders, to pick what to include.',
1215
+ doesBg: 'Изброява папките в корена, за да се избере какво да се включи.',
1216
+ },
1217
+ {
1218
+ key: 'mirror.rules',
1219
+ kind: 'note',
1220
+ en: 'What is copied from it',
1221
+ bg: 'Какво се копира от него',
1222
+ doesEn: 'The heading above the include and exclude lists.',
1223
+ doesBg: 'Заглавието над списъците за включване и изключване.',
1224
+ },
1225
+ {
1226
+ key: 'mirror.include',
1227
+ kind: 'field',
1228
+ en: 'Include (one per line; a directory includes everything beneath it)',
1229
+ bg: 'Включи (по една на ред; директория включва всичко под нея)',
1230
+ doesEn: 'One folder or file per line; a folder brings everything beneath it.',
1231
+ doesBg: 'По една папка или файл на ред; папка включва всичко под нея.',
1232
+ },
1233
+ {
1234
+ key: 'mirror.exclude',
1235
+ kind: 'field',
1236
+ en: 'Exclude (one per line)',
1237
+ bg: 'Изключи (по една на ред)',
1238
+ doesEn: 'One per line: what to leave out even inside an included folder.',
1239
+ doesBg: 'По един на ред: какво да се изостави дори в включена папка.',
1240
+ },
869
1241
  {
870
1242
  key: 'tree.load',
871
1243
  kind: 'button',
@@ -874,6 +1246,70 @@ export const SYSTEM_GUIDE = [
874
1246
  doesEn: 'Reads the project folder and draws its tree, so folders can be ticked instead of typed.',
875
1247
  doesBg: 'Прочита папката на проекта и показва дървото ѝ, за да се избират папки с клик, вместо да се пишат.',
876
1248
  },
1249
+ {
1250
+ key: 'tree.reload',
1251
+ kind: 'button',
1252
+ en: 'Read the folders again',
1253
+ bg: 'Прочети папките отново',
1254
+ doesEn: 'Reads the folder tree again from disk.',
1255
+ doesBg: 'Прочита отново дървото с папки от диска.',
1256
+ },
1257
+ {
1258
+ key: 'tree.exclude',
1259
+ kind: 'button',
1260
+ en: 'carve this folder out',
1261
+ bg: 'изрежи тази папка',
1262
+ doesEn: 'The "−" on a tree row: carves that folder out of an included one.',
1263
+ doesBg: '„−“ на ред в дървото: изважда тази папка от включена.',
1264
+ },
1265
+ {
1266
+ key: 'tree.unexclude',
1267
+ kind: 'button',
1268
+ en: 'stop carving this folder out',
1269
+ bg: 'спри да изрязваш тази папка',
1270
+ doesEn: 'Puts a carved-out folder back.',
1271
+ doesBg: 'Връща изважданата папка обратно.',
1272
+ },
1273
+ {
1274
+ key: 'tree.fold',
1275
+ kind: 'button',
1276
+ en: 'fold',
1277
+ bg: 'сгъни',
1278
+ doesEn: 'Folds a tree row.',
1279
+ doesBg: 'Сгъва ред в дървото.',
1280
+ },
1281
+ {
1282
+ key: 'tree.unfold',
1283
+ kind: 'button',
1284
+ en: 'unfold',
1285
+ bg: 'разгъни',
1286
+ doesEn: 'Unfolds a tree row.',
1287
+ doesBg: 'Разгъва ред в дървото.',
1288
+ },
1289
+ {
1290
+ key: 'mirror.check',
1291
+ kind: 'button',
1292
+ en: 'Check what would be copied',
1293
+ bg: 'Провери какво ще се копира',
1294
+ doesEn: 'Counts what would be copied, without copying: files and size.',
1295
+ doesBg: 'Преброява какво би се копирало, без да копира: файлове и размер.',
1296
+ },
1297
+ {
1298
+ key: 'mirror.showFiles',
1299
+ kind: 'disclosure',
1300
+ en: 'show the list',
1301
+ bg: 'покажи списъка',
1302
+ doesEn: 'Under that count: the list of files.',
1303
+ doesBg: 'Под това преброяване: списъкът с файлове.',
1304
+ },
1305
+ {
1306
+ key: 'mirror.showSkipped',
1307
+ kind: 'disclosure',
1308
+ en: 'show what was left out',
1309
+ bg: 'покажи какво остава навън',
1310
+ doesEn: 'Under that count: what was left out, and why.',
1311
+ doesBg: 'Под това преброяване: какво е изоставено и защо.',
1312
+ },
877
1313
  {
878
1314
  key: 'mirror.gitignore',
879
1315
  kind: 'checkbox',
@@ -905,6 +1341,14 @@ export const SYSTEM_GUIDE = [
905
1341
  en: 'Tasks',
906
1342
  bg: 'Задачи',
907
1343
  controls: [
1344
+ {
1345
+ key: 'chain.title',
1346
+ kind: 'note',
1347
+ en: 'What happens when a task does not finish',
1348
+ bg: 'Какво става, когато задача не приключи успешно',
1349
+ doesEn: 'The heading above the two radios that decide whether a failed task stops the queue.',
1350
+ doesBg: 'Заглавието над двата радио бутона, които решават дали провалена задача спира опашката.',
1351
+ },
908
1352
  {
909
1353
  key: 'chain.stop',
910
1354
  kind: 'radio',
@@ -937,6 +1381,14 @@ export const SYSTEM_GUIDE = [
937
1381
  doesEn: 'The same button while the task is still running — it says this instead, and pulses. Tell the operator to watch here.',
938
1382
  doesBg: 'Същият бутон, докато задачата още върви — пише това и пулсира. Кажи на оператора да гледа тук.',
939
1383
  },
1384
+ {
1385
+ key: 'story.hide',
1386
+ kind: 'button',
1387
+ en: 'Hide what happened',
1388
+ bg: 'Скрий какво се случи',
1389
+ doesEn: 'The same button once the story is open: folds it away again.',
1390
+ doesBg: 'Същият бутон, когато историята е отворена: сгъва я обратно.',
1391
+ },
940
1392
  {
941
1393
  key: 'task.edit',
942
1394
  kind: 'button',
@@ -946,36 +1398,76 @@ export const SYSTEM_GUIDE = [
946
1398
  doesBg: 'Отваря формата за заглавието, ниво 2, текста, git имената и проверките на задачата.',
947
1399
  },
948
1400
  {
949
- key: 'task.continue',
1401
+ key: 'task.cancel',
950
1402
  kind: 'button',
951
- en: 'Continue in the same chat',
952
- bg: 'Продължи в същия чат',
953
- doesEn: 'Only on a task that stopped as limit reached: queues it to carry on in the same chat and on the same branch, with a fresh count of messages.',
954
- doesBg: 'Само на задача, спряла като достигнат лимит: връща я в опашката да продължи в същия чат и клон, с нов брояч на съобщенията.',
1403
+ en: 'Cancel',
1404
+ bg: 'Отказ',
1405
+ doesEn: 'Leaves the edit without saving.',
1406
+ doesBg: 'Излиза от редакцията, без да записва.',
1407
+ },
1408
+ {
1409
+ key: 'task.save',
1410
+ kind: 'button',
1411
+ en: 'Save',
1412
+ bg: 'Запази',
1413
+ doesEn: 'On a task that has not run yet: stores the edit.',
1414
+ doesBg: 'При задача, която още не е вървяла: записва промяната.',
1415
+ },
1416
+ {
1417
+ key: 'task.saveAndRerun',
1418
+ kind: 'button',
1419
+ en: 'Save and queue it again',
1420
+ bg: 'Запази и върни в опашката',
1421
+ doesEn: 'On a task that has already run: stores the edit and queues it again; the earlier attempt is kept. On a done task the new attempt builds on its work. It does not start it.',
1422
+ doesBg: 'При вече изпълнена задача: записва промяната и я връща в опашката; предишният опит се пази. При готова задача новият опит стъпва върху свършеното. Не я пуска.',
1423
+ },
1424
+ {
1425
+ key: 'task.branch',
1426
+ kind: 'field',
1427
+ en: 'Branch for this task',
1428
+ bg: 'Клон за тази задача',
1429
+ doesEn: 'In the edit, with version control on: the branch for this task.',
1430
+ doesBg: 'В редакцията, с включен контрол на версиите: клонът на тази задача.',
1431
+ },
1432
+ {
1433
+ key: 'task.commitMessage',
1434
+ kind: 'field',
1435
+ en: 'Commit message',
1436
+ bg: 'Текст на комита',
1437
+ doesEn: 'In the edit, with version control on: the commit message\'s subject and body.',
1438
+ doesBg: 'В редакцията, с включен контрол на версиите: заглавието и тялото на комита.',
1439
+ },
1440
+ {
1441
+ key: 'task.continue',
1442
+ kind: 'button',
1443
+ en: 'Continue in the same chat',
1444
+ bg: 'Продължи в същия чат',
1445
+ doesEn: 'Only on a task stopped at its limit: queues it to carry on in the same chat and branch with a fresh count. Then press "Run {n} task(s)".',
1446
+ doesBg: 'Само на задача, спряла на лимита: нарежда я да продължи в същия чат и клон с нов брояч. После натиснете „Пусни {n} задача(и)“.',
955
1447
  },
956
1448
  {
957
1449
  key: 'task.rerun',
958
1450
  kind: 'button',
959
1451
  en: 'Run again',
960
1452
  bg: 'Пусни отново',
961
- doesEn: 'Puts a finished task back in the queue unchanged; the earlier attempt is kept with its own log.',
962
- doesBg: 'Връща приключила задача в опашката без промяна; предишният опит се пази със собствен дневник.',
1453
+ doesEn: 'Puts a finished task back in the queue unchanged, to start afresh; the earlier attempt is kept with its own log. It only queues.',
1454
+ doesBg: 'Връща приключила задача в опашката без промяна, да тръгне отначало; предишният опит се пази със собствен дневник. Само я нарежда.',
963
1455
  },
964
1456
  {
965
1457
  key: 'restore.button',
966
1458
  kind: 'button',
967
1459
  en: 'Restore',
968
1460
  bg: 'Върни',
969
- doesEn: 'Puts the repository back to the code as it was before that task started, on a new branch. Nothing is deleted.',
970
- doesBg: 'Връща хранилището към кода отпреди тази задача, на нов клон. Нищо не се изтрива.',
1461
+ doesEn: 'With version control on and a recorded start: puts the repository back to the code as it was before that task, on a new branch. Nothing is deleted.',
1462
+ doesBg: 'С включен контрол на версиите и записано начало: връща хранилището към кода отпреди тази задача, на нов клон. Нищо не се изтрива.',
971
1463
  },
972
1464
  {
973
1465
  key: 'restart.button',
974
1466
  kind: 'button',
975
1467
  en: 'Run again from here',
976
1468
  bg: 'Пусни отново оттук',
977
- doesEn: 'Puts the code back, queues that task and every task after it again, and starts the run.',
978
- doesBg: 'Връща кода, нарежда отново тази задача и всички след нея и пуска изпълнението.',
1469
+ doesEn: 'Puts the code back, queues that task and every task after it — later sessions of its run included — and starts at once, in the mode that run had.',
1470
+ doesBg: 'Връща кода, нарежда отново тази задача и всички след нея — включително следващите сесии от пускането ѝ — и тръгва веднага, в режима на онова пускане.',
979
1471
  },
980
1472
  {
981
1473
  key: 'task.delete',
@@ -990,8 +1482,96 @@ export const SYSTEM_GUIDE = [
990
1482
  kind: 'button',
991
1483
  en: 'save the log',
992
1484
  bg: 'запази log-а',
993
- doesEn: 'Writes the whole run of that task, as plain text, into copilot-operator-logs on the Desktop and opens Explorer with the file selected, ready to drag into a chat. This is the file to ask for when the work is being validated.',
994
- doesBg: 'Записва цялото изпълнение на задачата като чист текст в copilot-operator-logs на десктопа и отваря Explorer с избран файл, готов за влачене в чат. Това е файлът, който се иска при проверка на свършеното.',
1485
+ doesEn: 'Inside the "everything executed, and the files" fold: the whole run of that task as plain text, saved to copilot-operator-logs on the Desktop, Explorer open on it. The file to ask for.',
1486
+ doesBg: 'В раздела „всичко изпълнено и файловете“: цялото изпълнение на задачата като чист текст, записано в copilot-operator-logs на десктопа, с отворен Explorer. Файлът, който да поискаш.',
1487
+ },
1488
+ {
1489
+ key: 'task.files',
1490
+ kind: 'disclosure',
1491
+ en: 'everything executed, and the files',
1492
+ bg: 'всичко изпълнено и файловете',
1493
+ doesEn: 'The fold on the task card that holds "save the log" and the saved reports, files and replies of the run.',
1494
+ doesBg: 'Сгъваемият раздел на картата на задачата, в който са „запази log-а“ и записаните отчети, файлове и отговори.',
1495
+ },
1496
+ {
1497
+ key: 'task.attempts',
1498
+ kind: 'disclosure',
1499
+ en: 'earlier attempts ({n})',
1500
+ bg: 'предишни опити ({n})',
1501
+ doesEn: 'On a task run more than once: the earlier attempts, each with "save this attempt\'s log" and "download plan, work and runner of this attempt".',
1502
+ doesBg: 'На задача, пускана повече от веднъж: по-ранните опити, всеки със „запази log-а на този опит“ и „изтегли план, работа и runner на този опит“.',
1503
+ },
1504
+ {
1505
+ key: 'task.attemptText',
1506
+ kind: 'disclosure',
1507
+ en: 'the task as this attempt ran it',
1508
+ bg: 'задачата, както е изпълнена в този опит',
1509
+ doesEn: 'Inside an earlier attempt: the task text as that attempt ran it.',
1510
+ doesBg: 'В по-ранен опит: текстът на задачата, както го е изпълнил.',
1511
+ },
1512
+ {
1513
+ key: 'task.promptAndL2',
1514
+ kind: 'disclosure',
1515
+ en: 'task prompt and level 2',
1516
+ bg: 'задачата и ниво 2',
1517
+ doesEn: 'The task\'s prompt and its level 2.',
1518
+ doesBg: 'Prompt-ът на задачата и ниво 2 за нея.',
1519
+ },
1520
+ {
1521
+ key: 'task.l2Show',
1522
+ kind: 'disclosure',
1523
+ en: 'level 2 for this task ({n} line(s))',
1524
+ bg: 'ниво 2 за тази задача ({n} реда)',
1525
+ doesEn: 'On a queued task: unfolds the level 2 text it will be sent with.',
1526
+ doesBg: 'На чакаща задача: разгъва текста на ниво 2, с който ще бъде изпратена.',
1527
+ },
1528
+ {
1529
+ key: 'task.firstMessage',
1530
+ kind: 'disclosure',
1531
+ en: 'the exact first message that opened this task',
1532
+ bg: 'точното първо съобщение, с което започна задачата',
1533
+ doesEn: 'The exact first message that opened the task.',
1534
+ doesBg: 'Точното първо съобщение, с което е започнала задачата.',
1535
+ },
1536
+ {
1537
+ key: 'task.finalReply',
1538
+ kind: 'disclosure',
1539
+ en: 'the last message Copilot sent',
1540
+ bg: 'последното съобщение от Copilot',
1541
+ doesEn: 'The last message Copilot sent.',
1542
+ doesBg: 'Последното съобщение от Copilot.',
1543
+ },
1544
+ {
1545
+ key: 'vcs.taskFiles',
1546
+ kind: 'disclosure',
1547
+ en: '{n} file(s) changed',
1548
+ bg: '{n} променени файла',
1549
+ doesEn: 'The files the task\'s commit changed.',
1550
+ doesBg: 'Файловете, които комитът на задачата е променил.',
1551
+ },
1552
+ {
1553
+ key: 'task.deviations',
1554
+ kind: 'disclosure',
1555
+ en: 'Not as the task said ({n})',
1556
+ bg: 'Не както задачата казва ({n})',
1557
+ doesEn: 'What the model says it did not do as the task said, and why.',
1558
+ doesBg: 'Какво моделът казва, че не е направил както е казано в задачата, и защо.',
1559
+ },
1560
+ {
1561
+ key: 'review.findings',
1562
+ kind: 'disclosure',
1563
+ en: 'what it found ({n})',
1564
+ bg: 'какво намери ({n})',
1565
+ doesEn: 'What the independent review found.',
1566
+ doesBg: 'Какво е намерила независимата рецензия.',
1567
+ },
1568
+ {
1569
+ key: 'task.disputes',
1570
+ kind: 'disclosure',
1571
+ en: 'Review findings the model disputed ({n})',
1572
+ bg: 'Оспорени находки на рецензията ({n})',
1573
+ doesEn: 'Review findings the model disputed, with its evidence.',
1574
+ doesBg: 'Находки на рецензията, които моделът е оспорил, с доказателствата си.',
995
1575
  },
996
1576
  {
997
1577
  key: 'status.queued',
@@ -1046,16 +1626,16 @@ export const SYSTEM_GUIDE = [
1046
1626
  kind: 'badge',
1047
1627
  en: 'aborted',
1048
1628
  bg: 'прекратена',
1049
- doesEn: 'The task was ended by hand from an approval step.',
1050
- doesBg: 'Задачата е прекратена на ръка от стъпка за одобрение.',
1629
+ doesEn: 'Stopped before it finished: by "Stop", by "Abort task" on a waiting step, or because the bot was stopped mid-task (then its work is committed on its branch at the next start).',
1630
+ doesBg: 'Спряна преди да приключи: със „Спри“, с „Прекрати задачата“ на чакаща стъпка или защото ботът е спрян посред задача (тогава работата ѝ се комитва на клона ѝ при следващото пускане).',
1051
1631
  },
1052
1632
  {
1053
1633
  key: 'status.limit-reached',
1054
1634
  kind: 'badge',
1055
1635
  en: 'limit reached',
1056
1636
  bg: 'достигнат лимит',
1057
- doesEn: 'The task ran out of its allowed iterations before it could close.',
1058
- doesBg: 'Задачата е изчерпала позволените си итерации, преди да приключи.',
1637
+ doesEn: 'The task ran out of its allowed messages or minutes (Settings → Execution) before it could close. "Continue in the same chat" carries it on.',
1638
+ doesBg: 'Задачата е изчерпала позволените си съобщения или минути (Настройки → Изпълнение), преди да приключи. „Продължи в същия чат“ я продължава.',
1059
1639
  },
1060
1640
  {
1061
1641
  key: 'review.verdict.pass',
@@ -1112,6 +1692,14 @@ export const SYSTEM_GUIDE = [
1112
1692
  doesEn: 'Replaces that text with a preset saved earlier.',
1113
1693
  doesBg: 'Заменя този текст с по-рано запазен шаблон.',
1114
1694
  },
1695
+ {
1696
+ key: 'l2.saveAs',
1697
+ kind: 'button',
1698
+ en: 'Save as preset',
1699
+ bg: 'Запази като шаблон',
1700
+ doesEn: 'Saves the level 2 text as a preset under a name it asks for.',
1701
+ doesBg: 'Запазва текста на ниво 2 като шаблон под име, което пита.',
1702
+ },
1115
1703
  {
1116
1704
  key: 'form.taskLabel',
1117
1705
  kind: 'field',
@@ -1128,14 +1716,6 @@ export const SYSTEM_GUIDE = [
1128
1716
  doesEn: "Puts the new task at the end of this session's queue; it starts nothing.",
1129
1717
  doesBg: 'Слага новата задача в края на опашката на сесията; не пуска нищо.',
1130
1718
  },
1131
- {
1132
- key: 'task.saveAndRerun',
1133
- kind: 'button',
1134
- en: 'Save and queue it again',
1135
- bg: 'Запази и върни в опашката',
1136
- doesEn: 'On a task that has already run: stores the edit and puts the task back in the queue with the new text.',
1137
- doesBg: 'При вече изпълнена задача: записва промяната и връща задачата в опашката с новия текст.',
1138
- },
1139
1719
  ],
1140
1720
  },
1141
1721
  {
@@ -1175,6 +1755,46 @@ export const SYSTEM_GUIDE = [
1175
1755
  doesEn: 'Adds one more empty check to the task. A task with no check has nothing gating it.',
1176
1756
  doesBg: 'Добавя още една празна проверка към задачата. Задача без проверка няма какво да я спре.',
1177
1757
  },
1758
+ {
1759
+ key: 'checks.remove',
1760
+ kind: 'button',
1761
+ en: 'Remove',
1762
+ bg: 'Махни',
1763
+ doesEn: 'Removes that check.',
1764
+ doesBg: 'Премахва тази проверка.',
1765
+ },
1766
+ {
1767
+ key: 'checks.cwd',
1768
+ kind: 'field',
1769
+ en: 'In folder',
1770
+ bg: 'В папка',
1771
+ doesEn: 'The folder the check\'s command runs in; empty is the project.',
1772
+ doesBg: 'Папката, в която върви командата на проверката; празно е проектът.',
1773
+ },
1774
+ {
1775
+ key: 'checks.file',
1776
+ kind: 'field',
1777
+ en: 'File',
1778
+ bg: 'Файл',
1779
+ doesEn: 'For a file check: the file.',
1780
+ doesBg: 'За проверка на файл: файлът.',
1781
+ },
1782
+ {
1783
+ key: 'checks.value',
1784
+ kind: 'field',
1785
+ en: 'Text',
1786
+ bg: 'Текст',
1787
+ doesEn: 'For an output or file-content check: the text to look for.',
1788
+ doesBg: 'За проверка на изход или съдържание: текстът, който се търси.',
1789
+ },
1790
+ {
1791
+ key: 'checks.fromReview',
1792
+ kind: 'disclosure',
1793
+ en: 'From reviews ({n})',
1794
+ bg: 'От рецензии ({n})',
1795
+ doesEn: 'Checks the reviewers suggested; they defer to the next review rather than failing the task alone.',
1796
+ doesBg: 'Проверки, предложени от рецензентите; не провалят задачата сами, а оставят решението на следващата рецензия.',
1797
+ },
1178
1798
  ],
1179
1799
  },
1180
1800
  {
@@ -1198,6 +1818,37 @@ export const SYSTEM_GUIDE = [
1198
1818
  doesEn: 'The whole conversation of the chosen tasks, with every report and reply in between.',
1199
1819
  doesBg: 'Целият разговор на избраните задачи, с всички отчети и отговори помежду им.',
1200
1820
  },
1821
+ {
1822
+ key: 'export.all',
1823
+ kind: 'button',
1824
+ en: 'Select all',
1825
+ bg: 'Избери всички',
1826
+ doesEn: 'Ticks every task for the download.',
1827
+ doesBg: 'Отметва всички задачи за изтеглянето.',
1828
+ },
1829
+ {
1830
+ key: 'export.none',
1831
+ kind: 'button',
1832
+ en: 'Clear the selection',
1833
+ bg: 'Изчисти избора',
1834
+ doesEn: 'Clears the ticks.',
1835
+ doesBg: 'Маха отметките.',
1836
+ },
1837
+ ],
1838
+ },
1839
+ {
1840
+ headingKey: 'live.title',
1841
+ en: 'Live',
1842
+ bg: 'На живо',
1843
+ controls: [
1844
+ {
1845
+ key: 'live.title',
1846
+ kind: 'note',
1847
+ en: 'Live',
1848
+ bg: 'На живо',
1849
+ doesEn: 'The panel at the bottom: the session\'s events as they happen — steps, approvals, commits, warnings.',
1850
+ doesBg: 'Панелът най-долу: събитията на сесията, както стават — стъпки, одобрения, комити, предупреждения.',
1851
+ },
1201
1852
  ],
1202
1853
  },
1203
1854
  ],
@@ -1206,8 +1857,8 @@ export const SYSTEM_GUIDE = [
1206
1857
  route: '/history',
1207
1858
  nameEn: 'Task register',
1208
1859
  nameBg: 'Регистър на задачите',
1209
- purposeEn: 'Every task of every session in one place — running now, queued next, already done — with the filters, the log downloads and the one button that continues the queue.',
1210
- purposeBg: 'Всички задачи от всички сесии на едно място — какво върви сега, какво чака и какво е направено — с филтрите, изтеглянията на log-овете и единствения бутон, който продължава опашката.',
1860
+ purposeEn: 'Every task of every session in one place — running now, queued next, already done — with the filters, the downloads, and the panel that continues the queue with exactly the tasks the operator ticks. "Continue" and "Choose tasks" exist only in the "Flow" view; tell the operator to be on it first.',
1861
+ purposeBg: 'Всички задачи от всички сесии на едно място — какво върви сега, какво чака и какво е направено — с филтрите, изтеглянията и панела, който продължава опашката с точно отметнатите от оператора задачи. „Продължи“ и „Избери задачи“ има само в изгледа „Поток“; кажи на оператора първо да е на него.',
1211
1862
  sections: [
1212
1863
  {
1213
1864
  headingKey: 'reg.title',
@@ -1222,6 +1873,30 @@ export const SYSTEM_GUIDE = [
1222
1873
  doesEn: 'Reads the task list from the server at once; the page also re-reads it by itself every few seconds.',
1223
1874
  doesBg: 'Прочита списъка със задачи от сървъра веднага; страницата и без това се обновява сама на няколко секунди.',
1224
1875
  },
1876
+ {
1877
+ key: 'reg.newSession',
1878
+ kind: 'button',
1879
+ en: 'New session',
1880
+ bg: 'Нова сесия',
1881
+ doesEn: 'Goes to the "New session" form on `/`.',
1882
+ doesBg: 'Отива на формата „Нова сесия“ на `/`.',
1883
+ },
1884
+ {
1885
+ key: 'reg.newTask',
1886
+ kind: 'select',
1887
+ en: 'New task',
1888
+ bg: 'Нова задача',
1889
+ doesEn: 'With "choose a session…" open, picking a session opens that session\'s page at its "Add a task" form.',
1890
+ doesBg: 'С отворено „изберете сесия…“, изборът на сесия отваря страницата ѝ на формата „Добави задача“.',
1891
+ },
1892
+ {
1893
+ key: 'reg.newTaskPick',
1894
+ kind: 'select',
1895
+ en: 'choose a session…',
1896
+ bg: 'изберете сесия…',
1897
+ doesEn: 'The empty choice of "New task"; pick a session instead of it.',
1898
+ doesBg: 'Празният избор на „Нова задача“; изберете сесия вместо него.',
1899
+ },
1225
1900
  {
1226
1901
  key: 'reg.total',
1227
1902
  kind: 'badge',
@@ -1269,6 +1944,14 @@ export const SYSTEM_GUIDE = [
1269
1944
  en: 'Session',
1270
1945
  bg: 'Сесия',
1271
1946
  controls: [
1947
+ {
1948
+ key: 'reg.allSessions',
1949
+ kind: 'select',
1950
+ en: 'all sessions',
1951
+ bg: 'всички сесии',
1952
+ doesEn: 'The "Session" filter\'s empty choice: every session. Pick one session to narrow the page to it.',
1953
+ doesBg: 'Празният избор на филтъра „Сесия“: всички сесии. Изберете една сесия, за да свиете страницата до нея.',
1954
+ },
1272
1955
  {
1273
1956
  key: 'reg.filterStatus',
1274
1957
  kind: 'select',
@@ -1277,6 +1960,14 @@ export const SYSTEM_GUIDE = [
1277
1960
  doesEn: 'Narrows the page to the tasks in one state, using the same words as the badges.',
1278
1961
  doesBg: 'Свива страницата до задачите в едно състояние, със същите думи като етикетите.',
1279
1962
  },
1963
+ {
1964
+ key: 'reg.allStatuses',
1965
+ kind: 'select',
1966
+ en: 'all statuses',
1967
+ bg: 'всички състояния',
1968
+ doesEn: 'The "Status" filter\'s empty choice: every state.',
1969
+ doesBg: 'Празният избор на филтъра „Състояние“: всички състояния.',
1970
+ },
1280
1971
  {
1281
1972
  key: 'reg.search',
1282
1973
  kind: 'field',
@@ -1305,55 +1996,103 @@ export const SYSTEM_GUIDE = [
1305
1996
  kind: 'tab',
1306
1997
  en: 'Flow',
1307
1998
  bg: 'Поток',
1308
- doesEn: 'Shows the register as three threads: running now, what is next, what has been done.',
1309
- doesBg: 'Показва регистъра като три нишки: какво върви сега, какво следва, какво е направено.',
1999
+ doesEn: 'Shows the register as three threads — "Running now", "What is next", "What has been done" — and is the only view with "Continue", the run controls and "Choose tasks".',
2000
+ doesBg: 'Показва регистъра като три нишки — „В момента“, „Какво следва“, „Какво е направено“ — и е единственият изглед с „Продължи“, бутоните за пускането и „Избери задачи“.',
1310
2001
  },
1311
2002
  {
1312
2003
  key: 'reg.groupBy',
1313
2004
  kind: 'tab',
1314
2005
  en: 'By run',
1315
2006
  bg: 'По изпълнение',
1316
- doesEn: 'Regroups the same tasks under the run that started them, newest run first.',
1317
- doesBg: 'Прегрупира същите задачи под пускането, което ги е стартирало, най-новото отгоре.',
2007
+ doesEn: 'Groups the same tasks under the run that started them, newest first, each with its own plan · work · runner links.',
2008
+ doesBg: 'Групира същите задачи под пускането, което ги е стартирало, най-новото отгоре, всяко със свои връзки план · работа · runner.',
1318
2009
  },
1319
2010
  {
1320
2011
  key: 'reg.viewList',
1321
2012
  kind: 'tab',
1322
2013
  en: 'List',
1323
2014
  bg: 'Списък',
1324
- doesEn: 'Shows the same tasks as one table, for scanning many of them at once.',
1325
- doesBg: 'Показва същите задачи като една таблица, за да се преглеждат много наведнъж.',
2015
+ doesEn: 'Shows the same tasks as one table, for scanning many of them at once; the title opens the task.',
2016
+ doesBg: 'Показва същите задачи като една таблица, за да се преглеждат много наведнъж; заглавието отваря задачата.',
2017
+ },
2018
+ {
2019
+ key: 'reg.runGroup',
2020
+ kind: 'note',
2021
+ en: 'Started together',
2022
+ bg: 'Пуснати заедно',
2023
+ doesEn: 'In "By run": the heading above the runs.',
2024
+ doesBg: 'В „По изпълнение“: заглавието над пусканията.',
2025
+ },
2026
+ {
2027
+ key: 'reg.notInARun',
2028
+ kind: 'note',
2029
+ en: 'Not part of a run',
2030
+ bg: 'Извън изпълнение',
2031
+ doesEn: 'In "By run": the tasks that were started on their own, not as part of a run.',
2032
+ doesBg: 'В „По изпълнение“: задачите, пуснати сами, не като част от пускане.',
1326
2033
  },
1327
2034
  ],
1328
2035
  },
1329
2036
  {
1330
- headingKey: 'reg.activeNow',
1331
- en: 'Running now',
1332
- bg: 'В момента',
2037
+ headingKey: null,
2038
+ en: 'On every task row, in every view',
2039
+ bg: 'На всеки ред със задача, във всеки изглед',
1333
2040
  controls: [
2041
+ {
2042
+ key: 'reg.openTask',
2043
+ kind: 'link',
2044
+ en: 'task details',
2045
+ bg: 'детайли на задачата',
2046
+ doesEn: 'Opens that task\'s card on its session page, where it can be edited, run again or continued.',
2047
+ doesBg: 'Отваря картата на задачата на страницата на сесията ѝ, където може да се редактира, пусне отново или продължи.',
2048
+ },
2049
+ {
2050
+ key: 'home.col.chat',
2051
+ kind: 'link',
2052
+ en: 'Chat',
2053
+ bg: 'Чат',
2054
+ doesEn: 'Opens the Copilot conversation the task ran in.',
2055
+ doesBg: 'Отваря разговора в Copilot, в който е вървяла задачата.',
2056
+ },
2057
+ {
2058
+ key: 'reg.activeNow',
2059
+ kind: 'note',
2060
+ en: 'Running now',
2061
+ bg: 'В момента',
2062
+ doesEn: 'In the "Flow" view: the thread of what is running this minute.',
2063
+ doesBg: 'В изгледа „Поток“: нишката на това, което върви в момента.',
2064
+ },
1334
2065
  {
1335
2066
  key: 'save.log',
1336
2067
  kind: 'button',
1337
2068
  en: 'save the log',
1338
2069
  bg: 'запази log-а',
1339
- doesEn: "Saves the runner's log of that task's latest attempt to the Desktop and opens Explorer on it.",
2070
+ doesEn: 'Saves the runner\'s log of that task\'s latest attempt to the Desktop and opens Explorer on it.',
1340
2071
  doesBg: 'Запазва log-а на runner-а от последния опит на задачата на десктопа и отваря Explorer върху него.',
1341
2072
  },
2073
+ {
2074
+ key: 'reg.exportTitle',
2075
+ kind: 'note',
2076
+ en: 'Download as JSON',
2077
+ bg: 'Изтегли като JSON',
2078
+ doesEn: 'The words in front of the three downloads "plan", "work" and "runner" of the row (and of a run, on its heading in "By run").',
2079
+ doesBg: 'Думите пред трите изтегляния „план“, „работа“ и „runner“ на реда (и на пускане, на заглавието му в „По изпълнение“).',
2080
+ },
1342
2081
  {
1343
2082
  key: 'reg.exportPlan',
1344
2083
  kind: 'link',
1345
2084
  en: 'plan',
1346
2085
  bg: 'план',
1347
- doesEn: 'Downloads what was asked: the task in the plan format, with the edits made in the interface. Imports again.',
1348
- doesBg: 'Изтегля какво е поискано: задачата във формата на плана, с редакциите от интерфейса. Внася се отново.',
2086
+ doesEn: 'Downloads what was asked: the task in the plan format, with the edits made in the interface and its earlier attempts\' text. Imports again.',
2087
+ doesBg: 'Изтегля какво е поискано: задачата във формата на плана, с редакциите от интерфейса и текста на по-ранните опити. Внася се отново.',
1349
2088
  },
1350
2089
  {
1351
2090
  key: 'reg.exportDomain',
1352
2091
  kind: 'link',
1353
2092
  en: 'work',
1354
2093
  bg: 'работа',
1355
- doesEn: 'Downloads what happened to the work: what the chat tried, what was done, and why it did not end done.',
1356
- doesBg: 'Изтегля какво се случи с работата: какво е пробвал чатът, какво е направено и защо не е завършила готова.',
2094
+ doesEn: 'Downloads what happened to the work: what the chat tried, what was done, and why it did not end done — earlier attempts included.',
2095
+ doesBg: 'Изтегля какво се случи с работата: какво е пробвал чатът, какво е направено и защо не е завършила готова — с по-ранните опити.',
1357
2096
  },
1358
2097
  {
1359
2098
  key: 'reg.exportBot',
@@ -1368,41 +2107,192 @@ export const SYSTEM_GUIDE = [
1368
2107
  kind: 'button',
1369
2108
  en: 'What happened',
1370
2109
  bg: 'Какво се случи',
1371
- doesEn: 'Unfolds the whole story under the row, live while the task runs.',
1372
- doesBg: 'Разгъва цялата история под реда, на живо докато задачата върви.',
2110
+ doesEn: 'Unfolds the task\'s whole story under the row.',
2111
+ doesBg: 'Разгъва цялата история на задачата под реда.',
1373
2112
  },
1374
2113
  {
1375
2114
  key: 'story.showLive',
1376
2115
  kind: 'button',
1377
2116
  en: 'What is happening now',
1378
2117
  bg: 'Какво се случва в момента',
1379
- doesEn: 'The same button while the task is still running — it says this instead, and pulses. Tell the operator to watch here.',
1380
- doesBg: 'Същият бутон, докато задачата още върви — пише това и пулсира. Кажи на оператора да гледа тук.',
2118
+ doesEn: 'While the task runs: the same, live — it follows the newest entry and shows the running command like a terminal. Tell the operator to watch here.',
2119
+ doesBg: 'Докато задачата върви: същото, на живо — следва най-новото и показва текущата команда като терминал. Кажи на оператора да гледа тук.',
1381
2120
  },
1382
2121
  {
1383
- key: 'reg.pick',
2122
+ key: 'story.hide',
1384
2123
  kind: 'button',
1385
- en: 'Choose tasks',
1386
- bg: 'Избери задачи',
1387
- doesEn: 'Above the finished tasks. Puts a tick box on every task that ran, across every run, so several can be picked at once.',
1388
- doesBg: 'Над свършените задачи. Слага отметка на всяка изпълнена задача, през всички пускания, за да могат да се изберат няколко наведнъж.',
2124
+ en: 'Hide what happened',
2125
+ bg: 'Скрий какво се случи',
2126
+ doesEn: 'The same button once the story is open: folds it away again.',
2127
+ doesBg: 'Същият бутон, когато историята е отворена: сгъва я обратно.',
1389
2128
  },
1390
2129
  {
1391
- key: 'reg.bundle',
2130
+ key: 'reg.fixPrompt',
1392
2131
  kind: 'button',
1393
- en: 'Download plan, work and runner for the {n} chosen, as one file',
1394
- bg: 'Изтегли план, работа и runner за избраните {n}, в един файл',
1395
- doesEn: 'One JSON holding all three views of exactly the ticked tasks. Ask for this rather than three separate files when you want to work out why something went the way it did — and say how many tasks to tick.',
1396
- doesBg: 'Един JSON с трите изгледа на точно отметнатите задачи. Искай него вместо три отделни файла, когато трябва да се разбере защо нещо е тръгнало така — и кажи колко задачи да се отметнат.',
2132
+ en: 'Fix the prompt and queue it again',
2133
+ bg: 'Поправи prompt-а и върни в опашката',
2134
+ doesEn: 'On a row that did not end done, its session idle: rewrite the task\'s text and queue it again. It does not start it.',
2135
+ doesBg: 'На ред, който не е завършил готов, при спряна сесия: пренапишете текста на задачата и я върнете в опашката. Не я пуска.',
2136
+ },
2137
+ {
2138
+ key: 'reg.newPrompt',
2139
+ kind: 'button',
2140
+ en: 'Give it a new prompt and queue it again',
2141
+ bg: 'Нов prompt и върни в опашката',
2142
+ doesEn: 'On a row that ended done, its session idle: a new instruction for the task, built on its finished work (same branch). It does not start it.',
2143
+ doesBg: 'На ред, завършил готов, при спряна сесия: нова инструкция за задачата, върху свършената работа (същия клон). Не я пуска.',
2144
+ },
2145
+ {
2146
+ key: 'restore.button',
2147
+ kind: 'button',
2148
+ en: 'Restore',
2149
+ bg: 'Върни',
2150
+ doesEn: 'As on a task card: back to the code before this task, on a new branch. On a row that ran, when its session is idle.',
2151
+ doesBg: 'Както на картата на задача: връща кода отпреди задачата, на нов клон. На ред, който е вървял, когато сесията му стои.',
2152
+ },
2153
+ {
2154
+ key: 'restart.button',
2155
+ kind: 'button',
2156
+ en: 'Run again from here',
2157
+ bg: 'Пусни отново оттук',
2158
+ doesEn: 'As on a task card: puts the code back, queues this task and the rest of its run, and starts at once in that run\'s mode.',
2159
+ doesBg: 'Както на картата на задача: връща кода, нарежда задачата и останалото от пускането ѝ и тръгва веднага в режима на онова пускане.',
1397
2160
  },
1398
2161
  {
1399
2162
  key: 'row.info',
1400
2163
  kind: 'button',
1401
2164
  en: 'What are these?',
1402
2165
  bg: 'Какво са тези?',
1403
- doesEn: "A small round i at the end of the row. Opens a panel saying what each of the row's links gives you, and which of the three JSON files to reach for first.",
2166
+ doesEn: 'A small round i at the end of the row. Opens a panel saying what each of the row\'s links gives you, and which of the three JSON files to reach for first.',
1404
2167
  doesBg: 'Малко кръгло i в края на реда. Отваря панел, който казва какво дава всяка от връзките на реда и кой от трите JSON файла да се вземе първи.',
1405
2168
  },
2169
+ {
2170
+ key: 'reg.attempts',
2171
+ kind: 'disclosure',
2172
+ en: 'this is attempt {n} — see the {m} before it',
2173
+ bg: 'това е опит {n} — виж {m}-те преди него',
2174
+ doesEn: 'On a task run more than once: unfolds the earlier attempts, each with its status, its reason, "save this attempt\'s log" and "download plan, work and runner of this attempt".',
2175
+ doesBg: 'На задача, пускана повече от веднъж: разгъва по-ранните опити, всеки със състоянието, причината, „запази log-а на този опит“ и „изтегли план, работа и runner на този опит“.',
2176
+ },
2177
+ {
2178
+ key: 'reg.attemptsOne',
2179
+ kind: 'disclosure',
2180
+ en: 'this is attempt {n} — see the one before it',
2181
+ bg: 'това е опит {n} — виж този преди него',
2182
+ doesEn: 'The same fold when there is one earlier attempt.',
2183
+ doesBg: 'Същият сгъваем раздел, когато има един по-ранен опит.',
2184
+ },
2185
+ {
2186
+ key: 'save.attemptLog',
2187
+ kind: 'button',
2188
+ en: 'save this attempt\'s log',
2189
+ bg: 'запази log-а на този опит',
2190
+ doesEn: 'Inside the earlier attempts: saves the log of that attempt, rather than of the latest one, to the Desktop.',
2191
+ doesBg: 'В по-ранните опити: запазва на десктопа log-а на този опит, а не на последния.',
2192
+ },
2193
+ {
2194
+ key: 'save.attemptRecord',
2195
+ kind: 'button',
2196
+ en: 'download plan, work and runner of this attempt',
2197
+ bg: 'изтегли план, работа и runner на този опит',
2198
+ doesEn: 'Inside the earlier attempts: that attempt as it ran — plan, work, runner — as one file. A failed attempt also keeps them as plan.json, work.json and runner.json in its run folder.',
2199
+ doesBg: 'В по-ранните опити: този опит, както е вървял — план, работа, runner — в един файл. Провален опит ги пази и като plan.json, work.json и runner.json в папката на пускането си.',
2200
+ },
2201
+ {
2202
+ key: 'reg.stopped',
2203
+ kind: 'note',
2204
+ en: 'stopped: {reason}',
2205
+ bg: 'спряна: {reason}',
2206
+ doesEn: 'In red on the row: why that task or attempt stopped without the work being done.',
2207
+ doesBg: 'В червено на реда: защо задачата или опитът е спрял, без работата да е свършена.',
2208
+ },
2209
+ {
2210
+ key: 'reg.retriedFreshDone',
2211
+ kind: 'badge',
2212
+ en: 'blocked, then done in a fresh chat ({n}×)',
2213
+ bg: 'блокира, после готова в нов чат ({n}×)',
2214
+ doesEn: 'The task was blocked and then finished in a new conversation, so the chat was the cause, not the task.',
2215
+ doesBg: 'Задачата е блокирала и после е станала готова в нов разговор — значи чатът е бил причината, не задачата.',
2216
+ },
2217
+ {
2218
+ key: 'reg.retriedFreshStill',
2219
+ kind: 'badge',
2220
+ en: 'still blocked after {n} fresh chat(s)',
2221
+ bg: 'още блокирана след {n} нови чата',
2222
+ doesEn: 'Fresh conversations did not help, so the cause is in the task text, the checks or the machine.',
2223
+ doesBg: 'Новите разговори не са помогнали — причината е в текста на задачата, в проверките или в машината.',
2224
+ },
2225
+ ],
2226
+ },
2227
+ {
2228
+ headingKey: 'story.prompt',
2229
+ en: 'The task, as given',
2230
+ bg: 'Заданието, както е дадено',
2231
+ controls: [
2232
+ {
2233
+ key: 'story.showChat',
2234
+ kind: 'checkbox',
2235
+ en: 'the conversation',
2236
+ bg: 'разговорът',
2237
+ doesEn: 'Shows or hides the messages sent and the replies.',
2238
+ doesBg: 'Показва или скрива изпратените съобщения и отговорите.',
2239
+ },
2240
+ {
2241
+ key: 'story.showCommands',
2242
+ kind: 'checkbox',
2243
+ en: 'the commands and their output',
2244
+ bg: 'командите и изходът им',
2245
+ doesEn: 'Shows or hides the commands that ran and their output.',
2246
+ doesBg: 'Показва или скрива изпълнените команди и изхода им.',
2247
+ },
2248
+ {
2249
+ key: 'story.live',
2250
+ kind: 'badge',
2251
+ en: 'live',
2252
+ bg: 'на живо',
2253
+ doesEn: 'Pulsing while the task runs. The list then stays at the newest entry, and the running command is shown open with its output following its last line, like a terminal.',
2254
+ doesBg: 'Пулсира, докато задачата върви. Списъкът тогава стои на най-новото, а текущата команда е отворена и изходът ѝ следва последния ред, като терминал.',
2255
+ },
2256
+ {
2257
+ key: 'story.follow',
2258
+ kind: 'button',
2259
+ en: '↓ follow the newest',
2260
+ bg: '↓ следвай най-новото',
2261
+ doesEn: 'Appears when the operator scrolled up in a live story: goes back to the newest line and follows it again.',
2262
+ doesBg: 'Появява се, когато операторът е превъртял нагоре в история на живо: връща на най-новия ред и следва отново.',
2263
+ },
2264
+ {
2265
+ key: 'story.showOutput',
2266
+ kind: 'button',
2267
+ en: 'show output ({n} chars)',
2268
+ bg: 'покажи изхода ({n} знака)',
2269
+ doesEn: 'Under a command: unfolds its output (the end of it, for a very long one).',
2270
+ doesBg: 'Под команда: разгъва изхода ѝ (края му, ако е много дълъг).',
2271
+ },
2272
+ {
2273
+ key: 'story.hideOutput',
2274
+ kind: 'button',
2275
+ en: 'hide output',
2276
+ bg: 'скрий изхода',
2277
+ doesEn: 'Folds that output away again.',
2278
+ doesBg: 'Сгъва този изход обратно.',
2279
+ },
2280
+ {
2281
+ key: 'story.showText',
2282
+ kind: 'button',
2283
+ en: 'show text ({n} chars)',
2284
+ bg: 'покажи текста ({n} знака)',
2285
+ doesEn: 'Under a message or a reply: unfolds its full text.',
2286
+ doesBg: 'Под съобщение или отговор: разгъва пълния текст.',
2287
+ },
2288
+ {
2289
+ key: 'story.hideText',
2290
+ kind: 'button',
2291
+ en: 'hide text',
2292
+ bg: 'скрий текста',
2293
+ doesEn: 'Folds that text away again.',
2294
+ doesBg: 'Сгъва този текст обратно.',
2295
+ },
1406
2296
  ],
1407
2297
  },
1408
2298
  {
@@ -1410,53 +2300,125 @@ export const SYSTEM_GUIDE = [
1410
2300
  en: 'What is next',
1411
2301
  bg: 'Какво следва',
1412
2302
  controls: [
2303
+ {
2304
+ key: 'batch.pause',
2305
+ kind: 'button',
2306
+ en: 'Pause after this task',
2307
+ bg: 'Пауза след тази задача',
2308
+ doesEn: 'As on `/`: holds the run after the task in flight finishes properly. Press it first after a failure you want to think about.',
2309
+ doesBg: 'Както на `/`: задържа пускането, след като текущата задача приключи както трябва. Натиснете го първо след провал, над който искате да помислите.',
2310
+ },
2311
+ {
2312
+ key: 'batch.resume',
2313
+ kind: 'button',
2314
+ en: 'Take the hold off',
2315
+ bg: 'Махни паузата',
2316
+ doesEn: 'As on `/`: the queue carries on.',
2317
+ doesBg: 'Както на `/`: опашката продължава.',
2318
+ },
2319
+ {
2320
+ key: 'batch.stop',
2321
+ kind: 'button',
2322
+ en: 'Stop after the current step',
2323
+ bg: 'Спри след текущата стъпка',
2324
+ doesEn: 'As on `/`: stops after the current step; the task in flight ends aborted.',
2325
+ doesBg: 'Както на `/`: спира след текущата стъпка; текущата задача завършва прекратена.',
2326
+ },
1413
2327
  {
1414
2328
  key: 'reg.continue',
1415
2329
  kind: 'button',
1416
2330
  en: 'Continue: run the {n} queued task(s) in {s} session(s)',
1417
2331
  bg: 'Продължи: пусни {n} чакащи задачи в {s} сесии',
1418
- doesEn: 'Opens a panel listing exactly which queued tasks in which sessions would be started. It starts nothing yet.',
1419
- doesBg: 'Отваря панел, който изброява точно кои чакащи задачи в кои сесии ще тръгнат. Още нищо не пуска.',
2332
+ doesEn: 'Opens the "Before it continues" panel. It starts nothing yet.',
2333
+ doesBg: 'Отваря панела „Преди да продължи“. Още нищо не пуска.',
1420
2334
  },
1421
2335
  {
1422
2336
  key: 'reg.continueWithFailed',
1423
2337
  kind: 'button',
1424
2338
  en: 'Continue: run {f} failed and {n} queued task(s) in {s} session(s)',
1425
2339
  bg: 'Продължи: пусни {f} провалили се и {n} чакащи задачи в {s} сесии',
1426
- doesEn: 'The same button when a failed task would go back into the queue alongside the queued ones.',
1427
- doesBg: 'Същият бутон, когато провалена задача се връща в опашката заедно с чакащите.',
2340
+ doesEn: 'The same button when a failed task of a chained session would go back into the queue with the queued ones.',
2341
+ doesBg: 'Същият бутон, когато провалена задача от сесия-верига би се върнала в опашката заедно с чакащите.',
1428
2342
  },
1429
2343
  {
1430
2344
  key: 'reg.continuePanelTitle',
1431
2345
  kind: 'note',
1432
2346
  en: 'Before it continues',
1433
2347
  bg: 'Преди да продължи',
1434
- doesEn: 'The heading of that panel; the two start buttons and the tick boxes are inside it.',
1435
- doesBg: 'Заглавието на този панел; двата бутона за старт и отметките са в него.',
2348
+ doesEn: 'The panel\'s heading. Every candidate has a tick box — failed tasks of chains, failed independent ones, the queued — all ticked at first; the run takes exactly the ticked, the rest stay where they are.',
2349
+ doesBg: 'Заглавието на панела. Всеки кандидат има отметка — провалени от вериги, провалени независими, чакащите — отначало всички отметнати; пускането взима точно отметнатите, останалите остават, където са.',
2350
+ },
2351
+ {
2352
+ key: 'reg.pickOnly',
2353
+ kind: 'button',
2354
+ en: 'only this one',
2355
+ bg: 'само тази',
2356
+ doesEn: 'Beside each task in that panel: unticks everything else, so the run takes this task alone — the way to run only the task whose prompt was just fixed.',
2357
+ doesBg: 'До всяка задача в панела: маха отметките от всички други, така че пускането взима само нея — начинът да се пусне само задачата, чийто prompt току-що е поправен.',
2358
+ },
2359
+ {
2360
+ key: 'reg.pickAll',
2361
+ kind: 'button',
2362
+ en: 'All of them',
2363
+ bg: 'Всички',
2364
+ doesEn: 'In that panel: ticks every task.',
2365
+ doesBg: 'В панела: отметва всички задачи.',
2366
+ },
2367
+ {
2368
+ key: 'reg.pickNone',
2369
+ kind: 'button',
2370
+ en: 'None',
2371
+ bg: 'Нито една',
2372
+ doesEn: 'In that panel: unticks every task (the start buttons then do nothing until one is ticked).',
2373
+ doesBg: 'В панела: маха всички отметки (бутоните за пускане тогава не действат, докато не се отметне поне една).',
2374
+ },
2375
+ {
2376
+ key: 'reg.fixPrompt',
2377
+ kind: 'button',
2378
+ en: 'Fix the prompt and queue it again',
2379
+ bg: 'Поправи prompt-а и върни в опашката',
2380
+ doesEn: 'Beside a failed task in that panel: rewrite its text first; it comes back ticked and queued.',
2381
+ doesBg: 'До провалена задача в панела: първо пренапишете текста ѝ; тя се връща отметната и в опашката.',
2382
+ },
2383
+ {
2384
+ key: 'reg.continueGap',
2385
+ kind: 'note',
2386
+ en: '“{task}” ({session}) is part of a chain and runs without “{before}”, which comes before it. Run it alone only if it does not need that task’s work.',
2387
+ bg: '„{task}“ ({session}) е част от верига и тръгва без „{before}“, която е преди нея. Пуснете я сама, само ако не ѝ трябва работата на онази задача.',
2388
+ doesEn: 'Said in that panel when a ticked task of a chain runs without an earlier task of its session. A warning, not a refusal.',
2389
+ doesBg: 'Казва се в панела, когато отметната задача от верига тръгва без по-ранна задача от сесията си. Предупреждение, не отказ.',
2390
+ },
2391
+ {
2392
+ key: 'batch.runName',
2393
+ kind: 'field',
2394
+ en: 'Name of this run',
2395
+ bg: 'Име на това пускане',
2396
+ doesEn: 'In that panel: the name of this run, suggested; the register groups by it and the downloads are named after it.',
2397
+ doesBg: 'В панела: името на това пускане, предложено; регистърът групира по него и изтеглянията се именуват по него.',
1436
2398
  },
1437
2399
  {
1438
2400
  key: 'reg.continueUnattended',
1439
2401
  kind: 'button',
1440
2402
  en: 'Continue without asking',
1441
2403
  bg: 'Продължи без да пита',
1442
- doesEn: 'Starts the listed sessions and runs every command without asking again; it confirms once first.',
1443
- doesBg: 'Пуска изброените сесии и изпълнява всяка команда без повече питане; първо иска едно потвърждение.',
2404
+ doesEn: 'Starts exactly the ticked tasks and runs every command without asking (asks "are you sure" first unless Settings say otherwise). Ticked failed tasks start afresh.',
2405
+ doesBg: 'Пуска точно отметнатите задачи и изпълнява всяка команда без питане (първо пита „сигурен ли си“, освен ако Настройките казват друго). Отметнатите провалени задачи тръгват отначало.',
1444
2406
  },
1445
2407
  {
1446
2408
  key: 'reg.continueGo',
1447
2409
  kind: 'button',
1448
2410
  en: 'Continue, asking before each command',
1449
2411
  bg: 'Продължи, с питане преди всяка команда',
1450
- doesEn: 'Starts the same sessions but stops for approval before every command.',
1451
- doesBg: 'Пуска същите сесии, но спира за одобрение преди всяка команда.',
2412
+ doesEn: 'Starts exactly the ticked tasks but stops for approval before every command.',
2413
+ doesBg: 'Пуска точно отметнатите задачи, но спира за одобрение преди всяка команда.',
1452
2414
  },
1453
2415
  {
1454
- key: 'reg.fixPrompt',
2416
+ key: 'dialog.cancel',
1455
2417
  kind: 'button',
1456
- en: 'Fix the prompt and queue it again',
1457
- bg: 'Поправи prompt-а и върни в опашката',
1458
- doesEn: "Opens the failed task's text alone for rewriting, before it goes back into the queue.",
1459
- doesBg: 'Отваря само текста на провалената задача за пренаписване, преди тя да се върне в опашката.',
2418
+ en: 'Cancel',
2419
+ bg: 'Отказ',
2420
+ doesEn: 'Closes the panel without starting anything.',
2421
+ doesBg: 'Затваря панела, без да пуска нищо.',
1460
2422
  },
1461
2423
  ],
1462
2424
  },
@@ -1466,44 +2428,28 @@ export const SYSTEM_GUIDE = [
1466
2428
  bg: 'Какво е направено',
1467
2429
  controls: [
1468
2430
  {
1469
- key: 'reg.stopped',
1470
- kind: 'note',
1471
- en: 'stopped: {reason}',
1472
- bg: 'спряна: {reason}',
1473
- doesEn: 'In red on the row: why that task or attempt stopped without the work being done.',
1474
- doesBg: 'В червено на реда: защо задачата или опитът е спрял, без работата да е свършена.',
1475
- },
1476
- {
1477
- key: 'save.attemptLog',
2431
+ key: 'reg.pick',
1478
2432
  kind: 'button',
1479
- en: "save this attempt's log",
1480
- bg: 'запази log-а на този опит',
1481
- doesEn: 'Saves the log of one earlier attempt, rather than of the latest one, to the Desktop.',
1482
- doesBg: 'Запазва на десктопа log-а на конкретен по-ранен опит, а не на последния.',
2433
+ en: 'Choose tasks',
2434
+ bg: 'Избери задачи',
2435
+ doesEn: 'Above the finished tasks, in the "Flow" view. Puts a tick box on every task that ran, across every run, so several can be picked at once.',
2436
+ doesBg: 'Над свършените задачи, в изгледа „Поток“. Слага отметка на всяка изпълнена задача, през всички пускания, за да могат да се изберат няколко наведнъж.',
1483
2437
  },
1484
2438
  {
1485
- key: 'save.attemptRecord',
2439
+ key: 'reg.bundle',
1486
2440
  kind: 'button',
1487
- en: 'download plan, work and runner of this attempt',
1488
- bg: 'изтегли план, работа и runner на този опит',
1489
- doesEn: 'Downloads one earlier attempt as it ran — the plan it was given, what happened to the work, what the runner did — as one file, even if the task was edited since. An attempt that did not end done also keeps the three as plan.json, work.json and runner.json in its run folder.',
1490
- doesBg: 'Изтегля един по-ранен опит, както е вървял — планът, който е получил, какво е станало с работата, какво е направил runner-ът — в един файл, дори ако задачата е редактирана след това. Опит, който не е завършил готов, пази трите и като plan.json, work.json и runner.json в папката на пускането си.',
1491
- },
1492
- {
1493
- key: 'reg.retriedFreshDone',
1494
- kind: 'badge',
1495
- en: 'blocked, then done in a fresh chat ({n}×)',
1496
- bg: 'блокира, после готова в нов чат ({n}×)',
1497
- doesEn: 'The task was blocked and then finished in a new conversation, so the chat was the cause, not the task.',
1498
- doesBg: 'Задачата е блокирала и после е станала готова в нов разговор — значи чатът е бил причината, не задачата.',
2441
+ en: 'Download plan, work and runner for the {n} chosen, as one file',
2442
+ bg: 'Изтегли план, работа и runner за избраните {n}, в един файл',
2443
+ doesEn: 'Once something is ticked: one JSON with all three views of exactly the ticked tasks — the file to ask for when working out why something went as it did. Say how many to tick.',
2444
+ doesBg: 'Щом има отметнато: един JSON с трите изгледа на точно отметнатите задачи — файлът, който се иска, когато се търси защо нещо е тръгнало така. Кажи колко да се отметнат.',
1499
2445
  },
1500
2446
  {
1501
- key: 'reg.retriedFreshStill',
1502
- kind: 'badge',
1503
- en: 'still blocked after {n} fresh chat(s)',
1504
- bg: 'още блокирана след {n} нови чата',
1505
- doesEn: 'Fresh conversations did not help, so the cause is in the task text, the checks or the machine.',
1506
- doesBg: 'Новите разговори не са помогнали — причината е в текста на задачата, в проверките или в машината.',
2447
+ key: 'reg.pickDone',
2448
+ kind: 'button',
2449
+ en: 'Done choosing',
2450
+ bg: 'Готово с избора',
2451
+ doesEn: 'Leaves the choosing mode and clears the ticks.',
2452
+ doesBg: 'Излиза от режима на избор и маха отметките.',
1507
2453
  },
1508
2454
  ],
1509
2455
  },
@@ -1517,8 +2463,16 @@ export const SYSTEM_GUIDE = [
1517
2463
  kind: 'button',
1518
2464
  en: 'Save and queue again',
1519
2465
  bg: 'Запази и върни в опашката',
1520
- doesEn: 'Saves the rewritten task text and puts the task back into its queue with it. Level 2, the checks and the git names are untouched.',
1521
- doesBg: 'Запазва пренаписания текст и връща задачата в опашката с него. Ниво 2, проверките и git имената остават каквито са.',
2466
+ doesEn: 'Saves the rewritten task text and puts the task back into its queue with it; the failed attempt stays on its record. Level 2, the checks and the git names are untouched. Then "Continue" with "only this one" runs it alone.',
2467
+ doesBg: 'Запазва пренаписания текст и връща задачата в опашката с него; провалилият се опит остава в историята ѝ. Ниво 2, проверките и git имената остават каквито са. После „Продължи“ със „само тази“ я пуска сама.',
2468
+ },
2469
+ {
2470
+ key: 'dialog.cancel',
2471
+ kind: 'button',
2472
+ en: 'Cancel',
2473
+ bg: 'Отказ',
2474
+ doesEn: 'Closes the box and changes nothing.',
2475
+ doesBg: 'Затваря прозореца и не променя нищо.',
1522
2476
  },
1523
2477
  ],
1524
2478
  },
@@ -1536,6 +2490,22 @@ export const SYSTEM_GUIDE = [
1536
2490
  en: 'The project you are working on',
1537
2491
  bg: 'Проектът, по който се работи',
1538
2492
  controls: [
2493
+ {
2494
+ key: 'def.title',
2495
+ kind: 'note',
2496
+ en: 'What every new session starts with',
2497
+ bg: 'С какво тръгва всяка нова сесия',
2498
+ doesEn: 'The page\'s top heading.',
2499
+ doesBg: 'Горното заглавие на страницата.',
2500
+ },
2501
+ {
2502
+ key: 'def.saveAnyway',
2503
+ kind: 'button',
2504
+ en: 'Save',
2505
+ bg: 'Запази',
2506
+ doesEn: 'Under each block: does nothing new — everything on this page saves itself; it is there for those who look for one.',
2507
+ doesBg: 'Под всеки блок: не прави нищо ново — всичко на страницата се записва само; стои там за тези, които го търсят.',
2508
+ },
1539
2509
  {
1540
2510
  key: 'def.autoSave',
1541
2511
  kind: 'note',
@@ -1584,6 +2554,22 @@ export const SYSTEM_GUIDE = [
1584
2554
  doesEn: 'Copies every project on this page to its own Desktop folder before each run, which is how the files reach the chat.',
1585
2555
  doesBg: 'Копира всеки проект от тази страница в собствена папка на Desktop-а преди всяко пускане — така файловете стигат до чата.',
1586
2556
  },
2557
+ {
2558
+ key: 'proj.folders',
2559
+ kind: 'disclosure',
2560
+ en: 'Folders that go to the Desktop',
2561
+ bg: 'Папки, които отиват на Desktop-а',
2562
+ doesEn: 'On each project: which of its folders go to the Desktop copy — the same include and exclude lists and folder tree as on a session page.',
2563
+ doesBg: 'На всеки проект: кои папки отиват в копието на Desktop-а — същите списъци за включване и изключване и дърво с папки като на страницата на сесия.',
2564
+ },
2565
+ {
2566
+ key: 'proj.affects',
2567
+ kind: 'note',
2568
+ en: 'What this changes, and what it does not',
2569
+ bg: 'Какво променя това и какво не',
2570
+ doesEn: 'Says what changing the project folder changes (new sessions) and what it does not (sessions that exist).',
2571
+ doesBg: 'Казва какво променя смяната на папката на проекта (новите сесии) и какво не (съществуващите).',
2572
+ },
1587
2573
  ],
1588
2574
  },
1589
2575
  {
@@ -1615,6 +2601,30 @@ export const SYSTEM_GUIDE = [
1615
2601
  doesEn: 'Saves the typed name and folder as another project; it stays dead until both boxes are filled.',
1616
2602
  doesBg: 'Запазва въведените име и папка като още един проект; неактивен е, докато и двете полета не са попълнени.',
1617
2603
  },
2604
+ {
2605
+ key: 'proj.otherRemove',
2606
+ kind: 'button',
2607
+ en: 'Remove',
2608
+ bg: 'Махни',
2609
+ doesEn: 'On an extra project: removes it from the list (nothing on disk is touched).',
2610
+ doesBg: 'На допълнителен проект: маха го от списъка (нищо на диска не се пипа).',
2611
+ },
2612
+ {
2613
+ key: 'proj.toSessions',
2614
+ kind: 'button',
2615
+ en: 'To the sessions',
2616
+ bg: 'Към сесиите',
2617
+ doesEn: 'Goes to the sessions list on `/`.',
2618
+ doesBg: 'Отива на списъка със сесии на `/`.',
2619
+ },
2620
+ {
2621
+ key: 'proj.toImport',
2622
+ kind: 'button',
2623
+ en: 'To the plan import',
2624
+ bg: 'Към внасянето на план',
2625
+ doesEn: 'Goes to the plan import on `/import`.',
2626
+ doesBg: 'Отива на внасянето на план на `/import`.',
2627
+ },
1618
2628
  ],
1619
2629
  },
1620
2630
  {
@@ -1702,27 +2712,107 @@ export const SYSTEM_GUIDE = [
1702
2712
  },
1703
2713
  {
1704
2714
  key: 'exec.isolation',
1705
- kind: 'field',
2715
+ kind: 'select',
1706
2716
  en: 'Where the bot runs',
1707
2717
  bg: 'Къде върви ботът',
1708
- doesEn: "The operator's statement about what contains this runner: this account, a separate low-privilege Windows account, Windows Sandbox, or a VM. It gates unattended runs — while it says this account, a run with nobody watching is refused, unless the operator chose \"this account — I accept unattended runs without isolation\", which allows it on their responsibility — and it is recorded with every run beside the account the process actually held.",
1709
- doesBg: 'Твърдението на оператора какво огражда този runner: този акаунт, отделен Windows акаунт с малки права, Windows Sandbox или виртуална машина. То управлява пусканията без надзор — докато казва „този акаунт“, пускане без човек се отказва, освен ако операторът не е избрал „в този акаунт — приемам пускане без надзор без изолация“, което го позволява на негова отговорност — и се записва с всяко пускане до акаунта, който процесът наистина е държал.',
2718
+ doesEn: 'What contains this runner, as the operator says. With "Nowhere in particular — this account" unattended runs are refused; "This account — I accept unattended runs without isolation" allows them on the operator\'s responsibility.',
2719
+ doesBg: 'Какво огражда този runner, по думите на оператора. С „Никъде специално — в този акаунт“ пусканията без надзор се отказват; „В този акаунт — приемам пускане без надзор без изолация“ ги позволява на отговорност на оператора.',
2720
+ },
2721
+ {
2722
+ key: 'exec.isolationNone',
2723
+ kind: 'select',
2724
+ en: 'Nowhere in particular — this account',
2725
+ bg: 'Никъде специално — в този акаунт',
2726
+ doesEn: 'The default: no unattended runs.',
2727
+ doesBg: 'По подразбиране: без пускания без надзор.',
2728
+ },
2729
+ {
2730
+ key: 'exec.isolationNoneAccepted',
2731
+ kind: 'select',
2732
+ en: 'This account — I accept unattended runs without isolation',
2733
+ bg: 'В този акаунт — приемам пускане без надзор без изолация',
2734
+ doesEn: 'Unattended runs allowed in this account, on the operator\'s responsibility.',
2735
+ doesBg: 'Пусканията без надзор са позволени в този акаунт, на отговорност на оператора.',
2736
+ },
2737
+ {
2738
+ key: 'exec.isolationAccount',
2739
+ kind: 'select',
2740
+ en: 'A separate low-privilege Windows account',
2741
+ bg: 'Отделен Windows акаунт с малки права',
2742
+ doesEn: 'The bot runs as a separate low-privilege account.',
2743
+ doesBg: 'Ботът върви като отделен акаунт с малки права.',
2744
+ },
2745
+ {
2746
+ key: 'exec.isolationSandbox',
2747
+ kind: 'select',
2748
+ en: 'Windows Sandbox',
2749
+ bg: 'Windows Sandbox',
2750
+ doesEn: 'The bot runs in Windows Sandbox.',
2751
+ doesBg: 'Ботът върви в Windows Sandbox.',
2752
+ },
2753
+ {
2754
+ key: 'exec.isolationVm',
2755
+ kind: 'select',
2756
+ en: 'A virtual machine',
2757
+ bg: 'Виртуална машина',
2758
+ doesEn: 'The bot runs in a virtual machine.',
2759
+ doesBg: 'Ботът върви във виртуална машина.',
1710
2760
  },
1711
2761
  {
1712
2762
  key: 'exec.startMode',
1713
2763
  kind: 'select',
1714
2764
  en: 'Starting a run without supervision',
1715
2765
  bg: 'Пускане без надзор',
1716
- doesEn: 'Whether the run buttons that work through the queue on their own ask "are you sure" first ("Ask \"are you sure\" every time", the default) or simply start ("Start it without asking"). Step by step stays available beside them either way.',
1717
- doesBg: 'Дали бутоните, които минават през опашката сами, питат първо „сигурен ли си“ („Питай „сигурен ли си“ всеки път“, по подразбиране) или просто тръгват („Пускай, без да питаш“). „Стъпка по стъпка“ остава до тях и в двата случая.',
2766
+ doesEn: 'Whether the unattended run buttons ask "are you sure" first or simply start. Step by step stays beside them.',
2767
+ doesBg: 'Дали бутоните за пускане без надзор първо питат „сигурен ли си“ или просто тръгват. „Стъпка по стъпка“ остава до тях.',
2768
+ },
2769
+ {
2770
+ key: 'exec.startModeAsk',
2771
+ kind: 'select',
2772
+ en: 'Ask "are you sure" every time',
2773
+ bg: 'Питай „сигурен ли си“ всеки път',
2774
+ doesEn: 'The default: every unattended start asks "are you sure" first.',
2775
+ doesBg: 'По подразбиране: всяко пускане без надзор първо пита „сигурен ли си“.',
2776
+ },
2777
+ {
2778
+ key: 'exec.startModeAuto',
2779
+ kind: 'select',
2780
+ en: 'Start it without asking',
2781
+ bg: 'Пускай, без да питаш',
2782
+ doesEn: 'Unattended starts go at once, without the question.',
2783
+ doesBg: 'Пусканията без надзор тръгват веднага, без въпроса.',
1718
2784
  },
1719
2785
  {
1720
2786
  key: 'exec.networkFetch',
1721
2787
  kind: 'select',
1722
2788
  en: 'A command that downloads, in a run without supervision',
1723
2789
  bg: 'Команда, която тегли от интернет, при пускане без надзор',
1724
- doesEn: 'What a run without supervision does with Invoke-WebRequest, curl, wget and the like: wait for the operator on the approval screen (the default), refuse it and tell the chat why so the run never waits, or run it without anyone reading it. Recorded in every task. A step-by-step run shows every command whatever is chosen.',
1725
- doesBg: 'Какво прави пускане без надзор с Invoke-WebRequest, curl, wget и подобни: чака оператора на екрана за одобрение (по подразбиране), отказва я и казва на чата защо, така че пускането никога не чака, или я изпълнява, без никой да я е прочел. Записва се във всяка задача. При „стъпка по стъпка“ всяка команда се показва, каквото и да е избрано.',
2790
+ doesEn: 'What a run without supervision does with Invoke-WebRequest, curl and the like: wait for the operator, refuse it back to the chat, or run it unread. Step by step shows every command anyway.',
2791
+ doesBg: 'Какво прави пускане без надзор с Invoke-WebRequest, curl и подобни: чака оператора, отказва я обратно на чата или я изпълнява непрочетена. Стъпка по стъпка така или иначе показва всяка команда.',
2792
+ },
2793
+ {
2794
+ key: 'exec.networkFetchAsk',
2795
+ kind: 'select',
2796
+ en: 'Wait for me on the approval screen',
2797
+ bg: 'Чакай ме на екрана за одобрение',
2798
+ doesEn: 'The default: a downloading command waits on the approval banner even in a run without supervision.',
2799
+ doesBg: 'По подразбиране: команда, която тегли, чака в лентата за одобрение дори при пускане без надзор.',
2800
+ },
2801
+ {
2802
+ key: 'exec.networkFetchRefuse',
2803
+ kind: 'select',
2804
+ en: 'Refuse it and tell the chat why — the run never waits',
2805
+ bg: 'Откажи я и кажи на чата защо — пускането никога не чака',
2806
+ doesEn: 'It is refused and the chat is told why and what to do instead; the run never waits.',
2807
+ doesBg: 'Отказва се и чатът научава защо и какво да направи вместо това; пускането никога не чака.',
2808
+ },
2809
+ {
2810
+ key: 'exec.networkFetchRun',
2811
+ kind: 'select',
2812
+ en: 'Run it without asking',
2813
+ bg: 'Изпълни я, без да питаш',
2814
+ doesEn: 'It runs without anyone reading it. Only on a machine where that is acceptable.',
2815
+ doesBg: 'Изпълнява се, без някой да я е прочел. Само на машина, където това е приемливо.',
1726
2816
  },
1727
2817
  ],
1728
2818
  },
@@ -1827,6 +2917,14 @@ export const SYSTEM_GUIDE = [
1827
2917
  doesEn: 'Removes that preset from the list for good, after a confirmation.',
1828
2918
  doesBg: 'Маха шаблона от списъка завинаги, след потвърждение.',
1829
2919
  },
2920
+ {
2921
+ key: 'presets.show',
2922
+ kind: 'disclosure',
2923
+ en: 'show',
2924
+ bg: 'покажи',
2925
+ doesEn: 'On a saved preset: unfolds its text.',
2926
+ doesBg: 'На запазен шаблон: разгъва текста му.',
2927
+ },
1830
2928
  ],
1831
2929
  },
1832
2930
  ],
@@ -1843,6 +2941,14 @@ export const SYSTEM_GUIDE = [
1843
2941
  en: 'Appearance',
1844
2942
  bg: 'Изглед',
1845
2943
  controls: [
2944
+ {
2945
+ key: 'ap.theme',
2946
+ kind: 'note',
2947
+ en: 'Theme',
2948
+ bg: 'Тема',
2949
+ doesEn: 'The heading above the two theme buttons.',
2950
+ doesBg: 'Заглавието над двата бутона за тема.',
2951
+ },
1846
2952
  {
1847
2953
  key: 'theme.light',
1848
2954
  kind: 'radio',
@@ -1861,6 +2967,84 @@ export const SYSTEM_GUIDE = [
1861
2967
  },
1862
2968
  ],
1863
2969
  },
2970
+ {
2971
+ headingKey: 'ap.size',
2972
+ en: 'Text size',
2973
+ bg: 'Размер на текста',
2974
+ controls: [
2975
+ {
2976
+ key: 'ap.sizeNormal',
2977
+ kind: 'button',
2978
+ en: 'Normal',
2979
+ bg: 'Нормален',
2980
+ doesEn: 'Normal text size.',
2981
+ doesBg: 'Нормален размер на текста.',
2982
+ },
2983
+ {
2984
+ key: 'ap.sizeLarge',
2985
+ kind: 'button',
2986
+ en: 'Large',
2987
+ bg: 'Голям',
2988
+ doesEn: 'Larger text.',
2989
+ doesBg: 'По-голям текст.',
2990
+ },
2991
+ {
2992
+ key: 'ap.sizeHuge',
2993
+ kind: 'button',
2994
+ en: 'Largest',
2995
+ bg: 'Най-голям',
2996
+ doesEn: 'The largest text.',
2997
+ doesBg: 'Най-големият текст.',
2998
+ },
2999
+ ],
3000
+ },
3001
+ {
3002
+ headingKey: 'ap.a11y',
3003
+ en: 'Accessibility',
3004
+ bg: 'Достъпност',
3005
+ controls: [
3006
+ {
3007
+ key: 'ap.contrast',
3008
+ kind: 'checkbox',
3009
+ en: 'Higher contrast',
3010
+ bg: 'По-висок контраст',
3011
+ doesEn: 'Stronger colours and borders.',
3012
+ doesBg: 'По-силни цветове и рамки.',
3013
+ },
3014
+ {
3015
+ key: 'ap.motion',
3016
+ kind: 'checkbox',
3017
+ en: 'Less motion',
3018
+ bg: 'По-малко движение',
3019
+ doesEn: 'Turns off animations such as the pulsing live dot.',
3020
+ doesBg: 'Изключва анимациите, например пулсиращата точка на живо.',
3021
+ },
3022
+ {
3023
+ key: 'ap.links',
3024
+ kind: 'checkbox',
3025
+ en: 'Underline every link',
3026
+ bg: 'Подчертавай всички връзки',
3027
+ doesEn: 'Underlines every link.',
3028
+ doesBg: 'Подчертава всяка връзка.',
3029
+ },
3030
+ {
3031
+ key: 'ap.focus',
3032
+ kind: 'checkbox',
3033
+ en: 'Thick focus outline',
3034
+ bg: 'Дебел фокусен контур',
3035
+ doesEn: 'A thick outline around whatever has the keyboard focus.',
3036
+ doesBg: 'Дебел контур около това, което е на фокус от клавиатурата.',
3037
+ },
3038
+ {
3039
+ key: 'ap.reset',
3040
+ kind: 'button',
3041
+ en: 'Back to the defaults',
3042
+ bg: 'Върни настройките по подразбиране',
3043
+ doesEn: 'Puts every appearance setting back.',
3044
+ doesBg: 'Връща всички настройки на външния вид.',
3045
+ },
3046
+ ],
3047
+ },
1864
3048
  ],
1865
3049
  },
1866
3050
  {
@@ -1875,6 +3059,22 @@ export const SYSTEM_GUIDE = [
1875
3059
  en: 'This machine',
1876
3060
  bg: 'Тази машина',
1877
3061
  controls: [
3062
+ {
3063
+ key: 'sys.signin',
3064
+ kind: 'note',
3065
+ en: 'Sign-in',
3066
+ bg: 'Вписване',
3067
+ doesEn: 'The block about the bot\'s browser profile and its sign-in.',
3068
+ doesBg: 'Блокът за профила на браузъра на бота и вписването в него.',
3069
+ },
3070
+ {
3071
+ key: 'sys.settings',
3072
+ kind: 'note',
3073
+ en: 'Settings',
3074
+ bg: 'Настройки',
3075
+ doesEn: 'The block showing the settings as saved and the paths they resolve to.',
3076
+ doesBg: 'Блокът с настройките, както са запазени, и пътищата, до които водят.',
3077
+ },
1878
3078
  {
1879
3079
  key: 'sys.profileHeld',
1880
3080
  kind: 'note',
@@ -1883,6 +3083,30 @@ export const SYSTEM_GUIDE = [
1883
3083
  doesEn: 'The line to look for when a run will not start: a stray Edge window has the profile open.',
1884
3084
  doesBg: 'Редът, който се търси, когато пускане не тръгва: чужд прозорец на Edge държи профила отворен.',
1885
3085
  },
3086
+ {
3087
+ key: 'sys.profileMissing',
3088
+ kind: 'note',
3089
+ en: '(not created yet: run cop login)',
3090
+ bg: '(още не е създаден: пуснете cop login)',
3091
+ doesEn: 'The bot\'s browser profile does not exist yet: the operator has to run "cop login" once.',
3092
+ doesBg: 'Профилът на браузъра на бота още не съществува: операторът трябва веднъж да пусне „cop login“.',
3093
+ },
3094
+ {
3095
+ key: 'sys.profileBot',
3096
+ kind: 'note',
3097
+ en: 'In use by the bot\'s own run right now ({n} Edge process(es)). That is expected while a session runs.',
3098
+ bg: 'В момента се ползва от собственото изпълнение на бота ({n} процеса на Edge). Това е очаквано, докато сесия работи.',
3099
+ doesEn: 'The profile is held by the bot\'s own run right now — nothing to close.',
3100
+ doesBg: 'Профилът в момента се държи от собственото пускане на бота — няма какво да се затваря.',
3101
+ },
3102
+ {
3103
+ key: 'sys.profileFree',
3104
+ kind: 'note',
3105
+ en: 'free',
3106
+ bg: 'свободен',
3107
+ doesEn: 'Nothing holds the profile; a run can start.',
3108
+ doesBg: 'Нищо не държи профила; пускане може да тръгне.',
3109
+ },
1886
3110
  ],
1887
3111
  },
1888
3112
  ],