8 Commits
Author SHA1 Message Date
Alex CubeandClaude Opus 5 6ccb5dd46b Одна модель вместо трёх: DeepSeek убрал выбор из веб-морды
DeepSeek больше не даёт выбирать модель: radiogroup Instant / Expert /
Vision (div[data-model-type][role="radio"]) со страницы исчез, оставшаяся
модель универсальна и разбирает в том числе картинки. Вместе с выбором
отпали и три роли — think, search, vision, — а с ними отдельный чат под
каждую: теперь чат один.

Заодно выяснилось, что тумблеры DeepThink и Search больше не пропадают
после первого сообщения — они видны и переключаются в любом чате, в том
числе начатом. На их исчезновении держалась вся прежняя схема с чатами
под роль, так что нужда в ней отпала и по этой причине тоже.

DeepThink выключается перед каждым вопросом: он только показывает
размышления модели и раздувает ответ. Search не трогаем намеренно — это
тумблер человека: как поставлен во вкладке, так мост и спрашивает.

Попутно два бага, которые вылезли на живом прогоне:

- data-virtual-list-item-key у вопросов теперь отрицательные (-4, 2, -11,
  8 для двух обменов подряд), и __firstMsg сортировкой по возрастанию
  отдавал последний вопрос вместо первого. Правка уходила в чужое
  сообщение. Берём порядок DOM — список рисуется сверху вниз.

- Вопрос с картинкой уходил новым сообщением в рабочий чат и ломал
  уговор «в чате ровно один обмен», на котором держится правка первого
  сообщения. После такого чат оставался из двух обменов, и наружу
  отдавался ответ на предыдущий вопрос. Теперь картинка всегда открывает
  новый чат, а старый удаляется как обычно.

Снаружи: /api/tags отдаёт одну модель deepseek:chat, имя присланной
клиентом модели не смотрится вовсе, ключ defaultRole из config.json убран,
chats.json стал {"id": "..."} вместо карты ролей. /api/probe показывает
положение тумблеров.

Проверено живым прогоном: обычный вопрос, вопрос с картинкой, снова
обычный — ответы верные, чат ротируется, сайдбар чистится.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ez8B2cR3mbm1fjmAMa8JXS
2026-09-11 10:26:03 +03:00
Alex Cube adbcedb485 README: чистка сайдбара идёт по аккаунту, а не по профилю
Написано было, что чаты друг у друга удаляют программы, сидящие в одном
профиле браузера. Это неверно: чаты хранятся на сервере DeepSeek и привязаны
к аккаунту, поэтому другой профиль с тем же логином ни от чего не спасает —
пропадёт и личная переписка человека на этом аккаунте. Разводить надо
аккаунты; отдельный профиль браузера нужен по другой причине — окно нельзя
сворачивать, и к профилю, открытому без порта управления, не подключиться.
2026-08-26 17:30:28 +03:00
Alex Cube 9e25f4de5d Значок: icon.ico вшивается в exe
csc собирался без /win32icon, поэтому у exe не было значка вовсе, а окно
пыталось сделать значок из icon.png через GetHicon — тот теряет альфу
и не даёт нужных размеров. Теперь многоразмерный icon.ico вшит в exe,
а окно берёт значок из себя же.
2026-08-26 16:51:47 +03:00
Alex CubeandClaude Opus 5 46ea8a9296 Окно с индикатором вместо чёрной консоли
Маленькое окно на C#, собирается компилятором из состава Windows: ставить
нечего, зависимостей нет — как и у всего остального в проекте. Запускает
node дочерним процессом, показывает его вывод, прячется в трей, красит
значок по /api/state.

Node теперь уходит вместе с окном: окно держит его stdin, server.mjs при
DEEPSEEK_TRAY=1 слушает close на этой трубе. Job Object не подошёл бы —
он забрал бы с собой и браузер, который человеку нужен.

Окно смотрит на checked, а не только на ready: снимок обновляет сторож,
и без этой проверки окно показывало бы «готов» через секунду после смерти
браузера. Поэтому /api/state отдаёт ещё и watchdogSec.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 16:47:34 +03:00
Alex CubeandClaude Opus 5 b6f45db8dc README: убрана ссылка на удалённый репозиторий DeepShim
Предупреждение про общий профиль браузера ссылалось на git.08h.ru/alex/deepshim,
которого больше нет. Ссылка заменена на OLD_DEEPSHIM.md — там тот же случай
описан подробнее, вместе с тем, как он выглядел вживую.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 14:20:30 +03:00
Alex CubeandClaude Opus 5 5771817503 OLD_DEEPSHIM.md: заметки закрытого проекта
DeepShim (ollama_orchestro) закрыт: движок браузера переехал сюда, веб-пульт
с галочками и помощь с git — в deepwork, потребители ходят по HTTP, а Claude
Code на локальной модели похоронен как неудачный.

