pulls.review 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +1 -1
  2. package/dist/client/assets/{DisplayFileIcon-DIcJdZir.js → DisplayFileIcon-DWj5Zxib.js} +1 -1
  3. package/dist/client/assets/{LandingHero-CS9lP7Qs.js → LandingHero-DWdx6_8g.js} +1 -1
  4. package/dist/client/assets/LocalAgentSettings-COjAszEL.js +1 -0
  5. package/dist/client/assets/{_repo_-DtGh1V5_.js → _repo_-D3lApLQL.js} +1 -1
  6. package/dist/client/assets/{analyze-CTcNbJBk.js → analyze-BgWIIbl3.js} +1 -1
  7. package/dist/client/assets/{core-messages-CsAgH4H9.js → core-messages-ClW97ZVa.js} +1 -1
  8. package/dist/client/assets/{de-DQCc3irO.js → de-BoIOg_UW.js} +1 -1
  9. package/dist/client/assets/{diagnostics-CrG4-M7r.js → diagnostics-wATZy2jc.js} +1 -1
  10. package/dist/client/assets/{diff-BsZcYqbE.js → diff-CNRGXNmw.js} +1 -1
  11. package/dist/client/assets/{diff-Bq6jHPox.js → diff-Cx43r-a6.js} +1 -1
  12. package/dist/client/assets/{diffs-store-CzecLzBW.js → diffs-store-D3BzIMVi.js} +26 -26
  13. package/dist/client/assets/{en-CBwAorrh.js → en-CbWYrCM5.js} +1 -1
  14. package/dist/client/assets/{es-hetdr90_.js → es-CqEudTln.js} +1 -1
  15. package/dist/client/assets/{fr-Cayf6fbk.js → fr-qiQQ-4AO.js} +1 -1
  16. package/dist/client/assets/i18n-Cx8anq4V.js +2 -0
  17. package/dist/client/assets/{id-lw2zLhUO.js → id-BkDzu8gq.js} +1 -1
  18. package/dist/client/assets/index-De-UtOit.css +1 -0
  19. package/dist/client/assets/{index-DP4XBqUv.js → index-KDAJXf4E.js} +2 -2
  20. package/dist/client/assets/{install-DKy8VRs5.js → install-D-S32JY7.js} +3 -3
  21. package/dist/client/assets/{it-BfFzmCsC.js → it-tZZZbUKN.js} +1 -1
  22. package/dist/client/assets/{ja-DxaV4C1r.js → ja-kGPK4Fmt.js} +1 -1
  23. package/dist/client/assets/{ko-D93r2P2k.js → ko-CULiae40.js} +1 -1
  24. package/dist/client/assets/{llm-XBWohzAo.js → llm-Le5CPsNn.js} +5 -4
  25. package/dist/client/assets/{llm-store-7CdL0d74.js → llm-store-CzMnTJNa.js} +1 -1
  26. package/dist/client/assets/{pages-Tf2MYsp8.js → pages-ByEfDjFa.js} +1 -1
  27. package/dist/client/assets/{pages-local-iBHcLWBK.js → pages-local-CVPpEWZ_.js} +1 -1
  28. package/dist/client/assets/{pages-web-Bmq8l7JI.js → pages-web-BLxMupU5.js} +1 -1
  29. package/dist/client/assets/{pt-BR-Isafy_5V.js → pt-BR-BcwoZLSs.js} +1 -1
  30. package/dist/client/assets/{rpc-backends-CLzNPIWN.js → rpc-backends-DYtuJyeF.js} +1 -1
  31. package/dist/client/assets/{ru-Bx9Wj7Aa.js → ru-DOordgLF.js} +1 -1
  32. package/dist/client/assets/{source-Dk1PNoY7.js → source-CvnvCX42.js} +1 -1
  33. package/dist/client/assets/{upload-CFwsDMhO.js → upload-DRO7bkBV.js} +1 -1
  34. package/dist/client/assets/{useDocumentTitle-ByFCALbG.js → useDocumentTitle-BQJCa6Lm.js} +3 -3
  35. package/dist/client/assets/{zh-CN-CgGEKuLF.js → zh-CN-CmTqGY9s.js} +1 -1
  36. package/dist/client/assets/{zh-TW-DzNR26_1.js → zh-TW-DKGtbJQy.js} +1 -1
  37. package/dist/client/index.html +6 -6
  38. package/dist/{devframe-D66W-pHy.mjs → devframe-DH2vpasJ.mjs} +175 -53
  39. package/dist/devframe.mjs +1 -1
  40. package/dist/index.mjs +2 -2
  41. package/package.json +2 -2
  42. package/dist/client/assets/LocalAgentSettings-C4AeYCZ0.js +0 -1
  43. package/dist/client/assets/i18n-CgsK6PK3.js +0 -2
  44. package/dist/client/assets/index-DSHKSKKf.css +0 -1
