Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.31.0 · метрики 2.5.0 · 2026-08-05 08:48 UTC

raciott / Orvion

Orvion 是一款多提供商 LLM 网关(Go + Gin),兼容 OpenAI / Anthropic / Gemini 协议,内置 WebUI 管理与监控,支持多模型聚合、统一鉴权、费用统计、健康检测与价格同步。

Go · TypeScriptMIT★ 15 зірок⑂ 6 форківз груд. 2025 р.Переглянути на GitHub ↗
ТипМережевий сервісВебінтерфейсяк це визначено

raciott/Orvion має індекс здоров’я 51 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (85/100), найнижчий — Sustainability & Governance (15/100). Останнє оновлення було 3 дні тому. Більшість нещодавньої роботи виконує один учасник.

51
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє зважене середнє, відкаліброване за розподілом публічного реєстру, тож діапазони мають перцентильний зміст; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 34 («У зоні ризику»).

51
Винятковий93-100Верхній щабель реєстру (≈ топ-5%); відповідає практично всім перевіреним критеріям
Відмінний80-92Сильний за всіма напрямами; незначні прогалини
Добрий65-79Здоровий; прогалини обмежені та керовані
Помірний50-64Прийнятний, але з помітними прогалинами; рекомендовано перевірку
Слабкий35-49Суттєві недоліки в кількох сферах
У зоні ризику20-34Суттєві слабкі місця; впровадження потребує обережності
Критичний1-19Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Зважений загальний бал 51 калібровано до 51 за шкалою опублікованого індексу (калібрування реєстру 2026-08-02).

Власність

racioОсобистий обліковий запис
0 підписників8 публічних репозиторіївз груд. 2022 р.South China Agricultural University

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

85Відмінний · 21% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 3 дн. тому
18.7/36Ритм комітів — 27/52 тижнів із комітами
18/18Обсяг комітів — 104 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year104
human_commit_share1
days_since_last_push3
active_weeks_last_year27
Як обчислюється оцінка
16.2/27Випускає релізи — 83 тегів версій (без релізів GitHub)
36/36Свіжість релізів — останній реліз 3 дн. тому
27/27Ритм релізів — реліз кожні ~2,1 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count83
latest_release_tagv1.3.7
releases_from_tagsтак
days_since_latest_release3
mean_days_between_releases2,1
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

36Слабкий · 17% загального індексу
Як обчислюється оцінка
18.6/60Зірки — 15 зірок
5.8/25Форки — 6 форків
0/15Спостерігачі — 1 спостерігачів
Використані вхідні дані
forks6
stars15
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
readme_badges0
has_contributingні
has_issue_templateні
has_code_of_conductні
readme_badge_services
has_pull_request_templateні

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

15Критичний · 23% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
1.4/13.5Широта контриб’юторів — 1 контриб’юторів
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Використані вхідні дані
bus_factor1
contributors_sampled1
top_contributor_share1
Як обчислюється оцінка
0/42Вирішення issue — немає issue або даних
0/30Прийняття PR — немає вирішених pull request-ів або даних
0/13Newcomer PR acceptance — за 30 дн. не вирішено жодного PR від новачка
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs0
open_issues0
closed_issues0
prs_merged_7d0
prs_decided_7d0
prs_merged_30d0
prs_decided_30d0
issue_closed_ratio
closed_unmerged_prs0
first_time_authors_30d0
first_time_prs_merged_30d0
first_time_prs_decided_30d0
Виключено з оцінювання (немає даних або не застосовно): Вирішення issue, Прийняття PR, newcomer_pr_acceptance. Залишкові ваги перенормовано.

Власність та опіка

30У зоні ризику
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
0/25Охоплення власника — 0 підписників у raciott
14.3/25Послужний список — 8 публічних репозиторіїв, вік облікового запису ~3 р.
Використані вхідні дані
followers0
owner_typeUser
is_verified
owner_loginraciott
public_repos8
account_age_days1 334
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Інженерна якість

Чи наявні базові інженерні практики та документація?

74Добрий · 19% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 1 процес(ів) CI
24/24Наявні тести
16/16Конфігурація лінтера — eslint.config.js
0/9.6Pre-commit-хуки
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — немає даних
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configтак
has_precommit_configні
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: CI-Tests. Залишкові ваги перенормовано.
Як обчислюється оцінка
30/30README
0/25Каталог документації
15/15Сайт документації / домашня сторінка — https://mork.de5.net
10/10Опис репозиторію
0/10Теми
10/10Wiki
Використані вхідні дані
topics
has_wikiтак
homepagehttps://mork.de5.net
has_readmeтак
has_docs_dirні
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

42Слабкий · 16% загального індексу

Стан безпеки

42Слабкий
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — немає даних
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — немає даних
6.8/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 68 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,2
Виключено з оцінювання (немає даних або не застосовно): ci_tests, signed_releases. Залишкові ваги перенормовано.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Має свідомо малу вагу (4%): агентний інструментарій — реальний сигнал супроводу, але репозиторій без нього все одно може отримати 100/100.

81Відмінний · 4% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 84 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,84
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes7 529
Як обчислюється оцінка
18/18Розгортання однією командою — makefile
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — eslint.config.js
11/11Статична перевірка типів — webui/tsconfig.json
10/10Відтворюване середовище — Dockerfile, lockfile
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfilesgo.sum, package-lock.json
has_dockerfileтак
typed_languageтак
bootstrap_filesmakefile
has_devcontainerні
has_linter_configтак
typecheck_configswebui/tsconfig.json
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — Go (статично типізована)
54.1/55Керовані розміри файлів — 4/239 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGo
largest_source_bytes84 336
source_files_sampled239
oversized_source_files4

Ключові факти

15зірок GitHub
1контриб'юторів
104комітів за останні 12 місяців
3днів від останнього пушу
83релізів
1бас-фактор
0відкритих issue
Go, npmпакетних екосистем

Попередження щодо збору даних

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Could not fetch go package 'github.com/racio/orvion' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Докладніше

Історія зірок і форків 0 ★ / 6 ⇿
0Зірки
6Форки
31Релізи

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

123456612026-022026-042026-06
Мажорні 0Мінорні 3Патчі 28
OpenSSF Scorecard 4.2 / 10
4.2сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-08-05 08:48 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
н/дCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
9Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities68 existing vulnerabilities detected
Прямі залежності 45
РеєстрПакетОбмеження версіїМаніфест
Gogithub.com/gin-contrib/gzipv1.2.5go.mod
Gogithub.com/gin-gonic/ginv1.11.0go.mod
Gogithub.com/glebarez/sqlitev1.11.0go.mod
Gogithub.com/joho/godotenvv1.5.1go.mod
Gogithub.com/samber/lov1.52.0go.mod
Gogithub.com/tidwall/gjsonv1.18.0go.mod
Gogithub.com/tidwall/sjsonv1.2.5go.mod
Gogithub.com/tiktoken-go/tokenizerv0.7.0go.mod
Gogolang.org/x/crypto/x509roots/fallbackv0.0.0-20251210140736-7dacc380ba00go.mod
Gogolang.org/x/netv0.46.0go.mod
Gogolang.org/x/syncv0.17.0go.mod
Gogorm.io/driver/mysqlv1.6.0go.mod
Gogorm.io/gormv1.31.1go.mod
npm@hookform/resolvers^5.2.1webui/package.json
npm@microsoft/fetch-event-source^2.0.1webui/package.json
npm@radix-ui/react-alert-dialog^1.1.14webui/package.json
npm@radix-ui/react-checkbox^1.3.2webui/package.json
npm@radix-ui/react-dialog^1.1.14webui/package.json
npm@radix-ui/react-label^2.1.7webui/package.json
npm@radix-ui/react-popover^1.1.15webui/package.json
npm@radix-ui/react-select^2.2.5webui/package.json
npm@radix-ui/react-slot^1.2.3webui/package.json
npm@radix-ui/react-switch^1.2.5webui/package.json
npm@radix-ui/react-tooltip^1.2.8webui/package.json
npm@tailwindcss/vite^4.1.11webui/package.json
npm@tanstack/react-virtual^3.11.0webui/package.json
npm@types/react-syntax-highlighter^15.5.13webui/package.json
npmclass-variance-authority^0.7.1webui/package.json
npmclsx^2.1.1webui/package.json
npmdate-fns^4.1.0webui/package.json
npmlucide-react^0.534.0webui/package.json
npmnext-themes^0.4.6webui/package.json
npmreact^19.1.0webui/package.json
npmreact-day-picker^9.12.0webui/package.json
npmreact-dom^19.1.0webui/package.json
npmreact-hook-form^7.62.0webui/package.json
npmreact-icons^5.5.0webui/package.json
npmreact-markdown^9.0.1webui/package.json
npmreact-router-dom^7.7.1webui/package.json
npmreact-syntax-highlighter^15.5.0webui/package.json
npmremark-gfm^4.0.0webui/package.json
npmsonner^2.0.7webui/package.json
npmtailwind-merge^3.3.1webui/package.json
npmtailwindcss^4.1.11webui/package.json
npmzod^4.0.14webui/package.json
Усі залежності не зібрано

Не вдалося зібрати розв'язаний набір залежностей для цього звіту: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Звіт у форматі JSON машиночитний
{
  "data": {
    "icon": {
      "bytes": 11275,
      "width": 256,
      "height": 256,
      "rejected": [],
      "collected": true,
      "media_type": "image/jpeg",
      "source_url": "https://avatars.githubusercontent.com/u/120193671?v=4&s=256",
      "source_type": "avatar",
      "content_hash": "110574583f1be834deb94fe4410af520e1575ce2bed16f2d04c25f0706bdd5fd",
      "candidates_considered": 1
    },
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 81449,
      "has_wiki": true,
      "homepage": "https://mork.de5.net",
      "languages": {
        "Go": 1415137,
        "CSS": 8850,
        "HTML": 803,
        "Makefile": 271,
        "Dockerfile": 1918,
        "JavaScript": 610,
        "TypeScript": 815598
      },
      "pushed_at": "2026-08-01T14:03:45Z",
      "created_at": "2025-12-28T15:10:12Z",
      "owner_type": "User",
      "updated_at": "2026-08-01T14:03:55Z",
      "description": " Orvion 是一款多提供商 LLM 网关(Go + Gin),兼容 OpenAI / Anthropic / Gemini 协议,内置 WebUI 管理与监控,支持多模型聚合、统一鉴权、费用统计、健康检测与价格同步。",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go",
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "https://scau.edu.cn/",
      "name": "racio",
      "type": "User",
      "login": "raciott",
      "company": "South China Agricultural University",
      "location": "Guangzhou, Guangdong Province, China",
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/120193671?v=4",
      "created_at": "2022-12-09T14:37:18Z",
      "is_verified": null,
      "public_repos": 8,
      "account_age_days": 1334
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.3.7",
          "kind": "patch",
          "published_at": "2026-08-01T14:03:29Z"
        },
        {
          "tag": "v1.3.6",
          "kind": "patch",
          "published_at": "2026-08-01T08:38:03Z"
        },
        {
          "tag": "v1.3.5",
          "kind": "patch",
          "published_at": "2026-07-31T16:25:33Z"
        },
        {
          "tag": "v1.3.4",
          "kind": "patch",
          "published_at": "2026-07-29T13:48:32Z"
        },
        {
          "tag": "v1.3.3",
          "kind": "patch",
          "published_at": "2026-07-21T12:46:40Z"
        },
        {
          "tag": "v1.3.2",
          "kind": "patch",
          "published_at": "2026-07-15T07:48:50Z"
        },
        {
          "tag": "v1.3.1",
          "kind": "patch",
          "published_at": "2026-07-14T09:42:20Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-07-14T03:56:46Z"
        },
        {
          "tag": "v1.2.9",
          "kind": "patch",
          "published_at": "2026-07-14T03:19:46Z"
        },
        {
          "tag": "v1.2.8",
          "kind": "patch",
          "published_at": "2026-07-13T17:07:41Z"
        },
        {
          "tag": "v1.2.7",
          "kind": "patch",
          "published_at": "2026-07-13T15:00:48Z"
        },
        {
          "tag": "v1.2.6",
          "kind": "patch",
          "published_at": "2026-07-13T04:33:07Z"
        },
        {
          "tag": "v1.2.5",
          "kind": "patch",
          "published_at": "2026-07-11T15:49:53Z"
        },
        {
          "tag": "v1.2.4",
          "kind": "patch",
          "published_at": "2026-07-10T08:33:53Z"
        },
        {
          "tag": "v1.2.3",
          "kind": "patch",
          "published_at": "2026-07-09T19:28:07Z"
        },
        {
          "tag": "v1.2.2",
          "kind": "patch",
          "published_at": "2026-07-08T12:08:08Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2026-07-08T04:05:21Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-07-06T12:32:07Z"
        },
        {
          "tag": "v1.1.9",
          "kind": "patch",
          "published_at": "2026-07-06T07:21:58Z"
        },
        {
          "tag": "v1.1.8",
          "kind": "patch",
          "published_at": "2026-07-05T05:03:22Z"
        },
        {
          "tag": "v1.1.7",
          "kind": "patch",
          "published_at": "2026-07-04T12:36:19Z"
        },
        {
          "tag": "v1.1.6",
          "kind": "patch",
          "published_at": "2026-07-03T07:17:55Z"
        },
        {
          "tag": "v1.1.5",
          "kind": "patch",
          "published_at": "2026-07-02T12:26:28Z"
        },
        {
          "tag": "v1.1.4",
          "kind": "patch",
          "published_at": "2026-06-30T14:57:55Z"
        },
        {
          "tag": "v1.1.3",
          "kind": "patch",
          "published_at": "2026-06-30T12:31:50Z"
        },
        {
          "tag": "v1.1.2",
          "kind": "patch",
          "published_at": "2026-06-29T06:22:07Z"
        },
        {
          "tag": "v1.1.1",
          "kind": "patch",
          "published_at": "2026-06-27T15:14:19Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-06-27T06:28:22Z"
        },
        {
          "tag": "v1.0.9",
          "kind": "patch",
          "published_at": "2026-06-26T17:48:36Z"
        },
        {
          "tag": "v1.0.8",
          "kind": "patch",
          "published_at": "2026-06-22T04:09:50Z"
        },
        {
          "tag": "v1.0.7",
          "kind": "patch",
          "published_at": "2026-06-20T12:29:47Z"
        },
        {
          "tag": "v1.0.6",
          "kind": "patch",
          "published_at": "2026-06-19T18:34:42Z"
        },
        {
          "tag": "v1.0.5",
          "kind": "patch",
          "published_at": "2026-06-19T07:32:09Z"
        },
        {
          "tag": "v1.0.4",
          "kind": "patch",
          "published_at": "2026-06-18T12:59:09Z"
        },
        {
          "tag": "v1.0.3",
          "kind": "patch",
          "published_at": "2026-06-17T17:39:05Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2026-06-17T16:33:23Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-06-16T17:41:18Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-06-15T08:45:32Z"
        },
        {
          "tag": "v0.9.9",
          "kind": "patch",
          "published_at": "2026-06-14T13:06:56Z"
        },
        {
          "tag": "v0.9.8",
          "kind": "patch",
          "published_at": "2026-06-13T08:08:58Z"
        },
        {
          "tag": "v0.9.7",
          "kind": "patch",
          "published_at": "2026-06-10T16:36:48Z"
        },
        {
          "tag": "v0.9.6",
          "kind": "patch",
          "published_at": "2026-06-08T09:50:21Z"
        },
        {
          "tag": "v0.9.5",
          "kind": "patch",
          "published_at": "2026-06-07T12:37:52Z"
        },
        {
          "tag": "v0.9.4",
          "kind": "patch",
          "published_at": "2026-06-06T15:15:45Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2026-06-05T11:37:08Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-06-04T07:49:49Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-05-29T06:29:53Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-05-27T13:35:10Z"
        },
        {
          "tag": "v0.8.9",
          "kind": "patch",
          "published_at": "2026-05-25T15:51:48Z"
        },
        {
          "tag": "v0.8.8",
          "kind": "patch",
          "published_at": "2026-05-13T12:17:01Z"
        },
        {
          "tag": "v0.8.7",
          "kind": "patch",
          "published_at": "2026-05-10T17:14:37Z"
        },
        {
          "tag": "v0.8.6",
          "kind": "patch",
          "published_at": "2026-05-05T15:52:36Z"
        },
        {
          "tag": "v0.8.5",
          "kind": "patch",
          "published_at": "2026-04-29T13:07:18Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2026-04-19T09:47:14Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-04-19T03:33:02Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-04-19T01:55:09Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-04-18T17:24:14Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-04-17T13:21:11Z"
        },
        {
          "tag": "v0.7.9",
          "kind": "patch",
          "published_at": "2026-04-17T12:17:38Z"
        },
        {
          "tag": "v0.7.8",
          "kind": "patch",
          "published_at": "2026-03-28T15:02:12Z"
        },
        {
          "tag": "v0.7.7",
          "kind": "patch",
          "published_at": "2026-03-19T04:52:01Z"
        },
        {
          "tag": "v0.7.6",
          "kind": "patch",
          "published_at": "2026-03-19T03:21:44Z"
        },
        {
          "tag": "v0.7.5",
          "kind": "patch",
          "published_at": "2026-03-17T10:06:08Z"
        },
        {
          "tag": "v0.7.4",
          "kind": "patch",
          "published_at": "2026-03-17T09:40:23Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2026-03-17T05:02:54Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-03-16T15:58:52Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-03-04T07:19:50Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-03-04T05:18:07Z"
        },
        {
          "tag": "v0.6.9",
          "kind": "patch",
          "published_at": "2026-03-03T08:12:15Z"
        },
        {
          "tag": "v0.6.8",
          "kind": "patch",
          "published_at": "2026-02-16T12:53:13Z"
        },
        {
          "tag": "v0.6.7",
          "kind": "patch",
          "published_at": "2026-02-12T14:01:13Z"
        },
        {
          "tag": "v0.6.6",
          "kind": "patch",
          "published_at": "2026-02-12T12:41:53Z"
        },
        {
          "tag": "v0.6.5",
          "kind": "patch",
          "published_at": "2026-02-10T02:16:28Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2026-02-07T17:02:57Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-02-07T14:07:09Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-02-07T13:05:20Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-02-07T13:01:29Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-02-03T16:54:24Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-02-02T15:49:05Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-02-01T12:35:15Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-02-01T11:39:24Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-02-01T10:51:33Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-02-01T10:05:13Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "954c5cde9c55d5e1e1aed59a70753f8a984ebc46",
          "body": "- 移除现有视频生成接口及相关前后端代码\n- 新增 HTTP 和 SOCKS5 代理节点管理\n- 支持提供商选择代理并兼容旧版配置\n- 新增代理地区检查及结果持久化\n- 支持按当天、当周和当月查看模型用量\n- 修复错误日志详情弹窗高度异常\n- 移除提供商配置动态添加字段功能\n- 补充代理、地区、时间范围和日志聚合测试\n\nBREAKING CHANGE: /v1/videos 视频生成接口已移除,后续将使用新实现替代",
          "is_bot": false,
          "headline": "feat(gateway)!: 重构媒体能力并完善代理和用量管理",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-08-01T14:03:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b40f74e7cd6565f5c1d6fad7aac18e2e971bf2f",
          "body": "- 移除现有视频生成接口、轮询逻辑、能力声明及前端入口\n- 新增 HTTP 和 SOCKS5 代理节点管理\n- 支持提供商选择代理节点并兼容旧版代理配置\n- 新增代理使用统计、占用保护和地区检查\n- 优化代理选择器及侧边栏导航\n- 补充代理关联、协议校验、唯一性和地区解析测试\n\nBREAKING CHANGE: /v1/videos 视频生成接口已移除,后续将使用新实现替代",
          "is_bot": false,
          "headline": "feat(gateway)!: 重构媒体能力并新增代理节点管理",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-08-01T08:38:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4c887d375047f24c2c975235ca8a5aa9f11ad29",
          "body": "- 将中文字体由 TTF 转换为 WOFF2,移除未使用字体资源\n- 新增统一字体加载器,仅在用户选择后按需加载对应字体\n- 将日志详情页改为摘要优先,支持按需加载完整 IO 内容\n- 拆分日志解析、Markdown 渲染和 JSON 高亮组件\n- 使用虚拟列表渲染超大文本,并对长 Markdown 分段展示\n- 改用 PrismLight 且仅注册 JSON,显著缩减高亮器体积\n- 将 handler/admin/api.go 按配置、日志、模型、模型关联和提供商拆分\n- 修复月表测试缓存未完整清理的问题\n- 修复月底 AddDate 归一化导致的月表测试不稳定\n\n前端日志路由 chunk 从约 663 KB 降至 3 KB,\n按需 JSON 高亮 chunk 降至约 56 KB。",
          "is_bot": false,
          "headline": "refactor(core): 优化资源加载并拆分管理模块",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-31T16:25:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "101b33675fed4df7f10edba7106499d6d0da294f",
          "body": "- 识别 MarkdownV2 转义后的“正在思考...”占位文本\n- 保持思考占位消息的原始内容和长度,不再追加宽度填充\n- 补充 MarkdownV2 思考占位消息的回归测试",
          "is_bot": false,
          "headline": "fix(tg-agent): 避免思考占位消息被宽度填充",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-29T13:48:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72a764780329829ca4bd1b1da599b0bf2bd9a662",
          "body": "- 压缩提供商背景图并启用静态资源长期缓存",
          "is_bot": false,
          "headline": "feat(version): 连续直连失败后强制使用代理检查更新",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-21T12:46:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "821c951606745bf30c0a6cb063047758cd53f803",
          "body": "- 引入 Pikachu 宠物配置与完整精灵图集\n- 从图集中提取轻量化左右奔跑动画资源\n- 在桌面端顶部导航栏添加往返巡游效果\n- 根据移动方向自动切换左右奔跑帧\n- 将移动速度调整为初始速度的 0.75 倍\n- 左侧起点与系统概览内容区域动态对齐\n- 侧边栏展开或收起时同步调整巡游范围\n- 收窄右侧边界,避免精灵与版本区域重叠\n- 在小屏设备隐藏动画,防止遮挡导航操作\n- 遵循减少动态效果偏好并自动禁用动画",
          "is_bot": false,
          "headline": "feat(webui): 在顶部导航栏添加皮卡丘巡游动画",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-15T07:48:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33fc6505293fb74dafd1a81dc283c89bd37c4c1b",
          "body": "- 将 Chat、Responses 和 Claude Messages 的文本流改为增量转换\n- 收到上游文本 delta 后立即输出,不再等待完整响应结束\n- 保持工具参数完整聚合,避免跨协议分片破坏 JSON\n- 补充 Responses 文本内容项的流式生命周期事件\n- 补充 Claude message 和 content block 流式生命周期事件\n- 修复 Responses 文本与工具混合时 output_index 冲突\n- 修复流式响应结束事件和最终输出列表不一致的问题\n- 修复 Messages stop_sequences 到 Chat stop 的字段映射\n- 补充\n[…]\n明确错误\n- 无法转换未知 Claude 内容块时返回明确错误\n- SSE 事件 JSON 损坏时返回转换错误,不再静默跳过\n- 补充真实流式首包及时输出测试\n- 补充停止序列和最大 Token 字段转换测试\n- 补充结构化输出与工具选择转换测试\n- 补充 Claude thinking 隐藏测试\n- 补充工具停止原因与缓存 Usage 保真测试\n- 更新流式测试以验证分片文本按 delta 输出",
          "is_bot": false,
          "headline": "fix(ifacebridge): 完善三类接口转换并实现真实流式输出",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-14T09:42:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c9fe79073dca6758b6edc9bf617b50c227855da7",
          "body": "- 将 GitHub 版本后台检查周期由 1 分钟调整为 5 分钟\n- 保留服务启动时立即执行一次版本检查的行为\n- 保持版本接口仅返回内存缓存,不额外触发外部请求\n- 同步更新版本检查后台任务的周期注释\n- 增加版本检查周期测试,防止刷新频率意外回退\n- 在 TG 告警配置的 Bot Token 输入框中添加显示和隐藏按钮\n- Bot Token 默认继续使用密码形式隐藏\n- 点击眼睛图标后显示 Bot Token 实际内容\n- 再次点击后恢复隐藏状态\n- 为显示切换按钮添加动态提示和无障碍标签\n- Bot Token 与 TG Agent API Key 使用独立的显示状态\n- 调整输入框右侧留白,避免 Token 内容与切换按钮重叠",
          "is_bot": false,
          "headline": "feat(config): 优化版本检查周期与 TG Token 显示交互",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-14T03:56:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4cdf981bf24e0c7d8eb19897c0dabbcfc1cf55c",
          "body": "- 将网络转发配置中的“TG 代理”统一更名为“全局代理”\n- 将代理配置字段由 telegram_proxy_url 调整为 global_proxy_url\n- 兼容读取旧版 telegram_proxy_url 配置,避免已有代理配置失效\n- 新配置保存时统一使用 global_proxy_url 字段\n- 新增 EffectiveProxyURL 方法,统一解析新旧代理字段\n- 将网络转发配置加载方法导出供其他模块复用\n- 在数据库未初始化时安全返回空代理配置\n- Telegram Bot 长轮询改为使用全局代理\n- Telegram 熔断告警改为使用全局代理\n- Telegram 状\n[…]\n后自动使用全局代理\n- 代理获取成功后正常更新内存版本缓存\n- 代理也失败时合并记录直连和代理错误\n- 直连成功时不触发全局代理请求\n- 版本检查代理支持 HTTP、HTTPS 和 SOCKS5\n- 移除 GITHUB_HTTP_PROXY 环境变量及相关配置说明\n- 补充全局代理与旧 TG 代理字段兼容测试\n- 补充版本检查直连成功时不使用代理的测试\n- 补充版本检查直连失败后通过代理获取的测试",
          "is_bot": false,
          "headline": "feat(proxy): 将 TG 代理升级为全局代理并用于版本检查降级",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-14T03:19:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a4d1080e07fd5d8291bc24d0f775f73c2d7cfcdc",
          "body": "- 将 /api/version 移至公开路由,允许无需管理员令牌获取当前版本\n- 保持其他管理接口继续使用 TOKEN 鉴权\n- 将 GitHub 更新检查切换到 Cloudflare Worker 版本接口\n- 适配 latest.tag、title、description、message 和 published_at 字段\n- 适配 commit_sha、commit_url 和 source_url 更新信息字段\n- 优先使用 description 作为版本更新说明\n- 优先使用 source_url 作为版本详情链接\n- 在更新字段缺失时回退到提交信息和 GitHub 标签链接\n-\n[…]\n轮候选\n- 自动切换到其他已启用且尚未失败的提供商\n- 其他提供商成功时直接返回正常响应\n- 所有候选提供商失败后保留最后的上游状态码\n- 候选耗尽后再决定进入回退模型或返回原始错误\n- 保持 429 降权以及 5xx 当前提供商重试逻辑不变\n- 补充 Worker 响应解析和版本比较测试\n- 补充首个提供商返回 400 后切换成功的回归测试\n- 补充所有提供商均返回 400 时保留错误状态的测试",
          "is_bot": false,
          "headline": "fix(gateway): 优化版本检查并修复 4xx 提供商切换",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-13T17:07:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "70d877379cc91a90831b4ace979f8c6f395c26f8",
          "body": "- 新增 ORVION_ENV 配置,production/prod 模式下 TOKEN 为空时拒绝启动\n- 补充启动安全校验测试,并同步 README 与 .env.example\n- 移除缓冲区满时可能丢弃响应片段的 asyncMirrorWriter\n- 使用权限为 0600 的临时文件完整暂存上游响应\n- 响应完成后异步解析 Usage、IO 日志、Token 消耗与费用\n- 暂存处理完成后自动清理文件,并保留上游中断前已捕获的数据\n- 响应暂存失败时明确标记日志不完整,避免静默低估 Token 和费用\n- 完善 Telegram MarkdownV2 的反斜杠转义与 Unicode \n[…]\naption 失败后依次回退为 Markdown 文本和纯文本\n- 图片 caption 按 UTF-16 长度安全截断,避免破坏 emoji 和 UTF-8\n- 移除所有 Telegram 图片 caption 的宽度填充\n- 移除“正在思考...”占位消息的宽度填充\n- 微调 TG 系统状态中“启用提供方”的列间距\n- 补充响应暂存、MarkdownV2、长消息分片及 caption 边界测试",
          "is_bot": false,
          "headline": "feat(core): 强化生产安全、响应日志与 TG MarkdownV2 处理",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-13T15:00:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8e3abcf4fd8efb5a69de2f4b737e3368df83acfd",
          "body": "- 规则引擎弹窗立即显示已保存的 AI 规则模型和生图模型\n- 模型列表尚未加载时保留当前选中值,避免选择框显示占位内容\n- 下拉框展开后继续自动刷新可用模型列表\n- 移除 TG Agent 图片 caption 的宽度填充和底部空白行\n- 移除昨日使用小报 caption 下方的空白填充行\n- 生图成功后删除“正在生成图片”占位消息\n- 不再额外发送“图片已生成”文本消息\n- 生图失败时保留原占位消息并更新失败状态\n- 对话与生图 API 全部失败时隐藏上游错误详情\n- 统一向 TG 返回“ai接口调用出错,请到https://mork.de5.net中查看问题”\n- 服务端日志继续记录完整上游错误,便于排查\n- 将系统状态中的“启用提供方”列向右移动两格\n- 补充 Telegram 状态列偏移回归测试",
          "is_bot": false,
          "headline": "fix(tg-agent): 优化模型显示、生图消息与状态排版",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-13T04:33:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2fd1d40c7ac5c8abfc3cdbcc9032d841907378e",
          "body": "- 优化本地生图意图识别规则,排除 Skills、技术讨论、否定请求及故障排查等误触发场景\n- 新增规则引擎详细配置弹窗\n- 支持在本地规则引擎与 AI 规则引擎之间切换\n- 支持为 AI 规则引擎选择独立模型\n- AI 意图分类失败时自动回退本地规则引擎\n- 将生图模型配置迁移至规则引擎详细弹窗\n- 规则引擎关闭时禁用详细配置按钮\n- 点击模型选择框时自动加载模型列表\n- 统一 TG Agent 配置卡片中开关与按钮的布局宽度\n- 移除 TG Agent 生图结果 caption 的宽度填充及多余空行\n- 补充规则引擎配置合并和意图识别回归测试",
          "is_bot": false,
          "headline": "feat(tg-agent): 完善规则引擎配置与生图消息展示",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-11T15:49:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c6f5774affa7ab76e95a04ce737c81395a33f10",
          "body": "- 添加提供商管理页 anime 背景图资源\n- 将背景挂载到外层内容区域并设置小圆角裁剪\n- 调整标题配色、卡片透明度与背景显示比例\n- 支持点击提供商卡片直接打开编辑弹窗\n- 保留卡片内按钮的独立点击行为",
          "is_bot": false,
          "headline": "feat(providers): 优化提供商管理页背景与卡片交互",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-10T08:33:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d520ccd8cf89da94f34f547b2f7d74a848e5578",
          "body": "- 修正 Lottery 降权选择逻辑,优先跳过已降权提供商并补充回归测试\n- 优化请求日志列表 COUNT 查询,使用轻量列集减少跨月日志扫描开销\n- 请求日志页默认按近 7 天加载,并增加今天、7 天、30 天、全部历史筛选\n- 为异步响应镜像写入器增加丢弃字节告警,便于排查日志不完整问题\n- 限制 Provider API Key 轮询计数器缓存,并使用哈希键避免暴露原始 Key\n- Provider 表单支持快捷选择网络转发代理地址\n- 调整 WebUI 全局主题、基础控件、侧边栏、登录弹窗和页面布局细节\n- 修复日志详情输出数组拼接判断,并完善模型列表网格样式类型\n- 添加 AGENTS.md 仓库协作说明",
          "is_bot": false,
          "headline": "feat(orvion): 优化网关稳定性与管理端体验",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-09T19:28:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "048eaee6941f5777567c460510fffe63e010334f",
          "body": "- 新增 /stop Telegram 命令,用于中断当前 TG Agent 回复\n- 将普通 TG Agent 消息改为后台执行,避免长回复阻塞后续命令处理\n- 为每个 chat 会话增加运行状态与停止标记,/stop 不需要等待会话消息锁\n- 在 function-call 工具循环的 API 调用间检查停止标记\n- 当前上游 API 调用不会被硬取消,调用结束后在下一次 API 调用或工具执行前中断\n- 中断后将当前占位回复更新为“已停止当前回复。”\n- 将 /stop 添加到 /help 帮助文本与 Telegram bot command 列表\n- 补充 /stop 不等待会话锁、API 间软中断等单元测试",
          "is_bot": false,
          "headline": "feat(tg-agent): 添加 /stop 软中断当前回复",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-08T12:08:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39245dff1eb01dd7381598421cbb65ecd317c33a",
          "body": "- 在 Skills 卡片中新增安全审查图标按钮,点击后调用模型进行系统安全性评估\n- 新增 /skills/detail/:name/review 后端接口,复用 TG Agent 模型配置发起审查请求\n- 新增 Skill 审查运行时,收集 Skill 元数据、说明文件与脚本内容,并限制文件数量和大小\n- 审查结果返回风险等级、模型名称、审查时间、参与审查的文件列表和完整报告\n- 前端新增审查结果弹窗,支持加载、错误和结果展示状态\n- 审查总结改为 Markdown/GFM 渲染,支持标题、列表、代码块、引用和表格",
          "is_bot": false,
          "headline": "feat(skills): 添加 Skill 安全审查功能",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-08T04:05:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e50c064af0487901f50c901da2336e881552fa28",
          "body": "- 将 400/401/403/404/422 归类为可触发模型回退的上游错误\n- 指定 4xx 不再重试当前模型或继续切换当前模型提供商\n- 未配置回退模型时保留原始上游状态码返回\n- 保持 429 走限流降权、提供商切换和最终模型回退流程\n- 新增 FallbackUpstreamStatusError 用于兼容回退链路与状态码透传\n- 补充 4xx 回退模型完整链路测试\n- 补充 429 与指定 4xx 状态码策略测试",
          "is_bot": false,
          "headline": "fix: 支持指定上游状态码触发模型回退",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-06T12:32:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5bca64643df070a366dc80391e4aa69e3d957e01",
          "body": "- 支持反引号包裹的加粗语法自动转为 TG 加粗格式\n- 自动将裸盒子表格包裹为 text 代码块,避免 TG 渲染错乱\n- 限制表格边框最大长度,避免超长边框影响可读性\n- 支持双线盒子表格识别与边框归一化\n- 修复 Markdown 链接 URL 中括号被错误截断的问题\n- 将引用列表转换为 TG 友好的提示卡片样式\n- 将普通 > 引用转换为 • 圆点行\n- 补充 TG MarkdownV2 渲染回归测试",
          "is_bot": false,
          "headline": "fix: 优化 TG MarkdownV2 渲染兼容性",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-06T07:21:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc1fd3ae3928213fd7690f2b09eb0aa576b966be",
          "body": "- 新增 TG Agent /img <提示词> 快捷命令,可显式走生图渠道\n- 支持 /img@BotName <提示词> 的 Telegram bot 后缀命令格式\n- /img 缺少提示词时返回用法提示,避免误调用生图接口\n- 将 /img 加入 TG /help 帮助文本和 Telegram 指令列表\n- 为 /img 生图命令和空提示词场景补充回归测试\n- 增加生图意图的元问题排除,避免“为什么会生成图片”等规则讨论误触发生图\n- 增加天气查询提示词排除,避免天气推送、日期核验、出行建议类任务误判为生图\n- 收紧生图规则中的泛化动作词和主体词,降低“出行建议”“佛山”等普通文本误判概率\n- 保留明确生图表达,例如“生成一张佛山暴雨天气海报”仍会正常走生图",
          "is_bot": false,
          "headline": "feat: 增加 TG Agent 生图快捷命令并优化生图意图排除",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-05T05:03:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8df87d3ec9255fe29a8e7c0e00345e5fb3931d6a",
          "body": "- 调整 TG Agent 模型调用重试逻辑,非成功状态也进入重试流程\n- 补充 TG Agent 直连提供商 400 后重试成功的回归测试\n- 优化 OpenAI 兼容提供商模型列表获取,带 API Key 返回空列表时自动尝试无鉴权兜底\n- 新增模型列表兜底获取测试,覆盖 Gitee AI 等返回格式\n- 提供商模型列表弹窗打开时强制刷新,避免缓存空列表,并展示获取失败提示\n- 将文生图规则引擎升级为轻量分类器式评分,支持创作语气、视觉产物、风格、主体和数量化请求\n- 扩展文生图正向与负向样例,避免流程图、接口说明、绘图教程等误触发生图\n- 修复 TG MarkdownV2 中损坏 text 代码块围栏的渲染,自动修复 `text/`` 为标准代码块\n- 补充 TG Markdown 损坏代码块回归测试\n- 修正系统状态模型信息右侧标签的多余空格,改善对齐效果",
          "is_bot": false,
          "headline": "feat: 优化 TG Agent 重试、模型列表获取与生图意图识别",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-04T12:36:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7bdeb0b53f8e1bb7b4e8ab71b281f0f27be8eed9",
          "body": "- 新增 run_telegram_agent_scheduled_task 工具,支持 Agent 通过任务名称或 ID 立即执行已有定时任务\n- 为 Agent 工具 Runtime 增加定时任务执行器注入,避免 tools 子包反向依赖 agent 包\n- 手动执行定时任务时复用原有执行、运行状态、结果回填和审计日志流程\n- 手动执行结果直接返回当前 Agent 对话,不额外发送独立 TG 推送消息\n- 更新 Agent 系统提示词,要求查看、新增、修改、启停和立即执行定时任务都走工具调用\n- 补充定时任务立即执行工具的回归测试\n- 修复 TG Markdown 表格在已有代码块内被二次转换导致代码块渲染异常的问题\n- 修复 MarkdownV2 粗体、斜体、下划线、删除线、剧透等实体首尾空格导致 TG 解析失败的问题\n- 补充 TG Markdown 代码块保护和实体空格处理测试\n- 微调 TG 系统状态消息中模型信息行的右侧字段对齐",
          "is_bot": false,
          "headline": "feat(agent): 支持立即执行 Agent 定时任务并修复 TG Markdown 渲染",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-03T07:17:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8b295876d5b94b7ae73171939db024eff9f4062",
          "body": "- 精简 Agent 长期记忆模型,移除 importance、source_count、model 字段\n- 移除长期记忆写入、更新和周/月汇总中的无用字段处理\n- 调整长期记忆 LLM 提示词,不再要求返回 importance\n- 更新长期记忆相关测试,移除 source_count 和 importance 断言\n- 优化 TG Markdown 表格转文本框样式,移除右侧边框线\n- 更新 TG Markdown 表格渲染测试,改为校验无右边框输出\n- 移除配置页中 GitHub 更新检查、字体配置、加载 UI、TG 告警配置的冗余说明\n- 统一 GitHub 更新检查、TG 告警配置、TG Agent 配置三张卡片高度\n- 优化配置页卡片底部按钮对齐方式\n- 网络连通性测速失败时隐藏底层代理错误详情\n- 将代理测速失败提示改为通用文案\n- 移除 Agent 模型配置中的获取模型按钮\n- 点击或聚焦对话模型输入框时自动获取模型列表\n- 清理不再使用的 RefreshCw 图标导入",
          "is_bot": false,
          "headline": "refactor(agent): 精简长期记忆字段并优化配置页交互",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-07-02T12:26:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e565268871a00d183862818d798871d03412772",
          "body": "- 新增 TG Agent 文生图意图识别规则,支持“生成...图片/图像/照片”等自然表达\n- 在 TG Agent 对话入口接入规则引擎,命中文生图时直接走图片生成流程\n- 新增 TG Agent 生图直连请求链路,支持 /v1/images/generations 接口\n- 生图请求默认携带 extra_body.response_format=b64_json\n- 支持解析上游返回的图片 URL、data:image URL 和 b64_json 图片内容\n- 支持将生成图片发送到 Telegram,并在会话历史中记录生图结果\n- 新增 TG Agent 配置项:规则引擎开关与生图模型\n- 配置页面新增规则引擎开关和生图模型输入框\n- 生图模型输入框聚焦时自动获取当前启用的生图模型并展示悬浮下拉\n- 修复“生成一只大肚皮翻滚的花猫的图片”无法命中文生图规则的问题\n- 补充文生图意图识别和生图响应解析测试",
          "is_bot": false,
          "headline": "feat(agent): 支持 TG Agent 规则引擎文生图",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-30T14:57:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbba54bdec98ffad7b7f2c0ca3151e6a162bd78d",
          "body": "- 将 TG Agent 工具定义、执行、审计、动作处理迁移到 agent/tools 包,按模型提供商、日志、API Key、定时任务、Skills、命令行、系统管理等类型拆分\n- 移除 agent 下旧的工具散落文件,统一由工具注册表生成 function declarations 并执行工具调用\n- 新增系统管理工具,支持查看系统状态、性能统计、慢 SQL、图片缓存、后台任务状态,并可触发价格同步、系统日志清理、token 回填和图片缓存刷新\n- 新增长期记忆能力,支持对 TG 对话自动判断是否写入记忆,并按日、周、月进行摘要滚动汇总\n- 新增 agent_memories 表和 TG \n[…]\n新增累计金额后台 flusher,将 total_consumed_amount 改为内存聚合后批量落库,降低请求路径写 config 的频率\n- 移除请求路径中每次模型选择前恢复过期熔断的数据库更新,减少普通请求链路锁占用\n- 修复健康监控提供商成功率口径,改为当天该提供商成功请求数 / 当天该提供商总请求数\n- 为提供商成功率统计、长期记忆、代理出口解析、Agent 系统工具和工具重构补充测试",
          "is_bot": false,
          "headline": "feat: 重构 TG Agent 工具体系并补齐记忆与系统管理能力",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-30T12:31:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e475d9c27d1b6fe8ab0af6d7280622ff85ae7f8c",
          "body": "- 将 TG Agent Skills 改为严格三段式 Progressive Disclosure:\n  系统提示仅注入启用 Skill 的 name/description 元数据\n  使用 Skill 前必须通过 read_skill 加载 SKILL.md Body\n  references/scripts 等资源由 run_terminal_command 按需读取或执行\n- 移除 Skills 动态上下文数量限制与工具声明中的 Skill 详情拼接\n- 优化 read_skill 输出结构,补充 SKILL.md 路径、Body 截断和三级资源加载约定\n- 调整工具流式读取逻辑:有\n[…]\n网络转发卡片间距\n- 调整配置页卡片排序,使网络转发配置位于系统清理卡片右侧\n- 优化网络转发配置中“启用 IP 覆盖”开关宽度\n\n- 将 Agent 相关入口移动到侧边栏“项目”分组下方\n- 将 Agent 路由启用状态校验移入 Layout,关闭 TG Agent 时隐藏 Skills/Action/定时任务入口并阻止直接访问\n- 移除 App 层重复的 AgentFeatureGate 包装",
          "is_bot": false,
          "headline": "优化 Agent Skills 加载与系统配置布局",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-29T06:22:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "82406e3c3edeca18358ddce8657e4dd9d3f7bcff",
          "body": "- 移除 TG Agent 的 /chat 命令入口、帮助文案和 Bot 命令菜单注册\n- 将 /status 系统状态改为 Markdown 模板,并统一走 MarkdownV2 转换发送\n- 优化系统状态指标布局,资源、模型、请求统计改为双列对齐展示\n- 使用等宽代码样式修复 Telegram 中统计字段无法上下对齐的问题\n- 将 Markdown 表格转换为 Telegram 友好的盒子表格展示\n- 增强 Telegram 文本宽度计算,支持 emoji、全角字符和零宽字符\n- 补充系统状态模板、字段对齐、Markdown 表格转换相关测试",
          "is_bot": false,
          "headline": "feat(tg): 优化 Telegram 状态展示与 Markdown 渲染",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-27T15:14:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9509280945978fae0dc07203623185a67f1c2b51",
          "body": "- 修复提供商编辑时清空代理地址无法保存的问题\n- 将提供商更新改为显式字段更新,确保 console、proxy_url、接口转换开关和转换目标等零值也能落库\n- 补充提供商更新回归测试,覆盖代理地址、控制台地址和接口转换配置清空场景\n- 将模型提供商熔断告警改为普通文本发送,不再使用 MarkdownV2\n- 使用全角空格优化熔断告警字段对齐效果\n- 为模型提供商自动熔断增加指数退避冷却时间\n- 同一提供商短时间内反复熔断时,恢复时间按 5m、10m、20m、40m、1h 增长并封顶\n- 超过退避重置窗口后,熔断恢复时间回到基础 5 分钟\n- 仅在实际成功自动关闭模型提供商后记录退避次数,更新失败或未命中时回滚退避状态\n- 补充熔断退避增长、回滚和重置逻辑测试",
          "is_bot": false,
          "headline": "fix: 优化提供商更新与熔断冷却策略",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-27T06:28:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ddba62fda8410db5a6ff88afb113aa26e200e50",
          "body": "- 新增 TG Agent /restart 命令,支持重置会话、释放提供商 HTTP 连接缓存、清理状态图缓存并触发 GC\n- 让 /help 和 /start 复用 /status 状态图发送,提升 TG 命令展示一致性\n- 增强 TG MarkdownV2 渲染,支持标题、分割线和 Markdown 表格的 Telegram 友好转换\n- 优化模型提供商熔断告警格式,使用 MarkdownV2 代码块对齐字段和值\n- 为 TG 图片 caption 和文本回退增加 parse_mode 支持,保证告警内容按预期渲染\n- 新增提供商 HTTP 客户端缓存重置能力,用于释放空闲连接\n- 优化模型图标匹配优先级,优先使用 svg/png/webp/avif,ico 作为兜底\n- 新增 agnes.png 图标资源,改善 Agnes 模型图标加载速度\n- 缩小模型管理页分类区域间距\n- 补充 TG Markdown 渲染和熔断告警对齐格式测试",
          "is_bot": false,
          "headline": "feat: 优化 TG Agent 命令与告警展示",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-26T17:48:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58fb6a57eb4b28c89858076068a1db2d05dab4ca",
          "body": "- 将首页“每日模型成本”图表的固定 $60 坐标上限改为按最近 7 天成本动态计算\n- 为成本图坐标轴增加自适应刻度,按数据峰值自动取更合适的展示上限\n- 移除成本超过 $60 后的封顶提示,避免高成本数据展示不自然\n- 调整 TG Agent 配置卡片布局,将“启用对话”和“启用 Skills”放到同一行展示\n- 精简配置页核心配置卡片,移除“核心配置”标题和说明文案\n- 将 TG 昨日使用小报发送时间从每天 9 点改为每天 7 点\n- 同步更新 TG 日报调度测试用例,覆盖 7 点触发逻辑",
          "is_bot": false,
          "headline": "feat: 优化首页成本图与 TG 日报调度",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-22T04:09:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eeaa8d0c3bc177a8b73b5726c9136588d3d4ab1a",
          "body": "- 移除 Agent Skills 的 embedding 检索逻辑,不再支持本地向量、远端向量模型、相似度分数和 search_mode 参数\n- 调整 Skills 工具声明、管理接口和前端页面,改为仅按名称、描述、触发词和说明内容进行关键词过滤\n- 移除 TG Agent 配置中的 skills_embedding_model 字段和前端向量模型选择入口\n- 移除旧的 /tg-agent 前端跳转路由,仅保留 /action 入口\n- 收紧模型能力和提供商能力字段解析,只接受 JSON 数组格式,不再兼容逗号字符串和旧接口别名\n- 新增提供商能力创建/更新校验,避免写入空能力配置\n- 修复日志分表统计中 model_with_provider_id 过滤缺失导致的查询错误\n- 调整昨日使用小报统计口径,Top 模型和 Top API Key 只统计成功请求\n- 补充能力字段解析测试、日志分表统计测试和 model_with_provider_id 查询测试\n- 更新环境变量示例,保留 SQLite/MySQL 配置说明并移除 PostgreSQL 示例",
          "is_bot": false,
          "headline": "refactor: 精简 Agent Skills 检索并收紧能力字段格式",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-20T12:29:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c6a907a31aac6c4a51661863d5bf336717ee0be",
          "body": "- 新增 DATABASE_DRIVER 配置,支持 sqlite/mysql 双数据库驱动\n- 支持 mysql:// 与原生 MySQL DSN 自动规范化,并默认补齐 utf8mb4、parseTime、loc 参数\n- 为 MySQL 添加连接池配置,支持最大连接数、空闲连接数和连接生命周期环境变量\n- 引入 gorm.io/driver/mysql 与 MySQL 驱动依赖,清理不再使用的 OpenAI/MCP 相关依赖\n- 新增 SQL 方言辅助方法,统一处理 MySQL/SQLite 的字段引用、LIKE、日期分桶和分页差异\n- 修复 MySQL 下 configs.key 等保\n[…]\n取系统配置\n- 移除 Codex 指纹模拟后端逻辑、测试、前端配置卡片和 API 类型\n- 调整 TG 日报、状态图片、熔断告警、Agent 配置读取逻辑,避免配置来源分叉\n- 优化日志输出字节/token 回填任务,复用统一日志查询方法\n- 修复 TG Agent 定时任务推送时不应携带历史上下文的测试断言\n- 增加 MySQL DSN、数据库方言、日志月表索引、迁移 UTF-8 清洗等测试覆盖",
          "is_bot": false,
          "headline": "feat(db): 支持 MySQL 数据库并新增 SQLite 迁移工具",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-19T18:34:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5ae3fed0aa794481ff5f74ff013446da297df472",
          "body": "- 新增模型连通性测试接口,支持对模型下所有启用提供商并发流式测试\n- 在模型管理列表增加连通性列,支持单模型测试和当前页一键并发测试\n- 使用更自然的短提示词随机测试模型连通性,并展示可用/不可用统计\n- 新增 Codex 指纹模拟配置,支持在设置页独立卡片中启用和编辑客户端特征头\n- 参考 CLIProxyAPI 的 Codex 特征,模拟 codex-tui User-Agent、Originator、Accept、Connection 与动态 Session_id\n- 仅对 /v1/responses 和 /v1/responses/compact 应用 Codex 指纹模拟,不影响其\n[…]\n样式\n- TG Agent 工具运行状态改为覆盖占位消息,避免工具调用时一直显示旧内容或思考中\n- 清理运行日志和告警中的内部 ID 字段,减少 auth_key_id、model_with_provider_id 等敏感内部信息暴露\n- 熔断和自动关闭告警内容移除模型关联 ID,仅保留模型、提供商、错误计数等可读信息\n- 补充模型连通性、Codex 指纹模拟和 TG Agent 状态展示相关测试",
          "is_bot": false,
          "headline": "feat: 增强模型连通性测试、日志详情与 Codex 指纹模拟",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-19T07:32:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7712128a62938fea1dc8c703a3f3138987385729",
          "body": "- 支持从 SKILL.md / skills.md 的 Markdown Description 自动提取 Skill 描述\n- 支持从 Usage 代码块中识别推荐命令模板,并同步到 Skill 脚本信息\n- 在 read_skill 和工具定义中展示推荐命令模板,提升 Agent 执行脚本的准确性\n- 将 Skill 脚本超时上限调整为 240000ms,与 run_terminal_command 保持一致\n- 优化 Skill 工具摘要,加入描述信息,帮助模型更准确选择 Skill\n- 调整 run_terminal_command 审计日志,仅记录真实终端 stdout/stderr 输出\n- 系统状态日志改为直接展示 orvion.log 尾部内容,不再只筛选接口调用日志\n- 调整上游状态码重试策略,4xx 不再重试、不切换提供商、不进入回退模型\n- 普通 /v1 接口透传不可重试上游状态码,避免统一包装为 500\n- TG Agent 模型调用同步应用 4xx 不重试策略\n- 补充 Skill Markdown Usage、终端日志审计、4xx/5xx 重试策略相关测试",
          "is_bot": false,
          "headline": "feat: 优化 Agent Skills 识别、系统日志展示与上游重试策略",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-18T12:59:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "540b00081f7ce4609be9dbbba36889b65427e1bc",
          "body": "- 移除 create_attachment_file function tool 及其注册定义\n- 删除附件文件创建辅助实现 attachment_tools.go\n- 删除依赖 create_attachment_file 的相关测试用例\n- 保留附件标记解析与 Telegram 附件发送能力\n- 更新 TG Agent 工具提示词,要求文件创建、写入、修改、删除统一走 run_terminal_command\n- 保留通过 [orvion:file:...] 与 [orvion:image:...] 标记发送生成文件和图片的能力\n- 将 run_terminal_command 最大超时时间从 120000ms 提升到 240000ms\n- 同步更新 timeout_ms 的工具描述说明",
          "is_bot": false,
          "headline": "refactor: 移除附件文件工具并统一使用终端命令处理文件操作",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-17T17:39:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea9f6d8333baabee5d5889b4a2bcd96475715736",
          "body": "…havior\n\n- stop loading historical TG conversation context for pushed scheduled tasks\n- add tests to ensure scheduled TG tasks run without reading previous session history\n- simplify TG Agent skill tool exposure to use all enabled skills directly\n- remove dynamic skill relevance filtering from function tool definition generation\n- update TG Agent tool prompts and function tool builders to match direct enabled-skill loading",
          "is_bot": false,
          "headline": "feat: improve media handling, fallback recovery, and TG agent task be…",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-17T16:33:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f044ba8acfb86deac4cc35734bd0aad5fe37aebc",
          "body": "- 移除 TG Agent 的二次确认流程,改为修改类工具直接执行并统一记录审计日志\n- 简化工具调用状态与日志结构,删除待确认/取消相关的内存和数据库存储\n- 为工具执行增加运行中状态推送,优化 TG 对话中的处理中反馈\n- 收紧 Skills 动态注入规则,避免无关 Skill 误进入当前轮工具上下文\n- 调整技能解析与展示,移除脚本级确认字段及相关兼容逻辑\n- 重构 TG Agent 管理页与路由入口,新增 /action 路由并在关闭时隐藏 Skills/Agent 入口\n- 精简系统日志、健康监控与模型图标映射展示\n- 更新前端类型定义与配置表单,移除已废弃的确认开关字段\n- 补充/更新相关单元测试,覆盖直接执行、日志变化与 Skills 相关性过滤",
          "is_bot": false,
          "headline": "feat: 重构 TG Agent 工具链、Skills 注入与前端入口",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-16T17:41:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6942462b15e63f57d33de12c8adbb15b1f58b522",
          "body": "- 新增 telegram_agent_skills 表,保存 Skill 元数据、脚本、检索文本和启用状态\n- 启动迁移时自动创建 Skill 状态表\n- 扫描 data/skills 或 TG_AGENT_SKILLS_DIR 时自动同步 SKILL.md/skills.md 到数据库\n- 支持递归扫描 Skill 目录,并清理本地已删除的 Skill 记录\n- 移除 SKILL.md 中 enabled 字段的解析和写回逻辑,启用状态统一由数据库维护\n- Agent 构建工具声明时按当前用户消息从启用 Skill 中动态检索并注入相关工具上下文\n- read_skill 工具枚举只暴露本轮匹配到的启用 Skill,减少无关 Skill 干扰\n- 调整命令执行工具和 Skill 读取流程,统一透传 context 以触发数据库同步\n- 补充 Skill 入库、启用禁用、导入、动态工具声明和测试数据库隔离相关测试",
          "is_bot": false,
          "headline": "feat(agent): 将 Skills 状态入库并支持动态检索注入",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-15T08:45:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77e8d3b5629394e4ba4da90562bec55d1e7de06b",
          "body": "- 为 providers 增加 status 字段,提供商启用状态改为直接存储在 providers.status\n- 移除 provider_status_snapshot 配置快照逻辑,提供商开关不再修改模型关联状态\n- 普通请求、模型列表与 Skills 向量模型选择均过滤已禁用提供商\n- 同步 TG Agent 提供商开关工具,保留 model_with_providers 原有启用状态\n- 启动时清理旧 provider_status_snapshot 配置记录\n- 前端提供商列表改为基于 Provider.Status 展示与切换启用状态\n- modelIcon 支持 ico 图标,并新增 agnes / sensenova 模型图标资源\n- 新建模型默认重试次数从 10 调整为 2\n- 优化系统概览 24 小时请求图,改为曲线展示请求量与金额趋势\n- 增加请求图峰值时段、当前小时、网格线与 hover 明细提示",
          "is_bot": false,
          "headline": "feat: 优化提供商状态、模型图标与系统概览图表",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-14T13:06:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8312c64285a312d4fe221efe9eebe19e5b73fa1",
          "body": "- 移除 TG Agent AI 调用写入本地请求日志的逻辑\n- 移除 TG Agent 重试失败日志、chat_io 记录、内部 telegarm AuthKey 统计与总金额累加\n- 保留 TG Agent 对话上下文与工具执行时间线记录\n- 将 TG Agent 直连最大尝试次数从 2 次调整为 3 次\n- list_providers 工具返回提供商 URL 和 API Key\n- 更新 list_providers 工具描述与相关测试断言\n- 清理 selectedModelProvider 中仅用于请求日志的字段\n- 右上角新增常驻退出登录按钮",
          "is_bot": false,
          "headline": "feat(agent): 优化 TG Agent 调用日志与管理入口",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-13T08:08:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78db16d21b5928e1d1a1323afba171aa68142e38",
          "body": "- 为 Telegram Agent 配置新增请求 URL 和 API Key,支持通过直连配置获取模型列表\n- 新增 /config/telegram-agent/models 接口,按直连 OpenAI 兼容地址拉取模型并归一化 /chat/completions URL\n- 移除 Telegram Agent 主对话、工具调用和定时任务里的内部模型/提供商兜底逻辑\n- 移除 Telegram Agent 本地模型回退链路,统一使用直连 provider 池和重试流程\n- 将 Agent 模型、URL、API Key、上下文数、输出 Tokens、刷新间隔移入模型配置弹窗\n- Agent \n[…]\ney 输入支持明文/隐藏切换,模型选择支持拉取后悬浮下拉搜索\n- 侧边栏将 “TG Agent” 改为 “Agent”,并移除侧边栏底部控制台用户区域\n- 提供商管理表单中控制台地址和代理地址改为同一行展示\n- 普通提供商自动关闭规则调整为 1 分钟内 10 次错误触发\n- 更新 Telegram Agent 直连配置和直连重试测试\n- 新增 Telegram Agent 模型 URL 归一化测试",
          "is_bot": false,
          "headline": "feat(agent): 改为直连模型配置并优化 Agent 管理界面",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-10T16:36:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3c0bbb08ac278c9156259c604527c1f54f30fc13",
          "body": "- 为 TG Agent 增加模型提供商池,读取模型的重试次数、负载均衡策略、熔断和回退模型配置\n- 统一普通对话、工具调用结果整理、Agent 定时任务的模型请求链路\n- 上游返回 408、429、5xx 或空响应时自动重试,并在失败后切换其它可用提供商\n- 所有提供商失败后按模型配置尝试回退模型,避免单个提供商 502 直接终止对话\n- 记录 TG Agent 重试日志和最终成功请求的 retry 信息\n- 增加 TG Agent 提供商失败后自动切换成功的测试覆盖",
          "is_bot": false,
          "headline": "fix(agent): 支持 TG Agent 模型调用自动重试与提供商切换",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-08T09:50:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01185d41f6bb687b99bde06e478e55c0b8150300",
          "body": "- 新增 TG Agent 定时任务表、后台扫描执行器和管理接口\n- 支持 Agent 通过工具创建、修改、启停和查询定时任务\n- 新增 Agent 定时任务前端页面,并接入侧边栏和路由\n- 支持 TG Agent 接收图片/图片文件并转换为模型可用的视觉输入\n- 支持 Agent 生成附件文件并通过 Telegram 发送图片或文档\n- 将 TG Agent 工具调用消息扩展为支持多模态 content\n- 增强 Telegram notifier,支持 sendPhoto、sendDocument 和文件下载\n- 优化 TG Agent 执行时间线与删除会话确认弹窗\n- 优化 Agent \n[…]\n/readyz、/v1models 等历史兼容路由\n\nBREAKING CHANGE:\n- 不再提供 /healthz、/livez、/readyz、/v1models 兼容路径\n- 不再提供 /api/test/count_tokens 和 /api/test/react/:id 测试接口\n- TG Agent 不再硬解析 /enable_model、/disable_model 等斜杠工具命令",
          "is_bot": false,
          "headline": "feat(agent): 增强 TG Agent 附件、视觉与定时任务能力",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-07T12:37:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2ce5dc226f1d50b603a65da2229ce37dca5dd3b7",
          "body": "- TG Agent 模型调用接入提供商接口自动转换,支持 chat、responses、messages 风格提供商\n- 在接口转换链路中保留 function/tool calls,补齐流式与非流式响应的工具调用转换\n- 修复权重轮询策略,按全局游标稳定执行权重序列,避免连续偏向高权重提供商\n- 移除 Skills 市场、本地路径导入和文件夹上传,仅保留 ZIP 上传导入\n- 精简 Skills 管理接口和前端页面,删除市场相关 API、字段和入口\n- TG Agent 关闭时隐藏侧边栏中的 Skills 和 TG Agent 入口,并在配置保存后实时刷新\n- 请求日志工具最大读取数量从 50 调整为 200\n- 移除 TG Agent 执行页面冗余标题,简化执行时间线展示\n- 增加权重轮询、接口转换工具调用和 TG Agent provider bridge 相关测试",
          "is_bot": false,
          "headline": "feat: 优化 TG Agent 接口转换与 Skills 管理",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-06T15:15:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8a0f05cfd3044684236449afeba50a3d91e7911",
          "body": "- 新增 TG Agent Skills 能力,支持本地 skills.md/SKILL.md 扫描、启用禁用、热重载、文件树查看编辑、删除、市场导入、文件夹/ZIP 上传\n- 支持 Skills 关键词检索和 embedding 检索,并允许配置远端向量模型\n- 新增 TG Agent function tools:list_skills、read_skill、run_terminal_command、list_auth_keys,并动态生成工具声明\n- 支持 Agent 通过结构化 command/args/stdin/working_dir 执行本地命令,加入超时、输出截断、敏感参数隐藏\n[…]\nignore,排除 .env/.env.*,避免密钥文件进入镜像构建上下文\n- 更新 README,说明 TG Agent Skills 目录和运行镜像内置工具包\n- 禁用浏览器自动翻译 React 根节点,避免 Chrome 翻译注入 font 节点导致 removeChild 渲染错误\n- 补充 TG Agent、Skills 管理、上传安全、会话删除、工具审计和 OpenAI 响应规范化测试",
          "is_bot": false,
          "headline": "feat: 增强 TG Agent Skills 与执行审计",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-05T11:37:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e9836009bdf65a2e92994bb9741fbd23f429cfaf",
          "body": "- add Telegram streaming agent with persisted context, pending actions, and tool call audit logs\n- support function-call tools for model/provider/auth key/log operations\n- add configurable Telegram Agent model, prompt, context, token, edit interval, and confirmation behavior\n- render Telegram agent \n[…]\ny-request models and provider visibility\n- fix auth key zero-value updates and cache invalidation\n- harden upstream request header construction\n- refine model, provider, health, and config UI controls",
          "is_bot": false,
          "headline": "feat: add Telegram agent tools and model fallback controls",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-06-04T07:49:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "690c99313e997fe22921e584b1ca7179bd8aadc5",
          "body": "- 支持提供商整体启停,并通过 configs 快照恢复原启用关联\n- 优化提供商卡片开关样式和名称展示\n- 将模型熔断规则改为 30 秒内错误达到阈值\n- 模型熔断 TG 告警支持携带状态图片\n- 修复流式请求响应头超时时间过短的问题\n- 清理未引用的前端组件、API 封装、依赖和后端函数",
          "is_bot": false,
          "headline": "feat: 优化提供商启停、熔断策略与项目无用代码",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-05-29T06:29:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b02cdf34593eabb9a2b8ab186fc2cd0109d9388",
          "body": "- 健康监控页新增提供商监控与模型监控切换\n- 侧边栏入口由“模型监控”调整为“健康监控”\n- 模型监控按模型聚合各提供商健康数据,并默认收起提供商明细\n- 健康时间线改为当天 00:00-24:00 的 100 段成功率统计\n- 时间线按成功率着色,并使用即时 Tooltip 展示时间段详情\n- 新增提供商批量启停能力,通过 model_with_providers.status 实现,不新增 providers 字段\n- 提供商卡片新增淡绿色圆形勾选启停按钮\n- API Key 新建支持自定义 sk- 后缀,留空时保留默认生成规则\n- 后端校验自定义 Key 的重复、空白字符和长度\n- 优化 API Key 新建弹窗布局,压缩模型权限列表并对齐 RPM 与有效期控件\n- 修复请求日志会话详情加载动画未居中的问题",
          "is_bot": false,
          "headline": "feat: 优化健康监控、提供商启停与 API Key 新建体验",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-05-27T13:35:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6353e478c9d02bca3052accb7e2d3a641c58461c",
          "body": "- 修复日志分表统计查询在无 WHERE 条件时拼接 AND 导致的 SQL 语法错误\n- 重构请求日志为月分表查询体系,支持按月份创建、查找和跨月 union 查询\n- 新增空日志分表定时清理逻辑,保留当前月和下月相关表,避免误删活跃分表\n- 简化数据库初始化逻辑,移除历史迁移、字段回填和旧表兼容代码\n- 以当前项目表结构作为后续数据库结构基线,不再适配旧版本表结构\n- 优化 SQLite 初始化参数,启用 WAL、busy timeout、foreign keys 等配置\n- 支持提供商配置多个 API Key,可使用逗号分隔并按轮询方式使用\n- OpenAI、OpenAI Res、Ant\n[…]\n求日志写入与后台异步任务调度,降低 goroutine 堆积风险\n- 新增数据库维护能力,支持重置指定业务数据、清空 model_with_providers,并重排已有数据 ID\n- 重置 API Key 使用次数、已消耗金额、最后使用时间,以及配置中的总金额\n- 更新前端类型定义、接口封装和相关页面交互\n- 补充日志分表、API Key 轮询、配置规范化、日报计划等测试\n- 更新依赖与项目说明",
          "is_bot": false,
          "headline": "feat: 优化提供商、日志、系统状态与数据库维护能力",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-05-25T15:51:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1238fa000a24f5d884a129ade9daabf452cd2c4f",
          "body": "1. 测试场请求新增浏览器来源头清理逻辑,剥离 Origin/Referer/Sec-Fetch-*,避免上游返回 origin not allowed\n2. 保留并回填自定义请求头,确保“自定义请求头 > 透传请求头”优先级不变\n3. TG 每日使用日报最慢请求耗时支持单位格式化:<1000 显示 ms,>=1000 自动转换为 s\n4. 请求日志会话详情页新增图像响应解析能力,支持 data[].b64_json 及 data[].url/revised_url 预览\n5. 原始视图对超大 JSON 降级为普通文本渲染,修复高亮导致的显示异常\n6. 侧边栏导航分组调整:模型监控归入仪表盘,API 密钥归入管理\n7. 登录页将“支持接口格式转换与自定义请求头能力”标记为已完成,并放大左上角入口图标\n8. 后台界面左上角品牌图标调整为 size-10,底色改为与界面一致(去除强调底色)",
          "is_bot": false,
          "headline": "feat(test,webui,tg): 修复测试场来源校验并优化日志解析与导航体验",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-05-13T12:17:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4acf817ed23983eccb6d71fb3c7d25c608d399a4",
          "body": "1. 新增 github_version_check 与 ui_loading_style 配置键,版本检查支持 disabled 返回态\n2. 系统显示配置整合 GitHub 更新检查/界面字体/加载样式并改为统一保存\n3. 核心配置整合系统日志清理、模型价格同步、全局代理 IP,优化开关与间隔输入布局\n4. TG 告警配置改为内联展示,移除可选配置弹窗,输入项统一左标签对齐\n5. 新增 loading-ui 样式管理模块并替换旧三点加载动画,提供 4 套可爱加载动效\n6. 优化 Tooltip,修复按分页导致的家族统计偏差\n7. 系统日志页新增 goroutines 指标并精简操作按钮;优化外链跳转方式减少弹窗误报",
          "is_bot": false,
          "headline": "feat(config): 重构系统配置与模型管理并新增加载样式配置",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-05-10T17:14:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09abbce3f0c01a41fc1771a331c4cb4cd4842469",
          "body": "1. 新增 github_version_check 与 ui_loading_style 配置键,版本检查支持 disabled 返回态\n2. 系统显示配置整合 GitHub 更新检查/界面字体/加载样式并改为统一保存\n3. 核心配置整合系统日志清理、模型价格同步、全局代理 IP,优化开关与间隔输入布局\n4. TG 告警配置改为内联展示,移除可选配置弹窗,输入项统一左标签对齐\n5. 新增 loading-ui 样式管理模块并替换旧三点加载动画,提供 4 套可爱加载动效\n6. Tooltip,修复按分页导致的家族统计偏\n7. 系统日志页新增 goroutines 指标并精简操作按钮;优化外链跳转方式减少弹窗误报",
          "is_bot": false,
          "headline": "feat(config): 重构系统配置与模型管理并新增加载样式配置",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-05-05T15:52:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fc9bc0f1bb1842e079b0c139305ffb345360891",
          "body": "- 提供商新增 capabilities 能力字段(chat/openai/claude),支持多选并默认全选\n- 在请求转发阶段按 endpoint 过滤 provider,避免调用不支持的接口\n- 提供商管理页接入能力多选配置,支持创建/编辑回显与保存\n- 系统配置新增 TG 状态图 URL(status_image_url)并支持弹窗编辑可选项\n- TG 每日小报新增“前一天使用最多的 API Key”统计与展示\n- OpenAI 单工具场景自动补全缺失的 tool_call_id(仅唯一候选时)\n- 修复系统概览 Token 紧凑显示问题(如 300M 不再错误显示为 3M)\n- 补充相关配置与文档说明(README、.env.example)",
          "is_bot": false,
          "headline": "feat: 增强提供商能力配置并完善 TG 与请求兼容性",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-04-29T13:07:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c740ed7ccfe130f474906e84721518e31be31dd6",
          "body": "- 删除 xray/VMess/VLESS/Trojan 相关后端实现、测试与 xray-core 打包内容\n- GitHub 版本检查改为后台定时刷新内存缓存,接口直接返回缓存结果\n- GitHub commits 接口强制使用 HTTP/1.1,其它接口保持原有行为\n- 移除 /api/stream/requests SSE 接口及前端 LIVE 实时请求流界面与调用代码\n- 同步清理 .env.example/README 中相关配置说明并更新测试",
          "is_bot": false,
          "headline": "refactor(core): 移除 xray 与实时请求流,重构 GitHub 版本检查链路",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-04-19T09:47:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0258f8d1e1a57234528b7503fb0884df07e441d3",
          "body": "(1)后端 /api/version/update-check 新增 backendFetchSuccess/suggestBrowserFetch/fetchSource 字段\n(2)当前端收到 suggestBrowserFetch=true 时,改用浏览器网络直连 GitHub Tags/Commits 获取最新版本\n(3) 保持原有响应结构兼容,浏览器兜底失败时自动回退后端结果",
          "is_bot": false,
          "headline": "feat(version): 增加后端失败时前端浏览器兜底的 GitHub 版本检查",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-04-19T03:33:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcb35d067bf830d7289d5ff3230d5a6b8f95ea51",
          "body": "(1)引入连续失败阈值与切换冷却窗口,避免网络抖动触发频繁候选切换\n(2)在主动 kill 场景标记预期退出,抑制 signal:killed 误导性告警\n(3)补充健康检查阈值/冷却/计数重置相关单元测试",
          "is_bot": false,
          "headline": "fix(proxy): 优化内置 xray 健康检查,减少频繁重启与误报",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-04-19T01:55:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de84464ca8e8073e30b6a372d44bbc6353cf47b3",
          "body": "- 新增内置代理能力:支持 vmess/trojan,默认多候选顺序尝试与健康检查,失败自动切换\n- 优化 Telegram 代理策略:仅在 TG 环境代理为空且数据库未配置时回退内置代理,并支持定时探测自动切换\n- 增加 GitHub 版本检查链路(代理接入、更新检查接口、预热探测与可观测日志)\n- 新增请求流与日志能力:SSE 请求流、AuthKey 日志查询/ChatIO 查询、模型排序与管理接口细节优化\n- 强化稳定性与性能:请求体大小限制中间件、AuthKey 缓存与失效、批量刷新与优雅停机处理、异步镜像写入防阻塞\n- 完善测试与文档:新增代理相关测试、版本与日报相关测试、README/.env.example 说明同步\n- 同步前端改造:主页/布局/日志/登录/模型页改进,API 与鉴权逻辑增强,图标资源调整(openai.svg -> gpt.svg,新增 mimo.png)",
          "is_bot": false,
          "headline": "feat(core): 增强代理容灾、TG 通道稳定性与请求可观测能力",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-04-18T17:24:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93c279e0d6e3649d54cb0bd1be30db5b693b0a36",
          "body": "- 后端 test 接口在图片场景返回 image_url(支持 URL 与 data URL)\n- 增加图片响应提取逻辑,兼容 data.0.url 与 data.0.b64_json\n- 前端测试页解析 image_url 并在助手消息中直接渲染图片预览\n- 优化消息删除逻辑,仅对 blob 预览地址执行 revoke,避免误处理 data URL\n- 调整图片测试文本提示,避免仅显示长度信息导致无可视化结果",
          "is_bot": false,
          "headline": "feat(test-chat): 支持图片测试结果预览并修复 base64 不渲染问题",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-04-17T13:21:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1720fb6e5eb899f7eda0f74becf07c5c3457faef",
          "body": "- 增加消息收发日志与响应字节统计,完善聊天链路可观测性\n- 新增 Telegram 告警/命令能力,支持状态消息与图片发送增强\n- 下载状态图时增加 10MB 上限校验,超限自动跳过并重试新图\n- 完善模型路由与后端处理逻辑,补充管理端接口与页面能力\n- 重构限流相关实现并清理冗余文件\n- 更新 CI Docker 构建参数,注入 VERSION 到镜像构建\n- 重写 README 与 .env.example,使配置说明与当前代码行为一致\n- 新增前端字体与模型图标资源,优化管理端展示体验\n\nBREAKING CHANGE: 环境与部署文档改为 ORVION_* 命名,旧示例变量需按新文档核对",
          "is_bot": false,
          "headline": "feat(gateway): 增强网关可观测性与 TG 能力,并同步文档与构建流程",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-04-17T12:17:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "224b4ca730994c2f5374ad43161b28b63f479997",
          "body": "1.新增系统日志页面、日志文件写入与自动清理;\n2.优化测试场日志记录、健康监控、模型列表与侧边栏交互,收敛前后端无用代码并统一配置体验",
          "is_bot": false,
          "headline": "feat(core): 移除 auth 订阅链路并重构模型与提供商管理,统一 provider 无类型协议兼容;",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-03-28T15:02:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e4ebfca84877c1154c82c3834cc81067f6bc5b8",
          "body": "…_calls",
          "is_bot": false,
          "headline": "fix(gemini-compat): 调整兼容层为最小改写,仅降级 tool/function 结果并保留 assistant.tool…",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-03-19T04:52:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0ac2266c520f24a5d44b1a11136eeaac4c58f72",
          "body": null,
          "is_bot": false,
          "headline": "feat(gemini-compat): 新增可开关兼容层,清洗 patternProperties 并降级 tool/function 历史",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-03-19T03:21:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ec851b806bb6a0a2a22f5392caead330ecaf942",
          "body": "…larations 校验`",
          "is_bot": false,
          "headline": "`fix(gemini): 递归移除 tools schema 中所有 patternProperties,兼容 function_dec…",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-03-17T10:06:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ac6214de58ad808321a9d0c47356badef7d1287",
          "body": null,
          "is_bot": false,
          "headline": "fix(gemini): 增加 tools 参数兼容层,自动移除 patternProperties",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-03-17T09:40:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86536df9a47e1c6d61a59061e49c7b39937ae5ef",
          "body": null,
          "is_bot": false,
          "headline": "fix(test): 统一解码测试响应并限制压缩协商,修复模型测试返回乱码",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-03-17T05:02:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af3567a22eeded37669eeeaae48d3a416ab12fde",
          "body": "- 新增模型聊天测试链路(后端接口、路由与前端页面)\n- 扩展模型能力与相关数据结构/初始化逻辑\n- 优化供应商配置与展示(API Key 显隐、获取方式标识、模型列表缓存)",
          "is_bot": false,
          "headline": "feat: 增强模型与供应商管理,补充模型测试与前端配置体验",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-03-16T15:58:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58307291ff5b994f88340a110b4e45bb33c6e8d6",
          "body": "…的自动注入\n\n- 删除 BeforerOpenAIRes 中对 stream=true 请求体的 stream_options 补写逻辑\n- /v1/responses 现在按原始请求体透传,不再强制 include_usage=true\n- 保持其他接口行为不变",
          "is_bot": false,
          "headline": "refactor(responses): 移除 /v1/responses 对 stream_options.include_usage …",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-03-04T07:19:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96cff81cf89353734ad81584d654bc51a2c971c3",
          "body": "- 删除模型能力字段:tool_call / structured_output / image\n- 管理端模型增改接口同步移除对应参数与更新逻辑\n- 聊天服务不再按模型能力字段过滤提供商\n- 前后端类型定义与请求结构保持一致,减少冗余配置",
          "is_bot": false,
          "headline": "refactor(models): 移除模型能力字段并简化模型筛选逻辑",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-03-04T05:18:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3a4f9dd0304857c0c21d6880a6fe3cd1731611d",
          "body": "- 新增系统概览左侧「每日模型成本」可视化,支持按模型堆叠展示\n- 后端增加 /api/metrics/daily-model-cost 接口,返回按天与按模型聚合成本数据\n- 前端 API 层新增 DailyModelCostSummary / DailyModelCostSeries 类型与请求方法\n- 系统概览改为双图同排布局:左侧每日模型成本,右侧今日消耗金额趋势\n- 每日模型成本图改为固定 y 轴 0~60(步进 10),x/y 轴字体增大\n- 图例调整为紧贴 x 轴下方居中显示,修复图例过远/不可见问题\n- 超过坐标上限时柱体封顶显示,tooltip 增加超限提示\n- 保持两张卡片等高,优化图表与图例区域高度分配",
          "is_bot": false,
          "headline": "feat(overview): 系统概览新增每日模型成本图并对齐参考样式",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-03-03T08:12:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3663a2cde696973ad7635bb287eda0c12faf49b",
          "body": "main 启动改为 http.Server + signal.NotifyContext,支持 SIGTERM/SIGINT 优雅关停\n后台任务统一使用可取消上下文,新增 LLMIO_SHUTDOWN_TIMEOUT_SECONDS 停机超时配置\niFlow 凭据刷新补齐 OAuth refresh_token 链路,无 cookie 时可自动刷新 access_token 与 api_key\n过期时间为空或解析失败时改为兜底刷新,避免订阅静默失效\n增加 OAuth code 换 token 参数校验,并新增 refresh_token 换 token 方法",
          "is_bot": false,
          "headline": "fix(runtime): 增强容器优雅停机并补齐 iFlow OAuth 刷新能力",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-16T12:53:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da7f2054d3c8c426eeaab6bd169d707597278716",
          "body": "- 在 embeddings 请求缺少 encoding_format 时默认补齐为 float,避免上游 400 导致 provider 被移除并触发 no provide items 错误。\n- 对 embeddings 响应统一设置 Content-Type 为 application/json; charset=utf-8,避免客户端按 text/plain 解析导致 data[0] 读取异常。\n- 修复 CherryStudio 报错:cannot read properties of undefined (reading '0')。",
          "is_bot": false,
          "headline": "fix(embeddings): 兼容 ModelScope 与 CherryStudio 的嵌入请求解析",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-12T14:01:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cda09c9e9009ffd939002f9ecbff3a02fd2f05a1",
          "body": "- 新增订阅凭据文件解析器,支持递归识别 auths 子目录中的凭据文件\n- codex/iflow 订阅管理改为递归扫描与路径解析,List/Get/Delete 均支持子目录文件\n- 放宽 codex 凭据文件名规则,支持包含 @ 的邮箱文件名\n- Codex 额度接口统一命名为 subscription quota,替换 team quota 命名与路由\n- 重构 Codex 额度窗口解析与归一化逻辑,提升主/副窗口识别稳定性\n- 扩展 PromptTokensDetails,新增 cache_write_tokens 与 prompt_excludes_cached_tokens 字段\n[…]\n构:恢复图标、固定列对齐、标签值紧邻显示、token > 1000 显示为 k 单位\n\nBREAKING CHANGE:\n- GET /api/codex/subscriptions/:id/team-quota 已变更为 GET /api/codex/subscriptions/:id/quota\n- 前端类型 CodexTeamQuota 已替换为 CodexSubscriptionQuota",
          "is_bot": false,
          "headline": "feat: 增强订阅凭据递归识别、缓存计费与首页金额统计持久化",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-12T12:41:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c513453447c86a0b30fedff3ced642f6ac410b36",
          "body": "Updated README to enhance clarity and structure, including core capabilities and project structure sections.",
          "is_bot": false,
          "headline": "优化readme文件",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-10T02:16:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e92358efa9ce652c16f97dc444871c6d9673a74a",
          "body": null,
          "is_bot": false,
          "headline": "feat(docker): 修改docker镜像",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-07T17:02:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5ce80e3900aaf73677580e7716392abbd8f3c12",
          "body": null,
          "is_bot": false,
          "headline": "feat(docker): 将镜像改为默认root运行",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-07T14:07:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2fdf41683af52aea97802ec2f8e6d64dfb9684f",
          "body": "  - 修复名字计算异常",
          "is_bot": false,
          "headline": "feat(docker):",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-07T13:05:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a81299d23ed447e8b97cd710055ef6c58db4040e",
          "body": "  - 将管理接口拆分到 handler/admin 并按模块重排路由与服务结构\n  - 新增 Codex/iFlow 认证订阅、官方接口转发与 OAuth/Cookie 登录流程\n  - 统一 APIKey 鉴权与管理员 token 兜底,清理旧前缀与无用代码\n  - 对齐 CLIProxy 细节:图片输出标准化到 message.images/delta.images、补齐 token/计费与日志字段\n  - 前端调整导航与页面布局,优化订阅卡片、日志展示、模型图标与 APIKey 脱敏/金额展示",
          "is_bot": false,
          "headline": "feat: 重构网关架构并接入 Codex/iFlow 订阅能力",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-07T13:01:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56978364f9cc0df2cd9804257fd1d40bf799347e",
          "body": "  - 改用 DB.Model(...).Updates(map) 兼容 io_log 关闭场景",
          "is_bot": false,
          "headline": "fix(api): 更新模型时使用 map 更新以保留 0 值",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-03T16:54:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de91b3066d5b17be4eabc4ea7320c105699f012b",
          "body": "  - go-builder 阶段设置 GOPROXY=https://proxy.golang.org,direct",
          "is_bot": false,
          "headline": "fix(docker): 构建阶段固定 GOPROXY 避免依赖下载失败",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-03T16:49:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e4396ecb6c55826f298f6a0610cad1bdb93a0d5",
          "body": "- 向auth_keys表和模型添加total_cost字段\n- 重构代币估计以支持各种输入格式\n- 使用映射而非结构体修复GORM 零值更新问题\n- 为现有auth_keys表添加迁移逻辑",
          "is_bot": false,
          "headline": "feat(DB):添加成本跟踪并修正模型更新零值问题",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-03T13:07:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "859f65370da4386f1b020e5d8daa55cf555df0cd",
          "body": "  - 创建 /app/data 并赋权给系统用户\n  - 默认以 nobody 运行服务,避免因用户不存在导致构建失败",
          "is_bot": false,
          "headline": " fix(docker): 运行镜像改用 nobody 用户并修复权限设置",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-02T15:49:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2896deefec4df002db478c315c2e6f88412dc5d1",
          "body": "  - responses 流式请求自动启用 include_usage\n  - 解析 usage 更宽松,缺失时从输入/输出内容估算 token\n  - RecordLog 支持按 style 回填 usage 与总 token\n  - headers.json 改为 Go 内置默认 headers,避免打包路径问题",
          "is_bot": false,
          "headline": "  feat(log): 上游缺失 usage 时估算 token,并内置默认 headers",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-02T15:40:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f4431dca16497d17428239ce1c7f910d46714b17",
          "body": "  fix(db): 兼容 SQLite 并修复默认数据目录/趋势统计\n\n  - Config.Key 加唯一索引并在启动时补建,避免 ON CONFLICT 报错\n  - SQLite 目录创建失败时返回明确错误\n  - 镜像内预创建 /app/data 并赋权,默认 DSN 可写\n  - 首页趋势统计按数据库类型选择小时分组表达式",
          "is_bot": false,
          "headline": "• 可用的 git message(基于当前 git diff):",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-01T12:35:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b757c0b6e4674a7e0c74482958188f516493a162",
          "body": "  - 用 github.com/glebarez/sqlite 替换 gorm.io/driver/sqlite,避免 CGO 依赖\n  - 更新 go.mod/go.sum 依赖与 README 的 SQLite 描述\n  - Docker 构建启用 Go/NPM 缓存并统一二进制名为 orvion",
          "is_bot": false,
          "headline": "feat(db): 切换为纯 Go SQLite 驱动并优化构建缓存",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-01T11:39:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0921147da4289a6c2c72c13cba30c9e4077348e4",
          "body": "  - 替换所有 Go 代码中的旧模块引用路径\n  - 与当前 go.mod 模块名保持一致\n  - 增加docker打包的架构的linux/amd64,linux/arm64镜像支持",
          "is_bot": false,
          "headline": "  refactor: 统一模块路径为 github.com/racio/orvion",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-01T10:51:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6cfc94c1324f85467900028153fb50b89fa93c88",
          "body": "  - 数据库:默认 SQLite,启动仅在缺表时创建;补充环境变量与运行说明\n  - 限流:移除 IP 锁定相关字段/接口/前端配置;Redis 失败时回退内存\n  - 日志与性能:日志列表虚拟化与 memo 化,首页/卡片渲染优化\n  - 前端 UI:布局与品牌调整,健康/首页/提供商/日志等页面细节更新\n  - 资源与构建:移除未使用图表/样式/资源,更新依赖与构建配置",
          "is_bot": false,
          "headline": "feat: 优化前后端体验与运行稳定性,清理无用资源",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-02-01T10:05:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65eb686d192413e6d91eabd73c0ad1171c8187ee",
          "body": "  2. feat(ui): 模型卡片显示价格,设置页内联配置与全局代理 IP\n  3. chore(ui): 更新站点标题与 favicon,品牌名改为 Orvion",
          "is_bot": false,
          "headline": "  1. feat: 新增模型价格同步与费用统计,支持 API Key 概览页",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-01-28T16:33:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "054c7071ebd4d748cb9d31b6f29d661a5daa3923",
          "body": null,
          "is_bot": false,
          "headline": "添加自定义ip覆盖",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-01-21T05:01:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f91f070a7dfe9fd3eb2fdcafb0c7046c7a6731df",
          "body": null,
          "is_bot": false,
          "headline": "前端界面大修改,以及后端的优化",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-01-17T08:21:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a319497f7a4c5513905d7599bc3077612a89e4a",
          "body": null,
          "is_bot": false,
          "headline": "优化组织架构,添加对embedding模型支持",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-01-10T03:59:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dfabc0c054881369dd7513c1061c514935fdbdb7",
          "body": null,
          "is_bot": false,
          "headline": "优化健康加载",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-01-08T16:03:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51f2298f4f1a5a9c110cd1e44c4d3b31ecfdfbcb",
          "body": null,
          "is_bot": false,
          "headline": "添加token锁定",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-01-07T12:16:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f5d42d1969cce999bbeb3836598ddadff5d4c4b",
          "body": null,
          "is_bot": false,
          "headline": "增强错误处理以及前端ui界面问题",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-01-06T16:04:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40ee5161826bc51c83cd9736aea791ba0de9ccc2",
          "body": null,
          "is_bot": false,
          "headline": "修复健康显示问题",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-01-06T04:58:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79e7f84a9f8636f37cf80f27290f7e3b58e7bf61",
          "body": null,
          "is_bot": false,
          "headline": "修复对话接口不可用的问题",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-01-04T13:44:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "631d258b41213a6858d96e6243dee32fce0a1a28",
          "body": null,
          "is_bot": false,
          "headline": "添加Authorization请求头",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-01-04T11:31:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7627a618e33322107a8dc85a37a9aee820a70542",
          "body": null,
          "is_bot": false,
          "headline": "修改初始化配置",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-01-03T10:50:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f115aa856099f8037ab4c9164b8a1fc9d5165376",
          "body": null,
          "is_bot": false,
          "headline": "修改结构为go版本",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-01-03T10:36:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4a191dfbfe496b1b085289e52fa7066a570c128",
          "body": null,
          "is_bot": false,
          "headline": "添加健康检查、RPM限制等功能",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2026-01-02T07:37:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d90f4dd564c1bd3aadfc69c45d3643cc38189482",
          "body": null,
          "is_bot": false,
          "headline": "日志直接到数据库,不中转redis",
          "author_name": "racio",
          "author_login": "raciott",
          "committed_at": "2025-12-30T12:24:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 83,
      "commits_last_year": 104,
      "latest_release_at": "2026-08-01T14:03:29Z",
      "latest_release_tag": "v1.3.7",
      "releases_from_tags": true,
      "days_since_last_push": 3,
      "active_weeks_last_year": 27,
      "days_since_latest_release": 3,
      "mean_days_between_releases": 2.1
    },
    "artifacts": {
      "collected": true,
      "structure": [
        "tree.dockerfile",
        "tree.go_importable",
        "tree.go_main"
      ],
      "declarations": [
        {
          "name": null,
          "path": "webui/package.json",
          "tokens": [
            "npm.private"
          ],
          "ecosystem": "npm"
        }
      ]
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "readme_badges": {
        "hosts": [],
        "total": 0,
        "header": 0,
        "collected": true,
        "has_inspect_badge": false
      },
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 6,
      "stars": 15,
      "watchers": 1,
      "fork_history": {
        "days": [
          {
            "date": "2026-02-04",
            "count": 1
          },
          {
            "date": "2026-05-04",
            "count": 1
          },
          {
            "date": "2026-05-05",
            "count": 1
          },
          {
            "date": "2026-05-06",
            "count": 1
          },
          {
            "date": "2026-05-22",
            "count": 1
          },
          {
            "date": "2026-06-02",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 6,
        "total_forks": 6
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "webui/tsconfig.json"
      ],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 84336,
      "source_files_sampled": 239,
      "oversized_source_files": 4,
      "agent_instruction_files": [
        "AGENTS.md"
      ],
      "agent_instruction_max_bytes": 7529
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "webui/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go",
        "npm"
      ],
      "dependencies": [
        {
          "name": "github.com/gin-contrib/gzip",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.2.5"
        },
        {
          "name": "github.com/gin-gonic/gin",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.0"
        },
        {
          "name": "github.com/glebarez/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.0"
        },
        {
          "name": "github.com/joho/godotenv",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.1"
        },
        {
          "name": "github.com/samber/lo",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.52.0"
        },
        {
          "name": "github.com/tidwall/gjson",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.18.0"
        },
        {
          "name": "github.com/tidwall/sjson",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.2.5"
        },
        {
          "name": "github.com/tiktoken-go/tokenizer",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.7.0"
        },
        {
          "name": "golang.org/x/crypto/x509roots/fallback",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20251210140736-7dacc380ba00"
        },
        {
          "name": "golang.org/x/net",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.46.0"
        },
        {
          "name": "golang.org/x/sync",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.17.0"
        },
        {
          "name": "gorm.io/driver/mysql",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "gorm.io/gorm",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.31.1"
        },
        {
          "name": "@hookform/resolvers",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.1"
        },
        {
          "name": "@microsoft/fetch-event-source",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.1"
        },
        {
          "name": "@radix-ui/react-alert-dialog",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.14"
        },
        {
          "name": "@radix-ui/react-checkbox",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.2"
        },
        {
          "name": "@radix-ui/react-dialog",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.14"
        },
        {
          "name": "@radix-ui/react-label",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.7"
        },
        {
          "name": "@radix-ui/react-popover",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.15"
        },
        {
          "name": "@radix-ui/react-select",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.2.5"
        },
        {
          "name": "@radix-ui/react-slot",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.2.3"
        },
        {
          "name": "@radix-ui/react-switch",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.2.5"
        },
        {
          "name": "@radix-ui/react-tooltip",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.2.8"
        },
        {
          "name": "@tailwindcss/vite",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.11"
        },
        {
          "name": "@tanstack/react-virtual",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.11.0"
        },
        {
          "name": "@types/react-syntax-highlighter",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.5.13"
        },
        {
          "name": "class-variance-authority",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.1"
        },
        {
          "name": "clsx",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "date-fns",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.0"
        },
        {
          "name": "lucide-react",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.534.0"
        },
        {
          "name": "next-themes",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.4.6"
        },
        {
          "name": "react",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.1.0"
        },
        {
          "name": "react-day-picker",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.12.0"
        },
        {
          "name": "react-dom",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.1.0"
        },
        {
          "name": "react-hook-form",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.62.0"
        },
        {
          "name": "react-icons",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.5.0"
        },
        {
          "name": "react-markdown",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.0.1"
        },
        {
          "name": "react-router-dom",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.7.1"
        },
        {
          "name": "react-syntax-highlighter",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.5.0"
        },
        {
          "name": "remark-gfm",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.0"
        },
        {
          "name": "sonner",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.7"
        },
        {
          "name": "tailwind-merge",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.3.1"
        },
        {
          "name": "tailwindcss",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.11"
        },
        {
          "name": "zod",
          "manifest": "webui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.14"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "raciott",
          "commits": 104,
          "avatar_url": "https://avatars.githubusercontent.com/u/120193671?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "docker-image.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        "eslint.config.js"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 9,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "68 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "954c5cde9c55d5e1e1aed59a70753f8a984ebc46",
        "ran_at": "2026-08-05T08:48:07Z",
        "aggregate_score": 4.2,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "recent_prs": {
        "merged_7d": 0,
        "decided_7d": 0,
        "merged_30d": 0,
        "authors_30d": 0,
        "decided_30d": 0,
        "sample_size": 0,
        "window_days": 30,
        "sample_exhausted": false,
        "authors_probed_30d": 0,
        "newcomer_merged_30d": 0,
        "bot_prs_excluded_30d": 0,
        "newcomer_authors_30d": 0,
        "newcomer_decided_30d": 0
      },
      "ci_last_run_at": "2026-08-01T14:06:29Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/raciott/Orvion",
    "host": "github.com",
    "name": "Orvion",
    "owner": "raciott"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": "The weighted overall 51 is calibrated to 51 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 51,
            "calibrated": 51,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 51,
      "inputs": {
        "security": 42,
        "vitality": 85,
        "community": 36,
        "governance": 15,
        "calibration": "2026-08-02",
        "engineering": 74,
        "ai_readiness": 81,
        "weighted_overall_raw": 51
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 85,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "commits_last_year": 104,
              "human_commit_share": 1,
              "days_since_last_push": 3,
              "active_weeks_last_year": 27
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 3 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "27/52 weeks with commits",
                "points": 18.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 27
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "104 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 104
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "releases_count": 83,
              "latest_release_tag": "v1.3.7",
              "releases_from_tags": true,
              "days_since_latest_release": 3,
              "mean_days_between_releases": 2.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "83 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 83
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 3 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~2.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2.1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 3,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 3 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "weak",
        "name": "Community & Adoption",
        "value": 36,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "forks": 6,
              "stars": 15,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "15 stars",
                "points": 18.6,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "6 forks",
                "points": 5.8,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": 0,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "critical",
        "name": "Sustainability & Governance",
        "value": 15,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance, Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance",
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "prs_merged_7d": 0,
              "prs_decided_7d": 0,
              "prs_merged_30d": 0,
              "prs_decided_30d": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0,
              "first_time_authors_30d": 0,
              "first_time_prs_merged_30d": 0,
              "first_time_prs_decided_30d": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "followers": 0,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "raciott",
              "public_repos": 8,
              "account_age_days": 1334
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of raciott",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "raciott"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "8 public repos, account ~3 yr old",
                "points": 14.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 8
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 3
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 74,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "eslint.config.js",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "https://mork.de5.net",
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://mork.de5.net",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "weak",
        "name": "Security",
        "value": 42,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 42,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.2
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "68 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "excellent",
        "name": "AI Readiness",
        "value": 81,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.84,
              "agent_instruction_files": [
                "AGENTS.md"
              ],
              "agent_instruction_max_bytes": 7529
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "84 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 84,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "webui/tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "eslint.config.js",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "webui/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "webui/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 84336,
              "source_files_sampled": 239,
              "oversized_source_files": 4
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "4/239 source files over 60KB",
                "points": 54.1,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 239,
                      "oversized": 4
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "application"
      ],
      "labels": [
        "network-service",
        "web-ui"
      ],
      "scores": {
        "web-ui": 4,
        "application": 5,
        "network-service": 4
      },
      "primary": "network-service",
      "evidence": [
        {
          "tier": "structure",
          "label": "application",
          "source": "tree.go_main",
          "weight": 5
        },
        {
          "tier": "dependencies",
          "label": "network-service",
          "source": "dep:github.com/gin-gonic/gin",
          "weight": 4
        },
        {
          "tier": "dependencies",
          "label": "web-ui",
          "source": "dep:react-dom",
          "weight": 4
        },
        {
          "tier": "declared",
          "label": "library",
          "source": "npm.private",
          "weight": -3.6
        },
        {
          "tier": "structure",
          "label": "library",
          "source": "tree.go_importable",
          "weight": 3
        }
      ],
      "artifacts": [
        {
          "path": "webui/package.json",
          "labels": [],
          "ecosystem": "npm"
        }
      ],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": false
    },
    "metrics_version": "2.5.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "Could not fetch go package 'github.com/racio/orvion' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-05T08:48:14.549551Z",
  "schema_version": "0.31.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/r/raciott/Orvion.svg",
  "full_name": "raciott/Orvion",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v2.5.0, схема v0.31.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистика.