Commit graph

12 commits

Author SHA1 Message Date
Sergey
bc673e7c24
docs(readme): fix custom STT endpoint section (#49)
Some checks failed
CI / check (push) Successful in 1m41s
Deploy / build (push) Failing after 5s
## Что сделано

- EN и RU секции «Custom STT Endpoint» обновлены: nginx-конфиг заменён
на pass-through вариант без префикса:
  ```nginx
  location / {
      proxy_pass https://api.groq.com:443;
      proxy_set_header Host api.groq.com;
  }
  ```
- Пример endpoint теперь
`https://your-domain.com/openai/v1/audio/transcriptions` (без `/groq`) —
совпадает с реальной настройкой сервера (whisper.slaid098.dev).
- Добавлена заметка в обе секции: префикс пути не нужен, если домен
выделен только под Groq; `/groq`-вариант остаётся валидным для
мульти-прокси доменов (`location /groq/` с trailing slash срезает
префикс).

## Почему

README описывал конфиг с префиксом `/groq`, который не совпадает с
реальной настройкой. `proxy_pass` без trailing slash передаёт URI как
есть, поэтому на выделенном домене префикс лишний и только усложняет
настройку. Документация должна совпадать с реальным рабочим сервером.

## Watch out

- Только README.md (EN + RU секции). Код, тесты, версия не тронуты —
bump не требуется по AGENTS.md.

## Pending

—

Closes #48

Closes #48

---------

Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-06 11:10:06 +03:00
Sergey
b8040f6cd3
fix(transcription): empty whisperPrompt default to stop English bias (#47)
## Что сделано

- `DEFAULTS.whisperPrompt` изменён с 107-символьного английского списка
терминов на пустую строку (`src/config.ts:8`). Английский промпт уводил
русский аудио в английский (особенно на turbo) — нарушает документацию
Groq: «Use the same language as the language of the audio file».
- `tests/config.test.ts` — 2 устаревших теста (`non-empty
whisperPrompt`, `under 120 characters`) заменены на 1: `should have
empty whisperPrompt by default`.
- Version bump 1.0.4 → 1.0.5 в `vite.config.ts:11` и `package.json:3`.
- ADR-0007 (`docs/decisions/0007-pr-46-empty-whisper-prompt.md`) —
фиксирует решение, контекст (PR #43 + баг), последствия (`buildFormData`
falsy-check), альтернативы (двуязычный промпт, смена модели — обе
отвергнуты).
- README — секция troubleshooting «Wrong Language (English instead of
Russian)» добавлена в EN и RU секции после температурного блока.
Инструкция очистить Whisper Prompt через меню Tampermonkey.

## Почему

PR #43 добавил английский biasing-промпт для технических терминов. На
практике английский промпт + русский аудио = модель возвращает
английский текст, перебивая явный `language=ru`. Пользователь подтвердил
баг на turbo. Параметр `prompt` Whisper — это seed-контекст декодера,
модель стремится продолжить его язык. Пустой default = чистый
auto-detect без biasing. Поле и menu command остаются для юзеров с
узкопрофильной терминологией.

## Watch out

- **Обратная совместимость**: существующие юзеры со старым
107-символьным значением в `GM_getValue("whisperPrompt")` сохраняют его
— новый default применяется только к свежим установкам и к тем, кто
очистил поле через `Set Whisper Prompt`. Миграции нет намеренно (не
ломаем сохранённые настройки).
- `buildFormData` использует falsy-check `if (config.whisperPrompt)` —
пустая строка не отправляет поле `prompt` в Groq API вообще.
- `transcribe.test.ts` использует mock `whisperPrompt: "Software
development discussion."` — валидный mock для тестирования
prompt-передачи, НЕ тронут (не путать с DEFAULTS).
- `DEFAULTS.model` (`whisper-large-v3`), `DEFAULTS.language` (`""`),
`DEFAULTS.temperature` (`0`), `DEFAULTS.endpoint` — не менялись. Смена
модели на turbo была альтернативой, отвергнута (v3 лучше для русского,
баг в промпте не в модели).
- Touchpoints ровно 7: `src/config.ts`, `tests/config.test.ts`,
`vite.config.ts`, `package.json`, `docs/decisions/0007-*.md` (новый),
`README.md` (2 вставки EN+RU). `src/transcribe.ts` и остальные src-файлы
не тронуты.

## Pending

- CI на push-ветке (vitest, biome, tsc, knip) — все зелёные локально
(55/55 tests, 22 файла biome-clean, tsc чист, knip чист).
- После merge — ADR-0007 ссылается на PR #46 (номер уже известен из
issue).

Closes #46

---------

Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-04 15:13:01 +03:00
Sergey
c074dfd777
feat(transcription): custom endpoint and temperature (#43)
## Что сделано

- `src/types.ts`: добавлены поля `endpoint: string` и `temperature:
number` в интерфейс `AppConfig`.
- `src/config.ts`:
- `DEFAULTS.endpoint =
"https://api.groq.com/openai/v1/audio/transcriptions"` (обратная
совместимость).
  - `DEFAULTS.temperature = 0` (детерминированный вывод).
- `DEFAULTS.whisperPrompt` сокращён с ~270 до 107 символов — термины
через запятую, без предложений.
- `getConfig()` читает новые поля через `GM_getValue` с fallback на
`DEFAULTS`.
- Добавлены 2 меню-команды: «Set STT Endpoint» и «Set Temperature» в
`registerMenuCommands` (параметры `onSetEndpoint`, `onSetTemperature`).
- `src/index.ts`: реализованы `promptForEndpoint` (fallback на дефолт
при пустом вводе) и `promptForTemperature` (clamp к `[0, 1]`,
NaN-валидация, сохранение текущего значения при cancel),
зарегистрированы в `registerMenuCommands`.
- `src/transcribe.ts`: удалён хардкод `GROQ_API_URL`, используется
`config.endpoint`; в `buildFormData` добавлено
`formData.append("temperature", String(config.temperature))`.
- `vite.config.ts`: `@connect api.groq.com` → `@connect *` (разрешает
`GM_xmlhttpRequest` к любому домену).
- `README.md`: добавлены разделы «Custom STT Endpoint» (EN+RU) с
примером nginx `proxy_pass` и «Temperature».
- `tests/`: обновлены `mockConfig` (новые поля), ассерты на
`temperature` в FormData, тест на длину `whisperPrompt < 120`,
`registerMenuCommands` теперь ожидает 7 команд.

## Почему

Groq периодически блокирует прямые IP-запросы к `api.groq.com` — нужен
обход через пользовательский nginx-прокси (свой endpoint). Whisper
галлюцинирует на тишине/шуме — `temperature=0` снижает галлюцинации.
Длинный `whisperPrompt` с целыми предложениями мог «утекать» в вывод
транскрипции — сокращён до списка терминов через запятую (~107
символов). Хардкод `GROQ_API_URL` и `@connect api.groq.com` блокировали
использование кастомных доменов.

## Watch out

- `@connect *` в метаблоке расширяет поверхность запросов userscript-а
на любой домен — юзер должен доверять установленному endpoint. Это
намеренный trade-off для поддержки произвольных прокси.
- Существующие юзеры со старым `whisperPrompt` в `GM_getValue` сохраняют
своё значение (новый короткий default применяется только если ключ не
задан) — обратная совместимость сохранена.
- Кламп температуры: ввод `NaN` → toast «Invalid temperature» (значение
не меняется); ввод `5` → `1`; ввод `-0.3` → `0`.
- Пустой endpoint (юзер ввёл пробелы) → fallback на `DEFAULTS.endpoint`
(`api.groq.com`), не пустая строка.
- Cancel в prompt (Esc) по endpoint/temperature → значение не меняется
(поведение `null`-check).
- Error-сообщения `transcribe.ts` всё ещё упоминают «Groq API» —
оставлено намеренно, т.к. дефолтный endpoint = Groq и большинство юзеров
используют его.

## Pending

- Обновить `@version` в `vite.config.ts` при релизе (сейчас `1.0.3` — не
тронуто, решает релиз-процесс).
- Trim тишины (RMS-based) — явно вне scope этого issue (отдельный PR
если `temperature=0` не поможет).

Closes #42

Closes #42

---------

Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-04 12:32:39 +03:00
Sergey
4bc4939436
feat(cover): add lime cover image and readme reference (#41)
## Что сделано
- Добавлен кавер `assets/cover.png` (1024×1024, Lime-палитра: base
#0a0a0a, accent #ccff00, fg #ededed, заголовок lowercase "opencode voice
dictation", лого OpenCode + микрофон-бейдж) — скопирован из одобренного
варианта v02-fixed.
- В README.md сразу после H1 добавлена строка
`![Cover](assets/cover.png)` (до tagline-комментариев).

## Почему
- Витрина slaid098.dev требует обложку 1024×1024 в Lime-стиле.
- Валидация README (create-readme validate) давала ровно одну ошибку —
отсутствие ссылки `![Cover](assets/cover.png)`.

## Watch out
—

## Pending
—

Closes #40

Closes #40

---------

Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-01 06:39:36 +03:00
Sergey
365a3b3ebc
docs(readme): align README with updated create-readme checker (#39)
## Что сделано
- README перегенерирован по новому стандарту create-readme
(tagline_en/ru delimiter-теги, H1 # 🚀, без bash-блока, без License)
- Обход бага #148 (локальная перезапись сломана) — ручная сборка по
шаблону skill repo-readme + validate
- ADR-0006 + handoff созданы

## Почему
Тулза create-readme обновилась (#149, #151, #153, aa48fd7): новые
требования валидатора (tagline_en/ru delimiter-теги, H1 prefix, блок
manual License). README после PR #37 не прошёл бы новый validate.

Closes #38

Closes #38

---------

Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-30 20:04:05 +03:00
Sergey
4542bd8883
refactor(repo): remove GitHub releases, add icon, standardize README (#37)
## Что сделано
- Убран тег v1.0.0 и GitHub Release v1.0.0
- release.yml → deploy.yml (деплой в dist без GitHub Release)
- Добавлен assets/icon.png 128×128
- README перегенерирован через create-readme (include_clone=false,
кликабельные steps)
- docs/project-map/github.md обновлён
- ADR + handoff созданы

## Почему
GitHub Releases избыточны — автообновление работает через @updateURL на
ветку dist. README не соответствовал стандарту create-readme (нет
delimiter-тегов для slaid098.dev). @icon ссылался на несуществующий
файл.

Closes #36

Closes #36

---------

Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-30 03:39:20 +03:00
Sergey
af5bc63bcc
fix(ui): support OpenCode 1.18.x composer selectors (#29)
## Что сделано
- Обновлён массив COMPOSER_SELECTORS в src/ui.ts: добавлены новые
селекторы [data-component="prompt-input-v2"] и
[data-component="session-prompt-dock"] как primary для OpenCode v1.18.x
- Старые селекторы session-new-composer/session-composer сохранены как
fallback для обратной совместимости
- README обновлён с указанием совместимой версии OpenCode v1.18.x
(русский и английский блоки)
- Добавлен handoff-документ и ADR 0001 с обоснованием порядка
fallback-селекторов

## Почему
В OpenCode v1.18.x селекторы session-composer/session-new-composer
удалены из исходников, из-за чего findComposer() возвращал null и кнопка
🎤 не появлялась в чате. Порядок массива обновлён как primary (v1.18.x) →
fallback (pre-1.18), чтобы сохранить совместимость с OpenCode <1.18 до
oldInterfaceSunset (2026-09-14).

Closes #28

---------

Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-25 01:29:00 +03:00
Sergey
8de6ca3c7e
docs: note new UI requirement in README (#19)
## Что сделано

Добавил предупреждение в README (RU + EN) о том, что скрипт требует
новый интерфейс OpenCode. Текст размещён сразу после описания и до
секции установки, чтобы пользователь увидел его до инсталляции.

## Почему

Скрипт использует для определения страницы и вставки текста. Этот
атрибут отсутствует в старом интерфейсе OpenCode — скрипт молча
опрашивает DOM и никогда не активируется. Поддержка старого интерфейса
нецелесообразна, т.к. он выводится из эксплуатации. Достаточно
задокументировать ограничение.

Co-authored-by: opencode-agent <agent@slaid098.dev>
2026-07-14 15:34:07 +03:00
Sergey
caf9950e52
docs: update README — cancel, question prompt, remove Cursor (#11)
- Remove 'Cursor-quality' from RU and EN descriptions
- Add cancel (✕) button to usage instructions  
- Add question prompt support info
- Update usage steps: stop (⏹) vs cancel (✕)

Co-authored-by: opencode-agent <agent@slaid098.dev>
2026-07-08 09:55:28 +03:00
Sergey
33f2f48ac9
feat: redesign mic button UI, restructure README (RU first) (#9)
## UI Changes

- Replace emoji icons (🎤) with clean SVG (Material Design mic, stop,
spinner)
- Move button to **top-right corner** of composer (both PC and mobile)
- Separate timer pill element — no more cramped/overlapping timer inside
button
- Pulsing red dot + monospace timer during recording
- Spinner animation during transcription
- Ensure composer is `position: relative` for absolute positioning

## README

- Russian section first, then English
- Minimalistic: removed Development/CI-CD sections
- Prominent one-click install link
- Kept: compatibility table, setup, usage, auto-update, settings

## Test Results

-  44 tests passed
-  100% coverage
-  Lint, Typecheck, Knip — clean
-  Build: 20.13 KB

Co-authored-by: opencode-agent <agent@slaid098.dev>
2026-07-08 09:08:12 +03:00
opencode-agent
a2cf35b509 feat: auto-build CI workflow, one-click install URLs, auto-update docs
- Add release.yml: builds and deploys to dist branch on push to main
- Add GitHub Releases creation on version tags
- Update vite.config.ts: updateURL/downloadURL point to dist branch
- Update README: one-click install links for PC and Android
- Add auto-update documentation (EN/RU)
- Add manual install from Releases instructions
- Revert dist/ from gitignore (built by CI, not committed)
2026-07-08 05:45:54 +00:00
opencode-agent
3bd443dde3 feat: initial implementation of OpenCode Voice Dictation
- TypeScript + Vite (vite-plugin-monkey) userscript
- Groq API integration with whisper-large-v3
- Tap-to-toggle recording with noise suppression
- Contenteditable text insertion for OpenCode web
- Ctrl+Space keyboard shortcut (desktop)
- Custom Whisper prompt for software development context
- Recording timer, toast notifications, auto-submit option
- 44 unit tests, 100% line coverage
- Biome linter, Knip, Vitest, CI/CD pipeline
- Bilingual README (EN/RU) with compatibility table
2026-07-08 05:37:17 +00:00