copilot-operator 0.1.5 → 0.1.7
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.
- package/dist/src/api/operator.controller.js +37 -2
- package/dist/src/api/operator.service.js +110 -14
- package/dist/src/orchestrator/taskRunner.js +11 -1
- package/dist/src/plan/brief.js +52 -10
- package/dist/src/plan/script.js +13 -0
- package/dist/src/plan/systemGuide.js +1471 -190
- package/dist/src/session/compose.js +5 -1
- package/dist/src/session/exports.js +1 -0
- package/dist/src/session/store.js +4 -1
- package/dist/src/session/story.js +10 -1
- package/dist/src/vcs/git.js +71 -0
- package/dist/src/vcs/taskVcs.js +2 -1
- package/dist/web/404.html +2 -2
- package/dist/web/_next/static/chunks/549-33f0d3d53338b2f2.js +1 -0
- package/dist/web/_next/static/chunks/723-edc7b5709e5407ec.js +1 -0
- package/dist/web/_next/static/chunks/867-4aa80f5a32311bce.js +1 -0
- package/dist/web/_next/static/chunks/app/history/page-2251664c0abe3f11.js +1 -0
- package/dist/web/_next/static/chunks/app/layout-e0174d863960f109.js +1 -0
- package/dist/web/_next/static/chunks/app/sessions/view/page-9517dd74c6d00f85.js +1 -0
- package/dist/web/_next/static/css/{5a10c60adf9c5336.css → b67acb571615432b.css} +1 -1
- package/dist/web/appearance.html +2 -2
- package/dist/web/appearance.txt +25 -24
- package/dist/web/defaults.html +2 -2
- package/dist/web/defaults.txt +25 -24
- package/dist/web/history.html +2 -2
- package/dist/web/history.txt +25 -24
- package/dist/web/import.html +2 -2
- package/dist/web/import.txt +25 -24
- package/dist/web/index.html +2 -2
- package/dist/web/index.txt +25 -24
- package/dist/web/level1.html +2 -2
- package/dist/web/level1.txt +25 -24
- package/dist/web/presets.html +2 -2
- package/dist/web/presets.txt +25 -24
- package/dist/web/sessions/view.html +2 -2
- package/dist/web/sessions/view.txt +25 -24
- package/dist/web/system.html +2 -2
- package/dist/web/system.txt +25 -24
- package/package.json +4 -3
- package/dist/web/_next/static/chunks/549-2086c05135bc9753.js +0 -1
- package/dist/web/_next/static/chunks/867-0cd2c3cfd0ff0a45.js +0 -1
- package/dist/web/_next/static/chunks/89-382e9b29486d2747.js +0 -1
- package/dist/web/_next/static/chunks/app/history/page-83543937cecde5de.js +0 -1
- package/dist/web/_next/static/chunks/app/layout-92fa876afe619cf3.js +0 -1
- package/dist/web/_next/static/chunks/app/sessions/view/page-4631bdf5113a73b2.js +0 -1
- /package/dist/web/_next/static/{7TE2rEuHqGdGx14If8TEb → DCpEMjhrg9APkRwBBw5Do}/_buildManifest.js +0 -0
- /package/dist/web/_next/static/{7TE2rEuHqGdGx14If8TEb → DCpEMjhrg9APkRwBBw5Do}/_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
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
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
|
|
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
|
|
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: '
|
|
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
|
|
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,21 +1056,37 @@ 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
|
+
},
|
|
807
1075
|
{
|
|
808
1076
|
key: 'vcs.startBranch',
|
|
809
1077
|
kind: 'radio',
|
|
810
1078
|
en: 'From a local branch (main)',
|
|
811
1079
|
bg: 'От локален клон (main)',
|
|
812
|
-
doesEn: 'The session
|
|
813
|
-
doesBg: '
|
|
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".',
|
|
814
1082
|
},
|
|
815
1083
|
{
|
|
816
1084
|
key: 'vcs.startPrevious',
|
|
817
1085
|
kind: 'radio',
|
|
818
1086
|
en: 'From the previous session’s branch',
|
|
819
1087
|
bg: 'От клона на предната сесия',
|
|
820
|
-
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
|
|
821
|
-
doesBg: 'Сесията продължава от края на клона на сесията, която последна е комитнала работа в същото хранилище — при пускане,
|
|
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".',
|
|
822
1090
|
},
|
|
823
1091
|
{
|
|
824
1092
|
key: 'vcs.startHead',
|
|
@@ -833,8 +1101,32 @@ export const SYSTEM_GUIDE = [
|
|
|
833
1101
|
kind: 'field',
|
|
834
1102
|
en: 'Local branch to start from',
|
|
835
1103
|
bg: 'Локален клон, от който да тръгне',
|
|
836
|
-
doesEn: 'The branch "From a local branch" starts from, and where a chain begins
|
|
837
|
-
doesBg: 'Клонът, от който тръгва „От локален
|
|
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: 'След първото пускане: тръгнала е оттам, където е било хранилището.',
|
|
838
1130
|
},
|
|
839
1131
|
{
|
|
840
1132
|
key: 'vcs.commit',
|
|
@@ -844,6 +1136,22 @@ export const SYSTEM_GUIDE = [
|
|
|
844
1136
|
doesEn: 'One local commit per task whatever the outcome; unticked leaves the changes loose in the working tree.',
|
|
845
1137
|
doesBg: 'По един локален комит на задача, независимо от изхода; без отметка промените остават свободни в работното дърво.',
|
|
846
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
|
+
},
|
|
847
1155
|
],
|
|
848
1156
|
},
|
|
849
1157
|
{
|
|
@@ -898,6 +1206,38 @@ export const SYSTEM_GUIDE = [
|
|
|
898
1206
|
doesEn: 'The folder the include and exclude lists below are relative to.',
|
|
899
1207
|
doesBg: 'Папката, спрямо която са списъците за включване и изключване отдолу.',
|
|
900
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
|
+
},
|
|
901
1241
|
{
|
|
902
1242
|
key: 'tree.load',
|
|
903
1243
|
kind: 'button',
|
|
@@ -906,6 +1246,70 @@ export const SYSTEM_GUIDE = [
|
|
|
906
1246
|
doesEn: 'Reads the project folder and draws its tree, so folders can be ticked instead of typed.',
|
|
907
1247
|
doesBg: 'Прочита папката на проекта и показва дървото ѝ, за да се избират папки с клик, вместо да се пишат.',
|
|
908
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
|
+
},
|
|
909
1313
|
{
|
|
910
1314
|
key: 'mirror.gitignore',
|
|
911
1315
|
kind: 'checkbox',
|
|
@@ -937,6 +1341,14 @@ export const SYSTEM_GUIDE = [
|
|
|
937
1341
|
en: 'Tasks',
|
|
938
1342
|
bg: 'Задачи',
|
|
939
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
|
+
},
|
|
940
1352
|
{
|
|
941
1353
|
key: 'chain.stop',
|
|
942
1354
|
kind: 'radio',
|
|
@@ -969,6 +1381,14 @@ export const SYSTEM_GUIDE = [
|
|
|
969
1381
|
doesEn: 'The same button while the task is still running — it says this instead, and pulses. Tell the operator to watch here.',
|
|
970
1382
|
doesBg: 'Същият бутон, докато задачата още върви — пише това и пулсира. Кажи на оператора да гледа тук.',
|
|
971
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
|
+
},
|
|
972
1392
|
{
|
|
973
1393
|
key: 'task.edit',
|
|
974
1394
|
kind: 'button',
|
|
@@ -978,36 +1398,76 @@ export const SYSTEM_GUIDE = [
|
|
|
978
1398
|
doesBg: 'Отваря формата за заглавието, ниво 2, текста, git имената и проверките на задачата.',
|
|
979
1399
|
},
|
|
980
1400
|
{
|
|
981
|
-
key: 'task.
|
|
1401
|
+
key: 'task.cancel',
|
|
982
1402
|
kind: 'button',
|
|
983
|
-
en: '
|
|
984
|
-
bg: '
|
|
985
|
-
doesEn: '
|
|
986
|
-
doesBg: '
|
|
1403
|
+
en: 'Cancel',
|
|
1404
|
+
bg: 'Отказ',
|
|
1405
|
+
doesEn: 'Leaves the edit without saving.',
|
|
1406
|
+
doesBg: 'Излиза от редакцията, без да записва.',
|
|
987
1407
|
},
|
|
988
1408
|
{
|
|
989
|
-
key: 'task.
|
|
1409
|
+
key: 'task.save',
|
|
990
1410
|
kind: 'button',
|
|
991
|
-
en: '
|
|
992
|
-
bg: '
|
|
993
|
-
doesEn: '
|
|
994
|
-
doesBg: '
|
|
1411
|
+
en: 'Save',
|
|
1412
|
+
bg: 'Запази',
|
|
1413
|
+
doesEn: 'On a task that has not run yet: stores the edit.',
|
|
1414
|
+
doesBg: 'При задача, която още не е вървяла: записва промяната.',
|
|
995
1415
|
},
|
|
996
1416
|
{
|
|
997
|
-
key: '
|
|
1417
|
+
key: 'task.saveAndRerun',
|
|
998
1418
|
kind: 'button',
|
|
999
|
-
en: '
|
|
1000
|
-
bg: '
|
|
1001
|
-
doesEn: '
|
|
1002
|
-
doesBg: '
|
|
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: 'При вече изпълнена задача: записва промяната и я връща в опашката; предишният опит се пази. При готова задача новият опит стъпва върху свършеното. Не я пуска.',
|
|
1003
1423
|
},
|
|
1004
1424
|
{
|
|
1005
|
-
key: '
|
|
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} задача(и)“.',
|
|
1447
|
+
},
|
|
1448
|
+
{
|
|
1449
|
+
key: 'task.rerun',
|
|
1450
|
+
kind: 'button',
|
|
1451
|
+
en: 'Run again',
|
|
1452
|
+
bg: 'Пусни отново',
|
|
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: 'Връща приключила задача в опашката без промяна, да тръгне отначало; предишният опит се пази със собствен дневник. Само я нарежда.',
|
|
1455
|
+
},
|
|
1456
|
+
{
|
|
1457
|
+
key: 'restore.button',
|
|
1458
|
+
kind: 'button',
|
|
1459
|
+
en: 'Restore',
|
|
1460
|
+
bg: 'Върни',
|
|
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: 'С включен контрол на версиите и записано начало: връща хранилището към кода отпреди тази задача, на нов клон. Нищо не се изтрива.',
|
|
1463
|
+
},
|
|
1464
|
+
{
|
|
1465
|
+
key: 'restart.button',
|
|
1006
1466
|
kind: 'button',
|
|
1007
1467
|
en: 'Run again from here',
|
|
1008
1468
|
bg: 'Пусни отново оттук',
|
|
1009
|
-
doesEn: 'Puts the code back, queues that task and every task after it
|
|
1010
|
-
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: 'Връща кода, нарежда отново тази задача и всички след нея — включително следващите сесии от пускането ѝ — и тръгва веднага, в режима на онова пускане.',
|
|
1011
1471
|
},
|
|
1012
1472
|
{
|
|
1013
1473
|
key: 'task.delete',
|
|
@@ -1022,8 +1482,104 @@ export const SYSTEM_GUIDE = [
|
|
|
1022
1482
|
kind: 'button',
|
|
1023
1483
|
en: 'save the log',
|
|
1024
1484
|
bg: 'запази log-а',
|
|
1025
|
-
doesEn: '
|
|
1026
|
-
doesBg: '
|
|
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: 'diff.open',
|
|
1554
|
+
kind: 'button',
|
|
1555
|
+
en: 'See the changes ({n} file(s))',
|
|
1556
|
+
bg: 'Виж промените ({n} файла)',
|
|
1557
|
+
doesEn: 'Where the attempt committed: every file it changed, before on the left and after on the right, scrolling together. Also under each earlier attempt.',
|
|
1558
|
+
doesBg: 'Където опитът е комитнал: всеки променен файл, преди вляво и след вдясно, превъртани заедно. И под всеки по-ранен опит.',
|
|
1559
|
+
},
|
|
1560
|
+
{
|
|
1561
|
+
key: 'task.deviations',
|
|
1562
|
+
kind: 'disclosure',
|
|
1563
|
+
en: 'Not as the task said ({n})',
|
|
1564
|
+
bg: 'Не както задачата казва ({n})',
|
|
1565
|
+
doesEn: 'What the model says it did not do as the task said, and why.',
|
|
1566
|
+
doesBg: 'Какво моделът казва, че не е направил както е казано в задачата, и защо.',
|
|
1567
|
+
},
|
|
1568
|
+
{
|
|
1569
|
+
key: 'review.findings',
|
|
1570
|
+
kind: 'disclosure',
|
|
1571
|
+
en: 'what it found ({n})',
|
|
1572
|
+
bg: 'какво намери ({n})',
|
|
1573
|
+
doesEn: 'What the independent review found.',
|
|
1574
|
+
doesBg: 'Какво е намерила независимата рецензия.',
|
|
1575
|
+
},
|
|
1576
|
+
{
|
|
1577
|
+
key: 'task.disputes',
|
|
1578
|
+
kind: 'disclosure',
|
|
1579
|
+
en: 'Review findings the model disputed ({n})',
|
|
1580
|
+
bg: 'Оспорени находки на рецензията ({n})',
|
|
1581
|
+
doesEn: 'Review findings the model disputed, with its evidence.',
|
|
1582
|
+
doesBg: 'Находки на рецензията, които моделът е оспорил, с доказателствата си.',
|
|
1027
1583
|
},
|
|
1028
1584
|
{
|
|
1029
1585
|
key: 'status.queued',
|
|
@@ -1078,16 +1634,16 @@ export const SYSTEM_GUIDE = [
|
|
|
1078
1634
|
kind: 'badge',
|
|
1079
1635
|
en: 'aborted',
|
|
1080
1636
|
bg: 'прекратена',
|
|
1081
|
-
doesEn: '
|
|
1082
|
-
doesBg: '
|
|
1637
|
+
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).',
|
|
1638
|
+
doesBg: 'Спряна преди да приключи: със „Спри“, с „Прекрати задачата“ на чакаща стъпка или защото ботът е спрян посред задача (тогава работата ѝ се комитва на клона ѝ при следващото пускане).',
|
|
1083
1639
|
},
|
|
1084
1640
|
{
|
|
1085
1641
|
key: 'status.limit-reached',
|
|
1086
1642
|
kind: 'badge',
|
|
1087
1643
|
en: 'limit reached',
|
|
1088
1644
|
bg: 'достигнат лимит',
|
|
1089
|
-
doesEn: 'The task ran out of its allowed
|
|
1090
|
-
doesBg: 'Задачата е изчерпала позволените си
|
|
1645
|
+
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.',
|
|
1646
|
+
doesBg: 'Задачата е изчерпала позволените си съобщения или минути (Настройки → Изпълнение), преди да приключи. „Продължи в същия чат“ я продължава.',
|
|
1091
1647
|
},
|
|
1092
1648
|
{
|
|
1093
1649
|
key: 'review.verdict.pass',
|
|
@@ -1144,6 +1700,14 @@ export const SYSTEM_GUIDE = [
|
|
|
1144
1700
|
doesEn: 'Replaces that text with a preset saved earlier.',
|
|
1145
1701
|
doesBg: 'Заменя този текст с по-рано запазен шаблон.',
|
|
1146
1702
|
},
|
|
1703
|
+
{
|
|
1704
|
+
key: 'l2.saveAs',
|
|
1705
|
+
kind: 'button',
|
|
1706
|
+
en: 'Save as preset',
|
|
1707
|
+
bg: 'Запази като шаблон',
|
|
1708
|
+
doesEn: 'Saves the level 2 text as a preset under a name it asks for.',
|
|
1709
|
+
doesBg: 'Запазва текста на ниво 2 като шаблон под име, което пита.',
|
|
1710
|
+
},
|
|
1147
1711
|
{
|
|
1148
1712
|
key: 'form.taskLabel',
|
|
1149
1713
|
kind: 'field',
|
|
@@ -1160,14 +1724,6 @@ export const SYSTEM_GUIDE = [
|
|
|
1160
1724
|
doesEn: "Puts the new task at the end of this session's queue; it starts nothing.",
|
|
1161
1725
|
doesBg: 'Слага новата задача в края на опашката на сесията; не пуска нищо.',
|
|
1162
1726
|
},
|
|
1163
|
-
{
|
|
1164
|
-
key: 'task.saveAndRerun',
|
|
1165
|
-
kind: 'button',
|
|
1166
|
-
en: 'Save and queue it again',
|
|
1167
|
-
bg: 'Запази и върни в опашката',
|
|
1168
|
-
doesEn: 'On a task that has already run: stores the edit and puts the task back in the queue with the new text.',
|
|
1169
|
-
doesBg: 'При вече изпълнена задача: записва промяната и връща задачата в опашката с новия текст.',
|
|
1170
|
-
},
|
|
1171
1727
|
],
|
|
1172
1728
|
},
|
|
1173
1729
|
{
|
|
@@ -1207,6 +1763,46 @@ export const SYSTEM_GUIDE = [
|
|
|
1207
1763
|
doesEn: 'Adds one more empty check to the task. A task with no check has nothing gating it.',
|
|
1208
1764
|
doesBg: 'Добавя още една празна проверка към задачата. Задача без проверка няма какво да я спре.',
|
|
1209
1765
|
},
|
|
1766
|
+
{
|
|
1767
|
+
key: 'checks.remove',
|
|
1768
|
+
kind: 'button',
|
|
1769
|
+
en: 'Remove',
|
|
1770
|
+
bg: 'Махни',
|
|
1771
|
+
doesEn: 'Removes that check.',
|
|
1772
|
+
doesBg: 'Премахва тази проверка.',
|
|
1773
|
+
},
|
|
1774
|
+
{
|
|
1775
|
+
key: 'checks.cwd',
|
|
1776
|
+
kind: 'field',
|
|
1777
|
+
en: 'In folder',
|
|
1778
|
+
bg: 'В папка',
|
|
1779
|
+
doesEn: 'The folder the check\'s command runs in; empty is the project.',
|
|
1780
|
+
doesBg: 'Папката, в която върви командата на проверката; празно е проектът.',
|
|
1781
|
+
},
|
|
1782
|
+
{
|
|
1783
|
+
key: 'checks.file',
|
|
1784
|
+
kind: 'field',
|
|
1785
|
+
en: 'File',
|
|
1786
|
+
bg: 'Файл',
|
|
1787
|
+
doesEn: 'For a file check: the file.',
|
|
1788
|
+
doesBg: 'За проверка на файл: файлът.',
|
|
1789
|
+
},
|
|
1790
|
+
{
|
|
1791
|
+
key: 'checks.value',
|
|
1792
|
+
kind: 'field',
|
|
1793
|
+
en: 'Text',
|
|
1794
|
+
bg: 'Текст',
|
|
1795
|
+
doesEn: 'For an output or file-content check: the text to look for.',
|
|
1796
|
+
doesBg: 'За проверка на изход или съдържание: текстът, който се търси.',
|
|
1797
|
+
},
|
|
1798
|
+
{
|
|
1799
|
+
key: 'checks.fromReview',
|
|
1800
|
+
kind: 'disclosure',
|
|
1801
|
+
en: 'From reviews ({n})',
|
|
1802
|
+
bg: 'От рецензии ({n})',
|
|
1803
|
+
doesEn: 'Checks the reviewers suggested; they defer to the next review rather than failing the task alone.',
|
|
1804
|
+
doesBg: 'Проверки, предложени от рецензентите; не провалят задачата сами, а оставят решението на следващата рецензия.',
|
|
1805
|
+
},
|
|
1210
1806
|
],
|
|
1211
1807
|
},
|
|
1212
1808
|
{
|
|
@@ -1230,6 +1826,37 @@ export const SYSTEM_GUIDE = [
|
|
|
1230
1826
|
doesEn: 'The whole conversation of the chosen tasks, with every report and reply in between.',
|
|
1231
1827
|
doesBg: 'Целият разговор на избраните задачи, с всички отчети и отговори помежду им.',
|
|
1232
1828
|
},
|
|
1829
|
+
{
|
|
1830
|
+
key: 'export.all',
|
|
1831
|
+
kind: 'button',
|
|
1832
|
+
en: 'Select all',
|
|
1833
|
+
bg: 'Избери всички',
|
|
1834
|
+
doesEn: 'Ticks every task for the download.',
|
|
1835
|
+
doesBg: 'Отметва всички задачи за изтеглянето.',
|
|
1836
|
+
},
|
|
1837
|
+
{
|
|
1838
|
+
key: 'export.none',
|
|
1839
|
+
kind: 'button',
|
|
1840
|
+
en: 'Clear the selection',
|
|
1841
|
+
bg: 'Изчисти избора',
|
|
1842
|
+
doesEn: 'Clears the ticks.',
|
|
1843
|
+
doesBg: 'Маха отметките.',
|
|
1844
|
+
},
|
|
1845
|
+
],
|
|
1846
|
+
},
|
|
1847
|
+
{
|
|
1848
|
+
headingKey: 'live.title',
|
|
1849
|
+
en: 'Live',
|
|
1850
|
+
bg: 'На живо',
|
|
1851
|
+
controls: [
|
|
1852
|
+
{
|
|
1853
|
+
key: 'live.title',
|
|
1854
|
+
kind: 'note',
|
|
1855
|
+
en: 'Live',
|
|
1856
|
+
bg: 'На живо',
|
|
1857
|
+
doesEn: 'The panel at the bottom: the session\'s events as they happen — steps, approvals, commits, warnings.',
|
|
1858
|
+
doesBg: 'Панелът най-долу: събитията на сесията, както стават — стъпки, одобрения, комити, предупреждения.',
|
|
1859
|
+
},
|
|
1233
1860
|
],
|
|
1234
1861
|
},
|
|
1235
1862
|
],
|
|
@@ -1238,8 +1865,8 @@ export const SYSTEM_GUIDE = [
|
|
|
1238
1865
|
route: '/history',
|
|
1239
1866
|
nameEn: 'Task register',
|
|
1240
1867
|
nameBg: 'Регистър на задачите',
|
|
1241
|
-
purposeEn: 'Every task of every session in one place — running now, queued next, already done — with the filters, the
|
|
1242
|
-
purposeBg: 'Всички задачи от всички сесии на едно място — какво върви сега, какво чака и какво е направено — с филтрите, изтеглянията
|
|
1868
|
+
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.',
|
|
1869
|
+
purposeBg: 'Всички задачи от всички сесии на едно място — какво върви сега, какво чака и какво е направено — с филтрите, изтеглянията и панела, който продължава опашката с точно отметнатите от оператора задачи. „Продължи“ и „Избери задачи“ има само в изгледа „Поток“; кажи на оператора първо да е на него.',
|
|
1243
1870
|
sections: [
|
|
1244
1871
|
{
|
|
1245
1872
|
headingKey: 'reg.title',
|
|
@@ -1254,6 +1881,30 @@ export const SYSTEM_GUIDE = [
|
|
|
1254
1881
|
doesEn: 'Reads the task list from the server at once; the page also re-reads it by itself every few seconds.',
|
|
1255
1882
|
doesBg: 'Прочита списъка със задачи от сървъра веднага; страницата и без това се обновява сама на няколко секунди.',
|
|
1256
1883
|
},
|
|
1884
|
+
{
|
|
1885
|
+
key: 'reg.newSession',
|
|
1886
|
+
kind: 'button',
|
|
1887
|
+
en: 'New session',
|
|
1888
|
+
bg: 'Нова сесия',
|
|
1889
|
+
doesEn: 'Goes to the "New session" form on `/`.',
|
|
1890
|
+
doesBg: 'Отива на формата „Нова сесия“ на `/`.',
|
|
1891
|
+
},
|
|
1892
|
+
{
|
|
1893
|
+
key: 'reg.newTask',
|
|
1894
|
+
kind: 'select',
|
|
1895
|
+
en: 'New task',
|
|
1896
|
+
bg: 'Нова задача',
|
|
1897
|
+
doesEn: 'With "choose a session…" open, picking a session opens that session\'s page at its "Add a task" form.',
|
|
1898
|
+
doesBg: 'С отворено „изберете сесия…“, изборът на сесия отваря страницата ѝ на формата „Добави задача“.',
|
|
1899
|
+
},
|
|
1900
|
+
{
|
|
1901
|
+
key: 'reg.newTaskPick',
|
|
1902
|
+
kind: 'select',
|
|
1903
|
+
en: 'choose a session…',
|
|
1904
|
+
bg: 'изберете сесия…',
|
|
1905
|
+
doesEn: 'The empty choice of "New task"; pick a session instead of it.',
|
|
1906
|
+
doesBg: 'Празният избор на „Нова задача“; изберете сесия вместо него.',
|
|
1907
|
+
},
|
|
1257
1908
|
{
|
|
1258
1909
|
key: 'reg.total',
|
|
1259
1910
|
kind: 'badge',
|
|
@@ -1301,6 +1952,14 @@ export const SYSTEM_GUIDE = [
|
|
|
1301
1952
|
en: 'Session',
|
|
1302
1953
|
bg: 'Сесия',
|
|
1303
1954
|
controls: [
|
|
1955
|
+
{
|
|
1956
|
+
key: 'reg.allSessions',
|
|
1957
|
+
kind: 'select',
|
|
1958
|
+
en: 'all sessions',
|
|
1959
|
+
bg: 'всички сесии',
|
|
1960
|
+
doesEn: 'The "Session" filter\'s empty choice: every session. Pick one session to narrow the page to it.',
|
|
1961
|
+
doesBg: 'Празният избор на филтъра „Сесия“: всички сесии. Изберете една сесия, за да свиете страницата до нея.',
|
|
1962
|
+
},
|
|
1304
1963
|
{
|
|
1305
1964
|
key: 'reg.filterStatus',
|
|
1306
1965
|
kind: 'select',
|
|
@@ -1309,6 +1968,14 @@ export const SYSTEM_GUIDE = [
|
|
|
1309
1968
|
doesEn: 'Narrows the page to the tasks in one state, using the same words as the badges.',
|
|
1310
1969
|
doesBg: 'Свива страницата до задачите в едно състояние, със същите думи като етикетите.',
|
|
1311
1970
|
},
|
|
1971
|
+
{
|
|
1972
|
+
key: 'reg.allStatuses',
|
|
1973
|
+
kind: 'select',
|
|
1974
|
+
en: 'all statuses',
|
|
1975
|
+
bg: 'всички състояния',
|
|
1976
|
+
doesEn: 'The "Status" filter\'s empty choice: every state.',
|
|
1977
|
+
doesBg: 'Празният избор на филтъра „Състояние“: всички състояния.',
|
|
1978
|
+
},
|
|
1312
1979
|
{
|
|
1313
1980
|
key: 'reg.search',
|
|
1314
1981
|
kind: 'field',
|
|
@@ -1337,55 +2004,103 @@ export const SYSTEM_GUIDE = [
|
|
|
1337
2004
|
kind: 'tab',
|
|
1338
2005
|
en: 'Flow',
|
|
1339
2006
|
bg: 'Поток',
|
|
1340
|
-
doesEn: 'Shows the register as three threads
|
|
1341
|
-
doesBg: 'Показва регистъра като три
|
|
2007
|
+
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".',
|
|
2008
|
+
doesBg: 'Показва регистъра като три нишки — „В момента“, „Какво следва“, „Какво е направено“ — и е единственият изглед с „Продължи“, бутоните за пускането и „Избери задачи“.',
|
|
1342
2009
|
},
|
|
1343
2010
|
{
|
|
1344
2011
|
key: 'reg.groupBy',
|
|
1345
2012
|
kind: 'tab',
|
|
1346
2013
|
en: 'By run',
|
|
1347
2014
|
bg: 'По изпълнение',
|
|
1348
|
-
doesEn: '
|
|
1349
|
-
doesBg: '
|
|
2015
|
+
doesEn: 'Groups the same tasks under the run that started them, newest first, each with its own plan · work · runner links.',
|
|
2016
|
+
doesBg: 'Групира същите задачи под пускането, което ги е стартирало, най-новото отгоре, всяко със свои връзки план · работа · runner.',
|
|
1350
2017
|
},
|
|
1351
2018
|
{
|
|
1352
2019
|
key: 'reg.viewList',
|
|
1353
2020
|
kind: 'tab',
|
|
1354
2021
|
en: 'List',
|
|
1355
2022
|
bg: 'Списък',
|
|
1356
|
-
doesEn: 'Shows the same tasks as one table, for scanning many of them at once.',
|
|
1357
|
-
doesBg: 'Показва същите задачи като една таблица, за да се преглеждат много
|
|
2023
|
+
doesEn: 'Shows the same tasks as one table, for scanning many of them at once; the title opens the task.',
|
|
2024
|
+
doesBg: 'Показва същите задачи като една таблица, за да се преглеждат много наведнъж; заглавието отваря задачата.',
|
|
2025
|
+
},
|
|
2026
|
+
{
|
|
2027
|
+
key: 'reg.runGroup',
|
|
2028
|
+
kind: 'note',
|
|
2029
|
+
en: 'Started together',
|
|
2030
|
+
bg: 'Пуснати заедно',
|
|
2031
|
+
doesEn: 'In "By run": the heading above the runs.',
|
|
2032
|
+
doesBg: 'В „По изпълнение“: заглавието над пусканията.',
|
|
2033
|
+
},
|
|
2034
|
+
{
|
|
2035
|
+
key: 'reg.notInARun',
|
|
2036
|
+
kind: 'note',
|
|
2037
|
+
en: 'Not part of a run',
|
|
2038
|
+
bg: 'Извън изпълнение',
|
|
2039
|
+
doesEn: 'In "By run": the tasks that were started on their own, not as part of a run.',
|
|
2040
|
+
doesBg: 'В „По изпълнение“: задачите, пуснати сами, не като част от пускане.',
|
|
1358
2041
|
},
|
|
1359
2042
|
],
|
|
1360
2043
|
},
|
|
1361
2044
|
{
|
|
1362
|
-
headingKey:
|
|
1363
|
-
en: '
|
|
1364
|
-
bg: '
|
|
2045
|
+
headingKey: null,
|
|
2046
|
+
en: 'On every task row, in every view',
|
|
2047
|
+
bg: 'На всеки ред със задача, във всеки изглед',
|
|
1365
2048
|
controls: [
|
|
2049
|
+
{
|
|
2050
|
+
key: 'reg.openTask',
|
|
2051
|
+
kind: 'link',
|
|
2052
|
+
en: 'task details',
|
|
2053
|
+
bg: 'детайли на задачата',
|
|
2054
|
+
doesEn: 'Opens that task\'s card on its session page, where it can be edited, run again or continued.',
|
|
2055
|
+
doesBg: 'Отваря картата на задачата на страницата на сесията ѝ, където може да се редактира, пусне отново или продължи.',
|
|
2056
|
+
},
|
|
2057
|
+
{
|
|
2058
|
+
key: 'home.col.chat',
|
|
2059
|
+
kind: 'link',
|
|
2060
|
+
en: 'Chat',
|
|
2061
|
+
bg: 'Чат',
|
|
2062
|
+
doesEn: 'Opens the Copilot conversation the task ran in.',
|
|
2063
|
+
doesBg: 'Отваря разговора в Copilot, в който е вървяла задачата.',
|
|
2064
|
+
},
|
|
2065
|
+
{
|
|
2066
|
+
key: 'reg.activeNow',
|
|
2067
|
+
kind: 'note',
|
|
2068
|
+
en: 'Running now',
|
|
2069
|
+
bg: 'В момента',
|
|
2070
|
+
doesEn: 'In the "Flow" view: the thread of what is running this minute.',
|
|
2071
|
+
doesBg: 'В изгледа „Поток“: нишката на това, което върви в момента.',
|
|
2072
|
+
},
|
|
1366
2073
|
{
|
|
1367
2074
|
key: 'save.log',
|
|
1368
2075
|
kind: 'button',
|
|
1369
2076
|
en: 'save the log',
|
|
1370
2077
|
bg: 'запази log-а',
|
|
1371
|
-
doesEn:
|
|
2078
|
+
doesEn: 'Saves the runner\'s log of that task\'s latest attempt to the Desktop and opens Explorer on it.',
|
|
1372
2079
|
doesBg: 'Запазва log-а на runner-а от последния опит на задачата на десктопа и отваря Explorer върху него.',
|
|
1373
2080
|
},
|
|
2081
|
+
{
|
|
2082
|
+
key: 'reg.exportTitle',
|
|
2083
|
+
kind: 'note',
|
|
2084
|
+
en: 'Download as JSON',
|
|
2085
|
+
bg: 'Изтегли като JSON',
|
|
2086
|
+
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").',
|
|
2087
|
+
doesBg: 'Думите пред трите изтегляния „план“, „работа“ и „runner“ на реда (и на пускане, на заглавието му в „По изпълнение“).',
|
|
2088
|
+
},
|
|
1374
2089
|
{
|
|
1375
2090
|
key: 'reg.exportPlan',
|
|
1376
2091
|
kind: 'link',
|
|
1377
2092
|
en: 'plan',
|
|
1378
2093
|
bg: 'план',
|
|
1379
|
-
doesEn: 'Downloads what was asked: the task in the plan format, with the edits made in the interface. Imports again.',
|
|
1380
|
-
doesBg: 'Изтегля какво е поискано: задачата във формата на плана, с редакциите от
|
|
2094
|
+
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.',
|
|
2095
|
+
doesBg: 'Изтегля какво е поискано: задачата във формата на плана, с редакциите от интерфейса и текста на по-ранните опити. Внася се отново.',
|
|
1381
2096
|
},
|
|
1382
2097
|
{
|
|
1383
2098
|
key: 'reg.exportDomain',
|
|
1384
2099
|
kind: 'link',
|
|
1385
2100
|
en: 'work',
|
|
1386
2101
|
bg: 'работа',
|
|
1387
|
-
doesEn: 'Downloads what happened to the work: what the chat tried, what was done, and why it did not end done.',
|
|
1388
|
-
doesBg: 'Изтегля какво се случи с работата: какво е пробвал чатът, какво е направено и защо не е завършила
|
|
2102
|
+
doesEn: 'Downloads what happened to the work: what the chat tried, what was done, and why it did not end done — earlier attempts included.',
|
|
2103
|
+
doesBg: 'Изтегля какво се случи с работата: какво е пробвал чатът, какво е направено и защо не е завършила готова — с по-ранните опити.',
|
|
1389
2104
|
},
|
|
1390
2105
|
{
|
|
1391
2106
|
key: 'reg.exportBot',
|
|
@@ -1395,46 +2110,205 @@ export const SYSTEM_GUIDE = [
|
|
|
1395
2110
|
doesEn: 'Downloads what the runner did: the environment, every event and step with its exit code, the review machinery.',
|
|
1396
2111
|
doesBg: 'Изтегля какво е направил runner-ът: средата, всяко събитие и стъпка с кода на изход, механиката на рецензията.',
|
|
1397
2112
|
},
|
|
2113
|
+
{
|
|
2114
|
+
key: 'diff.open',
|
|
2115
|
+
kind: 'button',
|
|
2116
|
+
en: 'See the changes ({n} file(s))',
|
|
2117
|
+
bg: 'Виж промените ({n} файла)',
|
|
2118
|
+
doesEn: 'Where the attempt committed: every file it changed, before on the left and after on the right, scrolling together.',
|
|
2119
|
+
doesBg: 'Където опитът е комитнал: всеки променен файл, преди вляво и след вдясно, превъртани заедно.',
|
|
2120
|
+
},
|
|
1398
2121
|
{
|
|
1399
2122
|
key: 'story.show',
|
|
1400
2123
|
kind: 'button',
|
|
1401
2124
|
en: 'What happened',
|
|
1402
2125
|
bg: 'Какво се случи',
|
|
1403
|
-
doesEn: 'Unfolds the whole story under the row
|
|
1404
|
-
doesBg: 'Разгъва цялата история
|
|
2126
|
+
doesEn: 'Unfolds the task\'s whole story under the row.',
|
|
2127
|
+
doesBg: 'Разгъва цялата история на задачата под реда.',
|
|
1405
2128
|
},
|
|
1406
2129
|
{
|
|
1407
2130
|
key: 'story.showLive',
|
|
1408
2131
|
kind: 'button',
|
|
1409
2132
|
en: 'What is happening now',
|
|
1410
2133
|
bg: 'Какво се случва в момента',
|
|
1411
|
-
doesEn: '
|
|
1412
|
-
doesBg: '
|
|
2134
|
+
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.',
|
|
2135
|
+
doesBg: 'Докато задачата върви: същото, на живо — следва най-новото и показва текущата команда като терминал. Кажи на оператора да гледа тук.',
|
|
1413
2136
|
},
|
|
1414
2137
|
{
|
|
1415
|
-
key: '
|
|
2138
|
+
key: 'story.hide',
|
|
1416
2139
|
kind: 'button',
|
|
1417
|
-
en: '
|
|
1418
|
-
bg: '
|
|
1419
|
-
doesEn: '
|
|
1420
|
-
doesBg: '
|
|
2140
|
+
en: 'Hide what happened',
|
|
2141
|
+
bg: 'Скрий какво се случи',
|
|
2142
|
+
doesEn: 'The same button once the story is open: folds it away again.',
|
|
2143
|
+
doesBg: 'Същият бутон, когато историята е отворена: сгъва я обратно.',
|
|
1421
2144
|
},
|
|
1422
2145
|
{
|
|
1423
|
-
key: 'reg.
|
|
2146
|
+
key: 'reg.fixPrompt',
|
|
1424
2147
|
kind: 'button',
|
|
1425
|
-
en: '
|
|
1426
|
-
bg: '
|
|
1427
|
-
doesEn: '
|
|
1428
|
-
doesBg: '
|
|
2148
|
+
en: 'Fix the prompt and queue it again',
|
|
2149
|
+
bg: 'Поправи prompt-а и върни в опашката',
|
|
2150
|
+
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.',
|
|
2151
|
+
doesBg: 'На ред, който не е завършил готов, при спряна сесия: пренапишете текста на задачата и я върнете в опашката. Не я пуска.',
|
|
2152
|
+
},
|
|
2153
|
+
{
|
|
2154
|
+
key: 'reg.newPrompt',
|
|
2155
|
+
kind: 'button',
|
|
2156
|
+
en: 'Give it a new prompt and queue it again',
|
|
2157
|
+
bg: 'Нов prompt и върни в опашката',
|
|
2158
|
+
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.',
|
|
2159
|
+
doesBg: 'На ред, завършил готов, при спряна сесия: нова инструкция за задачата, върху свършената работа (същия клон). Не я пуска.',
|
|
2160
|
+
},
|
|
2161
|
+
{
|
|
2162
|
+
key: 'restore.button',
|
|
2163
|
+
kind: 'button',
|
|
2164
|
+
en: 'Restore',
|
|
2165
|
+
bg: 'Върни',
|
|
2166
|
+
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.',
|
|
2167
|
+
doesBg: 'Както на картата на задача: връща кода отпреди задачата, на нов клон. На ред, който е вървял, когато сесията му стои.',
|
|
2168
|
+
},
|
|
2169
|
+
{
|
|
2170
|
+
key: 'restart.button',
|
|
2171
|
+
kind: 'button',
|
|
2172
|
+
en: 'Run again from here',
|
|
2173
|
+
bg: 'Пусни отново оттук',
|
|
2174
|
+
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.',
|
|
2175
|
+
doesBg: 'Както на картата на задача: връща кода, нарежда задачата и останалото от пускането ѝ и тръгва веднага в режима на онова пускане.',
|
|
1429
2176
|
},
|
|
1430
2177
|
{
|
|
1431
2178
|
key: 'row.info',
|
|
1432
2179
|
kind: 'button',
|
|
1433
2180
|
en: 'What are these?',
|
|
1434
2181
|
bg: 'Какво са тези?',
|
|
1435
|
-
doesEn:
|
|
2182
|
+
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.',
|
|
1436
2183
|
doesBg: 'Малко кръгло i в края на реда. Отваря панел, който казва какво дава всяка от връзките на реда и кой от трите JSON файла да се вземе първи.',
|
|
1437
2184
|
},
|
|
2185
|
+
{
|
|
2186
|
+
key: 'reg.attempts',
|
|
2187
|
+
kind: 'disclosure',
|
|
2188
|
+
en: 'this is attempt {n} — see the {m} before it',
|
|
2189
|
+
bg: 'това е опит {n} — виж {m}-те преди него',
|
|
2190
|
+
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".',
|
|
2191
|
+
doesBg: 'На задача, пускана повече от веднъж: разгъва по-ранните опити, всеки със състоянието, причината, „запази log-а на този опит“ и „изтегли план, работа и runner на този опит“.',
|
|
2192
|
+
},
|
|
2193
|
+
{
|
|
2194
|
+
key: 'reg.attemptsOne',
|
|
2195
|
+
kind: 'disclosure',
|
|
2196
|
+
en: 'this is attempt {n} — see the one before it',
|
|
2197
|
+
bg: 'това е опит {n} — виж този преди него',
|
|
2198
|
+
doesEn: 'The same fold when there is one earlier attempt.',
|
|
2199
|
+
doesBg: 'Същият сгъваем раздел, когато има един по-ранен опит.',
|
|
2200
|
+
},
|
|
2201
|
+
{
|
|
2202
|
+
key: 'save.attemptLog',
|
|
2203
|
+
kind: 'button',
|
|
2204
|
+
en: 'save this attempt\'s log',
|
|
2205
|
+
bg: 'запази log-а на този опит',
|
|
2206
|
+
doesEn: 'Inside the earlier attempts: saves the log of that attempt, rather than of the latest one, to the Desktop.',
|
|
2207
|
+
doesBg: 'В по-ранните опити: запазва на десктопа log-а на този опит, а не на последния.',
|
|
2208
|
+
},
|
|
2209
|
+
{
|
|
2210
|
+
key: 'save.attemptRecord',
|
|
2211
|
+
kind: 'button',
|
|
2212
|
+
en: 'download plan, work and runner of this attempt',
|
|
2213
|
+
bg: 'изтегли план, работа и runner на този опит',
|
|
2214
|
+
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.',
|
|
2215
|
+
doesBg: 'В по-ранните опити: този опит, както е вървял — план, работа, runner — в един файл. Провален опит ги пази и като plan.json, work.json и runner.json в папката на пускането си.',
|
|
2216
|
+
},
|
|
2217
|
+
{
|
|
2218
|
+
key: 'reg.stopped',
|
|
2219
|
+
kind: 'note',
|
|
2220
|
+
en: 'stopped: {reason}',
|
|
2221
|
+
bg: 'спряна: {reason}',
|
|
2222
|
+
doesEn: 'In red on the row: why that task or attempt stopped without the work being done.',
|
|
2223
|
+
doesBg: 'В червено на реда: защо задачата или опитът е спрял, без работата да е свършена.',
|
|
2224
|
+
},
|
|
2225
|
+
{
|
|
2226
|
+
key: 'reg.retriedFreshDone',
|
|
2227
|
+
kind: 'badge',
|
|
2228
|
+
en: 'blocked, then done in a fresh chat ({n}×)',
|
|
2229
|
+
bg: 'блокира, после готова в нов чат ({n}×)',
|
|
2230
|
+
doesEn: 'The task was blocked and then finished in a new conversation, so the chat was the cause, not the task.',
|
|
2231
|
+
doesBg: 'Задачата е блокирала и после е станала готова в нов разговор — значи чатът е бил причината, не задачата.',
|
|
2232
|
+
},
|
|
2233
|
+
{
|
|
2234
|
+
key: 'reg.retriedFreshStill',
|
|
2235
|
+
kind: 'badge',
|
|
2236
|
+
en: 'still blocked after {n} fresh chat(s)',
|
|
2237
|
+
bg: 'още блокирана след {n} нови чата',
|
|
2238
|
+
doesEn: 'Fresh conversations did not help, so the cause is in the task text, the checks or the machine.',
|
|
2239
|
+
doesBg: 'Новите разговори не са помогнали — причината е в текста на задачата, в проверките или в машината.',
|
|
2240
|
+
},
|
|
2241
|
+
],
|
|
2242
|
+
},
|
|
2243
|
+
{
|
|
2244
|
+
headingKey: 'story.prompt',
|
|
2245
|
+
en: 'The task, as given',
|
|
2246
|
+
bg: 'Заданието, както е дадено',
|
|
2247
|
+
controls: [
|
|
2248
|
+
{
|
|
2249
|
+
key: 'story.showChat',
|
|
2250
|
+
kind: 'checkbox',
|
|
2251
|
+
en: 'the conversation',
|
|
2252
|
+
bg: 'разговорът',
|
|
2253
|
+
doesEn: 'Shows or hides the messages sent and the replies.',
|
|
2254
|
+
doesBg: 'Показва или скрива изпратените съобщения и отговорите.',
|
|
2255
|
+
},
|
|
2256
|
+
{
|
|
2257
|
+
key: 'story.showCommands',
|
|
2258
|
+
kind: 'checkbox',
|
|
2259
|
+
en: 'the commands and their output',
|
|
2260
|
+
bg: 'командите и изходът им',
|
|
2261
|
+
doesEn: 'Shows or hides the commands that ran and their output.',
|
|
2262
|
+
doesBg: 'Показва или скрива изпълнените команди и изхода им.',
|
|
2263
|
+
},
|
|
2264
|
+
{
|
|
2265
|
+
key: 'story.live',
|
|
2266
|
+
kind: 'badge',
|
|
2267
|
+
en: 'live',
|
|
2268
|
+
bg: 'на живо',
|
|
2269
|
+
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.',
|
|
2270
|
+
doesBg: 'Пулсира, докато задачата върви. Списъкът тогава стои на най-новото, а текущата команда е отворена и изходът ѝ следва последния ред, като терминал.',
|
|
2271
|
+
},
|
|
2272
|
+
{
|
|
2273
|
+
key: 'story.follow',
|
|
2274
|
+
kind: 'button',
|
|
2275
|
+
en: '↓ follow the newest',
|
|
2276
|
+
bg: '↓ следвай най-новото',
|
|
2277
|
+
doesEn: 'Appears when the operator scrolled up in a live story: goes back to the newest line and follows it again.',
|
|
2278
|
+
doesBg: 'Появява се, когато операторът е превъртял нагоре в история на живо: връща на най-новия ред и следва отново.',
|
|
2279
|
+
},
|
|
2280
|
+
{
|
|
2281
|
+
key: 'story.showOutput',
|
|
2282
|
+
kind: 'button',
|
|
2283
|
+
en: 'show output ({n} chars)',
|
|
2284
|
+
bg: 'покажи изхода ({n} знака)',
|
|
2285
|
+
doesEn: 'Under a command: unfolds its output (the end of it, for a very long one).',
|
|
2286
|
+
doesBg: 'Под команда: разгъва изхода ѝ (края му, ако е много дълъг).',
|
|
2287
|
+
},
|
|
2288
|
+
{
|
|
2289
|
+
key: 'story.hideOutput',
|
|
2290
|
+
kind: 'button',
|
|
2291
|
+
en: 'hide output',
|
|
2292
|
+
bg: 'скрий изхода',
|
|
2293
|
+
doesEn: 'Folds that output away again.',
|
|
2294
|
+
doesBg: 'Сгъва този изход обратно.',
|
|
2295
|
+
},
|
|
2296
|
+
{
|
|
2297
|
+
key: 'story.showText',
|
|
2298
|
+
kind: 'button',
|
|
2299
|
+
en: 'show text ({n} chars)',
|
|
2300
|
+
bg: 'покажи текста ({n} знака)',
|
|
2301
|
+
doesEn: 'Under a message or a reply: unfolds its full text.',
|
|
2302
|
+
doesBg: 'Под съобщение или отговор: разгъва пълния текст.',
|
|
2303
|
+
},
|
|
2304
|
+
{
|
|
2305
|
+
key: 'story.hideText',
|
|
2306
|
+
kind: 'button',
|
|
2307
|
+
en: 'hide text',
|
|
2308
|
+
bg: 'скрий текста',
|
|
2309
|
+
doesEn: 'Folds that text away again.',
|
|
2310
|
+
doesBg: 'Сгъва този текст обратно.',
|
|
2311
|
+
},
|
|
1438
2312
|
],
|
|
1439
2313
|
},
|
|
1440
2314
|
{
|
|
@@ -1442,53 +2316,125 @@ export const SYSTEM_GUIDE = [
|
|
|
1442
2316
|
en: 'What is next',
|
|
1443
2317
|
bg: 'Какво следва',
|
|
1444
2318
|
controls: [
|
|
2319
|
+
{
|
|
2320
|
+
key: 'batch.pause',
|
|
2321
|
+
kind: 'button',
|
|
2322
|
+
en: 'Pause after this task',
|
|
2323
|
+
bg: 'Пауза след тази задача',
|
|
2324
|
+
doesEn: 'As on `/`: holds the run after the task in flight finishes properly. Press it first after a failure you want to think about.',
|
|
2325
|
+
doesBg: 'Както на `/`: задържа пускането, след като текущата задача приключи както трябва. Натиснете го първо след провал, над който искате да помислите.',
|
|
2326
|
+
},
|
|
2327
|
+
{
|
|
2328
|
+
key: 'batch.resume',
|
|
2329
|
+
kind: 'button',
|
|
2330
|
+
en: 'Take the hold off',
|
|
2331
|
+
bg: 'Махни паузата',
|
|
2332
|
+
doesEn: 'As on `/`: the queue carries on.',
|
|
2333
|
+
doesBg: 'Както на `/`: опашката продължава.',
|
|
2334
|
+
},
|
|
2335
|
+
{
|
|
2336
|
+
key: 'batch.stop',
|
|
2337
|
+
kind: 'button',
|
|
2338
|
+
en: 'Stop after the current step',
|
|
2339
|
+
bg: 'Спри след текущата стъпка',
|
|
2340
|
+
doesEn: 'As on `/`: stops after the current step; the task in flight ends aborted.',
|
|
2341
|
+
doesBg: 'Както на `/`: спира след текущата стъпка; текущата задача завършва прекратена.',
|
|
2342
|
+
},
|
|
1445
2343
|
{
|
|
1446
2344
|
key: 'reg.continue',
|
|
1447
2345
|
kind: 'button',
|
|
1448
2346
|
en: 'Continue: run the {n} queued task(s) in {s} session(s)',
|
|
1449
2347
|
bg: 'Продължи: пусни {n} чакащи задачи в {s} сесии',
|
|
1450
|
-
doesEn: 'Opens
|
|
1451
|
-
doesBg: 'Отваря
|
|
2348
|
+
doesEn: 'Opens the "Before it continues" panel. It starts nothing yet.',
|
|
2349
|
+
doesBg: 'Отваря панела „Преди да продължи“. Още нищо не пуска.',
|
|
1452
2350
|
},
|
|
1453
2351
|
{
|
|
1454
2352
|
key: 'reg.continueWithFailed',
|
|
1455
2353
|
kind: 'button',
|
|
1456
2354
|
en: 'Continue: run {f} failed and {n} queued task(s) in {s} session(s)',
|
|
1457
2355
|
bg: 'Продължи: пусни {f} провалили се и {n} чакащи задачи в {s} сесии',
|
|
1458
|
-
doesEn: 'The same button when a failed task would go back into the queue
|
|
1459
|
-
doesBg: 'Същият бутон, когато провалена задача се
|
|
2356
|
+
doesEn: 'The same button when a failed task of a chained session would go back into the queue with the queued ones.',
|
|
2357
|
+
doesBg: 'Същият бутон, когато провалена задача от сесия-верига би се върнала в опашката заедно с чакащите.',
|
|
1460
2358
|
},
|
|
1461
2359
|
{
|
|
1462
2360
|
key: 'reg.continuePanelTitle',
|
|
1463
2361
|
kind: 'note',
|
|
1464
2362
|
en: 'Before it continues',
|
|
1465
2363
|
bg: 'Преди да продължи',
|
|
1466
|
-
doesEn: 'The heading of
|
|
1467
|
-
doesBg: 'Заглавието на
|
|
2364
|
+
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.',
|
|
2365
|
+
doesBg: 'Заглавието на панела. Всеки кандидат има отметка — провалени от вериги, провалени независими, чакащите — отначало всички отметнати; пускането взима точно отметнатите, останалите остават, където са.',
|
|
2366
|
+
},
|
|
2367
|
+
{
|
|
2368
|
+
key: 'reg.pickOnly',
|
|
2369
|
+
kind: 'button',
|
|
2370
|
+
en: 'only this one',
|
|
2371
|
+
bg: 'само тази',
|
|
2372
|
+
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.',
|
|
2373
|
+
doesBg: 'До всяка задача в панела: маха отметките от всички други, така че пускането взима само нея — начинът да се пусне само задачата, чийто prompt току-що е поправен.',
|
|
2374
|
+
},
|
|
2375
|
+
{
|
|
2376
|
+
key: 'reg.pickAll',
|
|
2377
|
+
kind: 'button',
|
|
2378
|
+
en: 'All of them',
|
|
2379
|
+
bg: 'Всички',
|
|
2380
|
+
doesEn: 'In that panel: ticks every task.',
|
|
2381
|
+
doesBg: 'В панела: отметва всички задачи.',
|
|
2382
|
+
},
|
|
2383
|
+
{
|
|
2384
|
+
key: 'reg.pickNone',
|
|
2385
|
+
kind: 'button',
|
|
2386
|
+
en: 'None',
|
|
2387
|
+
bg: 'Нито една',
|
|
2388
|
+
doesEn: 'In that panel: unticks every task (the start buttons then do nothing until one is ticked).',
|
|
2389
|
+
doesBg: 'В панела: маха всички отметки (бутоните за пускане тогава не действат, докато не се отметне поне една).',
|
|
2390
|
+
},
|
|
2391
|
+
{
|
|
2392
|
+
key: 'reg.fixPrompt',
|
|
2393
|
+
kind: 'button',
|
|
2394
|
+
en: 'Fix the prompt and queue it again',
|
|
2395
|
+
bg: 'Поправи prompt-а и върни в опашката',
|
|
2396
|
+
doesEn: 'Beside a failed task in that panel: rewrite its text first; it comes back ticked and queued.',
|
|
2397
|
+
doesBg: 'До провалена задача в панела: първо пренапишете текста ѝ; тя се връща отметната и в опашката.',
|
|
2398
|
+
},
|
|
2399
|
+
{
|
|
2400
|
+
key: 'reg.continueGap',
|
|
2401
|
+
kind: 'note',
|
|
2402
|
+
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.',
|
|
2403
|
+
bg: '„{task}“ ({session}) е част от верига и тръгва без „{before}“, която е преди нея. Пуснете я сама, само ако не ѝ трябва работата на онази задача.',
|
|
2404
|
+
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.',
|
|
2405
|
+
doesBg: 'Казва се в панела, когато отметната задача от верига тръгва без по-ранна задача от сесията си. Предупреждение, не отказ.',
|
|
2406
|
+
},
|
|
2407
|
+
{
|
|
2408
|
+
key: 'batch.runName',
|
|
2409
|
+
kind: 'field',
|
|
2410
|
+
en: 'Name of this run',
|
|
2411
|
+
bg: 'Име на това пускане',
|
|
2412
|
+
doesEn: 'In that panel: the name of this run, suggested; the register groups by it and the downloads are named after it.',
|
|
2413
|
+
doesBg: 'В панела: името на това пускане, предложено; регистърът групира по него и изтеглянията се именуват по него.',
|
|
1468
2414
|
},
|
|
1469
2415
|
{
|
|
1470
2416
|
key: 'reg.continueUnattended',
|
|
1471
2417
|
kind: 'button',
|
|
1472
2418
|
en: 'Continue without asking',
|
|
1473
2419
|
bg: 'Продължи без да пита',
|
|
1474
|
-
doesEn: 'Starts the
|
|
1475
|
-
doesBg: 'Пуска
|
|
2420
|
+
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.',
|
|
2421
|
+
doesBg: 'Пуска точно отметнатите задачи и изпълнява всяка команда без питане (първо пита „сигурен ли си“, освен ако Настройките казват друго). Отметнатите провалени задачи тръгват отначало.',
|
|
1476
2422
|
},
|
|
1477
2423
|
{
|
|
1478
2424
|
key: 'reg.continueGo',
|
|
1479
2425
|
kind: 'button',
|
|
1480
2426
|
en: 'Continue, asking before each command',
|
|
1481
2427
|
bg: 'Продължи, с питане преди всяка команда',
|
|
1482
|
-
doesEn: 'Starts the
|
|
1483
|
-
doesBg: 'Пуска
|
|
2428
|
+
doesEn: 'Starts exactly the ticked tasks but stops for approval before every command.',
|
|
2429
|
+
doesBg: 'Пуска точно отметнатите задачи, но спира за одобрение преди всяка команда.',
|
|
1484
2430
|
},
|
|
1485
2431
|
{
|
|
1486
|
-
key: '
|
|
2432
|
+
key: 'dialog.cancel',
|
|
1487
2433
|
kind: 'button',
|
|
1488
|
-
en: '
|
|
1489
|
-
bg: '
|
|
1490
|
-
doesEn:
|
|
1491
|
-
doesBg: '
|
|
2434
|
+
en: 'Cancel',
|
|
2435
|
+
bg: 'Отказ',
|
|
2436
|
+
doesEn: 'Closes the panel without starting anything.',
|
|
2437
|
+
doesBg: 'Затваря панела, без да пуска нищо.',
|
|
1492
2438
|
},
|
|
1493
2439
|
],
|
|
1494
2440
|
},
|
|
@@ -1498,44 +2444,28 @@ export const SYSTEM_GUIDE = [
|
|
|
1498
2444
|
bg: 'Какво е направено',
|
|
1499
2445
|
controls: [
|
|
1500
2446
|
{
|
|
1501
|
-
key: 'reg.
|
|
1502
|
-
kind: 'note',
|
|
1503
|
-
en: 'stopped: {reason}',
|
|
1504
|
-
bg: 'спряна: {reason}',
|
|
1505
|
-
doesEn: 'In red on the row: why that task or attempt stopped without the work being done.',
|
|
1506
|
-
doesBg: 'В червено на реда: защо задачата или опитът е спрял, без работата да е свършена.',
|
|
1507
|
-
},
|
|
1508
|
-
{
|
|
1509
|
-
key: 'save.attemptLog',
|
|
2447
|
+
key: 'reg.pick',
|
|
1510
2448
|
kind: 'button',
|
|
1511
|
-
en:
|
|
1512
|
-
bg: '
|
|
1513
|
-
doesEn: '
|
|
1514
|
-
doesBg: '
|
|
2449
|
+
en: 'Choose tasks',
|
|
2450
|
+
bg: 'Избери задачи',
|
|
2451
|
+
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.',
|
|
2452
|
+
doesBg: 'Над свършените задачи, в изгледа „Поток“. Слага отметка на всяка изпълнена задача, през всички пускания, за да могат да се изберат няколко наведнъж.',
|
|
1515
2453
|
},
|
|
1516
2454
|
{
|
|
1517
|
-
key: '
|
|
2455
|
+
key: 'reg.bundle',
|
|
1518
2456
|
kind: 'button',
|
|
1519
|
-
en: '
|
|
1520
|
-
bg: '
|
|
1521
|
-
doesEn: '
|
|
1522
|
-
doesBg: '
|
|
1523
|
-
},
|
|
1524
|
-
{
|
|
1525
|
-
key: 'reg.retriedFreshDone',
|
|
1526
|
-
kind: 'badge',
|
|
1527
|
-
en: 'blocked, then done in a fresh chat ({n}×)',
|
|
1528
|
-
bg: 'блокира, после готова в нов чат ({n}×)',
|
|
1529
|
-
doesEn: 'The task was blocked and then finished in a new conversation, so the chat was the cause, not the task.',
|
|
1530
|
-
doesBg: 'Задачата е блокирала и после е станала готова в нов разговор — значи чатът е бил причината, не задачата.',
|
|
2457
|
+
en: 'Download plan, work and runner for the {n} chosen, as one file',
|
|
2458
|
+
bg: 'Изтегли план, работа и runner за избраните {n}, в един файл',
|
|
2459
|
+
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.',
|
|
2460
|
+
doesBg: 'Щом има отметнато: един JSON с трите изгледа на точно отметнатите задачи — файлът, който се иска, когато се търси защо нещо е тръгнало така. Кажи колко да се отметнат.',
|
|
1531
2461
|
},
|
|
1532
2462
|
{
|
|
1533
|
-
key: 'reg.
|
|
1534
|
-
kind: '
|
|
1535
|
-
en: '
|
|
1536
|
-
bg: '
|
|
1537
|
-
doesEn: '
|
|
1538
|
-
doesBg: '
|
|
2463
|
+
key: 'reg.pickDone',
|
|
2464
|
+
kind: 'button',
|
|
2465
|
+
en: 'Done choosing',
|
|
2466
|
+
bg: 'Готово с избора',
|
|
2467
|
+
doesEn: 'Leaves the choosing mode and clears the ticks.',
|
|
2468
|
+
doesBg: 'Излиза от режима на избор и маха отметките.',
|
|
1539
2469
|
},
|
|
1540
2470
|
],
|
|
1541
2471
|
},
|
|
@@ -1549,8 +2479,87 @@ export const SYSTEM_GUIDE = [
|
|
|
1549
2479
|
kind: 'button',
|
|
1550
2480
|
en: 'Save and queue again',
|
|
1551
2481
|
bg: 'Запази и върни в опашката',
|
|
1552
|
-
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.',
|
|
1553
|
-
doesBg: 'Запазва пренаписания текст и връща задачата в опашката с
|
|
2482
|
+
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.',
|
|
2483
|
+
doesBg: 'Запазва пренаписания текст и връща задачата в опашката с него; провалилият се опит остава в историята ѝ. Ниво 2, проверките и git имената остават каквито са. После „Продължи“ със „само тази“ я пуска сама.',
|
|
2484
|
+
},
|
|
2485
|
+
{
|
|
2486
|
+
key: 'dialog.cancel',
|
|
2487
|
+
kind: 'button',
|
|
2488
|
+
en: 'Cancel',
|
|
2489
|
+
bg: 'Отказ',
|
|
2490
|
+
doesEn: 'Closes the box and changes nothing.',
|
|
2491
|
+
doesBg: 'Затваря прозореца и не променя нищо.',
|
|
2492
|
+
},
|
|
2493
|
+
],
|
|
2494
|
+
},
|
|
2495
|
+
{
|
|
2496
|
+
headingKey: 'diff.title',
|
|
2497
|
+
en: 'Changes in "{title}"',
|
|
2498
|
+
bg: 'Промени в „{title}“',
|
|
2499
|
+
controls: [
|
|
2500
|
+
{
|
|
2501
|
+
key: 'diff.nextChange',
|
|
2502
|
+
kind: 'button',
|
|
2503
|
+
en: 'Next change',
|
|
2504
|
+
bg: 'Следваща промяна',
|
|
2505
|
+
doesEn: 'Jumps to the next edit (key n).',
|
|
2506
|
+
doesBg: 'Отива на следващата промяна (клавиш n).',
|
|
2507
|
+
},
|
|
2508
|
+
{
|
|
2509
|
+
key: 'diff.prevChange',
|
|
2510
|
+
kind: 'button',
|
|
2511
|
+
en: 'Previous change',
|
|
2512
|
+
bg: 'Предишна промяна',
|
|
2513
|
+
doesEn: 'The one before (key p).',
|
|
2514
|
+
doesBg: 'Предишната (клавиш p).',
|
|
2515
|
+
},
|
|
2516
|
+
{
|
|
2517
|
+
key: 'diff.nextFile',
|
|
2518
|
+
kind: 'button',
|
|
2519
|
+
en: 'Next file',
|
|
2520
|
+
bg: 'Следващ файл',
|
|
2521
|
+
doesEn: 'The next file in the list on the left (key ]).',
|
|
2522
|
+
doesBg: 'Следващият файл от списъка вляво (клавиш ]).',
|
|
2523
|
+
},
|
|
2524
|
+
{
|
|
2525
|
+
key: 'diff.prevFile',
|
|
2526
|
+
kind: 'button',
|
|
2527
|
+
en: 'Previous file',
|
|
2528
|
+
bg: 'Предишен файл',
|
|
2529
|
+
doesEn: 'The file before (key [).',
|
|
2530
|
+
doesBg: 'Предишният файл (клавиш [).',
|
|
2531
|
+
},
|
|
2532
|
+
{
|
|
2533
|
+
key: 'diff.gap',
|
|
2534
|
+
kind: 'button',
|
|
2535
|
+
en: '⋯ {n} unchanged line(s) — show them',
|
|
2536
|
+
bg: '⋯ {n} непроменени реда — покажи ги',
|
|
2537
|
+
doesEn: 'Opens a folded stretch of unchanged lines.',
|
|
2538
|
+
doesBg: 'Отваря сгънат участък непроменени редове.',
|
|
2539
|
+
},
|
|
2540
|
+
{
|
|
2541
|
+
key: 'diff.whole',
|
|
2542
|
+
kind: 'checkbox',
|
|
2543
|
+
en: 'Show the whole file',
|
|
2544
|
+
bg: 'Покажи целия файл',
|
|
2545
|
+
doesEn: 'Every line, nothing folded.',
|
|
2546
|
+
doesBg: 'Всички редове, нищо сгънато.',
|
|
2547
|
+
},
|
|
2548
|
+
{
|
|
2549
|
+
key: 'diff.wrap',
|
|
2550
|
+
kind: 'checkbox',
|
|
2551
|
+
en: 'Wrap long lines',
|
|
2552
|
+
bg: 'Пренасяй дългите редове',
|
|
2553
|
+
doesEn: 'Off: long lines stay on one line and the table scrolls sideways.',
|
|
2554
|
+
doesBg: 'Изключено: дългите редове остават на един ред и таблицата се превърта настрани.',
|
|
2555
|
+
},
|
|
2556
|
+
{
|
|
2557
|
+
key: 'diff.close',
|
|
2558
|
+
kind: 'button',
|
|
2559
|
+
en: 'Close',
|
|
2560
|
+
bg: 'Затвори',
|
|
2561
|
+
doesEn: 'Closes the view (Esc).',
|
|
2562
|
+
doesBg: 'Затваря изгледа (Esc).',
|
|
1554
2563
|
},
|
|
1555
2564
|
],
|
|
1556
2565
|
},
|
|
@@ -1568,6 +2577,22 @@ export const SYSTEM_GUIDE = [
|
|
|
1568
2577
|
en: 'The project you are working on',
|
|
1569
2578
|
bg: 'Проектът, по който се работи',
|
|
1570
2579
|
controls: [
|
|
2580
|
+
{
|
|
2581
|
+
key: 'def.title',
|
|
2582
|
+
kind: 'note',
|
|
2583
|
+
en: 'What every new session starts with',
|
|
2584
|
+
bg: 'С какво тръгва всяка нова сесия',
|
|
2585
|
+
doesEn: 'The page\'s top heading.',
|
|
2586
|
+
doesBg: 'Горното заглавие на страницата.',
|
|
2587
|
+
},
|
|
2588
|
+
{
|
|
2589
|
+
key: 'def.saveAnyway',
|
|
2590
|
+
kind: 'button',
|
|
2591
|
+
en: 'Save',
|
|
2592
|
+
bg: 'Запази',
|
|
2593
|
+
doesEn: 'Under each block: does nothing new — everything on this page saves itself; it is there for those who look for one.',
|
|
2594
|
+
doesBg: 'Под всеки блок: не прави нищо ново — всичко на страницата се записва само; стои там за тези, които го търсят.',
|
|
2595
|
+
},
|
|
1571
2596
|
{
|
|
1572
2597
|
key: 'def.autoSave',
|
|
1573
2598
|
kind: 'note',
|
|
@@ -1616,6 +2641,22 @@ export const SYSTEM_GUIDE = [
|
|
|
1616
2641
|
doesEn: 'Copies every project on this page to its own Desktop folder before each run, which is how the files reach the chat.',
|
|
1617
2642
|
doesBg: 'Копира всеки проект от тази страница в собствена папка на Desktop-а преди всяко пускане — така файловете стигат до чата.',
|
|
1618
2643
|
},
|
|
2644
|
+
{
|
|
2645
|
+
key: 'proj.folders',
|
|
2646
|
+
kind: 'disclosure',
|
|
2647
|
+
en: 'Folders that go to the Desktop',
|
|
2648
|
+
bg: 'Папки, които отиват на Desktop-а',
|
|
2649
|
+
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.',
|
|
2650
|
+
doesBg: 'На всеки проект: кои папки отиват в копието на Desktop-а — същите списъци за включване и изключване и дърво с папки като на страницата на сесия.',
|
|
2651
|
+
},
|
|
2652
|
+
{
|
|
2653
|
+
key: 'proj.affects',
|
|
2654
|
+
kind: 'note',
|
|
2655
|
+
en: 'What this changes, and what it does not',
|
|
2656
|
+
bg: 'Какво променя това и какво не',
|
|
2657
|
+
doesEn: 'Says what changing the project folder changes (new sessions) and what it does not (sessions that exist).',
|
|
2658
|
+
doesBg: 'Казва какво променя смяната на папката на проекта (новите сесии) и какво не (съществуващите).',
|
|
2659
|
+
},
|
|
1619
2660
|
],
|
|
1620
2661
|
},
|
|
1621
2662
|
{
|
|
@@ -1647,6 +2688,30 @@ export const SYSTEM_GUIDE = [
|
|
|
1647
2688
|
doesEn: 'Saves the typed name and folder as another project; it stays dead until both boxes are filled.',
|
|
1648
2689
|
doesBg: 'Запазва въведените име и папка като още един проект; неактивен е, докато и двете полета не са попълнени.',
|
|
1649
2690
|
},
|
|
2691
|
+
{
|
|
2692
|
+
key: 'proj.otherRemove',
|
|
2693
|
+
kind: 'button',
|
|
2694
|
+
en: 'Remove',
|
|
2695
|
+
bg: 'Махни',
|
|
2696
|
+
doesEn: 'On an extra project: removes it from the list (nothing on disk is touched).',
|
|
2697
|
+
doesBg: 'На допълнителен проект: маха го от списъка (нищо на диска не се пипа).',
|
|
2698
|
+
},
|
|
2699
|
+
{
|
|
2700
|
+
key: 'proj.toSessions',
|
|
2701
|
+
kind: 'button',
|
|
2702
|
+
en: 'To the sessions',
|
|
2703
|
+
bg: 'Към сесиите',
|
|
2704
|
+
doesEn: 'Goes to the sessions list on `/`.',
|
|
2705
|
+
doesBg: 'Отива на списъка със сесии на `/`.',
|
|
2706
|
+
},
|
|
2707
|
+
{
|
|
2708
|
+
key: 'proj.toImport',
|
|
2709
|
+
kind: 'button',
|
|
2710
|
+
en: 'To the plan import',
|
|
2711
|
+
bg: 'Към внасянето на план',
|
|
2712
|
+
doesEn: 'Goes to the plan import on `/import`.',
|
|
2713
|
+
doesBg: 'Отива на внасянето на план на `/import`.',
|
|
2714
|
+
},
|
|
1650
2715
|
],
|
|
1651
2716
|
},
|
|
1652
2717
|
{
|
|
@@ -1734,27 +2799,107 @@ export const SYSTEM_GUIDE = [
|
|
|
1734
2799
|
},
|
|
1735
2800
|
{
|
|
1736
2801
|
key: 'exec.isolation',
|
|
1737
|
-
kind: '
|
|
2802
|
+
kind: 'select',
|
|
1738
2803
|
en: 'Where the bot runs',
|
|
1739
2804
|
bg: 'Къде върви ботът',
|
|
1740
|
-
doesEn:
|
|
1741
|
-
doesBg: '
|
|
2805
|
+
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.',
|
|
2806
|
+
doesBg: 'Какво огражда този runner, по думите на оператора. С „Никъде специално — в този акаунт“ пусканията без надзор се отказват; „В този акаунт — приемам пускане без надзор без изолация“ ги позволява на отговорност на оператора.',
|
|
2807
|
+
},
|
|
2808
|
+
{
|
|
2809
|
+
key: 'exec.isolationNone',
|
|
2810
|
+
kind: 'select',
|
|
2811
|
+
en: 'Nowhere in particular — this account',
|
|
2812
|
+
bg: 'Никъде специално — в този акаунт',
|
|
2813
|
+
doesEn: 'The default: no unattended runs.',
|
|
2814
|
+
doesBg: 'По подразбиране: без пускания без надзор.',
|
|
2815
|
+
},
|
|
2816
|
+
{
|
|
2817
|
+
key: 'exec.isolationNoneAccepted',
|
|
2818
|
+
kind: 'select',
|
|
2819
|
+
en: 'This account — I accept unattended runs without isolation',
|
|
2820
|
+
bg: 'В този акаунт — приемам пускане без надзор без изолация',
|
|
2821
|
+
doesEn: 'Unattended runs allowed in this account, on the operator\'s responsibility.',
|
|
2822
|
+
doesBg: 'Пусканията без надзор са позволени в този акаунт, на отговорност на оператора.',
|
|
2823
|
+
},
|
|
2824
|
+
{
|
|
2825
|
+
key: 'exec.isolationAccount',
|
|
2826
|
+
kind: 'select',
|
|
2827
|
+
en: 'A separate low-privilege Windows account',
|
|
2828
|
+
bg: 'Отделен Windows акаунт с малки права',
|
|
2829
|
+
doesEn: 'The bot runs as a separate low-privilege account.',
|
|
2830
|
+
doesBg: 'Ботът върви като отделен акаунт с малки права.',
|
|
2831
|
+
},
|
|
2832
|
+
{
|
|
2833
|
+
key: 'exec.isolationSandbox',
|
|
2834
|
+
kind: 'select',
|
|
2835
|
+
en: 'Windows Sandbox',
|
|
2836
|
+
bg: 'Windows Sandbox',
|
|
2837
|
+
doesEn: 'The bot runs in Windows Sandbox.',
|
|
2838
|
+
doesBg: 'Ботът върви в Windows Sandbox.',
|
|
2839
|
+
},
|
|
2840
|
+
{
|
|
2841
|
+
key: 'exec.isolationVm',
|
|
2842
|
+
kind: 'select',
|
|
2843
|
+
en: 'A virtual machine',
|
|
2844
|
+
bg: 'Виртуална машина',
|
|
2845
|
+
doesEn: 'The bot runs in a virtual machine.',
|
|
2846
|
+
doesBg: 'Ботът върви във виртуална машина.',
|
|
1742
2847
|
},
|
|
1743
2848
|
{
|
|
1744
2849
|
key: 'exec.startMode',
|
|
1745
2850
|
kind: 'select',
|
|
1746
2851
|
en: 'Starting a run without supervision',
|
|
1747
2852
|
bg: 'Пускане без надзор',
|
|
1748
|
-
doesEn: 'Whether the run buttons
|
|
1749
|
-
doesBg: 'Дали
|
|
2853
|
+
doesEn: 'Whether the unattended run buttons ask "are you sure" first or simply start. Step by step stays beside them.',
|
|
2854
|
+
doesBg: 'Дали бутоните за пускане без надзор първо питат „сигурен ли си“ или просто тръгват. „Стъпка по стъпка“ остава до тях.',
|
|
2855
|
+
},
|
|
2856
|
+
{
|
|
2857
|
+
key: 'exec.startModeAsk',
|
|
2858
|
+
kind: 'select',
|
|
2859
|
+
en: 'Ask "are you sure" every time',
|
|
2860
|
+
bg: 'Питай „сигурен ли си“ всеки път',
|
|
2861
|
+
doesEn: 'The default: every unattended start asks "are you sure" first.',
|
|
2862
|
+
doesBg: 'По подразбиране: всяко пускане без надзор първо пита „сигурен ли си“.',
|
|
2863
|
+
},
|
|
2864
|
+
{
|
|
2865
|
+
key: 'exec.startModeAuto',
|
|
2866
|
+
kind: 'select',
|
|
2867
|
+
en: 'Start it without asking',
|
|
2868
|
+
bg: 'Пускай, без да питаш',
|
|
2869
|
+
doesEn: 'Unattended starts go at once, without the question.',
|
|
2870
|
+
doesBg: 'Пусканията без надзор тръгват веднага, без въпроса.',
|
|
1750
2871
|
},
|
|
1751
2872
|
{
|
|
1752
2873
|
key: 'exec.networkFetch',
|
|
1753
2874
|
kind: 'select',
|
|
1754
2875
|
en: 'A command that downloads, in a run without supervision',
|
|
1755
2876
|
bg: 'Команда, която тегли от интернет, при пускане без надзор',
|
|
1756
|
-
doesEn: 'What a run without supervision does with Invoke-WebRequest, curl
|
|
1757
|
-
doesBg: 'Какво прави пускане без надзор с Invoke-WebRequest, curl
|
|
2877
|
+
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.',
|
|
2878
|
+
doesBg: 'Какво прави пускане без надзор с Invoke-WebRequest, curl и подобни: чака оператора, отказва я обратно на чата или я изпълнява непрочетена. Стъпка по стъпка така или иначе показва всяка команда.',
|
|
2879
|
+
},
|
|
2880
|
+
{
|
|
2881
|
+
key: 'exec.networkFetchAsk',
|
|
2882
|
+
kind: 'select',
|
|
2883
|
+
en: 'Wait for me on the approval screen',
|
|
2884
|
+
bg: 'Чакай ме на екрана за одобрение',
|
|
2885
|
+
doesEn: 'The default: a downloading command waits on the approval banner even in a run without supervision.',
|
|
2886
|
+
doesBg: 'По подразбиране: команда, която тегли, чака в лентата за одобрение дори при пускане без надзор.',
|
|
2887
|
+
},
|
|
2888
|
+
{
|
|
2889
|
+
key: 'exec.networkFetchRefuse',
|
|
2890
|
+
kind: 'select',
|
|
2891
|
+
en: 'Refuse it and tell the chat why — the run never waits',
|
|
2892
|
+
bg: 'Откажи я и кажи на чата защо — пускането никога не чака',
|
|
2893
|
+
doesEn: 'It is refused and the chat is told why and what to do instead; the run never waits.',
|
|
2894
|
+
doesBg: 'Отказва се и чатът научава защо и какво да направи вместо това; пускането никога не чака.',
|
|
2895
|
+
},
|
|
2896
|
+
{
|
|
2897
|
+
key: 'exec.networkFetchRun',
|
|
2898
|
+
kind: 'select',
|
|
2899
|
+
en: 'Run it without asking',
|
|
2900
|
+
bg: 'Изпълни я, без да питаш',
|
|
2901
|
+
doesEn: 'It runs without anyone reading it. Only on a machine where that is acceptable.',
|
|
2902
|
+
doesBg: 'Изпълнява се, без някой да я е прочел. Само на машина, където това е приемливо.',
|
|
1758
2903
|
},
|
|
1759
2904
|
],
|
|
1760
2905
|
},
|
|
@@ -1859,6 +3004,14 @@ export const SYSTEM_GUIDE = [
|
|
|
1859
3004
|
doesEn: 'Removes that preset from the list for good, after a confirmation.',
|
|
1860
3005
|
doesBg: 'Маха шаблона от списъка завинаги, след потвърждение.',
|
|
1861
3006
|
},
|
|
3007
|
+
{
|
|
3008
|
+
key: 'presets.show',
|
|
3009
|
+
kind: 'disclosure',
|
|
3010
|
+
en: 'show',
|
|
3011
|
+
bg: 'покажи',
|
|
3012
|
+
doesEn: 'On a saved preset: unfolds its text.',
|
|
3013
|
+
doesBg: 'На запазен шаблон: разгъва текста му.',
|
|
3014
|
+
},
|
|
1862
3015
|
],
|
|
1863
3016
|
},
|
|
1864
3017
|
],
|
|
@@ -1875,6 +3028,14 @@ export const SYSTEM_GUIDE = [
|
|
|
1875
3028
|
en: 'Appearance',
|
|
1876
3029
|
bg: 'Изглед',
|
|
1877
3030
|
controls: [
|
|
3031
|
+
{
|
|
3032
|
+
key: 'ap.theme',
|
|
3033
|
+
kind: 'note',
|
|
3034
|
+
en: 'Theme',
|
|
3035
|
+
bg: 'Тема',
|
|
3036
|
+
doesEn: 'The heading above the two theme buttons.',
|
|
3037
|
+
doesBg: 'Заглавието над двата бутона за тема.',
|
|
3038
|
+
},
|
|
1878
3039
|
{
|
|
1879
3040
|
key: 'theme.light',
|
|
1880
3041
|
kind: 'radio',
|
|
@@ -1893,6 +3054,84 @@ export const SYSTEM_GUIDE = [
|
|
|
1893
3054
|
},
|
|
1894
3055
|
],
|
|
1895
3056
|
},
|
|
3057
|
+
{
|
|
3058
|
+
headingKey: 'ap.size',
|
|
3059
|
+
en: 'Text size',
|
|
3060
|
+
bg: 'Размер на текста',
|
|
3061
|
+
controls: [
|
|
3062
|
+
{
|
|
3063
|
+
key: 'ap.sizeNormal',
|
|
3064
|
+
kind: 'button',
|
|
3065
|
+
en: 'Normal',
|
|
3066
|
+
bg: 'Нормален',
|
|
3067
|
+
doesEn: 'Normal text size.',
|
|
3068
|
+
doesBg: 'Нормален размер на текста.',
|
|
3069
|
+
},
|
|
3070
|
+
{
|
|
3071
|
+
key: 'ap.sizeLarge',
|
|
3072
|
+
kind: 'button',
|
|
3073
|
+
en: 'Large',
|
|
3074
|
+
bg: 'Голям',
|
|
3075
|
+
doesEn: 'Larger text.',
|
|
3076
|
+
doesBg: 'По-голям текст.',
|
|
3077
|
+
},
|
|
3078
|
+
{
|
|
3079
|
+
key: 'ap.sizeHuge',
|
|
3080
|
+
kind: 'button',
|
|
3081
|
+
en: 'Largest',
|
|
3082
|
+
bg: 'Най-голям',
|
|
3083
|
+
doesEn: 'The largest text.',
|
|
3084
|
+
doesBg: 'Най-големият текст.',
|
|
3085
|
+
},
|
|
3086
|
+
],
|
|
3087
|
+
},
|
|
3088
|
+
{
|
|
3089
|
+
headingKey: 'ap.a11y',
|
|
3090
|
+
en: 'Accessibility',
|
|
3091
|
+
bg: 'Достъпност',
|
|
3092
|
+
controls: [
|
|
3093
|
+
{
|
|
3094
|
+
key: 'ap.contrast',
|
|
3095
|
+
kind: 'checkbox',
|
|
3096
|
+
en: 'Higher contrast',
|
|
3097
|
+
bg: 'По-висок контраст',
|
|
3098
|
+
doesEn: 'Stronger colours and borders.',
|
|
3099
|
+
doesBg: 'По-силни цветове и рамки.',
|
|
3100
|
+
},
|
|
3101
|
+
{
|
|
3102
|
+
key: 'ap.motion',
|
|
3103
|
+
kind: 'checkbox',
|
|
3104
|
+
en: 'Less motion',
|
|
3105
|
+
bg: 'По-малко движение',
|
|
3106
|
+
doesEn: 'Turns off animations such as the pulsing live dot.',
|
|
3107
|
+
doesBg: 'Изключва анимациите, например пулсиращата точка на живо.',
|
|
3108
|
+
},
|
|
3109
|
+
{
|
|
3110
|
+
key: 'ap.links',
|
|
3111
|
+
kind: 'checkbox',
|
|
3112
|
+
en: 'Underline every link',
|
|
3113
|
+
bg: 'Подчертавай всички връзки',
|
|
3114
|
+
doesEn: 'Underlines every link.',
|
|
3115
|
+
doesBg: 'Подчертава всяка връзка.',
|
|
3116
|
+
},
|
|
3117
|
+
{
|
|
3118
|
+
key: 'ap.focus',
|
|
3119
|
+
kind: 'checkbox',
|
|
3120
|
+
en: 'Thick focus outline',
|
|
3121
|
+
bg: 'Дебел фокусен контур',
|
|
3122
|
+
doesEn: 'A thick outline around whatever has the keyboard focus.',
|
|
3123
|
+
doesBg: 'Дебел контур около това, което е на фокус от клавиатурата.',
|
|
3124
|
+
},
|
|
3125
|
+
{
|
|
3126
|
+
key: 'ap.reset',
|
|
3127
|
+
kind: 'button',
|
|
3128
|
+
en: 'Back to the defaults',
|
|
3129
|
+
bg: 'Върни настройките по подразбиране',
|
|
3130
|
+
doesEn: 'Puts every appearance setting back.',
|
|
3131
|
+
doesBg: 'Връща всички настройки на външния вид.',
|
|
3132
|
+
},
|
|
3133
|
+
],
|
|
3134
|
+
},
|
|
1896
3135
|
],
|
|
1897
3136
|
},
|
|
1898
3137
|
{
|
|
@@ -1907,6 +3146,22 @@ export const SYSTEM_GUIDE = [
|
|
|
1907
3146
|
en: 'This machine',
|
|
1908
3147
|
bg: 'Тази машина',
|
|
1909
3148
|
controls: [
|
|
3149
|
+
{
|
|
3150
|
+
key: 'sys.signin',
|
|
3151
|
+
kind: 'note',
|
|
3152
|
+
en: 'Sign-in',
|
|
3153
|
+
bg: 'Вписване',
|
|
3154
|
+
doesEn: 'The block about the bot\'s browser profile and its sign-in.',
|
|
3155
|
+
doesBg: 'Блокът за профила на браузъра на бота и вписването в него.',
|
|
3156
|
+
},
|
|
3157
|
+
{
|
|
3158
|
+
key: 'sys.settings',
|
|
3159
|
+
kind: 'note',
|
|
3160
|
+
en: 'Settings',
|
|
3161
|
+
bg: 'Настройки',
|
|
3162
|
+
doesEn: 'The block showing the settings as saved and the paths they resolve to.',
|
|
3163
|
+
doesBg: 'Блокът с настройките, както са запазени, и пътищата, до които водят.',
|
|
3164
|
+
},
|
|
1910
3165
|
{
|
|
1911
3166
|
key: 'sys.profileHeld',
|
|
1912
3167
|
kind: 'note',
|
|
@@ -1915,6 +3170,30 @@ export const SYSTEM_GUIDE = [
|
|
|
1915
3170
|
doesEn: 'The line to look for when a run will not start: a stray Edge window has the profile open.',
|
|
1916
3171
|
doesBg: 'Редът, който се търси, когато пускане не тръгва: чужд прозорец на Edge държи профила отворен.',
|
|
1917
3172
|
},
|
|
3173
|
+
{
|
|
3174
|
+
key: 'sys.profileMissing',
|
|
3175
|
+
kind: 'note',
|
|
3176
|
+
en: '(not created yet: run cop login)',
|
|
3177
|
+
bg: '(още не е създаден: пуснете cop login)',
|
|
3178
|
+
doesEn: 'The bot\'s browser profile does not exist yet: the operator has to run "cop login" once.',
|
|
3179
|
+
doesBg: 'Профилът на браузъра на бота още не съществува: операторът трябва веднъж да пусне „cop login“.',
|
|
3180
|
+
},
|
|
3181
|
+
{
|
|
3182
|
+
key: 'sys.profileBot',
|
|
3183
|
+
kind: 'note',
|
|
3184
|
+
en: 'In use by the bot\'s own run right now ({n} Edge process(es)). That is expected while a session runs.',
|
|
3185
|
+
bg: 'В момента се ползва от собственото изпълнение на бота ({n} процеса на Edge). Това е очаквано, докато сесия работи.',
|
|
3186
|
+
doesEn: 'The profile is held by the bot\'s own run right now — nothing to close.',
|
|
3187
|
+
doesBg: 'Профилът в момента се държи от собственото пускане на бота — няма какво да се затваря.',
|
|
3188
|
+
},
|
|
3189
|
+
{
|
|
3190
|
+
key: 'sys.profileFree',
|
|
3191
|
+
kind: 'note',
|
|
3192
|
+
en: 'free',
|
|
3193
|
+
bg: 'свободен',
|
|
3194
|
+
doesEn: 'Nothing holds the profile; a run can start.',
|
|
3195
|
+
doesBg: 'Нищо не държи профила; пускане може да тръгне.',
|
|
3196
|
+
},
|
|
1918
3197
|
],
|
|
1919
3198
|
},
|
|
1920
3199
|
],
|
|
@@ -1931,10 +3210,10 @@ const KIND_WORDS = {
|
|
|
1931
3210
|
tab: { en: 'tab', bg: 'раздел' },
|
|
1932
3211
|
badge: { en: 'badge', bg: 'етикет' },
|
|
1933
3212
|
disclosure: { en: 'fold', bg: 'разгъване' },
|
|
1934
|
-
note: { en: '
|
|
3213
|
+
note: { en: 'text', bg: 'текст' },
|
|
1935
3214
|
};
|
|
1936
|
-
const INTRO_EN = 'Every label in quotes below is the exact text on the screen. Name the control by that text — press "Check it" — instead of describing it, and give the route so the operator knows which page they are on. A label with {braces} in it is filled in with numbers or names at the time.';
|
|
1937
|
-
const INTRO_BG = 'Всеки надпис в кавички по-долу е точният текст на екрана. Назовавай контрола с този текст — натисни „Провери“ — вместо да го описваш, и казвай маршрута, за да знае операторът на коя страница е. Надпис с {скоби} се попълва с числа или имена в момента.';
|
|
3215
|
+
const INTRO_EN = 'Every label in quotes below is the exact text on the screen. Name the control by that text — press "Check it" — instead of describing it, and give the route so the operator knows which page they are on. A label with {braces} in it is filled in with numbers or names at the time. A label with no kind after it is a button.';
|
|
3216
|
+
const INTRO_BG = 'Всеки надпис в кавички по-долу е точният текст на екрана. Назовавай контрола с този текст — натисни „Провери“ — вместо да го описваш, и казвай маршрута, за да знае операторът на коя страница е. Надпис с {скоби} се попълва с числа или имена в момента. Надпис без вид след него е бутон.';
|
|
1938
3217
|
/**
|
|
1939
3218
|
* The guide as the Markdown section the brief embeds. Dense on purpose: the brief is pasted
|
|
1940
3219
|
* into a chat window by hand and read by a model, so the words and what they do earn their
|
|
@@ -1954,8 +3233,10 @@ export function systemGuideSection(lang) {
|
|
|
1954
3233
|
lines.push('');
|
|
1955
3234
|
lines.push(`**${bg ? section.bg : section.en}**`);
|
|
1956
3235
|
for (const control of section.controls) {
|
|
1957
|
-
|
|
1958
|
-
|
|
3236
|
+
// A button is the common case and is said once in the introduction instead of on 120 lines:
|
|
3237
|
+
// the brief is pasted into a chat whose composer has a limit, and this is where it goes.
|
|
3238
|
+
const kind = control.kind === 'button' ? '' : ` (${KIND_WORDS[control.kind][lang]})`;
|
|
3239
|
+
lines.push(`- "${bg ? control.bg : control.en}"${kind} — ${bg ? control.doesBg : control.doesEn}`);
|
|
1959
3240
|
}
|
|
1960
3241
|
}
|
|
1961
3242
|
}
|