Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 20 additions & 41 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,52 +1,31 @@
# Changelog

## [5.0.5] - 2026-10-10
## [5.0.7] - 2026-10-15

### Added

- ✍️ **Свой ответ на вопросы от ИИ в Telegram** — теперь на каждый вопрос бота есть не только готовые варианты, но и кнопка ==«Свой ответ»==:
- нажатие переводит бота в режим ожидания текста, ответ приходит следующим сообщением;
- пустой ввод не принимается — бот попросит текст или «Отказаться»;
- ожидание корректно снимается при `/cancel`, отказе от вопроса и когда вопрос уже закрыт.

- 🔔 **Свои MD3-уведомления с ответом прямо из карточки** — системный `Notification` заменён на кастомное окно в стиле Material Design 3 (правый нижний угол, тёмная карточка, tonal-иконка, статус-точка, hover-подъём):
- встроенное поле ответа — печатаете, жмёте Enter или ➤, текст уходит ==прямо в чат== Cookie Code;
- пока печатаете, авто-скрытие откладывается (`cuckoo-notif-hold`);
- клик по карточке фокусирует главное окно; если окно уже в фокусе — уведомление не показывается вовсе.

- 🤖 **Уведомление о результате субагента** — когда субагент завершился или упал по таймауту, приходит та же MD3-карточка с именем агента; клик фокусирует родительское окно, ответ уходит в родительский чат.

- 🖼 **Diff картинками в Telegram** — команда `/diff` теперь рендерит diff каждого файла в ==PNG== и шлёт их альбомами (`sendMediaGroup`, пачки по 10, рендер в пуле из 3 окон). Плюс кнопка «Попросить коммит и пуш» с выбором ветки:

| Было | Стало |
| ------------------------------------ | -------------------------------------------------------- |
| Огромный текстовый `<pre>` с diff-ом | Цветные картинки: зелёные `+`, красные `-`, мета и ханки |
| Не было выбора ветки | Кнопки `git branch -a` — `✓` текущая, `☁` удалённая |

После выбора ветки бот шлёт в чат готовый промпт с указанием ветки.

- 🌿 **Выбор ветки в панели diff приложения** — кнопки «Коммит» и «Ветка» объединены в одну: открывается пикер веток, по выбору в чат уходит просьба закоммитить и запушить именно в неё:
- новые `listBranches()` / `currentBranch()` в `git-diff.js`;
- IPC `git-list-branches` и `git-current-branch`.

- 🖥 **Выбор окна для `/screen`** — если запущены живые субагенты, `/screen` показывает меню: **Main** + кнопка на каждого субагента (с именами, при дублях — `#1`, `#2`). Скриншот уходит с подписью, какое именно окно снято.

- 📋 **Карточка задач `todoWrite` в Telegram** — вместо технической строки приходит человеческая карточка с заголовком, счётчиком «Задач: N · выполнено: M» и разворачиваемым чек-листом (`☐ ◔ ☑`). `todoWrite` убран из `telegramToolNotifyIgnore`, чтобы карточка приходила всегда.

- 📨 **Команда `/send`** — нажать кнопку отправки в активном окне чата, если авто-отправка зависла и текст остался в поле:
- есть и в боте, и в UI приложения как команда-действие `/send`;
- кнопка ищется рядом с полем ввода, при неудаче отправляется нативный Enter.
- 🎯 **Режим цели `/goal` — автономные многораундовые задачи** — одна команда превращает задачу в самодвижущийся цикл: AI шаг за шагом продвигается к цели ==без вашего участия между шагами==:
- раунд завершился (нет tool-вызовов) — Cookie Code **сам** отправляет AI «продолжай» через задержку `NUDGE_DELAY`;
- движок живёт в preload (`goal-engine.js`), состояние per-session, персистится в `localStorage` (`cuckoo-goal-v1`);
- завершение — когда AI вызывает инструмент `goalDone()`;
- предохранители: лимит итераций (по умолчанию 50, настройка `cuckoo-goal-max-iterations`) и остановка при 3 раундах без прогресса (`NO_PROGRESS_LIMIT`).
- ⌨️ **Перехват команды `/goal` в веб-чате** (`goal-command.js`) — команда ловится на capture-фазе (Enter и клик по кнопке отправки) и обрабатывается локально, в AI не уходит:
- `/goal <описание>` — задать цель;
- `/goal` — показать статус;
- `/goal stop | pause | resume` — управление.
- 🪟 **Плавающая панель «Цель»** (`goal-panel.js`) — слева появляется перетаскиваемая карточка с текстом цели, номером итерации, таймером и кнопками **Пауза** / **Выход**:
- стили встроены в overlay (`template.js`), цвет статуса меняется по состоянию (`running` / `paused` / `done`);
- позиция панели сохраняется в `localStorage` (`cuckoo-goal-pos`).
- 🤖 **Цель в Telegram** — команда `/goal` в боте умеет задавать цель, показывать статус и управлять ею (`stop` / `pause` / `resume`):
- в чат приходит человеческое уведомление о старте и о завершении цели (`notifyGoalDone`);
- статус читается из `goal-store` в main по активному окну.
- 🧰 **Инструмент `goal_done`** (`GoalDoneTool.js`) — AI вызывает `goalDone()`, чтобы объявить цель выполненной; тул шлёт IPC `goal-done` в окно, и движок останавливает цикл (заменяет текстовый маркер `[[GOAL_DONE]]`, который модель забывала писать).

