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
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
# Changelog

## [4.0.30] - 2026-09-18

### Added

- 🎛 **Тумблер «Показывать дашборд»** — статистику можно копить, но сам дашборд на домашней странице скрыть. Настройки → «Система и безопасность» → «Статистика»:
- выключил — дашборд прячется мгновенно и больше не мешает; сбор статистики при этом продолжается;
- включил обратно — дашборд тут же возвращается на своё место.

### Changed

- ⚡ **Дашборд стал заметно легче** — рендер оптимизирован, чтобы не грузить страницу:
- DOM-скелет строится один раз, дальше обновляются только изменившиеся узлы (теплокарта трогает 1–2 ячейки вместо ~200);
- обновление данных пропускается, если сводка не менялась, и не тянется вовсе, пока дашборд скрыт;
- наблюдение за DOM дебаунсится, убраны дублирующиеся подписки — во время стрима ответа страница больше не дёргает дашборд сотни раз в секунду.

### Fixed

- 🐛 **Дашборд пропадал не сразу при входе в сессию** — при переходе в чат он висел ещё до 1.5 секунды. Причина: SPA-навигация идёт через `history.pushState`/`replaceState`, которые не вызывают `popstate`/`hashchange`. Теперь эти вызовы перехватываются, и дашборд скрывается мгновенно.

## [4.0.28] - 2026-09-17

### Added
Expand Down
42 changes: 42 additions & 0 deletions src/main/ipc.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ const { isDangerous } = require("./dangerous-commands");
const settingsStore = require("./settings-store");
const chatExport = require("./chat-export");
const contextPort = require("./context-port");
const statsStore = require("./stats-store");
const { decodeOutput, normalizeCommand } = require("../../tools/decodeOutput");
const gitDiff = require("./git-diff");
const todoStore = require("./todo-store");
Expand Down Expand Up @@ -570,6 +571,47 @@ function registerIpcHandlers() {
}
});

// ========== Статистика использования ==========
ipcMain.handle("stats-get-summary", async (_event, { days } = {}) => {
try {
return { success: true, summary: statsStore.getSummary(days) };
} catch (err) {
return { success: false, error: err.message, summary: null };
}
});

ipcMain.handle("stats-record-message", async (_event, ev = {}) => {
try {
return { success: true, stats: statsStore.recordMessage(ev) };
} catch (err) {
return { success: false, error: err.message };
}
});

ipcMain.handle("stats-record-tokens", async (_event, ev = {}) => {
try {
return { success: true, stats: statsStore.recordTokens(ev) };
} catch (err) {
return { success: false, error: err.message };
}
});

ipcMain.handle("stats-record-session", async (_event, ev = {}) => {
try {
return { success: true, stats: statsStore.recordSession(ev) };
} catch (err) {
return { success: false, error: err.message };
}
});

ipcMain.handle("stats-reset", async () => {
try {
return { success: true, stats: statsStore.reset() };
} catch (err) {
return { success: false, error: err.message };
}
});

// ========== Перенос контекста (Context Port) ==========
// Хранилище живёт в main и переживает reload страницы при смене чата.
ipcMain.handle(
Expand Down
7 changes: 7 additions & 0 deletions src/main/settings-store.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,13 @@ const DEFAULTS = {
petEnabled: true,
// Debug-режим пета: разблокирует горячие клавиши F8/F9/F10/F11.
petDebugMode: false,
// ===== Статистика использования (дашборд на home-странице) =====
// Копить локальную статистику (сессии/сообщения/токены/дни).
statsEnabled: true,
// Debug-режим дашборда: горячие клавиши и отладочная рамка.
statsDebugMode: false,
// Показывать сам дашборд на домашней странице (независимо от сбора статистики).
statsDashboardEnabled: true,
// ===== Таймаут выполнения JS-скриптов (секунды) =====
// Общий дедлайн для одного cuckoo-блока (RUN_DEADLINE в tools/JsRunner.js).
// Минимум 10 сек, максимум 1000 сек. Синхронный vm-таймаут остаётся 30 сек.
Expand Down
Loading
Loading