zames_pro 2.82.139 → 2.82.141
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 +57 -0
- package/README.md +68 -42
- package/SECURITY.md +6 -3
- package/dist/browser.js +8 -2
- package/dist/commands.js +5 -1
- package/dist/compact.js +6 -1
- package/dist/config-command.js +17 -1
- package/dist/config.js +63 -10
- package/dist/context.js +27 -9
- package/dist/i18n/common.js +16 -11
- package/dist/i18n/config.js +9 -2
- package/dist/i18n/deepseek.js +2 -2
- package/dist/i18n/doctor.js +9 -5
- package/dist/i18n/glm.js +2 -2
- package/dist/i18n/help.js +126 -117
- package/dist/i18n/mcp.js +11 -5
- package/dist/i18n/prompt.js +9 -3
- package/dist/i18n/qwen.js +2 -2
- package/dist/i18n/self-review.js +4 -0
- package/dist/i18n/spinner.js +13 -8
- package/dist/index.js +41 -7
- package/dist/mcp.js +4 -1
- package/dist/prompt.js +16 -1
- package/dist/status-command.js +6 -2
- package/dist/system-prompt.js +8 -0
- package/dist/tui/AskQuestion.js +1 -1
- package/dist/tui/TuiEditor.js +7 -0
- package/dist/tui/widgets.js +4 -2
- package/llms-full.txt +35 -22
- package/llms.txt +4 -2
- package/package.json +2 -2
- package/skills/systematic-debugging/SKILL.md +7 -0
- package/skills/test-driven-development/SKILL.md +5 -0
- package/skills/verification-before-completion/SKILL.md +5 -0
- package/skills/writing-plans/SKILL.md +12 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,63 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.82.141] - 2026-10-26
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **i18n:** /rewind help names --yes and the default point
|
|
15
|
+
- **i18n:** /web help lists the /websearch alias
|
|
16
|
+
- **i18n:** /config help lists its subcommand aliases
|
|
17
|
+
- **i18n:** /queue help lists its list/clear aliases
|
|
18
|
+
- **i18n:** /goal help lists the off and on forms
|
|
19
|
+
- **i18n:** json and jsonl are the same event stream
|
|
20
|
+
- **i18n:** the /loop floor is not a 15s provider throttle
|
|
21
|
+
- **help:** list the /session and /usage aliases
|
|
22
|
+
- **i18n:** drop the duplicate backslash newline hint
|
|
23
|
+
- **tui:** enable the kitty keyboard protocol so Shift+Enter works
|
|
24
|
+
- **i18n:** drop the duplicate status.review_none key
|
|
25
|
+
- **i18n:** /status says MCP tools is a count, not a list
|
|
26
|
+
- **i18n:** the empty-screen hint names a working newline key
|
|
27
|
+
- **prompt:** say that plan mode also hides mutating MCP tools
|
|
28
|
+
- **prompt:** list every *_base64 escape hatch
|
|
29
|
+
- **i18n:** plan mode lists every dropped tool, MCP included
|
|
30
|
+
- **prompt:** decode the terminal bytes across reads, not per read
|
|
31
|
+
- **i18n:** the clipboard hint names the real Wayland and Windows tools
|
|
32
|
+
- **i18n:** the doctor auth row describes the sign-in marker it actually reads
|
|
33
|
+
- **i18n:** the Qwen guest notice says /provider login opens the window itself
|
|
34
|
+
- **i18n:** each full-screen key hint names its own mouse mode
|
|
35
|
+
- **i18n:** the TUI key hint does not advertise a wheel that is off
|
|
36
|
+
- **i18n:** Esc in the AskUser modal means no answer, not dismiss
|
|
37
|
+
- **i18n:** keep prompt.answer_language English in both locales
|
|
38
|
+
- **mcp:** localize the floating-version warning
|
|
39
|
+
- **browser:** localize the send-pause fallback line
|
|
40
|
+
- **browser:** DeepSeek login notices go through the UI hook
|
|
41
|
+
- **compact:** fill the {provider} placeholder in compact.start
|
|
42
|
+
- **i18n:** AskUser free-text mode explains how to send
|
|
43
|
+
- **llms:** generated header says GLM runs headed too
|
|
44
|
+
- **i18n:** suggestion hint says Ctrl+N/P select, not scroll
|
|
45
|
+
- **i18n:** startup hint shows Ctrl+V for clipboard images too
|
|
46
|
+
- **i18n:** /last says there is no session for THIS directory
|
|
47
|
+
- **i18n:** drop the unverified ~10 messages/day guest quota claim
|
|
48
|
+
- **i18n:** keep the agent-facing ONLY TOOL CALLS block English in both locales
|
|
49
|
+
- **i18n:** MCP hint lists the .mcp.json path too
|
|
50
|
+
- **i18n:** help shows the real clipboard paste binding (Ctrl+V)
|
|
51
|
+
- **i18n:** GLM guest_limit message says the quota is exhausted
|
|
52
|
+
- **i18n:** deepseek send_no_start states the real ~50s budget
|
|
53
|
+
- **i18n:** describe both mouseScroll states and the real default
|
|
54
|
+
- **i18n:** translate the English /status labels into Russian
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
|
|
58
|
+
- **i18n:** drop the duplicate doctor.unknown and msg.not_dir keys
|
|
59
|
+
|
|
60
|
+
## [2.82.140] - 2026-10-25
|
|
61
|
+
|
|
62
|
+
### Fixed
|
|
63
|
+
|
|
64
|
+
- **scheduler:** stop the ticker on exit; correct the abort help line
|
|
65
|
+
- **config:** say when a project config overrides the home one
|
|
66
|
+
|
|
10
67
|
## [2.82.139] - 2026-10-25
|
|
11
68
|
|
|
12
69
|
### Changed
|
package/README.md
CHANGED
|
@@ -127,7 +127,9 @@ Key pieces:
|
|
|
127
127
|
- **Subagents** — the `Task` tool delegates a self-contained sub-task to an
|
|
128
128
|
agent in its own separate chat (isolated context), which returns only a
|
|
129
129
|
report, so heavy research does not flood the main context. On by default;
|
|
130
|
-
|
|
130
|
+
`browser.subagents` turns it off and `browser.maxSubagents` caps the runs
|
|
131
|
+
per TASK (default 3). Calls are sequential, not parallel, and the subtype
|
|
132
|
+
matters: `explore` is read-only, `general` may edit files.
|
|
131
133
|
- **MCP support** — plug in external tool servers (e.g. `@playwright/mcp`).
|
|
132
134
|
- **Scheduling** — `/loop`, `/cron` and `/jobs` repeat tasks on a timer.
|
|
133
135
|
- **Bilingual UI** — Russian / English (`/config lang`).
|
|
@@ -287,8 +289,12 @@ The prompt is a small line editor with persistent history:
|
|
|
287
289
|
- `Ctrl+_` — undo the last edit in the input line (a fat-fingered `Ctrl+U` /
|
|
288
290
|
`Ctrl+K` is recoverable).
|
|
289
291
|
- `Ctrl+U` — clear the line, `Ctrl+K` — delete to end of line, `Ctrl+W` —
|
|
290
|
-
delete the word before the cursor, `Ctrl+←`/`Ctrl+→` — move by words
|
|
291
|
-
|
|
292
|
+
delete the word before the cursor, `Ctrl+←`/`Ctrl+→` — move by words,
|
|
293
|
+
`Ctrl+Delete`/`Alt+Delete` — delete the word after the cursor.
|
|
294
|
+
- `\` + `Enter` and `Ctrl+J` — insert a newline; these two work in
|
|
295
|
+
every terminal. `Ctrl+Enter` and `Shift+Enter` do it too, but only where the
|
|
296
|
+
terminal implements the kitty keyboard protocol: without it the terminal
|
|
297
|
+
sends a PLAIN Enter for Shift+Enter and the message is sent.
|
|
292
298
|
- `/` + `Tab` — slash-command hints and completion.
|
|
293
299
|
- `!command` — run a shell command directly, bypassing the model (like
|
|
294
300
|
Claude Code's bash mode). The same sandbox guard as the `Bash` tool applies,
|
|
@@ -302,9 +308,10 @@ selected without leaving the terminal:
|
|
|
302
308
|
wheel never scrolls the input history — history is arrow keys only.
|
|
303
309
|
- `ui.mouseScroll=false` — the terminal owns the mouse again: normal text
|
|
304
310
|
selection works and the wheel is inert.
|
|
305
|
-
- `PgUp` / `PgDn`
|
|
306
|
-
|
|
307
|
-
input line is empty
|
|
311
|
+
- the mouse wheel, `PgUp` / `PgDn` (half a screen) and `Home` / `End` (the very
|
|
312
|
+
top / bottom) scroll the dialog; the wheel needs `ui.mouseScroll=true` (the default), and
|
|
313
|
+
Home/End jump only while the input line is empty (with text typed they
|
|
314
|
+
move the caret as usual).
|
|
308
315
|
- To copy a LARGE block, use `/export` (writes the whole session as Markdown)
|
|
309
316
|
or the transcript file (`/transcript` shows the path) — the terminal's own
|
|
310
317
|
drag-select cannot reach past one screen.
|
|
@@ -313,8 +320,8 @@ Set `NO_COLOR=1` to disable colors (a calm default palette is used otherwise).
|
|
|
313
320
|
|
|
314
321
|
### Images and files
|
|
315
322
|
|
|
316
|
-
You can paste an image or a file into the input line (
|
|
317
|
-
|
|
323
|
+
You can paste an image or a file into the input line (Shift+Insert or the
|
|
324
|
+
terminal's own paste; for a FILE from the clipboard press Ctrl+V). zames saves it under `<project>/tmp` and shows a
|
|
318
325
|
marker in the line - `[image#1]` for images, `[file#1]` for other files - then
|
|
319
326
|
uploads the real file to the chat together with your message. These are the
|
|
320
327
|
same formats the DeepSeek / Qwen / GLM web chat accepts (PNG, JPEG, GIF, WEBP, BMP,
|
|
@@ -384,6 +391,8 @@ The agent has the same style of tools as Claude Code / Codex CLI:
|
|
|
384
391
|
- **Git** — `GitStatus`, `GitDiff`, `GitLog`, `GitShow`, `GitBranchList`,
|
|
385
392
|
`GitAdd`, `GitCommit`, `GitPush`.
|
|
386
393
|
- **Web** — `WebFetch`, `WebSearch`.
|
|
394
|
+
- **Subagents** — `Task` (delegate a self-contained sub-task to an agent in
|
|
395
|
+
its own chat; `explore` is read-only, `general` may edit; capped per task).
|
|
387
396
|
- **Operator** — `AskUser` (a modal question with options; skipped in plan
|
|
388
397
|
mode so a plan is never interrupted).
|
|
389
398
|
- **Service** — `respond` (final answer to the operator, ends the task).
|
|
@@ -431,8 +440,9 @@ commands (/new or /clear, /sessions, /chats, /resume-id, /last, /chat, /cd,
|
|
|
431
440
|
- /review [focus] [--staged] — ask the agent to review uncommitted changes
|
|
432
441
|
and report findings (no code changes).
|
|
433
442
|
- /plan [on|off] — plan (read-only) mode. While it is on, the mutating tools
|
|
434
|
-
(Write/Edit/MultiEdit/ApplyPatch/Bash, GitAdd/GitCommit/GitPush
|
|
435
|
-
from the tool set, so
|
|
443
|
+
(Write/Edit/MultiEdit/ApplyPatch/Bash/BashOutput, GitAdd/GitCommit/GitPush,
|
|
444
|
+
AskUser) are removed from the tool set, and so are MCP tools with a mutating
|
|
445
|
+
name, so the agent can investigate without touching the tree.
|
|
436
446
|
Start in it with `--plan`.
|
|
437
447
|
- /compact — ask the active backend to compress the current chat into a handover
|
|
438
448
|
summary, then open a NEW chat, resend the system prompt and post the summary
|
|
@@ -440,9 +450,10 @@ commands (/new or /clear, /sessions, /chats, /resume-id, /last, /chat, /cd,
|
|
|
440
450
|
- /goal <condition> — set a **completion condition** (Claude Code parity). The
|
|
441
451
|
agent starts working toward it at once and keeps starting new turns until a
|
|
442
452
|
separate evaluator model judges the condition met. The goal clears itself
|
|
443
|
-
automatically when it is met (or judged impossible), or with `/goal clear
|
|
444
|
-
The condition is stored in `<project>/.zames-goal`
|
|
445
|
-
on the next launch. `/goal` with no argument
|
|
453
|
+
automatically when it is met (or judged impossible), or with `/goal clear`
|
|
454
|
+
(or its synonym `/goal off`). The condition is stored in `<project>/.zames-goal`
|
|
455
|
+
(git-ignored) and restored on the next launch. `/goal` with no argument — or
|
|
456
|
+
`/goal on` — shows the current state.
|
|
446
457
|
- /loop <interval> <task> — repeat a task periodically (e.g. `/loop 10m run the
|
|
447
458
|
tests`). /cron "<min> <hour> <dom> <month> <dow>" <task> — run on a schedule.
|
|
448
459
|
/jobs [rm <id>|clear] lists and stops them. A fired job is put into the same
|
|
@@ -456,8 +467,9 @@ tests`). /cron "<min> <hour> <dom> <month> <dow>" <task> — run on a schedule.
|
|
|
456
467
|
"Web search" item in the "+" menu.
|
|
457
468
|
These (and /queue, /jobs, /goal, `/config <sub>`) can be used WHILE the agent
|
|
458
469
|
is working — they do not touch the in-flight generation.
|
|
459
|
-
- /queue [clear] — list or clear
|
|
460
|
-
current
|
|
470
|
+
- /queue [list|ls|clear|c|clean] — list (`list`/`ls`) or clear
|
|
471
|
+
(`clear`/`c`/`clean`) the messages waiting to be sent after the current
|
|
472
|
+
task.
|
|
461
473
|
|
|
462
474
|
The token context is also shown live: the status line above the input has the
|
|
463
475
|
spinner/text on the left and the context on the right (e.g. `125k · 13%`). The
|
|
@@ -563,8 +575,7 @@ too):
|
|
|
563
575
|
|
|
564
576
|
- **Memory** (`@modelcontextprotocol/server-memory`) — a local knowledge graph
|
|
565
577
|
(9 tools) for durable facts across chats. NOTE: zames already has `MEMORY.md`
|
|
566
|
-
|
|
567
|
-
* `AGENTS.md`; add this only if you want a queryable graph.
|
|
578
|
+
+ `AGENTS.md`; add this only if you want a queryable graph.
|
|
568
579
|
|
|
569
580
|
Keep the stack SMALL: every server loads its tool definitions into the model's
|
|
570
581
|
context. Add one when you feel its absence, not before.
|
|
@@ -580,13 +591,14 @@ You can view and change settings without leaving the agent — use the
|
|
|
580
591
|
toggle in place; numbers and strings open an input prompt.
|
|
581
592
|
|
|
582
593
|
```
|
|
583
|
-
/config interactive settings menu
|
|
584
|
-
/config list print all editable settings
|
|
594
|
+
/config interactive settings menu (alias: menu)
|
|
595
|
+
/config list print all editable settings (aliases: show, ls)
|
|
585
596
|
/config get <path> show a setting
|
|
586
597
|
/config set <path> <value> change a setting
|
|
587
|
-
/config reset <path> reset a setting to its default
|
|
588
|
-
/config path show config file paths
|
|
598
|
+
/config reset <path> reset a setting to its default (alias: unset)
|
|
599
|
+
/config path show config file paths (alias: paths)
|
|
589
600
|
/config lang <ru|en> switch interface and agent language
|
|
601
|
+
(aliases: language, язык)
|
|
590
602
|
```
|
|
591
603
|
|
|
592
604
|
Examples:
|
|
@@ -821,7 +833,10 @@ zames не вызывает API модели. Он запускает headless C
|
|
|
821
833
|
- **Субагенты** — инструмент `Task` поручает самодостаточную подзадачу агенту
|
|
822
834
|
в отдельном чате (изолированный контекст), который возвращает только отчёт,
|
|
823
835
|
так что тяжёлая разведка не засоряет основной контекст. Включены по
|
|
824
|
-
умолчанию;
|
|
836
|
+
умолчанию; `browser.subagents` выключает их, а `browser.maxSubagents` ограничивает
|
|
837
|
+
число запусков на ОДНУ задачу (по умолчанию 3). Вызовы последовательные,
|
|
838
|
+
не параллельные, и подтип важен: `explore` только читает, `general` может
|
|
839
|
+
править файлы.
|
|
825
840
|
- **Поддержка MCP** — подключение внешних серверов инструментов (например,
|
|
826
841
|
`@playwright/mcp`).
|
|
827
842
|
- **Планировщик** — `/loop`, `/cron` и `/jobs` повторяют задачи по таймеру.
|
|
@@ -980,9 +995,13 @@ zames
|
|
|
980
995
|
- `Ctrl+_` — отменить последнюю правку строки ввода (случайно нажатые
|
|
981
996
|
`Ctrl+U` / `Ctrl+K` можно вернуть).
|
|
982
997
|
- `Ctrl+U` — очистить строку, `Ctrl+K` — удалить до конца строки, `Ctrl+W` —
|
|
983
|
-
удалить слово перед курсором, `Ctrl+←`/`Ctrl+→` — переход по
|
|
984
|
-
|
|
985
|
-
|
|
998
|
+
удалить слово перед курсором, `Ctrl+←`/`Ctrl+→` — переход по словам,
|
|
999
|
+
`Ctrl+Delete`/`Alt+Delete` — удалить слово после курсора.
|
|
1000
|
+
- `\` + `Enter` и `Ctrl+J` — вставить новую строку; эти две
|
|
1001
|
+
работают в любом терминале. `Ctrl+Enter` и `Shift+Enter` тоже вставляют
|
|
1002
|
+
строку, но только там, где терминал поддерживает kitty-протокол
|
|
1003
|
+
клавиатуры: без него Shift+Enter приходит как обычный Enter, и
|
|
1004
|
+
сообщение отправляется.
|
|
986
1005
|
- `/` + `Tab` — подсказки и автодополнение слэш-команд.
|
|
987
1006
|
- `!команда` — выполнить shell-команду напрямую, минуя модель (как bash-режим
|
|
988
1007
|
Claude Code). Действует та же песочница, что и для инструмента `Bash`, так
|
|
@@ -996,9 +1015,10 @@ zames
|
|
|
996
1015
|
никогда не листает историю ввода — история только стрелками.
|
|
997
1016
|
- `ui.mouseScroll=false` — мышью снова владеет терминал: обычное выделение
|
|
998
1017
|
текста работает, колесо инертно.
|
|
999
|
-
- `PgUp` / `PgDn`
|
|
1000
|
-
|
|
1001
|
-
|
|
1018
|
+
- колесо мыши, `PgUp` / `PgDn` (пол-экрана) и `Home` / `End` (самый верх / низ)
|
|
1019
|
+
прокручивают диалог; колесо работает при `ui.mouseScroll=true` (по умолчанию), а
|
|
1020
|
+
Home/End прыгают только когда строка ввода пуста (при набранном тексте
|
|
1021
|
+
они двигают курсор, как обычно).
|
|
1002
1022
|
- Чтобы скопировать БОЛЬШОЙ кусок, используйте `/export` (пишет всю сессию в
|
|
1003
1023
|
Markdown) или файл транскрипта (`/transcript` покажет путь) — собственным
|
|
1004
1024
|
выделением терминала за пределы одного экрана не выделить.
|
|
@@ -1008,8 +1028,8 @@ zames
|
|
|
1008
1028
|
|
|
1009
1029
|
### Картинки и файлы
|
|
1010
1030
|
|
|
1011
|
-
В строку ввода можно вставить картинку или файл (
|
|
1012
|
-
|
|
1031
|
+
В строку ввода можно вставить картинку или файл (Shift+Insert или
|
|
1032
|
+
собственной вставкой терминала; файл из буфера обмена — по Ctrl+V). zames сохраняет его в `<project>/tmp` и
|
|
1013
1033
|
показывает маркер в строке — `[image#1]` для картинок, `[file#1]` для прочих
|
|
1014
1034
|
файлов — затем загружает реальный файл в чат вместе с вашим сообщением. Это те
|
|
1015
1035
|
же форматы, что принимает веб-чат DeepSeek / Qwen / GLM (PNG, JPEG, GIF, WEBP, BMP,
|
|
@@ -1079,6 +1099,9 @@ zames --task "..." --output-format jsonl \
|
|
|
1079
1099
|
- **Git** — `GitStatus`, `GitDiff`, `GitLog`, `GitShow`, `GitBranchList`,
|
|
1080
1100
|
`GitAdd`, `GitCommit`, `GitPush`.
|
|
1081
1101
|
- **Web** — `WebFetch`, `WebSearch`.
|
|
1102
|
+
- **Субагенты** — `Task` (делегировать самодостаточную подзадачу агенту в
|
|
1103
|
+
отдельном чате; `explore` только читает, `general` может править; число
|
|
1104
|
+
запусков на задачу ограничено).
|
|
1082
1105
|
- **Оператор** — `AskUser` (модальный вопрос с вариантами; в режиме плана не
|
|
1083
1106
|
предлагается, чтобы не прерывать план).
|
|
1084
1107
|
- **Служебный** — `respond` (финальный ответ оператору, завершает задачу).
|
|
@@ -1127,9 +1150,10 @@ zames --task "..." --output-format jsonl \
|
|
|
1127
1150
|
- /review [focus] [--staged] — попросить агента проверить незакоммиченные
|
|
1128
1151
|
изменения и сообщить находки (без правок кода).
|
|
1129
1152
|
- /plan [on|off] — режим плана (только чтение). Пока он включён, мутирующие
|
|
1130
|
-
инструменты (Write/Edit/MultiEdit/ApplyPatch/Bash,
|
|
1131
|
-
убраны из
|
|
1132
|
-
|
|
1153
|
+
инструменты (Write/Edit/MultiEdit/ApplyPatch/Bash/BashOutput,
|
|
1154
|
+
GitAdd/GitCommit/GitPush, AskUser) убраны из набора вместе с MCP-инструментами
|
|
1155
|
+
с мутирующим именем, чтобы агент изучал код, не трогая дерево. Стартовать в
|
|
1156
|
+
нём можно с `--plan`.
|
|
1133
1157
|
- /compact — попросить активный бэкенд сжать текущий чат в передаточное резюме,
|
|
1134
1158
|
затем открыть НОВЫЙ чат, заново отправить системный промпт и положить резюме как
|
|
1135
1159
|
перенесённый контекст. Используйте, когда контекст разрастается.
|
|
@@ -1137,9 +1161,10 @@ zames --task "..." --output-format jsonl \
|
|
|
1137
1161
|
сразу начинает работать над ним и продолжает запускать новые ходы, пока
|
|
1138
1162
|
отдельная модель-оценщик не признает условие выполненным. Цель снимается
|
|
1139
1163
|
автоматически при достижении (или если оценщик признал её недостижимой),
|
|
1140
|
-
либо командой `/goal clear
|
|
1141
|
-
(git-ignored) и восстанавливается при
|
|
1142
|
-
аргумента
|
|
1164
|
+
либо командой `/goal clear` (синоним — `/goal off`). Условие
|
|
1165
|
+
хранится в `<project>/.zames-goal` (git-ignored) и восстанавливается при
|
|
1166
|
+
следующем запуске. `/goal` без аргумента — или `/goal on` —
|
|
1167
|
+
показывает текущее состояние.
|
|
1143
1168
|
- /loop <interval> <task> — повторять задачу периодически (например,
|
|
1144
1169
|
`/loop 10m run the tests`). /cron "<min> <hour> <dom> <month> <dow>" <task> —
|
|
1145
1170
|
запуск по расписанию. /jobs [rm <id>|clear] перечисляет и останавливает их.
|
|
@@ -1153,8 +1178,8 @@ zames --task "..." --output-format jsonl \
|
|
|
1153
1178
|
в меню «+».
|
|
1154
1179
|
Их (а также /queue, /jobs, /goal, `/config <sub>`) можно использовать, ПОКА
|
|
1155
1180
|
агент работает — они не трогают текущую генерацию.
|
|
1156
|
-
- /queue [clear] — показать или очистить
|
|
1157
|
-
текущей задачи.
|
|
1181
|
+
- /queue [list|ls|clear|c|clean] — показать (`list`/`ls`) или очистить
|
|
1182
|
+
(`clear`/`c`/`clean`) сообщения, ждущие отправки после текущей задачи.
|
|
1158
1183
|
|
|
1159
1184
|
Контекст в токенах показывается и вживую: в строке статуса над вводом слева
|
|
1160
1185
|
спиннер/текст, справа — контекст (например, `125k · 13%`). Процент считается от
|
|
@@ -1276,13 +1301,14 @@ MCP-браузер и браузер агента подерутся за оди
|
|
|
1276
1301
|
enum переключаются на месте; числа и строки открывают ввод.
|
|
1277
1302
|
|
|
1278
1303
|
```
|
|
1279
|
-
/config интерактивное меню настроек
|
|
1280
|
-
/config list показать все изменяемые настройки
|
|
1304
|
+
/config интерактивное меню настроек (алиас: menu)
|
|
1305
|
+
/config list показать все изменяемые настройки (алиасы: show, ls)
|
|
1281
1306
|
/config get <path> показать настройку
|
|
1282
1307
|
/config set <path> <value> изменить настройку
|
|
1283
|
-
/config reset <path> сбросить настройку к дефолту
|
|
1284
|
-
/config path показать пути файлов конфига
|
|
1308
|
+
/config reset <path> сбросить настройку к дефолту (алиас: unset)
|
|
1309
|
+
/config path показать пути файлов конфига (алиас: paths)
|
|
1285
1310
|
/config lang <ru|en> переключить язык интерфейса и агента
|
|
1311
|
+
(алиасы: language, язык)
|
|
1286
1312
|
```
|
|
1287
1313
|
|
|
1288
1314
|
Примеры:
|
package/SECURITY.md
CHANGED
|
@@ -19,8 +19,8 @@ is not a sandbox:
|
|
|
19
19
|
your user. Treat every task you give the agent as code you are willing to
|
|
20
20
|
run.
|
|
21
21
|
- The chat-provider credentials in `~/.zames/config.json` and the browser
|
|
22
|
-
profiles (`~/.zames/profile`, `~/.zames/qwen-profile`)
|
|
23
|
-
never leave your machine. Files
|
|
22
|
+
profiles (`~/.zames/profile`, `~/.zames/qwen-profile`, `~/.zames/glm-profile`)
|
|
23
|
+
are sensitive. They never leave your machine. Files
|
|
24
24
|
written by the agent's own state/config writers are created with `0600`
|
|
25
25
|
permissions, but files created by your own tools or by `Bash` follow your
|
|
26
26
|
umask.
|
|
@@ -40,7 +40,10 @@ is not a sandbox:
|
|
|
40
40
|
tools from the model's tool set. Since this release it also drops MCP tools
|
|
41
41
|
whose names look mutating (click/type/write/...); the classification is a
|
|
42
42
|
heuristic deny-list, so treat plan mode as a strong hint rather than a hard
|
|
43
|
-
guarantee for third-party MCP servers.
|
|
43
|
+
guarantee for third-party MCP servers. It is NOT a security boundary:
|
|
44
|
+
it only makes those tools INVISIBLE to the model for that task —
|
|
45
|
+
`.zames/permissions.json` is unchanged, no OS isolation is added, and a
|
|
46
|
+
server whose tool name the heuristic does not recognise is still offered.
|
|
44
47
|
- `Write`/`Edit` and the multi-file tools keep a backup (`/undo`,
|
|
45
48
|
`/undo-list`), but that is an undo safety net, not a security boundary. Give
|
|
46
49
|
the agent only tasks you are willing to run.
|
package/dist/browser.js
CHANGED
|
@@ -616,7 +616,11 @@ export class DeepSeekBrowser {
|
|
|
616
616
|
catch { }
|
|
617
617
|
},
|
|
618
618
|
persistSession: () => this._persistSessionIfNeeded(),
|
|
619
|
-
notice
|
|
619
|
+
// Route login notices through the SAME notice hook as every other
|
|
620
|
+
// message: a raw console.log is painted OVER by the LineEditor status
|
|
621
|
+
// line, so the operator saw a frozen spinner instead of "a browser
|
|
622
|
+
// window opened" / "login timed out" (see DESIGN-NOTES, onNotice).
|
|
623
|
+
notice: (key) => this._notice(this._t(key)),
|
|
620
624
|
isAborted: () => this._abort,
|
|
621
625
|
windowClosed: () => this._windowClosed,
|
|
622
626
|
sleep: (ms) => new Promise((r) => setTimeout(r, ms)),
|
|
@@ -1932,7 +1936,9 @@ export class DeepSeekBrowser {
|
|
|
1932
1936
|
catch { }
|
|
1933
1937
|
}
|
|
1934
1938
|
else {
|
|
1935
|
-
|
|
1939
|
+
// Fallback when no UI hook is wired (a direct ask() from a script):
|
|
1940
|
+
// localize it — the pause is operator-facing text.
|
|
1941
|
+
console.error(theme.warn(translate(this.locale)('spinner.pause', { n: String(secs) })));
|
|
1936
1942
|
}
|
|
1937
1943
|
};
|
|
1938
1944
|
report(gap);
|
package/dist/commands.js
CHANGED
|
@@ -336,7 +336,7 @@ export function renderDoctor(d, t = translate('en')) {
|
|
|
336
336
|
: t('doctor.not_repo'));
|
|
337
337
|
row(d.configOk, 'config', d.configOk
|
|
338
338
|
? t('doctor.loaded')
|
|
339
|
-
: t('doctor.error', { v: d.configError || t('
|
|
339
|
+
: t('doctor.error', { v: d.configError || t('common.unknown') }));
|
|
340
340
|
row(true, 'browser', d.browserChannel ? d.browserChannel : t('doctor.bundled'));
|
|
341
341
|
row(!!d.authSaved, 'auth', d.authSaved ? t('doctor.auth_saved') : t('doctor.auth_none'));
|
|
342
342
|
row(!!d.clipboardTool, 'clipboard', d.clipboardTool || t('doctor.clipboard_none'));
|
|
@@ -1203,6 +1203,8 @@ export const SLASH_COMMANDS = [
|
|
|
1203
1203
|
{ name: '/new', key: 'help.cmd.new' },
|
|
1204
1204
|
{ name: '/clear', key: 'help.cmd.new' },
|
|
1205
1205
|
{ name: '/sessions', key: 'help.cmd.sessions' },
|
|
1206
|
+
// ALIAS: /session is handled by the same branch in src/index.ts.
|
|
1207
|
+
{ name: '/session', key: 'help.cmd.sessions' },
|
|
1206
1208
|
{ name: '/chats', key: 'help.cmd.chats' },
|
|
1207
1209
|
{ name: '/resume-id', key: 'help.cmd.resume_id' },
|
|
1208
1210
|
{ name: '/last', key: 'help.cmd.last' },
|
|
@@ -1223,6 +1225,8 @@ export const SLASH_COMMANDS = [
|
|
|
1223
1225
|
{ name: '/diff', key: 'help.cmd.diff' },
|
|
1224
1226
|
{ name: '/diffstat', key: 'help.cmd.diffstat' },
|
|
1225
1227
|
{ name: '/cost', key: 'help.cmd.cost' },
|
|
1228
|
+
// ALIAS: /usage takes the same branch as /cost.
|
|
1229
|
+
{ name: '/usage', key: 'help.cmd.cost' },
|
|
1226
1230
|
{ name: '/limits', key: 'help.cmd.limits' },
|
|
1227
1231
|
{ name: '/export', key: 'help.cmd.export' },
|
|
1228
1232
|
{ name: '/doctor', key: 'help.cmd.doctor' },
|
package/dist/compact.js
CHANGED
|
@@ -17,6 +17,11 @@ export const COMPACT_FALLBACK_LIMIT = 40;
|
|
|
17
17
|
export async function performCompact(opts) {
|
|
18
18
|
const { browser, workdir, locale, task, transcript = null, ui = null, buildSystemPrompt, tools, answerTimeoutMs, fallbackLimit = COMPACT_FALLBACK_LIMIT, skipUiLock = false, quiet = false, selfImprovement = false, contextExhausted = false, } = opts;
|
|
19
19
|
const t = translate(locale);
|
|
20
|
+
// The active provider's LABEL for operator-facing text: performCompact is
|
|
21
|
+
// shared by every backend, so it cannot hardcode "DeepSeek". `providerArg`
|
|
22
|
+
// comes from the caller (the same registry label the rest of the UI shows);
|
|
23
|
+
// the browser is only a fallback for direct callers and tests.
|
|
24
|
+
const providerLabel = opts.providerLabel || 'DeepSeek';
|
|
20
25
|
const log = (msg) => {
|
|
21
26
|
if (!quiet)
|
|
22
27
|
console.error(msg);
|
|
@@ -42,7 +47,7 @@ export async function performCompact(opts) {
|
|
|
42
47
|
ui.lock(t('msg.input_locked'));
|
|
43
48
|
try {
|
|
44
49
|
if (!quiet)
|
|
45
|
-
log(t('compact.start'));
|
|
50
|
+
log(t('compact.start', { provider: providerLabel }));
|
|
46
51
|
// PreCompact hook: runs BEFORE the chat is summarized/rewritten, so
|
|
47
52
|
// a hook can persist state or notify. Best-effort.
|
|
48
53
|
try {
|
package/dist/config-command.js
CHANGED
|
@@ -15,8 +15,22 @@ import { configGetValue, configValueHint } from './config-commands.js';
|
|
|
15
15
|
* blindly from the main loop and from the live mid-run interception.
|
|
16
16
|
*/
|
|
17
17
|
export async function handleConfigCommand(input, deps) {
|
|
18
|
-
const { t, print, printErr, getValue, setValue, resetField, showList, openMenu, currentLocale, normalizeLocale, localeDisplayName, homeConfigPath, projectConfigPath, } = deps;
|
|
18
|
+
const { t, print, printErr, getValue, setValue, resetField, showList, openMenu, currentLocale, normalizeLocale, localeDisplayName, homeConfigPath, projectConfigPath, shadowedKeys, } = deps;
|
|
19
19
|
const schema = deps.schema;
|
|
20
|
+
// A HOME write is not always the value the next launch reads: the project
|
|
21
|
+
// `.zamesrc.json` is merged last, so a key present in both wins from the
|
|
22
|
+
// project file. Without this line the operator saw "saved" and then the OLD
|
|
23
|
+
// value after a restart (the stale `ui.locale: en` bug).
|
|
24
|
+
const warnShadowed = (key) => {
|
|
25
|
+
if (!shadowedKeys)
|
|
26
|
+
return;
|
|
27
|
+
if (!shadowedKeys().includes(key))
|
|
28
|
+
return;
|
|
29
|
+
printErr(theme.warn(t('cfg.shadowed', {
|
|
30
|
+
file: projectConfigPath,
|
|
31
|
+
keys: key,
|
|
32
|
+
})));
|
|
33
|
+
};
|
|
20
34
|
// Accept BOTH spellings: the main loop passes the whole typed line
|
|
21
35
|
// (`/config get ui.locale`), while tests and other callers pass the text
|
|
22
36
|
// after the command (`get ui.locale`). Reading parts[1] blindly made the
|
|
@@ -60,6 +74,7 @@ export async function handleConfigCommand(input, deps) {
|
|
|
60
74
|
return;
|
|
61
75
|
}
|
|
62
76
|
print(theme.assistant(t('cfg.lang_set', { v: localeDisplayName(loc) })));
|
|
77
|
+
warnShadowed('ui.locale');
|
|
63
78
|
return;
|
|
64
79
|
}
|
|
65
80
|
if (sub === 'get') {
|
|
@@ -105,6 +120,7 @@ export async function handleConfigCommand(input, deps) {
|
|
|
105
120
|
value: configGetValue(key, getValue(key), t),
|
|
106
121
|
file: homeConfigPath,
|
|
107
122
|
})));
|
|
123
|
+
warnShadowed(key);
|
|
108
124
|
return;
|
|
109
125
|
}
|
|
110
126
|
if (sub === 'reset' || sub === 'unset') {
|
package/dist/config.js
CHANGED
|
@@ -165,19 +165,72 @@ export const DEFAULTS = {
|
|
|
165
165
|
};
|
|
166
166
|
export function loadConfig() {
|
|
167
167
|
const merged = JSON.parse(JSON.stringify(DEFAULTS));
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
168
|
+
// Keys the PROJECT file overrides in the HOME file. Kept so the editor can
|
|
169
|
+
// say "your change was saved but the project file still wins" — a live
|
|
170
|
+
// symptom was `/config lang ru` answering "saved", then English after a
|
|
171
|
+
// restart, because a stale project `.zamesrc.json` pinned `ui.locale: en`.
|
|
172
|
+
shadowedKeys = [];
|
|
173
|
+
const homeData = readConfigObject(HOME_CONFIG);
|
|
174
|
+
const projectData = readConfigObject(projectConfigPath());
|
|
175
|
+
if (projectData) {
|
|
176
|
+
shadowedKeys = overriddenKeys(homeData, projectData);
|
|
177
|
+
}
|
|
178
|
+
for (const data of [homeData, projectData]) {
|
|
179
|
+
if (!data)
|
|
180
|
+
continue;
|
|
181
|
+
deepMerge(merged, data);
|
|
182
|
+
}
|
|
183
|
+
return merged;
|
|
184
|
+
}
|
|
185
|
+
/** Keys the lower-priority file also sets, from the last loadConfig(). */
|
|
186
|
+
let shadowedKeys = [];
|
|
187
|
+
export function shadowedConfigKeys() {
|
|
188
|
+
return shadowedKeys.slice();
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Every leaf path ("ui.locale", "browser.auth.username") present in BOTH
|
|
192
|
+
* objects — i.e. a value the PROJECT config overrides over the HOME one.
|
|
193
|
+
* PURE so the precedence puzzle can be tested without touching the disk.
|
|
194
|
+
*/
|
|
195
|
+
export function overriddenKeys(lower, higher) {
|
|
196
|
+
if (!lower || !higher)
|
|
197
|
+
return [];
|
|
198
|
+
const out = [];
|
|
199
|
+
const walk = (a, b, prefix) => {
|
|
200
|
+
for (const key of Object.keys(b)) {
|
|
201
|
+
if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
const path2 = prefix ? prefix + '.' + key : key;
|
|
205
|
+
const av = a[key];
|
|
206
|
+
const bv = b[key];
|
|
207
|
+
if (isPlainObject(av) && isPlainObject(bv)) {
|
|
208
|
+
walk(av, bv, path2);
|
|
209
|
+
}
|
|
210
|
+
else if (av !== undefined && !isPlainObject(bv)) {
|
|
211
|
+
out.push(path2);
|
|
177
212
|
}
|
|
178
213
|
}
|
|
214
|
+
};
|
|
215
|
+
walk(lower, higher, '');
|
|
216
|
+
return out.sort();
|
|
217
|
+
}
|
|
218
|
+
function isPlainObject(v) {
|
|
219
|
+
return !!v && typeof v === 'object' && !Array.isArray(v);
|
|
220
|
+
}
|
|
221
|
+
/** Parse one config file; null when it is missing or unreadable. */
|
|
222
|
+
function readConfigObject(file) {
|
|
223
|
+
try {
|
|
224
|
+
const data = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
225
|
+
return isPlainObject(data) ? data : null;
|
|
226
|
+
}
|
|
227
|
+
catch (e) {
|
|
228
|
+
const err = e;
|
|
229
|
+
if (err.code !== 'ENOENT') {
|
|
230
|
+
console.error(`config: failed to read ${file}: ${err.message}`);
|
|
231
|
+
}
|
|
232
|
+
return null;
|
|
179
233
|
}
|
|
180
|
-
return merged;
|
|
181
234
|
}
|
|
182
235
|
// The agent-loop watchdog deadline per provider. The loop default (240s) is
|
|
183
236
|
// tuned for DeepSeek; a Qwen GUEST turn regularly takes 7-8 minutes (cold
|
package/dist/context.js
CHANGED
|
@@ -66,7 +66,7 @@ const BUILTIN_SKILLS = [
|
|
|
66
66
|
// them out of the box; a project skill of the same name overrides them.
|
|
67
67
|
{
|
|
68
68
|
name: 'brainstorming',
|
|
69
|
-
description: 'Use when the request is a GOAL, not a spec — "add X", "make it better", "integrate Y" — and it is unclear what "done" means.',
|
|
69
|
+
description: 'Use when the operator\'s request is a GOAL, not a spec — "add X", "make it better", "integrate Y" — and it is unclear what "done" means. Draws out the intent and plays it back before building.',
|
|
70
70
|
body: 'When a request is a goal ("make scrolling feel right"), building ' +
|
|
71
71
|
'immediately produces the wrong thing fast. First make the intent concrete.\n' +
|
|
72
72
|
'Pin down: (a) the REAL outcome — what should be TRUE after that is not ' +
|
|
@@ -83,7 +83,7 @@ const BUILTIN_SKILLS = [
|
|
|
83
83
|
},
|
|
84
84
|
{
|
|
85
85
|
name: 'writing-plans',
|
|
86
|
-
description: 'Use when a task
|
|
86
|
+
description: 'Use when a task is large enough to need more than one or two tool calls — a multi-file change, a new feature, a refactor. Breaks the work into small ordered steps with exact paths and a verification for each.',
|
|
87
87
|
body: 'A plan is a sequence of steps a careful engineer with NO project ' +
|
|
88
88
|
'context could follow. Each step (2-5 minutes) names: the EXACT file ' +
|
|
89
89
|
'path(s); the concrete edit; how to verify it (command, test name, ' +
|
|
@@ -97,11 +97,16 @@ const BUILTIN_SKILLS = [
|
|
|
97
97
|
'plan instead of improvising; a 30-step plan means the task should be ' +
|
|
98
98
|
'split. In zames the plan lives in your reasoning and, for a long task, ' +
|
|
99
99
|
'in a TodoWrite list — one entry per step. Do not narrate it between tool ' +
|
|
100
|
-
'calls; the todo list IS the visible plan.'
|
|
100
|
+
'calls; the todo list IS the visible plan. A plan is not a report: the ' +
|
|
101
|
+
'operator sees ONLY the last respond, so keep the per-step evidence for ' +
|
|
102
|
+
'that one message. Subagents do not parallelise the plan either — a Task ' +
|
|
103
|
+
'call is a fresh isolated chat and zames has ONE browser and ONE send ' +
|
|
104
|
+
'slot, so subagents are sequential and only keep a broad read-only ' +
|
|
105
|
+
'investigation out of the main context.',
|
|
101
106
|
},
|
|
102
107
|
{
|
|
103
108
|
name: 'test-driven-development',
|
|
104
|
-
description: 'Use when writing or changing
|
|
109
|
+
description: 'Use when writing or changing behaviour that can be tested — a bug fix, a new function, a parser, a formatter. Write the failing test first, watch it fail, then make it pass. Prevents tests that only pass because they were written against the finished code.',
|
|
105
110
|
body: 'RED -> GREEN -> REFACTOR. The order is the point, not a formality.\n' +
|
|
106
111
|
'1. RED — write the smallest test that expresses the new behaviour and ' +
|
|
107
112
|
'RUN it. It must FAIL for the RIGHT reason ("not implemented", not a ' +
|
|
@@ -114,11 +119,16 @@ const BUILTIN_SKILLS = [
|
|
|
114
119
|
'for ONE reason with a message that says what broke. In this project a ' +
|
|
115
120
|
'bug fix ALWAYS gets a regression test reproducing the original bug. ' +
|
|
116
121
|
'When a test needs fixing, ask whether the TEST or the CODE was wrong; ' +
|
|
117
|
-
'if the code was written before its test, rewrite it driven by the test
|
|
122
|
+
'if the code was written before its test, rewrite it driven by the test.\n' +
|
|
123
|
+
'A test that writes a temp dir or file cleans it up itself: in this repo ' +
|
|
124
|
+
'always go through test/tmp-dir.ts (makeTmpDir(t, prefix) / ' +
|
|
125
|
+
'makeTmpDirSync), which registers the t.after cleanup. On WSL a leaked ' +
|
|
126
|
+
'os.tmpdir() entry lives inside ext4.vhdx and never returns its space to ' +
|
|
127
|
+
'the Windows host, so an abandoned temp dir fragments the disk permanently.',
|
|
118
128
|
},
|
|
119
129
|
{
|
|
120
130
|
name: 'systematic-debugging',
|
|
121
|
-
description: 'Use when something is broken and the cause is not obvious — a failing test, a wrong result, a hang, a crash. Four phases: reproduce, isolate, hypothesize, fix.',
|
|
131
|
+
description: 'Use when something is broken and the cause is not obvious — a failing test, a wrong result, a hang, a crash. Four phases: reproduce, isolate, hypothesize, fix. Prevents guessing.',
|
|
122
132
|
body: 'Do NOT start by editing code. Work the four phases in order; each ' +
|
|
123
133
|
'produces an artifact you can point at.\n' +
|
|
124
134
|
'1. REPRODUCE — get a command that FAILS the way the operator describes; ' +
|
|
@@ -127,7 +137,12 @@ const BUILTIN_SKILLS = [
|
|
|
127
137
|
'2. ISOLATE — shrink to the smallest failing unit (bisect, stub, ' +
|
|
128
138
|
'binary-search). Read the code the failing path ACTUALLY executes. Check ' +
|
|
129
139
|
'the obvious first: wrong file, stale build, cached state, different ' +
|
|
130
|
-
'config, an error swallowed by a catch
|
|
140
|
+
'config, an error swallowed by a catch. In zames the evidence is already ' +
|
|
141
|
+
'on disk: the transcript (~/.zames/logs/*.jsonl, /transcript prints this ' +
|
|
142
|
+
"run's path), the raw answer bodies in ~/.zames/net-log with " +
|
|
143
|
+
'ZAMES_NET_DEBUG=1 (npm run dev sets it), and the per-send telemetry ' +
|
|
144
|
+
'(~/.zames/logs/sends-<provider>.jsonl, dev mode or ' +
|
|
145
|
+
'browser.sendTelemetry). Read them BEFORE guessing.\n' +
|
|
131
146
|
'3. HYPOTHESIZE — state it in one sentence and predict what you should ' +
|
|
132
147
|
'see if it is right; test exactly that. One change at a time; prefer an ' +
|
|
133
148
|
'observation (log, test assertion) over an edit. If the prediction is ' +
|
|
@@ -141,7 +156,7 @@ const BUILTIN_SKILLS = [
|
|
|
141
156
|
},
|
|
142
157
|
{
|
|
143
158
|
name: 'verification-before-completion',
|
|
144
|
-
description: 'Use BEFORE declaring a task done — a feature, a bug fix, a generated
|
|
159
|
+
description: 'Use BEFORE declaring a task done or reporting success — a feature, a bug fix, a file you generated. Forces you to run the verification you promised instead of trusting that the code looks right.',
|
|
145
160
|
body: '"It should work" is not done. Before reporting success, produce ' +
|
|
146
161
|
'EVIDENCE from the real artifact, not from your intent.\n' +
|
|
147
162
|
'1. Re-read the original request; tick every requirement (including the ' +
|
|
@@ -155,7 +170,10 @@ const BUILTIN_SKILLS = [
|
|
|
155
170
|
'result — so the operator can reproduce it. "Tests pass" without the ' +
|
|
156
171
|
'command is not evidence.\n' +
|
|
157
172
|
'If you cannot run the verification, SAY SO explicitly and describe what ' +
|
|
158
|
-
'you did instead; never report "done" implying a check you did not run
|
|
173
|
+
'you did instead; never report "done" implying a check you did not run.\n' +
|
|
174
|
+
'In zames the report is ONE respond call: the operator reads only the ' +
|
|
175
|
+
'LAST respond, so put the complete evidence there and never end a turn ' +
|
|
176
|
+
'on a bare text update with work still pending.',
|
|
159
177
|
},
|
|
160
178
|
];
|
|
161
179
|
// Per-file budgets. AGENTS.md/MEMORY.md are hand-maintained and grow over
|