### Changed

- 🎨 **Стиль переливания ника настраивается** — рядом с чекбоксом переливания появился селект стиля:
- ==RGB (радуга)== — прежний вариант;
- ==Кровь (чёрно-красный)== — новый тёмный градиент;
- выбор сохраняется в настройке `rgbUsernameStyle`.
- 🍪 **Новый логотип и иконка приложения** — квадратный логотип 1024×1024 и многоразмерный `.ico`; в README (ru/en/осн.) добавлен по центру блок с иконкой, у русского README в заголовке появился 🍪.
- 🧹 **README: убран список горячих клавиш-петов** — таблица хоткеев сокращена до актуальной `F1` (управление петом больше не документируется).
- 🍪 **Логотип и README** — в README (ru/en/осн.) добавлен блок про режим цели; в таблицу инструментов добавлен `goalDone`.
- 📖 **Команда `/goal` в help бота** — в списке команд появились `/goal <цель>` и `/goal stop|pause|resume` (ru/en).

### Fixed

- 🐛 **Переливание ника не анимировалось** — шорткат `background` с `!important` сбрасывал `background-position` и замораживал keyframes. Перешли на `background-image`, анимация снова бежит.
- 🐛 **Snake_case алиасы для агентов** — `list_agents` и `read_agent` теперь работают наравне с `listAgents`/`readAgent` (в `JsRunner` добавлены алиасы).
- 🐛 **Snake_case алиас `goal_done`** — наряду с `goalDone()` в `JsRunner` зарегистрирован `goal_done`.
63 changes: 49 additions & 14 deletions README.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,40 @@ You are an experienced code review expert...

---

### 🎯 **Goals — Autonomous Multi-Round Tasks**

The `/goal` command turns a single task into a **self-driving multi-round loop**: the AI keeps advancing step by step until the goal is done — no input from you between steps.

**How it works:**

1. Type `/goal <goal description>` in chat (or set a goal from Telegram: `/goal <description>`)
2. The AI receives the goal instruction and starts working
3. When a response round ends (no tool calls), Cookie Code **automatically** sends the AI "continue"
4. When done, the AI calls the `goalDone()` tool and the loop stops

**Controls:**

| Command | Action |
| ------------------------------ | ------------------- |
| `/goal <text>` | Set a goal |
| `/goal` | Show current status |
| `/goal stop` | Stop the goal |
| `/goal pause` / `/goal resume` | Pause / resume |

**Goal panel:** a floating panel on the left shows the goal text, iteration number, elapsed time and **Pause** / **Exit** buttons. It can be dragged.

**Loop protection:**

- ⏱ **Iteration limit** — 50 rounds by default (setting `cuckoo-goal-max-iterations`)
- 🔁 **No progress** — 3 identical rounds in a row stop the goal
- ⏸ **Manual stop** — `/goal stop` or the "Exit" button instantly break the loop

**Per-session:** each chat has its own goal — switching sessions keeps them separate.

**Telegram notifications:** you get notified on goal start and completion, and can set/manage goals right from the bot.

---

### 🎨 **Beautiful & Customizable**

<p align="center">
Expand Down Expand Up @@ -323,20 +357,21 @@ AI can now call `deploy` like any built-in tool.

Cookie Code ships with 20+ tools out of the box:

| Tool | Description | Example |
| ----------- | ------------------------ | --------------------------------------- |
| `read` | Read file contents | `read('src/auth.js')` |
| `write` | Create or overwrite file | `write('test.js', code)` |
| `edit` | Apply targeted patch | `edit('app.js', oldCode, newCode)` |
| `glob` | Find files by pattern | `glob('**/*.test.js')` |
| `grep` | Search file contents | `grep('TODO', { include: '*.js' })` |
| `bash` | Run shell command | `bash('npm test')` |
| `pwsh` | Run PowerShell script | `pwsh('Get-Process')` |
| `git` | Git operations | `git('status')` |
| `mysql` | SQL queries | `mysql('SELECT * FROM users')` |
| `webFetch` | HTTP requests | `webFetch('https://api.example.com')` |
| `todoWrite` | Manage task lists | `todoWrite([{content: 'Fix bug'}])` |
| `mcpCall` | Call MCP server tool | `mcpCall('github', 'create_pr', {...})` |
| Tool | Description | Example |
| ----------- | ------------------------- | --------------------------------------- |
| `read` | Read file contents | `read('src/auth.js')` |
| `write` | Create or overwrite file | `write('test.js', code)` |
| `edit` | Apply targeted patch | `edit('app.js', oldCode, newCode)` |
| `glob` | Find files by pattern | `glob('**/*.test.js')` |
| `grep` | Search file contents | `grep('TODO', { include: '*.js' })` |
| `bash` | Run shell command | `bash('npm test')` |
| `pwsh` | Run PowerShell script | `pwsh('Get-Process')` |
| `git` | Git operations | `git('status')` |
| `mysql` | SQL queries | `mysql('SELECT * FROM users')` |
| `webFetch` | HTTP requests | `webFetch('https://api.example.com')` |
| `todoWrite` | Manage task lists | `todoWrite([{content: 'Fix bug'}])` |
| `mcpCall` | Call MCP server tool | `mcpCall('github', 'create_pr', {...})` |
| `goalDone` | Complete a goal (`/goal`) | `goalDone()` |

