zames_pro 2.54.0 → 2.58.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/CHANGELOG.md +209 -0
- package/README.md +113 -6
- package/dist/agent-loop.js +67 -0
- package/dist/attachments.js +32 -0
- package/dist/commands.js +57 -20
- package/dist/config.js +3 -42
- package/dist/fsutil.js +18 -0
- package/dist/gitTools.js +37 -0
- package/dist/i18n.js +140 -53
- package/dist/index.js +295 -34
- package/dist/input.js +5 -0
- package/dist/mcp.js +20 -0
- package/dist/self-review.js +44 -6
- package/dist/sessions.js +4 -8
- package/dist/shell.js +72 -0
- package/dist/spinner.js +42 -3
- package/dist/system-prompt.js +13 -0
- package/dist/tools.js +43 -75
- package/dist/transcript.js +14 -4
- package/dist/undo.js +8 -6
- package/dist/web.js +31 -0
- package/package.json +14 -4
- package/scripts/clean-dist.mjs +17 -0
- package/scripts/coverage-gate.mjs +83 -0
- package/dist/confirm.js +0 -105
package/dist/config.js
CHANGED
|
@@ -2,6 +2,7 @@ import fs from 'fs';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import os from 'os';
|
|
4
4
|
import { DEFAULT_LOCALE } from './i18n.js';
|
|
5
|
+
import { writeJsonAtomic } from './fsutil.js';
|
|
5
6
|
const ZAMES_HOME = path.join(os.homedir(), '.zames');
|
|
6
7
|
const HOME_CONFIG = path.join(ZAMES_HOME, 'config.json');
|
|
7
8
|
// The PROJECT config path is resolved LAZILY: `/cd` changes process.cwd() at
|
|
@@ -10,13 +11,6 @@ const HOME_CONFIG = path.join(ZAMES_HOME, 'config.json');
|
|
|
10
11
|
export function projectConfigPath() {
|
|
11
12
|
return path.join(process.cwd(), '.zamesrc.json');
|
|
12
13
|
}
|
|
13
|
-
// Write via a temp file + rename so a crash or Ctrl+C mid-write can never
|
|
14
|
-
// leave a truncated/broken config (it is read at every startup).
|
|
15
|
-
function atomicWriteJson(file, value) {
|
|
16
|
-
const tmp = `${file}.tmp-${process.pid}`;
|
|
17
|
-
fs.writeFileSync(tmp, JSON.stringify(value, null, 2) + '\n', 'utf-8');
|
|
18
|
-
fs.renameSync(tmp, file);
|
|
19
|
-
}
|
|
20
14
|
export const DEFAULTS = {
|
|
21
15
|
maxIterations: 0,
|
|
22
16
|
// Headless by default: the browser runs without a visible window. Set
|
|
@@ -24,21 +18,6 @@ export const DEFAULTS = {
|
|
|
24
18
|
headless: true,
|
|
25
19
|
debug: false,
|
|
26
20
|
browserChannel: null,
|
|
27
|
-
confirmation: {
|
|
28
|
-
write: true,
|
|
29
|
-
edit: true,
|
|
30
|
-
bash: true,
|
|
31
|
-
alwaysConfirm: [
|
|
32
|
-
'rm\s+-rf',
|
|
33
|
-
'rmdir\s+/s',
|
|
34
|
-
'del\s+/[sqf]',
|
|
35
|
-
'format\s+[a-z]:',
|
|
36
|
-
'shutdown',
|
|
37
|
-
'reg\s+delete',
|
|
38
|
-
'remove-item.*-recurse',
|
|
39
|
-
'git\s+push\s+--force',
|
|
40
|
-
],
|
|
41
|
-
},
|
|
42
21
|
undo: {
|
|
43
22
|
enabled: true,
|
|
44
23
|
maxBackups: 200,
|
|
@@ -169,24 +148,6 @@ export const CONFIG_SCHEMA = [
|
|
|
169
148
|
labelKey: 'cfg.f.hotReload',
|
|
170
149
|
groupKey: 'cfg.group.agent',
|
|
171
150
|
},
|
|
172
|
-
{
|
|
173
|
-
path: 'confirmation.write',
|
|
174
|
-
type: 'boolean',
|
|
175
|
-
labelKey: 'cfg.f.confirmation_write',
|
|
176
|
-
groupKey: 'cfg.group.confirmation',
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
path: 'confirmation.edit',
|
|
180
|
-
type: 'boolean',
|
|
181
|
-
labelKey: 'cfg.f.confirmation_edit',
|
|
182
|
-
groupKey: 'cfg.group.confirmation',
|
|
183
|
-
},
|
|
184
|
-
{
|
|
185
|
-
path: 'confirmation.bash',
|
|
186
|
-
type: 'boolean',
|
|
187
|
-
labelKey: 'cfg.f.confirmation_bash',
|
|
188
|
-
groupKey: 'cfg.group.confirmation',
|
|
189
|
-
},
|
|
190
151
|
{
|
|
191
152
|
path: 'undo.enabled',
|
|
192
153
|
type: 'boolean',
|
|
@@ -451,7 +412,7 @@ export function writeConfigValue(scope, key, raw) {
|
|
|
451
412
|
const data = readConfigFile(file);
|
|
452
413
|
setByPath(data, key, value);
|
|
453
414
|
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
454
|
-
|
|
415
|
+
writeJsonAtomic(file, data);
|
|
455
416
|
return { value, file };
|
|
456
417
|
}
|
|
457
418
|
/** Reset a setting to the default (remove the key from the file). */
|
|
@@ -474,7 +435,7 @@ export function resetConfigValue(scope, key) {
|
|
|
474
435
|
if (cur)
|
|
475
436
|
delete cur[parts[parts.length - 1]];
|
|
476
437
|
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
477
|
-
|
|
438
|
+
writeJsonAtomic(file, data);
|
|
478
439
|
return file;
|
|
479
440
|
}
|
|
480
441
|
// 'PROJECT_CONFIG' stays a getter so existing callers that only DISPLAY the
|
package/dist/fsutil.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
// One atomic writer shared by config, sessions and undo. Writing to a temp
|
|
3
|
+
// file in the SAME directory and renaming over the target is atomic on POSIX
|
|
4
|
+
// and Windows (same volume), so a crash or Ctrl+C mid-write can never leave a
|
|
5
|
+
// truncated/broken file behind. The temp name embeds the pid so two
|
|
6
|
+
// concurrent processes never collide on it.
|
|
7
|
+
//
|
|
8
|
+
// Kept in its own module because the pattern used to be copy-pasted in at
|
|
9
|
+
// least three places; drift between the copies is exactly how one of them
|
|
10
|
+
// silently loses its atomicity.
|
|
11
|
+
export function writeFileAtomic(file, data) {
|
|
12
|
+
const tmp = file + '.tmp-' + process.pid;
|
|
13
|
+
fs.writeFileSync(tmp, data);
|
|
14
|
+
fs.renameSync(tmp, file);
|
|
15
|
+
}
|
|
16
|
+
export function writeJsonAtomic(file, value) {
|
|
17
|
+
writeFileAtomic(file, JSON.stringify(value, null, 2) + String.fromCharCode(10));
|
|
18
|
+
}
|
package/dist/gitTools.js
CHANGED
|
@@ -149,6 +149,36 @@ export function createGitTools(workdir) {
|
|
|
149
149
|
return runGit(`git log --oneline --decorate -n ${Number(count) || 10}`, workdir, 10_000);
|
|
150
150
|
},
|
|
151
151
|
},
|
|
152
|
+
{
|
|
153
|
+
name: 'GitShow',
|
|
154
|
+
description: 'Show a commit or object: git show <ref> (ref defaults to HEAD). ' +
|
|
155
|
+
'Read-only — use it to inspect an old version without checking out.',
|
|
156
|
+
parameters: { ref: 'string?', stat: 'boolean?' },
|
|
157
|
+
fn: async ({ ref, stat }) => {
|
|
158
|
+
const err = await ensureRepo();
|
|
159
|
+
if (err)
|
|
160
|
+
return err;
|
|
161
|
+
const r = ref && String(ref).trim() ? String(ref).trim() : 'HEAD';
|
|
162
|
+
// `stat` gives the cheap file list; the default dumps the full diff.
|
|
163
|
+
const flag = stat ? '--stat ' : '';
|
|
164
|
+
return runGit(`git show ${flag}${JSON.stringify(r)}`, workdir, 20_000);
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
name: 'GitBranchList',
|
|
169
|
+
description: 'List local git branches (name, current marker, last commit). ' +
|
|
170
|
+
'Read-only — use it to pick a base branch without a raw `git branch`.',
|
|
171
|
+
parameters: {},
|
|
172
|
+
fn: async () => {
|
|
173
|
+
const err = await ensureRepo();
|
|
174
|
+
if (err)
|
|
175
|
+
return err;
|
|
176
|
+
// The format string contains parentheses/brackets, which the POSIX
|
|
177
|
+
// shell would treat as syntax — quote it as one JSON arg.
|
|
178
|
+
const format = JSON.stringify('%(HEAD) %(refname:short) %(committerdate:relative) %(subject)');
|
|
179
|
+
return runGit('git branch --sort=-committerdate --format=' + format, workdir, 10_000);
|
|
180
|
+
},
|
|
181
|
+
},
|
|
152
182
|
{
|
|
153
183
|
name: 'GitAdd',
|
|
154
184
|
description: 'Stage files. If paths is not given — git add -A (everything).',
|
|
@@ -209,6 +239,13 @@ export function createGitTools(workdir) {
|
|
|
209
239
|
: (await runGit('git branch --show-current', workdir, 5000)).trim();
|
|
210
240
|
if (!b)
|
|
211
241
|
return 'Error: could not determine the branch to push.';
|
|
242
|
+
// The branch name reaches the shell command below. Validate it as a
|
|
243
|
+
// real ref so a model-supplied value cannot smuggle shell metacharacters
|
|
244
|
+
// (`;`, backticks, `$()`) into `git push`. The remote stays a literal
|
|
245
|
+
// 'origin' and is not user-controlled.
|
|
246
|
+
if (!/^[A-Za-z0-9._/-]+$/.test(b) || b.startsWith('-')) {
|
|
247
|
+
return `Error: invalid branch name: ${b}`;
|
|
248
|
+
}
|
|
212
249
|
const flag = setUpstream ? '-u ' : '';
|
|
213
250
|
const target = quoteArgs(b);
|
|
214
251
|
return runGit(`git push ${flag}origin ${target}`, workdir, 120_000);
|
package/dist/i18n.js
CHANGED
|
@@ -77,10 +77,6 @@ export const CATALOG = {
|
|
|
77
77
|
en: 'show the browser window (debug/sign-in)',
|
|
78
78
|
},
|
|
79
79
|
'help.opt.debug': { ru: 'подробный лог', en: 'verbose log' },
|
|
80
|
-
'help.opt.calibrate': {
|
|
81
|
-
ru: 'режим калибровки селекторов',
|
|
82
|
-
en: 'selector calibration mode',
|
|
83
|
-
},
|
|
84
80
|
'help.opt.dev': {
|
|
85
81
|
ru: 'режим разработки: авто-перечитывание модулей',
|
|
86
82
|
en: 'dev mode: auto-reload modules',
|
|
@@ -135,7 +131,17 @@ export const CATALOG = {
|
|
|
135
131
|
ru: 'Esc, Ctrl+C прервать текущую генерацию',
|
|
136
132
|
en: 'Esc, Ctrl+C abort current generation',
|
|
137
133
|
},
|
|
138
|
-
'help.
|
|
134
|
+
'help.key.bang': {
|
|
135
|
+
ru: '!команда выполнить shell-команду напрямую (мимо модели)',
|
|
136
|
+
en: '!command run a shell command directly (bypass the model)',
|
|
137
|
+
},
|
|
138
|
+
'help.commands': { ru: 'Команды:', en: 'Commands:' },
|
|
139
|
+
'help.sec.session': { ru: 'Сессия', en: 'Session' },
|
|
140
|
+
'help.sec.workspace': { ru: 'Рабочая директория', en: 'Workspace' },
|
|
141
|
+
'help.sec.git': { ru: 'Git', en: 'Git' },
|
|
142
|
+
'help.sec.agent': { ru: 'Агент', en: 'Agent' },
|
|
143
|
+
'help.sec.context': { ru: 'Контекст и настройки', en: 'Context & settings' },
|
|
144
|
+
'help.sec.files': { ru: 'Файлы и прочее', en: 'Files & misc' },
|
|
139
145
|
'help.cmd.new': {
|
|
140
146
|
ru: '/new, /clear новый чат (сброс контекста)',
|
|
141
147
|
en: '/new, /clear new chat (reset context)',
|
|
@@ -196,6 +202,26 @@ export const CATALOG = {
|
|
|
196
202
|
ru: '/diff [--staged] показать git diff',
|
|
197
203
|
en: '/diff [--staged] show working tree git diff',
|
|
198
204
|
},
|
|
205
|
+
'help.cmd.diffstat': {
|
|
206
|
+
ru: '/diffstat сводка изменений (git diff --stat)',
|
|
207
|
+
en: '/diffstat change summary (git diff --stat)',
|
|
208
|
+
},
|
|
209
|
+
'help.cmd.retry': {
|
|
210
|
+
ru: '/retry повторить последнюю задачу в этом чате',
|
|
211
|
+
en: '/retry resend the last task into this chat',
|
|
212
|
+
},
|
|
213
|
+
'help.cmd.rename': {
|
|
214
|
+
ru: '/rename <title> задать имя текущей сессии',
|
|
215
|
+
en: '/rename <title> set the current session title',
|
|
216
|
+
},
|
|
217
|
+
'help.cmd.context': {
|
|
218
|
+
ru: '/context что загружено в промпт (AGENTS/MEMORY/skills/commands)',
|
|
219
|
+
en: '/context what is loaded into the prompt (AGENTS/MEMORY/skills/commands)',
|
|
220
|
+
},
|
|
221
|
+
'help.cmd.copy': {
|
|
222
|
+
ru: '/copy скопировать последний ответ в буфер обмена',
|
|
223
|
+
en: '/copy copy the last answer to the clipboard',
|
|
224
|
+
},
|
|
199
225
|
'help.cmd.cost': { ru: '/cost статистика сессии', en: '/cost session stats' },
|
|
200
226
|
'help.cmd.export': {
|
|
201
227
|
ru: '/export [file] выгрузить сессию в Markdown',
|
|
@@ -205,10 +231,6 @@ export const CATALOG = {
|
|
|
205
231
|
ru: '/doctor диагностика установки и конфига',
|
|
206
232
|
en: '/doctor diagnose install and config',
|
|
207
233
|
},
|
|
208
|
-
'help.cmd.permissions': {
|
|
209
|
-
ru: '/permissions настройки подтверждений',
|
|
210
|
-
en: '/permissions confirmation settings',
|
|
211
|
-
},
|
|
212
234
|
'help.cmd.add_dir': {
|
|
213
235
|
ru: '/add-dir <path> проверить директорию',
|
|
214
236
|
en: '/add-dir <path> validate a directory',
|
|
@@ -241,6 +263,26 @@ export const CATALOG = {
|
|
|
241
263
|
ru: '/goal [текст|clear] задать долгоживущую цель сессии',
|
|
242
264
|
en: '/goal [text|clear] set a long-lived session goal',
|
|
243
265
|
},
|
|
266
|
+
'help.cmd.plan': {
|
|
267
|
+
ru: '/plan [on|off] режим плана: только чтение, без правок и команд',
|
|
268
|
+
en: '/plan [on|off] plan mode: read-only, no edits or commands',
|
|
269
|
+
},
|
|
270
|
+
'plan.on': {
|
|
271
|
+
ru: 'Режим плана ВКЛ: доступны только инструменты чтения. Правки и команды запрещены. /plan off — выключить.',
|
|
272
|
+
en: 'Plan mode ON: only read tools are available. Edits and commands are disabled. /plan off to disable.',
|
|
273
|
+
},
|
|
274
|
+
'plan.off': {
|
|
275
|
+
ru: 'Режим плана ВЫКЛ: агент снова может писать и запускать команды.',
|
|
276
|
+
en: 'Plan mode OFF: the agent can edit and run commands again.',
|
|
277
|
+
},
|
|
278
|
+
'help.opt.output_format': {
|
|
279
|
+
ru: 'формат вывода: text|json|jsonl (для скриптов)',
|
|
280
|
+
en: 'output format: text|json|jsonl (for scripts)',
|
|
281
|
+
},
|
|
282
|
+
'help.opt.plan': {
|
|
283
|
+
ru: 'стартовать в режиме плана (только чтение)',
|
|
284
|
+
en: 'start in plan mode (read-only)',
|
|
285
|
+
},
|
|
244
286
|
'help.cmd.loop': {
|
|
245
287
|
ru: '/loop <интервал> <задача> периодически повторять задачу (напр. 10m)',
|
|
246
288
|
en: '/loop <interval> <task> repeat a task periodically (e.g. 10m)',
|
|
@@ -356,8 +398,8 @@ export const CATALOG = {
|
|
|
356
398
|
en: 'No such directory: {v}',
|
|
357
399
|
},
|
|
358
400
|
'adddir.note': {
|
|
359
|
-
ru: 'Директория существует: {v}.
|
|
360
|
-
en: 'Directory exists: {v}.
|
|
401
|
+
ru: 'Директория существует: {v}. Только проверка — песочница фиксируется при запуске, доступ не расширяется (перезапустите с --dir, чтобы работать там).',
|
|
402
|
+
en: 'Directory exists: {v}. Check only — the sandbox is fixed at startup, access is NOT granted (relaunch with --dir to work there).',
|
|
361
403
|
},
|
|
362
404
|
'help.cmd.config': {
|
|
363
405
|
ru: '/config настройки: показать и изменить',
|
|
@@ -393,6 +435,14 @@ export const CATALOG = {
|
|
|
393
435
|
en: 'Instructions (AGENTS.md):',
|
|
394
436
|
},
|
|
395
437
|
'memory.memory': { ru: 'Память (MEMORY.md):', en: 'Memory (MEMORY.md):' },
|
|
438
|
+
'remember.usage': {
|
|
439
|
+
ru: 'Использование: /remember <текст заметки>',
|
|
440
|
+
en: 'Usage: /remember <note text>',
|
|
441
|
+
},
|
|
442
|
+
'remember.saved': {
|
|
443
|
+
ru: '🧠 Заметка добавлена в {v}',
|
|
444
|
+
en: '🧠 Note appended to {v}',
|
|
445
|
+
},
|
|
396
446
|
'init.exists': {
|
|
397
447
|
ru: 'AGENTS.md уже существует: {v}',
|
|
398
448
|
en: 'AGENTS.md already exists: {v}',
|
|
@@ -424,6 +474,10 @@ export const CATALOG = {
|
|
|
424
474
|
ru: '/memory показать MEMORY.md и AGENTS.md',
|
|
425
475
|
en: '/memory show MEMORY.md and AGENTS.md',
|
|
426
476
|
},
|
|
477
|
+
'help.cmd.remember': {
|
|
478
|
+
ru: '/remember <текст> дописать заметку в MEMORY.md',
|
|
479
|
+
en: '/remember <text> append a note to MEMORY.md',
|
|
480
|
+
},
|
|
427
481
|
'help.cmd.init': {
|
|
428
482
|
ru: '/init [--force] изучить проект и создать AGENTS.md',
|
|
429
483
|
en: '/init [--force] analyze the project and create AGENTS.md',
|
|
@@ -607,6 +661,14 @@ export const CATALOG = {
|
|
|
607
661
|
en: 'Unknown command: {v}. Type /help.',
|
|
608
662
|
},
|
|
609
663
|
'msg.bye': { ru: 'Выход.', en: 'Bye.' },
|
|
664
|
+
'shell.empty': {
|
|
665
|
+
ru: 'После ! нужна команда, например !git status.',
|
|
666
|
+
en: 'A command is required after !, e.g. !git status.',
|
|
667
|
+
},
|
|
668
|
+
'shell.running': {
|
|
669
|
+
ru: 'выполняю shell-команду...',
|
|
670
|
+
en: 'running shell command...',
|
|
671
|
+
},
|
|
610
672
|
'msg.exit_summary': {
|
|
611
673
|
ru: 'Транскрипт: {transcript} · чат: {chat}',
|
|
612
674
|
en: 'Transcript: {transcript} · chat: {chat}',
|
|
@@ -663,6 +725,62 @@ export const CATALOG = {
|
|
|
663
725
|
en: '... [{n} more lines, use Bash git diff for the full output]',
|
|
664
726
|
},
|
|
665
727
|
// ---------- /cost ----------
|
|
728
|
+
// ---------- /context ----------
|
|
729
|
+
'context.title': {
|
|
730
|
+
ru: 'Загружено в промпт:',
|
|
731
|
+
en: 'Loaded into the prompt:',
|
|
732
|
+
},
|
|
733
|
+
'context.system_prompt': {
|
|
734
|
+
ru: ' системный промпт: {n} символов',
|
|
735
|
+
en: ' system prompt: {n} chars',
|
|
736
|
+
},
|
|
737
|
+
'context.agents': {
|
|
738
|
+
ru: 'AGENTS.md / инструкции:',
|
|
739
|
+
en: 'AGENTS.md / instructions:',
|
|
740
|
+
},
|
|
741
|
+
'context.memory': {
|
|
742
|
+
ru: 'MEMORY.md:',
|
|
743
|
+
en: 'MEMORY.md:',
|
|
744
|
+
},
|
|
745
|
+
'context.skills': {
|
|
746
|
+
ru: 'Скиллы:',
|
|
747
|
+
en: 'Skills:',
|
|
748
|
+
},
|
|
749
|
+
'context.commands': {
|
|
750
|
+
ru: 'Кастомные команды:',
|
|
751
|
+
en: 'Custom commands:',
|
|
752
|
+
},
|
|
753
|
+
'context.none': { ru: '(нет)', en: '(none)' },
|
|
754
|
+
'context.near_full': {
|
|
755
|
+
ru: '⚠ Контекст заполнен на {pct}% — подумайте о /compact, чтобы сжать историю.',
|
|
756
|
+
en: '⚠ Context is {pct}% full — consider /compact to shrink the history.',
|
|
757
|
+
},
|
|
758
|
+
// ---------- /retry, /rename ----------
|
|
759
|
+
'retry.none': {
|
|
760
|
+
ru: 'Нет последней задачи для повтора.',
|
|
761
|
+
en: 'No last task to retry.',
|
|
762
|
+
},
|
|
763
|
+
'copy.none': {
|
|
764
|
+
ru: 'Нет ответа для копирования.',
|
|
765
|
+
en: 'No answer to copy.',
|
|
766
|
+
},
|
|
767
|
+
'copy.done': {
|
|
768
|
+
ru: 'Скопировано в буфер обмена ({tool}).',
|
|
769
|
+
en: 'Copied to clipboard ({tool}).',
|
|
770
|
+
},
|
|
771
|
+
'copy.failed': {
|
|
772
|
+
ru: 'Не удалось скопировать (нет {tool} или он недоступен).',
|
|
773
|
+
en: 'Could not copy ({tool} missing or unavailable).',
|
|
774
|
+
},
|
|
775
|
+
'retry.running': { ru: 'Повторяю задачу…', en: 'Retrying the task...' },
|
|
776
|
+
'rename.usage': {
|
|
777
|
+
ru: 'Использование: /rename <title>',
|
|
778
|
+
en: 'Usage: /rename <title>',
|
|
779
|
+
},
|
|
780
|
+
'rename.done': {
|
|
781
|
+
ru: 'Сессия переименована: {v}',
|
|
782
|
+
en: 'Session renamed: {v}',
|
|
783
|
+
},
|
|
666
784
|
'cost.title': { ru: 'Статистика сессии:', en: 'Session stats:' },
|
|
667
785
|
'cost.context_known': {
|
|
668
786
|
ru: ' контекст: ~{n} токенов (DeepSeek accumulated_token_usage)',
|
|
@@ -722,24 +840,6 @@ export const CATALOG = {
|
|
|
722
840
|
ru: 'UA ещё не закэширован (первый запуск перезапустится один раз)',
|
|
723
841
|
en: 'no cached UA yet (first start relaunches once)',
|
|
724
842
|
},
|
|
725
|
-
// ---------- /permissions ----------
|
|
726
|
-
'perm.title': {
|
|
727
|
-
ru: 'Права инструментов (настройки подтверждений):',
|
|
728
|
-
en: 'Tool permissions (confirmation settings):',
|
|
729
|
-
},
|
|
730
|
-
'perm.write': { ru: ' Write: {v}', en: ' Write: {v}' },
|
|
731
|
-
'perm.edit': { ru: ' Edit: {v}', en: ' Edit: {v}' },
|
|
732
|
-
'perm.bash': { ru: ' Bash: {v}', en: ' Bash: {v}' },
|
|
733
|
-
'perm.ask': { ru: 'спрашивать', en: 'ask' },
|
|
734
|
-
'perm.allow': { ru: 'разрешить', en: 'allow' },
|
|
735
|
-
'perm.always': {
|
|
736
|
-
ru: ' Всегда подтверждать (regex):',
|
|
737
|
-
en: ' Always confirm (regex):',
|
|
738
|
-
},
|
|
739
|
-
'perm.change_hint': {
|
|
740
|
-
ru: 'Изменить: /config set confirmation.write false (и .edit / .bash)',
|
|
741
|
-
en: 'Change with: /config set confirmation.write false (and .edit / .bash)',
|
|
742
|
-
},
|
|
743
843
|
// ---------- /add-dir ----------
|
|
744
844
|
'adddir.usage': {
|
|
745
845
|
ru: 'Использование: /add-dir <path>',
|
|
@@ -770,17 +870,16 @@ export const CATALOG = {
|
|
|
770
870
|
en: 'Clear: /queue clear',
|
|
771
871
|
},
|
|
772
872
|
'msg.agent_error': { ru: '✖ Ошибка агента:', en: '✖ Agent error:' },
|
|
873
|
+
'msg.tool_loop': {
|
|
874
|
+
ru: 'Агент повторяет один и тот же вызов инструмента — переключаю на другой подход.',
|
|
875
|
+
en: 'The agent keeps repeating the same tool call — switching it to a different approach.',
|
|
876
|
+
},
|
|
773
877
|
'msg.suspicious_stop': {
|
|
774
878
|
ru: 'агент, похоже, остановился, не распознав вызов инструмента. Ответ сохранён в транскрипте (событие suspicious_final). Можно попросить продолжить или переотправить задачу.',
|
|
775
879
|
en: 'the agent seems to have stopped without recognizing a tool call. The response is saved in the transcript (suspicious_final event). You can ask it to continue or resend the task.',
|
|
776
880
|
},
|
|
777
881
|
'msg.critical': { ru: 'Критическая ошибка:', en: 'Critical error:' },
|
|
778
882
|
'msg.error': { ru: 'Ошибка:', en: 'Error:' },
|
|
779
|
-
'confirm.hint': {
|
|
780
|
-
ru: 'всегда для этого типа',
|
|
781
|
-
en: 'always for this kind',
|
|
782
|
-
},
|
|
783
|
-
'confirm.ask_label': { ru: 'Разрешить', en: 'Allow' },
|
|
784
883
|
'msg.reloaded': {
|
|
785
884
|
ru: 'Перезагружено модулей: {n}. Браузер и чат не тронуты.',
|
|
786
885
|
en: 'Modules reloaded: {n}. Browser and chat untouched.',
|
|
@@ -1137,6 +1236,11 @@ export const CATALOG = {
|
|
|
1137
1236
|
},
|
|
1138
1237
|
'undo.changed': { ru: 'изменён', en: 'changed' },
|
|
1139
1238
|
'undo.created': { ru: 'создан', en: 'created' },
|
|
1239
|
+
'undo.reason_empty': { ru: 'история пуста', en: 'history is empty' },
|
|
1240
|
+
'undo.reason_disabled': {
|
|
1241
|
+
ru: 'undo отключён в конфиге',
|
|
1242
|
+
en: 'undo is disabled in the config',
|
|
1243
|
+
},
|
|
1140
1244
|
'dom.saved': { ru: 'HTML сохранён: {v}', en: 'HTML saved: {v}' },
|
|
1141
1245
|
'dom.selectors': { ru: 'Селекторы:', en: 'Selectors:' },
|
|
1142
1246
|
'dom.save_error': {
|
|
@@ -1159,10 +1263,6 @@ export const CATALOG = {
|
|
|
1159
1263
|
ru: 'Не удалось перейти: {v}',
|
|
1160
1264
|
en: 'Failed to change directory: {v}',
|
|
1161
1265
|
},
|
|
1162
|
-
calibrate: {
|
|
1163
|
-
ru: '\n🔧 Режим калибровки селекторов\n',
|
|
1164
|
-
en: '\n🔧 Selector calibration mode\n',
|
|
1165
|
-
},
|
|
1166
1266
|
'reload.auto_partial': {
|
|
1167
1267
|
ru: '⚠ авто-reload: часть модулей не загрузилась, работаю на прежней версии:',
|
|
1168
1268
|
en: '⚠ auto-reload: some modules failed, using previous version:',
|
|
@@ -1213,7 +1313,6 @@ export const CATALOG = {
|
|
|
1213
1313
|
// ---------- config menu ----------
|
|
1214
1314
|
'cfg.group.ui': { ru: 'Интерфейс', en: 'Interface' },
|
|
1215
1315
|
'cfg.group.agent': { ru: 'Агент', en: 'Agent' },
|
|
1216
|
-
'cfg.group.confirmation': { ru: 'Подтверждения', en: 'Confirmations' },
|
|
1217
1316
|
'cfg.group.undo': { ru: 'Откат (undo)', en: 'Undo' },
|
|
1218
1317
|
'cfg.group.transcript': { ru: 'Транскрипт', en: 'Transcript' },
|
|
1219
1318
|
'cfg.group.browser': { ru: 'Браузер / DeepSeek', en: 'Browser / DeepSeek' },
|
|
@@ -1242,18 +1341,6 @@ export const CATALOG = {
|
|
|
1242
1341
|
ru: 'Авто-перечитывание модулей перед задачей',
|
|
1243
1342
|
en: 'Auto-reload logic modules before each task',
|
|
1244
1343
|
},
|
|
1245
|
-
'cfg.f.confirmation_write': {
|
|
1246
|
-
ru: 'Спрашивать перед Write',
|
|
1247
|
-
en: 'Ask before Write',
|
|
1248
|
-
},
|
|
1249
|
-
'cfg.f.confirmation_edit': {
|
|
1250
|
-
ru: 'Спрашивать перед Edit',
|
|
1251
|
-
en: 'Ask before Edit',
|
|
1252
|
-
},
|
|
1253
|
-
'cfg.f.confirmation_bash': {
|
|
1254
|
-
ru: 'Спрашивать перед Bash',
|
|
1255
|
-
en: 'Ask before Bash',
|
|
1256
|
-
},
|
|
1257
1344
|
'cfg.f.undo_enabled': {
|
|
1258
1345
|
ru: 'Включить бэкапы для отката',
|
|
1259
1346
|
en: 'Enable undo backups',
|
|
@@ -1493,8 +1580,8 @@ export const CATALOG = {
|
|
|
1493
1580
|
en: 'Config write scope: {v} ({file})',
|
|
1494
1581
|
},
|
|
1495
1582
|
'cfg.scope_usage': {
|
|
1496
|
-
ru: 'Использование: /config scope <project|home>. project = .zamesrc.json (в git), home = ~/.zames/. Для личных настроек
|
|
1497
|
-
en: 'Usage: /config scope <project|home>. project = .zamesrc.json (committed), home = ~/.zames/. Use home for personal settings
|
|
1583
|
+
ru: 'Использование: /config scope <project|home>. project = .zamesrc.json (в git), home = ~/.zames/. Для личных настроек выбери home, чтобы не коммитить их.',
|
|
1584
|
+
en: 'Usage: /config scope <project|home>. project = .zamesrc.json (committed), home = ~/.zames/. Use home for personal settings so they are not committed.',
|
|
1498
1585
|
},
|
|
1499
1586
|
'cfg.scope_set': {
|
|
1500
1587
|
ru: 'Запись конфига: {v} ({file})',
|