[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81123":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":12,"openIssues":12,"contributorsCount":13,"subscribersCount":13,"size":13,"stars1d":12,"stars7d":14,"stars30d":15,"stars90d":13,"forks30d":13,"starsTrendScore":16,"compositeScore":17,"rankGlobal":8,"rankLanguage":8,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":8,"pushedAt":8,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":13,"starSnapshotCount":13,"syncStatus":26,"lastSyncTime":27,"discoverSource":28},81123,"ai-free","Staks-sor\u002Fai-free","Staks-sor",null,"JavaScript",74,8,1,0,15,39,7,53.26,"Other",false,"main",true,[],"2026-06-12 04:01:32","# AI Free\n\n> CLI и десктопное окно для бесплатных AI-веб-чатов в одном интерфейсе. Сейчас: **DeepSeek + Qwen**. На очереди: Kimi, Mistral, Claude.ai. Кросс-платформенно — macOS, Linux, Windows.\n\n---\n\n## ⭐ Понравилось? Поставь звезду\n\nЕсли проект сэкономил тебе время — **поставь звезду на [GitHub](https:\u002F\u002Fgithub.com\u002FStaks-sor\u002Fai-free)**. Это бесплатно, занимает секунду, но реально помогает: больше звёзд → выше в выдаче → больше людей найдёт.\n\n## 💳 Поддержать развитие\n\nЕсли хочется отблагодарить материально — любая сумма даёт сигнал, что проект имеет смысл, и мотивацию добавлять новые фичи (мультипровайдер Qwen\u002FKimi, attachments, стриминг ответов и т.д.).\n\n- **Карта (ОТП Банк):** `2201 9604 2500 7505`\n\nСпасибо!\n\n---\n\nАрхитектурно проект разделён на модули в `src\u002F` (auth, browser, deepseek, providers\u002Fqwen, code-agent, state, window-app, api, cli). Точка входа — `bin\u002Fdeepseek.mjs`. Юнит-тесты: `npm test` (97 кейсов, встроенный Node test runner). Подробности — [REFACTOR_NOTES.md](REFACTOR_NOTES.md).\n\n## Что внутри\n\n- **Два провайдера:** DeepSeek (`chat.deepseek.com`) и Qwen (`chat.qwen.ai`) — в одном окне чатов, переключение при создании беседы.\n- **Авто-логин DeepSeek:** один раз заходишь через браузер (Google OAuth \u002F email-пароль \u002F captcha). Дальше сессия подхватывается из Chromium-профиля; при протухании — тихий refresh или окно re-login.\n- **Авто-логин Qwen:** отдельный профиль и `auth.json`; тихий refresh из профиля, re-login из UI («нажми — подключить») или `npm run login-qwen`.\n- **Окно чатов** (`localhost:4317`): несколько параллельных бесед, каждая привязана к своей папке-проекту.\n- **CLI-режим:** REPL в терминале для скриптовых сценариев и быстрых вопросов.\n- **`\u002Fcode` агент:** доступ к файлам workspace и whitelist-командам (DeepSeek и Qwen).\n- **OpenAI-совместимый API** (`localhost:4318`): для Kilo Code, Continue и других IDE.\n- **Файловый браузер:** при создании чата можно открыть проводник, выбрать папку или создать новую.\n\n---\n\n## Требования\n\nВезде нужно:\n\n- **Node.js ≥ 18** ([nodejs.org](https:\u002F\u002Fnodejs.org)). Проверить: `node -v`.\n- **npm** (идёт в комплекте с Node).\n- Подключение к интернету и установки Chromium (~150 МБ).\n\nОпционально:\n\n- **Google Chrome.** Если установлен — программа использует его как «настоящий» браузер (свежий, со всеми обновлениями безопасности). Если нет — автоматически качается Playwright`овский Chromium.\n\n---\n\n## Установка (один раз)\n\n### macOS \u002F Linux\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FStaks-sor\u002Fai-free.git ai-free\ncd ai-free\nnpm install\n```\n\n`npm install` сам качает Chromium (~150 МБ) через `postinstall`-хук — отдельная команда не нужна.\n\nЕсли ты на **Linux**, добавь зависимости системы для Chromium (один раз):\n\n```bash\nsudo npx playwright install-deps chromium\n```\n\nЭто поставит `libnss3`, `libgbm`, `libasound2` и пр. — без них Chromium не запустится.\n\n### Windows\n\n```powershell\ngit clone https:\u002F\u002Fgithub.com\u002FStaks-sor\u002Fai-free.git ai-free\ncd ai-free\nnpm install\n```\n\nВ PowerShell или Windows Terminal — обе оболочки работают. CMD тоже, но Windows Terminal удобнее для интерактивного ввода (например, при `npm run save-creds`).\n\n---\n\n## Первый запуск\n\n```bash\nnpm start\n```\n\nЧто произойдёт:\n\n1. Если **ни один провайдер** ещё не подключён — консольный welcome-экран: выбери `1` (DeepSeek), `2` (Qwen) или `1,2` (оба).\n2. Для каждого выбранного провайдера откроется окно логина в Chrome\u002FChromium — зайди **один раз** (Google OAuth, email\u002Fпароль, captcha).\n3. **DeepSeek:** окно закроется само после первого успешного API-запроса; сессия → `~\u002F.deepseek-cli\u002F`.\n4. **Qwen:** окно закроется, когда в cookies появится JWT (`token`); сессия → `~\u002F.qwen-cli\u002F`.\n5. Откроется рабочее окно чатов (`localhost:4317`).\n\nПовторный запуск — `npm start` без welcome, если auth уже есть. Qwen можно добавить позже: **«+ New chat»** → Qwen → **«нажми — подключить»**.\n\n---\n\n## Где что хранится\n\nСлужебные файлы — вне проекта, в домашней папке пользователя.\n\n**DeepSeek** (`~\u002F.deepseek-cli\u002F` на Unix, `%USERPROFILE%\\.deepseek-cli\\` на Windows):\n\n```\n~\u002F.deepseek-cli\u002F\n├── auth.json              # cookies + userToken (mode 0600 на Unix)\n├── browser-profile\u002F       # Chromium-профиль с сессией DeepSeek\n├── state.json             # все чаты (глобально)\n├── state.backup.json\n├── settings.json          # allow-list команд для \u002Fcode\n└── credentials.json       # email + пароль (опционально, только DeepSeek)\n```\n\n**Qwen** (отдельно, не смешивается с DeepSeek):\n\n```\n~\u002F.qwen-cli\u002F\n├── auth.json              # cookies + JWT token\n└── browser-profile\u002F       # Chromium-профиль для chat.qwen.ai и browser-proxy\n```\n\nЧаты и настройки `\u002Fcode` — только в `~\u002F.deepseek-cli\u002Fstate.json` (общие для всех провайдеров).\n\n---\n\n## Команды npm\n\n| Команда | Что делает |\n|---------|------------|\n| `npm start` | Окно чатов (`localhost:4317`). Welcome + логин, если провайдер не подключён. |\n| `npm run window` | Алиас `npm start`. |\n| `npm run server` | Тот же сервер чатов и `\u002Fv1`, но без открытия окна; события идут в консоль. |\n| `npm run cli` | Терминальный REPL (`\u002Fcode`, `\u002Fls`, `\u002Fnew`, …). |\n| `npm run api` | OpenAI-совместимый API на `127.0.0.1:4318`. |\n| `npm run welcome` | Снова показать выбор провайдеров и подключить новые. |\n| `npm run check` | Проверка auth DeepSeek (`OK: authenticated`). |\n| `npm run login` | Re-login DeepSeek → `~\u002F.deepseek-cli\u002Fauth.json`. |\n| `npm run login-qwen` | Re-login Qwen → `~\u002F.qwen-cli\u002Fauth.json`. |\n| `npm run import-qwen` | Импорт cookies из JSON (Chrome \u002F Cookie Editor), без Playwright. |\n| `npm run save-creds` | Email + пароль для авто-заполнения формы DeepSeek. |\n| `npm test` | Юнит-тесты (97 кейсов). |\n\nЗапуск OpenAI-совместимого API (отдельный процесс):\n\n```bash\nnpm run api\n# → http:\u002F\u002F127.0.0.1:4318\u002Fv1\n```\n\nЕсли уже открыто окно чатов (`npm start`), тот же API доступен прямо на порту окна:\n`http:\u002F\u002F127.0.0.1:4317\u002Fv1`. Base URL и ключи есть в Settings. Для DeepSeek и\nQwen создаются отдельные ключи формата `sk-...`; каждый ключ переиспользуется из\n`~\u002F.deepseek-cli\u002Fsettings.json` и не дублируется.\n\nЕсли окно не нужно, запусти:\n\n```bash\nnpm run server\n```\n\nЭто поднимает тот же сервер на `http:\u002F\u002F127.0.0.1:4317` и тот же API на\n`http:\u002F\u002F127.0.0.1:4317\u002Fv1`, но Chromium-окно не открывается. Основные события\nчатов, API-запросов и `\u002Fcode`-задач печатаются в консоль.\n\n---\n\n## Подключение Qwen\n\nQwen использует **отдельный** Chromium-профиль и API через встроенный browser-proxy (подпись `bx-ua` на стороне chat.qwen.ai). Без логина Qwen в чатах не появится.\n\n### Способ 1 — из окна чатов (рекомендуется)\n\n1. `npm start`\n2. **«+ New chat»** → провайдер **Qwen**\n3. Если подпись «нажми — подключить» — клик по карточке Qwen\n4. Подтверди диалог → откроется `chat.qwen.ai` → залогинься → окно закроется само\n\n### Способ 2 — из терминала\n\n```bash\nnpm run login-qwen\n```\n\n### Способ 3 — импорт cookies (если Playwright блокирует антибот)\n\n1. Залогинься в **обычном Chrome** на [chat.qwen.ai](https:\u002F\u002Fchat.qwen.ai)\n2. Экспортируй cookies расширением (Cookie Editor, EditThisCookie) в JSON\n3. Импорт:\n\n```bash\nnpm run import-qwen -- \u002Fpath\u002Fto\u002Fcookies.json\n```\n\nКуки попадут и в `auth.json`, и в `browser-profile` — API и окно чатов увидят одну сессию.\n\n### Авто-обновление сессии\n\nКак у DeepSeek: при протухшей сессии программа сначала пробует **тихий refresh** из `~\u002F.qwen-cli\u002Fbrowser-profile` (без окна). Если не вышло — открывает окно логина. В окне чатов и в API (`node api\u002Fserver.mjs`) это встроено.\n\nПеред Qwen-чатом нужен хотя бы один успешный `login-qwen` или импорт — иначе нечего обновлять.\n\n---\n\n## Авто-логин email\u002Fпароль (только DeepSeek, опционально)\n\nЕсли у тебя обычный email-вход (не Google OAuth) и хочется полный автомат:\n\n```bash\nnpm run save-creds\n```\n\nСпросит email и пароль (ввод пароля скрытый). Сохранит в `~\u002F.deepseek-cli\u002Fcredentials.json` plaintext с правами 0600 на Unix \u002F ACL юзера на Windows.\n\nВ будущем, когда сессия истечёт и понадобится re-login, программа сама заполнит форму и кликнет Sign in. Тебе остаётся только пройти captcha, если попросят.\n\n**Если входишь через Google OAuth** — эта команда не нужна. Google-форма не наша, autofill там не сработает, но Google-сессия и так сохранится в Chromium-профиле и при следующем re-login потребует от тебя только клик на «Sign in».\n\n---\n\n## Настройка разрешённых команд\n\nВ окне чата справа сверху — кнопка ⚙. Открывается панель с тремя группами команд по уровню риска:\n\n- **🟢 Low:** `node`, `npm`, `python`, `ls`, `cat`, `mkdir`, `cp`, `grep`, и т.п. — безопасны.\n- **🟡 Medium:** `git`, `mv`, `sed`, `chmod`, `make`, `find` — могут менять данные, но с защитами (например, `git clone` и `push --force` заблокированы).\n- **🔴 High:** `rm` — со строгой блокировкой `-rf`.\n\nЧекбокс = включено для `\u002Fcode`. Сохраняется мгновенно. По умолчанию включены первые 7 команд (старый whitelist).\n\n---\n\n## Привязка чатов к папкам\n\nВ UI окна:\n\n1. Кнопка **«+ New chat»** → модалка.\n2. Поле «Папка проекта» — путь к workspace. Под полем: чипы недавних проектов.\n3. Кнопка **`📁 Обзор`** — открывает файловый браузер. Можно ходить по дереву, создавать новые папки прямо там через **`➕ Новая папка`**.\n4. Чекбокс «Создать папку, если её ещё нет» — если включён, программа создаст путь из инпута (только под `$HOME`).\n5. **Создать чат** → чат привязан к этой папке. Любой `\u002Fcode` в этом чате работает с файлами в его папке, не пересекаясь с другими.\n\nВ сайдбаре под именем чата видно `📁 имя-папки` — это его workspace.\n\n---\n\n## Закрытие\n\n`Ctrl+C` в терминале → сервер останавливается → окно чатов через ~4–6 секунд само закрывается (heartbeat polling в фронте определяет, что сервер мёртв).\n\nЗакрытие терминала через ⌘W \u002F правый-клик-Close — то же самое (терминал шлёт SIGHUP).\n\nЕсли что-то зависло, можно убить процесс по PID. На Windows — Task Manager → Node.js.\n\n---\n\n## Платформенные нюансы\n\n### macOS\n\n- Открывает окно чатов в **`--app=` режиме Chrome** (без табов, без URL-бара, выглядит как desktop-приложение).\n- При первом запуске Chrome macOS может спросить «Chrome wants to access Documents folder» — разреши.\n- SIGINT\u002FSIGHUP работают штатно. Окно закрывается само через ~5с после `Ctrl+C`.\n\n### Linux\n\n- Окно чатов открывается в **`--app=` режиме**: программа ищет `google-chrome`, `chromium`, `chromium-browser` или `microsoft-edge` в `PATH` и запускает с флагом `--app=URL`. Получаешь отдельное окно-приложение, как на macOS.\n- Если ни один из этих браузеров не установлен — fallback на `xdg-open`: обычная вкладка в дефолтном браузере.\n- Если у тебя Wayland (а не X11), Chromium из Playwright обычно работает, но если возникнут странности — попробуй `XDG_SESSION_TYPE=x11 npm start`.\n- Системные зависимости для Playwright Chromium ставятся командой `sudo npx playwright install-deps chromium`.\n\n### Windows\n\n- Окно чатов открывается в **`--app=` режиме**: программа ищет `chrome.exe` в стандартных местах (`Program Files\\Google\\Chrome\\Application\\`, `%LOCALAPPDATA%\\Google\\Chrome\\Application\\`), также пробует `msedge.exe` от Edge.\n- Если ничего не найдено — fallback на `cmd \u002Fc start` (открывает в дефолтном браузере как обычную вкладку).\n- Маскированный ввод пароля (`npm run save-creds`) работает в Windows Terminal и PowerShell. В классическом CMD тоже работает, но без UTF-8 в кириллице могут быть кракозябры в выводе.\n- Ctrl+C ловится штатно. SIGHUP на Windows не существует — но при закрытии окна терминала Node всё равно умирает, фронт это замечает по heartbeat и закрывается.\n- `fs.chmodSync(0o600)` — no-op (Windows использует ACL). По умолчанию папка `%USERPROFILE%\\.deepseek-cli\\` доступна только владельцу.\n\n---\n\n## Если что-то ломается\n\n**Правило №1:** `rm -rf ~\u002F.deepseek-cli && npm start` (или `Remove-Item -Recurse -Force $env:USERPROFILE\\.deepseek-cli` на Windows). Это ядерный сброс — снесёт сессию, токены, профиль, настройки. После сброса заново заходишь, всё работает с нуля.\n\n**`Error: Executable doesn't exist at ...chromium...`** → не запускал `npx playwright install chromium`. Запусти.\n\n**`Failed to create a ProcessSingleton`** → остался stale lock от падающего Chromium. Запусти ещё раз — программа сама чистит эти файлы при следующем launch.\n\n**Окно открылось, но `chat.deepseek.com` показывает ошибки** → попробуй обновить страницу. Если не помогло — ядерный сброс.\n\n**Сессия истекла, окно re-login не открывается** → `npm run login` (DeepSeek) или `npm run login-qwen` (Qwen).\n\n**Распознавание картинок (vision): `invalid ref file id` (biz_code 9)** → completion раньше, чем файл стал SUCCESS. В логах нужно `ready (status=SUCCESS)`, не `PARSING`.\n\n**`CONTENT_EMPTY` после upload** → DeepSeek **не смог разобрать** картинку (не «долго грузится»). Сразу ошибка с подсказкой. Что попробовать: JPG\u002FPNG (не SVG), до ~4 МБ, чёткий скриншот\u002Fфото с текстом. Большие PNG (~1.5 МБ) иногда дают CONTENT_EMPTY — сожми или пересохрани в JPEG.\n\n### Qwen\n\n| Симптом | Что делать |\n|---------|------------|\n| В «Новый чат» Qwen серый \u002F «не подключён» | Клик по Qwen → «подключить», или `npm run login-qwen` |\n| `Qwen не подключён` в чате | То же + проверь `~\u002F.qwen-cli\u002Fauth.json` |\n| Окно логина закрылось, JWT не появился | Антибот: `npm run import-qwen -- cookies.json` из Chrome |\n| Ответы пустые \u002F Bad_Request | Не ставь `QWEN_TRANSPORT=direct` в `.env` — нужен режим `browser` (по умолчанию) |\n| После `import-qwen` всё равно не работает | Обнови репо (`git pull`), перезапусти `npm start` — куки синхронизируются в профиль |\n| Сессия была, потом отвалилась | Обычно помогает тихий refresh; иначе `npm run login-qwen` |\n\nЯдерный сброс только Qwen (DeepSeek не трогает):\n\n```bash\nrm -rf ~\u002F.qwen-cli\nnpm run login-qwen\n```\n\n---\n\n## Интеграция с Kilo Code (OpenAI-совместимый API)\n\nЭтот проект можно использовать как провайдер для Kilo Code или других IDE с поддержкой OpenAI-совместимых API.\n\n### Запуск API сервера\n\n```bash\nnpm run api\n```\n\nСервер запустится на `http:\u002F\u002F127.0.0.1:4318`.\n\n### Настройка в Kilo Code\n\n1. Подключи провайдеров в CLI: `npm run login` и\u002Fили `npm run login-qwen`\n2. Запусти API: `npm run api` или открой окно чатов и возьми Base URL из Settings\n3. В Kilo Code — **OpenAI-совместимый провайдер**:\n   - **Base URL:** `http:\u002F\u002F127.0.0.1:4318\u002Fv1`\n   - **API Key:** DeepSeek или Qwen key из Settings\n   - **Модели:** см. `GET http:\u002F\u002F127.0.0.1:4318\u002Fv1\u002Fmodels`\n\n| Имя в Kilo Code | Провайдер |\n|-----------------|-----------|\n| `deepseek-v4-flash`, `deepseek-chat` | DeepSeek, обычный чат |\n| `deepseek-v4-pro`, `deepseek-reasoner` | DeepSeek reasoning \u002F Expert |\n| `qwen3.7-max` (дефолт), `qwen3.6-plus`, `qwen3-max`, … | Qwen |\n\n**Важно:** в настройках Kilo указывай именно эти id — не подставляй `deepseek-reasoner` вручную в другие поля. Сервер сам маппит `deepseek-reasoner` → `model_type: expert` у DeepSeek.\n\nПри ошибке `unknown variant 'deepseek-reasoner'` — обнови репозиторий (`git pull`) и перезапусти `node api\u002Fserver.mjs` (нужна актуальная `api\u002Fmodels.mjs`).\n\n---\n\n## Интеграция с PyCharm ACP\n\nPyCharm AI Assistant запускает ACP-агента как subprocess из `~\u002F.jetbrains\u002Facp.json`.\nДля этого в проекте есть режим:\n\n```bash\nnode .\u002Fbin\u002Fdeepseek.mjs --acp\n```\n\nACP-агент ходит в наш OpenAI-compatible API (`http:\u002F\u002F127.0.0.1:4317\u002Fv1` или `4318\u002Fv1`).\nПеред запуском в PyCharm должен быть поднят `npm start` или `npm run api`.\n\nПример `~\u002F.jetbrains\u002Facp.json`:\n\n```json\n{\n  \"default_mcp_settings\": {\n    \"use_idea_mcp\": true,\n    \"use_custom_mcp\": true\n  },\n  \"agent_servers\": {\n    \"HR Recruiter (Qwen)\": {\n      \"command\": \"\u002Fpath\u002Fto\u002Fnode\",\n      \"args\": [\"\u002Fpath\u002Fto\u002Fai-free\u002Fbin\u002Fdeepseek.mjs\", \"--acp\"],\n      \"env\": {\n        \"OPENAI_BASE_URL\": \"http:\u002F\u002F127.0.0.1:4317\u002Fv1\",\n        \"OPENAI_API_KEY\": \"QWEN_KEY_FROM_SETTINGS\",\n        \"OPENAI_MODEL\": \"qwen3.7-max\",\n        \"DSCLI_ACP_ROLE\": \"recruiter\"\n      }\n    }\n  }\n}\n```\n\nДоступные HR-роли: `recruiter`, `sourcer`, `interviewer`, `policy`.\n\n---\n\n## Безопасность (краткое резюме)\n\n- Токены и cookies — в `~\u002F.deepseek-cli\u002F` и `~\u002F.qwen-cli\u002F` (plaintext, `0o600` на Unix, ACL на Windows).\n- `credentials.json` — только DeepSeek, опционально. **Не используй тот же пароль, что для банка\u002Fпочты.**\n- `\u002Fcode` — команды без shell, в пределах workspace, whitelist. `curl`\u002F`wget`\u002F`bash` заблокированы по умолчанию.\n- Серверы чатов и API слушают только `127.0.0.1` (`4317`, `4318`).\n- Chromium-профили DeepSeek и Qwen **разделены** — сессии не смешиваются; открывает только Playwright по запросу программы.\n\n---\n\n## Обратная связь\n\nНашёл баг или есть идея? Открой [Issue](https:\u002F\u002Fgithub.com\u002FStaks-sor\u002Fai-free\u002Fissues) — отвечу.\n\n## Лицензия\n\nPersonal-Use-Only — см. [LICENSE](LICENSE). Кратко: использовать в личных целях можно, распространять и модифицировать для распространения — только с разрешения автора. При любом одобренном использовании имя автора должно сохраняться.\n","AI Free 是一个集成了多种免费AI聊天服务的跨平台应用，支持通过CLI和桌面窗口访问。其核心功能包括同时支持DeepSeek和Qwen两种AI聊天服务，并计划添加更多如Kimi、Mistral等；实现了自动登录机制，用户只需首次登录后即可保存会话信息实现无缝体验；提供了一个集成式的聊天窗口界面以及CLI模式，方便用户根据需要选择交互方式。此外，它还具备OpenAI兼容API接口，支持文件浏览器等功能，适用于开发者快速查询信息或进行基于AI的开发工作。此项目适合希望在一个统一界面下使用多个AI聊天工具的用户，尤其对频繁切换不同AI服务的开发者非常友好。",2,"2026-06-11 04:03:35","CREATED_QUERY"]