Skip to content
Merged
60 changes: 60 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,65 @@
# Changelog

## [4.0.36] - 2026-10-04

### Added

- 📸 **Команда `/screen` в Telegram — скриншот активного окна** — бот делает снимок текущего окна и присылает его в чат:
- новая команда `/screen` (+ подсказка в `/help`), зарегистрирована в меню команд для RU/EN;
- если активного окна нет — понятное сообщение «Нет активного окна»;
- при ошибке захвата бот возвращает причину (`screen.error`).
- ✅ **Утверждение плана через Telegram** — план из режима плана теперь можно согласовать или отклонить прямо из бота:
- сообщение «📋 План на утверждение» с inline-кнопками «✅ Согласовать» / «❌ Отказать»;
- решение синхронизируется между ботом и окном приложения (состояние диалога плана общее);
- повторное нажатие по закрытому запросу отвечает «Запрос уже закрыт».
- 🧹 **Перенос контекста: удаление промежуточного чата-суммаризатора** — чат, в котором модель сжимала историю, больше не остаётся висеть:
- sessionId промежуточного чата запоминается и удаляется уже из финального чата после переноса;
- удаление идёт через DOM сайдбара и **не зависит от языка интерфейса** (пункт меню и кнопка определяются по структурным признакам, а не по тексту).

### Changed

- 🌐 **Локализация списка MCP в оверлее** — статусы («Подключён» / «Не подключён» / «Отключён»), пустой список и тосты действий переведены через i18n (RU/EN) вместо захардкоженных строк.
- 💬 **Диалоги вопросов и режима плана** — улучшена обработка закрытия/отмены (`ask-user-question`, `exit-plan-mode`), обновлён рендеринг markdown для новых сценариев утверждения.

### Fixed

- 🎨 **Кастомизация: фон и покраска не применяются при выключенной кастомизации** — если кастомизация отключена, фон/blur/эффекты не навязываются, а inline-стили `background-image` снимаются с `<html>`/`<body>`:
- добавлен флаг состояния, синхронизируемый при загрузке настроек и по изменению из другого окна/бота — фон больше не «возвращается» обратно;
- при выключении сбрасываются blur, RGB-ник и стекло ввода.
- 🖼️ **Экспорт в PDF/DOCX: чистка SVG и служебных элементов** — перед выгрузкой ответа удаляются декоративные SVG-иконки и сервисные узлы, чтобы в документ попадал только полезный контент.
- 🔗 **Привязка перенесённого чата к проекту** — после переноса контекста новый чат автоматически привязывается к тому же проекту:
- `projectDir` переносится через контекст-порт и устанавливается как `pendingProjectDir` нового чата;
- добавлен fallback `lastProjectDir` в session-store и чтение персистентного маппинга, чтобы системный промпт проекта собирался даже при сброшенном `selectedProjectDir`.

### Added (EN)

- 📸 **Telegram `/screen` command — screenshot of the active window** — the bot captures the current window and sends it to the chat:
- new `/screen` command (+ hint in `/help`), registered in the command menu for RU/EN;
- if there is no active window, a clear "No active window" message is returned;
- on capture failure the bot reports the reason (`screen.error`).
- ✅ **Plan approval via Telegram** — a plan from plan mode can now be approved or denied straight from the bot:
- a "📋 Plan for approval" message with inline "✅ Approve" / "❌ Deny" buttons;
- the decision is synchronized between the bot and the app window (shared plan dialog state);
- pressing a button on an already-closed request answers "Request already closed".
- 🧹 **Context transfer: removing the intermediate summarizer chat** — the chat where the model compressed the history no longer lingers:
- the summarizer chat's sessionId is remembered and deleted from the final chat after the transfer;
- deletion goes through the sidebar DOM and **does not depend on the UI language** (menu item and button are matched by structural traits, not by text).

### Changed (EN)

- 🌐 **Localized MCP list in the overlay** — statuses ("Connected" / "Disconnected" / "Disabled"), the empty state, and action toasts now go through i18n (RU/EN) instead of hardcoded strings.
- 💬 **Question and plan-mode dialogs** — improved close/cancel handling (`ask-user-question`, `exit-plan-mode`) and markdown rendering for the new approval scenarios.

