Skip to content

Releases: froggychips/tweai

v1.9.0 — code-review series (security, i18n, architecture, tooling)

19 May 08:28

Choose a tag to compare

Полная серия правок по итогам кодревью (PR #4, #5, #6, #7, #8, #9, #10). Без новых пользовательских функций — все настройки и сохранённые ключи совместимы с v1.8.x.

Что нового

Security & CWS hygiene (PR-1 + PR-2)

  • Gemini API-ключ передаётся заголовком x-goog-api-key вместо ?key= в URL.
  • chrome.runtime.onMessage валидирует sender: разрешены только страницы расширения и фреймы *.x.com / *.twitter.com.
  • http://localhost/* и http://127.0.0.1/*optional_host_permissions. CWS-листинг чище, MCP-разрешение запрашивается runtime'ом.
  • execCommand('insertText') свёрнут в ttaInsertText() с цепью InputEvent → execCommand → direct.
  • Persona hint рендерится через DOM API, а не innerHTML.
  • dev-logger.js: убраны URL/localStorage флаги (оба контролируются страницей x.com).
  • boot() запускается только в top-frame.
  • Полная i18n инфраструктура: _locales/en/messages.json и _locales/ru/messages.json (~110 ключей), default_locale: "en", data-i18n атрибуты в options.html.

Architecture (PR-3 + PR-5 + PR-7)

  • Provider abstraction: callOpenAI/callGrok/callGemini свёрнуты в registry PROVIDERS + общий aiFetch() с AbortController-таймаутом 30с и retry на 429/5xx с экспоненциальным backoff (~400ms → 1.6s).
  • Bonus: Gemini теперь проходит через checkBudget() — раньше дневной токен-лимит к нему не применялся.
  • selectors.js: window.TTASelectors с multi-strategy DOM lookups (testid → семантика → структура) и ring-buffer health-счётчиком в chrome.storage.local.tta_selector_health.
  • SW keep-alive: chrome.alarms каждые 25с пока есть активные AI-запросы — service worker не выселяется в середине долгого fetch'а.
  • MCP cache: 5-минутный in-memory TTL для ответов gateway'я.

Tooling & docs (PR-6 + PR-8)

  • package.json + eslint.config.js (flat config) + .prettierrc.json + tools/build.mjs.
  • GitHub Actions: checks.yml (lint + format + build на каждый PR), release.yml (на push тега v* создаёт release с zip).
  • Документация: CHANGELOG.md, CONTRIBUTING.md, docs/ARCHITECTURE.md, docs/TROUBLESHOOTING.md, docs/CWS_REVIEW.md — внутренний чеклист CWS submission с permission justifications.

Установка

  1. Скачать tweai-v1.9.0.zip, распаковать.
  2. chrome://extensions → Developer mode → Load unpacked → выбрать папку.
  3. Из v1.8.x — переустановить из распакованной папки (или Update в Developer mode).

Совместимость

  • chrome.storage.sync совместима с v1.8.x — пересохранения ключей не требуется.
  • Новый permission alarms запросится при обновлении.
  • При первом включении MCP gateway Chrome спросит permission на localhost (теперь optional).

Что не в этом релизе

  • Split options.{html,js} на ESM-модули — отменено осознанно: без юнит-тестов и реальной пользы для CWS-submission это рефакторинг ради рефакторинга.
  • Screenshot 1280×800 для CWS listing — требует живого расширения на x.com, генерировать при подаче.

🤖 Generated with Claude Code

v1.8.1 — security & CWS hygiene patch

19 May 07:53
51eb6cf

Choose a tag to compare

Patch-release с правками безопасности и подготовкой к Chrome Web Store submission. Без новых функций — все существующие настройки и сохранённые ключи продолжают работать.

Что починили

  • Gemini API key больше не утекает в URL. Раньше передавался как ?key=…, теперь — через заголовок x-goog-api-key. URL мог попадать в performance-логи браузера и логи промежуточных прокси.
  • Жёстче валидация sender'а в chrome.runtime.onMessage. Команды TTA_* принимаются только от собственных страниц расширения и фреймов x.com / twitter.com. До этого формально любой iframe в all_frames=true мог их вызвать и тратить чужой токен-бюджет.
  • http://localhost/* и http://127.0.0.1/* стали optional_host_permissions. Дефолтный CWS-листинг не показывает их, разрешение запрашивается runtime'ом только если включить локальный MCP-сервер в настройках.
  • document.execCommand('insertText') свёрнут в один helper. Цепь: InputEvent → execCommand → прямое присваивание. Меньше дубля, готовность к будущему отключению execCommand в Chrome.
  • Persona hint в настройках рендерится без innerHTML. Через replaceChildren + textContent.
  • dev-logger.js: убраны ?tta_debug=1 и localStorage 'tta_debug' триггеры. Оба контролировались страницей x.com и могли быть взведены вредоносной ссылкой. Остался только canonical toggle через chrome.storage.
  • boot() в content-скрипте запускается только в top-frame. all_frames: true по-прежнему стоит в манифесте, но MutationObserver и подписки больше не дублируются в nested iframes.

Установка

  1. Скачать tweai-v1.8.1.zip, распаковать.
  2. chrome://extensions → Developer mode → Load unpacked → выбрать папку.
  3. Если ранее стоял v1.8 — переустановить из распакованной папки (или Update в Developer mode).

Совместимость

  • Все настройки (chrome.storage.sync) совместимы с v1.8 — пересохранения ключей не требуется.
  • Если вы использовали ?tta_debug=1 для включения dev-логгера, теперь включайте его через настройки расширения.
  • Если использовали http://localhost/… MCP-сервер — после обновления Chrome спросит подтверждение на разрешение хоста.

Следующие шаги

Это первый из серии security/architecture PR'ов. По плану дальше: i18n + _locales/, абстракция провайдеров, расщепление options.{html,js} на модули, fallback-стратегии для DOM-селекторов, build-pipeline (esbuild/eslint), release workflow и расширенная документация.

🤖 Generated with Claude Code

v1.8 — open-source launch

17 May 12:14

Choose a tag to compare

First public release of TweAI — AI reply assistant for X (Twitter).
Open-source Chrome extension, BYOK, no subscription, no middleman.

Highlights

  • Redesigned in-tweet UI — single accent (froggy-green), glass card with
    brand chip, grouped reply controls, custom selects and checkboxes
  • Redrawn extension icon — frog eyes on a dark rounded square (16/48/128)
  • 8 personas — five built-in tech-creator personas plus your own custom
    ones; per-account default persona based on the active X handle
  • Smart thread context — optionally include the author's last 5 tweets so
    the reply matches their thread
  • Tweet translator — auto-detect with 12 target languages, lazy via
    IntersectionObserver, cached locally so the same tweet isn't re-translated
  • DM composer — same prompt + Tweet flow for direct messages
  • Token budget — daily soft-limit on input/output tokens; blocks calls
    when exceeded
  • Diagnostics — one-click health check (key, provider connectivity, X DOM
    selectors)
  • Companion tweai-mcp-server for Claude Code integration

Providers

OpenAI · Grok (xAI) · Google Gemini · Google Translate

Install

Until the Chrome Web Store listing is live, install unpacked:

git clone https://github.com/froggychips/tweai.git
# In Chrome: chrome://extensions → enable Developer mode → Load unpacked

See README for full setup,
SECURITY.md
for the threat model, and PRIVACY.md
for what the extension does and doesn't see.

Your keys, your model, your replies.