Skip to content
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ test/coverage.lcov
.playwright-mcp/
/tiktok
/.cuckoo/skills
# Проектная память — личные заметки AI, не коммитим.
/.cuckoo/memory/
# cookie/agents — НЕ игнорируем: агенты проекта должны попадать в git.
# Пользовательские агенты лежат в ~/cookie/agents (вне репозитория).
# Ранее здесь был /cookie/agents — убрано, иначе новые агенты untracked.
65 changes: 36 additions & 29 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,40 +1,47 @@
# Changelog

## [5.0.2] - 2026-10-06
## [5.0.4] - 2026-10-07

### Added

- 🚀 **Субагенты — теперь у AI есть свои помощники!** 😎 Представьте: просите AI «разберись с этим куском проекта», а он не тонет в тысяче файлов сам, а зовёт специалиста. Каждый субагент работает в **отдельном окне** со своим контекстом — весь его рабочий шум (поиски, чтения, пробы) остаётся там, а вам прилетает только чистый итог. Основной чат не пухнет, голова не кругом:
- 🎯 `run_agent(name, task)` — «эй, explore, найди все вызовы apiFetch». Открывается второе окно (тот же логин DeepSeek — ничего заново вводить не надо), субагент делает дело, окно само закрывается, родителю уходит резюме;
- 📋 `list_agents` — глянуть, кто вообще у нас в команде: имя, описание, какие инструменты разрешены, сколько шагов максимум;
- 🔍 `read_agent(name)` — подсмотреть полный промпт агента (удобно для отладки);
- 🧬 `create_agent({...})` — а вот самое интересное: **AI может вырастить себе специалиста прямо из чата!** «Создай агента для ревью SQL-миграций» — и через секунду файл готов, можно сразу делегировать;
- 📂 агенты лежат в `cookie/agents/*.md` (проектные — едут с репо, команда видит) или в `~/cookie/agents/*.md` (личные, для всех проектов). Формат — обычный markdown с frontmatter (`name`, `description`, `tools`, `maxTurns`);
- 🎁 из коробки уже есть четверо: `explore` (разведчик), `code-reviewer` (ревьюер), `git-committer` (гит-мастер), `changelog-writer` (летописец).
- 🔒 **Whitelist инструментов — субагент делает только то, что ему разрешили** 🛡️ Написали в frontmatter `tools: read, grep` — и всё, `bash`, `mysql`, `deleteFile` для него закрыты наглухо:
- проверка происходит **до** запуска инструмента — не «а потом откатим», а «даже не начнём»;
- попробует запрещённое — получит чёткое «Инструмент X не разрешён этому агенту, разрешены: read, grep»;
- а ещё субагент не может позвать другого субагента — никаких бесконечных матрёшек 🪆.
- 🤖 **Субагенты теперь болтают с вами в Telegram** 📱 Полный жизненный цикл на экране телефона:
- 🚀 при делегировании сразу прилетает карточка «кому и что поручили»;
- 🛠 каждое действие агента помечено «🤖 Агент: <имя>» — сразу видно, кто работает;
- 🎯 когда агент закончил — отдельное сообщение с итогом;
- 🔇 и никаких дублей: ответы из окна субагента не спамят в чат-фид;
- ⏱ финал определяется по «текст устоялся» (а не по старой ненадёжной проверке), с учётом лимита шагов и таймаута.
- 🧠 **Память AI — теперь AI вас помнит** 💭 Скажите «Запомни, что меня зовут Ваня» или «Сохрани в память: у меня Windows 11 и RTX 3060» — и он запомнит. В следующей сессии уже будет знать контекст, не придётся повторять:
- 💾 `memory_save(text)` — сохранить одну мысль (одна запись = одна строчка с датой);
- 📖 `memory_read()` — прочитать всё, что накопилось;
- 🗑 `memory_clear()` — стереть всё (только по прямой просьбе — AI сначала предупредит);
- 📁 всё живёт в одном файлике `<userData>/memory.md`, можно открыть или очистить прямо из настроек;
- 🎯 содержимое памяти **не** подмешивается в промпт автоматически — читается только когда реально нужно, чтобы не жечь токены зря;
- 🔒 в plan-mode любые изменения памяти заблокированы — на этапе планирования AI ничего не перепишет.
- 📚 **Новый раздел в README про субагентов** — как делегировать, три способа завести агента, что его защищает (whitelist, anti-recursion, `maxTurns`, timeout) и готовый пример файла агента. Читайте и заводите своих! 📖
- 🧠 **Двухуровневая память AI** — теперь AI помнит и вас, и проект: раньше была одна общая память на всё, теперь их две, и каждая живёт там, где ей место:

| Уровень | Где хранится | Что помнит |
| ------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 🗂 Проектная | `<projectDir>/.cuckoo/memory/ProjectMemory.md` | Соглашения, архитектурные решения, важные пути, стек, договорённости. Едет вместе с репозиторием (папка в `.gitignore` — личные заметки AI не коммитятся) |
| 🌍 Глобальная | `<userData>/memory.md` | Общие факты о вас и вашей системе: имя, ОС, GPU, предпочтения по стилю кода |
- 📖 `memory_read(scope?)` — прочитать: `'all'` (по умолчанию — проектная + глобальная), `'project'`, `'global'`;
- 💾 `memory_save(text, scope?)` — сохранить. По умолчанию пишет в ==проектную память==, если проект инициализирован, иначе в глобальную; `scope='global'` — для фактов о пользователе;
- 🗑 `memory_clear(scope?)` — очистить (только по прямой просьбе, AI предупредит);
- 🎛 настройки памяти в UI тоже получили параметр `scope` — открытие файла, очистка и статистика работают отдельно для каждого уровня;
- 🔗 в промпт AI подставляются ==абсолютные пути== к обоим файлам, а в JS-скриптах доступны как `globalThis.memoryPath` и `globalThis.projectMemoryPath`.

- ✅ **Кнопка «Коммит» в панели изменений** — собрать все diff разом и отправить в чат:

| До | После |
| -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| Нужно было вручную копировать каждый diff по файлу | Одна кнопка склеивает unified diff **всех** изменённых файлов (включая untracked) и шлёт готовое сообщение в чат |
- 📋 `git-diff-all` — новый IPC-хендлер, склеивает unified diff **всех** изменённых файлов (включая untracked);
- 🤖 в чат уходит готовое сообщение с просьбой закоммитить — можно позвать агента `git-committer` или сделать самому. Кнопка со звёздочкой в шапке панели diff, после клика панель закрывается.

- 🛡 **`safeAsync` — безопасный запуск async-функций** в `src/preload/dom/safe.js`:
- rejected Promise больше не «роняет» вызывающий пайплайн — ошибка логируется, а Promise резолвится в `fallback`;
- учёт частоты падений по label (`failCounts`), throttle-ключ теперь включает текст сообщения — разные ошибки одного label не схлопываются;
- `fallback` может быть функцией — вызывается безопасно, её падение наружу не пробрасывается.

### Changed

- 📁 **Агенты переехали: `.cuckoo/agents` → `cookie/agents`** — теперь проектные агенты лежат в репозитории рядышком с кодом (команда видит и использует), а личные — в `~/cookie/agents` (вне репо). Сканер, типы и документация обновлены. 🚚
- 🎛 **Окно субагента получает полный системный промпт Cookie Code** — тот же набор инструментов и формат `cuckoo`, что у основного ассистента. То есть субагент работает ровно так же умело, просто в своей песочнице. 🧰
- 🎨 **Иконки обновления в оверлее** — эмодзи 🔄 заменены на ==SVG-иконки== (кнопки обновления MCP и панели diff). Чётче выглядит, не зависит от шрифта системы.
- 📝 **Промпт субагента: «1–2 инструмента за раз»** — в задание агенту добавлена просьба не вызывать сразу пачку инструментов. Меньше шума в логах, аккуратнее шаги.
- 🧹 **Чистка репозитория** — удалён спрайт `assets/петы.jpg` и его секция из `README.ru.md` (питомцы больше не документируются).

### Fixed

- 🐛 **Рабочая папка субагента больше не теряется** — была хитрая бага: при загрузке домашней DeepSeek (когда `sessionId` ещё не появился) выбранная папка проекта сбрасывалась в `null`, и агент начинал искать файлы «в никуда». Теперь папка кэшируется (`pendingProjectDir`) до готовности сессии и привязывается сама — относительные пути работают с первой секунды. ✅
- 🐛 **Async-ошибки в `safe()` больше не теряются** — sync-путь работал, а Promise-результат при падении давал unhandledRejection. Теперь оба пути перехватываются одинаково.
- 🐛 **Панель diff закрывается после клика «Коммит»** — кнопка вставляла diff в чат, но окно оставалось висеть поверх. Теперь `closeDiffPanel()` вызывается сразу после отправки.
- 🐛 **Глобальная память не теряется при работе без проекта** — `getMemoryPath` теперь принимает `scope` и `projectDir`, для глобального уровня `projectDir` не нужен. IPC-хендлеры аккуратно возвращают ошибку, если проект не инициализирован, а не падают.

### Removed

- 🗑 **`app.setName("Cookie Code")`** из `src/main/index.js` — принудительная установка имени в dev-режиме убрана.