@@ -1 +1 @@
1
- var e={cancel:`Отмена`,save:`Сохранить`,remove:`Удалить`,retry:`Повторить`,close:`Закрыть`,dismiss:`Скрыть`,refresh:`Обновить`,settings:`Настройки`,you:`вы`,loading:`Загрузка…`,send:`Отправить`,stop:`Стоп`,clear:`Очистить`,reply:`Ответить`,submit:`Отправить`,abort:`Прервать`,rerun:`Запустить снова`,files:`{n} файлов | {n} файл | {n} файла | {n} файлов`,subgroups:`{n} подгрупп | {n} подгруппа | {n} подгруппы | {n} подгрупп`,githubRepository:`Репозиторий на GitHub`,avatar:`Аватар {login}`},t={dropHint:`Отпустите, чтобы загрузить файл diff / .patch`,tagline:`Группирует изменённые файлы, кратко излагает главное и позволяет ревьюить по одной области за раз. Всё работает локально в вашем браузере.`,documentTitle:`Понятные и упорядоченные ревью пул-реквестов`,open:`Открыть`,pasteHint:`Вставьте ссылку на любой pull request GitHub или выберите демо ниже.`,recentlyViewed:`// недавно просмотренные`,recentRepositories:`// недавно просмотренные репозитории`,tryDemos:`// попробуйте демо`,demoBefore:`// до`,demoAfter:`// после`,moreFiles:`... ещё {n} файлов`,demoTitle:`feat: делиться ИИ-анализом в комментарии к PR и загружать общие результаты`,demoSummary:`Один ревьюер с API-ключом публикует свой анализ в PR; все остальные загружают его без токена.`,demoGroups:{store:`Store общих анализов и контракт комментария`,ui:`UI публикации результата`,refactor:`Рефакторинг store: результат в корень`,tests:`Тесты`,docs:`Документация и зависимости`},uploadTitle:`Ревью diff без PR`,uploadDescription:`Загрузите или вставьте unified diff либо перетащите файл {diff} / {patch} в любое место этой страницы.`,uploadButton:`Загрузить diff`,embedTitle:`Встроенный режим на github.com`,embedDescription:`С установленным {tampermonkey} или {violentmonkey} панель pulls.review появляется на каждой странице pull request.`,installUserscript:`Установить userscript`,bookmarkletTitle:`Переход между github.com и pulls.review`,bookmarkletDescription:`Нельзя устанавливать расширения? Перетащите этот букмарклет на панель закладок, чтобы открыть текущий pull request на pulls.review и вернуться обратно.`,bookmarkletDrag:`Перетащите меня на панель закладок`,actionsTitle:`Настройте автоанализ через GitHub Actions`,actionsDescription:`Анализируйте каждый pull request один раз в CI и публикуйте результат комментарием, чтобы каждому ревьюеру не нужен был свой ключ модели.`,cliTitle:`Запуск на локальных изменениях git через CLI`,cliDescription:`Проверяйте рабочее дерево, коммит или ветку до push, сгруппированными и с описанием, как в PR.`,viewGuide:`Открыть руководство`},n={userscript:{title:`pulls.review, встроенный в github.com`,intro:`Пользовательский скрипт добавляет панель pulls.review прямо на страницы pull request'ов на github.com: сгруппированные файлы и описания, без переключения вкладок.`,manager:`Установите менеджер пользовательских скриптов: {tampermonkey} или {violentmonkey}.`,install:`Установите пользовательский скрипт pulls.review. Менеджер попросит подтверждение.`,open:`Откройте любой pull request на github.com и нажмите вкладку {tab} рядом с "Files changed".`,ai:`github.com блокирует запросы, нужные для ИИ-анализа, поэтому панель показывает анализы, опубликованные комментариями в PR. Чтобы запустить новый, откройте PR на pulls.review.`},bookmarklet:{title:`Переход между github.com и pulls.review`,intro:`Букмарклет это закладка, которая запускает небольшой скрипт. Он работает в любом браузере без расширений и открывает текущую страницу на другом сайте.`,bar:`Покажите панель закладок, например с помощью {shortcut}.`,drag:`Перетащите эту кнопку на панель закладок:`,use:`На странице pull request, коммита или сравнения на github.com нажмите на закладку, чтобы открыть её на pulls.review. Нажмите ещё раз, чтобы вернуться.`},actions:{title:`Автоанализ через GitHub Actions`,intro:`Пусть CI анализирует каждый pull request один раз, как только его открыли или обновили. Все, кто открывает PR, здесь или в панели на github.com, сразу видят одно и то же сгруппированное описание. Никому не нужен свой ключ модели, и pull request'ы из форков тоже его получают.`,secret:`Добавьте ключ модели как секрет репозитория, например {name}.`,workflow:`Добавьте этот workflow в репозиторий:`,result:`Откройте или обновите pull request, чтобы попробовать. Анализ придёт комментарием, а повторные запуски на неизменённом PR не обращаются к модели.`,options:`{provider} определяется по ключу. Задайте {provider}, {model} или {locale}, чтобы переопределить. Все параметры описаны в {readme}.`},cli:{title:`Проверка локальных изменений git через CLI`,intro:`Проверьте своё изменение раньше всех. CLI открывает в pulls.review вашу ветку, коммит или незакоммиченную работу, чтобы до push или открытия PR увидеть, как изменение выглядит в сгруппированном и описанном виде.`,branch:`В git-репозитории запустите это, чтобы сравнить текущую ветку с веткой по умолчанию:`,target:`Или выберите, что проверить:`,browser:`Он откроет {url} в браузере и покажет ваши локальные изменения. Подтвердите вкладку одноразовым кодом из терминала. Там же можно выбрать другие ветки или коммиты для сравнения.`}},r={title:`Загрузить diff`,description:`Вставьте или перетащите файл unified diff / .patch для ревью.`,pasteLabel:`Вставьте unified diff / .patch`,chooseFile:`Или выберите файл .diff/.patch`,loadButton:`Загрузить diff`,parsing:`Разбор diff…`,parseFailed:`Не удалось разобрать этот diff`,noDiff:`Diff не загружен`,noDiffHint:`Перейдите на главную и воспользуйтесь кнопкой загрузки, чтобы вставить или перетащить diff.`,goHome:`На главную`},i={loading:`Загрузка pull request…`,loadFailed:`Не удалось загрузить этот pull request`,somethingWrong:`Что-то пошло не так`,newCommits:`В этом pull request появились новые коммиты с момента кэширования.`,autoRefreshNextTime:`В следующий раз обновлять автоматически`,endOfDiff:`Вы дошли до конца diff.`,analyzeBy:`Анализ`,rules:`Правила`,ai:`ИИ`,by:`автор`,sharedBy:`Просмотр ИИ-анализа, которым поделился`,sharedAnalysis:`Просмотр общего анализа`,reviewedOf:`/ {total} проверено`,openInSite:`Открыть в pulls.review`},a={reviewChanges:`Ревью изменений`,updateUserscript:`Обновить userscript`},o={loading:`Загрузка pull request'ов…`,loadFailed:`Не удалось загрузить pull request'ы`,open:`{n} открытых`,search:`Фильтр pull request'ов`,empty:`Открытых pull request'ов нет`,noMatches:`Ни один pull request не соответствует запросу`,searchingAll:`Поиск по всем {n} открытым pull request'ам…`,loadingMore:`Загрузка…`,openedBy:`открыт {time}, автор {author}`,milestone:`Этап`,comments:`{n} комментарий | {n} комментария | {n} комментариев`,linkedIssues:`{n} связанный issue | {n} связанных issue | {n} связанных issue`,assignedTo:`Назначен на {login}`,groups:`{n} группа | {n} группы | {n} групп`,viewedHint:`Просмотрен в этом браузере`,aiAvailable:`Доступен ИИ-анализ`,sort:{label:`Сортировка`,"recently-updated":`Недавно обновлённые`,"least-recently-updated":`Давно не обновлялись`,newest:`Сначала новые`,oldest:`Сначала старые`,"most-commented":`Больше комментариев`,"least-commented":`Меньше комментариев`},review:{approved:`Одобрен`,changes_requested:`Запрошены изменения`,review_required:`Требуется ревью`},checks:{success:`Все проверки пройдены`,failure:`Некоторые проверки не пройдены`,pending:`Некоторые проверки ещё не завершены`}},s={setupKeys:`Настроить API-ключи`,analyzing:`Анализ…`,failed:`Анализ не удался`,failedTitle:`ИИ-анализ не удался: {message}`,reanalyze:`Повторить анализ`,withAi:`Анализировать с ИИ`,statusTitle:`ИИ-анализ`,starting:`Запуск…`,thinking:`Думаю… (шаг {step})`,reading:`Чтение {n} файлов: {first} | Чтение {n} файла: {first} | Чтение {n} файлов: {first} | Чтение {n} файлов: {first}`,organizing:`Формирование групп…`,notConfigured:`ИИ-анализ не настроен: добавьте токен gateway или API-ключ провайдера в настройках`,chatFailed:`Запрос чата не удался`,agentSessionLost:`У агента больше нет этого разговора. Проанализируйте заново, чтобы продолжить чат.`},c={button:`Поделиться результатом`,updateButton:`Обновить опубликованный комментарий`,sharing:`Публикация…`,tooltip:`Опубликовать этот анализ комментарием к pull request, чтобы другие могли его загрузить`,needsToken:`Для публикации нужен токен GitHub с правом записи`,failed:`Не удалось поделиться: {message}`,titleUpdate:`Обновить опубликованный анализ`,titleShare:`Поделиться этим анализом на GitHub`,willUpdate:`Ваш существующий {comment} к этому pull request будет обновлён от имени {user} с помощью вашего токена GitHub.`,willPost:`Публичный комментарий будет добавлен к этому pull request от имени {user} с помощью вашего токена GitHub.`,commentLink:`комментарий`,contains:`Комментарий содержит:`,containsLink:`ссылку для открытия этого ревью на {site}`,containsJson:`группировку и краткие описания этого ИИ-анализа в виде JSON в свёрнутом блоке`,excludes:`Ваши сообщения чата, API-ключи и другие данные из настроек не будут включены.`,anyoneCanLoad:`Любой, кто просматривает pull request, может загрузить опубликованный анализ.`,englishRecommended:`Если вы работаете над публичным проектом, рекомендуем делиться результатом на английском, чтобы он был полезен сообществу.`,share:`Поделиться`,update:`Обновить`,shareAnyway:`Всё равно поделиться`,updateAnyway:`Всё равно обновить`,loadReplaces:`Загрузить опубликованный ИИ-анализ? Он заменит ваш:`,available:`Доступны опубликованные ИИ-анализы этого pull request:`,staleTitle:`Проанализирован до последних коммитов`,outdated:`(устарел)`,inLanguage:`Проанализирован на языке: {language}`,notShared:`{login} не делился анализом этого pull request.`},l={toggle:`Свернуть или развернуть группу`,filesReviewed:`Проверено файлов: {reviewed} / {total}`,subgroupsOf:`подгруппы:`,hideSubgroups:`Скрыть подгруппы`,showSubgroups:`Показать подгруппы`,navTabs:`Показать группы вкладками`,navSidebar:`Показать группы в боковой панели`,uncategorized:`Без категории`,uncategorizedSummary:`Файлы, не охваченные текущим анализом.`},u={critical:`Проверьте внимательно`},d={markReviewed:`Отметить как проверенный`,markFolderReviewed:`Отметить все файлы в {name} как проверенные`,changedSinceReviewed:`Этот файл уже был проверен, но изменился в последующих коммитах`,resolved:`{n} решено`,binary:`Бинарный файл`,binaryNotShown:`Бинарный файл не отображается.`,tooLarge:`Diff слишком большой для отображения.`,loadFailed:`Не удалось загрузить`,loadFull:`Загрузить полное содержимое файла`,expand:`Развернуть файл`,collapse:`Свернуть файл`,noLongerInDiff:`Больше нет в этом diff`,removed:`удалён`},f={title:`Ход проверки`,markAll:`Отметить все как проверенные`,reset:`Сбросить состояние проверки`,invert:`Инвертировать состояние проверки`,status:{reviewed:`Проверен`,changed:`Изменён после проверки`,unreviewed:`Не проверен`}},p={added:`добавлен`,removed:`удалён`,modified:`изменён`,renamed:`переименован`,copied:`скопирован`},m={open:`открыт`,draft:`черновик`,closed:`закрыт`,merged:`влит`},h={ui:`UI`,api:`API`,core:`ядро`,data:`данные`,cli:`CLI`,security:`безопасность`,tests:`тесты`,docs:`документация`,examples:`примеры`,deps:`зависимости`,build:`сборка`,scripts:`скрипты`,config:`конфигурация`,i18n:`i18n`,assets:`ресурсы`,other:`прочее`},g={addReview:`Добавить ревью`,hideComments:`Скрыть комментарии ревью`,showComments:`Показать комментарии ревью`,reviews:`Ревью`,approved:`одобрил`,changesRequested:`запросил изменения`,commented:`прокомментировал`,dismissed:`ревью отклонено`,reviewChanges:`Ревью изменений`,includesPending:`Отправка включает {n} ожидающих комментариев. | Отправка включает {n} ожидающий комментарий. | Отправка включает {n} ожидающих комментария. | Отправка включает {n} ожидающих комментариев.`,summaryPlaceholder:`Оставьте резюме (необязательно при одобрении)`,comment:`Комментировать`,approve:`Одобрить`,requestChanges:`Запросить изменения`,discard:`Отменить ревью`,leaveComment:`Оставьте комментарий`,addSingle:`Добавить одиночный комментарий`,addToReview:`Добавить комментарий ревью`,startReview:`Начать ревью`,pending:`Ожидает`,editComment:`Редактировать комментарий`,deleteComment:`Удалить комментарий`,replyPlaceholder:`Ответить…`,resolve:`Решено`},_={title:`Спросить об этом PR`,collapse:`Свернуть`,reanalyzeToEnable:`Повторите анализ, чтобы включить чат`,thinking:`Думаю…`,placeholder:`Спросите об этом PR…`,updatedGrouping:`Группировка обновлена: {n} групп`,readFiles:`Прочитано {n} файлов | Прочитан {n} файл | Прочитано {n} файла | Прочитано {n} файлов`,updatingGrouping:`Обновление группировки…`,submittingGrouping:`Отправка группировки…`,requestFailed:`Запрос не удался`,stopped:`остановлено`},v={layout:`Вид diff`,wrapLines:`Переносить строки`,unified:`Единый`,split:`Раздельный`,syntaxTheme:{label:`Тема подсветки синтаксиса`,light:`Светлый режим`,dark:`Тёмный режим`},cached:`Кэшированные pull request`,autoRefresh:`Автоматически обновлять при обнаружении новых коммитов`,language:`Язык`,token:{label:`GitHub Personal Access Token`,optional:`Необязателен для публичных репозиториев; нужен для приватных репозиториев и для отправки ревью.`,scopes:`Для ревью нужен scope {repo} (классический токен) или {fineGrained} (детализированный токен)`,storedLocally:`Хранится только в этом браузере.`,generate:`Создать на GitHub →`,fineGrained:`Детализированный токен (без классических scope)`,updated:`Обновлён`,expires:`Истекает`,neverExpires:`Бессрочный`,change:`Сменить токен`,checking:`Проверка токена…`,couldNotVerify:`Не удалось проверить этот токен.`},tabs:{appearance:`Внешний вид`,behavior:`Поведение`,github:`GitHub`,ai:`ИИ-анализ`,notSetUp:`Ещё не настроено`},llm:{title:`ИИ-анализ`,description:`Настройте провайдера моделей, чтобы включить сгенерированные ИИ описания. Хранится только в этом браузере и отправляется только выбранному провайдеру.`,provider:`Провайдер`,baseUrl:`Базовый URL`,baseUrlDescription:`Любой OpenAI-совместимый endpoint chat completions (сам OpenAI, локальный сервер и т. д.).`,apiKey:`API-ключ`,gatewayHint:`Токен {link}, дающий доступ ко всем поддерживаемым вендорам одним токеном.`,anthropicHint:`{link}, вызываемый напрямую из этого браузера (без gateway).`,anthropicLink:`API-ключ Anthropic`,openaiHint:`API-ключ для указанного выше endpoint.`,createKey:`Создать на {provider} →`,configured:`Настроен`,changeKey:`Сменить ключ`,model:`Модель`,modelListFailed:`Не удалось загрузить список моделей ({error}). Введите id модели вручную.`,embedUnavailable:`Функции ИИ недоступны во встроенном режиме`,embedReason:`Строгая CSP github.com блокирует запросы, необходимые функциям ИИ. {link}, чтобы использовать их.`,goToWebsite:`Перейдите на сайт`,agent:`Агент`,agentNeedsCli:"Локальные агенты работают в CLI pulls.review: запустите её в репозитории командой `npx pulls.review` и выберите агента там.",agentDetecting:`Поиск CLI агентов…`,agentNone:`На этом компьютере не найдено CLI агентов.`,agentHint:`Установленный на этом компьютере агент для кода со своей учётной записью: {claude} или {opencode}. Он читает патч и репозиторий и ничего не записывает.`,agentPick:`Выберите агента…`},models:{placeholder:`id модели`,loading:`Загрузка моделей…`,search:`Поиск моделей…`,noMatch:`Подходящих моделей нет`,useCustom:`Использовать «{id}»`,free:`Бесплатно`,priceTitle:`Вход {input}/M · Выход {output}/M токенов`,agentDefault:`По умолчанию для агента`}},y={allFiles:`Все файлы`,code:{label:`Код`,summary:`Изменения исходного кода.`},other:{label:`Прочее`,summary:`Другие изменения, не подходящие под существующие категории.`},docs:{label:`Документация`,summary:`Обновления документации.`},tests:{label:`Тесты`,summary:`Тестовое покрытие изменения.`},config:{label:`Конфигурация`,summary:`Изменения конфигурации.`},deps:{label:`Зависимости`,summary:`Изменения версий зависимостей.`},generated:{label:`Сгенерированное`,summary:`Изменения сгенерированных файлов или артефактов сборки.`}},b={tokenRequired:`Для записи в этот pull request нужен токен GitHub.`,diffNotLoaded:`Diff ещё не загрузился.`,noViewer:`Не удалось определить пользователя GitHub для этого токена.`,tokenRejected:`GitHub отклонил этот токен (401). Проверьте, что он вставлен полностью и не отозван.`,tooLarge:`Анализ слишком велик, чтобы поделиться им в комментарии ({n} символов).`},x={loading:`Загрузка локальных изменений…`,loadFailed:`Не удалось загрузить эти изменения`,auth:{title:`Введите код из терминала`,hint:`pulls.review вывел 6-значный код в терминале, где он запущен.`,invalid:`Этот код не подошёл. Проверьте терминал и попробуйте ещё раз.`,submit:`Продолжить`},picker:{tagline:`Ревьюйте локальные ветки, диапазоны и незакоммиченные изменения как pull request: по группам, с кратким описанием, по одной области за раз.`,title:`Ревью локальных изменений`,base:`База`,head:`Head`,compare:`Сравнить`,shortcuts:`Быстрые ссылки`,worktree:`Незакоммиченные изменения`,recentCommits:`Последние коммиты`,branches:`Ветки`,against:`относительно {base}`,current:`Текущая ветка`,github:`Или pull request, сравнение или коммит на GitHub`}},S={common:e,landing:t,guide:n,load:r,pr:i,embed:a,pulls:o,analyze:s,share:c,group:l,note:u,file:d,reviewProgress:f,fileStatus:p,prState:m,category:h,review:g,chat:_,settings:v,rules:y,errors:b,local:x};export{s as analyze,h as category,_ as chat,e as common,S as default,a as embed,b as errors,d as file,p as fileStatus,l as group,n as guide,t as landing,r as load,x as local,u as note,i as pr,m as prState,o as pulls,g as review,f as reviewProgress,y as rules,v as settings,c as share};
1
+ var e={cancel:`Отмена`,save:`Сохранить`,remove:`Удалить`,retry:`Повторить`,close:`Закрыть`,dismiss:`Скрыть`,refresh:`Обновить`,settings:`Настройки`,you:`вы`,loading:`Загрузка…`,send:`Отправить`,stop:`Стоп`,clear:`Очистить`,reply:`Ответить`,submit:`Отправить`,abort:`Прервать`,rerun:`Запустить снова`,files:`{n} файлов | {n} файл | {n} файла | {n} файлов`,subgroups:`{n} подгрупп | {n} подгруппа | {n} подгруппы | {n} подгрупп`,githubRepository:`Репозиторий на GitHub`,avatar:`Аватар {login}`},t={dropHint:`Отпустите, чтобы загрузить файл diff / .patch`,tagline:`Группирует изменённые файлы, кратко излагает главное и позволяет ревьюить по одной области за раз. Всё работает локально в вашем браузере.`,documentTitle:`Понятные и упорядоченные ревью пул-реквестов`,open:`Открыть`,pasteHint:`Вставьте ссылку на любой pull request GitHub или выберите демо ниже.`,recentlyViewed:`// недавно просмотренные`,recentRepositories:`// недавно просмотренные репозитории`,tryDemos:`// попробуйте демо`,demoBefore:`// до`,demoAfter:`// после`,moreFiles:`... ещё {n} файлов`,demoTitle:`feat: делиться ИИ-анализом в комментарии к PR и загружать общие результаты`,demoSummary:`Один ревьюер с API-ключом публикует свой анализ в PR; все остальные загружают его без токена.`,demoGroups:{store:`Store общих анализов и контракт комментария`,ui:`UI публикации результата`,refactor:`Рефакторинг store: результат в корень`,tests:`Тесты`,docs:`Документация и зависимости`},uploadTitle:`Ревью diff без PR`,uploadDescription:`Загрузите или вставьте unified diff либо перетащите файл {diff} / {patch} в любое место этой страницы.`,uploadButton:`Загрузить diff`,embedTitle:`Встроенный режим на github.com`,embedDescription:`С установленным {tampermonkey} или {violentmonkey} панель pulls.review появляется на каждой странице pull request.`,installUserscript:`Установить userscript`,bookmarkletTitle:`Переход между github.com и pulls.review`,bookmarkletDescription:`Нельзя устанавливать расширения? Перетащите этот букмарклет на панель закладок, чтобы открыть текущий pull request на pulls.review и вернуться обратно.`,bookmarkletDrag:`Перетащите меня на панель закладок`,actionsTitle:`Настройте автоанализ через GitHub Actions`,actionsDescription:`Анализируйте каждый pull request один раз в CI и публикуйте результат комментарием, чтобы каждому ревьюеру не нужен был свой ключ модели.`,cliTitle:`Запуск на локальных изменениях git через CLI`,cliDescription:`Проверяйте рабочее дерево, коммит или ветку до push, сгруппированными и с описанием, как в PR.`,viewGuide:`Открыть руководство`},n={userscript:{title:`pulls.review, встроенный в github.com`,intro:`Пользовательский скрипт добавляет панель pulls.review прямо на страницы pull request'ов на github.com: сгруппированные файлы и описания, без переключения вкладок.`,manager:`Установите менеджер пользовательских скриптов: {tampermonkey} или {violentmonkey}.`,install:`Установите пользовательский скрипт pulls.review. Менеджер попросит подтверждение.`,open:`Откройте любой pull request на github.com и нажмите вкладку {tab} рядом с "Files changed".`,ai:`github.com блокирует запросы, нужные для ИИ-анализа, поэтому панель показывает анализы, опубликованные комментариями в PR. Чтобы запустить новый, откройте PR на pulls.review.`},bookmarklet:{title:`Переход между github.com и pulls.review`,intro:`Букмарклет это закладка, которая запускает небольшой скрипт. Он работает в любом браузере без расширений и открывает текущую страницу на другом сайте.`,bar:`Покажите панель закладок, например с помощью {shortcut}.`,drag:`Перетащите эту кнопку на панель закладок:`,use:`На странице pull request, коммита или сравнения на github.com нажмите на закладку, чтобы открыть её на pulls.review. Нажмите ещё раз, чтобы вернуться.`},actions:{title:`Автоанализ через GitHub Actions`,intro:`Пусть CI анализирует каждый pull request один раз, как только его открыли или обновили. Все, кто открывает PR, здесь или в панели на github.com, сразу видят одно и то же сгруппированное описание. Никому не нужен свой ключ модели, и pull request'ы из форков тоже его получают.`,secret:`Добавьте ключ модели как секрет репозитория, например {name}.`,workflow:`Добавьте этот workflow в репозиторий:`,result:`Откройте или обновите pull request, чтобы попробовать. Анализ придёт комментарием, а повторные запуски на неизменённом PR не обращаются к модели.`,options:`{provider} определяется по ключу. Задайте {provider}, {model} или {locale}, чтобы переопределить. Все параметры описаны в {readme}.`},cli:{title:`Проверка локальных изменений git через CLI`,intro:`Проверьте своё изменение раньше всех. CLI открывает в pulls.review вашу ветку, коммит или незакоммиченную работу, чтобы до push или открытия PR увидеть, как изменение выглядит в сгруппированном и описанном виде.`,branch:`В git-репозитории запустите это, чтобы сравнить текущую ветку с веткой по умолчанию:`,target:`Или выберите, что проверить:`,browser:`Он откроет {url} в браузере и покажет ваши локальные изменения. Подтвердите вкладку одноразовым кодом из терминала. Там же можно выбрать другие ветки или коммиты для сравнения.`}},r={title:`Загрузить diff`,description:`Вставьте или перетащите файл unified diff / .patch для ревью.`,pasteLabel:`Вставьте unified diff / .patch`,chooseFile:`Или выберите файл .diff/.patch`,loadButton:`Загрузить diff`,parsing:`Разбор diff…`,parseFailed:`Не удалось разобрать этот diff`,noDiff:`Diff не загружен`,noDiffHint:`Перейдите на главную и воспользуйтесь кнопкой загрузки, чтобы вставить или перетащить diff.`,goHome:`На главную`},i={loading:`Загрузка pull request…`,loadFailed:`Не удалось загрузить этот pull request`,somethingWrong:`Что-то пошло не так`,newCommits:`В этом pull request появились новые коммиты с момента кэширования.`,autoRefreshNextTime:`В следующий раз обновлять автоматически`,endOfDiff:`Вы дошли до конца diff.`,analyzeBy:`Анализ`,rules:`Правила`,ai:`ИИ`,by:`автор`,sharedBy:`Просмотр ИИ-анализа, которым поделился`,sharedAnalysis:`Просмотр общего анализа`,reviewedOf:`/ {total} проверено`,openInSite:`Открыть в pulls.review`},a={reviewChanges:`Ревью изменений`,updateUserscript:`Обновить userscript`},o={loading:`Загрузка pull request'ов…`,loadFailed:`Не удалось загрузить pull request'ы`,open:`{n} открытых`,search:`Фильтр pull request'ов`,empty:`Открытых pull request'ов нет`,noMatches:`Ни один pull request не соответствует запросу`,searchingAll:`Поиск по всем {n} открытым pull request'ам…`,loadingMore:`Загрузка…`,openedBy:`открыт {time}, автор {author}`,milestone:`Этап`,comments:`{n} комментарий | {n} комментария | {n} комментариев`,linkedIssues:`{n} связанный issue | {n} связанных issue | {n} связанных issue`,assignedTo:`Назначен на {login}`,groups:`{n} группа | {n} группы | {n} групп`,viewedHint:`Просмотрен в этом браузере`,aiAvailable:`Доступен ИИ-анализ`,sort:{label:`Сортировка`,"recently-updated":`Недавно обновлённые`,"least-recently-updated":`Давно не обновлялись`,newest:`Сначала новые`,oldest:`Сначала старые`,"most-commented":`Больше комментариев`,"least-commented":`Меньше комментариев`},review:{approved:`Одобрен`,changes_requested:`Запрошены изменения`,review_required:`Требуется ревью`},checks:{success:`Все проверки пройдены`,failure:`Некоторые проверки не пройдены`,pending:`Некоторые проверки ещё не завершены`}},s={setupKeys:`Настроить API-ключи`,analyzing:`Анализ…`,failed:`Анализ не удался`,failedTitle:`ИИ-анализ не удался: {message}`,reanalyze:`Повторить анализ`,withAi:`Анализировать с ИИ`,statusTitle:`ИИ-анализ`,starting:`Запуск…`,thinking:`Думаю… (шаг {step})`,reading:`Чтение {n} файлов: {first} | Чтение {n} файла: {first} | Чтение {n} файлов: {first} | Чтение {n} файлов: {first}`,organizing:`Формирование групп…`,notConfigured:`ИИ-анализ не настроен: добавьте токен gateway или API-ключ провайдера в настройках`,chatFailed:`Запрос чата не удался`,agentSessionLost:`У агента больше нет этого разговора. Проанализируйте заново, чтобы продолжить чат.`},c={button:`Поделиться результатом`,updateButton:`Обновить опубликованный комментарий`,sharing:`Публикация…`,tooltip:`Опубликовать этот анализ комментарием к pull request, чтобы другие могли его загрузить`,needsToken:`Для публикации нужен токен GitHub с правом записи`,failed:`Не удалось поделиться: {message}`,titleUpdate:`Обновить опубликованный анализ`,titleShare:`Поделиться этим анализом на GitHub`,willUpdate:`Ваш существующий {comment} к этому pull request будет обновлён от имени {user} с помощью вашего токена GitHub.`,willPost:`Публичный комментарий будет добавлен к этому pull request от имени {user} с помощью вашего токена GitHub.`,commentLink:`комментарий`,contains:`Комментарий содержит:`,containsLink:`ссылку для открытия этого ревью на {site}`,containsJson:`группировку и краткие описания этого ИИ-анализа в виде JSON в свёрнутом блоке`,excludes:`Ваши сообщения чата, API-ключи и другие данные из настроек не будут включены.`,anyoneCanLoad:`Любой, кто просматривает pull request, может загрузить опубликованный анализ.`,englishRecommended:`Если вы работаете над публичным проектом, рекомендуем делиться результатом на английском, чтобы он был полезен сообществу.`,share:`Поделиться`,update:`Обновить`,shareAnyway:`Всё равно поделиться`,updateAnyway:`Всё равно обновить`,loadReplaces:`Загрузить опубликованный ИИ-анализ? Он заменит ваш:`,available:`Доступны опубликованные ИИ-анализы этого pull request:`,staleTitle:`Проанализирован до последних коммитов`,outdated:`(устарел)`,inLanguage:`Проанализирован на языке: {language}`,notShared:`{login} не делился анализом этого pull request.`},l={toggle:`Свернуть или развернуть группу`,filesReviewed:`Проверено файлов: {reviewed} / {total}`,subgroupsOf:`подгруппы:`,hideSubgroups:`Скрыть подгруппы`,showSubgroups:`Показать подгруппы`,navTabs:`Показать группы вкладками`,navSidebar:`Показать группы в боковой панели`,uncategorized:`Без категории`,uncategorizedSummary:`Файлы, не охваченные текущим анализом.`},u={critical:`Проверьте внимательно`},d={layoutTree:`Показать файлы деревом`,layoutList:`Показать файлы списком`,markReviewed:`Отметить как проверенный`,markFolderReviewed:`Отметить все файлы в {name} как проверенные`,changedSinceReviewed:`Этот файл уже был проверен, но изменился в последующих коммитах`,resolved:`{n} решено`,binary:`Бинарный файл`,binaryNotShown:`Бинарный файл не отображается.`,tooLarge:`Diff слишком большой для отображения.`,loadFailed:`Не удалось загрузить`,loadFull:`Загрузить полное содержимое файла`,expand:`Развернуть файл`,collapse:`Свернуть файл`,collapseMenu:`Развернуть или свернуть файлы`,expandAll:`Развернуть все файлы`,collapseAll:`Свернуть все файлы`,collapseReviewed:`Свернуть проверенные файлы`,noLongerInDiff:`Больше нет в этом diff`,removed:`удалён`},f={title:`Ход проверки`,markAll:`Отметить все как проверенные`,reset:`Сбросить состояние проверки`,invert:`Инвертировать состояние проверки`,status:{reviewed:`Проверен`,changed:`Изменён после проверки`,unreviewed:`Не проверен`}},p={added:`добавлен`,removed:`удалён`,modified:`изменён`,renamed:`переименован`,copied:`скопирован`},m={open:`открыт`,draft:`черновик`,closed:`закрыт`,merged:`влит`},h={ui:`UI`,api:`API`,core:`ядро`,data:`данные`,cli:`CLI`,security:`безопасность`,tests:`тесты`,docs:`документация`,examples:`примеры`,deps:`зависимости`,build:`сборка`,scripts:`скрипты`,config:`конфигурация`,i18n:`i18n`,assets:`ресурсы`,other:`прочее`},g={addReview:`Добавить ревью`,hideComments:`Скрыть комментарии ревью`,showComments:`Показать комментарии ревью`,reviews:`Ревью`,approved:`одобрил`,changesRequested:`запросил изменения`,commented:`прокомментировал`,dismissed:`ревью отклонено`,reviewChanges:`Ревью изменений`,includesPending:`Отправка включает {n} ожидающих комментариев. | Отправка включает {n} ожидающий комментарий. | Отправка включает {n} ожидающих комментария. | Отправка включает {n} ожидающих комментариев.`,summaryPlaceholder:`Оставьте резюме (необязательно при одобрении)`,comment:`Комментировать`,approve:`Одобрить`,requestChanges:`Запросить изменения`,discard:`Отменить ревью`,leaveComment:`Оставьте комментарий`,addSingle:`Добавить одиночный комментарий`,addToReview:`Добавить комментарий ревью`,startReview:`Начать ревью`,pending:`Ожидает`,editComment:`Редактировать комментарий`,deleteComment:`Удалить комментарий`,replyPlaceholder:`Ответить…`,resolve:`Решено`},_={title:`Спросить об этом PR`,collapse:`Свернуть`,reanalyzeToEnable:`Повторите анализ, чтобы включить чат`,thinking:`Думаю…`,placeholder:`Спросите об этом PR…`,updatedGrouping:`Группировка обновлена: {n} групп`,readFiles:`Прочитано {n} файлов | Прочитан {n} файл | Прочитано {n} файла | Прочитано {n} файлов`,updatingGrouping:`Обновление группировки…`,submittingGrouping:`Отправка группировки…`,requestFailed:`Запрос не удался`,stopped:`остановлено`},v={layout:`Вид diff`,wrapLines:`Переносить строки`,unified:`Единый`,split:`Раздельный`,syntaxTheme:{label:`Тема подсветки синтаксиса`,light:`Светлый режим`,dark:`Тёмный режим`},cached:`Кэшированные pull request`,autoRefresh:`Автоматически обновлять при обнаружении новых коммитов`,language:`Язык`,token:{label:`GitHub Personal Access Token`,optional:`Необязателен для публичных репозиториев; нужен для приватных репозиториев и для отправки ревью.`,scopes:`Для ревью нужен scope {repo} (классический токен) или {fineGrained} (детализированный токен)`,storedLocally:`Хранится только в этом браузере.`,generate:`Создать на GitHub →`,fineGrained:`Детализированный токен (без классических scope)`,updated:`Обновлён`,expires:`Истекает`,neverExpires:`Бессрочный`,change:`Сменить токен`,checking:`Проверка токена…`,couldNotVerify:`Не удалось проверить этот токен.`},tabs:{appearance:`Внешний вид`,behavior:`Поведение`,github:`GitHub`,ai:`ИИ-анализ`,notSetUp:`Ещё не настроено`},llm:{title:`ИИ-анализ`,description:`Настройте провайдера моделей, чтобы включить сгенерированные ИИ описания. Хранится только в этом браузере и отправляется только выбранному провайдеру.`,provider:`Провайдер`,baseUrl:`Базовый URL`,baseUrlDescription:`Любой OpenAI-совместимый endpoint chat completions (сам OpenAI, локальный сервер и т. д.).`,apiKey:`API-ключ`,gatewayHint:`Токен {link}, дающий доступ ко всем поддерживаемым вендорам одним токеном.`,anthropicHint:`{link}, вызываемый напрямую из этого браузера (без gateway).`,anthropicLink:`API-ключ Anthropic`,openaiHint:`API-ключ для указанного выше endpoint.`,createKey:`Создать на {provider} →`,configured:`Настроен`,changeKey:`Сменить ключ`,model:`Модель`,modelListFailed:`Не удалось загрузить список моделей ({error}). Введите id модели вручную.`,embedUnavailable:`Функции ИИ недоступны во встроенном режиме`,embedReason:`Строгая CSP github.com блокирует запросы, необходимые функциям ИИ. {link}, чтобы использовать их.`,goToWebsite:`Перейдите на сайт`,agent:`Агент`,agentNeedsCli:"Локальные агенты работают в CLI pulls.review: запустите её в репозитории командой `npx pulls.review` и выберите агента там.",agentDetecting:`Поиск CLI агентов…`,agentNone:`На этом компьютере не найдено CLI агентов.`,agentHint:`Установленный на этом компьютере агент для кода со своей учётной записью: {claude} или {opencode}. Он читает патч и репозиторий и ничего не записывает.`,agentPick:`Выберите агента…`},models:{placeholder:`id модели`,loading:`Загрузка моделей…`,search:`Поиск моделей…`,noMatch:`Подходящих моделей нет`,useCustom:`Использовать «{id}»`,free:`Бесплатно`,priceTitle:`Вход {input}/M · Выход {output}/M токенов`,agentDefault:`По умолчанию для агента`}},y={allFiles:`Все файлы`,code:{label:`Код`,summary:`Изменения исходного кода.`},other:{label:`Прочее`,summary:`Другие изменения, не подходящие под существующие категории.`},docs:{label:`Документация`,summary:`Обновления документации.`},tests:{label:`Тесты`,summary:`Тестовое покрытие изменения.`},config:{label:`Конфигурация`,summary:`Изменения конфигурации.`},deps:{label:`Зависимости`,summary:`Изменения версий зависимостей.`},generated:{label:`Сгенерированное`,summary:`Изменения сгенерированных файлов или артефактов сборки.`}},b={tokenRequired:`Для записи в этот pull request нужен токен GitHub.`,diffNotLoaded:`Diff ещё не загрузился.`,noViewer:`Не удалось определить пользователя GitHub для этого токена.`,tokenRejected:`GitHub отклонил этот токен (401). Проверьте, что он вставлен полностью и не отозван.`,tooLarge:`Анализ слишком велик, чтобы поделиться им в комментарии ({n} символов).`},x={loading:`Загрузка локальных изменений…`,loadFailed:`Не удалось загрузить эти изменения`,auth:{title:`Введите код из терминала`,hint:`pulls.review вывел 6-значный код в терминале, где он запущен.`,invalid:`Этот код не подошёл. Проверьте терминал и попробуйте ещё раз.`,submit:`Продолжить`},picker:{tagline:`Ревьюйте локальные ветки, диапазоны и незакоммиченные изменения как pull request: по группам, с кратким описанием, по одной области за раз.`,title:`Ревью локальных изменений`,base:`База`,head:`Head`,compare:`Сравнить`,shortcuts:`Быстрые ссылки`,worktree:`Незакоммиченные изменения`,recentCommits:`Последние коммиты`,branches:`Ветки`,against:`относительно {base}`,current:`Текущая ветка`,github:`Или pull request, сравнение или коммит на GitHub`}},S={common:e,landing:t,guide:n,load:r,pr:i,embed:a,pulls:o,analyze:s,share:c,group:l,note:u,file:d,reviewProgress:f,fileStatus:p,prState:m,category:h,review:g,chat:_,settings:v,rules:y,errors:b,local:x};export{s as analyze,h as category,_ as chat,e as common,S as default,a as embed,b as errors,d as file,p as fileStatus,l as group,n as guide,t as landing,r as load,x as local,u as note,i as pr,m as prState,o as pulls,g as review,f as reviewProgress,y as rules,v as settings,c as share};
@@ -1,2 +1,2 @@
1
1
  var e={lang:void 0,message:void 0,abortEarly:void 0,abortPipeEarly:void 0};function t(t){return t?{lang:t?.lang??void 0,message:t?.message,abortEarly:t?.abortEarly??void 0,abortPipeEarly:t?.abortPipeEarly??void 0}:e}function n(e){let t=typeof e;return t===`string`?`"${e}"`:t===`number`||t===`bigint`||t===`boolean`?`${e}`:t===`object`||t===`function`?(e&&Object.getPrototypeOf(e)?.constructor?.name)??`null`:t}function r(e,t,r,i,a){let o=a&&`input`in a?a.input:r.value,s=a?.expected??e.expects??null,c=a?.received??n(o),l={kind:e.kind,type:e.type,input:o,expected:s,received:c,message:`Invalid ${t}: ${s?`Expected ${s} but r`:`R`}eceived ${c}`,requirement:e.requirement,path:a?.path,issues:a?.issues,lang:i.lang,abortEarly:i.abortEarly,abortPipeEarly:i.abortPipeEarly},u=e.kind===`schema`,d=a?.message??e.message??(e.reference,l.lang,void 0)??(u?(l.lang,void 0):null)??i.message??(l.lang,void 0);d!==void 0&&(l.message=typeof d==`function`?d(l):d),u&&(r.typed=!1),r.issues?r.issues.push(l):r.issues=[l]}function i(e,t){return e===t||Number.isNaN(e)&&Number.isNaN(t)}function a(e,t){return Object.prototype.hasOwnProperty.call(e,t)&&t!==`__proto__`&&t!==`prototype`&&t!==`constructor`}function o(e,t){let n=[...new Set(e)];return n.length>1?`(${n.join(` ${t} `)})`:n[0]??`never`}function s(e){return e[`~standard`]={version:1,vendor:`valibot`,validate:n=>e[`~run`]({value:n},t())},e}function c(e){if(e.path){let t=``;for(let n of e.path)if(typeof n.key==`string`||typeof n.key==`number`)t+=t?`.${n.key}`:n.key;else return null;return t}return null}var l=class extends Error{constructor(e){super(e[0].message),this.name=`ValiError`,this.issues=e}};function u(e){return{kind:`metadata`,type:`description`,reference:u,description:e}}var d={abortEarly:!0};function f(e,t,n){return typeof e.fallback==`function`?e.fallback(t,n):e.fallback}function p(e,t,n){return typeof e.default==`function`?e.default(t,n):e.default}function m(e,t){return s({kind:`schema`,type:`array`,reference:m,expects:`Array`,async:!1,item:e,message:t,"~run"(e,t){let n=e.value;if(Array.isArray(n)){e.typed=!0,e.value=[];for(let r=0;r<n.length;r++){let i=n[r],a=this.item[`~run`]({value:i},t);if(a.issues){let o={type:`array`,origin:`value`,input:n,key:r,value:i};for(let t of a.issues)t.path?t.path.unshift(o):t.path=[o],e.issues?.push(t);if(e.issues||=a.issues,t.abortEarly){e.typed=!1;break}}a.typed||(e.typed=!1),e.value.push(a.value)}}else r(this,`type`,e,t);return e}})}function h(e){return s({kind:`schema`,type:`boolean`,reference:h,expects:`boolean`,async:!1,message:e,"~run"(e,t){return typeof e.value==`boolean`?e.typed=!0:r(this,`type`,e,t),e}})}function g(e,t){return s({kind:`schema`,type:`literal`,reference:g,expects:n(e),async:!1,literal:e,message:t,"~run"(e,t){return i(e.value,this.literal)?e.typed=!0:r(this,`type`,e,t),e}})}function _(e,t){return s({kind:`schema`,type:`loose_object`,reference:_,expects:`Object`,async:!1,entries:e,message:t,"~run"(e,t){let n=e.value;if(n&&typeof n==`object`){e.typed=!0,e.value={};for(let i in this.entries){let a=this.entries[i];if(i in n||(a.type===`exact_optional`||a.type===`optional`||a.type===`nullish`)&&a.default!==void 0){let r=i in n?n[i]:p(a),o=a[`~run`]({value:r},t);if(o.issues){let a={type:`object`,origin:`value`,input:n,key:i,value:r};for(let t of o.issues)t.path?t.path.unshift(a):t.path=[a],e.issues?.push(t);if(e.issues||=o.issues,t.abortEarly){e.typed=!1;break}}o.typed||(e.typed=!1),e.value[i]=o.value}else if(a.fallback!==void 0)e.value[i]=f(a);else if(a.type!==`exact_optional`&&a.type!==`optional`&&a.type!==`nullish`&&(r(this,`key`,e,t,{input:void 0,expected:`"${i}"`,path:[{type:`object`,origin:`key`,input:n,key:i,value:n[i]}]}),t.abortEarly))break}if(!e.issues||!t.abortEarly)for(let t in n)a(n,t)&&!Object.prototype.hasOwnProperty.call(this.entries,t)&&(e.value[t]=n[t])}else r(this,`type`,e,t);return e}})}function v(e,t){return s({kind:`schema`,type:`nullable`,reference:v,expects:`(${e.expects} | null)`,async:!1,wrapped:e,default:t,"~run"(e,t){return e.value===null&&(this.default!==void 0&&(e.value=p(this,e,t)),e.value===null)?(e.typed=!0,e):this.wrapped[`~run`](e,t)}})}function y(e){return s({kind:`schema`,type:`number`,reference:y,expects:`number`,async:!1,message:e,"~run"(e,t){return typeof e.value==`number`&&!isNaN(e.value)?e.typed=!0:r(this,`type`,e,t),e}})}function b(e,t){return s({kind:`schema`,type:`object`,reference:b,expects:`Object`,async:!1,entries:e,message:t,"~run"(e,t){let n=e.value;if(n&&typeof n==`object`){e.typed=!0,e.value={};for(let i in this.entries){let a=this.entries[i];if(i in n||(a.type===`exact_optional`||a.type===`optional`||a.type===`nullish`)&&a.default!==void 0){let r=i in n?n[i]:p(a),o=a[`~run`]({value:r},t);if(o.issues){let a={type:`object`,origin:`value`,input:n,key:i,value:r};for(let t of o.issues)t.path?t.path.unshift(a):t.path=[a],e.issues?.push(t);if(e.issues||=o.issues,t.abortEarly){e.typed=!1;break}}o.typed||(e.typed=!1),e.value[i]=o.value}else if(a.fallback!==void 0)e.value[i]=f(a);else if(a.type!==`exact_optional`&&a.type!==`optional`&&a.type!==`nullish`&&(r(this,`key`,e,t,{input:void 0,expected:`"${i}"`,path:[{type:`object`,origin:`key`,input:n,key:i,value:n[i]}]}),t.abortEarly))break}}else r(this,`type`,e,t);return e}})}function x(e,t){return s({kind:`schema`,type:`optional`,reference:x,expects:`(${e.expects} | undefined)`,async:!1,wrapped:e,default:t,"~run"(e,t){return e.value===void 0&&(this.default!==void 0&&(e.value=p(this,e,t)),e.value===void 0)?(e.typed=!0,e):this.wrapped[`~run`](e,t)}})}function S(e,t){return s({kind:`schema`,type:`picklist`,reference:S,expects:o(e.map(n),`|`),async:!1,options:e,message:t,"~run"(e,t){return this.options.includes(e.value)?e.typed=!0:r(this,`type`,e,t),e}})}function C(e){return s({kind:`schema`,type:`string`,reference:C,expects:`string`,async:!1,message:e,"~run"(e,t){return typeof e.value==`string`?e.typed=!0:r(this,`type`,e,t),e}})}function w(e,t,n){return s({kind:`schema`,type:`variant`,reference:w,expects:`Object`,async:!1,key:e,options:t,message:n,"~run"(e,t){let n=e.value;if(n&&typeof n==`object`){let i,a=0,s=this.key,c=[],l=(e,r)=>{for(let o of e.options){if(o.type===`variant`)l(o,new Set(r).add(o.key));else{let e=!0,l=0;for(let t of r){let r=o.entries[t];if(t in n?r[`~run`]({typed:!1,value:n[t]},d).issues:r.type!==`exact_optional`&&r.type!==`optional`&&r.type!==`nullish`){e=!1,s!==t&&(a<l||a===l&&t in n&&!(s in n))&&(a=l,s=t,c=[]),s===t&&c.push(o.entries[t].expects);break}l++}if(e){let e=o[`~run`]({value:n},t);(!i||!i.typed&&e.typed)&&(i=e)}}if(i&&!i.issues)break}};if(l(this,new Set([this.key])),i)return i;r(this,`type`,e,t,{input:n[s],expected:o(c,`|`),path:[{type:`object`,origin:`value`,input:n,key:s,value:n[s]}]})}else r(this,`type`,e,t);return e}})}function T(e,n,r){let i=e[`~run`]({value:n},t(r));if(i.issues)throw new l(i.issues);return i.value}function E(...e){return s({...e[0],pipe:e,"~run"(t,n){for(let r of e)if(r.kind!==`metadata`){if(t.issues&&(r.kind===`schema`||r.kind===`transformation`)){t.typed=!1;break}(!t.issues||!n.abortEarly&&!n.abortPipeEarly)&&(t=r[`~run`](t,n))}return t}})}function D(e,n,r){let i=e[`~run`]({value:n},t(r));return{typed:i.typed,success:!i.issues,output:i.value,issues:i.issues}}function O(e){let t=``;for(let n of e){t&&(t+=`
2
- `),t+=`× ${n.message}`;let e=c(n);e&&(t+=`\n → at ${e}`)}return t}var k=S([`additions`,`deletions`]),A=b({login:C(),avatarUrl:x(C())}),j=b({threads:m(b({rootId:y(),path:C(),side:k,line:x(y()),startLine:x(y()),startSide:x(k),outdated:h(),resolved:x(h()),threadId:x(C()),pending:h(),comments:m(b({id:y(),author:x(A),body:C(),createdAt:C(),url:x(C()),pending:h()}))})),summaries:m(b({id:y(),author:x(A),state:S([`approved`,`changes_requested`,`commented`,`dismissed`]),body:C(),submittedAt:x(C()),url:x(C())})),pendingReview:x(b({id:y(),nodeId:C(),body:C()}))}),M=S([`none`,`rule-based`,`llm`,`web-llm`]),N=S([`ui`,`api`,`core`,`data`,`cli`,`security`,`tests`,`docs`,`examples`,`deps`,`build`,`scripts`,`config`,`i18n`,`assets`,`other`]),P=[`ui: components, views, styles, layout.`,`api: endpoints, handlers, contracts between services or packages, third-party integrations.`,`core: domain/business logic and internal modules; use only when ui/api/data/cli don't fit.`,`data: schemas, migrations, models, queries, storage.`,`cli: command-line entry points, arg parsing, terminal output.`,`security: auth, permissions, secrets handling, input validation.`,`tests: tests, fixtures, snapshots, stories, benchmarks.`,`docs: README, guides, changelog, comment-only edits.`,`examples: examples, playgrounds, demos.`,`deps: dependency bumps, lockfiles.`,`build: bundler/compiler/toolchain config, package manifests.`,`scripts: dev and one-off scripts, automation under bin/ or tools/.`,`config: runtime config, env, feature flags, linter config, CI/CD, deployment, containers, IaC.`,`i18n: translations, locales.`,`assets: images, fonts, static files.`,`other: generated/vendored code or anything that fits nothing above.`].join(` `),F=E(C(),u(`1-2 sentences explaining what a reviewer would otherwise have to work out: non-obvious logic, a subtle behavior change, a risk. Rendered as Markdown.`)),I=x(E(h(),u(`Set only when the reviewer should take extra care here: security, data loss, hard to revert, easy to get wrong.`))),L=b({path:E(C(),u(`A path from this group's filePaths.`)),text:F,critical:I}),R=b({path:E(C(),u(`A path from this group's filePaths.`)),side:E(k,u(`"additions" for a line that is new or unchanged in the new file, "deletions" for a removed line.`)),line:E(y(),u(`Line number as counted in the hunk headers: new-file numbering for "additions", old-file numbering for "deletions".`)),text:F,critical:I}),z=b({key:E(C(),u(`Stable, short, kebab-case-ish id, e.g. "docs" or "feature-a".`)),label:E(C(),u(`Short, human-readable display name for this group.`)),summary:x(E(C(),u(`Concise explanation of the intention of this group (why over what). Rendered as Markdown.`))),category:E(N,u(`Which part of the system this group touches. ${P}`)),filePaths:E(m(C()),u(`File paths belonging directly to this group (not to a child). Every file path given to you MUST end up in exactly one group or child - never both, never omitted.`)),critical:x(E(h(),u(`Set only when the whole group deserves extra reviewer care (security, data loss, hard to revert). Most groups are not critical.`))),fileNotes:x(E(m(L),u(`Optional notes about a whole file. Add one only where it saves the reviewer time; never explain the obvious. Most files need none.`))),lineNotes:x(E(m(R),u(`Optional notes about one specific line. Same bar as fileNotes; prefer a line note when the point is about one spot in the diff.`)))}),B=b({...z.entries,category:x(z.entries.category)});function V(e){return b({...e.entries,children:x(E(m(e),u(`One extra level of nesting, e.g. splitting a large group by sub-area. Children cannot have children of their own.`)))})}var H=V(B),U=b({...b({overallSummary:x(E(C(),u(`Short paragraph summarizing the whole PR for a reviewer, rendered as Markdown.`))),groups:m(H),schemaVersion:y()}).entries,source:M,generatedAt:C(),model:x(C()),sharedBy:x(C()),locale:x(C())});function W(e,t,n){return{...t,source:e,generatedAt:new Date().toISOString(),model:n}}var G=w(`kind`,[b({step:y(),kind:g(`thinking`)}),b({step:y(),kind:g(`reading`),paths:m(C())}),b({step:y(),kind:g(`organizing`)})]),K=b({agent:C(),id:C(),model:x(C())}),q=w(`kind`,[b({kind:g(`github-pr`),owner:C(),repo:C(),number:C()}),b({kind:g(`github-compare`),owner:C(),repo:C(),base:C(),head:C()}),b({kind:g(`github-commit`),owner:C(),repo:C(),sha:C()}),b({kind:g(`paste`),hash:C()}),b({kind:g(`local`),repo:C(),target:C()})]);function J(e){switch(e.kind){case`github-pr`:return`github:${e.owner}/${e.repo}#${e.number}`;case`github-compare`:return`github:${e.owner}/${e.repo}@${e.base}...${e.head}`;case`github-commit`:return`github:${e.owner}/${e.repo}@${e.sha}`;case`paste`:return`paste:${e.hash}`;case`local`:return`local:${encodeURIComponent(e.repo)}@${encodeURIComponent(e.target)}`}}function Y(e){return{githubToken:async()=>e}}export{E as C,w as D,O as E,S,C as T,v as _,G as a,x as b,W as c,j as d,m as f,_ as g,g as h,K as i,V as l,u as m,J as n,U as o,h as p,Y as r,z as s,q as t,A as u,y as v,D as w,T as x,b as y};
2
+ `),t+=`× ${n.message}`;let e=c(n);e&&(t+=`\n → at ${e}`)}return t}var k=S([`additions`,`deletions`]),A=b({login:C(),avatarUrl:x(C())}),j=b({threads:m(b({rootId:y(),path:C(),side:k,line:x(y()),startLine:x(y()),startSide:x(k),outdated:h(),resolved:x(h()),threadId:x(C()),pending:h(),comments:m(b({id:y(),author:x(A),body:C(),createdAt:C(),url:x(C()),pending:h()}))})),summaries:m(b({id:y(),author:x(A),state:S([`approved`,`changes_requested`,`commented`,`dismissed`]),body:C(),submittedAt:x(C()),url:x(C())})),pendingReview:x(b({id:y(),nodeId:C(),body:C()}))}),M=S([`none`,`rule-based`,`llm`,`web-llm`]),N=S([`ui`,`api`,`core`,`data`,`cli`,`security`,`tests`,`docs`,`examples`,`deps`,`build`,`scripts`,`config`,`i18n`,`assets`,`other`]),P=[`ui: components, views, styles, layout.`,`api: endpoints, handlers, contracts between services or packages, third-party integrations.`,`core: domain/business logic and internal modules; use only when ui/api/data/cli don't fit.`,`data: schemas, migrations, models, queries, storage.`,`cli: command-line entry points, arg parsing, terminal output.`,`security: auth, permissions, secrets handling, input validation.`,`tests: tests, fixtures, snapshots, stories, benchmarks.`,`docs: README, guides, changelog, comment-only edits.`,`examples: examples, playgrounds, demos.`,`deps: dependency bumps, lockfiles.`,`build: bundler/compiler/toolchain config, package manifests.`,`scripts: dev and one-off scripts, automation under bin/ or tools/.`,`config: runtime config, env, feature flags, linter config, CI/CD, deployment, containers, IaC.`,`i18n: translations, locales.`,`assets: images, fonts, static files.`,`other: generated/vendored code or anything that fits nothing above.`].join(` `),F=E(C(),u(`1-2 sentences explaining what a reviewer would otherwise have to work out: non-obvious logic, a subtle behavior change, a risk. Rendered as Markdown.`)),I=x(E(h(),u(`Set only when the reviewer should take extra care here: security, data loss, hard to revert, easy to get wrong.`))),L=b({path:E(C(),u(`A path from this group's filePaths.`)),text:F,critical:I}),R=b({path:E(C(),u(`A path from this group's filePaths.`)),side:E(k,u(`"additions" for a line that is new or unchanged in the new file, "deletions" for a removed line.`)),line:E(y(),u(`Line number as counted in the hunk headers: new-file numbering for "additions", old-file numbering for "deletions".`)),text:F,critical:I}),z=b({key:E(C(),u(`Stable, short, kebab-case-ish id, e.g. "docs" or "feature-a".`)),label:E(C(),u(`Short, human-readable display name for this group.`)),summary:x(E(C(),u(`Concise explanation of the intention of this group (why over what). Rendered as Markdown.`))),category:E(N,u(`Which part of the system this group touches. ${P}`)),filePaths:E(m(C()),u(`File paths belonging directly to this group (not to a child). Every file path given to you MUST end up in exactly one group or child - never both, never omitted.`)),critical:x(E(h(),u(`Set only when the whole group deserves extra reviewer care (security, data loss, hard to revert). Most groups are not critical.`))),fileNotes:x(E(m(L),u(`Optional notes about a whole file. Add one only where it saves the reviewer time; never explain the obvious. Most files need none.`))),lineNotes:x(E(m(R),u(`Optional notes about one specific line. Same bar as fileNotes; prefer a line note when the point is about one spot in the diff.`)))}),B=b({...z.entries,category:x(z.entries.category)});function V(e){return b({...e.entries,children:x(E(m(e),u(`Rarely needed; omit by default. One extra level of nesting, only to split a very large group into clearly distinct sub-areas. Children cannot have children of their own.`)))})}var H=V(B),U=b({...b({overallSummary:x(E(C(),u(`Short paragraph summarizing the whole PR for a reviewer, rendered as Markdown.`))),groups:m(H),schemaVersion:y()}).entries,source:M,generatedAt:C(),model:x(C()),sharedBy:x(C()),locale:x(C())});function W(e,t,n){return{...t,source:e,generatedAt:new Date().toISOString(),model:n}}var G=w(`kind`,[b({step:y(),kind:g(`thinking`)}),b({step:y(),kind:g(`reading`),paths:m(C())}),b({step:y(),kind:g(`organizing`)})]),K=b({agent:C(),id:C(),model:x(C())}),q=w(`kind`,[b({kind:g(`github-pr`),owner:C(),repo:C(),number:C()}),b({kind:g(`github-compare`),owner:C(),repo:C(),base:C(),head:C()}),b({kind:g(`github-commit`),owner:C(),repo:C(),sha:C()}),b({kind:g(`paste`),hash:C()}),b({kind:g(`local`),repo:C(),target:C()})]);function J(e){switch(e.kind){case`github-pr`:return`github:${e.owner}/${e.repo}#${e.number}`;case`github-compare`:return`github:${e.owner}/${e.repo}@${e.base}...${e.head}`;case`github-commit`:return`github:${e.owner}/${e.repo}@${e.sha}`;case`paste`:return`paste:${e.hash}`;case`local`:return`local:${encodeURIComponent(e.repo)}@${encodeURIComponent(e.target)}`}}function Y(e){return{githubToken:async()=>e}}export{E as C,w as D,O as E,S,C as T,v as _,G as a,x as b,W as c,j as d,m as f,_ as g,g as h,K as i,V as l,u as m,J as n,U as o,h as p,Y as r,z as s,q as t,A as u,y as v,D as w,T as x,b as y};
@@ -1 +1 @@
1
- import{$ as e,Bt as t,Dr as n,K as r,Pt as i,Q as a,Wn as o,er as s,tt as c,yn as l}from"./vue-i18n-CGHHpbTP.js";import{n as u}from"./source-Dk1PNoY7.js";import{a as d,i as f}from"./analyze-CTcNbJBk.js";import{t as p}from"./useDocumentTitle-ByFCALbG.js";import{n as m,t as h}from"./diffs-store-CzecLzBW.js";import{r as g,t as _}from"./patch-parser-k3Vbbmi0.js";import{d as v,s as y}from"./index-DP4XBqUv.js";import{t as b}from"./ActionButton-V4dY2wPS.js";import{t as x}from"./uploadSession-BUj4FNau.js";function S(e,t){let n=_(e);return{key:async()=>u({kind:`paste`,hash:await n}),async fetch(){return{ref:{kind:`paste`,hash:await n},title:t??`Pasted diff`,description:``,files:await g(e)}}}}var C=c({__name:`upload`,setup(c){let u=y(),{cache:g,llm:_}=v(),C=o(!1),w=(()=>{let e=sessionStorage.getItem(x);if(e)return JSON.parse(e)})(),T=w?h(S(w.text,w.title),{cache:g,llm:_}):void 0;p(()=>T?.diff?.title);async function E(){if(!T){C.value=!1;return}C.value=!0,await T.load()}return i(E),(i,o)=>(t(),r(`main`,null,[e(m,{store:s(T)},{loading:l(()=>[e(f,{text:i.$t(`load.parsing`)},null,8,[`text`])]),error:l(({error:t})=>[e(d,{icon:`i-ph:warning-duotone`,title:i.$t(`load.parseFailed`)},{hint:l(()=>[a(n(t.message),1)]),_:2},1032,[`title`])]),empty:l(()=>[e(d,{icon:`i-ph:upload-simple-duotone`,title:i.$t(`load.noDiff`)},{hint:l(()=>[a(n(i.$t(`load.noDiffHint`)),1)]),actions:l(()=>[e(b,{variant:`primary`,onClick:o[0]||=e=>s(u).push(`/`)},{default:l(()=>[a(n(i.$t(`load.goHome`)),1)]),_:1})]),_:1},8,[`title`])]),_:1},8,[`store`])]))}});export{C as default};
1
+ import{$ as e,Bt as t,Dr as n,K as r,Pt as i,Q as a,Wn as o,er as s,tt as c,yn as l}from"./vue-i18n-CGHHpbTP.js";import{n as u}from"./source-CvnvCX42.js";import{a as d,i as f}from"./analyze-BgWIIbl3.js";import{t as p}from"./useDocumentTitle-BQJCa6Lm.js";import{n as m,t as h}from"./diffs-store-D3BzIMVi.js";import{r as g,t as _}from"./patch-parser-k3Vbbmi0.js";import{d as v,s as y}from"./index-KDAJXf4E.js";import{t as b}from"./ActionButton-V4dY2wPS.js";import{t as x}from"./uploadSession-BUj4FNau.js";function S(e,t){let n=_(e);return{key:async()=>u({kind:`paste`,hash:await n}),async fetch(){return{ref:{kind:`paste`,hash:await n},title:t??`Pasted diff`,description:``,files:await g(e)}}}}var C=c({__name:`upload`,setup(c){let u=y(),{cache:g,llm:_}=v(),C=o(!1),w=(()=>{let e=sessionStorage.getItem(x);if(e)return JSON.parse(e)})(),T=w?h(S(w.text,w.title),{cache:g,llm:_}):void 0;p(()=>T?.diff?.title);async function E(){if(!T){C.value=!1;return}C.value=!0,await T.load()}return i(E),(i,o)=>(t(),r(`main`,null,[e(m,{store:s(T)},{loading:l(()=>[e(f,{text:i.$t(`load.parsing`)},null,8,[`text`])]),error:l(({error:t})=>[e(d,{icon:`i-ph:warning-duotone`,title:i.$t(`load.parseFailed`)},{hint:l(()=>[a(n(t.message),1)]),_:2},1032,[`title`])]),empty:l(()=>[e(d,{icon:`i-ph:upload-simple-duotone`,title:i.$t(`load.noDiff`)},{hint:l(()=>[a(n(i.$t(`load.noDiffHint`)),1)]),actions:l(()=>[e(b,{variant:`primary`,onClick:o[0]||=e=>s(u).push(`/`)},{default:l(()=>[a(n(i.$t(`load.goHome`)),1)]),_:1})]),_:1},8,[`title`])]),_:1},8,[`store`])]))}});export{C as default};