{"_id":"@botkinmoscow/opencode-emias","_rev":"2-9422d4df744636be0427f891b0888b30","name":"@botkinmoscow/opencode-emias","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@botkinmoscow/opencode-emias","version":"0.1.0","keywords":["opencode","opencode-plugin","emias","mosai"],"license":"UNLICENSED","_id":"@botkinmoscow/opencode-emias@0.1.0","maintainers":[{"name":"avytheone","email":"yakimanskiyav@yandex.ru"}],"homepage":"https://gitlab.com/botkinmoscow/opencode-emias#readme","bugs":{"url":"https://gitlab.com/botkinmoscow/opencode-emias/issues"},"dist":{"shasum":"f3a2770a8c21d1b7d70fa9821678104087fcbdfb","tarball":"https://registry.npmjs.org/@botkinmoscow/opencode-emias/-/opencode-emias-0.1.0.tgz","fileCount":6,"integrity":"sha512-m2HVHrqWFK0CgeFbzIsjfFf0BllI2TlxwspOvA+dF+EeVZvTpoqmMgctHO1MP7mX8q2zWdF83p0JHUBF8f0CTw==","signatures":[{"sig":"MEYCIQCxLyQxtnSebdXJQTd5uY2Tp131PrrNZ0wACmwiVXc4nAIhAIJrYQ1doNZ6zic2YdVLKUK+RRyqNK9HVbmRF1rUJXzc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24413},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":"./dist/index.js","gitHead":"44980965aaabeb66eb2aa38c6acd0c4c45135fd5","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"avytheone","email":"yakimanskiyav@yandex.ru"},"repository":{"url":"git+https://gitlab.com/botkinmoscow/opencode-emias.git","type":"git"},"_npmVersion":"11.12.1","description":"OpenCode plugin for direct access to EMIAS MosAI with automatic authentication","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0","@opencode-ai/plugin":"^1.18.4"},"_npmOperationalInternal":{"tmp":"tmp/opencode-emias_0.1.0_1784616498890_0.8817172169036467","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@botkinmoscow/opencode-emias","version":"0.1.1","description":"OpenCode plugin for direct access to EMIAS MosAI with automatic authentication","type":"module","exports":"./dist/index.js","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","prepack":"npm run build"},"repository":{"type":"git","url":"git+https://gitlab.com/botkinmoscow/opencode-emias.git"},"keywords":["opencode","opencode-plugin","emias","mosai"],"license":"UNLICENSED","engines":{"node":">=20"},"devDependencies":{"@opencode-ai/plugin":"^1.18.4","@types/node":"^24.0.0","typescript":"^5.9.0"},"gitHead":"32ca7ed077d2303f7d3c3d9efda0b9acf76a2700","_id":"@botkinmoscow/opencode-emias@0.1.1","bugs":{"url":"https://gitlab.com/botkinmoscow/opencode-emias/issues"},"homepage":"https://gitlab.com/botkinmoscow/opencode-emias#readme","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-8S10i08WRgowmQzqL/QsXiwGfFYEYvrgBl4nLDaC+hpik7im1qyUPTQRS1o42pFvjl1Kk8Nu9kxw/azJ/rsyPA==","shasum":"c9fb57939f296c53d2e5a93d9fe51f5c9ca45faa","tarball":"https://registry.npmjs.org/@botkinmoscow/opencode-emias/-/opencode-emias-0.1.1.tgz","fileCount":6,"unpackedSize":27855,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIENRjPBl96WfOuW5OlwAXPhBEnJSv4IgdoHThuVbta37AiEA9LNrdf4P/6TCOTptgLVFMCkZBFp62RThM+3/r/WVn4M="}]},"_npmUser":{"name":"avytheone","email":"yakimanskiyav@yandex.ru"},"directories":{},"maintainers":[{"name":"avytheone","email":"yakimanskiyav@yandex.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/opencode-emias_0.1.1_1784617609454_0.05561445475943039"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-21T06:48:18.792Z","modified":"2026-07-21T07:06:49.763Z","0.1.0":"2026-07-21T06:48:19.025Z","0.1.1":"2026-07-21T07:06:49.583Z"},"bugs":{"url":"https://gitlab.com/botkinmoscow/opencode-emias/issues"},"license":"UNLICENSED","homepage":"https://gitlab.com/botkinmoscow/opencode-emias#readme","keywords":["opencode","opencode-plugin","emias","mosai"],"repository":{"type":"git","url":"git+https://gitlab.com/botkinmoscow/opencode-emias.git"},"description":"OpenCode plugin for direct access to EMIAS MosAI with automatic authentication","maintainers":[{"name":"avytheone","email":"yakimanskiyav@yandex.ru"}],"readme":"# OpenCode EMIAS\n\nПлагин подключает OpenCode напрямую к `https://mosai-chat.emias.ru` без прокси,\nwrapper-скриптов и переменных окружения. Он регистрирует модели MosAI, безопасно\nхранит credentials в системном keyring и автоматически обновляет JWT.\n\n## Требования\n\n- Linux с настроенным системным keyring;\n- `secret-tool` из пакета `libsecret-tools`;\n- актуальная версия OpenCode с командой `opencode plugin`.\n\n## Установка\n\nВыполни в каталоге проекта, где нужен MosAI:\n\n```bash\nopencode plugin @botkinmoscow/opencode-emias\nopencode auth login -p emias\nopencode\n```\n\nПервая команда добавляет npm-плагин в проектный `opencode.json`. OpenCode сам\nскачивает пакет и его зависимости. Вторая команда один раз спрашивает почту и\nскрыто запрашивает пароль MosAI.\n\nЧтобы подключить MosAI сразу для всех проектов текущего пользователя:\n\n```bash\nopencode plugin -g @botkinmoscow/opencode-emias\nopencode auth login -p emias\n```\n\nCredentials и JWT сохраняются через libsecret, а в `auth.json` OpenCode попадает\nтолько служебное значение без секретов. После смены пароля повтори `opencode auth\nlogin -p emias`.\n\n## Что происходит автоматически\n\nПлагин:\n\n1. регистрирует провайдера `emias` и доступные модели MosAI;\n2. выбирает `ai2-gpt120b-oss` и reasoning effort `medium` по умолчанию, если проект\n   ещё не задал свои значения;\n3. получает JWT через `/api/v1/auths/signin`;\n4. обновляет JWT заранее, когда до истечения осталось меньше 24 часов;\n5. при ответе `401` обновляет JWT и один раз повторяет исходный запрос;\n6. распознаёт временные ошибки LiteLLM внутри уже открытого SSE-потока и повторяет\n   запрос до двух раз;\n7. добавляет `Authorization: Bearer ...` только к запросам на MosAI;\n8. исправляет некорректный SSE-фрейминг MosAI.\n\nДля надёжного retry SSE-ответ буферизуется целиком. Поэтому текст появляется после\nзавершения генерации, а не постепенно по токенам. Это предотвращает обрыв агентской\nсессии после `MidStreamFallbackError` без дублирования уже показанного ответа.\n\n## Модели\n\nВ TUI используй `/models` либо укажи модель при запуске:\n\n| Модель | Контекст | Назначение |\n|---|---:|---|\n| `emias/ai2-gpt120b-oss` | 32K | основная универсальная модель |\n| `emias/ai4-gemma3` | 131K | длинный контекст, чат без инструментов |\n| `emias/gpt120b-sql` | 32K | специализированные SQL-задачи |\n\n```bash\nopencode -m emias/ai4-gemma3\nopencode run -m emias/gpt120b-sql \"Оптимизируй SQL-запрос\"\n```\n\nУ `ai4-gemma3` на сервере MosAI отключён automatic tool choice. Плагин удаляет из\nеё запросов инструменты, поэтому модель подходит для анализа и длинного чата, но\nне может самостоятельно читать файлы или запускать команды OpenCode.\n\n## Reasoning effort\n\nДля `ai2-gpt120b-oss` доступны проверенные варианты `low`, `medium` и `high`:\n\n```bash\nopencode run -m emias/ai2-gpt120b-oss --variant low \"простая задача\"\nopencode run -m emias/ai2-gpt120b-oss --variant high \"сложная задача\"\n```\n\nВ TUI варианты переключаются действием `variant_cycle`. По умолчанию используется\n`medium`.\n\nНе используй `--pure`: этот флаг отключает внешние плагины.\n\n## Разработка и публикация\n\n```bash\nnpm install\nnpm run typecheck\nnpm pack --dry-run\n```\n\nПакет публикуется в npm scope `@botkinmoscow`. Первая публичная публикация:\n\n```bash\nnpm login\nnpm publish --access public\n```\n\nПеред следующей публикацией увеличь `version` в `package.json`, собери и проверь\nсодержимое tarball. GitLab остаётся исходным Git-репозиторием, а npm используется\nкак реестр дистрибуции, который OpenCode умеет устанавливать штатно.\n","readmeFilename":"README.md"}