### Fixed (EN)

- 🎨 **Customization: background and styling are not applied when customization is off** — when customization is disabled, background/blur/effects are not forced, and inline `background-image` styles are removed from `<html>`/`<body>`:
- a state flag is synchronized on settings load and on changes from another window/bot — the background no longer snaps back;
- disabling resets blur, RGB username, and input glass.
- 🖼️ **PDF/DOCX export: stripping SVG and service elements** — before exporting a response, decorative SVG icons and service nodes are removed so only useful content lands in the document.
- 🔗 **Binding a transferred chat to the project** — after a context transfer, the new chat is automatically bound to the same project:
- `projectDir` is carried through the context port and set as the new chat's `pendingProjectDir`;
- added a `lastProjectDir` fallback in session-store and reading of the persistent mapping, so the project system prompt is built even when `selectedProjectDir` is reset.

## [4.0.35] - 2026-09-29

### Added
Expand Down
36 changes: 36 additions & 0 deletions botsrc/i18n.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ const STRINGS = {
"help.cmd.show": "/show &lt;hash&gt; — diff коммита",
"help.cmd.files": "/files &lt;hash&gt; — файлы коммита",
"help.cmd.todos": "/todos — список задач активного окна",
"help.cmd.screen": "/screen — скриншот активного окна",
"help.cmd.cancel": "/cancel — отменить ввод / подтверждение",
"help.cmd.help": "/help — эта справка",
"help.features": "<b>Возможности</b>",
Expand Down Expand Up @@ -262,6 +263,23 @@ const STRINGS = {
"approval.deniedShort": "❌ Отклонено",
"approval.closed": "Запрос уже закрыт",

// ===== Утверждение плана =====
"plan.title": "📋 <b>План на утверждение</b>",
"plan.ask": "<i>Согласовать план?</i>",
"plan.approve": "✅ Согласовать",
"plan.deny": "❌ Отказать",
"plan.approved": "План согласован",
"plan.denied": "План отклонён",
"plan.approvedShort": "✅ Согласован",
"plan.deniedShort": "❌ Отклонён",
"plan.closed": "Запрос уже закрыт",

// ===== Скриншот =====
"screen.capturing": "📸 Делаю скриншот окна...",
"screen.caption": "📸 Скриншот активного окна",
"screen.noWindow": "Нет активного окна",
"screen.error": "Не удалось сделать скриншот: {err}",

// ===== Долгий процесс =====
"longproc.title": "⏳ <b>Долгий процесс</b>",
"longproc.body": "Команда выполняется более {sec} с:",
Expand Down Expand Up @@ -320,6 +338,7 @@ const STRINGS = {
"help.cmd.show": "/show &lt;hash&gt; — commit diff",
"help.cmd.files": "/files &lt;hash&gt; — commit files",
"help.cmd.todos": "/todos — tasks of the active window",
"help.cmd.screen": "/screen — screenshot of the active window",
"help.cmd.cancel": "/cancel — cancel input / approval",
"help.cmd.help": "/help — this help",
"help.features": "<b>Features</b>",
Expand Down Expand Up @@ -539,6 +558,23 @@ const STRINGS = {
"approval.deniedShort": "❌ Denied",
"approval.closed": "Request already closed",

// ===== Plan approval =====
"plan.title": "📋 <b>Plan for approval</b>",
"plan.ask": "<i>Approve this plan?</i>",
"plan.approve": "✅ Approve",
"plan.deny": "❌ Deny",
"plan.approved": "Plan approved",
"plan.denied": "Plan denied",
"plan.approvedShort": "✅ Approved",
"plan.deniedShort": "❌ Denied",
"plan.closed": "Request already closed",

// ===== Screenshot =====
"screen.capturing": "📸 Capturing window screenshot...",
"screen.caption": "📸 Active window screenshot",
"screen.noWindow": "No active window",
"screen.error": "Failed to capture screenshot: {err}",

// ===== Long process =====
"longproc.title": "⏳ <b>Long-running process</b>",
"longproc.body": "Command has been running for over {sec}s:",
Expand Down
Loading
Loading