29 changes: 29 additions & 0 deletions README.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ The AI can now:
- 📊 **Manage tasks** — create, track, and complete todo lists
- 🌐 **Fetch data** — HTTP requests, API calls, web scraping
- 🔧 **MCP tools** — connect any MCP server for extended capabilities
- 🧠 **Two-level memory** — AI remembers both you and the project: **global** memory (`<userData>/memory.md`) holds user/system facts, **project** memory (`<projectDir>/.cuckoo/memory/ProjectMemory.md`) holds conventions, architecture and key paths

**How it works:**

Expand Down Expand Up @@ -135,6 +136,33 @@ Control everything from your phone:
**Voice messages** → transcribed via local Whisper and sent to AI
**Photos/files** → attached to the chat input field

### 🧠 **Two-Level Memory**

The AI remembers **both you and the project** — memory is split into two independent levels:

| Level | Location | What it remembers |
| --------- | ---------------------------------------------- | ---------------------------------------------------------------------- |
| 🌍 Global | `<userData>/memory.md` | User and system facts: name, OS, GPU, code style preferences |
| 🗂 Project | `<projectDir>/.cuckoo/memory/ProjectMemory.md` | Conventions, architectural decisions, key paths, stack of this project |

- Tools `memorySave(text, scope?)`, `memoryRead(scope?)`, `memoryClear(scope?)` accept `scope`: `'project'` | `'global'` (`memoryRead` also `'all'`).
- By default `memorySave` writes to **project** memory if the project is initialized, otherwise to global.
- Absolute paths to both files are injected into the system prompt and exposed in JS scripts as `globalThis.memoryPath` and `globalThis.projectMemoryPath`.
- Files can be opened, cleared, and their stats viewed separately per level in **Settings → Cookie Code**.
- Project memory lives in `.gitignore` — the AI's personal notes are never committed.

### ⌨️ **Hotkeys**

| Key | Action |
| ---------------- | ------------------------------------------- |
| **F1** | Show the current CHANGELOG (What's New box) |
| **F6 / F7** | Statistics dashboard |
| **F8–F11** | Pet controls |
| **Ctrl+Shift+C** | Toggle the Cookie Code overlay |
| **Esc** | Close panels and modals |

The What's New window (F1) is **draggable by its header** and adapts its width to the screen.

### 📊 **Git Integration**

<p align="center">
Expand All @@ -148,6 +176,7 @@ Built-in diff viewer:
- **Navigation** — jump between hunks, filter added/deleted lines
- **Mini-map** — visual overview of changes
- **Inline diff** — character-level highlighting for precise edits
- **Commit button** — stitches the unified diff of **all** changed files and posts a ready message to the chat asking to commit (you can summon the `git-committer` agent or commit yourself)

### 📈 **Statistics Dashboard**

Expand Down
13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
- 📊 **Управлять задачами** — создавать, отслеживать и завершать todo-списки
- 🌐 **Получать данные** — HTTP-запросы, API-вызовы, веб-скрапинг
- 🔧 **MCP-инструменты** — подключать любой MCP-сервер для расширенных возможностей
- 🧠 **Память** — AI запоминает факты о вас и вашей системе («Сохрани в память, что…»), читает их в следующих сессиях через `memoryRead()`. Файл памяти лежит в папке пользователя, открывается и очищается в настройках.
- 🧠 **Двухуровневая память** — AI помнит и вас, и проект: **глобальная** память (`<userData>/memory.md`) хранит факты о пользователе и системе, **проектная** (`<projectDir>/.cuckoo/memory/ProjectMemory.md`) — соглашения, архитектуру и важные пути конкретного проекта. Инструменты `memorySave`/`memoryRead`/`memoryClear` принимают `scope` ('project' | 'global' | 'all'). Файлы открываются и очищаются в настройках.

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

Expand Down Expand Up @@ -141,6 +141,17 @@ maxTurns: 20
- **Навигация** — прыгайте между hunks, фильтруйте добавленные/удалённые строки
- **Мини-карта** — визуальный обзор изменений
- **Внутристроковый diff** — посимвольная подсветка для точных правок
- **Кнопка «Коммит»** — склеивает unified diff **всех** изменённых файлов и отправляет в чат готовое сообщение с просьбой закоммитить (можно позвать агента `git-committer` или закоммитить самому)

### ⌨️ **Горячие клавиши**

| Клавиша | Действие |
| ---------------- | -------------------------------------------- |
| **F1** | Показать текущий CHANGELOG (окно What's New) |
| **F6 / F7** | Дашборд статистики |
| **F8–F11** | Управление петом |
| **Ctrl+Shift+C** | Показать/скрыть оверлей Cookie Code |
| **Esc** | Закрыть панели и модалки |

### 📈 **Дашборд статистики**

Expand Down
Loading
Loading