zames_pro 2.65.0 → 2.66.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 CHANGED
@@ -7,6 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.66.0] - 2026-10-07
11
+
12
+ ### Added
13
+
14
+ - **release:** add scripts/release.mts for one-command release prep (G4)
15
+
16
+ ### Fixed
17
+
18
+ - **reload:** include commands, run-task and attach-refs in hot-reload (G2)
19
+
20
+ ### Changed
21
+
22
+ - apply prettier to files touched by G2/F1
23
+
24
+ ## [2.65.1] - 2026-10-07
25
+
26
+ ### Fixed
27
+
28
+ - Длинные строки preview больше не создают горизонтальный скролл в
29
+ терминале: `toolCall`/`toolResult` (LineEditor и спиннер) теперь режут
30
+ превью по ВИДИМОЙ ШИРИНЕ терминала (`truncateToWidth`), а не по числу
31
+ символов. Раньше длинная команда/результат печатались шире экрана.
32
+ - Ctrl+Delete / Ctrl+Backspace (и Alt+Delete / Alt+Backspace) теперь удаляют
33
+ слово в строке ввода. Раньше эти escape-последовательности попадали в
34
+ общий пропуск клавиш и ничего не делали. Поддержаны варианты: `ESC[3;5~`
35
+ (xterm Ctrl+Delete), `ESC[3;3~` (Alt+Delete), `ESC DEL`/`ESC 8`
36
+ (Alt/Ctrl+Backspace) и kitty-протокол `ESC[127;5u` / `ESC[127;3u`.
37
+ Новый метод `_deleteWordRight()` + тест `test/editor-word-delete.test.ts`.
38
+ - Меню `/config` теперь держит ВЫБРАННЫЙ пункт на экране: окно строится
39
+ «назад» от курсора с учётом строк, которые занимают заголовки групп
40
+ (раньше индексный `scrollTop` мог вытолкнуть выбранную строку вниз за
41
+ пределы окна).
42
+ - `/new` сбрасывает счётчик контекста: `_lastTokenUsage` копится НА ЧАТ,
43
+ и без сброса в пустом чате оставался старый `ctx: 302k · 30%` до первой
44
+ отправки. Тест в `test/newchat-verify.test.ts`.
45
+
10
46
  ## [2.65.0] - 2026-10-07
11
47
 
12
48
  ### Changed
package/README.md CHANGED
@@ -14,6 +14,12 @@
14
14
  <a href="https://github.com/Viqto0r/zames_pro/actions/workflows/test.yml"><img src="https://github.com/Viqto0r/zames_pro/actions/workflows/test.yml/badge.svg" alt="tests"></a>
15
15
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
16
16
  <a href="package.json"><img src="https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg" alt="Node.js"></a>
17
+ <a href="https://www.typescriptlang.org/"><img src="https://img.shields.io/badge/TypeScript-strict-3178c6.svg" alt="TypeScript"></a>
18
+ <a href="CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg" alt="PRs welcome"></a>
19
+ </p>
20
+
21
+ <p align="center">
22
+ <strong>English</strong> | <a href="https://github.com/Viqto0r/zames_pro/blob/master/README.ru.md">Русский</a>
17
23
  </p>
18
24
 
