# Napkin Tools: DSH Tidewatch ![GitHub License](https://img.shields.io/github/license/proDreams/dsh-tidewatch) ![GitHub Release](https://img.shields.io/github/v/release/proDreams/dsh-tidewatch) ![GitHub Last Commit](https://img.shields.io/github/last-commit/proDreams/dsh-tidewatch) ![GitHub Repo Stars](https://img.shields.io/github/stars/proDreams/dsh-tidewatch) [![Код на салфетке](https://img.shields.io/badge/Telegram-Код_на_салфетке-blue)](https://t.me/press_any_button) [![Заметки на салфетке](https://img.shields.io/badge/Telegram-Заметки_на_салфетке-blue)](https://t.me/writeanynotes) ## [English version](./README.md)

DSH Tidewatch

Плавающая карточка-прилив (**tide gauge**) для веб-интерфейса DeepSeek Harness. Она закрепляется рядом с полем ввода и сразу отвечает на три вопроса: какой тариф действует прямо сейчас, сколько осталось до следующей смены и сколько потратила текущая сессия. Карточка следует языку интерфейса DeepSeek Harness (английский, китайский, русский), показывает официальные окна пик/вне пика **в вашей собственной таймзоне** и форматирует деньги, токены и время через `Intl` для активной локали. > Это форк проекта [dsh-tidewatch](https://github.com/KhalilYamber/dsh-tidewatch) авторства KhalilYamber (MIT), > переработанный для международного использования: настоящий i18n вместо захардкоженного китайского, новый дизайн > карточки и таблица окон в локальном времени. Математика биллинга и структура сессионной проекции взяты из > оригинального проекта. ## Оглавление - [Возможности](#возможности) - [Требования](#требования) - [Установка](#установка) - [Обновление и удаление](#обновление-и-удаление) - [Переход с оригинального 1.x](#переход-с-оригинального-1x) - [Использование](#использование) - [Окна пик и вне пика](#окна-пик-и-вне-пика) - [Модель биллинга](#модель-биллинга) - [Язык интерфейса](#язык-интерфейса) - [Темы и официальные примитивы](#темы-и-официальные-примитивы) - [Структура проекта](#структура-проекта) - [Поток данных](#поток-данных) - [Разработка и проверка](#разработка-и-проверка) - [Известные ограничения](#известные-ограничения) - [Благодарности](#благодарности) - [Автор](#автор) - [Поддержка](#поддержка) - [Лицензия](#лицензия) ## Возможности - **Тариф с одного взгляда** — индикатор состояния (янтарный для пика, зелёный для вне пика), название текущей фазы и живой отсчёт до следующей смены. - **Линия прилива** — в шапке видно, какая часть текущей фазы уже прошла. - **Таблица окон в вашей таймзоне** — официальные UTC-окна, разложенные по вашему календарному дню, с отметкой текущей строки; сам тариф всегда определяется по UTC (официальное определение). - **Правило выходных** — суббота и воскресенье (календарные дни UTC) считаются по цене вне пика весь день, поэтому таблица сворачивается в одну строку на весь день. - **Цены активного тарифа** — промах и попадание кэша на входе, а также цена вывода за 1M токенов для текущей фазы. - **Токены сессии** — ввод, кэш (чтение + запись), вывод и рассуждения, отформатированные по локали. - **Стоимость по моделям** — разверните строку стоимости сессии, чтобы увидеть токены и стоимость каждой модели; итог равен сумме частей. - **Юани или доллары** — по умолчанию валюта следует языку интерфейса (китайский → CNY, иначе USD); переключение в один клик и запоминается. - **Настоящий i18n** — карточка следует языку DeepSeek Harness, содержит словари английского, китайского и русского языков и сама предлагает русский язык в списке языков. - **Интеграция с оболочкой** — читает токены темы `--dsw-*` (светлая и тёмная) и предпочитает официальные примитивы `StateDot`, `Tag`, `Tooltip` и `useDismissOnOutsidePointer`, откатываясь к встроенным реализациям, если оболочка их не предоставляет. - **Доступность с клавиатуры** — бейдж и строки-раскрывашки являются настоящими кнопками с фокус-рамками, состояниями `aria-expanded` / `aria-pressed` и ролью `progressbar` у линии прилива. ## Требования - Node.js ≥ 20. - DeepSeek Harness со сборкой, в которой есть команда `dsh plugin` (профиль `web`). - Больше ничего: таблицы цен встроены, а самому плагину не нужны ни API-ключ, ни доступ в сеть. ## Установка > Бейдж отображается в веб-интерфейсе, поэтому устанавливать нужно в профиль `web`. ```sh # Вариант 1: последний main (рекомендуется; следит за репозиторием) dsh plugin --profile web add github:proDreams/dsh-tidewatch # Вариант 2: закреплённый тег релиза (воспроизводимая установка) dsh plugin --profile web add github:proDreams/dsh-tidewatch#v2.0.0 # Вариант 3: тарбол из GitHub-релиза (закреплённый и удобный для офлайна) dsh plugin --profile web add https://github.com/proDreams/dsh-tidewatch/releases/download/v2.0.0/dsh-tidewatch-2.0.0.tgz # Локальная директория (для разработки) dsh plugin --profile web add link:/path/to/dsh-tidewatch ``` После установки перезапустите `dsh web` — справа от поля ввода появится бейдж. > **npm-пакет `dsh-tidewatch` нам не принадлежит.** В npm лежит только старая копия, опубликованная первоначальным > автором (1.0.6 от 2026-08-22), с устаревшими ценами и правилами, а этот форк сознательно живёт вне npm. Не > устанавливайте её и не судите по ней о текущем биллинге — используйте варианты выше. ### Обновление и удаление ```sh dsh plugin --profile web update dsh-tidewatch # или повторно выполните add выше dsh plugin --profile web list dsh-tidewatch # установленная версия dsh plugin --profile web remove dsh-tidewatch # удаление ``` История релизов — в [CHANGELOG.md](CHANGELOG.md). ### Переход с оригинального 1.x Версия **2.0.0** добавляет i18n-слой, таблицу окон в локальном времени и новый дизайн карточки. Сам биллинг не изменился. О двух более ранних исправлениях стоит знать, если вы пользовались оригинальным плагином до 1.1.2: - **1.1.2 — биллинг V4 Pro.** Официальная сноска (2) на странице цен и запись в changelog от 2026-09-10 заявляют, что API V4 Pro продолжает работать после 2026-09-14 **с неизменным способом оплаты** (если что-то изменится, об этом сообщат отдельно). Более ранняя сборка следовала трактовке из новостной страницы и с 2026-09-14 04:00 UTC направляла `deepseek-v4-pro` на цену Flash, из-за чего вызовы pro **занижались** примерно в 4.4 раза (промах кэша), 7.3 раза (попадание кэша) и 3.3 раза (вывод). Граница смены цены `V4_PRO_RETIRE_BOUNDARY` снова стала sentinel-значением, поэтому pro всегда считается по собственному прайсу; ветка маршрутизации сохранена — в неё нужно лишь вписать дату, когда появится официальная. - **1.1.1 — три ценовые эпохи.** Биллинг начал выбирать тариф по собственному времени вызова, а сессионная проекция `costUsage` получила `stateVersion` 4. После обновления сохранённые сессии один раз переигрываются, и вызовы с 2026-08-16 по 2026-09-10 восстанавливаются по **первому** расписанию пика (до этого они считались по новым, более низким ценам). На живой биллинг это не влияет. ## Использование - Бейдж закрепляется справа от поля ввода и выравнивается с ним по вертикали. Если окно слишком узкое, он переезжает над полем ввода и никогда не перекрывает ни поле, ни встроенную строку статистики. - Клик по бейджу разворачивает и сворачивает панель: таблица окон, цены активного тарифа, разбивка токенов и переключатель валюты. - Клик по строке **«Стоимость сессии»** разворачивает разбивку стоимости по моделям. - Переключатель валюты применяется сразу и запоминается; юани показываются с 2 знаками, доллары — с 4. - Развёрнутая панель никогда не выходит за пределы свободного места над бейджем: её бюджет по высоте измеряется от самого бейджа, поэтому на маленьком экране она не закрывает поле ввода. ## Окна пик и вне пика DeepSeek ввёл тарификацию по времени суток 2026-08-17: | Окно (UTC) | Пекинское время | Тариф | |---|---|---| | 01:00 – 04:00 | 09:00 – 12:00 | пик | | 04:00 – 06:00 | 12:00 – 14:00 | вне пика | | 06:00 – 10:00 | 14:00 – 18:00 | пик | | 10:00 – следующие 01:00 | 18:00 – следующие 09:00 | вне пика | Цена вне пика вдвое ниже цены пика. Карточка определяет тариф по **UTC**-окнам (официальное определение), а таблицу рисует в таймзоне смотрящего. **Правило выходных (с 2026-08-23)**: суббота и воскресенье (календарные дни UTC) считаются по цене вне пика весь день, без переключения; следующее переключение приходится на первое окно пика в понедельник. ## Модель биллинга - Единица: доллары США за 1M токенов (по официальной странице цен). Стоимость = промах ввода × cacheMiss + вывод × output + (чтение кэша + запись кэша) × cacheHit; «вывод» уже включает токены рассуждений. - **Три ценовые эпохи**, выбираемые по собственному времени вызова (историческая корректность; тарифы перечислены в порядке попадание кэша / промах кэша / вывод): | Эпоха | Диапазон (UTC) | Тарифы `deepseek-flash` | |---|---|---| | Базовая цена | до 2026-08-16 16:00 | 0.0028 / 0.14 / 0.28 | | Первое расписание пика | 2026-08-16 16:00 – 2026-09-10 04:00 | пик 0.014 / 0.44 / 1.32, вне пика — половина | | Новые цены V4.1 Flash | с 2026-09-10 04:00 | пик 0.006 / 0.3 / 1.2, вне пика — половина | - Каждый вызов считается по тарифу **своего момента события**, поэтому суммы не «плывут» ни на переключении фаз, ни на смене цен. - В учёте сумма хранится в долларах. Панель показывает юани по фиксированному курсу 6.67 (совпадает с официальным прайсом в юанях) либо доллары напрямую. ## Язык интерфейса Карточка — обычный гражданин DeepSeek Harness: она регистрирует пространство имён `tidewatch` и берёт весь текст из переводчика фреймворка, поэтому смена языка интерфейса в **Настройки → Язык** сразу переключает и карточку. | Язык | Статус | |---|---| | Английский | встроен (`en`) — язык-фоллбек всей цепочки | | Китайский (упрощённый) | встроен (`zh`) | | Русский | встроен (`ru`) и добавляется плагином в список языков |

Русский интерфейс, фаза вне пика

- DeepSeek Harness поставляет только `zh` и `en`, поэтому русский язык плагин добавляет в список сам. Для остальных плагинов русский разрешается через английский фоллбек. - На оболочке без сервиса локалей карточка ориентируется на язык браузера, а не на один захардкоженный язык. - Текст никогда не собирается из кусочков: каждая строка — это шаблон с `{placeholder}`, принадлежащий языку, а тесты падают, если словари разойдутся по набору ключей. ## Темы и официальные примитивы Карточка следует теме DeepSeek Harness через переменные `--dsw-*`, а каждый её собственный токен имеет фоллбек под схему, поэтому она остаётся корректной и на хосте без слоя темы. - Поддерживаются и светлая, и тёмная темы; единственный насыщенный цвет — акцент фазы (янтарный или зелёный). - Цифры набраны моно-шрифтом оболочки с табличными цифрами, поэтому панель читается как прибор. - Фронтенд предпочитает официальные общие примитивы — `StateDot`, `Tag`, `Tooltip` и `useDismissOnOutsidePointer` — и откатывается к встроенным реализациям, если в таблице модулей оболочки их нет.

Светлая тема

## Структура проекта ``` dsh-tidewatch ├── package.json # манифест dsh.bundle.patch + dsh.client.platform ├── cordis.patch.yml # строка патча бандла ├── scripts/build.sh # сборка: проверка синтаксиса + junction для zod ├── lib/ │ ├── pricing.js # чистые функции: окна, isPeakHour/peakPhaseAt, три ценовые эпохи, costOf │ ├── index.js # хост: сессионная проекция costUsage (счёт по времени события) │ └── client.js # браузер: карточка-прилив и словари i18n (бандл __ModuleLoader__) ├── docs/PORTING.md # заметки по адаптации под другие хосты └── test/verify.mjs # самопроверка чистых модулей (node test/verify.mjs) ``` ## Поток данных ``` блоки usage от вызовов модели (события assistant/chunk, assistant/message) │ lib/index.js: сессионная проекция costUsage (валидация zod-схемой) ▼ корзины токенов + стоимость в USD (тариф по времени события) │ useProjection('costUsage') (браузер) ▼ lib/client.js: отрисовка карточки (посекундный отсчёт, форматирование Intl, конвертация курса) ``` ## Разработка и проверка ```sh DSH_CHECKOUT=<корень исходников харнесса> bash scripts/build.sh # проверка синтаксиса + junction для zod node test/verify.mjs # 70 проверок: математика пика, биллинг, i18n, таймзоны ``` Набор тестов материализует настоящий клиентский бандл с заглушкой React и фейковым контекстом плагина, поэтому проверяет именно поставляемые словари, цепочку фоллбеков, форматирование по локали и таблицу окон по таймзонам, а не их копию. ## Известные ограничения - **Цены встроены** и покрывают три эпохи (базовая цена / первое расписание пика / новые цены V4.1 Flash); для V4-Pro используются официальные цены от 2026-08-17. Согласно сноске (2) на официальной странице цен и записи в changelog от 2026-09-10, V4 Pro продолжает обслуживаться после 2026-09-14 **с неизменным способом оплаты**, поэтому pro всегда считается по собственному прайсу, а `V4_PRO_RETIRE_BOUNDARY` остаётся sentinel-значением до официальной даты. **При официальном изменении цен обновите вручную оба места — `lib/pricing.js` (биллинг) и константу `DISPLAY_PRICES` в `lib/client.js` (отображение) — и сохраните вытесненные тарифы как ещё одну историческую эпоху.** - **Имена моделей**: актуальное — `deepseek-flash` (V4.1 Flash); алиасы `deepseek-v4-flash`, `deepseek-v4-flash-vision-exp` и `deepseek-v4.1-flash` считаются по текущей цене flash (см. `MODEL_ALIASES`). - **Тариф определяется строго по UTC** (официальное определение); таблица окон — только отображение в локальном времени. - **Юани считаются по фиксированному курсу** (6.67 USD → CNY, совпадает с официальным прайсом в юанях), а не по живому курсу. ## Благодарности - Оригинальный проект: [dsh-tidewatch](https://github.com/KhalilYamber/dsh-tidewatch) авторства **KhalilYamber** (MIT) — математика биллинга, модель ценовых эпох и структура сессионной проекции. - Математика пик/вне пика и форма проекции адаптированы из [dsh-cost-meter](https://github.com/Han-1413141/dsh-cost-meter) (MIT) и переписаны под минимальный размер. ## Автор Автор программы: Иван Ашихмин Telegram для связи: [https://t.me/proDreams](https://t.me/proDreams) Программа создана в рамках проекта «Код на салфетке». - Сайт: [https://pressanybutton.ru/](https://pressanybutton.ru/) - Telegram-канал: [https://t.me/napkincode](https://t.me/napkincode) ## Поддержка Если вам нравится этот проект и вы хотите поддержать его дальнейшее развитие, рассмотрите возможность доната: - [Поддержать через YooMoney](https://yoomoney.ru/to/41001431694461) - [Поддержать через Tribute в Telegram](https://t.me/tribute/app?startapp=dyds) - [Поддержать через нашего Telegram-бота](https://t.me/napkincode_bot?start=donate) Ваша поддержка помогает проекту расти и улучшать будущие возможности! ## Лицензия Проект распространяется под лицензией **MIT**. Это производная работа от dsh-tidewatch авторства KhalilYamber; оба уведомления об авторских правах сохранены в файле [LICENSE](LICENSE).