## Что сделано - Расширен gate `isOpencodePage()` в `src/insert.ts`: теперь проверяет любой из 6 селекторов (`prompt-input`, `prompt-input-v2`, `session-prompt-dock`, `session-composer`, `session-new-composer`, `question-custom-input`) вместо одного `prompt-input`. Это активирует скрипт раньше на v1.18.x, где композер может монтироваться lazy. - Добавлено отладочное логирование с префиксом `[ocvd]` в `src/index.ts` (init, gate retry) и `src/ui.ts` (composer found/not found, mic button injected). Пользователь может видеть в DevTools Console где скрипт останавливается. - Бамп `@version` до `1.0.1` в `package.json` и `vite.config.ts` — разблокирует автообновление userscript-менеджеров (после PR #29 версия осталась `1.0.0`, автообновление не сработает). ## Почему PR #29 добавил корректные селекторы для v1.18.x, но пользователи не получили обновление из-за не-бампнутой `@version`. Также gate `isOpencodePage()` проверял только `prompt-input`, которого может не быть в DOM на ранних этапах lazy-mount. Добавление логирования поможет диагностировать runtime-проблемы в DevTools. Closes #28 --------- Co-authored-by: opencode-agent <agent@opencode.local>
11 KiB
11 KiB
| pr_number | branch | parent_pr | title | status | created |
|---|---|---|---|---|---|
| 30 | fix/ui/v1-18-runtime-gate-debug | 29 | broaden page gate + debug logging + version bump for v1.18.x | open | 2026-07-24 |
Handoff — PR #30: v1.18.x runtime gate + debug logging + version bump
Контекст
PR #29 (fix/ui): support OpenCode 1.18.x composer selectors) добавил корректные селекторы prompt-input-v2 и session-prompt-dock в массив COMPOSER_SELECTORS — live-браузер на opencode.slaid098.dev v1.18.3 подтвердил их валидность. Однако PR #29 оставил три пробела, из-за которых скрипт всё ещё не запускался у реальных пользователей:
@versionне бампнута. Вpackage.jsonиvite.config.tsосталась1.0.0(та же, что у PR #29). Userscript-менеджеры (Violentmonkey/Tampermonkey) сравнивают@versionиз.meta.jsдля автообновления — совпадение версий = нет обновления = пользователи остаются на сломанном билде PR #28.- Gate
isOpencodePage()узкий. Вsrc/insert.tsфункция проверяла только[data-component="prompt-input"]. На v1.18.x композер монтируется lazy (после загрузки сообщений сессии), аprompt-inputвPAGE_DETECT_SELECTORSстоит первым — но в моментdocument-idlerun-at ни один из 6 селекторов может ещё не быть в DOM. Скрипт уходил в retry каждые 1500ms и пользователь не понимал, запустился ли он вообще. - Нет отладочного логирования. Все точки отказа (
isOpencodePage() === false,findComposer() === null, успешный inject) были тихими — в DevTools Console ничего не появлялось, диагностика «скрипт не работает» превращалась в гадание.
Issue: #28 (родительский). PR #30 — продолжение без новой issue.
Что сделано
Три коммита на ветке fix/ui/v1-18-runtime-gate-debug:
d5f80e7fix(ui): broaden page detection gate for v1.18.x —src/insert.ts: добавлен массивPAGE_DETECT_SELECTORSиз 6 селекторов,isOpencodePage()теперь возвращаетtrueпри совпадении любого (через.some()). Расширение с 1 селектора (prompt-input) до 6 (prompt-input,prompt-input-v2,session-prompt-dock,session-composer,session-new-composer,question-custom-input).6982bfbfeat(ui): add debug logging for init and composer detection —src/index.ts(2 строки вinit()) +src/ui.ts(3 строки вfindComposer()/injectIntoComposer()):console.logс унифицированным префиксом[ocvd]в каждой ключевой точке lifecycle.af3edc7chore: bump version to 1.0.1 —package.jsonиvite.config.ts:1.0.0→1.0.1в обоих файлах (синхронно).
Почему
@versionне бампнута в PR #29. Userscript-менеджеры не подтягивают изменения, если@versionв.meta.jsне выросла. PR #29 менял код селекторов, но не трогал версию — пользователи получали «обновление недоступно», хотя код был исправлен. PR #30 бампает версию в обоих source-of-truth (package.jsonдля npm,vite.config.tsuserscript.version для vite-plugin-monkey).- Gate проверял только
prompt-input. На v1.18.xprompt-inputмонтируется lazy внутриsession-prompt-dockпосле hydration сессии. В моментdocument-idlerun-at элемента ещё нет,isOpencodePage()возвращаетfalse,init()уходит вsetTimeout(init, 1500)и крутится до тех пор, пока композер не появится. С 6 селекторамиsome()ловит любой ранний маркер страницы OpenCode (session-prompt-dockмонтируется раньшеprompt-input). - Нет логирования для диагностики. Без
console.logпользователь не мог отличить «скрипт не загрузился» от «скрипт загрузился, но gate не прошёл» от «скрипт загрузился, gate прошёл, но композер не найден». Префикс[ocvd]даёт единый grep-маркер в DevTools Console.
Pending
- После merge проверить live на opencode.slaid098.dev v1.18.3: открыть DevTools Console, обновить страницу с установленным userscript 1.0.1 — должны появиться
[ocvd] OpenCode page detected, setting up UI→[ocvd] Composer found via [data-component="prompt-input-v2"]→[ocvd] Mic button injected into composer. Если вместоdetectedкрутитсяnot detected, retrying in 1.5s...— gate недостаточен, расширятьPAGE_DETECT_SELECTORSдальше. - Подтвердить, что userscript-менеджеры подтянули автообновление: сравнить
@versionвabout:для установленного скрипта с1.0.1. Если менеджер не видит обновление — проверить, чтоupdateURLвvite.config.tsуказывает на свежий.meta.jsв веткеdist/(илиmainпосле merge). - После
oldInterfaceSunset(2026-09-14) legacy-селекторыsession-composer/session-new-composerвPAGE_DETECT_SELECTORSиCOMPOSER_SELECTORSстанут мёртвым кодом — удалить отдельным PR (общая задача с PR #29 pending). - Логирование
[ocvd]остаётся в production: если после стабилизации появится шум в Console пользователей — вынести под флагGM_getValue("debug")или убрать полностью.
Watch out
- vite-plugin-monkey берёт
@versionизvite.config.tsuserscript.version, НЕ изpackage.json.package.json.versionнужен только для npm/semver-инструментов. Рассинхрон = бамп одного файла → userscript-менеджеры не видят обновления, хотя npm видит. PR #30 бампает оба синхронно, но в будущем это ловушка — кандидат на single source of truth черезprocess.env.npm_package_version(см. ADR 0002, альтернатива 3). - Логирование
[ocvd]останется в production-билде.vite-plugin-monkeyне вырезаетconsole.logпо умолчанию. Все 5 точек (index.ts:177,181,ui.ts:254,258,306) попадут в.user.js. Не забывать убирать если будет шум, либо включатьterserdrop_console. - Порядок
PAGE_DETECT_SELECTORSне имеет семантического значения (в отличие отCOMPOSER_SELECTORS, где порядок = приоритет):some()возвращаетtrueпо первому совпадению, gate только решает «страница OpenCode или нет». Не путать сCOMPOSER_SELECTORSиз ADR 0001, где порядок критичен. src/insert.tsPROMPT_INPUT_SELECTOR(одиночный) не удалён — он используетсяinsertIntoContenteditable()для фактической вставки текста, не для gate. Не объединять сPAGE_DETECT_SELECTORS.- Retry
setTimeout(init, 1500)не имеет backoff/лимита — если страница никогда не станет OpenCode (false match на стороннем сайте), скрипт крутится бесконечно. На текущемmatch: ["*://*/*"]это потенциальная утечка таймера; вне scope PR #30, но отметить на будущее.
Изменения
src/insert.ts
- Добавлен массив
PAGE_DETECT_SELECTORS(6 селекторов):const PAGE_DETECT_SELECTORS = [ '[data-component="prompt-input"]', '[data-component="prompt-input-v2"]', '[data-component="session-prompt-dock"]', '[data-component="session-composer"]', '[data-component="session-new-composer"]', '[data-slot="question-custom-input"]', ]; isOpencodePage()изменён сdocument.querySelector(PROMPT_INPUT_SELECTOR) !== nullнаPAGE_DETECT_SELECTORS.some((s) => document.querySelector(s) !== null).PROMPT_INPUT_SELECTOR,SUBMIT_SELECTOR,QUESTION_INPUT_SELECTOR— без изменений (используютсяinsertIntoContenteditable/submitPrompt/isQuestionPromptOpen).
src/index.ts
init(): добавлены 2console.log—[ocvd] OpenCode page not detected, retrying in 1.5s...(ветка retry) и[ocvd] OpenCode page detected, setting up UI(ветка успеха).
src/ui.ts
findComposer(): добавленconsole.log(\[ocvd] Composer found via ${selector}`)при совпадении и[ocvd] No composer found in DOM` при провале.injectIntoComposer(): добавлен[ocvd] Mic button injected into composerпосле успешного inject.
package.json
"version": "1.0.0"→"version": "1.0.1".
vite.config.ts
userscript.version: "1.0.0"→"1.0.1".
Файлы вне спеки
src/audio.ts,src/transcribe.ts,src/config.ts,src/keyboard.ts,src/types.ts— без изменений.
Коммиты
d5f80e7fix(ui): broaden page detection gate for v1.18.x —src/insert.ts6982bfbfeat(ui): add debug logging for init and composer detection —src/index.ts,src/ui.tsaf3edc7chore: bump version to 1.0.1 —package.json,vite.config.tsdocs(handoff): add handoff + ADR for PR #30— этот коммит
ADR
См. docs/decisions/0002-pr-30-broaden-page-detection-gate.md.
Источники
- Предыдущий handoff:
docs/handoff/pr-29-v1-18-composer-selectors.md(родительский PR, селекторы v1.18.x) - Предыдущий ADR:
docs/decisions/0001-pr-29-v1-18-composer-selectors-fallback-order.md(порядокCOMPOSER_SELECTORS) - Память:
technical/opencode-web-ui-composer-selectors-1.18.4.md(исследованиеsst/opencodemain, lazy-mount композера) - Live-верификация: opencode.slaid098.dev v1.18.3 (DevTools, confirm селекторов v1.18.x)