Своего в нём не осталось, зато осталось знание про веб-интерфейс DeepSeek,
добытое живыми прогонами: почему признак конца ответа ищется в кнопке
отправки, почему блоки кода пропадают у фонового окна, почему New chat
нельзя жать из DOM, а кнопку редактирования — только из DOM, в каком порядке
удаляется чат и на чём там уже ошибались.

Почти всё это действует внутри browser.mjs и продублировано комментариями
рядом с кодом. Файл — на случай, когда нужно понять ПОЧЕМУ, а комментария
не хватило.

Первым разделом — почему DeepShim больше не нужен, с тремя доводами, почему
держать его дальше было бы вредно: дубликат знания разошёлся бы молча, две
программы на одном профиле браузера удаляют чаты друг друга, потребителей
не осталось.

Намеренно не перенесено: заметки про бюджет контекста Claude Code, плагины
и запуск оркестратора — они про мёртвую часть и к DeepSeek отношения не имеют.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 14:18:46 +03:00
Alex CubeandClaude Opus 5 8c52cf101c Самодостаточность: движок браузера переехал внутрь, DeepShim больше не нужен
Раньше сервис был обёрткой: каждый запрос спавнил ollama_orchestro/ask.mjs
дочерним процессом, гонял вопрос и ответ через временные файлы и читал
чужой config.json ради профиля браузера. Работать это могло только рядом
с установленным DeepShim.

Теперь всё своё. browser.mjs — перенесённый из ask.mjs движок: CDP-сессия,
помощники страницы со всем, что удалось выяснить про разметку DeepSeek,
отправка с подтверждением, ожидание ответа по состоянию кнопки, работа
с чатами. Пульт, разбор патчей и git остались в DeepShim, сюда не поехали.

Побочно ушли дочерний процесс на каждый запрос и временные файлы: вопрос
и ответ теперь просто переменные. Файл на диске остался только для картинки —
<input type="file"> иначе не наполнить.

Свои настройки вместо чужих: browserExe, profileDir и cdpPort в config.json,
рядом config.local.json для путей конкретной машины (в репозиторий не идёт).
Свой chats.json, тоже не в репозитории: это рабочее состояние, оно
переписывается при каждой смене чата. Образец — chats.example.json.

Добавлен GET /api/probe: что видно во вкладке прямо сейчас.

ВАЖНО: профиль браузера должен быть отдельный. Перед каждым вопросом сайдбар
подчищается от всего, чего нет в своём chats.json, поэтому две программы
на одном профиле удаляют чаты друг друга. Проверено вживую, описано в README.

Проверки: node test.mjs; сквозной прогон с нуля — свой чат заведён сам,
ответ верный; пять правок в одном чате, на шестом запросе новый чат, старый
удалён, сайдбар не растёт.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 13:09:41 +03:00
Alex CubeandClaude Opus 5 f5cf061fcc DeepSeek, притворяющийся Ollama
У веб-версии DeepSeek нет API: ни ключа, ни эндпойнта, только вкладка
в браузере. Этот сервис держит такую вкладку и отдаёт наружу протокол
Ollama, поэтому любая программа, которая уже умеет ходить в Ollama,
подключается к DeepSeek сменой одного адреса.

  GET  /api/tags        три "модели" по числу режимов чата;
                        503, пока браузер с чатом не поднят
  GET  /api/version
  POST /api/chat        images в сообщении уводят в чат со зрением
  POST /api/generate
  POST /api/embeddings  501: веб-чат векторов не отдаёт

Внутри — ollama_orchestro/ask.mjs дочерним процессом: он ничего не
экспортирует и выполняется при импорте, это программа командной строки.
Браузер поднимается напрямую из Node, а не через browser-launch.ps1 из
DeepShim: тот рассчитан на человека за консолью и на занятом профиле
спрашивает Read-Host, а у сервиса некому отвечать. Флаги окна оттуда
перенесены: у неактивного окна DeepSeek не дорисовывает блоки кода.

Чего нет: настоящего потока (формат соблюдается, но ответ приходит
целиком), temperature и num_predict, эмбеддингов, параллельных запросов —
вкладка одна, запросы идут очередью по одному.

Сервис слушает все адреса и ходит в DeepSeek под вашим логином. Только
доверенная сеть; сузить до этого компьютера — host в config.json.

Проверка перевода формата без браузера: node test.mjs

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 12:49:03 +03:00