Skip to content

Repository files navigation

ChatGPT Prompt Queue

Пользовательский скрипт для Tampermonkey, который добавляет в ChatGPT локальную очередь запросов и последовательно отправляет их после завершения предыдущего ответа.

Important

Проект не связан с OpenAI и использует DOM-интерфейс сайта chatgpt.com. Изменения интерфейса ChatGPT могут потребовать обновления адаптера.

Возможности

  • добавление нескольких запросов в очередь;
  • inline-редактирование запросов до отправки;
  • drag-and-drop, кнопки перестановки и удаление отдельных запросов;
  • визуальные статусы и явный повтор элементов с ошибкой;
  • приостановка и продолжение обработки;
  • повторная попытка отправки при временной ошибке;
  • безопасное ожидание после Stop и повторной генерации ответа;
  • защита от одновременной обработки очереди несколькими вкладками;
  • сохранение очереди, состояния паузы и положения панели в localStorage;
  • работа без серверной части и runtime-зависимостей.

Требования

  • Node.js 18 или новее;
  • npm 9 или новее;
  • браузер на базе Chromium;
  • расширение Tampermonkey.

Установка

Готовый userscript

  1. Скачайте dist/chatgpt-queue.user.js из репозитория.
  2. Откройте панель Tampermonkey и создайте новый userscript.
  3. Замените содержимое редактора содержимым скачанного файла.
  4. Сохраните скрипт.
  5. Откройте или обновите chatgpt.com.

Сборка из исходников

git clone <URL-РЕПОЗИТОРИЯ>
cd chatgpt-prompt-queue-userscript
npm ci
npm run build

После сборки установите dist/chatgpt-queue.user.js через Tampermonkey, как описано выше. Собранный файл автономен: пакеты npm в браузере не требуются.

Использование

  1. Откройте диалог на chatgpt.com.
  2. Введите запрос в плавающей панели очереди.
  3. Добавьте запрос в очередь.
  4. Скрипт дождётся доступности основного поля ввода и отправит запрос.
  5. Следующий запрос будет отправлен после завершения текущего ответа.

В поле очереди обычный Enter добавляет сообщение. Ctrl+Enter и Shift+Enter оставляют перенос строки для многострочного текста. Панель запоминает свёрнутое состояние между обновлениями страницы.

Кнопки панели позволяют приостановить очередь, продолжить обработку, изменить порядок запросов и удалить отдельные элементы.

Разработка

Установите зависимости строго по lock-файлу:

npm ci

Запустите автоматическую пересборку:

npm run dev

После каждого изменения обновляйте userscript в Tampermonkey и проверяйте его на chatgpt.com. Для разовой сборки и базовой проверки JavaScript:

npm run validate

Для браузерной regression-проверки очередей разных чатов запустите из корня проекта python -m http.server 8765 и откройте http://127.0.0.1:8765/test/e2e/per-chat-queues.html. Страница автоматически проверяет общую очередь двух вкладок одного чата, изоляцию разных chat id и миграцию временной очереди после создания чата.

http://127.0.0.1:8765/test/e2e/panel-actions.html проверяет клавиатурное добавление, многострочный ввод, подтверждение очистки, доступные имена кнопок и восстановление свёрнутости панели.

Доступные команды:

Команда Назначение
npm run build Создать production-bundle в dist/
npm run dev Следить за src/ и пересобирать bundle
npm run clean Удалить сгенерированный каталог dist/
npm run rebuild Очистить проект и собрать заново
npm run check Проверить синтаксис исходников и build-скрипта
npm test Однократно запустить модульные тесты
npm run test:watch Перезапускать тесты при изменениях
npm run validate Выполнить проверку, тесты и production-сборку

Сборка

Точка входа — src/main.js. Сборщик esbuild объединяет ES-модули в один IIFE-файл, совместимый с Tampermonkey, и добавляет userscript metadata block.

npm run build

Результат:

dist/
└── chatgpt-queue.user.js

Каталог dist/ содержит производный артефакт. В этом репозитории собранный userscript хранится в Git, чтобы его можно было установить без локальной сборки. Перед коммитом изменений исходного кода выполните npm run validate и убедитесь, что обновлённый bundle также включён в коммит.

Архитектура проекта

Проект разделён на небольшие модули с явными зонами ответственности:

  • main.js — composition root, создающий и связывающий компоненты;
  • chat-scope.js — единое преобразование маршрута ChatGPT в chat scope;
  • queue-store.js — хранение, миграция и изменение очереди текущего чата;
  • queue-processor.js — конечный автомат обработки, ожидание и повторы;
  • chatgpt-adapter.js — единственная граница взаимодействия с DOM ChatGPT;
  • panel-ui.js — создание панели и обработчики действий пользователя;
  • styles.js — стили панели;
  • utils.js — общие утилиты без состояния;
  • tab-lock.js — scoped по chat id межвкладочный lease с TTL и автоматическим освобождением после закрытия или зависания вкладки.
flowchart TD
    Build["build.mjs / esbuild"] --> Bundle["dist/chatgpt-queue.user.js"]
    Main["src/main.js"] --> Store["queue-store.js"]
    Main --> Processor["queue-processor.js"]
    Main --> Adapter["chatgpt-adapter.js"]
    Main --> TabLock["tab-lock.js"]
    Main --> UI["panel-ui.js"]
    Main --> Styles["styles.js"]
    Processor --> Store
    Processor --> Adapter
    Processor --> Utils["utils.js"]
    Adapter --> Utils
    UI --> Store
    UI --> Processor
    Store --> LocalStorage["localStorage"]
    UI --> LocalStorage
    Adapter --> ChatGPT["DOM chatgpt.com"]
    TabLock --> LocalStorage
    Build -. bundles .-> Main
Loading

Процессор не обращается к DOM напрямую: он управляет очередью через store, а операции с ChatGPT делегирует adapter. Это локализует наиболее хрупкую часть проекта — DOM-селекторы сайта.

Структура репозитория

.
├── src/                  # Исходные ES-модули
├── test/                 # Модульные тесты Vitest
├── dist/                 # Готовый userscript
├── build.mjs             # Конфигурация esbuild и metadata block
├── package.json          # Метаданные и npm-команды
├── package-lock.json     # Зафиксированное дерево зависимостей
├── .editorconfig         # Общие настройки редакторов
├── .gitattributes        # Единые окончания строк и binary-маркеры
├── .gitignore            # Исключения Git
├── LICENSE               # Лицензия MIT
└── README.md

Участие в разработке

Issues и pull requests приветствуются. Перед отправкой изменений:

  1. создайте отдельную ветку;
  2. не смешивайте изменение поведения с инфраструктурным рефакторингом;
  3. выполните npm ci и npm run validate;
  4. вручную проверьте установку собранного userscript в Tampermonkey;
  5. опишите сценарий проверки в pull request.

При изменениях DOM-адаптера укажите, на какой версии интерфейса ChatGPT и в каком браузере выполнена проверка.

Ограничения

  • Работа зависит от текущей DOM-структуры ChatGPT.
  • Данные сохраняются локально в профиле браузера.
  • Межвкладочная блокировка пока не реализована: не запускайте одну очередь одновременно в нескольких вкладках.
  • Автоматические тесты браузерной интеграции пока отсутствуют; модульная логика проверяется с помощью Vitest.

Безопасность и приватность

Скрипт выполняется локально в браузере, не имеет собственной серверной части и не отправляет содержимое очереди сторонним сервисам. Запросы передаются только через интерфейс ChatGPT. Перед установкой userscript рекомендуется проверить его исходный код и собранный файл.

Лицензия

Проект распространяется по лицензии MIT.

About

Tampermonkey userscript for reliably sending queued prompts to ChatGPT one at a time.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages