copilot-operator 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +556 -0
- package/dist/src/api/app.module.js +18 -0
- package/dist/src/api/dataAcl.js +109 -0
- package/dist/src/api/folderPicker.js +110 -0
- package/dist/src/api/main.js +132 -0
- package/dist/src/api/operator.controller.js +975 -0
- package/dist/src/api/operator.service.js +1971 -0
- package/dist/src/api/saveToDesktop.js +157 -0
- package/dist/src/api/security.js +225 -0
- package/dist/src/api/settings.js +57 -0
- package/dist/src/cli.js +531 -0
- package/dist/src/config/layout.js +66 -0
- package/dist/src/config/lockedPolicy.js +176 -0
- package/dist/src/config/schema.js +487 -0
- package/dist/src/context/contextFiles.js +295 -0
- package/dist/src/context/desktopMirror.js +113 -0
- package/dist/src/context/projectMirror.js +364 -0
- package/dist/src/exec/authorizer.js +61 -0
- package/dist/src/exec/checks.js +285 -0
- package/dist/src/exec/confinement.js +224 -0
- package/dist/src/exec/dangerous.js +161 -0
- package/dist/src/exec/environment.js +80 -0
- package/dist/src/exec/isolation.js +166 -0
- package/dist/src/exec/network.js +242 -0
- package/dist/src/exec/policy.js +201 -0
- package/dist/src/exec/policyManifest.js +84 -0
- package/dist/src/exec/processes.js +329 -0
- package/dist/src/exec/programs.js +290 -0
- package/dist/src/exec/redaction.js +93 -0
- package/dist/src/exec/reportFile.js +154 -0
- package/dist/src/exec/runner.js +245 -0
- package/dist/src/exec/scriptFiles.js +81 -0
- package/dist/src/exec/shellExecuteTrap.js +221 -0
- package/dist/src/exec/shells.js +298 -0
- package/dist/src/exec/stepEnv.js +72 -0
- package/dist/src/exec/winps.js +17 -0
- package/dist/src/exec/workDir.js +94 -0
- package/dist/src/log/runLog.js +43 -0
- package/dist/src/orchestrator/derivedChecks.js +95 -0
- package/dist/src/orchestrator/review.js +590 -0
- package/dist/src/orchestrator/taskRunner.js +1582 -0
- package/dist/src/plan/brief.js +1785 -0
- package/dist/src/plan/importPlan.js +202 -0
- package/dist/src/plan/schema.js +483 -0
- package/dist/src/plan/script.js +1012 -0
- package/dist/src/plan/systemGuide.js +1851 -0
- package/dist/src/protocol/parser.js +224 -0
- package/dist/src/protocol/replySchema.js +207 -0
- package/dist/src/protocol/reporter.js +75 -0
- package/dist/src/protocol/reviewSchema.js +205 -0
- package/dist/src/session/compose.js +67 -0
- package/dist/src/session/debugExport.js +165 -0
- package/dist/src/session/events.js +34 -0
- package/dist/src/session/exportRecord.js +261 -0
- package/dist/src/session/exports.js +484 -0
- package/dist/src/session/model.js +22 -0
- package/dist/src/session/retention.js +34 -0
- package/dist/src/session/runName.js +36 -0
- package/dist/src/session/store.js +440 -0
- package/dist/src/session/story.js +198 -0
- package/dist/src/transport/acceptance.js +34 -0
- package/dist/src/transport/chatSession.js +73 -0
- package/dist/src/transport/copilotTransport.js +1208 -0
- package/dist/src/transport/edgeCrash.js +59 -0
- package/dist/src/transport/locators.js +261 -0
- package/dist/src/transport/profileLock.js +102 -0
- package/dist/src/util/pacing.js +89 -0
- package/dist/src/vcs/commitHygiene.js +102 -0
- package/dist/src/vcs/git.js +286 -0
- package/dist/src/vcs/taskVcs.js +343 -0
- package/dist/web/404.html +15 -0
- package/dist/web/_next/static/chunks/12.f1f4d35b52633e8d.js +1 -0
- package/dist/web/_next/static/chunks/131-bae98f790a541679.js +1 -0
- package/dist/web/_next/static/chunks/197-f7c33a0114fc3db3.js +1 -0
- package/dist/web/_next/static/chunks/489.158bbe303a595fba.js +1 -0
- package/dist/web/_next/static/chunks/643-34b9f66a6c317c4a.js +1 -0
- package/dist/web/_next/static/chunks/867-03b7cac8f79896c3.js +1 -0
- package/dist/web/_next/static/chunks/955-63de06e182d98949.js +1 -0
- package/dist/web/_next/static/chunks/app/_not-found/page-0d0d8e7e62efca12.js +1 -0
- package/dist/web/_next/static/chunks/app/appearance/page-501842e7aeac7f6b.js +1 -0
- package/dist/web/_next/static/chunks/app/defaults/page-ed858127cbdfb4ab.js +1 -0
- package/dist/web/_next/static/chunks/app/history/page-bad4f3e89b485719.js +1 -0
- package/dist/web/_next/static/chunks/app/import/page-db1f5f1ab2f5cad1.js +1 -0
- package/dist/web/_next/static/chunks/app/layout-72251c52cc54f95e.js +1 -0
- package/dist/web/_next/static/chunks/app/level1/page-cf3e50cf64fecf4f.js +1 -0
- package/dist/web/_next/static/chunks/app/page-6fd16e5c8cf3b20f.js +1 -0
- package/dist/web/_next/static/chunks/app/presets/page-951e78b80e0e22e6.js +1 -0
- package/dist/web/_next/static/chunks/app/sessions/view/page-f2e63618097d7221.js +1 -0
- package/dist/web/_next/static/chunks/app/system/page-44e7954c0e48f4ba.js +1 -0
- package/dist/web/_next/static/chunks/c7879cf7-b5ab1053c1d9a2e7.js +1 -0
- package/dist/web/_next/static/chunks/framework-9ac6a346bd42cedd.js +1 -0
- package/dist/web/_next/static/chunks/main-6be4444e2d667e41.js +1 -0
- package/dist/web/_next/static/chunks/main-app-e3a5f713ba31557e.js +1 -0
- package/dist/web/_next/static/chunks/pages/_app-32d20d5a04949d29.js +1 -0
- package/dist/web/_next/static/chunks/pages/_error-abbab53f25ea29b0.js +1 -0
- package/dist/web/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dist/web/_next/static/chunks/webpack-0f31b926d9a9c5a4.js +1 -0
- package/dist/web/_next/static/css/d77735cdc9020a86.css +1 -0
- package/dist/web/_next/static/u8rZNwh4d3n-HGJnfZ72Y/_buildManifest.js +1 -0
- package/dist/web/_next/static/u8rZNwh4d3n-HGJnfZ72Y/_ssgManifest.js +1 -0
- package/dist/web/appearance.html +15 -0
- package/dist/web/appearance.txt +26 -0
- package/dist/web/defaults.html +15 -0
- package/dist/web/defaults.txt +26 -0
- package/dist/web/history.html +15 -0
- package/dist/web/history.txt +26 -0
- package/dist/web/import.html +15 -0
- package/dist/web/import.txt +26 -0
- package/dist/web/index.html +15 -0
- package/dist/web/index.txt +26 -0
- package/dist/web/level1.html +15 -0
- package/dist/web/level1.txt +26 -0
- package/dist/web/presets.html +18 -0
- package/dist/web/presets.txt +26 -0
- package/dist/web/sessions/view.html +15 -0
- package/dist/web/sessions/view.txt +26 -0
- package/dist/web/system.html +15 -0
- package/dist/web/system.txt +26 -0
- package/package.json +111 -0
- package/prompts/level1.md +535 -0
- package/prompts/organisation.bg.md +44 -0
- package/prompts/organisation.en.md +44 -0
- package/prompts/persona.bg.md +17 -0
- package/prompts/persona.en.md +17 -0
- package/prompts/review1.md +277 -0
- package/prompts/work.bg.md +19 -0
- package/prompts/work.en.md +19 -0
|
@@ -0,0 +1,1851 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What this application's screens are called, written down once so the persona can quote them.
|
|
3
|
+
*
|
|
4
|
+
* Kerrigan plans the work, walks the operator through running it and validates what came back,
|
|
5
|
+
* and it does all of that blind: it is a conversation in somebody else's chat window, with no
|
|
6
|
+
* view of the browser the operator is looking at. Left to itself it speaks in generalities —
|
|
7
|
+
* "open the import page and paste the plan there" — and the operator has to translate that into
|
|
8
|
+
* the button in front of them. This module removes the translation step. It records, screen by
|
|
9
|
+
* screen, the exact words printed on every control the operator is ever told to press or read,
|
|
10
|
+
* in both languages the interface speaks, with one sentence saying what each of them does. The
|
|
11
|
+
* brief embeds the rendered form of it, so the persona can say press "Create the sessions and
|
|
12
|
+
* tasks" and be quoting the screen rather than describing it.
|
|
13
|
+
*
|
|
14
|
+
* The labels are duplicated here rather than imported, and that is deliberate. `src/` is the
|
|
15
|
+
* Node ESM server build; `web/lib/strings.ts` is a browser module inside the Next workspace,
|
|
16
|
+
* and this file has to stay importable by the API with no bundler in the way. Duplication of
|
|
17
|
+
* this kind normally rots, so it is pinned instead of trusted: `test/guide.check.ts` holds
|
|
18
|
+
* every label below against that dictionary, key by key, in English and in Bulgarian, and
|
|
19
|
+
* fails the moment the two disagree. A label renamed in the interface therefore breaks a check
|
|
20
|
+
* that names the key, which is how whoever renamed it learns that the persona's script has to
|
|
21
|
+
* follow.
|
|
22
|
+
*
|
|
23
|
+
* The guide is read by a language model inside a prompt that is already long, so it is a
|
|
24
|
+
* selection and not an inventory: the controls an operator is actually told to press, the
|
|
25
|
+
* badges they are told to read back, and nothing else. Add to it when a new control is one the
|
|
26
|
+
* persona would name — and when adding one, take the label from `web/lib/strings.ts` character
|
|
27
|
+
* for character, because the check is unforgiving about it.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* The screens in the order the operator meets them: the navigation that reaches everything,
|
|
31
|
+
* then the import page that hands out the brief, the sessions list, one session, the register
|
|
32
|
+
* where a run is watched and continued, and last the pages that are set once and left alone.
|
|
33
|
+
*/
|
|
34
|
+
export const SYSTEM_GUIDE = [
|
|
35
|
+
{
|
|
36
|
+
route: 'every page',
|
|
37
|
+
nameEn: 'The header and the navigation',
|
|
38
|
+
nameBg: 'Заглавната лента и навигацията',
|
|
39
|
+
purposeEn: 'The links down the side of every page, the language switch, and the two buttons of the box that asks before anything irreversible.',
|
|
40
|
+
purposeBg: 'Връзките отстрани на всяка страница, смяната на езика и двата бутона на прозореца, който пита преди нещо необратимо.',
|
|
41
|
+
sections: [
|
|
42
|
+
{
|
|
43
|
+
headingKey: 'nav.label',
|
|
44
|
+
en: 'Main',
|
|
45
|
+
bg: 'Основно',
|
|
46
|
+
controls: [
|
|
47
|
+
{
|
|
48
|
+
key: 'nav.sessions',
|
|
49
|
+
kind: 'link',
|
|
50
|
+
en: 'Sessions',
|
|
51
|
+
bg: 'Сесии',
|
|
52
|
+
doesEn: 'Opens the sessions list at /, where sessions are created and a run is started.',
|
|
53
|
+
doesBg: 'Отваря списъка със сесии на /, откъдето се създават сесии и се пуска изпълнение.',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
key: 'nav.import',
|
|
57
|
+
kind: 'link',
|
|
58
|
+
en: 'Plan from JSON',
|
|
59
|
+
bg: 'План от JSON',
|
|
60
|
+
doesEn: 'Opens the page that hands out the brief and turns the JSON back into sessions and tasks.',
|
|
61
|
+
doesBg: 'Отваря страницата, която дава заданието и превръща JSON-а обратно в сесии и задачи.',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
key: 'nav.history',
|
|
65
|
+
kind: 'link',
|
|
66
|
+
en: 'Task register',
|
|
67
|
+
bg: 'Регистър на задачите',
|
|
68
|
+
doesEn: 'Opens the register of every task, where a run is watched and continued.',
|
|
69
|
+
doesBg: 'Отваря регистъра на всички задачи, откъдето се следи и продължава едно изпълнение.',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
key: 'nav.defaults',
|
|
73
|
+
kind: 'link',
|
|
74
|
+
en: 'Settings',
|
|
75
|
+
bg: 'Настройки',
|
|
76
|
+
doesEn: 'Opens what every new session starts with: the project folders and the two models.',
|
|
77
|
+
doesBg: 'Отваря това, с което тръгва всяка нова сесия: папките на проектите и двата модела.',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
key: 'nav.level1',
|
|
81
|
+
kind: 'link',
|
|
82
|
+
en: 'Level 1 prompt',
|
|
83
|
+
bg: 'Основен prompt',
|
|
84
|
+
doesEn: 'Opens the base prompt sent once at the start of every conversation.',
|
|
85
|
+
doesBg: 'Отваря основния prompt, изпращан веднъж в началото на всеки разговор.',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
key: 'nav.presets',
|
|
89
|
+
kind: 'link',
|
|
90
|
+
en: 'Level 2 presets',
|
|
91
|
+
bg: 'Шаблони ниво 2',
|
|
92
|
+
doesEn: 'Opens the saved level 2 instruction blocks that a task can be given.',
|
|
93
|
+
doesBg: 'Отваря запазените блокове с инструкции от ниво 2, които може да се дадат на задача.',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
key: 'nav.appearance',
|
|
97
|
+
kind: 'link',
|
|
98
|
+
en: 'Appearance',
|
|
99
|
+
bg: 'Изглед',
|
|
100
|
+
doesEn: 'Opens the theme, text size and accessibility options for this browser only.',
|
|
101
|
+
doesBg: 'Отваря темата, размера на текста и настройките за достъпност само за този браузър.',
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
key: 'nav.system',
|
|
105
|
+
kind: 'link',
|
|
106
|
+
en: 'System',
|
|
107
|
+
bg: 'Система',
|
|
108
|
+
doesEn: "Opens the read-only report on this machine: Node, Edge and the bot's browser profile.",
|
|
109
|
+
doesBg: 'Отваря отчета за тази машина, само за четене: Node, Edge и профилът на браузъра на бота.',
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
key: 'lang.label',
|
|
113
|
+
kind: 'select',
|
|
114
|
+
en: 'Language',
|
|
115
|
+
bg: 'Език',
|
|
116
|
+
doesEn: 'Switches the whole interface, and the brief it hands out, between English and Bulgarian.',
|
|
117
|
+
doesBg: 'Превключва целия интерфейс и заданието, което дава, между английски и български.',
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
headingKey: 'dialog.confirmTitle',
|
|
123
|
+
en: 'Are you sure?',
|
|
124
|
+
bg: 'Сигурни ли сте?',
|
|
125
|
+
controls: [
|
|
126
|
+
{
|
|
127
|
+
key: 'dialog.ok',
|
|
128
|
+
kind: 'button',
|
|
129
|
+
en: 'OK',
|
|
130
|
+
bg: 'Добре',
|
|
131
|
+
doesEn: 'Confirms the question and lets the action that asked it go ahead.',
|
|
132
|
+
doesBg: 'Потвърждава въпроса и пуска действието, което го е задало.',
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
key: 'dialog.cancel',
|
|
136
|
+
kind: 'button',
|
|
137
|
+
en: 'Cancel',
|
|
138
|
+
bg: 'Отказ',
|
|
139
|
+
doesEn: 'Closes the question and does nothing; the action is abandoned.',
|
|
140
|
+
doesBg: 'Затваря въпроса и не прави нищо; действието се отказва.',
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
route: '/import',
|
|
148
|
+
nameEn: 'Plan from JSON',
|
|
149
|
+
nameBg: 'План от JSON',
|
|
150
|
+
purposeEn: 'Where the brief is copied out to a chat and the JSON it writes is brought back, checked and turned into sessions and tasks. Nothing is started from here.',
|
|
151
|
+
purposeBg: 'Оттук се копира заданието към чата и тук се връща JSON-ът, който той е написал: проверява се и става сесии и задачи. Нищо не се стартира от тази страница.',
|
|
152
|
+
sections: [
|
|
153
|
+
{
|
|
154
|
+
headingKey: 'plan.step1',
|
|
155
|
+
en: '1. Take this to the chat',
|
|
156
|
+
bg: '1. Занесете това в чата',
|
|
157
|
+
controls: [
|
|
158
|
+
{
|
|
159
|
+
key: 'plan.copyBrief',
|
|
160
|
+
kind: 'button',
|
|
161
|
+
en: 'Copy the brief',
|
|
162
|
+
bg: 'Копирай заданието',
|
|
163
|
+
doesEn: 'Puts the whole brief on the clipboard; paste it into a fresh chat conversation.',
|
|
164
|
+
doesBg: 'Слага цялото задание в клипборда; поставете го в нов разговор с чат модел.',
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
key: 'plan.softwarePart',
|
|
168
|
+
kind: 'disclosure',
|
|
169
|
+
en: 'Software level (fixed)',
|
|
170
|
+
bg: 'Софтуерно ниво (фиксирано)',
|
|
171
|
+
doesEn: 'Unfolds the fixed part of the brief, the part that belongs to this project; read-only.',
|
|
172
|
+
doesBg: 'Разгъва фиксираната част на заданието — тази на самия проект; само за четене.',
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
key: 'plan.briefLang',
|
|
176
|
+
kind: 'note',
|
|
177
|
+
en: 'The brief is in the language this interface is in.',
|
|
178
|
+
bg: 'Заданието е на езика, на който е този интерфейс.',
|
|
179
|
+
doesEn: 'Switch the language in the header first if the brief should come out in the other one.',
|
|
180
|
+
doesBg: 'Ако заданието трябва да излезе на другия език, първо сменете езика в заглавната лента.',
|
|
181
|
+
},
|
|
182
|
+
],
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
headingKey: 'plan.orgPart',
|
|
186
|
+
en: 'How work is done here: the organisation and the projects',
|
|
187
|
+
bg: 'Как се работи тук: организацията и проектите',
|
|
188
|
+
controls: [
|
|
189
|
+
{
|
|
190
|
+
key: 'plan.ctxEmpty',
|
|
191
|
+
kind: 'badge',
|
|
192
|
+
en: 'empty — Kerrigan will ask',
|
|
193
|
+
bg: 'празно — Kerrigan ще пита',
|
|
194
|
+
doesEn: 'Beside the heading while the box is blank: the brief will interview the operator about it.',
|
|
195
|
+
doesBg: 'До заглавието, докато полето е празно: заданието ще разпита оператора за него.',
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
key: 'plan.ctxWritten',
|
|
199
|
+
kind: 'badge',
|
|
200
|
+
en: 'written',
|
|
201
|
+
bg: 'написано',
|
|
202
|
+
doesEn: 'Beside the heading once something is saved: every copy of the brief carries it and the questions stop.',
|
|
203
|
+
doesBg: 'До заглавието, щом има запазен текст: всяко копие на заданието го носи и въпросите спират.',
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
key: 'plan.ctxClear',
|
|
207
|
+
kind: 'button',
|
|
208
|
+
en: 'Empty this',
|
|
209
|
+
bg: 'Изпразни',
|
|
210
|
+
doesEn: 'Wipes the saved text after one confirmation, so the brief asks about it again.',
|
|
211
|
+
doesBg: 'Изтрива запазения текст след едно потвърждение, за да пита заданието пак за него.',
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
key: 'def.savedAutomatically',
|
|
215
|
+
kind: 'note',
|
|
216
|
+
en: 'saved as you type',
|
|
217
|
+
bg: 'запазва се, докато пишете',
|
|
218
|
+
doesEn: 'The box writes itself; there is no save button to look for.',
|
|
219
|
+
doesBg: 'Полето се запазва само; няма бутон за запазване, който да търсите.',
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
headingKey: 'plan.personaPart',
|
|
225
|
+
en: 'How the tasks are carried out: the agent\'s persona',
|
|
226
|
+
bg: 'Как се изпълняват задачите: персоната на агента',
|
|
227
|
+
controls: [
|
|
228
|
+
{
|
|
229
|
+
key: 'plan.ctxClear',
|
|
230
|
+
kind: 'button',
|
|
231
|
+
en: 'Empty this',
|
|
232
|
+
bg: 'Изпразни',
|
|
233
|
+
doesEn: 'The same button under the second box: wipes the persona, so the brief asks for one again before any plan is written. A session already imported keeps the persona it was created with.',
|
|
234
|
+
doesBg: 'Същият бутон под второто поле: изтрива персоната, за да поиска заданието нова, преди да се пише план. Вече импортирана сесия пази персоната, с която е създадена.',
|
|
235
|
+
},
|
|
236
|
+
],
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
headingKey: 'plan.workPart',
|
|
240
|
+
en: 'This work',
|
|
241
|
+
bg: 'Тази работа',
|
|
242
|
+
controls: [
|
|
243
|
+
{
|
|
244
|
+
key: 'plan.ctxClear',
|
|
245
|
+
kind: 'button',
|
|
246
|
+
en: 'Empty this',
|
|
247
|
+
bg: 'Изпразни',
|
|
248
|
+
doesEn: 'The same button under the third box: wipes the description of the work in hand.',
|
|
249
|
+
doesBg: 'Същият бутон под третото поле: изтрива описанието на текущата работа.',
|
|
250
|
+
},
|
|
251
|
+
],
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
headingKey: 'plan.step2',
|
|
255
|
+
en: '2. Bring the answer back',
|
|
256
|
+
bg: '2. Върнете отговора тук',
|
|
257
|
+
controls: [
|
|
258
|
+
{
|
|
259
|
+
key: 'plan.placeholder',
|
|
260
|
+
kind: 'field',
|
|
261
|
+
en: 'Paste the JSON the chat model wrote…',
|
|
262
|
+
bg: 'Поставете JSON-а, който чат моделът е написал…',
|
|
263
|
+
doesEn: 'The large box. Prose and code fences around the JSON are stripped, so paste the reply whole.',
|
|
264
|
+
doesBg: 'Голямото поле. Текстът и ограждащите блокове около JSON-а се махат, така че поставете отговора цял.',
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
key: 'plan.browse',
|
|
268
|
+
kind: 'button',
|
|
269
|
+
en: 'Choose a file…',
|
|
270
|
+
bg: 'Изберете файл…',
|
|
271
|
+
doesEn: 'Reads a .json or text file into that box instead of pasting.',
|
|
272
|
+
doesBg: 'Прочита .json или текстов файл в полето, вместо да поставяте текст.',
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
key: 'plan.check',
|
|
276
|
+
kind: 'button',
|
|
277
|
+
en: 'Check it',
|
|
278
|
+
bg: 'Провери',
|
|
279
|
+
doesEn: 'Validates the JSON and creates nothing: it reports either the errors or what would be created.',
|
|
280
|
+
doesBg: 'Проверява JSON-а, без да създава нищо: показва или грешките, или какво би било създадено.',
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
key: 'plan.import',
|
|
284
|
+
kind: 'button',
|
|
285
|
+
en: 'Create the sessions and tasks',
|
|
286
|
+
bg: 'Създай сесиите и задачите',
|
|
287
|
+
doesEn: 'Creates the sessions and their tasks. Nothing is started, and the box is emptied afterwards.',
|
|
288
|
+
doesBg: 'Създава сесиите и задачите им. Нищо не се стартира, а полето се изпразва накрая.',
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
key: 'plan.clear',
|
|
292
|
+
kind: 'button',
|
|
293
|
+
en: 'Clear',
|
|
294
|
+
bg: 'Изчисти',
|
|
295
|
+
doesEn: 'Empties the box and drops the check result, without creating or deleting anything.',
|
|
296
|
+
doesBg: 'Изпразва полето и маха резултата от проверката, без да създава или изтрива нищо.',
|
|
297
|
+
},
|
|
298
|
+
],
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
headingKey: 'plan.issues',
|
|
302
|
+
en: 'What is wrong',
|
|
303
|
+
bg: 'Какво не е наред',
|
|
304
|
+
controls: [
|
|
305
|
+
{
|
|
306
|
+
key: 'plan.copyIssues',
|
|
307
|
+
kind: 'button',
|
|
308
|
+
en: 'Copy the errors',
|
|
309
|
+
bg: 'Копирай грешките',
|
|
310
|
+
doesEn: 'Copies every error with the path of the field it is about, to paste back into the same conversation.',
|
|
311
|
+
doesBg: 'Копира всяка грешка с пътя до полето, за което е, за да я върнете в същия разговор.',
|
|
312
|
+
},
|
|
313
|
+
],
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
headingKey: 'plan.preview',
|
|
317
|
+
en: 'What will be created',
|
|
318
|
+
bg: 'Какво ще бъде създадено',
|
|
319
|
+
controls: [
|
|
320
|
+
{
|
|
321
|
+
key: 'plan.valid',
|
|
322
|
+
kind: 'note',
|
|
323
|
+
en: 'This is a plan this system can read: {sessions} session(s), {tasks} task(s).',
|
|
324
|
+
bg: 'Това е план, който системата разбира: {sessions} сесия(и), {tasks} задача(и).',
|
|
325
|
+
doesEn: 'The line that says the check passed, with the table of sessions and tasks below it.',
|
|
326
|
+
doesBg: 'Редът, който казва, че проверката е минала, с таблицата на сесиите и задачите отдолу.',
|
|
327
|
+
},
|
|
328
|
+
],
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
headingKey: 'plan.step3',
|
|
332
|
+
en: '3. Check it, then start it yourself',
|
|
333
|
+
bg: '3. Прегледайте и стартирайте сами',
|
|
334
|
+
controls: [
|
|
335
|
+
{
|
|
336
|
+
key: 'plan.runThese',
|
|
337
|
+
kind: 'button',
|
|
338
|
+
en: 'Run these sessions',
|
|
339
|
+
bg: 'Пусни тези сесии',
|
|
340
|
+
doesEn: 'Opens the sessions list with exactly the new sessions ticked; the run still has to be started there.',
|
|
341
|
+
doesBg: 'Отваря списъка със сесии с отметнати точно новите; пускането пак се стартира оттам.',
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
key: 'plan.toSessions',
|
|
345
|
+
kind: 'button',
|
|
346
|
+
en: 'To the sessions list',
|
|
347
|
+
bg: 'Към списъка със сесии',
|
|
348
|
+
doesEn: 'Opens the sessions list with nothing ticked.',
|
|
349
|
+
doesBg: 'Отваря списъка със сесии, без нищо отметнато.',
|
|
350
|
+
},
|
|
351
|
+
],
|
|
352
|
+
},
|
|
353
|
+
],
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
route: '/',
|
|
357
|
+
nameEn: 'Sessions',
|
|
358
|
+
nameBg: 'Сесии',
|
|
359
|
+
purposeEn: 'The list of every session on this machine: where one is created, where several are ticked and started one after another, and where a stopped step waits for a decision.',
|
|
360
|
+
purposeBg: 'Списъкът с всички сесии на машината: тук се създава сесия, тук се отмятат няколко и тръгват една след друга, и тук спряна стъпка чака решение.',
|
|
361
|
+
sections: [
|
|
362
|
+
{
|
|
363
|
+
headingKey: null,
|
|
364
|
+
en: 'Shown only when this browser has not been given the API key',
|
|
365
|
+
bg: 'Показва се само когато този браузър още няма ключа за API-то',
|
|
366
|
+
controls: [
|
|
367
|
+
{
|
|
368
|
+
key: 'home.noToken',
|
|
369
|
+
kind: 'note',
|
|
370
|
+
en: 'This browser does not have the key to the API yet.',
|
|
371
|
+
bg: 'Този браузър още няма ключа за API-то.',
|
|
372
|
+
doesEn: 'The page was started without the API key; start it with npm start, which hands the key over.',
|
|
373
|
+
doesBg: 'Страницата е пусната без ключа за API-то; пуснете я с npm start, който го предава.',
|
|
374
|
+
},
|
|
375
|
+
],
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
headingKey: 'home.new',
|
|
379
|
+
en: 'New session',
|
|
380
|
+
bg: 'Нова сесия',
|
|
381
|
+
controls: [
|
|
382
|
+
{
|
|
383
|
+
key: 'home.namePlaceholder',
|
|
384
|
+
kind: 'field',
|
|
385
|
+
en: 'Session name, e.g. payments-service',
|
|
386
|
+
bg: 'Име на сесията, напр. payments-service',
|
|
387
|
+
doesEn: 'The name of the session to create; Enter creates it just as the button does.',
|
|
388
|
+
doesBg: 'Името на сесията, която ще се създаде; Enter я създава също като бутона.',
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
key: 'home.create',
|
|
392
|
+
kind: 'button',
|
|
393
|
+
en: 'Create',
|
|
394
|
+
bg: 'Създай',
|
|
395
|
+
doesEn: 'Creates the session under that name and opens its own page.',
|
|
396
|
+
doesBg: 'Създава сесията с това име и отваря нейната страница.',
|
|
397
|
+
},
|
|
398
|
+
],
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
headingKey: 'batch.title',
|
|
402
|
+
en: 'Run several sessions',
|
|
403
|
+
bg: 'Пускане на няколко сесии',
|
|
404
|
+
controls: [
|
|
405
|
+
{
|
|
406
|
+
key: 'batch.selectQueued',
|
|
407
|
+
kind: 'button',
|
|
408
|
+
en: 'Select every session with something queued',
|
|
409
|
+
bg: 'Избери всички сесии с нещо в опашката',
|
|
410
|
+
doesEn: 'Ticks every session that still has a queued task, oldest first, replacing whatever was ticked.',
|
|
411
|
+
doesBg: 'Отмята всяка сесия с чакаща задача, от най-старата нататък, и заменя досегашния избор.',
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
key: 'batch.runName',
|
|
415
|
+
kind: 'field',
|
|
416
|
+
en: 'Name of this run',
|
|
417
|
+
bg: 'Име на това пускане',
|
|
418
|
+
doesEn: 'Names the run: the register groups its tasks under this name and the exports are named after it.',
|
|
419
|
+
doesBg: 'Дава име на пускането: под него регистърът групира задачите му и по него се именуват изтеглянията.',
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
key: 'batch.model',
|
|
423
|
+
kind: 'select',
|
|
424
|
+
en: 'Model for this run',
|
|
425
|
+
bg: 'Модел за това изпълнение',
|
|
426
|
+
doesEn: 'The Copilot model this run works on; the choice is written onto every ticked session before it starts.',
|
|
427
|
+
doesBg: 'Моделът на Copilot за това пускане; изборът се записва върху всяка отметната сесия преди старта.',
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
key: 'batch.reviewModel',
|
|
431
|
+
kind: 'select',
|
|
432
|
+
en: 'Model that reviews the work',
|
|
433
|
+
bg: 'Модел, който проверява работата',
|
|
434
|
+
doesEn: 'The model that reviews each task afterwards, chosen separately from the one doing the work.',
|
|
435
|
+
doesBg: 'Моделът, който проверява всяка задача после, избран отделно от този, който върши работата.',
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
key: 'batch.run',
|
|
439
|
+
kind: 'button',
|
|
440
|
+
en: 'Run {n} session(s)',
|
|
441
|
+
bg: 'Пусни {n} сесия(и)',
|
|
442
|
+
doesEn: 'Starts the ticked sessions one after another and runs every command without asking; it confirms once first.',
|
|
443
|
+
doesBg: 'Пуска отметнатите сесии една след друга и изпълнява всяка команда без питане; първо иска едно потвърждение.',
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
key: 'batch.runStep',
|
|
447
|
+
kind: 'button',
|
|
448
|
+
en: 'Step by step',
|
|
449
|
+
bg: 'Стъпка по стъпка',
|
|
450
|
+
doesEn: 'Starts the same sessions but stops before every command and waits for a decision.',
|
|
451
|
+
doesBg: 'Пуска същите сесии, но спира преди всяка команда и чака решение.',
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
key: 'batch.notStartedTitle',
|
|
455
|
+
kind: 'note',
|
|
456
|
+
en: 'The run did not start',
|
|
457
|
+
bg: 'Пускането не тръгна',
|
|
458
|
+
doesEn: 'The box over the two run buttons when a press was refused, with the reason under it. Nothing was opened and nothing ran; read the reason before pressing again.',
|
|
459
|
+
doesBg: 'Карето над двата бутона за пускане, когато натискането е отказано, с причината под него. Нищо не е отваряно и нищо не е пускано; прочети причината, преди да натиснеш пак.',
|
|
460
|
+
},
|
|
461
|
+
{
|
|
462
|
+
key: 'batch.notStartedIsolation',
|
|
463
|
+
kind: 'link',
|
|
464
|
+
en: 'Settings → "Where the bot runs": choose where the bot runs, or accept unattended runs without isolation',
|
|
465
|
+
bg: 'Настройки → „Къде върви ботът“: изберете къде върви ботът или приемете пускане без надзор без изолация',
|
|
466
|
+
doesEn: 'Under that box when the refusal is about isolation: opens /defaults, where "Where the bot runs" decides whether a run with nobody watching may start here.',
|
|
467
|
+
doesBg: 'Под това каре, когато отказът е заради изолацията: отваря /defaults, където „Къде върви ботът“ решава дали тук може да тръгне пускане без надзор.',
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
key: 'batch.stop',
|
|
471
|
+
kind: 'button',
|
|
472
|
+
en: 'Stop after the current step',
|
|
473
|
+
bg: 'Спри след текущата стъпка',
|
|
474
|
+
doesEn: 'Shown while a run is going: ends it once the step in progress finishes. The task it interrupts ends "not done", part-done — say so, and offer the pause instead when the operator only wants to think.',
|
|
475
|
+
doesBg: 'Показва се по време на пускане: спира го след текущата стъпка. Задачата, която прекъсва, завършва „неизпълнена“, наполовина — кажи го и предложи паузата, ако операторът само иска да помисли.',
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
key: 'batch.pause',
|
|
479
|
+
kind: 'button',
|
|
480
|
+
en: 'Pause after this task',
|
|
481
|
+
bg: 'Пауза след тази задача',
|
|
482
|
+
doesEn: 'Holds the run without losing anything: the task that is running finishes properly — its checks, its review, its commit — and the rest stays queued. This is what to press after a failure, before deciding anything.',
|
|
483
|
+
doesBg: 'Спира пускането, без да се губи нищо: задачата, която върви, приключва както трябва — проверките ѝ, рецензията ѝ, комитът ѝ — а останалото си стои в опашката. Това се натиска след провал, преди каквото и да е решение.',
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
key: 'batch.resume',
|
|
487
|
+
kind: 'button',
|
|
488
|
+
en: 'Take the hold off',
|
|
489
|
+
bg: 'Махни паузата',
|
|
490
|
+
doesEn: 'Replaces the pause button once it is pressed. Carries on with the queue, if the paused task is still running.',
|
|
491
|
+
doesBg: 'Заменя бутона за пауза, след като е натиснат. Продължава с опашката, ако паузираната задача още върви.',
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
key: 'batch.debug',
|
|
495
|
+
kind: 'link',
|
|
496
|
+
en: 'Download everything as JSON',
|
|
497
|
+
bg: 'Изтегли всичко като JSON',
|
|
498
|
+
doesEn: 'One JSON file with every step, exit code, summary, review and commit of those sessions.',
|
|
499
|
+
doesBg: 'Един JSON файл с всяка стъпка, код на изход, обяснение, рецензия и комит на тези сесии.',
|
|
500
|
+
},
|
|
501
|
+
{
|
|
502
|
+
key: 'batch.finished',
|
|
503
|
+
kind: 'note',
|
|
504
|
+
en: 'Finished: {done} done, {failed} failed, {skipped} not run.',
|
|
505
|
+
bg: 'Приключи: {done} успешни, {failed} провалени, {skipped} неизпълнени.',
|
|
506
|
+
doesEn: 'The line that appears when a run ends; it is the first thing to read back after one.',
|
|
507
|
+
doesBg: 'Редът, който се появява в края на пускането; той се чете пръв след него.',
|
|
508
|
+
},
|
|
509
|
+
],
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
headingKey: 'batch.onFailure',
|
|
513
|
+
en: 'If a session fails',
|
|
514
|
+
bg: 'Ако сесия се провали',
|
|
515
|
+
controls: [
|
|
516
|
+
{
|
|
517
|
+
key: 'batch.chain',
|
|
518
|
+
kind: 'radio',
|
|
519
|
+
en: 'Stop, and leave the rest as they are',
|
|
520
|
+
bg: 'Спри и остави останалите както са',
|
|
521
|
+
doesEn: 'A failed session stops the run; the sessions queued after it are never started.',
|
|
522
|
+
doesBg: 'Провалена сесия спира пускането; сесиите след нея изобщо не тръгват.',
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
key: 'batch.independent',
|
|
526
|
+
kind: 'radio',
|
|
527
|
+
en: 'Carry on with the next session',
|
|
528
|
+
bg: 'Продължи със следващата сесия',
|
|
529
|
+
doesEn: 'The run goes on to the next session even after one fails.',
|
|
530
|
+
doesBg: 'Пускането продължава със следващата сесия дори след провал.',
|
|
531
|
+
},
|
|
532
|
+
],
|
|
533
|
+
},
|
|
534
|
+
{
|
|
535
|
+
headingKey: 'approval.waitingHere',
|
|
536
|
+
en: 'A step is waiting for your decision',
|
|
537
|
+
bg: 'Стъпка чака вашето решение',
|
|
538
|
+
controls: [
|
|
539
|
+
{
|
|
540
|
+
key: 'approval.run',
|
|
541
|
+
kind: 'button',
|
|
542
|
+
en: 'Run',
|
|
543
|
+
bg: 'Изпълни',
|
|
544
|
+
doesEn: 'Runs that one command now and lets the task carry on to its next step.',
|
|
545
|
+
doesBg: 'Изпълнява точно тази команда сега и пуска задачата към следващата ѝ стъпка.',
|
|
546
|
+
},
|
|
547
|
+
{
|
|
548
|
+
key: 'approval.runAll',
|
|
549
|
+
kind: 'button',
|
|
550
|
+
en: 'Run this and the rest without asking',
|
|
551
|
+
bg: 'Изпълни без да питаш повече',
|
|
552
|
+
doesEn: 'Runs it and stops asking about every command after it until this run ends, except a command that downloads from the internet. Not offered on such a command.',
|
|
553
|
+
doesBg: 'Изпълнява я и спира да пита за следващите команди до края на това пускане, освен за команда, която тегли от интернет. Не се предлага на такава команда.',
|
|
554
|
+
},
|
|
555
|
+
{
|
|
556
|
+
key: 'approval.network',
|
|
557
|
+
kind: 'note',
|
|
558
|
+
en: 'This command downloads from the internet. The bot never does that on its own, even in a run that does not ask, because a later step could run what arrived. Run it only if you know what it fetches and why.',
|
|
559
|
+
bg: 'Тази команда тегли от интернет. Ботът никога не го прави сам, дори при пускане без питане, защото следваща стъпка може да пусне изтегленото. Изпълнете я само ако знаете какво тегли и защо.',
|
|
560
|
+
doesEn: 'Shown on a step that fetches from the network. Such a step waits here in every run, including one that does not ask; requests to localhost and package installs through npm or dotnet do not.',
|
|
561
|
+
doesBg: 'Показва се на стъпка, която тегли от мрежата. Такава стъпка чака тук при всяко пускане, включително без питане; заявки към localhost и пакети през npm или dotnet не чакат.',
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
key: 'approval.skip',
|
|
565
|
+
kind: 'button',
|
|
566
|
+
en: 'Skip',
|
|
567
|
+
bg: 'Пропусни',
|
|
568
|
+
doesEn: 'Leaves that command unrun and moves the task on to its next step.',
|
|
569
|
+
doesBg: 'Оставя командата неизпълнена и мести задачата към следващата ѝ стъпка.',
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
key: 'approval.abort',
|
|
573
|
+
kind: 'button',
|
|
574
|
+
en: 'Abort task',
|
|
575
|
+
bg: 'Прекрати задачата',
|
|
576
|
+
doesEn: 'Ends the whole task here; its remaining steps are not run.',
|
|
577
|
+
doesBg: 'Прекратява цялата задача тук; останалите ѝ стъпки не се изпълняват.',
|
|
578
|
+
},
|
|
579
|
+
],
|
|
580
|
+
},
|
|
581
|
+
{
|
|
582
|
+
headingKey: 'home.sessions',
|
|
583
|
+
en: 'Sessions',
|
|
584
|
+
bg: 'Сесии',
|
|
585
|
+
controls: [
|
|
586
|
+
{
|
|
587
|
+
key: 'home.tickForBoth',
|
|
588
|
+
kind: 'note',
|
|
589
|
+
en: 'The ticks choose what to run and what to delete. Only sessions with something queued can be run.',
|
|
590
|
+
bg: 'Отметките избират какво да се пусне и какво да се изтрие. Пускат се само сесии с нещо в опашката.',
|
|
591
|
+
doesEn: 'One set of tick boxes serves both the run panel above and the delete button here.',
|
|
592
|
+
doesBg: 'Един набор отметки обслужва и панела за пускане горе, и бутона за изтриване тук.',
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
key: 'home.deleteSelected',
|
|
596
|
+
kind: 'button',
|
|
597
|
+
en: 'Delete the {n} selected',
|
|
598
|
+
bg: 'Изтрий избраните {n}',
|
|
599
|
+
doesEn: 'Deletes every ticked session after one question; the run folders and the chats survive.',
|
|
600
|
+
doesBg: 'Изтрива всички отметнати сесии след един въпрос; папките под runs/ и разговорите остават.',
|
|
601
|
+
},
|
|
602
|
+
{
|
|
603
|
+
key: 'home.delete',
|
|
604
|
+
kind: 'button',
|
|
605
|
+
en: 'Delete',
|
|
606
|
+
bg: 'Изтрий',
|
|
607
|
+
doesEn: 'Removes that one session from the list; a running session has to be stopped first.',
|
|
608
|
+
doesBg: 'Маха точно тази сесия от списъка; работеща сесия първо трябва да се спре.',
|
|
609
|
+
},
|
|
610
|
+
{
|
|
611
|
+
key: 'state.running',
|
|
612
|
+
kind: 'badge',
|
|
613
|
+
en: 'running',
|
|
614
|
+
bg: 'работи',
|
|
615
|
+
doesEn: 'That session is working right now, so it cannot be ticked, deleted or added to a run.',
|
|
616
|
+
doesBg: 'Сесията работи в момента, затова не може да се отмята, изтрива или включва в пускане.',
|
|
617
|
+
},
|
|
618
|
+
{
|
|
619
|
+
key: 'state.idle',
|
|
620
|
+
kind: 'badge',
|
|
621
|
+
en: 'idle',
|
|
622
|
+
bg: 'свободна',
|
|
623
|
+
doesEn: 'Not working: it either has tasks waiting in its queue or has never been run.',
|
|
624
|
+
doesBg: 'Не работи: или има задачи в опашката си, или изобщо не е пускана.',
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
key: 'state.completed',
|
|
628
|
+
kind: 'badge',
|
|
629
|
+
en: 'completed',
|
|
630
|
+
bg: 'завършена',
|
|
631
|
+
doesEn: 'Every task of that session ended done and nothing is queued.',
|
|
632
|
+
doesBg: 'Всяка задача на сесията е приключила готова и нищо не чака в опашката.',
|
|
633
|
+
},
|
|
634
|
+
{
|
|
635
|
+
key: 'state.ended',
|
|
636
|
+
kind: 'badge',
|
|
637
|
+
en: 'ended, with failures',
|
|
638
|
+
bg: 'приключила, с провали',
|
|
639
|
+
doesEn: 'Every task ended, but some did not end done; nothing is queued.',
|
|
640
|
+
doesBg: 'Всички задачи са приключили, но някои не са готови; нищо не чака в опашката.',
|
|
641
|
+
},
|
|
642
|
+
],
|
|
643
|
+
},
|
|
644
|
+
],
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
route: '/sessions/view?id=…',
|
|
648
|
+
nameEn: 'One session',
|
|
649
|
+
nameBg: 'Една сесия',
|
|
650
|
+
purposeEn: 'Everything about one session: how it is configured, the queue of tasks with what each of them did, and the buttons that start, stop, edit and re-run the work.',
|
|
651
|
+
purposeBg: 'Всичко за една сесия: как е настроена, опашката със задачите и какво е свършила всяка от тях, плюс бутоните, с които работата тръгва, спира, се редактира и се пуска отново.',
|
|
652
|
+
sections: [
|
|
653
|
+
{
|
|
654
|
+
headingKey: null,
|
|
655
|
+
en: 'The strip beside the session name, at the top of the page',
|
|
656
|
+
bg: 'Лентата до името на сесията, в началото на страницата',
|
|
657
|
+
controls: [
|
|
658
|
+
{
|
|
659
|
+
key: 'session.run',
|
|
660
|
+
kind: 'button',
|
|
661
|
+
en: 'Run {n} task(s)',
|
|
662
|
+
bg: 'Пусни {n} задача(и)',
|
|
663
|
+
doesEn: 'Starts the queued tasks and runs every command without asking; it confirms once first.',
|
|
664
|
+
doesBg: 'Пуска чакащите задачи и изпълнява всяка команда без питане; първо иска едно потвърждение.',
|
|
665
|
+
},
|
|
666
|
+
{
|
|
667
|
+
key: 'session.runStep',
|
|
668
|
+
kind: 'button',
|
|
669
|
+
en: 'Step by step',
|
|
670
|
+
bg: 'Стъпка по стъпка',
|
|
671
|
+
doesEn: 'Starts the same queue but stops before every command and waits for a decision.',
|
|
672
|
+
doesBg: 'Пуска същата опашка, но спира преди всяка команда и чака решение.',
|
|
673
|
+
},
|
|
674
|
+
{
|
|
675
|
+
key: 'session.stop',
|
|
676
|
+
kind: 'button',
|
|
677
|
+
en: 'Stop after current step',
|
|
678
|
+
bg: 'Спри след текущата стъпка',
|
|
679
|
+
doesEn: 'Stops the run as soon as the command now executing finishes; the rest stay queued.',
|
|
680
|
+
doesBg: 'Спира пускането, щом текущата команда приключи; останалите задачи остават да чакат.',
|
|
681
|
+
},
|
|
682
|
+
{
|
|
683
|
+
key: 'session.askAgain',
|
|
684
|
+
kind: 'button',
|
|
685
|
+
en: 'Ask me again on every step',
|
|
686
|
+
bg: 'Питай ме пак на всяка стъпка',
|
|
687
|
+
doesEn: 'Puts a running session back to asking for approval before every further command.',
|
|
688
|
+
doesBg: 'Връща работеща сесия към питане за одобрение преди всяка следваща команда.',
|
|
689
|
+
},
|
|
690
|
+
{
|
|
691
|
+
key: 'session.openChat',
|
|
692
|
+
kind: 'link',
|
|
693
|
+
en: 'open chat: {name}',
|
|
694
|
+
bg: 'отвори чата: {name}',
|
|
695
|
+
doesEn: "Opens this session's Copilot conversation in a new browser tab.",
|
|
696
|
+
doesBg: 'Отваря разговора на сесията в Copilot в нов таб на браузъра.',
|
|
697
|
+
},
|
|
698
|
+
],
|
|
699
|
+
},
|
|
700
|
+
{
|
|
701
|
+
headingKey: 'model.title',
|
|
702
|
+
en: 'Copilot model',
|
|
703
|
+
bg: 'Модел на Copilot',
|
|
704
|
+
controls: [
|
|
705
|
+
{
|
|
706
|
+
key: 'model.refresh',
|
|
707
|
+
kind: 'button',
|
|
708
|
+
en: 'Read the list from Copilot',
|
|
709
|
+
bg: 'Прочети списъка от Copilot',
|
|
710
|
+
doesEn: "Opens the bot's Edge window, reads the chat's own model list and fills this picker with it.",
|
|
711
|
+
doesBg: 'Отваря прозореца на Edge на бота, прочита списъка с модели от чата и попълва с него избора.',
|
|
712
|
+
},
|
|
713
|
+
],
|
|
714
|
+
},
|
|
715
|
+
{
|
|
716
|
+
headingKey: 'l1.title',
|
|
717
|
+
en: 'Level 1: the base prompt',
|
|
718
|
+
bg: 'Ниво 1: основен prompt',
|
|
719
|
+
controls: [
|
|
720
|
+
{
|
|
721
|
+
key: 'l1.edit',
|
|
722
|
+
kind: 'link',
|
|
723
|
+
en: 'edit',
|
|
724
|
+
bg: 'редактирай',
|
|
725
|
+
doesEn: 'Opens the page where the base prompt itself is changed.',
|
|
726
|
+
doesBg: 'Отваря страницата, на която се променя самият основен prompt.',
|
|
727
|
+
},
|
|
728
|
+
],
|
|
729
|
+
},
|
|
730
|
+
{
|
|
731
|
+
headingKey: 'vcs.title',
|
|
732
|
+
en: 'Version control',
|
|
733
|
+
bg: 'Контрол на версиите',
|
|
734
|
+
controls: [
|
|
735
|
+
{
|
|
736
|
+
key: 'vcs.repoField',
|
|
737
|
+
kind: 'field',
|
|
738
|
+
en: 'Project folder',
|
|
739
|
+
bg: 'Папка на проекта',
|
|
740
|
+
doesEn: 'The git repository the tasks work in; it is saved when the field loses focus.',
|
|
741
|
+
doesBg: 'Git хранилището, в което работят задачите; запазва се, щом излезете от полето.',
|
|
742
|
+
},
|
|
743
|
+
{
|
|
744
|
+
key: 'mirror.browse',
|
|
745
|
+
kind: 'button',
|
|
746
|
+
en: 'Browse…',
|
|
747
|
+
bg: 'Избери папка…',
|
|
748
|
+
doesEn: "Opens the machine's folder dialog and saves whichever folder is picked.",
|
|
749
|
+
doesBg: 'Отваря диалога за папки на машината и запазва избраната папка.',
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
key: 'vcs.enable',
|
|
753
|
+
kind: 'checkbox',
|
|
754
|
+
en: 'Work on branches and commit what was changed',
|
|
755
|
+
bg: 'Работи по клонове и комитвай промененото',
|
|
756
|
+
doesEn: 'Makes the runner branch before each task and commit what changed; it needs a real git repository above.',
|
|
757
|
+
doesBg: 'Кара изпълнителя да прави клон преди всяка задача и да комитва промененото; иска истинско git хранилище горе.',
|
|
758
|
+
},
|
|
759
|
+
{
|
|
760
|
+
key: 'vcs.perTask',
|
|
761
|
+
kind: 'radio',
|
|
762
|
+
en: 'A branch of its own for every task',
|
|
763
|
+
bg: 'Отделен клон за всяка задача',
|
|
764
|
+
doesEn: 'Every task branches from the same starting point, so none of them sees the previous one’s changes.',
|
|
765
|
+
doesBg: 'Всяка задача тръгва от една и съща точка и не вижда промените на предишната.',
|
|
766
|
+
},
|
|
767
|
+
{
|
|
768
|
+
key: 'vcs.perSession',
|
|
769
|
+
kind: 'radio',
|
|
770
|
+
en: 'One branch for the whole session',
|
|
771
|
+
bg: 'Един клон за цялата сесия',
|
|
772
|
+
doesEn: 'Every task continues on the branch the task before it left, so later work builds on earlier work.',
|
|
773
|
+
doesBg: 'Всяка задача продължава на клона от предишната, така че по-късната работа стъпва на по-ранната.',
|
|
774
|
+
},
|
|
775
|
+
{
|
|
776
|
+
key: 'vcs.commit',
|
|
777
|
+
kind: 'checkbox',
|
|
778
|
+
en: 'Commit when a task finishes',
|
|
779
|
+
bg: 'Комит при приключване на задача',
|
|
780
|
+
doesEn: 'One local commit per task whatever the outcome; unticked leaves the changes loose in the working tree.',
|
|
781
|
+
doesBg: 'По един локален комит на задача, независимо от изхода; без отметка промените остават свободни в работното дърво.',
|
|
782
|
+
},
|
|
783
|
+
],
|
|
784
|
+
},
|
|
785
|
+
{
|
|
786
|
+
headingKey: 'review.title',
|
|
787
|
+
en: 'Independent review',
|
|
788
|
+
bg: 'Независима рецензия',
|
|
789
|
+
controls: [
|
|
790
|
+
{
|
|
791
|
+
key: 'review.enable',
|
|
792
|
+
kind: 'checkbox',
|
|
793
|
+
en: 'Check every task with a second conversation',
|
|
794
|
+
bg: 'Проверявай всяка задача с втори разговор',
|
|
795
|
+
doesEn: 'Opens a separate reviewing conversation after each task; it takes effect only after Save below.',
|
|
796
|
+
doesBg: 'Отваря отделен рецензиращ разговор след всяка задача; влиза в сила чак след Запази отдолу.',
|
|
797
|
+
},
|
|
798
|
+
{
|
|
799
|
+
key: 'review.modelField',
|
|
800
|
+
kind: 'select',
|
|
801
|
+
en: 'Model for the review',
|
|
802
|
+
bg: 'Модел за рецензията',
|
|
803
|
+
doesEn: 'Which model does the reviewing; it takes effect only after Save below.',
|
|
804
|
+
doesBg: 'Кой модел прави рецензията; влиза в сила чак след Запази отдолу.',
|
|
805
|
+
},
|
|
806
|
+
{
|
|
807
|
+
key: 'review.save',
|
|
808
|
+
kind: 'button',
|
|
809
|
+
en: 'Save',
|
|
810
|
+
bg: 'Запази',
|
|
811
|
+
doesEn: 'Stores the review switch and the review model onto this session.',
|
|
812
|
+
doesBg: 'Записва отметката за рецензия и модела за нея върху тази сесия.',
|
|
813
|
+
},
|
|
814
|
+
],
|
|
815
|
+
},
|
|
816
|
+
{
|
|
817
|
+
headingKey: 'mirror.title',
|
|
818
|
+
en: 'Project files for the chat',
|
|
819
|
+
bg: 'Файлове на проекта за чата',
|
|
820
|
+
controls: [
|
|
821
|
+
{
|
|
822
|
+
key: 'mirror.enable',
|
|
823
|
+
kind: 'checkbox',
|
|
824
|
+
en: 'attach project files',
|
|
825
|
+
bg: 'прикачай файловете на проекта',
|
|
826
|
+
doesEn: 'Attaches the selected files to the first message of every task; it takes effect only after Save below.',
|
|
827
|
+
doesBg: 'Прикача избраните файлове към първото съобщение на всяка задача; влиза в сила чак след Запази отдолу.',
|
|
828
|
+
},
|
|
829
|
+
{
|
|
830
|
+
key: 'mirror.root',
|
|
831
|
+
kind: 'field',
|
|
832
|
+
en: 'Project root',
|
|
833
|
+
bg: 'Корен на проекта',
|
|
834
|
+
doesEn: 'The folder the include and exclude lists below are relative to.',
|
|
835
|
+
doesBg: 'Папката, спрямо която са списъците за включване и изключване отдолу.',
|
|
836
|
+
},
|
|
837
|
+
{
|
|
838
|
+
key: 'tree.load',
|
|
839
|
+
kind: 'button',
|
|
840
|
+
en: 'Show the folders',
|
|
841
|
+
bg: 'Покажи папките',
|
|
842
|
+
doesEn: 'Reads the project folder and draws its tree, so folders can be ticked instead of typed.',
|
|
843
|
+
doesBg: 'Прочита папката на проекта и показва дървото ѝ, за да се избират папки с клик, вместо да се пишат.',
|
|
844
|
+
},
|
|
845
|
+
{
|
|
846
|
+
key: 'mirror.gitignore',
|
|
847
|
+
kind: 'checkbox',
|
|
848
|
+
en: 'Leave out what .gitignore lists',
|
|
849
|
+
bg: 'Не добавяй това, което е в .gitignore',
|
|
850
|
+
doesEn: 'Keeps everything .gitignore names out of the files sent to the chat.',
|
|
851
|
+
doesBg: 'Държи всичко от .gitignore извън файловете, пратени в чата.',
|
|
852
|
+
},
|
|
853
|
+
{
|
|
854
|
+
key: 'mirror.env',
|
|
855
|
+
kind: 'checkbox',
|
|
856
|
+
en: 'Copy .env files as well',
|
|
857
|
+
bg: 'Копирай и .env файловете',
|
|
858
|
+
doesEn: 'Sends the .env files too; it asks for confirmation first, because they usually hold passwords and keys.',
|
|
859
|
+
doesBg: 'Праща и .env файловете; първо иска потвърждение, защото в тях обикновено има пароли и ключове.',
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
key: 'mirror.save',
|
|
863
|
+
kind: 'button',
|
|
864
|
+
en: 'Save',
|
|
865
|
+
bg: 'Запази',
|
|
866
|
+
doesEn: 'Stores the switch, the project root and both lists onto this session.',
|
|
867
|
+
doesBg: 'Записва отметката, корена на проекта и двата списъка върху тази сесия.',
|
|
868
|
+
},
|
|
869
|
+
],
|
|
870
|
+
},
|
|
871
|
+
{
|
|
872
|
+
headingKey: 'tasks.title',
|
|
873
|
+
en: 'Tasks',
|
|
874
|
+
bg: 'Задачи',
|
|
875
|
+
controls: [
|
|
876
|
+
{
|
|
877
|
+
key: 'chain.stop',
|
|
878
|
+
kind: 'radio',
|
|
879
|
+
en: 'Stop the queue at the first failure',
|
|
880
|
+
bg: 'Спри опашката при първата провалена',
|
|
881
|
+
doesEn: 'The first task that does not finish stops the queue and leaves the rest waiting.',
|
|
882
|
+
doesBg: 'Първата задача, която не приключи, спира опашката и оставя останалите да чакат.',
|
|
883
|
+
},
|
|
884
|
+
{
|
|
885
|
+
key: 'chain.continue',
|
|
886
|
+
kind: 'radio',
|
|
887
|
+
en: 'Carry on with the next task',
|
|
888
|
+
bg: 'Продължи със следващата задача',
|
|
889
|
+
doesEn: 'A failure is passed over and the next task starts anyway.',
|
|
890
|
+
doesBg: 'Провалът се подминава и следващата задача тръгва въпреки него.',
|
|
891
|
+
},
|
|
892
|
+
{
|
|
893
|
+
key: 'story.show',
|
|
894
|
+
kind: 'button',
|
|
895
|
+
en: 'What happened',
|
|
896
|
+
bg: 'Какво се случи',
|
|
897
|
+
doesEn: 'Opens the whole run of that task under its card: every message, every command and its output, live while it runs.',
|
|
898
|
+
doesBg: 'Отваря под картата цялото изпълнение на задачата: всяко съобщение, всяка команда с изхода ѝ, на живо докато върви.',
|
|
899
|
+
},
|
|
900
|
+
{
|
|
901
|
+
key: 'story.showLive',
|
|
902
|
+
kind: 'button',
|
|
903
|
+
en: 'What is happening now',
|
|
904
|
+
bg: 'Какво се случва в момента',
|
|
905
|
+
doesEn: 'The same button while the task is still running — it says this instead, and pulses. Tell the operator to watch here.',
|
|
906
|
+
doesBg: 'Същият бутон, докато задачата още върви — пише това и пулсира. Кажи на оператора да гледа тук.',
|
|
907
|
+
},
|
|
908
|
+
{
|
|
909
|
+
key: 'task.edit',
|
|
910
|
+
kind: 'button',
|
|
911
|
+
en: 'Edit',
|
|
912
|
+
bg: 'Редактирай',
|
|
913
|
+
doesEn: "Opens the form for that task's title, level 2, task text, git names and checks.",
|
|
914
|
+
doesBg: 'Отваря формата за заглавието, ниво 2, текста, git имената и проверките на задачата.',
|
|
915
|
+
},
|
|
916
|
+
{
|
|
917
|
+
key: 'task.rerun',
|
|
918
|
+
kind: 'button',
|
|
919
|
+
en: 'Run again',
|
|
920
|
+
bg: 'Пусни отново',
|
|
921
|
+
doesEn: 'Puts a finished task back in the queue unchanged; the earlier attempt is kept with its own log.',
|
|
922
|
+
doesBg: 'Връща приключила задача в опашката без промяна; предишният опит се пази със собствен дневник.',
|
|
923
|
+
},
|
|
924
|
+
{
|
|
925
|
+
key: 'restore.button',
|
|
926
|
+
kind: 'button',
|
|
927
|
+
en: 'Restore',
|
|
928
|
+
bg: 'Върни',
|
|
929
|
+
doesEn: 'Puts the repository back to the code as it was before that task started, on a new branch. Nothing is deleted.',
|
|
930
|
+
doesBg: 'Връща хранилището към кода отпреди тази задача, на нов клон. Нищо не се изтрива.',
|
|
931
|
+
},
|
|
932
|
+
{
|
|
933
|
+
key: 'restart.button',
|
|
934
|
+
kind: 'button',
|
|
935
|
+
en: 'Run again from here',
|
|
936
|
+
bg: 'Пусни отново оттук',
|
|
937
|
+
doesEn: 'Puts the code back, queues that task and every task after it again, and starts the run.',
|
|
938
|
+
doesBg: 'Връща кода, нарежда отново тази задача и всички след нея и пуска изпълнението.',
|
|
939
|
+
},
|
|
940
|
+
{
|
|
941
|
+
key: 'task.delete',
|
|
942
|
+
kind: 'button',
|
|
943
|
+
en: 'Delete',
|
|
944
|
+
bg: 'Изтрий',
|
|
945
|
+
doesEn: 'Takes that task out of the session; what it already executed stays on disk under runs/.',
|
|
946
|
+
doesBg: 'Маха задачата от сесията; вече изпълненото остава на диска под runs/.',
|
|
947
|
+
},
|
|
948
|
+
{
|
|
949
|
+
key: 'save.log',
|
|
950
|
+
kind: 'button',
|
|
951
|
+
en: 'save the log',
|
|
952
|
+
bg: 'запази log-а',
|
|
953
|
+
doesEn: 'Writes the whole run of that task, as plain text, into copilot-operator-logs on the Desktop and opens Explorer with the file selected, ready to drag into a chat. This is the file to ask for when the work is being validated.',
|
|
954
|
+
doesBg: 'Записва цялото изпълнение на задачата като чист текст в copilot-operator-logs на десктопа и отваря Explorer с избран файл, готов за влачене в чат. Това е файлът, който се иска при проверка на свършеното.',
|
|
955
|
+
},
|
|
956
|
+
{
|
|
957
|
+
key: 'status.queued',
|
|
958
|
+
kind: 'badge',
|
|
959
|
+
en: 'queued',
|
|
960
|
+
bg: 'чака',
|
|
961
|
+
doesEn: 'The task is waiting its turn and has not started.',
|
|
962
|
+
doesBg: 'Задачата чака реда си и още не е започнала.',
|
|
963
|
+
},
|
|
964
|
+
{
|
|
965
|
+
key: 'status.running',
|
|
966
|
+
kind: 'badge',
|
|
967
|
+
en: 'running',
|
|
968
|
+
bg: 'работи',
|
|
969
|
+
doesEn: 'The task is being executed right now.',
|
|
970
|
+
doesBg: 'Задачата се изпълнява в момента.',
|
|
971
|
+
},
|
|
972
|
+
{
|
|
973
|
+
key: 'status.waiting-approval',
|
|
974
|
+
kind: 'badge',
|
|
975
|
+
en: 'waiting for approval',
|
|
976
|
+
bg: 'чака одобрение',
|
|
977
|
+
doesEn: 'The task has stopped and a command is waiting for a decision.',
|
|
978
|
+
doesBg: 'Задачата е спряла и команда чака решение.',
|
|
979
|
+
},
|
|
980
|
+
{
|
|
981
|
+
key: 'status.done',
|
|
982
|
+
kind: 'badge',
|
|
983
|
+
en: 'done',
|
|
984
|
+
bg: 'готова',
|
|
985
|
+
doesEn: 'The task finished with a summary and its checks passed. This is the only ending that counts as success.',
|
|
986
|
+
doesBg: 'Задачата е приключила с обяснение и проверките ѝ са минали. Това е единственият край, който значи успех.',
|
|
987
|
+
},
|
|
988
|
+
{
|
|
989
|
+
key: 'status.blocked',
|
|
990
|
+
kind: 'badge',
|
|
991
|
+
en: 'not done',
|
|
992
|
+
bg: 'неизпълнена',
|
|
993
|
+
doesEn: 'The task ended without the work being done and says what stood in the way; read that reason first.',
|
|
994
|
+
doesBg: 'Задачата е приключила, без работата да е свършена, и казва какво е попречило; тази причина се чете първа.',
|
|
995
|
+
},
|
|
996
|
+
{
|
|
997
|
+
key: 'status.failed',
|
|
998
|
+
kind: 'badge',
|
|
999
|
+
en: 'failed',
|
|
1000
|
+
bg: 'провалена',
|
|
1001
|
+
doesEn: 'The task broke down and never reached an ending of its own.',
|
|
1002
|
+
doesBg: 'Задачата се е счупила и не е стигнала до собствен край.',
|
|
1003
|
+
},
|
|
1004
|
+
{
|
|
1005
|
+
key: 'status.aborted',
|
|
1006
|
+
kind: 'badge',
|
|
1007
|
+
en: 'aborted',
|
|
1008
|
+
bg: 'прекратена',
|
|
1009
|
+
doesEn: 'The task was ended by hand from an approval step.',
|
|
1010
|
+
doesBg: 'Задачата е прекратена на ръка от стъпка за одобрение.',
|
|
1011
|
+
},
|
|
1012
|
+
{
|
|
1013
|
+
key: 'status.limit-reached',
|
|
1014
|
+
kind: 'badge',
|
|
1015
|
+
en: 'limit reached',
|
|
1016
|
+
bg: 'достигнат лимит',
|
|
1017
|
+
doesEn: 'The task ran out of its allowed iterations before it could close.',
|
|
1018
|
+
doesBg: 'Задачата е изчерпала позволените си итерации, преди да приключи.',
|
|
1019
|
+
},
|
|
1020
|
+
{
|
|
1021
|
+
key: 'review.verdict.pass',
|
|
1022
|
+
kind: 'badge',
|
|
1023
|
+
en: 'review passed',
|
|
1024
|
+
bg: 'рецензията мина',
|
|
1025
|
+
doesEn: 'The second, independent conversation ran the work and found nothing wrong.',
|
|
1026
|
+
doesBg: 'Вторият, независим разговор е изпълнил работата и не е намерил проблем.',
|
|
1027
|
+
},
|
|
1028
|
+
{
|
|
1029
|
+
key: 'review.verdict.fail',
|
|
1030
|
+
kind: 'badge',
|
|
1031
|
+
en: 'review found problems',
|
|
1032
|
+
bg: 'рецензията намери проблеми',
|
|
1033
|
+
doesEn: 'The review found problems; the number beside it says how many and the task card lists them.',
|
|
1034
|
+
doesBg: 'Рецензията е намерила проблеми; числото до нея казва колко, а картата на задачата ги изброява.',
|
|
1035
|
+
},
|
|
1036
|
+
{
|
|
1037
|
+
key: 'review.verdict.error',
|
|
1038
|
+
kind: 'badge',
|
|
1039
|
+
en: 'review did not run',
|
|
1040
|
+
bg: 'рецензията не се проведе',
|
|
1041
|
+
doesEn: 'The review could not be carried out, so the work was accepted unreviewed.',
|
|
1042
|
+
doesBg: 'Рецензията не е могла да се проведе и работата е приета без нея.',
|
|
1043
|
+
},
|
|
1044
|
+
],
|
|
1045
|
+
},
|
|
1046
|
+
{
|
|
1047
|
+
headingKey: 'form.title',
|
|
1048
|
+
en: 'Add a task',
|
|
1049
|
+
bg: 'Добави задача',
|
|
1050
|
+
controls: [
|
|
1051
|
+
{
|
|
1052
|
+
key: 'form.titleLabel',
|
|
1053
|
+
kind: 'field',
|
|
1054
|
+
en: 'Title',
|
|
1055
|
+
bg: 'Заглавие',
|
|
1056
|
+
doesEn: 'The short name the task is listed under.',
|
|
1057
|
+
doesBg: 'Краткото име, под което задачата стои в списъка.',
|
|
1058
|
+
},
|
|
1059
|
+
{
|
|
1060
|
+
key: 'l2.label',
|
|
1061
|
+
kind: 'field',
|
|
1062
|
+
en: 'Level 2: project, domain and team instructions for this task',
|
|
1063
|
+
bg: 'Ниво 2: инструкции за проекта, домейна и екипа за тази задача',
|
|
1064
|
+
doesEn: 'What the operator knows and the runner does not; it is sent with this one task.',
|
|
1065
|
+
doesBg: 'Това, което операторът знае, а изпълнителят не; изпраща се с точно тази задача.',
|
|
1066
|
+
},
|
|
1067
|
+
{
|
|
1068
|
+
key: 'l2.loadPreset',
|
|
1069
|
+
kind: 'select',
|
|
1070
|
+
en: 'load a preset…',
|
|
1071
|
+
bg: 'зареди шаблон…',
|
|
1072
|
+
doesEn: 'Replaces that text with a preset saved earlier.',
|
|
1073
|
+
doesBg: 'Заменя този текст с по-рано запазен шаблон.',
|
|
1074
|
+
},
|
|
1075
|
+
{
|
|
1076
|
+
key: 'form.taskLabel',
|
|
1077
|
+
kind: 'field',
|
|
1078
|
+
en: 'Task',
|
|
1079
|
+
bg: 'Задача',
|
|
1080
|
+
doesEn: 'The task text itself: what to do, what the result should be, what is out of bounds.',
|
|
1081
|
+
doesBg: 'Самият текст на задачата: какво да се направи, какъв да е резултатът, какво е извън обхвата.',
|
|
1082
|
+
},
|
|
1083
|
+
{
|
|
1084
|
+
key: 'form.add',
|
|
1085
|
+
kind: 'button',
|
|
1086
|
+
en: 'Add to queue',
|
|
1087
|
+
bg: 'Добави в опашката',
|
|
1088
|
+
doesEn: "Puts the new task at the end of this session's queue; it starts nothing.",
|
|
1089
|
+
doesBg: 'Слага новата задача в края на опашката на сесията; не пуска нищо.',
|
|
1090
|
+
},
|
|
1091
|
+
{
|
|
1092
|
+
key: 'task.saveAndRerun',
|
|
1093
|
+
kind: 'button',
|
|
1094
|
+
en: 'Save and queue it again',
|
|
1095
|
+
bg: 'Запази и върни в опашката',
|
|
1096
|
+
doesEn: 'On a task that has already run: stores the edit and puts the task back in the queue with the new text.',
|
|
1097
|
+
doesBg: 'При вече изпълнена задача: записва промяната и връща задачата в опашката с новия текст.',
|
|
1098
|
+
},
|
|
1099
|
+
],
|
|
1100
|
+
},
|
|
1101
|
+
{
|
|
1102
|
+
headingKey: 'checks.title',
|
|
1103
|
+
en: 'Checks',
|
|
1104
|
+
bg: 'Проверки',
|
|
1105
|
+
controls: [
|
|
1106
|
+
{
|
|
1107
|
+
key: 'checks.name',
|
|
1108
|
+
kind: 'field',
|
|
1109
|
+
en: 'What it checks',
|
|
1110
|
+
bg: 'Какво проверява',
|
|
1111
|
+
doesEn: 'What this check is called, in the words a person would use.',
|
|
1112
|
+
doesBg: 'Как се казва проверката, с човешки думи.',
|
|
1113
|
+
},
|
|
1114
|
+
{
|
|
1115
|
+
key: 'checks.kind',
|
|
1116
|
+
kind: 'select',
|
|
1117
|
+
en: 'Must be',
|
|
1118
|
+
bg: 'Трябва',
|
|
1119
|
+
doesEn: 'What has to be true: a command succeeding or failing, its output, or a file existing or containing something.',
|
|
1120
|
+
doesBg: 'Какво трябва да е вярно: командата да успее или да се провали, изходът ѝ, или файл да съществува или да съдържа нещо.',
|
|
1121
|
+
},
|
|
1122
|
+
{
|
|
1123
|
+
key: 'checks.run',
|
|
1124
|
+
kind: 'field',
|
|
1125
|
+
en: 'Command',
|
|
1126
|
+
bg: 'Команда',
|
|
1127
|
+
doesEn: 'The command the runner executes for this check.',
|
|
1128
|
+
doesBg: 'Командата, която изпълнителят пуска за тази проверка.',
|
|
1129
|
+
},
|
|
1130
|
+
{
|
|
1131
|
+
key: 'checks.add',
|
|
1132
|
+
kind: 'button',
|
|
1133
|
+
en: 'Add a check',
|
|
1134
|
+
bg: 'Добави проверка',
|
|
1135
|
+
doesEn: 'Adds one more empty check to the task. A task with no check has nothing gating it.',
|
|
1136
|
+
doesBg: 'Добавя още една празна проверка към задачата. Задача без проверка няма какво да я спре.',
|
|
1137
|
+
},
|
|
1138
|
+
],
|
|
1139
|
+
},
|
|
1140
|
+
{
|
|
1141
|
+
headingKey: 'export.title',
|
|
1142
|
+
en: 'Download the work',
|
|
1143
|
+
bg: 'Изтегли свършената работа',
|
|
1144
|
+
controls: [
|
|
1145
|
+
{
|
|
1146
|
+
key: 'export.outcome',
|
|
1147
|
+
kind: 'link',
|
|
1148
|
+
en: 'Expected and actual ({n})',
|
|
1149
|
+
bg: 'Очаквано и получено ({n})',
|
|
1150
|
+
doesEn: 'The short record: for each chosen task, the message that opened it and the answer that closed it.',
|
|
1151
|
+
doesBg: 'Краткият запис: за всяка избрана задача първото съобщение и отговорът, с който приключва.',
|
|
1152
|
+
},
|
|
1153
|
+
{
|
|
1154
|
+
key: 'export.full',
|
|
1155
|
+
kind: 'link',
|
|
1156
|
+
en: 'The whole conversation ({n})',
|
|
1157
|
+
bg: 'Целият разговор ({n})',
|
|
1158
|
+
doesEn: 'The whole conversation of the chosen tasks, with every report and reply in between.',
|
|
1159
|
+
doesBg: 'Целият разговор на избраните задачи, с всички отчети и отговори помежду им.',
|
|
1160
|
+
},
|
|
1161
|
+
],
|
|
1162
|
+
},
|
|
1163
|
+
],
|
|
1164
|
+
},
|
|
1165
|
+
{
|
|
1166
|
+
route: '/history',
|
|
1167
|
+
nameEn: 'Task register',
|
|
1168
|
+
nameBg: 'Регистър на задачите',
|
|
1169
|
+
purposeEn: 'Every task of every session in one place — running now, queued next, already done — with the filters, the log downloads and the one button that continues the queue.',
|
|
1170
|
+
purposeBg: 'Всички задачи от всички сесии на едно място — какво върви сега, какво чака и какво е направено — с филтрите, изтеглянията на log-овете и единствения бутон, който продължава опашката.',
|
|
1171
|
+
sections: [
|
|
1172
|
+
{
|
|
1173
|
+
headingKey: 'reg.title',
|
|
1174
|
+
en: 'Task register',
|
|
1175
|
+
bg: 'Регистър на задачите',
|
|
1176
|
+
controls: [
|
|
1177
|
+
{
|
|
1178
|
+
key: 'reg.refresh',
|
|
1179
|
+
kind: 'button',
|
|
1180
|
+
en: 'Refresh',
|
|
1181
|
+
bg: 'Обнови',
|
|
1182
|
+
doesEn: 'Reads the task list from the server at once; the page also re-reads it by itself every few seconds.',
|
|
1183
|
+
doesBg: 'Прочита списъка със задачи от сървъра веднага; страницата и без това се обновява сама на няколко секунди.',
|
|
1184
|
+
},
|
|
1185
|
+
{
|
|
1186
|
+
key: 'reg.total',
|
|
1187
|
+
kind: 'badge',
|
|
1188
|
+
en: 'tasks',
|
|
1189
|
+
bg: 'задачи',
|
|
1190
|
+
doesEn: 'The counter for every task in the register, whatever the filters are set to.',
|
|
1191
|
+
doesBg: 'Броячът на всички задачи в регистъра, независимо какво са филтрите.',
|
|
1192
|
+
},
|
|
1193
|
+
{
|
|
1194
|
+
key: 'reg.done',
|
|
1195
|
+
kind: 'badge',
|
|
1196
|
+
en: 'done',
|
|
1197
|
+
bg: 'готови',
|
|
1198
|
+
doesEn: 'The counter for the tasks that ended with the work actually done.',
|
|
1199
|
+
doesBg: 'Броячът на задачите, приключили с наистина свършена работа.',
|
|
1200
|
+
},
|
|
1201
|
+
{
|
|
1202
|
+
key: 'reg.runningCount',
|
|
1203
|
+
kind: 'badge',
|
|
1204
|
+
en: 'running now',
|
|
1205
|
+
bg: 'в момента',
|
|
1206
|
+
doesEn: 'The counter for the tasks being worked on, including one stopped for approval.',
|
|
1207
|
+
doesBg: 'Броячът на задачите, по които се работи, включително спряна за одобрение.',
|
|
1208
|
+
},
|
|
1209
|
+
{
|
|
1210
|
+
key: 'reg.open',
|
|
1211
|
+
kind: 'badge',
|
|
1212
|
+
en: 'ahead',
|
|
1213
|
+
bg: 'предстоят',
|
|
1214
|
+
doesEn: 'The counter for the tasks that have not started and are still waiting in a queue.',
|
|
1215
|
+
doesBg: 'Броячът на задачите, които още не са започнали и чакат в опашка.',
|
|
1216
|
+
},
|
|
1217
|
+
{
|
|
1218
|
+
key: 'reg.failedCount',
|
|
1219
|
+
kind: 'badge',
|
|
1220
|
+
en: 'did not finish',
|
|
1221
|
+
bg: 'не са приключили',
|
|
1222
|
+
doesEn: 'The counter for every ending that is not done: not done, failed, aborted or out of limit.',
|
|
1223
|
+
doesBg: 'Броячът на всички краища, различни от готова: неизпълнени, провалени, прекратени или с достигнат лимит.',
|
|
1224
|
+
},
|
|
1225
|
+
],
|
|
1226
|
+
},
|
|
1227
|
+
{
|
|
1228
|
+
headingKey: 'reg.filterSession',
|
|
1229
|
+
en: 'Session',
|
|
1230
|
+
bg: 'Сесия',
|
|
1231
|
+
controls: [
|
|
1232
|
+
{
|
|
1233
|
+
key: 'reg.filterStatus',
|
|
1234
|
+
kind: 'select',
|
|
1235
|
+
en: 'Status',
|
|
1236
|
+
bg: 'Състояние',
|
|
1237
|
+
doesEn: 'Narrows the page to the tasks in one state, using the same words as the badges.',
|
|
1238
|
+
doesBg: 'Свива страницата до задачите в едно състояние, със същите думи като етикетите.',
|
|
1239
|
+
},
|
|
1240
|
+
{
|
|
1241
|
+
key: 'reg.search',
|
|
1242
|
+
kind: 'field',
|
|
1243
|
+
en: 'Search in the titles and the summaries',
|
|
1244
|
+
bg: 'Търсене в заглавията и обясненията',
|
|
1245
|
+
doesEn: 'Keeps only the rows whose title, summary, stop reason or session name contains what is typed.',
|
|
1246
|
+
doesBg: 'Оставя само редовете, в чието заглавие, обяснение, причина за спиране или име на сесия се среща написаното.',
|
|
1247
|
+
},
|
|
1248
|
+
{
|
|
1249
|
+
key: 'reg.clear',
|
|
1250
|
+
kind: 'button',
|
|
1251
|
+
en: 'Clear the filters',
|
|
1252
|
+
bg: 'Изчисти филтрите',
|
|
1253
|
+
doesEn: 'Empties the session, status and search filters in one press.',
|
|
1254
|
+
doesBg: 'Изчиства наведнъж филтрите по сесия, по състояние и търсенето.',
|
|
1255
|
+
},
|
|
1256
|
+
],
|
|
1257
|
+
},
|
|
1258
|
+
{
|
|
1259
|
+
headingKey: 'reg.viewLabel',
|
|
1260
|
+
en: 'View',
|
|
1261
|
+
bg: 'Изглед',
|
|
1262
|
+
controls: [
|
|
1263
|
+
{
|
|
1264
|
+
key: 'reg.viewFlow',
|
|
1265
|
+
kind: 'tab',
|
|
1266
|
+
en: 'Flow',
|
|
1267
|
+
bg: 'Поток',
|
|
1268
|
+
doesEn: 'Shows the register as three threads: running now, what is next, what has been done.',
|
|
1269
|
+
doesBg: 'Показва регистъра като три нишки: какво върви сега, какво следва, какво е направено.',
|
|
1270
|
+
},
|
|
1271
|
+
{
|
|
1272
|
+
key: 'reg.groupBy',
|
|
1273
|
+
kind: 'tab',
|
|
1274
|
+
en: 'By run',
|
|
1275
|
+
bg: 'По изпълнение',
|
|
1276
|
+
doesEn: 'Regroups the same tasks under the run that started them, newest run first.',
|
|
1277
|
+
doesBg: 'Прегрупира същите задачи под пускането, което ги е стартирало, най-новото отгоре.',
|
|
1278
|
+
},
|
|
1279
|
+
{
|
|
1280
|
+
key: 'reg.viewList',
|
|
1281
|
+
kind: 'tab',
|
|
1282
|
+
en: 'List',
|
|
1283
|
+
bg: 'Списък',
|
|
1284
|
+
doesEn: 'Shows the same tasks as one table, for scanning many of them at once.',
|
|
1285
|
+
doesBg: 'Показва същите задачи като една таблица, за да се преглеждат много наведнъж.',
|
|
1286
|
+
},
|
|
1287
|
+
],
|
|
1288
|
+
},
|
|
1289
|
+
{
|
|
1290
|
+
headingKey: 'reg.activeNow',
|
|
1291
|
+
en: 'Running now',
|
|
1292
|
+
bg: 'В момента',
|
|
1293
|
+
controls: [
|
|
1294
|
+
{
|
|
1295
|
+
key: 'save.log',
|
|
1296
|
+
kind: 'button',
|
|
1297
|
+
en: 'save the log',
|
|
1298
|
+
bg: 'запази log-а',
|
|
1299
|
+
doesEn: "Saves the runner's log of that task's latest attempt to the Desktop and opens Explorer on it.",
|
|
1300
|
+
doesBg: 'Запазва log-а на runner-а от последния опит на задачата на десктопа и отваря Explorer върху него.',
|
|
1301
|
+
},
|
|
1302
|
+
{
|
|
1303
|
+
key: 'reg.exportPlan',
|
|
1304
|
+
kind: 'link',
|
|
1305
|
+
en: 'plan',
|
|
1306
|
+
bg: 'план',
|
|
1307
|
+
doesEn: 'Downloads what was asked: the task in the plan format, with the edits made in the interface. Imports again.',
|
|
1308
|
+
doesBg: 'Изтегля какво е поискано: задачата във формата на плана, с редакциите от интерфейса. Внася се отново.',
|
|
1309
|
+
},
|
|
1310
|
+
{
|
|
1311
|
+
key: 'reg.exportDomain',
|
|
1312
|
+
kind: 'link',
|
|
1313
|
+
en: 'work',
|
|
1314
|
+
bg: 'работа',
|
|
1315
|
+
doesEn: 'Downloads what happened to the work: what the chat tried, what was done, and why it did not end done.',
|
|
1316
|
+
doesBg: 'Изтегля какво се случи с работата: какво е пробвал чатът, какво е направено и защо не е завършила готова.',
|
|
1317
|
+
},
|
|
1318
|
+
{
|
|
1319
|
+
key: 'reg.exportBot',
|
|
1320
|
+
kind: 'link',
|
|
1321
|
+
en: 'runner',
|
|
1322
|
+
bg: 'runner',
|
|
1323
|
+
doesEn: 'Downloads what the runner did: the environment, every event and step with its exit code, the review machinery.',
|
|
1324
|
+
doesBg: 'Изтегля какво е направил runner-ът: средата, всяко събитие и стъпка с кода на изход, механиката на рецензията.',
|
|
1325
|
+
},
|
|
1326
|
+
{
|
|
1327
|
+
key: 'story.show',
|
|
1328
|
+
kind: 'button',
|
|
1329
|
+
en: 'What happened',
|
|
1330
|
+
bg: 'Какво се случи',
|
|
1331
|
+
doesEn: 'Unfolds the whole story under the row, live while the task runs.',
|
|
1332
|
+
doesBg: 'Разгъва цялата история под реда, на живо докато задачата върви.',
|
|
1333
|
+
},
|
|
1334
|
+
{
|
|
1335
|
+
key: 'story.showLive',
|
|
1336
|
+
kind: 'button',
|
|
1337
|
+
en: 'What is happening now',
|
|
1338
|
+
bg: 'Какво се случва в момента',
|
|
1339
|
+
doesEn: 'The same button while the task is still running — it says this instead, and pulses. Tell the operator to watch here.',
|
|
1340
|
+
doesBg: 'Същият бутон, докато задачата още върви — пише това и пулсира. Кажи на оператора да гледа тук.',
|
|
1341
|
+
},
|
|
1342
|
+
{
|
|
1343
|
+
key: 'reg.pick',
|
|
1344
|
+
kind: 'button',
|
|
1345
|
+
en: 'Choose tasks',
|
|
1346
|
+
bg: 'Избери задачи',
|
|
1347
|
+
doesEn: 'Above the finished tasks. Puts a tick box on every task that ran, across every run, so several can be picked at once.',
|
|
1348
|
+
doesBg: 'Над свършените задачи. Слага отметка на всяка изпълнена задача, през всички пускания, за да могат да се изберат няколко наведнъж.',
|
|
1349
|
+
},
|
|
1350
|
+
{
|
|
1351
|
+
key: 'reg.bundle',
|
|
1352
|
+
kind: 'button',
|
|
1353
|
+
en: 'Download plan, work and runner for the {n} chosen, as one file',
|
|
1354
|
+
bg: 'Изтегли план, работа и runner за избраните {n}, в един файл',
|
|
1355
|
+
doesEn: 'One JSON holding all three views of exactly the ticked tasks. Ask for this rather than three separate files when you want to work out why something went the way it did — and say how many tasks to tick.',
|
|
1356
|
+
doesBg: 'Един JSON с трите изгледа на точно отметнатите задачи. Искай него вместо три отделни файла, когато трябва да се разбере защо нещо е тръгнало така — и кажи колко задачи да се отметнат.',
|
|
1357
|
+
},
|
|
1358
|
+
{
|
|
1359
|
+
key: 'row.info',
|
|
1360
|
+
kind: 'button',
|
|
1361
|
+
en: 'What are these?',
|
|
1362
|
+
bg: 'Какво са тези?',
|
|
1363
|
+
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.",
|
|
1364
|
+
doesBg: 'Малко кръгло i в края на реда. Отваря панел, който казва какво дава всяка от връзките на реда и кой от трите JSON файла да се вземе първи.',
|
|
1365
|
+
},
|
|
1366
|
+
],
|
|
1367
|
+
},
|
|
1368
|
+
{
|
|
1369
|
+
headingKey: 'reg.upcoming',
|
|
1370
|
+
en: 'What is next',
|
|
1371
|
+
bg: 'Какво следва',
|
|
1372
|
+
controls: [
|
|
1373
|
+
{
|
|
1374
|
+
key: 'reg.continue',
|
|
1375
|
+
kind: 'button',
|
|
1376
|
+
en: 'Continue: run the {n} queued task(s) in {s} session(s)',
|
|
1377
|
+
bg: 'Продължи: пусни {n} чакащи задачи в {s} сесии',
|
|
1378
|
+
doesEn: 'Opens a panel listing exactly which queued tasks in which sessions would be started. It starts nothing yet.',
|
|
1379
|
+
doesBg: 'Отваря панел, който изброява точно кои чакащи задачи в кои сесии ще тръгнат. Още нищо не пуска.',
|
|
1380
|
+
},
|
|
1381
|
+
{
|
|
1382
|
+
key: 'reg.continueWithFailed',
|
|
1383
|
+
kind: 'button',
|
|
1384
|
+
en: 'Continue: run {f} failed and {n} queued task(s) in {s} session(s)',
|
|
1385
|
+
bg: 'Продължи: пусни {f} провалили се и {n} чакащи задачи в {s} сесии',
|
|
1386
|
+
doesEn: 'The same button when a failed task would go back into the queue alongside the queued ones.',
|
|
1387
|
+
doesBg: 'Същият бутон, когато провалена задача се връща в опашката заедно с чакащите.',
|
|
1388
|
+
},
|
|
1389
|
+
{
|
|
1390
|
+
key: 'reg.continuePanelTitle',
|
|
1391
|
+
kind: 'note',
|
|
1392
|
+
en: 'Before it continues',
|
|
1393
|
+
bg: 'Преди да продължи',
|
|
1394
|
+
doesEn: 'The heading of that panel; the two start buttons and the tick boxes are inside it.',
|
|
1395
|
+
doesBg: 'Заглавието на този панел; двата бутона за старт и отметките са в него.',
|
|
1396
|
+
},
|
|
1397
|
+
{
|
|
1398
|
+
key: 'reg.continueUnattended',
|
|
1399
|
+
kind: 'button',
|
|
1400
|
+
en: 'Continue without asking',
|
|
1401
|
+
bg: 'Продължи без да пита',
|
|
1402
|
+
doesEn: 'Starts the listed sessions and runs every command without asking again; it confirms once first.',
|
|
1403
|
+
doesBg: 'Пуска изброените сесии и изпълнява всяка команда без повече питане; първо иска едно потвърждение.',
|
|
1404
|
+
},
|
|
1405
|
+
{
|
|
1406
|
+
key: 'reg.continueGo',
|
|
1407
|
+
kind: 'button',
|
|
1408
|
+
en: 'Continue, asking before each command',
|
|
1409
|
+
bg: 'Продължи, с питане преди всяка команда',
|
|
1410
|
+
doesEn: 'Starts the same sessions but stops for approval before every command.',
|
|
1411
|
+
doesBg: 'Пуска същите сесии, но спира за одобрение преди всяка команда.',
|
|
1412
|
+
},
|
|
1413
|
+
{
|
|
1414
|
+
key: 'reg.fixPrompt',
|
|
1415
|
+
kind: 'button',
|
|
1416
|
+
en: 'Fix the prompt and queue it again',
|
|
1417
|
+
bg: 'Поправи prompt-а и върни в опашката',
|
|
1418
|
+
doesEn: "Opens the failed task's text alone for rewriting, before it goes back into the queue.",
|
|
1419
|
+
doesBg: 'Отваря само текста на провалената задача за пренаписване, преди тя да се върне в опашката.',
|
|
1420
|
+
},
|
|
1421
|
+
],
|
|
1422
|
+
},
|
|
1423
|
+
{
|
|
1424
|
+
headingKey: 'reg.past',
|
|
1425
|
+
en: 'What has been done',
|
|
1426
|
+
bg: 'Какво е направено',
|
|
1427
|
+
controls: [
|
|
1428
|
+
{
|
|
1429
|
+
key: 'reg.stopped',
|
|
1430
|
+
kind: 'note',
|
|
1431
|
+
en: 'stopped: {reason}',
|
|
1432
|
+
bg: 'спряна: {reason}',
|
|
1433
|
+
doesEn: 'In red on the row: why that task or attempt stopped without the work being done.',
|
|
1434
|
+
doesBg: 'В червено на реда: защо задачата или опитът е спрял, без работата да е свършена.',
|
|
1435
|
+
},
|
|
1436
|
+
{
|
|
1437
|
+
key: 'save.attemptLog',
|
|
1438
|
+
kind: 'button',
|
|
1439
|
+
en: "save this attempt's log",
|
|
1440
|
+
bg: 'запази log-а на този опит',
|
|
1441
|
+
doesEn: 'Saves the log of one earlier attempt, rather than of the latest one, to the Desktop.',
|
|
1442
|
+
doesBg: 'Запазва на десктопа log-а на конкретен по-ранен опит, а не на последния.',
|
|
1443
|
+
},
|
|
1444
|
+
{
|
|
1445
|
+
key: 'reg.retriedFreshDone',
|
|
1446
|
+
kind: 'badge',
|
|
1447
|
+
en: 'blocked, then done in a fresh chat ({n}×)',
|
|
1448
|
+
bg: 'блокира, после готова в нов чат ({n}×)',
|
|
1449
|
+
doesEn: 'The task was blocked and then finished in a new conversation, so the chat was the cause, not the task.',
|
|
1450
|
+
doesBg: 'Задачата е блокирала и после е станала готова в нов разговор — значи чатът е бил причината, не задачата.',
|
|
1451
|
+
},
|
|
1452
|
+
{
|
|
1453
|
+
key: 'reg.retriedFreshStill',
|
|
1454
|
+
kind: 'badge',
|
|
1455
|
+
en: 'still blocked after {n} fresh chat(s)',
|
|
1456
|
+
bg: 'още блокирана след {n} нови чата',
|
|
1457
|
+
doesEn: 'Fresh conversations did not help, so the cause is in the task text, the checks or the machine.',
|
|
1458
|
+
doesBg: 'Новите разговори не са помогнали — причината е в текста на задачата, в проверките или в машината.',
|
|
1459
|
+
},
|
|
1460
|
+
],
|
|
1461
|
+
},
|
|
1462
|
+
{
|
|
1463
|
+
headingKey: 'reg.fixPromptTitle',
|
|
1464
|
+
en: 'The prompt of "{title}"',
|
|
1465
|
+
bg: 'Prompt-ът на „{title}"',
|
|
1466
|
+
controls: [
|
|
1467
|
+
{
|
|
1468
|
+
key: 'reg.fixPromptSave',
|
|
1469
|
+
kind: 'button',
|
|
1470
|
+
en: 'Save and queue again',
|
|
1471
|
+
bg: 'Запази и върни в опашката',
|
|
1472
|
+
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.',
|
|
1473
|
+
doesBg: 'Запазва пренаписания текст и връща задачата в опашката с него. Ниво 2, проверките и git имената остават каквито са.',
|
|
1474
|
+
},
|
|
1475
|
+
],
|
|
1476
|
+
},
|
|
1477
|
+
],
|
|
1478
|
+
},
|
|
1479
|
+
{
|
|
1480
|
+
route: '/defaults',
|
|
1481
|
+
nameEn: 'Settings',
|
|
1482
|
+
nameBg: 'Настройки',
|
|
1483
|
+
purposeEn: 'What every new session starts with: the project folders, the model that does the work and the model that reviews it. Every field saves itself; there is no save button.',
|
|
1484
|
+
purposeBg: 'С какво тръгва всяка нова сесия: папките на проектите, моделът, който върши работата, и моделът, който я проверява. Всяко поле се запазва само; няма бутон за запазване.',
|
|
1485
|
+
sections: [
|
|
1486
|
+
{
|
|
1487
|
+
headingKey: 'proj.title',
|
|
1488
|
+
en: 'The project you are working on',
|
|
1489
|
+
bg: 'Проектът, по който се работи',
|
|
1490
|
+
controls: [
|
|
1491
|
+
{
|
|
1492
|
+
key: 'def.autoSave',
|
|
1493
|
+
kind: 'note',
|
|
1494
|
+
en: 'Everything on this page saves itself as you change it. There is nothing to press.',
|
|
1495
|
+
bg: 'Всичко на тази страница се запазва само, докато го променяте. Няма какво да натискате.',
|
|
1496
|
+
doesEn: 'Do not look for a save button on this page; there is none.',
|
|
1497
|
+
doesBg: 'Не търсете бутон за запазване на тази страница; такъв няма.',
|
|
1498
|
+
},
|
|
1499
|
+
{
|
|
1500
|
+
key: 'proj.entryName',
|
|
1501
|
+
kind: 'field',
|
|
1502
|
+
en: 'Name',
|
|
1503
|
+
bg: 'Име',
|
|
1504
|
+
doesEn: 'The short name this project carries everywhere else, including in the list the brief hands to the chat.',
|
|
1505
|
+
doesBg: 'Краткото име, с което проектът се води навсякъде другаде, включително в списъка, който заданието дава на чата.',
|
|
1506
|
+
},
|
|
1507
|
+
{
|
|
1508
|
+
key: 'proj.entryDir',
|
|
1509
|
+
kind: 'field',
|
|
1510
|
+
en: 'Folder',
|
|
1511
|
+
bg: 'Папка',
|
|
1512
|
+
doesEn: 'The folder every new session starts pointed at; it saves a moment after the typing stops.',
|
|
1513
|
+
doesBg: 'Папката, към която тръгва всяка нова сесия; запазва се малко след като спрете да пишете.',
|
|
1514
|
+
},
|
|
1515
|
+
{
|
|
1516
|
+
key: 'mirror.browse',
|
|
1517
|
+
kind: 'button',
|
|
1518
|
+
en: 'Browse…',
|
|
1519
|
+
bg: 'Избери папка…',
|
|
1520
|
+
doesEn: 'Opens a folder-picking window and saves whichever folder is chosen.',
|
|
1521
|
+
doesBg: 'Отваря прозорец за избор на папка и запазва избраната.',
|
|
1522
|
+
},
|
|
1523
|
+
{
|
|
1524
|
+
key: 'proj.clear',
|
|
1525
|
+
kind: 'button',
|
|
1526
|
+
en: 'Clear',
|
|
1527
|
+
bg: 'Изчисти',
|
|
1528
|
+
doesEn: 'Empties that field, so new sessions start with nothing chosen.',
|
|
1529
|
+
doesBg: 'Изпразва полето, така че новите сесии тръгват без избрано.',
|
|
1530
|
+
},
|
|
1531
|
+
{
|
|
1532
|
+
key: 'proj.mirrorToDesktop',
|
|
1533
|
+
kind: 'checkbox',
|
|
1534
|
+
en: 'Keep the projects on the Desktop',
|
|
1535
|
+
bg: 'Дръж проектите на Desktop-а',
|
|
1536
|
+
doesEn: 'Copies every project on this page to its own Desktop folder before each run, which is how the files reach the chat.',
|
|
1537
|
+
doesBg: 'Копира всеки проект от тази страница в собствена папка на Desktop-а преди всяко пускане — така файловете стигат до чата.',
|
|
1538
|
+
},
|
|
1539
|
+
],
|
|
1540
|
+
},
|
|
1541
|
+
{
|
|
1542
|
+
headingKey: 'proj.addTitle',
|
|
1543
|
+
en: 'Add another project',
|
|
1544
|
+
bg: 'Добави още един проект',
|
|
1545
|
+
controls: [
|
|
1546
|
+
{
|
|
1547
|
+
key: 'proj.entryName',
|
|
1548
|
+
kind: 'field',
|
|
1549
|
+
en: 'Name',
|
|
1550
|
+
bg: 'Име',
|
|
1551
|
+
doesEn: 'The short name of another folder worked in; the brief lists it with its path.',
|
|
1552
|
+
doesBg: 'Краткото име на друга работна папка; заданието я изброява с пътя ѝ.',
|
|
1553
|
+
},
|
|
1554
|
+
{
|
|
1555
|
+
key: 'proj.entryDir',
|
|
1556
|
+
kind: 'field',
|
|
1557
|
+
en: 'Folder',
|
|
1558
|
+
bg: 'Папка',
|
|
1559
|
+
doesEn: 'The path of that other project.',
|
|
1560
|
+
doesBg: 'Пътят до тази друга папка.',
|
|
1561
|
+
},
|
|
1562
|
+
{
|
|
1563
|
+
key: 'proj.otherAdd',
|
|
1564
|
+
kind: 'button',
|
|
1565
|
+
en: 'Add',
|
|
1566
|
+
bg: 'Добави',
|
|
1567
|
+
doesEn: 'Saves the typed name and folder as another project; it stays dead until both boxes are filled.',
|
|
1568
|
+
doesBg: 'Запазва въведените име и папка като още един проект; неактивен е, докато и двете полета не са попълнени.',
|
|
1569
|
+
},
|
|
1570
|
+
],
|
|
1571
|
+
},
|
|
1572
|
+
{
|
|
1573
|
+
headingKey: 'def.modelTitle',
|
|
1574
|
+
en: 'Model for new sessions',
|
|
1575
|
+
bg: 'Модел за новите сесии',
|
|
1576
|
+
controls: [
|
|
1577
|
+
{
|
|
1578
|
+
key: 'def.modelField',
|
|
1579
|
+
kind: 'select',
|
|
1580
|
+
en: 'Model',
|
|
1581
|
+
bg: 'Модел',
|
|
1582
|
+
doesEn: 'The model every new session starts on, named exactly as the chat’s own picker shows it.',
|
|
1583
|
+
doesBg: 'Моделът, с който тръгва всяка нова сесия, с точното име от менюто на самия чат.',
|
|
1584
|
+
},
|
|
1585
|
+
{
|
|
1586
|
+
key: 'def.modelNone',
|
|
1587
|
+
kind: 'select',
|
|
1588
|
+
en: 'Leave the chat on whatever it is set to',
|
|
1589
|
+
bg: 'Остави чата на каквото е настроен',
|
|
1590
|
+
doesEn: 'The empty choice: new sessions do not touch the chat’s model at all.',
|
|
1591
|
+
doesBg: 'Празният избор: новите сесии изобщо не пипат модела в чата.',
|
|
1592
|
+
},
|
|
1593
|
+
{
|
|
1594
|
+
key: 'model.refresh',
|
|
1595
|
+
kind: 'button',
|
|
1596
|
+
en: 'Read the list from Copilot',
|
|
1597
|
+
bg: 'Прочети списъка от Copilot',
|
|
1598
|
+
doesEn: 'Reads the model list out of the chat itself; it cannot run while a session is running.',
|
|
1599
|
+
doesBg: 'Прочита списъка с модели от самия чат; не може да се изпълни, докато сесия работи.',
|
|
1600
|
+
},
|
|
1601
|
+
],
|
|
1602
|
+
},
|
|
1603
|
+
{
|
|
1604
|
+
headingKey: 'def.reviewTitle',
|
|
1605
|
+
en: 'Model for the review',
|
|
1606
|
+
bg: 'Модел за рецензията',
|
|
1607
|
+
controls: [
|
|
1608
|
+
{
|
|
1609
|
+
key: 'def.reviewField',
|
|
1610
|
+
kind: 'select',
|
|
1611
|
+
en: 'Review model',
|
|
1612
|
+
bg: 'Модел за рецензията',
|
|
1613
|
+
doesEn: 'The model a new session’s independent review starts on. A different model from the working one catches more.',
|
|
1614
|
+
doesBg: 'Моделът, с който тръгва независимата рецензия на новата сесия. Различен от работещия хваща повече.',
|
|
1615
|
+
},
|
|
1616
|
+
{
|
|
1617
|
+
key: 'def.reviewNone',
|
|
1618
|
+
kind: 'select',
|
|
1619
|
+
en: "The session's own model",
|
|
1620
|
+
bg: 'Собственият модел на сесията',
|
|
1621
|
+
doesEn: 'The empty choice: the review is done by whichever model the session itself is on.',
|
|
1622
|
+
doesBg: 'Празният избор: рецензията се прави от модела, на който е самата сесия.',
|
|
1623
|
+
},
|
|
1624
|
+
],
|
|
1625
|
+
},
|
|
1626
|
+
{
|
|
1627
|
+
headingKey: 'exec.title',
|
|
1628
|
+
en: 'Execution',
|
|
1629
|
+
bg: 'Изпълнение',
|
|
1630
|
+
controls: [
|
|
1631
|
+
{
|
|
1632
|
+
key: 'exec.retryBlocked',
|
|
1633
|
+
kind: 'field',
|
|
1634
|
+
en: 'When a task ends blocked, run it again in a fresh conversation',
|
|
1635
|
+
bg: 'Когато задача завърши блокирана, пусни я отново в нов разговор',
|
|
1636
|
+
doesEn: 'How many times a blocked task is retried in a brand-new chat before the verdict stands; 0 turns it off.',
|
|
1637
|
+
doesBg: 'Колко пъти блокирана задача се пуска отново в нов чат, преди присъдата да остане; 0 го изключва.',
|
|
1638
|
+
},
|
|
1639
|
+
{
|
|
1640
|
+
key: 'exec.isolation',
|
|
1641
|
+
kind: 'field',
|
|
1642
|
+
en: 'Where the bot runs',
|
|
1643
|
+
bg: 'Къде върви ботът',
|
|
1644
|
+
doesEn: "The operator's statement about what contains this runner: this account, a separate low-privilege Windows account, Windows Sandbox, or a VM. It gates unattended runs — while it says this account, a run with nobody watching is refused, unless the operator chose \"this account — I accept unattended runs without isolation\", which allows it on their responsibility — and it is recorded with every run beside the account the process actually held.",
|
|
1645
|
+
doesBg: 'Твърдението на оператора какво огражда този runner: този акаунт, отделен Windows акаунт с малки права, Windows Sandbox или виртуална машина. То управлява пусканията без надзор — докато казва „този акаунт“, пускане без човек се отказва, освен ако операторът не е избрал „в този акаунт — приемам пускане без надзор без изолация“, което го позволява на негова отговорност — и се записва с всяко пускане до акаунта, който процесът наистина е държал.',
|
|
1646
|
+
},
|
|
1647
|
+
],
|
|
1648
|
+
},
|
|
1649
|
+
],
|
|
1650
|
+
},
|
|
1651
|
+
{
|
|
1652
|
+
route: '/level1',
|
|
1653
|
+
nameEn: 'Level 1: the base prompt',
|
|
1654
|
+
nameBg: 'Ниво 1: основен prompt',
|
|
1655
|
+
purposeEn: 'The base prompt sent once at the start of every conversation, before any project instructions. The runner parses exactly the reply format described in it.',
|
|
1656
|
+
purposeBg: 'Основният prompt, изпращан веднъж в началото на всеки разговор, преди инструкциите за проекта. Runner-ът парсва точно описания в него формат на отговора.',
|
|
1657
|
+
sections: [
|
|
1658
|
+
{
|
|
1659
|
+
headingKey: 'l1page.title',
|
|
1660
|
+
en: 'Level 1: the base prompt',
|
|
1661
|
+
bg: 'Ниво 1: основен prompt',
|
|
1662
|
+
controls: [
|
|
1663
|
+
{
|
|
1664
|
+
key: 'l1page.unsaved',
|
|
1665
|
+
kind: 'badge',
|
|
1666
|
+
en: 'unsaved changes',
|
|
1667
|
+
bg: 'незапазени промени',
|
|
1668
|
+
doesEn: 'Appears as soon as the editor differs from what is stored, and goes when it is saved.',
|
|
1669
|
+
doesBg: 'Появява се, щом редакторът се различи от запазеното, и изчезва при запазване.',
|
|
1670
|
+
},
|
|
1671
|
+
{
|
|
1672
|
+
key: 'l1page.save',
|
|
1673
|
+
kind: 'button',
|
|
1674
|
+
en: 'Save',
|
|
1675
|
+
bg: 'Запази',
|
|
1676
|
+
doesEn: 'Writes the editor to data/level1.md; the new prompt applies only to sessions started after it.',
|
|
1677
|
+
doesBg: 'Записва редактора в data/level1.md; новият prompt важи само за сесии, започнати след това.',
|
|
1678
|
+
},
|
|
1679
|
+
{
|
|
1680
|
+
key: 'l1page.reset',
|
|
1681
|
+
kind: 'button',
|
|
1682
|
+
en: 'Reset to shipped',
|
|
1683
|
+
bg: 'Върни оригинала',
|
|
1684
|
+
doesEn: 'Throws the edited copy away and puts the prompt shipped with the project back, after one question.',
|
|
1685
|
+
doesBg: 'Изхвърля редактираното копие и връща оригиналния prompt на проекта, след един въпрос.',
|
|
1686
|
+
},
|
|
1687
|
+
],
|
|
1688
|
+
},
|
|
1689
|
+
],
|
|
1690
|
+
},
|
|
1691
|
+
{
|
|
1692
|
+
route: '/presets',
|
|
1693
|
+
nameEn: 'Level 2 presets',
|
|
1694
|
+
nameBg: 'Шаблони за ниво 2',
|
|
1695
|
+
purposeEn: 'The reusable level 2 instruction blocks — the project knowledge — saved under a name so a task can be given one instead of having it retyped.',
|
|
1696
|
+
purposeBg: 'Многократно използваемите блокове с инструкции от ниво 2 — знанието за проекта — запазени с име, за да се дадат на задача, вместо да се пишат наново.',
|
|
1697
|
+
sections: [
|
|
1698
|
+
{
|
|
1699
|
+
headingKey: 'presets.title',
|
|
1700
|
+
en: 'Level 2 presets',
|
|
1701
|
+
bg: 'Шаблони за ниво 2',
|
|
1702
|
+
controls: [
|
|
1703
|
+
{
|
|
1704
|
+
key: 'presets.name',
|
|
1705
|
+
kind: 'field',
|
|
1706
|
+
en: 'Name',
|
|
1707
|
+
bg: 'Име',
|
|
1708
|
+
doesEn: 'The name this preset is saved and later picked under; an existing name is overwritten.',
|
|
1709
|
+
doesBg: 'Името, под което шаблонът се запазва и после се избира; съществуващо име се презаписва.',
|
|
1710
|
+
},
|
|
1711
|
+
{
|
|
1712
|
+
key: 'presets.content',
|
|
1713
|
+
kind: 'field',
|
|
1714
|
+
en: 'Instructions',
|
|
1715
|
+
bg: 'Инструкции',
|
|
1716
|
+
doesEn: 'The level 2 text sent with every task that uses this preset.',
|
|
1717
|
+
doesBg: 'Текстът от ниво 2, който се изпраща с всяка задача, ползваща този шаблон.',
|
|
1718
|
+
},
|
|
1719
|
+
{
|
|
1720
|
+
key: 'presets.save',
|
|
1721
|
+
kind: 'button',
|
|
1722
|
+
en: 'Save preset',
|
|
1723
|
+
bg: 'Запази шаблона',
|
|
1724
|
+
doesEn: 'Stores the name and the instructions and refreshes the list below.',
|
|
1725
|
+
doesBg: 'Записва името и инструкциите и опреснява списъка отдолу.',
|
|
1726
|
+
},
|
|
1727
|
+
],
|
|
1728
|
+
},
|
|
1729
|
+
{
|
|
1730
|
+
headingKey: 'presets.list',
|
|
1731
|
+
en: 'Saved',
|
|
1732
|
+
bg: 'Запазени',
|
|
1733
|
+
controls: [
|
|
1734
|
+
{
|
|
1735
|
+
key: 'presets.edit',
|
|
1736
|
+
kind: 'button',
|
|
1737
|
+
en: 'Edit',
|
|
1738
|
+
bg: 'Редактирай',
|
|
1739
|
+
doesEn: 'Copies that preset back into the two boxes above, to change it and save over it.',
|
|
1740
|
+
doesBg: 'Връща шаблона в двете полета горе, за да го промените и запазите върху него.',
|
|
1741
|
+
},
|
|
1742
|
+
{
|
|
1743
|
+
key: 'presets.delete',
|
|
1744
|
+
kind: 'button',
|
|
1745
|
+
en: 'Delete',
|
|
1746
|
+
bg: 'Изтрий',
|
|
1747
|
+
doesEn: 'Removes that preset from the list for good, after a confirmation.',
|
|
1748
|
+
doesBg: 'Маха шаблона от списъка завинаги, след потвърждение.',
|
|
1749
|
+
},
|
|
1750
|
+
],
|
|
1751
|
+
},
|
|
1752
|
+
],
|
|
1753
|
+
},
|
|
1754
|
+
{
|
|
1755
|
+
route: '/appearance',
|
|
1756
|
+
nameEn: 'Appearance',
|
|
1757
|
+
nameBg: 'Изглед',
|
|
1758
|
+
purposeEn: 'The theme, the text size and the accessibility options. Everything here is kept in this browser and affects nothing a session does.',
|
|
1759
|
+
purposeBg: 'Темата, размерът на текста и настройките за достъпност. Всичко тук се пази в този браузър и не влияе на нищо, което прави сесия.',
|
|
1760
|
+
sections: [
|
|
1761
|
+
{
|
|
1762
|
+
headingKey: 'ap.title',
|
|
1763
|
+
en: 'Appearance',
|
|
1764
|
+
bg: 'Изглед',
|
|
1765
|
+
controls: [
|
|
1766
|
+
{
|
|
1767
|
+
key: 'theme.light',
|
|
1768
|
+
kind: 'radio',
|
|
1769
|
+
en: 'Light',
|
|
1770
|
+
bg: 'Светла',
|
|
1771
|
+
doesEn: 'Switches the interface to the light theme at once and remembers it in this browser.',
|
|
1772
|
+
doesBg: 'Превключва интерфейса към светлата тема веднага и я запомня в този браузър.',
|
|
1773
|
+
},
|
|
1774
|
+
{
|
|
1775
|
+
key: 'theme.dark',
|
|
1776
|
+
kind: 'radio',
|
|
1777
|
+
en: 'Dark',
|
|
1778
|
+
bg: 'Тъмна',
|
|
1779
|
+
doesEn: 'Switches the interface to the dark theme at once and remembers it in this browser.',
|
|
1780
|
+
doesBg: 'Превключва интерфейса към тъмната тема веднага и я запомня в този браузър.',
|
|
1781
|
+
},
|
|
1782
|
+
],
|
|
1783
|
+
},
|
|
1784
|
+
],
|
|
1785
|
+
},
|
|
1786
|
+
{
|
|
1787
|
+
route: '/system',
|
|
1788
|
+
nameEn: 'System',
|
|
1789
|
+
nameBg: 'Система',
|
|
1790
|
+
purposeEn: 'A read-only report on this machine: Node, Edge, the folders and whether anything is holding the bot’s browser profile. There is nothing here to press, and it is the first page to read when a run will not start.',
|
|
1791
|
+
purposeBg: 'Отчет за тази машина, само за четене: Node, Edge, папките и дали нещо държи профила на браузъра на бота. Тук няма какво да се натиска, а страницата се чете първа, когато пускане не тръгва.',
|
|
1792
|
+
sections: [
|
|
1793
|
+
{
|
|
1794
|
+
headingKey: 'sys.machine',
|
|
1795
|
+
en: 'This machine',
|
|
1796
|
+
bg: 'Тази машина',
|
|
1797
|
+
controls: [
|
|
1798
|
+
{
|
|
1799
|
+
key: 'sys.profileHeld',
|
|
1800
|
+
kind: 'note',
|
|
1801
|
+
en: 'Edge is holding the profile (pids {pids}). A run would fail. Close that Edge window.',
|
|
1802
|
+
bg: 'Edge държи профила (pid {pids}). Изпълнение би се провалило. Затворете този прозорец на Edge.',
|
|
1803
|
+
doesEn: 'The line to look for when a run will not start: a stray Edge window has the profile open.',
|
|
1804
|
+
doesBg: 'Редът, който се търси, когато пускане не тръгва: чужд прозорец на Edge държи профила отворен.',
|
|
1805
|
+
},
|
|
1806
|
+
],
|
|
1807
|
+
},
|
|
1808
|
+
],
|
|
1809
|
+
},
|
|
1810
|
+
];
|
|
1811
|
+
/** What a control is called in the rendered guide, in each language. */
|
|
1812
|
+
const KIND_WORDS = {
|
|
1813
|
+
button: { en: 'button', bg: 'бутон' },
|
|
1814
|
+
link: { en: 'link', bg: 'връзка' },
|
|
1815
|
+
field: { en: 'field', bg: 'поле' },
|
|
1816
|
+
checkbox: { en: 'checkbox', bg: 'отметка' },
|
|
1817
|
+
radio: { en: 'radio', bg: 'радио бутон' },
|
|
1818
|
+
select: { en: 'menu', bg: 'меню' },
|
|
1819
|
+
tab: { en: 'tab', bg: 'раздел' },
|
|
1820
|
+
badge: { en: 'badge', bg: 'етикет' },
|
|
1821
|
+
disclosure: { en: 'fold', bg: 'разгъване' },
|
|
1822
|
+
note: { en: 'line on screen', bg: 'ред на екрана' },
|
|
1823
|
+
};
|
|
1824
|
+
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.';
|
|
1825
|
+
const INTRO_BG = 'Всеки надпис в кавички по-долу е точният текст на екрана. Назовавай контрола с този текст — натисни „Провери“ — вместо да го описваш, и казвай маршрута, за да знае операторът на коя страница е. Надпис с {скоби} се попълва с числа или имена в момента.';
|
|
1826
|
+
/**
|
|
1827
|
+
* The guide as the Markdown section the brief embeds. Dense on purpose: the brief is pasted
|
|
1828
|
+
* into a chat window by hand and read by a model, so the words and what they do earn their
|
|
1829
|
+
* place and nothing else does.
|
|
1830
|
+
*/
|
|
1831
|
+
export function systemGuideSection(lang) {
|
|
1832
|
+
const bg = lang === 'bg';
|
|
1833
|
+
const lines = [];
|
|
1834
|
+
lines.push(bg ? '## Екраните и точните имена по тях' : '## The screens, and what everything on them is called');
|
|
1835
|
+
lines.push('');
|
|
1836
|
+
lines.push(bg ? INTRO_BG : INTRO_EN);
|
|
1837
|
+
for (const screen of SYSTEM_GUIDE) {
|
|
1838
|
+
lines.push('');
|
|
1839
|
+
lines.push(`### \`${screen.route}\` — ${bg ? screen.nameBg : screen.nameEn}`);
|
|
1840
|
+
lines.push(bg ? screen.purposeBg : screen.purposeEn);
|
|
1841
|
+
for (const section of screen.sections) {
|
|
1842
|
+
lines.push('');
|
|
1843
|
+
lines.push(`**${bg ? section.bg : section.en}**`);
|
|
1844
|
+
for (const control of section.controls) {
|
|
1845
|
+
const word = KIND_WORDS[control.kind][lang];
|
|
1846
|
+
lines.push(`- "${bg ? control.bg : control.en}" (${word}) — ${bg ? control.doesBg : control.doesEn}`);
|
|
1847
|
+
}
|
|
1848
|
+
}
|
|
1849
|
+
}
|
|
1850
|
+
return lines.join('\n');
|
|
1851
|
+
}
|