19
25
  A terminal coding agent that works on top of [chat.deepseek.com](https://chat.deepseek.com/) through Playwright.
@@ -27,21 +33,37 @@ directory, reads and edits files, runs commands, and commits to git.
27
33
  <img src="https://raw.githubusercontent.com/Viqto0r/zames_pro/master/docs/demo.png" alt="zames session in the terminal" width="860">
28
34
  </p>
29
35
 
36
+ ## Quick start
37
+
38
+ ```bash
39
+ npm install -g zames_pro # Chromium for Playwright is downloaded automatically
40
+ cd your-project # any folder the agent should work in
41
+ zames # sign in once, then describe your task
42
+ ```
43
+
44
+ There is **no API key and no per-token bill**: zames signs in to **your own
45
+ [chat.deepseek.com](https://chat.deepseek.com/) account** in a real (headless)
46
+ Chromium and drives the web chat like a regular user. The first launch asks for
47
+ your DeepSeek login once (the session is stored in `~/.zames/profile`); after
48
+ that just run `zames` and type a task in plain language:
49
+
50
+ ```text
51
+ ❯ refactor the config loader and add a test for the new default
52
+ ```
53
+
54
+ While the agent works you can keep typing — a message sent mid-task is queued
55
+ and runs right after it, in the same chat. `Esc` aborts the current generation,
56
+ `/help` lists commands, `/exit` quits.
57
+
30
58
  ## How it works
31
59
 
32
60
  zames does not call the model API. It launches a headless Chromium with a
33
61
  persistent profile, signs in to `chat.deepseek.com` like a human, types the task
34
62
  into the chat box, and reads the answer back.
35
63
 
36
- ```mermaid
37
- flowchart LR
38
- U["terminal (you)"] -->|"task"| Z["zames"]
39
- Z -->|"system prompt + task"| D["chat.deepseek.com"]
40
- D -->|"model answers (raw SSE)"| Z
41
- Z -->|"parse tool-call"| Z
42
- Z -->|"run tool: Read/Edit/Bash/…"| Z
43
- Z -->|"answer"| U
44
- ```
64
+ <p align="center">
65
+ <img src="https://raw.githubusercontent.com/Viqto0r/zames_pro/master/docs/how-it-works.png" alt="how zames works" width="860">
66
+ </p>
45
67
 
46
68
  In text: you type a task → zames sends the system prompt plus the task into
47
69
  the DeepSeek web chat → the model answers → zames parses the tool call, runs
@@ -60,7 +82,7 @@ Key pieces:
60
82
 
61
83
  ## Table of contents
62
84
 
63
- - [Features](#features) · [Why zames?](#why-zames) · [Requirements](#requirements)
85
+ - [Quick start](#quick-start) · [Features](#features) · [Why zames?](#why-zames) · [Requirements](#requirements)
64
86
  - [How it works](#how-it-works) · [Installation](#installation) · [Signing in](#signing-in) · [Usage](#usage)
65
87
  - [Tools](#tools) · [Slash commands](#slash-commands)
66
88
  - [Project context, skills and memory](#project-context-skills-and-memory) · [MCP (external tools)](#mcp-external-tools) · [Configuration](#configuration)
package/README.ru.md ADDED
@@ -0,0 +1,502 @@
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/Viqto0r/zames_pro/master/logo-small.jpg" alt="zames logo" width="430">
3
+ </p>
4
+
5
+ <h1 align="center">zames_pro</h1>
6
+
7
+ <p align="center">
8
+ <strong>Терминальный coding-агент, который управляет chat.deepseek.com через Playwright — API-ключ не нужен.</strong>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="https://www.npmjs.com/package/zames_pro"><img src="https://img.shields.io/npm/v/zames_pro.svg" alt="npm version"></a>
13
+ <a href="https://www.npmjs.com/package/zames_pro"><img src="https://img.shields.io/npm/dm/zames_pro.svg" alt="npm downloads"></a>
14
+ <a href="https://github.com/Viqto0r/zames_pro/actions/workflows/test.yml"><img src="https://github.com/Viqto0r/zames_pro/actions/workflows/test.yml/badge.svg" alt="tests"></a>
15
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
16
+ <a href="package.json"><img src="https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg" alt="Node.js"></a>
17
+ <a href="https://www.typescriptlang.org/"><img src="https://img.shields.io/badge/TypeScript-strict-3178c6.svg" alt="TypeScript"></a>
18
+ <a href="CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg" alt="PRs welcome"></a>
19
+ </p>
20
+
21
+ <p align="center">
22
+ <a href="https://github.com/Viqto0r/zames_pro/blob/master/README.md">English</a> | <strong>Русский</strong>
23
+ </p>
24
+
25
+ Терминальный coding-агент, работающий поверх [chat.deepseek.com](https://chat.deepseek.com/) через Playwright.
26
+ По духу он похож на Claude Code / Codex CLI: запускается в текущей
27
+ директории, читает и правит файлы, выполняет команды и коммитит в git.
28
+
29
+ > API-ключ не нужен — агент управляет веб-чатом DeepSeek как обычный
30
+ > пользователь через настоящий (headless) браузер.
31
+
32
+ <p align="center">
33
+ <img src="https://raw.githubusercontent.com/Viqto0r/zames_pro/master/docs/demo.png" alt="сессия zames в терминале" width="860">
34
+ </p>
35
+
36
+ ## Быстрый старт
37
+
38
+ ```bash
39
+ npm install -g zames_pro # Chromium для Playwright скачается автоматически
40
+ cd your-project # любая папка, в которой должен работать агент
41
+ zames # один раз войти, дальше просто описывайте задачу
42
+ ```
43
+
44
+ Здесь **нет API-ключа и нет оплаты за токены**: zames входит в **ваш
45
+ собственный аккаунт [chat.deepseek.com](https://chat.deepseek.com/)** в
46
+ настоящем (headless) Chromium и управляет веб-чатом как обычный пользователь.
47
+ При первом запуске он один раз спросит логин DeepSeek (сессия сохраняется в
48
+ `~/.zames/profile`); после этого достаточно запустить `zames` и написать
49
+ задачу обычным языком:
50
+
51
+ ```text
52
+ ❯ отрефактори загрузчик конфига и добавь тест на новый дефолт
53
+ ```
54
+
55
+ Пока агент работает, можно продолжать печатать — сообщение, отправленное
56
+ посреди задачи, встанет в очередь и уйдёт сразу после неё, в тот же чат.
57
+ `Esc` прерывает текущую генерацию, `/help` показывает команды, `/exit` — выход.
58
+
59
+ ## Как это работает
60
+
61
+ zames не вызывает API модели. Он запускает headless Chromium с постоянным
62
+ профилем, входит в `chat.deepseek.com` как человек, печатает задачу в поле
63
+ чата и читает ответ обратно.
64
+
65
+ <p align="center">
66
+ <img src="https://raw.githubusercontent.com/Viqto0r/zames_pro/master/docs/how-it-works.png" alt="как работает zames" width="860">
67
+ </p>
68
+
69
+ Словами: вы вводите задачу → zames отправляет системный промпт и задачу в
70
+ веб-чат DeepSeek → модель отвечает → zames разбирает вызов инструмента,
71
+ выполняет его локально, возвращает результат обратно и печатает финальный
72
+ ответ.
73
+
74
+ Ключевые детали:
75
+
76
+ - **Ответ читается из сырого сетевого потока** (SSE), а не из отрендеренного
77
+ DOM, поэтому JSON вызова инструмента с шаблонными строками и экранированием
78
+ остаётся целым.
79
+ - **Постоянный профиль** (`~/.zames/profile`) держит вас залогиненным;
80
+ User-Agent headless-браузера подменяется, чтобы CDN DeepSeek не отдавал 403
81
+ на вход.
82
+ - **Троттлинг отправки** (15 с по умолчанию) щадит рейт-лимит веб-чата во
83
+ время долгих прогонов с инструментами.
84
+ - **Агент запесочен** в директорию запуска — ни один инструмент не может
85
+ читать или писать выше неё.
86
+
87
+ ## Содержание
88
+
89
+ - [Быстрый старт](#быстрый-старт) · [Возможности](#возможности) · [Почему zames?](#почему-zames) · [Требования](#требования)
90
+ - [Как это работает](#как-это-работает) · [Установка](#установка) · [Вход в аккаунт](#вход-в-аккаунт) · [Использование](#использование)
91
+ - [Инструменты](#инструменты) · [Слэш-команды](#слэш-команды)
92
+ - [Контекст проекта, навыки и память](#контекст-проекта-навыки-и-память) · [MCP (внешние инструменты)](#mcp-внешние-инструменты) · [Конфигурация](#конфигурация)
93
+ - [FAQ](#faq) · [Ссылки](#ссылки) · [Лицензия](#лицензия)
94
+
95
+ ## Возможности
96
+
97
+ - **Инструменты как в Claude Code / Codex** — `Read`, `Write`, `Edit`, `Bash`,
98
+ `Glob`, `Grep`, плюс `MultiEdit`, `ApplyPatch`, `LS`, `TodoWrite`, git- и
99
+ веб-инструменты. Каждая правка подкреплена `/undo`.
100
+ - **Работает, пока вы печатаете** — сообщения, набранные во время задачи,
101
+ встают в очередь и уходят сразу после неё, в тот же чат (как набор текста
102
+ во время генерации на сайте).
103
+ - **Режим плана** — `/plan` (или `--plan`) убирает все мутирующие инструменты,
104
+ чтобы агент изучал код, не трогая дерево.
105
+ - **Контекст проекта** — читает `AGENTS.md`, `MEMORY.md`, навыки (`SKILL.md`) и
106
+ пользовательские команды из репозитория и `~/.zames`, как в Codex / Claude
107
+ Code.
108
+ - **Поддержка MCP** — подключение внешних серверов инструментов (например,
109
+ `@playwright/mcp`).
110
+ - **Планировщик** — `/loop`, `/cron` и `/jobs` повторяют задачи по таймеру.
111
+ - **Двуязычный интерфейс** — русский / английский (`/config lang`).
112
+
113
+ ## Почему zames?
114
+
115
+ - **Нет API-ключа и счёта за токены** — используется ваш собственный аккаунт
116
+ чата DeepSeek, а не платный API. Удобно для долгих задач с инструментами.
117
+ - **Тот же рабочий процесс, что в Claude Code / Codex** — инструменты,
118
+ `AGENTS.md`, навыки, MCP и слэш-команды, так что всё знакомо с первого дня.
119
+ - **Работает без присмотра** — headless по умолчанию, возобновляемые сессии,
120
+ `/loop` и `/cron` для задач по расписанию.
121
+ - **Local-first** — профиль браузера, учётные данные и логи не покидают вашу
122
+ машину, а агент запесочен в директорию проекта.
123
+
124
+ ## Требования
125
+
126
+ - Node.js >= 20
127
+ - Аккаунт DeepSeek. При первом запуске zames спросит логин/пароль DeepSeek в
128
+ терминале (и сохранит их в `~/.zames/config.json` после успешного входа,
129
+ поэтому более поздний разлогин обрабатывается автоматически, без повторных
130
+ вопросов). Можно также войти вручную в окне браузера, когда он headed.
131
+
132
+ ## Вход в аккаунт
133
+
134
+ Браузер по умолчанию работает **headless**. Когда DeepSeek требует входа,
135
+ zames:
136
+
137
+ 1. переиспользует сессию из постоянного профиля (`~/.zames/profile`), если она
138
+ ещё валидна;
139
+ 2. иначе входит автоматически по сохранённым учётным данным
140
+ (`browser.auth.username` / `browser.auth.password`);
141
+ 3. иначе спрашивает логин/пароль в терминале (в TTY) и после успешного входа
142
+ запоминает их для следующего раза;
143
+ 4. иначе показывает подсказку про ручной вход.
144
+
145
+ Чтобы войти руками (например, если DeepSeek показывает капчу), запустите с
146
+ видимым окном:
147
+
148
+ ```bash
149
+ zames --headed
150
+ ```
151
+
152
+ Флаг `--headless` (значение по умолчанию) и `headless: true` в конфиге держат
153
+ браузер без окна; `--headed` / `headless: false` показывают его.
154
+
155
+ Headless работает из коробки: headless Chrome обычно представляется как
156
+ `HeadlessChrome/...`, и CDN DeepSeek блокирует такой User-Agent ответом 403,
157
+ поэтому zames срезает этот маркер перед загрузкой страницы (сохраняя реальную
158
+ версию движка). `--headed` нужен не только ради входа.
159
+
160
+ Учётные данные и переключатели можно также править из `/config`
161
+ (`browser.auth.username`, `browser.auth.password`, `browser.auth.saveSession`).
162
+
163
+ ## Установка
164
+
165
+ ```bash
166
+ npm install -g zames_pro
167
+ ```
168
+
169
+ Chromium для Playwright скачивается автоматически при установке. На Linux/WSL
170
+ необходимые системные библиотеки тоже ставятся, если доступен `sudo` без
171
+ пароля; иначе выполните один раз вручную:
172
+
173
+ ```bash
174
+ npx playwright install chromium
175
+ sudo npx playwright install-deps chromium
176
+ ```
177
+
178
+ ## Использование
179
+
180
+ Перейдите в папку проекта и запустите:
181
+
182
+ ```bash
183
+ zames
184
+ ```
185
+
186
+ Агент работает внутри директории, из которой он запущен, и не может её покинуть (песочница).
187
+
188
+ Пока агент работает, можно продолжать печатать: Enter ставит сообщение в
189
+ очередь (оно уйдёт сразу после текущей задачи, в тот же чат), а Esc / Ctrl+C
190
+ прерывают текущую генерацию. Это повторяет набор текста во время генерации на
191
+ сайте DeepSeek.
192
+
193
+ ### Строка ввода
194
+
195
+ Промпт — это небольшой редактор строки с постоянной историей:
196
+
197
+ - `↑` / `↓` — переход по истории сообщений (сохраняется в
198
+ `~/.zames/history.json`, поэтому переживает перезапуск); внутри
199
+ многострочного сообщения стрелки двигают по строкам.
200
+ - `Ctrl+R` — инкрементальный поиск по истории в обратном порядке (как в bash):
201
+ печатайте для фильтра, `Ctrl+R` — за более старыми совпадениями, `Enter` —
202
+ принять, `Esc` — отменить.
203
+ - `Ctrl+_` — отменить последнюю правку строки ввода (случайно нажатые
204
+ `Ctrl+U` / `Ctrl+K` можно вернуть).
205
+ - `Ctrl+U` — очистить строку, `Ctrl+K` — удалить до конца строки, `Ctrl+W` —
206
+ удалить слово перед курсором, `Ctrl+←`/`Ctrl+→` — переход по словам.
207
+ - `\` + `Enter`, `Ctrl+J`, `Ctrl+Enter` или `Shift+Enter` — вставить новую
208
+ строку.
209
+ - `/` + `Tab` — подсказки и автодополнение слэш-команд.
210
+ - `!команда` — выполнить shell-команду напрямую, минуя модель (как bash-режим
211
+ Claude Code). Действует та же песочница, что и для инструмента `Bash`, так
212
+ что прямая команда тоже не может выйти за пределы проекта.
213
+
214
+ Установите `NO_COLOR=1`, чтобы отключить цвета (иначе используется спокойная
215
+ палитра по умолчанию).
216
+
217
+ ### Картинки и файлы
218
+
219
+ В строку ввода можно вставить картинку или файл (Ctrl+Shift+V / Shift+Insert
220
+ или собственной вставкой терминала). zames сохраняет его в `<project>/tmp` и
221
+ показывает маркер в строке — `[image#1]` для картинок, `[file#1]` для прочих
222
+ файлов — затем загружает реальный файл в чат вместе с вашим сообщением. Это те
223
+ же форматы, что принимает веб-чат DeepSeek (PNG, JPEG, GIF, WEBP, BMP, SVG и
224
+ обычные типы документов).
225
+
226
+ Вставка картинки работает, когда терминал передаёт её как `data:` URL или как
227
+ base64-блок с узнаваемой сигнатурой изображения. Можно также вставить путь к
228
+ локальному файлу (перетащите файл в терминал или скопируйте его путь); если
229
+ файл существует — он прикрепляется, иначе текст вставляется как обычно.
230
+
231
+ Нажмите Ctrl+V (или сделайте пустую вставку), и zames прочитает картинку прямо
232
+ из буфера обмена: Linux через wl-paste (Wayland) или xclip/xsel (X11), macOS
233
+ через pngpaste, Windows через PowerShell. Нужные Linux-утилиты ставятся
234
+ автоматически при `npm install` (best-effort, через определённый пакетный
235
+ менеджер). Если картинка не найдена, zames сообщит об этом и напишет, какой
236
+ инструмент пробовал, вместо молчания.
237
+
238
+ ### Опции
239
+
240
+ ```
241
+ zames --task <текст задачи>
242
+ zames --chat <id>
243
+ zames --new-chat
244
+ zames --resend-prompt
245
+ zames --dir <path>
246
+ zames --headless
247
+ zames --headed
248
+ zames --plan
249
+ zames --output-format jsonl
250
+ zames --debug
251
+ zames --version
252
+ zames --help
253
+ ```
254
+
255
+ ### Машиночитаемый вывод (скрипты / CI)
256
+
257
+ Для одноразовых запусков (`--task`) агент может выдавать поток событий как JSON
258
+ lines в stdout, оставляя весь человеческий текст в stderr:
259
+
260
+ ```bash
261
+ zames --task "summarize the diff" --output-format jsonl
262
+ ```
263
+
264
+ Каждая строка — одно событие (`tool_call`, `tool_result`, `assistant_final`, …),
265
+ так что это сразу пайпится в `jq`:
266
+
267
+ ```bash
268
+ zames --task "..." --output-format jsonl \
269
+ | jq -r 'select(.type=="assistant_final") | .message'
270
+ ```
271
+
272
+ ## Инструменты
273
+
274
+ У агента тот же стиль инструментов, что в Claude Code / Codex CLI:
275
+
276
+ - **Файловые** — `Read`, `Write`, `Edit`, `Bash`, `Glob`, `Grep`. `Read` по
277
+ умолчанию отдаёт сырое содержимое; передайте `numbered=true`, чтобы получить
278
+ нумерацию строк в стиле `cat -n` (только для справки — не вставляйте её в
279
+ `Edit`).
280
+ - **Дополнительные** — `LS` (список директории), `MultiEdit` (несколько правок
281
+ одного файла атомарно), `TodoWrite` (чек-лист задач сессии), `ApplyPatch`
282
+ (мультифайловый патч в формате V4A от Codex: `*** Begin Patch` … `*** End Patch`).
283
+ - **Git** — `GitStatus`, `GitDiff`, `GitLog`, `GitShow`, `GitBranchList`,
284
+ `GitAdd`, `GitCommit`, `GitPush`.
285
+ - **Web** — `WebFetch`, `WebSearch`.
286
+ - **Служебный** — `respond` (финальный ответ оператору, завершает задачу).
287
+
288
+ Все файловые инструменты остаются внутри рабочей директории (песочница).
289
+ `Write`/`Edit` и `MultiEdit`/`ApplyPatch` делают резервную копию (undo) перед
290
+ изменением файла.
291
+
292
+ ## Слэш-команды
293
+
294
+ Введите / в промпте для подсказок (Tab дополняет). Кроме команд сессии и
295
+ конфига (/new, /chats, /resume, /cd, /status, /config, /undo, /transcript,
296
+ /mcp, /skills, /memory, /init, /reload, /debug-dom, /help, /exit) есть
297
+ несколько в духе Claude Code / Codex CLI:
298
+
299
+ - /diff [--staged] — показать git-диф рабочего дерева (--staged для индекса).
300
+ - /diffstat — сводка изменений одной строкой (`git diff --stat`).
301
+ - /context — показать, что загружено в промпт (AGENTS.md, MEMORY.md, навыки,
302
+ пользовательские команды) и размер системного промпта.
303
+ - /retry — отправить последнюю задачу в тот же чат заново (удобно после
304
+ обрезанного или пустого ответа).
305
+ - /rename <title> — задать заголовок текущей сессии (виден в /sessions).
306
+ - /copy — скопировать последний ответ ассистента в буфер обмена ОС.
307
+ - /cost (алиас /usage) — статистика сессии: задачи, вызовы инструментов,
308
+ длительность и размер контекста в токенах (DeepSeek
309
+ `accumulated_token_usage`).
310
+ - /export [file] — записать транскрипт сессии в Markdown-файл
311
+ (по умолчанию zames-export-<stamp>.md).
312
+ - /doctor — диагностика node, git, конфига, браузера, буфера обмена и MCP.
313
+ - /add-dir <path> — проверить дополнительную директорию (песочница
314
+ фиксируется при старте; для записи туда перезапустите с --dir).
315
+ - /resume <n> (после /chats) и /resume-id <id> — открыть чат и НАПЕЧАТАТЬ его
316
+ диалог в терминал, чтобы восстановленный контекст был виден. Показываются
317
+ только последние 20 сообщений (`RESTORED_HISTORY_LIMIT`). /last открывает
318
+ последний чат текущей директории без поиска; /sessions показывает сохранённые
319
+ сессии с их относительным возрастом.
320
+ - /help <command> — полное описание одной команды (например, `/help diff`)
321
+ вместо всего списка.
322
+ - /review [focus] [--staged] — попросить агента проверить незакоммиченные
323
+ изменения и сообщить находки (без правок кода).
324
+ - /plan [on|off] — режим плана (только чтение). Пока он включён, мутирующие
325
+ инструменты (Write/Edit/MultiEdit/ApplyPatch/Bash, GitAdd/GitCommit/GitPush)
326
+ убраны из набора, чтобы агент изучал код, не трогая дерево. Стартовать в нём
327
+ можно с `--plan`.
328
+ - /compact — попросить DeepSeek сжать текущий чат в передаточное резюме, затем
329
+ открыть НОВЫЙ чат, заново отправить системный промпт и положить резюме как
330
+ перенесённый контекст. Используйте, когда контекст разрастается.
331
+ - /goal [text|clear] — задать долгоживущую цель сессии. Она добавляется в
332
+ начало каждого сообщения задачи, поэтому модель держит общую картину через
333
+ много ходов. Хранится в `<project>/.zames-goal` (git-ignored) и
334
+ восстанавливается при следующем запуске.
335
+ - /loop <interval> <task> — повторять задачу периодически (например,
336
+ `/loop 10m run the tests`). /cron "<min> <hour> <dom> <month> <dow>" <task> —
337
+ запуск по расписанию. /jobs [rm <id>|clear] перечисляет и останавливает их.
338
+ Сработавшая задача попадает в ту же очередь сообщений, что и ваш ввод, так
339
+ что выполняется, когда агент свободен (никогда посреди генерации), и всё
340
+ равно соблюдает троттлинг отправки.
341
+ - /thinking [on|off] и /web [on|off] — переключить Deep thinking / Smart search.
342
+ Их (а также /queue, /jobs, /goal, `/config <sub>`) можно использовать, ПОКА
343
+ агент работает — они не трогают текущую генерацию.
344
+ - /queue [clear] — показать или очистить сообщения, ждущие отправки после
345
+ текущей задачи.
346
+
347
+ Контекст в токенах показывается и вживую: в строке статуса над вводом слева
348
+ спиннер/текст, справа — контекст (например, `125k · 13%`, процент от 1M
349
+ контекста). Он ОКРАШЕН по уровню заполнения: зелёный ниже 50%, жёлтый 50-80%,
350
+ красный выше 80%. Значение приходит из DeepSeek `accumulated_token_usage` и
351
+ скрыто до первого ответа.
352
+
353
+ ## Контекст проекта, навыки и память
354
+
355
+ Как в Codex / Claude Code, zames читает инструкции проекта и переиспользуемые
356
+ процессы из вашего репозитория и из `~/.zames`.
357
+
358
+ - **AGENTS.md** — инструкции проекта. Положите его в корень репозитория (или в
359
+ любую родительскую папку рабочей директории). Глобальные инструкции живут в
360
+ `~/.zames/AGENTS.md` (и `~/.claude/CLAUDE.md`). Запустите `/init`, и агент
361
+ изучит проект и напишет AGENTS.md на основе реальных команд сборки/тестов и
362
+ соглашений (`/init --force` перезапишет существующий файл).
363
+ - **MEMORY.md** — долговечные заметки, переживающие сессии. Агент дописывает
364
+ сюда полезные факты; можно править вручную или добавить из промпта через
365
+ `/remember <text>`.
366
+ - **Навыки** — папка с файлом `SKILL.md` (YAML-фронтматтер: `name`,
367
+ `description`, опционально `allowed-tools`, `user-invokable`) плюс любые
368
+ вспомогательные файлы. Ищутся в `.zames/skills/`, `.claude/skills/`,
369
+ `.agents/skills/`, `skills/` и `~/.zames/skills/`. Агент читает тело только
370
+ когда задача совпадает с описанием. Список — `/skills`; вызов —
371
+ `/<skill-name>`.
372
+ - **Пользовательские команды** — `.md`-файлы в `.zames/commands/` (или
373
+ `.claude/commands/`). Поддерживают подстановки `$ARGUMENTS` / `{{args}}` и
374
+ вызываются как `/<command-name>`.
375
+
376
+ Навыки и пользовательские команды видны в списке автодополнения «/» и в
377
+ `/help`.
378
+
379
+ ```
380
+ /skills список найденных навыков
381
+ /memory показать действующие AGENTS.md / MEMORY.md
382
+ /remember <text> дописать долговечную заметку в MEMORY.md
383
+ /init [--force] проанализировать проект и создать AGENTS.md
384
+ ```
385
+
386
+ ## MCP (внешние инструменты)
387
+
388
+ zames может использовать инструменты с серверов [MCP](https://modelcontextprotocol.io).
389
+ Главный пример — @playwright/mcp: он даёт агенту настоящий браузер
390
+ (navigate, click, snapshot, type, ...) поверх того, который zames уже
391
+ использует для чата DeepSeek.
392
+
393
+ Положите файл конфига (той же формы, что в Claude Code / Cursor):
394
+
395
+ - `~/.zames/mcp.json` — глобальный
396
+ - `<project>/.zames/mcp.json` — на уровне проекта (поздние файлы побеждают)
397
+ - `<project>/.mcp.json` — привычное имя MCP
398
+
399
+ ```json
400
+ {
401
+ "mcpServers": {
402
+ "playwright": {
403
+ "command": "npx",
404
+ "args": ["-y", "@playwright/mcp@latest", "--headless", "--isolated"]
405
+ }
406
+ }
407
+ }
408
+ ```
409
+
410
+ ВАЖНО: держите MCP-браузер изолированным. @playwright/mcp по умолчанию
411
+ использует ТУ ЖЕ директорию профиля, что и zames (~/.zames/profile). Если
412
+ запустить его без --isolated (или без собственного --user-data-dir),
413
+ MCP-браузер и браузер агента подерутся за один профиль, и чат DeepSeek
414
+ покажет «Something went wrong when opening your profile». Всегда передавайте
415
+ --isolated, как в примере выше.
416
+ Серверы бывают и удалёнными ("url": "https://...", "transport": "sse").
417
+ Их инструменты видны агенту как `server__tool` (например,
418
+ `playwright__browser_navigate`) и перечисляются в `/mcp` и `/status`.
419
+ Сервер, который не смог подключиться, пропускается с предупреждением и
420
+ никогда не роняет агента.
421
+
422
+ ## Конфигурация
423
+
424
+ Глобальный конфиг: `~/.zames/config.json`
425
+ Локальный (на проект): `.zamesrc.json`
426
+
427
+ Просматривать и менять настройки можно не выходя из агента — командой
428
+ `/config`. Запустите её без аргументов, чтобы открыть интерактивное меню
429
+ (↑/↓ — навигация, Enter — изменение, `d` — сброс, `q` — выход). Булевы и
430
+ enum переключаются на месте; числа и строки открывают ввод.
431
+
432
+ ```
433
+ /config интерактивное меню настроек
434
+ /config list показать все изменяемые настройки
435
+ /config get <path> показать настройку
436
+ /config set <path> <value> изменить настройку
437
+ /config reset <path> сбросить настройку к дефолту
438
+ /config path показать пути файлов конфига
439
+ /config lang <ru|en> переключить язык интерфейса и агента
440
+ ```
441
+
442
+ Примеры:
443
+
444
+ ```
445
+ /config set maxIterations 20
446
+ /config set browser.deepThinking true # DeepSeek Deep thinking (медленно; рассуждения скрыты)
447
+ /config set browser.webSearch false # DeepSeek Smart web search
448
+ /config lang en
449
+ ```
450
+
451
+ Изменения пишутся в проектный `.zamesrc.json` и применяются сразу (где это
452
+ возможно без перезапуска).
453
+
454
+ ### Язык
455
+
456
+ `/config lang ru` или `/config lang en` переключает и язык интерфейса
457
+ (справка, сообщения, спиннер), и язык, на котором агент вам отвечает. Локаль
458
+ хранится в `ui.locale` в файле конфига.
459
+
460
+ Данные агента хранятся в `~/.zames`: профиль браузера, логи, история undo,
461
+ сессии.
462
+
463
+ ## FAQ
464
+
465
+ **Это официальный продукт DeepSeek?**
466
+ Нет. zames управляет публичным веб-интерфейсом chat.deepseek.com через
467
+ настоящий браузер, как обычный пользователь. Он не связан с DeepSeek.
468
+
469
+ **Нужен ли API-ключ?**
470
+ Нет. Вы один раз входите в свой аккаунт DeepSeek; сессия хранится в
471
+ `~/.zames/profile` и переиспользуется.
472
+
473
+ **Какую модель он использует?**
474
+ Ту, которую использует веб-чат DeepSeek (DeepSeek-V3 или reasoning-модель при
475
+ включённом «Deep thinking»). zames никогда не вызывает API напрямую.
476
+
477
+ **Работает ли headless / на сервере?**
478
+ Да — headless по умолчанию, а `--output-format jsonl` делает его скриптуемым.
479
+ `--headed` нужен только для ручного входа или отладки селекторов.
480
+
481
+ **Разрешена ли автоматизация веб-интерфейса?**
482
+ Это зависит от условий DeepSeek; автоматизация сайта может их нарушать.
483
+ Используйте на свой риск и держите троттлинг отправки (15 с по умолчанию),
484
+ чтобы не бить по рейт-лимиту.
485
+
486
+ **Чем отличается от Claude Code / Codex?**
487
+ Та же форма (инструменты, `AGENTS.md`, навыки, MCP, слэш-команды), но работает
488
+ на вашем аккаунте DeepSeek вместо API, как автоматизация браузера, а не
489
+ first-party API-клиент.
490
+
491
+ ## Ссылки
492
+
493
+ - **npm:** <https://www.npmjs.com/package/zames_pro>
494
+ - **GitHub:** <https://github.com/Viqto0r/zames_pro>
495
+ - **Changelog:** [`CHANGELOG.md`](CHANGELOG.md)
496
+ - **Contributing:** [`CONTRIBUTING.md`](CONTRIBUTING.md)
497
+ - **Security policy:** [`SECURITY.md`](SECURITY.md)
498
+ - **Code of conduct:** [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md)
499
+
500
+ ## Лицензия
501
+
502
+ MIT
package/dist/browser.js CHANGED
@@ -1230,6 +1230,10 @@ export class DeepSeekBrowser {
1230
1230
  // STALE old id for the fresh chat. Clear it — a fresh chat has no id until
1231
1231
  // the first message creates one.
1232
1232
  this._netChatId = null;
1233
+ // The token counter is cumulative FOR A CHAT. A fresh chat has no messages,
1234
+ // so carrying the old value over left a stale "ctx: 302k · 30%" on the
1235
+ // status line until the first send. Reset it (and the cached status).
1236
+ this._lastTokenUsage = null;
1233
1237
  }
1234
1238
  async _findVisible(selectors, timeout = 1000) {
1235
1239
  for (const sel of selectors) {