[Full tool reference →](docs/TOOLS.md)

Expand Down
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,18 @@ maxTurns: 20

---

### 🎯 **Цели — автономные многораундовые задачи**

Команда `/goal` превращает задачу в **самодвижущийся цикл**: AI шаг за шагом продвигается к цели, пока не выполнит её — без вашего участия между шагами.

- **`/goal <описание>`** — задать цель; **`/goal`** — статус; **`/goal stop|pause|resume`** — управление
- Когда раунд ответа завершается, Cookie Code **сам** отправляет AI «продолжай»
- Завершение — когда AI вызывает инструмент `goalDone()`
- **Защита от зацикливания:** лимит итераций (50) и остановка при 3 раундах без прогресса
- **Панель «Цель»** слева: текст, итерация, таймер, кнопки Пауза/Выход
- **Per-session:** у каждого чата своя цель
- Задавать и управлять целью можно из **Telegram** (`/goal`), с уведомлениями о старте и завершении

### 🎨 **Красиво и настраиваемо**

- **Стеклянный UI** — матовое стекло с настраиваемым размытием и прозрачностью
Expand Down Expand Up @@ -238,6 +250,7 @@ AI: [git commit] Закоммичено: "feat(auth): добавлены тес
| `webFetch` | HTTP-запросы |
| `todoWrite` | Списки задач |
| `mcpCall` | Инструменты MCP-сервера |
| `goalDone` | Завершить цель (`/goal`) |

---

Expand Down
33 changes: 33 additions & 0 deletions README.ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,38 @@ maxTurns: 20
2. Каждый tool-вызов агента: `🤖 Агент: explore` + `📖 Reading file.js`
3. Финальный результат: `🎯 Субагент вернул результат` + резюме

### Цели (goal-режим)

Команда `/goal` превращает одну задачу в **автономный многораундовый цикл**: AI сам продвигается шаг за шагом, пока не выполнит цель — без вашего участия между шагами.

**Как работает:**

1. Введите в чате `/goal <описание цели>` (или задайте цель из Telegram: `/goal <описание>`)
2. AI получает инструкцию цели и начинает работу
3. Когда раунд ответа завершается (без tool-вызовов), Cookie Code **автоматически** отправляет AI «продолжай»
4. Когда цель выполнена — AI вызывает инструмент `goalDone()` и цикл останавливается

**Управление:**

| Команда | Действие |
| ------------------------------ | ---------------------------- |
| `/goal <текст>` | Задать цель |
| `/goal` | Показать статус текущей цели |
| `/goal stop` | Остановить цель |
| `/goal pause` / `/goal resume` | Пауза / возобновить |

**Панель «Цель»:** плавающая панель слева показывает текст цели, номер итерации, время работы и кнопки **Пауза** / **Выход**. Её можно перетаскивать.

**Защита от зацикливания:**

- ⏱ **Лимит итераций** — по умолчанию 50 раундов (настройка `cuckoo-goal-max-iterations`)
- 🔁 **Нет прогресса** — если 3 раунда подряд одинаковый вывод, цель останавливается
- ⏸ **Ручная остановка** — `/goal stop` или кнопка «Выход» мгновенно прерывают цикл

**Per-session:** у каждого чата своя цель — при переключении сессии состояние сохраняется отдельно.

**Уведомления в Telegram:** при старте и завершении цели в TG приходят уведомления; задавать цель и управлять ею можно прямо из бота.

### Авто-форматтеры

Каждый `write` и `edit` прогоняет файл через форматтер для конкретного языка — код AI автоматически приводится к стилю вашего проекта. Не нужно вручную запускать `prettier --write`, стиль не мешает в diff.
Expand Down Expand Up @@ -334,6 +366,7 @@ Cookie Code перехватывает его, выполняет в песоч
| `glob`, `grep` | Поиск по файлам (на базе ripgrep) |
| `bash`, `pwsh` | Выполнение команд |
| `todoWrite` | Структурированный список задач |
| `goalDone` | Завершить цель (`/goal`) — остановить авто-продвижение |
| `webFetch` | Загрузка HTTP(S) как Markdown |
| `mysql` | SQL-запросы |
| `mcpCall`, `mcpListServers`, `mcpGetTools` | MCP-инструменты |
Expand Down
Loading
Loading