Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 1.13.0 · 2026-07-30 04:08 UTC

ably / ably-ai-transport-js

Ably AI Transport SDK to create reliable AI experiences built on durable sessions (Javascript, Node, Typescript, React, React Native)

TypeScriptApache-2.0★ 4 зірки⑂ 0 форківз бер. 2026 р.Переглянути на GitHub ↗

ably/ably-ai-transport-js має індекс здоров’я 72 зі 100, що відповідає смузі «Добрий». Найвищий показник — Vitality (86/100), найнижчий — Community & Adoption (42/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

72
загалом / 100
Добрий

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

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

72
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

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

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

Власність

214 підписників123 публічні репозиторіїз черв. 2012 р.

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
npm@ably/ai-transport0.6.02 71978 днів томуaiablyably-realtimetransportwebsockets

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

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

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

86Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
13.2/36Ритм комітів — 19/52 тижнів із комітами
18/18Обсяг комітів — 771 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year771
human_commit_share1
days_since_last_push0
active_weeks_last_year19
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 7 релізів
36/36Свіжість релізів — останній реліз 8 дн. тому
27/27Ритм релізів — реліз кожні ~19,3 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count7
latest_release_tag0.6.0
releases_from_tagsні
days_since_latest_release8
mean_days_between_releases19,3
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

42У зоні ризику · 18% загального індексу
Як обчислюється оцінка
7.7/60Зірки — 4 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks0
stars4
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (Apache-2.0)
18/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingтак
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні
Як обчислюється оцінка
45.8/80Щомісячні завантаження — 2 719 завантажень/місяць у npm
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packages@ably/ai-transport
dependents
ecosystemsnpm
total_downloads
monthly_downloads2 719
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

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

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

70Добрий · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
9.7/22.5Розподіл комітів — головний контриб’ютор — автор 57% комітів
13.5/13.5Широта контриб’юторів — 13 контриб’юторів
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Використані вхідні дані
bus_factor1
contributors_sampled13
top_contributor_share0,571
Як обчислюється оцінка
0/46.8Вирішення issue — немає issue або даних
31.2/38.3Прийняття PR — злито 215/264 вирішених PR
15/15OpenSSF Scorecard: Code-Review — all changesets reviewed
Використані вхідні дані
merged_prs215
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs49
Виключено з оцінювання (немає даних або не застосовно): Вирішення issue. Залишкові ваги перенормовано.
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
16.8/25Охоплення власника — 214 підписників у ably
25/25Послужний список — 123 публічних репозиторіїв, вік облікового запису ~14 р.
Використані вхідні дані
followers214
owner_typeOrganization
is_verified
owner_loginably
public_repos123
account_age_days5 155

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у npm
35/35Свіжість публікацій — остання публікація 8 дн. тому
20/20Історія версій — 7 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packages@ably/ai-transport
ecosystemsnpm
any_deprecatedні
min_days_since_publish8

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

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

86Відмінний · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 5 процес(ів) CI
24/24Наявні тести
16/16Конфігурація лінтера — .eslintrc.json, eslint.config.js, eslint.config.mjs
0/9.6Pre-commit-хуки
6.4/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 12 out of 12 merged PRs checked by a CI test -- score normalized to 10
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigтак
has_linter_configтак
has_precommit_configні
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://ably-ai-transport-js-demo-vercel-us.vercel.app
10/10Опис репозиторію
0/10Теми
0/10Wiki
Використані вхідні дані
topics
has_wikiні
homepagehttps://ably-ai-transport-js-demo-vercel-us.vercel.app
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

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

74Добрий · 16% загального індексу

Стан безпеки

67Помірний
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
3.8/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 12 out of 12 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
7.5/7.5Code-Review — all changesets reviewed
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — 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
5/5Pinned-Dependencies — all dependencies are pinned
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — немає даних
6/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 18 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate6,7
Виключено з оцінювання (немає даних або не застосовно): signed_releases. Залишкові ваги перенормовано.
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
0/25Непрямі залежності без відомих сповіщень — транзитивний набір не відокремлюється від залежностей розробки й тестування в цьому обсязі
0/40Немає задавнених сповіщень — жодне сповіщення не має дати публікації
Використані вхідні дані
sourceosv
advisories18
affected_packages4
assessed_packages611
unassessed_packages0
affected_by_severityhigh 3, low 1
direct_affected_packages0
Виключено з оцінювання (немає даних або не застосовно): Непрямі залежності без відомих сповіщень, Немає задавнених сповіщень. Залишкові ваги перенормовано. Звірено 611 резолвлених залежностей із OSV. Цей репозиторій не публікує пакета, який резолвить індекс, тож натомість оцінено граф залежностей репозиторію. Цей граф змішує закріплені версії для розробки й тестування зі справді постачаними залежностями, тож оцінюються лише задекларовані runtime-залежності; транзитивні знахідки подаються як контекст і в оцінку не входять. Досяжність не аналізується.

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

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

85Відмінний · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 100 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes7 464
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — .eslintrc.json, eslint.config.js, eslint.config.mjs
11/11Статична перевірка типів — demo/openai/react/use-client-session/tsconfig.json, demo/shared-frontend/tsconfig.json, demo/temporal/use-client-session-temporal/tsconfig.json, demo/vercel/react/use-chat-db/tsconfig.json, demo/vercel/react/use-chat-wdk/tsconfig.json, demo/vercel/react/use-chat/tsconfig.json, demo/vercel/react/use-client-session-db/tsconfig.json, demo/vercel/react/use-client-session/tsconfig.json, src/tsconfig.json, tsconfig.json
10/10Відтворюване середовище — lockfile
10/10Підтверджена практика роботи з агентами — 63 з останніх 100 комітів створено агентом або з його зазначенням
5/8Автоматизоване супроводження — автоматизацію залежностей налаштовано, але у вибірці комітів її не видно
10/10OpenSSF Scorecard: Pinned-Dependencies — all dependencies are pinned
Використані вхідні дані
has_nixні
has_testsтак
lockfilespnpm-lock.yaml
has_dockerfileні
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configтак
typecheck_configsdemo/openai/react/use-client-session/tsconfig.json, demo/shared-frontend/tsconfig.json, demo/temporal/use-client-session-temporal/tsconfig.json, demo/vercel/react/use-chat-db/tsconfig.json, demo/vercel/react/use-chat-wdk/tsconfig.json, demo/vercel/react/use-chat/tsconfig.json, demo/vercel/react/use-client-session-db/tsconfig.json, demo/vercel/react/use-client-session/tsconfig.json, src/tsconfig.json, tsconfig.json
agent_commit_share0,63
toolchain_manifests
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — TypeScript (статично типізована)
53.6/55Керовані розміри файлів — 11/446 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageTypeScript
largest_source_bytes223 067
source_files_sampled446
oversized_source_files11

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

4зірок GitHub
13контриб'юторів
771комітів за останні 12 місяців
0днів від останнього пушу
7релізів
1бас-фактор
0відкритих issue
npmпакетних екосистем

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

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Докладніше

OpenSSF Scorecard 6.7 / 10
6.7сукупно

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

10Binary-Artifactsno binaries found in the repo
5Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests12 out of 12 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
10Code-Reviewall changesets reviewed
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate 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
10Pinned-Dependenciesall dependencies are pinned
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
8Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities18 existing vulnerabilities detected
Усі залежності 611

Повний розв'язаний набір залежностей із графа залежностей GitHub: 0 прямих і 611 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
npm@ably/msgpack-js0.4.1непряма
npm@ai-sdk/gateway3.0.116непряма
npm@ai-sdk/provider3.0.10непряма
npm@ai-sdk/provider-utils4.0.27непряма
npm@antfu/install-pkg1.1.0непряма
npm@asamuzakjp/css-color3.2.0непряма
npm@babel/code-frame7.29.7непряма
npm@babel/compat-data7.29.7непряма
npm@babel/core7.29.7непряма
npm@babel/generator7.29.7непряма
npm@babel/helper-compilation-targets7.29.7непряма
npm@babel/helper-globals7.29.7непряма
npm@babel/helper-module-imports7.29.7непряма
npm@babel/helper-module-transforms7.29.7непряма
npm@babel/helper-string-parser7.29.7непряма
npm@babel/helper-validator-identifier7.29.7непряма
npm@babel/helper-validator-option7.29.7непряма
npm@babel/helpers7.29.7непряма
npm@babel/parser7.29.7непряма
npm@babel/runtime7.29.7непряма
npm@babel/template7.29.7непряма
npm@babel/traverse7.29.7непряма
npm@babel/types7.29.7непряма
npm@braintree/sanitize-url7.1.2непряма
npm@chevrotain/types11.1.2непряма
npm@csstools/color-helpers5.1.0непряма
npm@csstools/css-calc2.1.4непряма
npm@csstools/css-color-parser3.1.0непряма
npm@csstools/css-parser-algorithms3.0.5непряма
npm@csstools/css-tokenizer3.0.4непряма
npm@emnapi/core1.11.1непряма
npm@emnapi/runtime1.11.1непряма
npm@emnapi/wasi-threads1.2.2непряма
npm@eslint-community/eslint-utils4.9.1непряма
npm@eslint-community/regexpp4.12.2непряма
npm@eslint/config-array0.23.5непряма
npm@eslint/config-helpers0.6.0непряма
npm@eslint/core1.2.1непряма
npm@eslint/js10.0.1непряма
npm@eslint/object-schema3.0.5непряма
npm@eslint/plugin-kit0.7.2непряма
npm@floating-ui/core1.7.5непряма
npm@floating-ui/dom1.7.6непряма
npm@floating-ui/react-dom2.1.8непряма
npm@floating-ui/utils0.2.11непряма
npm@humanfs/core0.19.2непряма
npm@humanfs/node0.16.8непряма
npm@humanfs/types0.15.0непряма
npm@humanwhocodes/module-importer1.0.1непряма
npm@humanwhocodes/retry0.4.3непряма
npm@iconify/types2.0.0непряма
npm@iconify/utils3.1.3непряма
npm@jridgewell/gen-mapping0.3.13непряма
npm@jridgewell/remapping2.3.5непряма
npm@jridgewell/resolve-uri3.1.2непряма
npm@jridgewell/sourcemap-codec1.5.5непряма
npm@jridgewell/trace-mapping0.3.31непряма
npm@mermaid-js/parser1.2.0непряма
npm@napi-rs/wasm-runtime1.1.6непряма
npm@opentelemetry/api1.9.1непряма
npm@oxc-project/types0.137.0непряма
npm@pnpm/exe11.3.0непряма
npm@pnpm/linux-arm6411.3.0непряма
npm@pnpm/linux-x6411.3.0непряма
npm@pnpm/linuxstatic-arm6411.3.0непряма
npm@pnpm/linuxstatic-x6411.3.0непряма
npm@pnpm/macos-arm6411.3.0непряма
npm@pnpm/win-arm6411.3.0непряма
npm@pnpm/win-x6411.3.0непряма
npm@radix-ui/number1.1.2непряма
npm@radix-ui/primitive1.1.4непряма
npm@radix-ui/react-accessible-icon1.1.11непряма
npm@radix-ui/react-accordion1.2.15непряма
npm@radix-ui/react-alert-dialog1.1.18непряма
npm@radix-ui/react-arrow1.1.11непряма
npm@radix-ui/react-aspect-ratio1.1.11непряма
npm@radix-ui/react-avatar1.2.1непряма
npm@radix-ui/react-checkbox1.3.6непряма
npm@radix-ui/react-collapsible1.1.15непряма
npm@radix-ui/react-collection1.1.11непряма
npm@radix-ui/react-compose-refs1.1.3непряма
npm@radix-ui/react-context1.1.4непряма
npm@radix-ui/react-context-menu2.3.2непряма
npm@radix-ui/react-dialog1.1.18непряма
npm@radix-ui/react-direction1.1.2непряма
npm@radix-ui/react-dismissable-layer1.1.14непряма
npm@radix-ui/react-dropdown-menu2.1.19непряма
npm@radix-ui/react-focus-guards1.1.4непряма
npm@radix-ui/react-focus-scope1.1.11непряма
npm@radix-ui/react-form0.1.11непряма
npm@radix-ui/react-hover-card1.1.18непряма
npm@radix-ui/react-id1.1.2непряма
npm@radix-ui/react-label2.1.11непряма
npm@radix-ui/react-menu2.1.19непряма
npm@radix-ui/react-menubar1.1.19непряма
npm@radix-ui/react-navigation-menu1.2.17непряма
npm@radix-ui/react-one-time-password-field0.1.11непряма
npm@radix-ui/react-password-toggle-field0.1.6непряма
npm@radix-ui/react-popover1.1.18непряма
npm@radix-ui/react-popper1.3.2непряма
npm@radix-ui/react-portal1.1.13непряма
npm@radix-ui/react-presence1.1.6непряма
npm@radix-ui/react-primitive2.1.7непряма
npm@radix-ui/react-progress1.1.11непряма
npm@radix-ui/react-radio-group1.4.2непряма
npm@radix-ui/react-roving-focus1.1.14непряма
npm@radix-ui/react-scroll-area1.2.13непряма
npm@radix-ui/react-select2.3.2непряма
npm@radix-ui/react-separator1.1.11непряма
npm@radix-ui/react-slider1.4.2непряма
npm@radix-ui/react-slot1.3.0непряма
npm@radix-ui/react-switch1.3.2непряма
npm@radix-ui/react-tabs1.1.16непряма
npm@radix-ui/react-toast1.2.18непряма
npm@radix-ui/react-toggle1.1.13непряма
npm@radix-ui/react-toggle-group1.1.14непряма
npm@radix-ui/react-toolbar1.1.14непряма
npm@radix-ui/react-tooltip1.2.11непряма
npm@radix-ui/react-use-callback-ref1.1.2непряма
npm@radix-ui/react-use-controllable-state1.2.3непряма
npm@radix-ui/react-use-effect-event0.0.3непряма
npm@radix-ui/react-use-escape-keydown1.1.3непряма
npm@radix-ui/react-use-is-hydrated0.1.1непряма
npm@radix-ui/react-use-layout-effect1.1.2непряма
npm@radix-ui/react-use-previous1.1.2непряма
npm@radix-ui/react-use-rect1.1.2непряма
npm@radix-ui/react-use-size1.1.2непряма
npm@radix-ui/react-visually-hidden1.2.7непряма
npm@radix-ui/rect1.1.2непряма
npm@reflink/reflink0.1.19непряма
npm@reflink/reflink-darwin-arm640.1.19непряма
npm@reflink/reflink-darwin-x640.1.19непряма
npm@reflink/reflink-linux-arm64-gnu0.1.19непряма
npm@reflink/reflink-linux-arm64-musl0.1.19непряма
npm@reflink/reflink-linux-x64-gnu0.1.19непряма
npm@reflink/reflink-linux-x64-musl0.1.19непряма
npm@reflink/reflink-win32-arm64-msvc0.1.19непряма
npm@reflink/reflink-win32-x64-msvc0.1.19непряма
npm@rolldown/binding-android-arm641.1.3непряма
npm@rolldown/binding-darwin-arm641.1.3непряма
npm@rolldown/binding-darwin-x641.1.3непряма
npm@rolldown/binding-freebsd-x641.1.3непряма
npm@rolldown/binding-linux-arm-gnueabihf1.1.3непряма
npm@rolldown/binding-linux-arm64-gnu1.1.3непряма
npm@rolldown/binding-linux-arm64-musl1.1.3непряма
npm@rolldown/binding-linux-ppc64-gnu1.1.3непряма
npm@rolldown/binding-linux-s390x-gnu1.1.3непряма
npm@rolldown/binding-linux-x64-gnu1.1.3непряма
npm@rolldown/binding-linux-x64-musl1.1.3непряма
npm@rolldown/binding-openharmony-arm641.1.3непряма
npm@rolldown/binding-wasm32-wasi1.1.3непряма
npm@rolldown/binding-win32-arm64-msvc1.1.3непряма
npm@rolldown/binding-win32-x64-msvc1.1.3непряма
npm@rolldown/pluginutils1.0.1непряма
npm@sindresorhus/is4.6.0непряма
npm@standard-schema/spec1.1.0непряма
npm@szmarczak/http-timer4.0.6непряма
npm@testing-library/dom10.4.1непряма
npm@testing-library/react16.3.2непряма
npm@tybys/wasm-util0.10.3непряма
npm@types/aria-query5.0.4непряма
npm@types/cacheable-request6.0.3непряма
npm@types/chai5.2.3непряма
npm@types/d37.4.3непряма
npm@types/d3-array3.2.2непряма
npm@types/d3-axis3.0.6непряма
npm@types/d3-brush3.0.6непряма
npm@types/d3-chord3.0.6непряма
npm@types/d3-color3.1.3непряма
npm@types/d3-contour3.0.6непряма
npm@types/d3-delaunay6.0.4непряма
npm@types/d3-dispatch3.0.7непряма
npm@types/d3-drag3.0.7непряма
npm@types/d3-dsv3.0.7непряма
npm@types/d3-ease3.0.2непряма
npm@types/d3-fetch3.0.7непряма
npm@types/d3-force3.0.10непряма
npm@types/d3-format3.0.4непряма
npm@types/d3-geo3.1.0непряма
npm@types/d3-hierarchy3.1.7непряма
npm@types/d3-interpolate3.0.4непряма
npm@types/d3-path3.1.1непряма
npm@types/d3-polygon3.0.2непряма
npm@types/d3-quadtree3.0.6непряма
npm@types/d3-random3.0.4непряма
npm@types/d3-scale4.0.9непряма
npm@types/d3-scale-chromatic3.1.0непряма
npm@types/d3-selection3.0.11непряма
npm@types/d3-shape3.1.8непряма
npm@types/d3-time3.0.4непряма
npm@types/d3-time-format4.0.3непряма
npm@types/d3-timer3.0.2непряма
npm@types/d3-transition3.0.9непряма
npm@types/d3-zoom3.0.8непряма
npm@types/debug4.1.13непряма
npm@types/deep-eql4.0.2непряма
npm@types/esrecurse4.3.1непряма
npm@types/estree1.0.9непряма
npm@types/estree-jsx1.0.5непряма
npm@types/geojson7946.0.16непряма
npm@types/hast3.0.4непряма
npm@types/http-cache-semantics4.2.0непряма
npm@types/json-schema7.0.15непряма
npm@types/keyv3.1.4непряма
npm@types/mdast4.0.4непряма
npm@types/ms2.1.0непряма
npm@types/node26.0.1непряма
npm@types/react19.2.17непряма
npm@types/react-dom19.2.3непряма
npm@types/responselike1.0.3непряма
npm@types/trusted-types2.0.7непряма
npm@types/unist2.0.11непряма
npm@types/unist3.0.3непряма
npm@typescript-eslint/eslint-plugin8.62.0непряма
npm@typescript-eslint/parser8.62.0непряма
npm@typescript-eslint/project-service8.62.0непряма
npm@typescript-eslint/scope-manager8.62.0непряма
npm@typescript-eslint/tsconfig-utils8.62.0непряма
npm@typescript-eslint/type-utils8.62.0непряма
npm@typescript-eslint/types8.62.0непряма
npm@typescript-eslint/typescript-estree8.62.0непряма
npm@typescript-eslint/utils8.62.0непряма
npm@typescript-eslint/visitor-keys8.62.0непряма
npm@ungap/structured-clone1.3.2непряма
npm@upsetjs/venn.js2.0.0непряма
npm@vercel/oidc3.2.0непряма
npm@vitest/expect4.1.9непряма
npm@vitest/mocker4.1.9непряма
npm@vitest/pretty-format4.1.9непряма
npm@vitest/runner4.1.9непряма
npm@vitest/snapshot4.1.9непряма
npm@vitest/spy4.1.9непряма
npm@vitest/utils4.1.9непряма
npmably2.23.0непряма
npmacorn8.17.0непряма
npmacorn-jsx5.3.2непряма
npmagent-base7.1.4непряма
npmai6.0.185непряма
npmajv6.15.0непряма
npmansi-regex5.0.1непряма
npmansi-styles5.2.0непряма
npmaria-hidden1.2.6непряма
npmaria-query5.3.0непряма
npmassertion-error2.0.1непряма
npmbail2.0.2непряма
npmbalanced-match4.0.4непряма
npmbase64-js1.0.2непряма
npmbaseline-browser-mapping2.10.40непряма
npmbops1.0.1непряма
npmbrace-expansion5.0.7непряма
npmbrowserslist4.28.4непряма
npmcacheable-lookup5.0.4непряма
npmcacheable-request7.0.4непряма
npmcaniuse-lite1.0.30001799непряма
npmccount2.0.1непряма
npmchai6.2.2непряма
npmcharacter-entities2.0.2непряма
npmcharacter-entities-html42.1.0непряма
npmcharacter-entities-legacy3.0.0непряма
npmcharacter-reference-invalid2.0.1непряма
npmclass-variance-authority0.7.1непряма
npmclone-response1.0.3непряма
npmclsx2.1.1непряма
npmcomma-separated-tokens2.0.3непряма
npmcommander7.2.0непряма
npmcommander8.3.0непряма
npmconvert-source-map2.0.0непряма
npmcose-base1.0.3непряма
npmcose-base2.2.0непряма
npmcross-spawn7.0.6непряма
npmcssstyle4.6.0непряма
npmcsstype3.2.3непряма
npmcytoscape3.34.0непряма
npmcytoscape-cose-bilkent4.1.0непряма
npmcytoscape-fcose2.2.0непряма
npmd37.9.0непряма
npmd3-array2.12.1непряма
npmd3-array3.2.4непряма
npmd3-axis3.0.0непряма
npmd3-brush3.0.0непряма
npmd3-chord3.0.1непряма
npmd3-color3.1.0непряма
npmd3-contour4.0.2непряма
npmd3-delaunay6.0.4непряма
npmd3-dispatch3.0.1непряма
npmd3-drag3.0.0непряма
npmd3-dsv3.0.1непряма
npmd3-ease3.0.1непряма
npmd3-fetch3.0.1непряма
npmd3-force3.0.0непряма
npmd3-format3.1.2непряма
npmd3-geo3.1.1непряма
npmd3-hierarchy3.1.2непряма
npmd3-interpolate3.0.1непряма
npmd3-path1.0.9непряма
npmd3-path3.1.0непряма
npmd3-polygon3.0.1непряма
npmd3-quadtree3.0.1непряма
npmd3-random3.0.1непряма
npmd3-sankey0.12.3непряма
npmd3-scale4.0.2непряма
npmd3-scale-chromatic3.1.0непряма
npmd3-selection3.0.0непряма
npmd3-shape1.3.7непряма
npmd3-shape3.2.0непряма
npmd3-time3.1.0непряма
npmd3-time-format4.1.0непряма
npmd3-timer3.0.1непряма
npmd3-transition3.0.1непряма
npmd3-zoom3.0.0непряма
npmdagre-d3-es7.0.14непряма
npmdata-urls5.0.0непряма
npmdayjs1.11.21непряма
npmdebug4.4.3непряма
npmdecimal.js10.6.0непряма
npmdecode-named-character-reference1.3.0непряма
npmdecompress-response6.0.0непряма
npmdeep-is0.1.4непряма
npmdefer-to-connect2.0.1непряма
npmdelaunator5.1.0непряма
npmdequal2.0.3непряма
npmdetect-libc2.1.2непряма
npmdetect-node-es1.1.0непряма
npmdevlop1.1.0непряма
npmdom-accessibility-api0.5.16непряма
npmdompurify3.4.11непряма
npmelectron-to-chromium1.5.381непряма
npmend-of-stream1.4.5непряма
npmentities6.0.1непряма
npmes-module-lexer2.1.0непряма
npmes-toolkit1.49.0непряма
npmescalade3.2.0непряма
npmescape-string-regexp4.0.0непряма
npmescape-string-regexp5.0.0непряма
npmeslint10.6.0непряма
npmeslint-plugin-react-hooks7.1.1непряма
npmeslint-scope9.1.2непряма
npmeslint-visitor-keys3.4.3непряма
npmeslint-visitor-keys5.0.1непряма
npmespree11.2.0непряма
npmesquery1.7.0непряма
npmesrecurse4.3.0непряма
npmestraverse5.3.0непряма
npmestree-util-is-identifier-name3.0.0непряма
npmestree-walker3.0.3непряма
npmesutils2.0.3непряма
npmeventsource-parser3.1.0непряма
npmexpect-type1.4.0непряма
npmextend3.0.2непряма
npmfast-deep-equal3.1.3непряма
npmfast-json-stable-stringify2.1.0непряма
npmfast-levenshtein2.0.6непряма
npmfastestsmallesttextencoderdecoder1.0.22непряма
npmfdir6.5.0непряма
npmfile-entry-cache8.0.0непряма
npmfind-up5.0.0непряма
npmflat-cache4.0.1непряма
npmflatted3.4.2непряма
npmfsevents2.3.3непряма
npmgensync1.0.0-beta.2непряма
npmget-nonce1.0.1непряма
npmget-stream5.2.0непряма
npmglob-parent6.0.2непряма
npmgot11.8.6непряма
npmhachure-fill0.5.2непряма
npmhast-util-from-parse58.0.3непряма
npmhast-util-parse-selector4.0.0непряма
npmhast-util-raw9.1.0непряма
npmhast-util-sanitize5.0.2непряма
npmhast-util-to-jsx-runtime2.3.6непряма
npmhast-util-to-parse58.0.1непряма
npmhast-util-whitespace3.0.0непряма
npmhastscript9.0.1непряма
npmhermes-estree0.25.1непряма
npmhermes-parser0.25.1непряма
npmhtml-encoding-sniffer4.0.0непряма
npmhtml-url-attributes3.0.1непряма
npmhtml-void-elements3.0.0непряма
npmhttp-cache-semantics4.2.0непряма
npmhttp-proxy-agent7.0.2непряма
npmhttp2-wrapper1.0.3непряма
npmhttps-proxy-agent7.0.6непряма
npmiconv-lite0.6.3непряма
npmignore5.3.2непряма
npmignore7.0.5непряма
npmimport-meta-resolve4.2.0непряма
npmimurmurhash0.1.4непряма
npminline-style-parser0.2.7непряма
npminternmap1.0.1непряма
npminternmap2.0.3непряма
npmis-alphabetical2.0.1непряма
npmis-alphanumerical2.0.1непряма
npmis-decimal2.0.1непряма
npmis-extglob2.1.1непряма
npmis-glob4.0.3непряма
npmis-hexadecimal2.0.1непряма
npmis-plain-obj4.1.0непряма
npmis-potential-custom-element-name1.0.1непряма
npmisexe2.0.0непряма
npmjs-tokens4.0.0непряма
npmjsdom26.1.0непряма
npmjsesc3.1.0непряма
npmjson-buffer3.0.1непряма
npmjson-schema0.4.0непряма
npmjson-schema-traverse0.4.1непряма
npmjson-stable-stringify-without-jsonify1.0.1непряма
npmjson52.2.3непряма
npmkatex0.16.47непряма
npmkeyv4.5.4непряма
npmkhroma2.1.0непряма
npmlayout-base1.0.2непряма
npmlayout-base2.0.1непряма
npmlevn0.4.1непряма
npmlightningcss1.32.0непряма
npmlightningcss-android-arm641.32.0непряма
npmlightningcss-darwin-arm641.32.0непряма
npmlightningcss-darwin-x641.32.0непряма
npmlightningcss-freebsd-x641.32.0непряма
npmlightningcss-linux-arm-gnueabihf1.32.0непряма
npmlightningcss-linux-arm64-gnu1.32.0непряма
npmlightningcss-linux-arm64-musl1.32.0непряма
npmlightningcss-linux-x64-gnu1.32.0непряма
npmlightningcss-linux-x64-musl1.32.0непряма
npmlightningcss-win32-arm64-msvc1.32.0непряма
npmlightningcss-win32-x64-msvc1.32.0непряма
npmlocate-path6.0.0непряма
npmlodash-es4.18.1непряма
npmlongest-streak3.1.0непряма
npmlowercase-keys2.0.0непряма
npmlru-cache10.4.3непряма
npmlru-cache5.1.1непряма
npmlucide-react1.23.0непряма
npmlz-string1.5.0непряма
npmmagic-string0.30.21непряма
npmmarkdown-table3.0.4непряма
npmmarked16.4.2непряма
npmmarked17.0.6непряма
npmmdast-util-find-and-replace3.0.2непряма
npmmdast-util-from-markdown2.0.3непряма
npmmdast-util-gfm3.1.0непряма
npmmdast-util-gfm-autolink-literal2.0.1непряма
npmmdast-util-gfm-footnote2.1.0непряма
npmmdast-util-gfm-strikethrough2.0.0непряма
npmmdast-util-gfm-table2.0.0непряма
npmmdast-util-gfm-task-list-item2.0.0непряма
npmmdast-util-mdx-expression2.0.1непряма
npmmdast-util-mdx-jsx3.2.0непряма
npmmdast-util-mdxjs-esm2.0.1непряма
npmmdast-util-phrasing4.1.0непряма
npmmdast-util-to-hast13.2.1непряма
npmmdast-util-to-markdown2.1.2непряма
npmmdast-util-to-string4.0.0непряма
npmmermaid11.16.0непряма
npmmicromark4.0.2непряма
npmmicromark-core-commonmark2.0.3непряма
npmmicromark-extension-gfm3.0.0непряма
npmmicromark-extension-gfm-autolink-literal2.1.0непряма
npmmicromark-extension-gfm-footnote2.1.0непряма
npmmicromark-extension-gfm-strikethrough2.1.0непряма
npmmicromark-extension-gfm-table2.1.1непряма
npmmicromark-extension-gfm-tagfilter2.0.0непряма
npmmicromark-extension-gfm-task-list-item2.1.0непряма
npmmicromark-factory-destination2.0.1непряма
npmmicromark-factory-label2.0.1непряма
npmmicromark-factory-space2.0.1непряма
npmmicromark-factory-title2.0.1непряма
npmmicromark-factory-whitespace2.0.1непряма
npmmicromark-util-character2.1.1непряма
npmmicromark-util-chunked2.0.1непряма
npmmicromark-util-classify-character2.0.1непряма
npmmicromark-util-combine-extensions2.0.1непряма
npmmicromark-util-decode-numeric-character-reference2.0.2непряма
npmmicromark-util-decode-string2.0.1непряма
npmmicromark-util-encode2.0.1непряма
npmmicromark-util-html-tag-name2.0.1непряма
npmmicromark-util-normalize-identifier2.0.1непряма
npmmicromark-util-resolve-all2.0.1непряма
npmmicromark-util-sanitize-uri2.0.1непряма
npmmicromark-util-subtokenize2.1.0непряма
npmmicromark-util-symbol2.0.1непряма
npmmicromark-util-types2.0.2непряма
npmmimic-response1.0.1непряма
npmmimic-response3.1.0непряма
npmminimatch10.2.5непряма
npmms2.1.3непряма
npmnanoid3.3.15непряма
npmnatural-compare1.4.0непряма
npmnext-themes0.4.6непряма
npmnode-releases2.0.50непряма
npmnormalize-url6.1.0непряма
npmnwsapi2.2.24непряма
npmobug2.1.3непряма
npmonce1.4.0непряма
npmoptionator0.9.4непряма
npmp-cancelable2.1.1непряма
npmp-limit3.1.0непряма
npmp-locate5.0.0непряма
npmpackage-manager-detector1.7.0непряма
npmparse-entities4.0.2непряма
npmparse57.3.0непряма
npmpath-data-parser0.1.0непряма
npmpath-exists4.0.0непряма
npmpath-key3.1.1непряма
npmpathe2.0.3непряма
npmpicocolors1.1.1непряма
npmpicomatch4.0.4непряма
npmpnpm11.3.0непряма
npmpoints-on-curve0.2.0непряма
npmpoints-on-path0.2.1непряма
npmpostcss8.5.15непряма
npmprelude-ls1.2.1непряма
npmprettier3.9.3непряма
npmpretty-format27.5.1непряма
npmproperty-information7.2.0непряма
npmpump3.0.4непряма
npmpunycode2.3.1непряма
npmquick-lru5.1.1непряма
npmradix-ui1.6.1непряма
npmreact19.2.6непряма
npmreact-dom19.2.6непряма
npmreact-is17.0.2непряма
npmreact-remove-scroll2.7.2непряма
npmreact-remove-scroll-bar2.3.8непряма
npmreact-style-singleton2.2.3непряма
npmrehype-harden1.1.8непряма
npmrehype-raw7.0.0непряма
npmrehype-sanitize6.0.0непряма
npmremark-gfm4.0.1непряма
npmremark-parse11.0.0непряма
npmremark-rehype11.1.2непряма
npmremark-stringify11.0.0непряма
npmremend1.3.0непряма
npmresolve-alpn1.2.1непряма
npmresponselike2.0.1непряма
npmrobust-predicates3.0.3непряма
npmrolldown1.1.3непряма
npmroughjs4.6.6непряма
npmrrweb-cssom0.8.0непряма
npmrw1.3.3непряма
npmsafer-buffer2.1.2непряма
npmsaxes6.0.0непряма
npmscheduler0.27.0непряма
npmsemver6.3.1непряма
npmsemver7.8.5непряма
npmshebang-command2.0.0непряма
npmshebang-regex3.0.0непряма
npmsiginfo2.0.0непряма
npmsource-map-js1.2.1непряма
npmspace-separated-tokens2.0.2непряма
npmstackback0.0.2непряма
npmstd-env4.1.0непряма
npmstreamdown2.5.0непряма
npmstringify-entities4.0.4непряма
npmstyle-to-js1.1.21непряма
npmstyle-to-object1.0.14непряма
npmstylis4.4.0непряма
npmsymbol-tree3.2.4непряма
npmtailwind-merge3.6.0непряма
npmtinybench2.9.0непряма
npmtinyexec1.2.4непряма
npmtinyglobby0.2.17непряма
npmtinyrainbow3.1.0непряма
npmtldts6.1.86непряма
npmtldts-core6.1.86непряма
npmto-utf80.0.1непряма
npmtough-cookie5.1.2непряма
npmtr465.1.1непряма
npmtrim-lines3.0.1непряма
npmtrough2.2.0непряма
npmts-api-utils2.5.0непряма
npmts-dedent2.3.0непряма
npmtslib2.8.1непряма
npmtype-check0.4.0непряма
npmtypescript5.9.3непряма
npmtypescript-eslint8.62.0непряма
npmulid2.4.0непряма
npmundici-types8.3.0непряма
npmunified11.0.5непряма
npmunist-util-is6.0.1непряма
npmunist-util-position5.0.0непряма
npmunist-util-stringify-position4.0.0непряма
npmunist-util-visit5.1.0непряма
npmunist-util-visit-parents6.0.2непряма
npmupdate-browserslist-db1.2.3непряма
npmuri-js4.4.1непряма
npmuse-callback-ref1.3.3непряма
npmuse-sidecar1.1.3непряма
npmuuid14.0.1непряма
npmvfile6.0.3непряма
npmvfile-location5.0.3непряма
npmvfile-message4.0.3непряма
npmvite8.1.0непряма
npmvitest4.1.9непряма
npmw3c-xmlserializer5.0.0непряма
npmweb-namespaces2.0.1непряма
npmwebidl-conversions7.0.0непряма
npmwhatwg-encoding3.1.1непряма
npmwhatwg-mimetype4.0.0непряма
npmwhatwg-url14.2.0непряма
npmwhich2.0.2непряма
npmwhy-is-node-running2.3.0непряма
npmword-wrap1.2.5непряма
npmwrappy1.0.2непряма
npmws8.21.0непряма
npmxml-name-validator5.0.0непряма
npmxmlchars2.2.0непряма
npmyallist3.1.1непряма
npmyocto-queue0.1.0непряма
npmzod4.4.3непряма
npmzod-validation-error4.0.2непряма
npmzwitch2.0.4непряма
Сповіщення про залежності 4

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

ПакетВерсіяЗв'язокКритичністьСповіщеньВиправлено в
brace-expansion5.0.7непрямависока15.0.8
pnpm11.3.0непрямависока1511.8.0
postcss8.5.15непрямависока18.5.18
dompurify3.4.11непряманизька13.4.12

Сповіщення означає, що версія, записана в графі залежностей, потрапляє в уражений діапазон. Досяжність не аналізується, а граф містить піниї розробки й тестування — знахідка може стосуватися інструментів, а не поставленого коду.

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 152411,
      "has_wiki": false,
      "homepage": "https://ably-ai-transport-js-demo-vercel-us.vercel.app",
      "languages": {
        "Shell": 4164,
        "JavaScript": 6111,
        "TypeScript": 2906840
      },
      "pushed_at": "2026-07-29T18:11:07Z",
      "created_at": "2026-03-24T11:29:15Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-29T16:14:58Z",
      "description": "Ably AI Transport SDK to create reliable AI experiences built on durable sessions (Javascript, Node, Typescript, React, React Native)",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "https://ably.com/documentation",
      "name": "Ably Realtime - our client library SDKs and libraries",
      "type": "Organization",
      "login": "ably",
      "company": null,
      "location": "London, UK",
      "followers": 214,
      "avatar_url": "https://avatars.githubusercontent.com/u/1859245?v=4",
      "created_at": "2012-06-17T17:14:20Z",
      "is_verified": null,
      "public_repos": 123,
      "account_age_days": 5155
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "0.6.0",
          "kind": "minor",
          "published_at": "2026-07-21T15:31:33Z"
        },
        {
          "tag": "0.5.0",
          "kind": "minor",
          "published_at": "2026-07-09T13:09:08Z"
        },
        {
          "tag": "0.4.0",
          "kind": "minor",
          "published_at": "2026-07-01T14:40:47Z"
        },
        {
          "tag": "0.3.0",
          "kind": "minor",
          "published_at": "2026-06-19T17:07:46Z"
        },
        {
          "tag": "0.2.0",
          "kind": "minor",
          "published_at": "2026-06-08T14:52:35Z"
        },
        {
          "tag": "0.1.0",
          "kind": "minor",
          "published_at": "2026-04-23T12:59:44Z"
        },
        {
          "tag": "0.0.1",
          "kind": "patch",
          "published_at": "2026-03-27T14:20:07Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "57bb9c79544d736d3466a718538e41f4f89e2a0d",
          "body": "The OpenAI demo carried its own copy of the shared frontend's codec-free\nchrome, file for file and tests included. None of that code touches the\nmessage format, so it had no reason to be duplicated. The Ably client\nsetup mattered most: its NEXT_PUBLIC_ABLY_ENDPOINT read has to match the\nendpoint the\n[…]\nassName resolves to no rule.\n\nThe suggestion-chips test moves into shared-frontend, which had no\nequivalent. The avatar-stack and channel-name tests go, as case-for-case\nduplicates of the shared ones.",
          "is_bot": false,
          "headline": "Reuse the shared frontend in the OpenAI demo",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-29T16:14:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6817f03d6ef3b8f2ecb44e81c73f4ec094f217f1",
          "body": "The OpenAI entry point landed with an exports-map entry and a typedoc\nentry, without the root shim directory that react/, vercel/ and\ntemporal/ all have. Bundlers that ignore the package.json exports field,\nMetro among them, resolve subpaths as directories, so they could not\nresolve @ably/ai-transpo\n[…]\n with async-iterable pipe sources. The OpenAI\ncodec's compile-time assignability proof and the e2e README both\ndescribed a hand-built ReadableStream, where the demo now yields from an\nasync generator.",
          "is_bot": false,
          "headline": "Ship the openai/ entry-point shim",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-29T16:14:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6cf49992e14cd550b9541be91eff98bd09645aa8",
          "body": "A tool run publishes its function_call and its function_call_output in\nseparate messages (one per run.pipe call), each rendered as its own\nassistant bubble. Two demo behaviours assumed the call and output shared\na single message, so both broke once a tool ran.\n\n- useDemoProgress: ranServerWeather no\n[…]\nle, and\n  check the last bubble for the location reply text.\n\nAdd a unit test covering the getWeather call and output arriving in\nseparate messages. Reword three comments to drop the \"rides\" metaphor.",
          "is_bot": false,
          "headline": "Fix openai demo weather-tool detection across split messages",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-29T16:14:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0a33ad7217478b65d27fa7855d18b52d7c9b06fe",
          "body": "Overload run.pipe, step.pipe, and the underlying pipeStream to accept\neither a ReadableStream<TOutput> or an AsyncIterable<TOutput>, exposed\nas a new PipeSource union. OpenAI's /responses streams are already\nasync-iterable, so agents can now pipe them straight in without wrapping\nthem in a hand-buil\n[…]\nd to the test stub.\n\nUnit tests cover the async-iterable source: reading to completion, an\nempty iterable, an error mid-stream, and iterator.return() being called\non both cancel and normal completion.",
          "is_bot": false,
          "headline": "Accept async iterables as pipe sources",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-29T16:14:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5f89ec3bf24ccd342c618de02b482687ace34e63",
          "body": "Add a Next.js demo under demo/openai that drives the OpenAI Responses\ncodec through useClientSession, with a mock model, tool calls, a debug\npane, and Playwright e2e coverage.\n\nAdd the demo to the build and e2e matrices in the dev workflow so CI\nexercises it alongside the Vercel demos.",
          "is_bot": false,
          "headline": "Add the OpenAI Responses demo and wire it into CI",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-29T16:14:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7247e928bd65ed4a25d9b17996c87d808a8a2b13",
          "body": "Add the OpenAI Responses codec to the docs index: the entry-point table,\nthe peer-dependency list, and the status paragraph, marked early\npreview.",
          "is_bot": false,
          "headline": "Document the OpenAI entry point",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-29T16:14:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84dc44083969fffb6d28d054fd5481bd815562d4",
          "body": "Introduce a codec for the OpenAI Responses streaming API, built on the\ncore codec constructs the earlier commits landed. It maps the Responses\nstream events onto the wire, reduces them into conversation messages,\nand repairs mid-stream joins through decoderSynthesiseLifecycle.\n\nShip it as the @ably/\n[…]\nypes independently.\n\nGeneralise the abstractions rule from two layers to one generic layer\nplus many codecs, add the openai entry-point row, and document the wire\ncuration rule and the drop construct.",
          "is_bot": false,
          "headline": "Add the OpenAI Responses codec and entry point",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-29T16:14:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c3a8bd6cfb32a52247a98243287963060fc8c1b8",
          "body": "Rework how a codec declares its output streams so the shape reads\ndeclaratively and the encode and decode paths stay in step.\n\nAn output stream now names a streamId extractor that pulls the wire\nstream id straight off the event, which replaces the old idField\nlookup. The start, delta, and end phases\n[…]\nPI, so it does not\ntypecheck at this commit; the follow-up adapts it.\n\nTests cover the new output-descriptor encode and decode paths,\nincluding delta rebuild from header fields and the drop construct.",
          "is_bot": false,
          "headline": "Redesign the core output-descriptor codec API",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-29T16:14:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ceca7685487387440b1e89dd34fce8fcabd599fb",
          "body": "Delete the public PipeOptions type and the plumbing that threaded it\nthrough the run step writer into pipeStream. Nothing outside the tests\never supplied it.\n\nAll three of its fields are superseded. parent and forkOf resolve from\nthe triggering input's wire headers: resolveTriggerMetadata computes t\n[…]\ners named sources that do\nnot exist (runParent, invocation.parent); they now describe what\nresolveTriggerMetadata actually resolves.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Narrow Run.pipe and RunStep.pipe to pipe(stream)",
          "author_name": "João Dias",
          "author_login": "JoaoDiasAbly",
          "committed_at": "2026-07-29T13:54:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a32bc0cdb22179e178b441665cbc98222763af6e",
          "body": "The WDK-only fault-injection controls and process panel hardcoded a\ndark-theme palette (near-black -950 backgrounds with bright -400/-300\ntext) with no theme variant, so in light mode the WDK status / attempt /\ndied badges and the armed fault chip looked too dark and the amber text\nwas hard to read \n[…]\nade (soft -100 tint + deep -700/-800 text) as the\ndefault and keep the existing design under `dark:`, leaving dark mode\nunchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: fix light-theme WDK badge and fault-chip colours",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T13:23:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2045f3cd7564c92aa87bc8bab73c637690e3b446",
          "body": "Mount the shared ThemeProvider in the root layout and drop the hardcoded `dark`\nclass so the shared ThemeToggle can switch System / Dark / Light;\nsuppressHydrationWarning covers the class next-themes sets on <html>.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: wire the shared theme selector into the use-chat-wdk demo",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T13:23:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "470eb108912b46f9ec6c3c9f90a1d7da303ffca3",
          "body": "Replace this durable-execution demo's raw-Tailwind components with the shared\n@ably-ai-demos/frontend package: the chat renders the shared ChatShell +\nBranchingMessageList + DebugPane via a useChat container (mirroring the use-chat\ndemo), while the WDK-specific UI and server driver stay in the demo \n[…]\ne; the lockfile is regenerated and\nthe demo's broken next-lint script is replaced with the flat ESLint config the\nother demos use.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: adopt the shadcn shared UI in the use-chat-wdk demo",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T13:23:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "edad8fae82cce0000f791ad5a1d82801ae6ecd17",
          "body": "Mount the shared ThemeProvider in the root layout and drop the hardcoded `dark`\nclass so the shared ThemeToggle can switch System / Dark / Light;\nsuppressHydrationWarning covers the class next-themes sets on <html>.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: wire the shared theme selector into the use-client-session-db demo",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T13:19:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "41a4c56f0f78cb839cd9fc9c734d944b5649161b",
          "body": "Replace this DB-hydration demo's in-demo shadcn components with the shared\n@ably-ai-demos/frontend package: the chat renders the shared ChatShell +\nLinearMessageList + DebugPane, driven by its existing linear ClientSession\ncontainer (database seed reconciled with the live channel via\nuseMessagesWith\n[…]\ny Providers, the scenario model, and the\ntheme. The lockfile is regenerated and the redundant in-demo UI dependencies are\ndropped.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: adopt the shadcn shared UI in the use-client-session-db demo",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T13:19:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c11f660301f36c190301058f403a1631e84acae7",
          "body": "Mount the shared ThemeProvider in the root layout and drop the hardcoded `dark`\nclass so the shared ThemeToggle can switch System / Dark / Light;\nsuppressHydrationWarning covers the class next-themes sets on <html>.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: wire the shared theme selector into the use-chat-db demo",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T13:09:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5631fae126075ea8226fb984f670bf6d3629d711",
          "body": "Replace this DB-hydration demo's in-demo shadcn components with the shared\n@ably-ai-demos/frontend package: the chat renders the shared ChatShell +\nLinearMessageList + DebugPane, driven by its existing linear useChat container\n(seeded from the database and reconciled with the live channel via\nuseMes\n[…]\ny Providers, the scenario model, and the\ntheme. The lockfile is regenerated and the redundant in-demo UI dependencies are\ndropped.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: adopt the shadcn shared UI in the use-chat-db demo",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T13:09:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "228e1b75e655167c76766683094e9b1bdd295dcb",
          "body": "Mount the shared ThemeProvider in the root layout and drop the hardcoded `dark`\nclass so the shared ThemeToggle can switch System / Dark / Light;\nsuppressHydrationWarning covers the class next-themes sets on <html>.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: wire the shared theme selector into the use-chat demo",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T13:00:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "aa03512b3ede2e6a20df844fea5123a911dbb81d",
          "body": "Replace the use-chat demo's in-demo shadcn components with the shared\n@ably-ai-demos/frontend package: the chat renders the shared ChatShell +\nBranchingMessageList + DebugPane, driven by a thin useChat container that maps\nthe shared component callbacks to sendMessage / regenerate /\naddToolApprovalRe\n[…]\n with Tailwind scanning the injected copy). The lockfile is regenerated\nand the now-redundant in-demo UI dependencies are dropped.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: adopt the shadcn shared UI in the use-chat demo",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T13:00:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9816a35d54b76348503323503c0d3ab769aaa262",
          "body": "…alette\n\nAdd a shared ThemeToggle — a segmented System / Dark / Light control modelled on\nthe Ably docs toggle, System by default — driven by next-themes, plus a shared\nThemeProvider each demo mounts in its root layout; the layouts drop the\nhardcoded `dark` class so the palette can switch.\n\nThe shad\n[…]\nmessages, UIMessages, Lifecycle)\nso it reads on a light background. The shared package now toggles cleanly\nbetween light and dark.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: add a System / Dark / Light theme selector and tune the light p…",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T12:52:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9163e0c0f54990d28bcab4fc36cf6996e54224b4",
          "body": "…labels\n\nThe shared shadcn branch navigator exposes its Previous/Next controls as\nchevron-icon buttons with an aria-label (and a tooltip), not a title attribute.\nPoint the use-client-session branch-navigation e2e at those aria-labels so it\ndrives the shared control the same way the use-chat suite already does. The\nregenerate/edit buttons still carry title attributes and their selectors are\nunchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: point the use-client-session branch-nav e2e at the shadcn aria-…",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T12:52:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "377eedd45ffdbc71b9d85d5eac4853211ce22770",
          "body": "The pending-tool row counted an input's keys via an `as object` cast; a\n`typeof input === 'object'` guard narrows the unknown input the same way without\nthe cast, keeping every cast in the package explained.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: narrow instead of cast in the shared tool invocation",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T12:52:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6e428c125f68d8a05178cb7145778c6164f99502",
          "body": "The DB demos render a plain, non-branching transcript — no branch navigation,\nedit/regenerate, run-metadata badges, or history pagination. Add a\nLinearMessageList alongside the branching one, over the same MessageBubble atom\nand stick-to-bottom hook, so those demos consume the shared list instead of\n[…]\n It wraps each bubble in a role/id/state-tagged element, emitting\nboth the wrapper and bubble test ids the seeded demos assert on.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: add a linear message list to the shared UI package",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T12:52:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7840c6abf5ba32ee410a76c9f658b933d9fc2bc5",
          "body": "Move use-client-session and the Temporal demo onto the rebuilt shared package:\nthe shadcn theme (imported from the package, with Tailwind scanning the injected\nnode_modules copy that Next transpiles), the unified scenario list, and the\nconfigurable header. The Temporal demo takes its own header titl\n[…]\nhip prompts are\nnow authored once instead of in two divergent shapes. Lockfiles are regenerated\nfor the added shadcn dependencies.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: adopt the shadcn shared UI in the ClientSession and Temporal demos",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T12:52:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d6b9994ae86661bb46066e23cecd316297de3e9e",
          "body": "The shared demo UI package was on raw Tailwind while the newer demos carried an\nin-demo shadcn conversion, leaving two divergent UI codebases. Rebuild the\nshared package on shadcn so it can be the single source of demo UI: the\ncomponents/ui primitives with the demos' custom variants, a centralized\nT\n[…]\nath needs. radix-ui is a peer dependency (a single copy for tooltip\ncontext); the other shadcn libraries are regular dependencies.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: rebuild the shared UI package on shadcn",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-29T12:52:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b0121d7b547287303e168165bd4b68507487ed2b",
          "body": "The codebase spelled `startSerial` for two unrelated things: a step\nattempt's identity (the channel serial of its `ai-step-start`) and a run's\nown start serial, which orders sibling reply runs. The two sit about\nfifteen lines apart inside `applyMessage`, so reading either one meant\nfirst working out\n[…]\ntepId` and `stepStartSerial`. That field is optional and has\nno in-tree consumer, so nothing would otherwise catch it being dropped.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Rename the step-attempt serial to step-start-serial",
          "author_name": "João Dias",
          "author_login": "JoaoDiasAbly",
          "committed_at": "2026-07-29T12:27:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca923d8f55a6810461626220f8534ce45595d67d",
          "body": "RunRuntime.onMessage and EncoderOptions.onMessage both take an\nAbly.Message, but the SDK keeps three \"message\" types apart: the wire\nmessage, the codec message, and the domain message. onAblyMessage matches\nthe vocabulary already in use elsewhere: ablyMessage parameters,\nuseAblyMessages, View's _onT\n[…]\n-session test supplies it and asserts it observes the SDK's own\nheader stamp, which pins the composition order the rename preserves.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Rename the pre-publish hooks to onAblyMessage",
          "author_name": "João Dias",
          "author_login": "JoaoDiasAbly",
          "committed_at": "2026-07-29T11:37:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bc607907a736d7cf8ab5816d45a4435cc3556c51",
          "body": "The awaitRunComplete helper waits for a run's status to reach complete.\nIts synchronous check races the self-echoed run-end folding onto the\nagent's own Tree; when it lost that race it fell back to a listener on\nthe tree's `update` event. But `update` is the structural channel and\nnever fires for a \n[…]\nn `run` instead: it fires unconditionally for every lifecycle\nevent, including the terminal run-end, so the fallback always wakes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "agentSession: fix flaky suspend/resume test wait helper",
          "author_name": "Lewis Marshall",
          "author_login": "lmars",
          "committed_at": "2026-07-28T20:15:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4625cdcb77b7d10098f38dbd311292a8e6e691ca",
          "body": "Silence the two bots that comment on every PR. The Vercel GitHub\nintegration gets \"github\": {\"silent\": true} in each linked demo's\nvercel.json, and the vitest coverage report action is removed from\nthe test job along with its pull-requests: write permission.\n\nThe test job now runs plain pnpm test on both Node versions, since\ncoverage was only collected to feed the removed comment.",
          "is_bot": false,
          "headline": "Stop Vercel and coverage bot comments on PRs",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-27T10:06:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15104be05ccba2bb701e574f1f5447dda1d8e613",
          "body": "Update the internals and framework docs to describe the codec API as it\nnow stands: the streamId extractor, the grouped start, delta, and end\nphases, the drop construct, and the factories selector.\n\nRename the stale decodeLifecycle references to decoderSynthesiseLifecycle\nso the docs match the config key the code reads.",
          "is_bot": false,
          "headline": "Document the redesigned core and Vercel codec API",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-23T11:20:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2af30762b3784920fdaa341811be552ad72fff9a",
          "body": "Adapt the Vercel codec to the redesigned output-descriptor API from the\nprevious commit. Its output streams now declare a streamId extractor and\nthe grouped start, delta, and end phases, and its inputs select through\nthe per-codec factories selector.\n\nThis is what makes the tree typecheck again after the core redesign.",
          "is_bot": false,
          "headline": "Move the Vercel codec onto the new codec API",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-23T11:20:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42eea45c1c90b241d4c7803969fdf79e0f239a6c",
          "body": "Rework how a codec declares its output streams so the shape reads\ndeclaratively and the encode and decode paths stay in step.\n\nAn output stream now names a streamId extractor that pulls the wire\nstream id straight off the event, which replaces the old idField\nlookup. The start, delta, and end phases\n[…]\nPI, so it does not\ntypecheck at this commit; the follow-up adapts it.\n\nTests cover the new output-descriptor encode and decode paths,\nincluding delta rebuild from header fields and the drop construct.",
          "is_bot": false,
          "headline": "Redesign the core output-descriptor codec API",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-23T11:20:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a739286ea53b6bb39f21ba57c47621757934aa06",
          "body": "Drop the blanket \"never commit changes\" and \"never push or pull the\nremote\" rules. In other repos, Claude already exercises sound judgement\nabout when to commit or push, typically only doing so when the user\nasks — banning the actions outright didn't add a safety margin, it just\nmeant Claude wouldn'\n[…]\n and can be skipped unless asked for.\n\nDiscussed with Mike Christensen:\nhttps://ably-real-time.slack.com/archives/C04KNCEP4RH/p1784716730499679\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "CLAUDE.md: relax commit/push ban and scope code-review-all",
          "author_name": "Lewis Marshall",
          "author_login": "lmars",
          "committed_at": "2026-07-23T10:00:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e3cb9a3331331c0088c0aa415629017f0762d2db",
          "body": "When ABLY_LOCAL_SANDBOX_URL is set, the integration globalSetup provisions its\napp through a local sandbox's POST /apps (the same appspec as the cloud sandbox)\ninstead of the cloud, and routes every client at the isolated server that\nresponse describes (its own endpoint/port/tls). All inert unless t\n[…]\nmechanism already used for the API key. The all-powerful key\nstays at appspec index 5, which both sandboxes echo in appspec order.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Support running the test suite against ABLY_LOCAL_SANDBOX_URL",
          "author_name": "Lewis Marshall",
          "author_login": "lmars",
          "committed_at": "2026-07-22T10:57:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c0358b76d6ed93566327fa815dd41b5423f4dc6f",
          "body": "Bump package.json and src/version.ts to 0.6.0 and add the 0.6.0 CHANGELOG\nentry. The headline is mid-run steering: a client can publish a follow-up\nuser message into an already-active run with run.steer(), and the agent\nfolds it in and runs another inference pass, without cancelling the run,\nstartin\n[…]\nrt with the\ncreateUIMessageCodec() factory, retries connect() after a failed initial\nattach, and gives errors more accurate codes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v0.6.0",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-21T15:30:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e80be4840fe68b05b84b459106c51caba19eeec5",
          "body": "…y) breaks\n\nA visible break (a removed or renamed export, or a changed signature) errors at\ncompile time on upgrade and needs only a one-line entry; the compiler surfaces\nit. A silent break keeps the same signature but changes runtime behaviour, so it\ncompiles clean and only bites at runtime (e.g. 0\n[…]\nule\nexplicitly: an entry describes the change and stops; migration guides and\nbenefit prose belong in the docs, not the changelog.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "changelog skill: reserve before/after samples for silent (runtime-onl…",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-21T15:30:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b7c14014d56a5bc964049962bd8a08343bdbc322",
          "body": "… skill\n\nThe release skill bumped the version and staged the changelog, then left\nthe PR to the human without prescribing a body, so each release described\nits changelog coverage differently. A reviewer could not tell from the PR\nalone which merged PRs reached the changelog and which were deliberate\n[…]\nndow, plus a\nrebase-before-cutting note when the release documents not-yet-merged PRs\nahead of merge. Nothing is silently dropped.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "tooling: document the release-PR description structure in the release…",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-21T15:30:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "87a03007ecf52e5a96902055370f2468f9e23f95",
          "body": "When a user steers a run while it is suspended (waiting for a\nclient-executed or approval-gated tool), that steering message folds\ninto the run tagged with the run's real wire id. The resuming run\nobject still holds the provisional id it minted at construction, and it\nlearns the real id only once it\n[…]\ner the Tree stamp parsing (present, absent, malformed), the\nagent-session rehydration (recovered when unanswered, skipped when\nalready answered), and end-to-end steering during approval in both\ndemos.",
          "is_bot": false,
          "headline": "Rehydrate a steering message lost on resume",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-21T14:08:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bbcd575e202ed8420568cd6d5f4507edc2aeb53b",
          "body": "pendingToolCalls and approvedPendingToolCalls inspected only the\ntrailing message and bailed unless it was an assistant. When a client\nsteering message folds into a run while a tool-call pass is streaming,\nit sorts after the assistant tool-call message in raw run.messages\norder and becomes the tail.\n[…]\ne two \"last message is not an assistant\" tests to \"no\nassistant message\", and add trailing-steer coverage for both\npendingToolCalls (input-available) and approvedPendingToolCalls\n(approval-responded).",
          "is_bot": false,
          "headline": "Find pending tool calls on last assistant, not last message",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-21T14:08:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "356ec43cb71a8c948763d8ef129f0419bcaa481e",
          "body": "Route \"/steer <text>\" in the db demo's local chat to fold a follow-up\nuser message into the active run instead of the default cancel-then-\nsend. Track active run handles in a ref keyed by runId, registering on\nrun.started and clearing on run end, so the composer can look up the\nlatest active or susp\n[…]\nteerOutcome,\nand steerRejected entry types and colors.\n\n- chat tests cover folding a /steer into the active run without\n  cancelling or sending a new turn, and rejecting /steer when no run is\n  active",
          "is_bot": false,
          "headline": "Add mid-run steering to the use-client-session-db demo",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-21T14:08:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "49ac15f6c5914bbd616e062c632fdce9718eed26",
          "body": "A steer is a follow-up user message a client folds into an active run.\nThe run node's projection is rebuilt in canonical serial order, so a\nsteer whose wire serial is lower than the assistant output it should\nfollow sorts before that output. The agent's next inference prompt,\nbuilt from the run's me\n[…]\nty-list cases\n- run-steer-tracker tests cover isUnrespondedSteer across pending,\n  stamped, and cleared states\n- view and agent-session tests cover the leaf-view reorder and the\n  pre-first-pass drain",
          "is_bot": false,
          "headline": "Defer unresponded steers to end run on a user message",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-21T14:08:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "89a58cc35a85fe7ce097ee6b7da9401e6f09c98d",
          "body": "Restructures the inference activity to open a single step and loop\ninference passes on outcome.kind === 'complete' && run.hasInput(), so a\nsteering message that folds in mid-run drives another pass within the same\nstep instead of a fresh run.",
          "is_bot": false,
          "headline": "demo(temporal): loop inference within one step for steering",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-21T14:08:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5cf8fd6da125b765aa144dc409c8f3ff4d72a5fe",
          "body": "… loop\n\nWraps streamText + run.pipe in a while (run.hasInput()) loop, recomposing\nthe model context from the seed plus run.view.getMessages() each pass so a\nsteering message that folds into the not-yet-stored tail is picked up on the\nnext inference pass. Updates ClientRun usages to its two type arguments.",
          "is_bot": false,
          "headline": "demo(use-client-session-db): drive inference with a hasInput steering…",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-21T14:08:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4177602c06d7c678ee88e29b7bf2a578c39ac1bd",
          "body": "Wraps streamText + run.pipe in a while (run.hasInput()) loop, re-reading\nrun.view.getMessages() each pass so a steering message that folds in mid-run\nis included in the next inference pass.",
          "is_bot": false,
          "headline": "demo(use-client-session): drive inference with a hasInput steering loop",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-21T14:08:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9dca3e1d7a60334309afa87b25392336c9883fbd",
          "body": "Lets the shared demo chat publish a follow-up user message into the active\nrun so the demos can exercise mid-run steering.",
          "is_bot": false,
          "headline": "demo(shared-frontend): add /steer command UI",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-21T14:08:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e5990deb5ea0859daa73eaadb6012aa3b8e1a6f",
          "body": "A client can publish a follow-up user message into an already-active run\nmid-stream; the agent folds it into the run and runs another inference\npass. Consumed status is resolved by set membership in the\nsteer-codec-message-ids header, stamped per step attempt.\n\nAdds ClientRun.steer()/onSteer, SteerOutcome/SteerResult, the\nSteerCoordinator and RunSteerTracker, and the steps model in the run-step\nwriter that drains pending steers into the pass that answers them.",
          "is_bot": false,
          "headline": "transport: add mid-run client steering",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-21T14:08:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e05b1c3f9befa9c6b1bc44495394001ae52d6374",
          "body": "The Vercel layer bound the AI SDK's UIMessage to the core transport's TMessage\nbut always at the bare AI.UIMessage, so a consumer's message metadata, custom\ndata parts, and tool input/output shapes collapsed to the SDK defaults\n(metadata: unknown). The erasure was purely at the Vercel entry points —\n[…]\nall it with no type arguments for the former\ndefault. All in-repo call sites (demos, tests, docs) are migrated.\n\nResolves AIT-1039\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "vercel: forward UIMessage generic type parameters through the wrapper",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-21T13:13:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3241112634edfe12bb10b4e0a01125882cd067f5",
          "body": "Creating a worktree with `claude --worktree` produced a checkout that\nstill needed manual setup — uninitialised submodules and missing\ngit-ignored .env.local files — before anything would run.\n\nAdd a committed SessionStart hook that bootstraps a linked worktree\nexactly once: it initialises submodule\n[…]\n the first run via a sentinel in\n  the per-worktree git dir. Never overwrites an existing file, skips\n  demos absent from the worktree, and always exits 0 so it cannot block\n  a session from starting.",
          "is_bot": false,
          "headline": "tooling: bootstrap new git worktrees via SessionStart hook (AIT-1007)",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-20T10:42:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "73d921320ad4d32c0b8e5f58cae67864677a7074",
          "body": "add test for `DefaultView.loadOlder` to reveal right selected branch messages\n\n[AIT-1013]\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "transport(test): paginate the selected branch",
          "author_name": "evgeny",
          "author_login": "ttypic",
          "committed_at": "2026-07-17T08:33:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0ba7610a910f7ded884092208ac3ab6a26637548",
          "body": "awaitAttemptVisible dates from when the open and first inference were a single\nfused activity. It waited for a retry's superseding ai-step-start to reflect in\nthe read model before runInference read the prompt, so the failed attempt's\nhalf-streamed reply wouldn't trail the prompt as an assistant pre\n[…]\npic model recover cleanly with no duplicate or\nprefill error. The Temporal demo has never carried this guard, for the same\nreason.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: remove the redundant awaitAttemptVisible guard from the WDK demo",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-16T12:28:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a22d1a7da01e3eb83f94c49327b9ff5ff18688cc",
          "body": "The README described an earlier design: it named `suspendRun` / `endRun`\nand a long-running `listenChannel` activity that turned cancels into a\nworkflow signal, said the client drives an `AgentSession`, and gave the\nwrong channel default. The demo actually runs four activities (`openRun`,\n`runInfere\n[…]\ncels through the SDK (no listener and no workflow\nsignal), and drives a `ClientSession` on the client.\n\nDoc-only; no code changes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: correct the Temporal demo README to match the implementation",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-16T12:23:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "93678a8521c8dcb7ae5d99f108437aa768059b35",
          "body": "Add OperationCancelled (40033) and InternalError (50000) from the standard\nAbly code registry, and reassign miscoded sites: cancellations and signal\naborts off InvalidArgument, closed-view/encoder operations onto SessionClosed,\ninternal invariant failures onto InternalError, the run-end wire fallbac\n[…]\nsweep the public @throws contracts and enum JSDoc to\nmatch, fix the error-codes reference table (duplicate row, stale footnote),\nand use ErrorCode.StreamError instead of a literal 104000 in the demos.",
          "is_bot": false,
          "headline": "Audit error-code usage across the SDK (AIT-876)",
          "author_name": "owenpearson",
          "author_login": "owenpearson",
          "committed_at": "2026-07-16T09:49:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec5f28b48708a8d812ce893a3cae71b443a20923",
          "body": "The connect promise was cached unconditionally, so a failed initial\nsubscribe/attach poisoned the session for life: every subsequent send\nre-awaited the same rejected promise and re-threw its error, even once\nthe channel had recovered.\n\nIntroduce a shared ConnectGuard that both sessions compose. It \n[…]\nndAttach is made retry-safe: subscribe() registers the listener\nsynchronously before the implicit attach can fail, so it now unsubscribes\nfirst to avoid double-registering the listener across a retry.",
          "is_bot": false,
          "headline": "transport: retry connect() after a failed initial attach (AIT-691)",
          "author_name": "owenpearson",
          "author_login": "owenpearson",
          "committed_at": "2026-07-10T13:09:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4e9dcf12f9ea51465c6d0861f6af4f7c6e2dcdc7",
          "body": "The CDN publish and npm publish workflows both trigger on\nrelease:published, so re-firing a release to redeploy the CDN also\nre-runs `pnpm publish`, which fails once the version is on npm. That is\nnow the case for 0.5.0 (npm was re-published successfully out of band),\nso a release re-fire is no long\n[…]\nf\nthe release event. The checkout ref and the action's tag input fall back\nto the dispatch input when there is no release payload.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: add workflow_dispatch to the CDN publish workflow",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-09T16:27:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b8cccd2a14ea40e73ff0d13b48f17a586af4fefa",
          "body": "The 0.5.0 \"Publish to CDN\" job failed with \"Input required and not\nsupplied: source-dir\", even though the workflow passes source-dir\ncorrectly. The fault is the pinned action version, not our config.\n\nbd72bb0d (\"ci: pin GitHub Actions to commit SHAs\") froze\nably/cdn-deploy-action from the floating @\n[…]\n again, while keeping the repo's SHA-pinning posture. This\nis the same working version that 0.3.0 and 0.4.0 deployed with via @v1.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: pin cdn-deploy-action to v1.0.2 to fix CDN publish",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-09T16:27:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "66bfed94eb2745f2a5a58c03c11a22ed6670813e",
          "body": "Bump package.json and src/version.ts to 0.5.0 and regenerate the\nCHANGELOG for the full 0.5.0 surface. The headline is first-class\nsupport for durable execution frameworks (Temporal, Vercel WDK): the new\nStep primitive is the re-attemptable unit of output within a run, and a\nfresh process can adopt \n[…]\nious pre-first-attach continuity-loss error, validates\nthe history-pagination limit, and makes View.loadOlder reveals\nO(revealed).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v0.5.0",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-09T13:00:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "be79bc6ac92ac80558b6da39b5e42ffa035658f2",
          "body": "State changes that occur before the channel has ever attached (e.g.\nATTACHING → FAILED) emitted a ChannelContinuityLost error. There was no\ncontinuity to lose — the transport had never received messages — so the\nevent was misleading, and no stream can be affected since a run cannot\nhave started befo\n[…]\nhe channel first reaches\nATTACHED, recording it when it arrives.\n\nAdd pre-first-attach test coverage for both sessions.\n\n[AIT-692]\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "transport: don't report pre-first-attach continuity loss",
          "author_name": "Lawrence Forooghian",
          "author_login": "lawrence-forooghian",
          "committed_at": "2026-07-09T12:32:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0f7e5a6669fc583db6f540560d242f7a14252ce3",
          "body": "Vitest unit tests (chat smoke with the SDK react entry mocked, fault controls,\nthe WDK process panel including its dead-attempt rendering, the sidecar channel\nhelper, and short-id) and a Playwright e2e suite that drives the durable flows\nover a mock LLM + a throwaway Ably sandbox — no secrets: durab\n[…]\ner-tool approval, a client-side tool, and cancel.\n\nRegisters use-chat-wdk in the demo-app (build + unit) and demo-e2e CI matrices.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: unit tests, e2e, and CI for use-chat-wdk",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-09T10:40:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dc3d3f21a39f1998c69f9b82a45d1e7f8138af6b",
          "body": "The client is the same Ably-backed Vercel `useChat` as the use-chat demo — only\nthe server execution model differs — so `chat.tsx` / `page.tsx` and the message\nUI (bubbles with run / step / attempt badges, tool cards, client-tool execution\nvia browser geolocation) mirror that demo.\n\nOn top of the sh\n[…]\n read distinctly;\nand a numbered intro walkthrough with tagged suggestion prompts (durable text,\nserver / client / approval tool).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: the chat client over the Ably transport + demo UX",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-09T10:40:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "88c7f6d53b3814d2ede26831a24ab30600105998",
          "body": "The heart of the demo: an AIT turn as a driver-owned agent loop on WDK. The\nworkflow (`ait-turn.ts`) is the deterministic orchestrator and does no I/O; the\nactivities (`activities.ts`) hold the AIT SDK usage an integrator writes —\ncreateRun / adoptRun / createStep / pipe / send / suspend / end — and\n[…]\nd step supersedes the dead attempt — the\ndurable-retry story with no duplicate output. A deterministic mock model backs\nthe tests.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: run the durable agent turn on a Vercel Workflow",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-09T10:40:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "488384af3a894a1f4657209941eda3d47c08561e",
          "body": "The base of a reference demo that runs the shipped @ably/ai-transport durable\ncross-process flow on Vercel's Workflow Development Kit (WDK). Next 16 +\nTurbopack app wired with `withWorkflow` and `workflow@4.2.2`; an Ably token\nauth route; channel- and client-name helpers; and the demo's pnpm workspa\n[…]\nts own dist dir\n(`.next-e2e`) so the suite runs alongside a developer's `pnpm dev` — Next\nallows only one dev server per dist dir.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: scaffold use-chat-wdk (Next 16 app + Vercel Workflow wiring)",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-09T10:40:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cfcddb5f5548b606326c56b52c803bcba142077d",
          "body": "The README claimed the debug pane has a \"View latest run in Temporal\"\nlink, but no such link exists in the app. Replace it with guidance that\nmatches reality: each turn appears in the Web UI as a chatWorkflow\nexecution the user can browse and open to inspect its activity history\nand getStockPrice retries. Avoids pointing users at the SDK-generated\ninvocation id, which they never see.",
          "is_bot": false,
          "headline": "Correct README's Temporal Web UI guidance",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-09T08:48:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d7d0c796904e73f2bda57d184e48d046e5d9af76",
          "body": "Give the ClientSession + Temporal demo its own intro card, walkthrough,\nand durable-retry scenario without adding Temporal-specific logic to the\nshared frontend.\n\nThe shared Chat and intro card gain optional props only: a custom\ntitle/description, and an extraProgressSteps list appended to the\nbasel\n[…]\npoints at the Temporal Web UI (localhost:8233) instead\nof the debug pane.\n\n- Add use-demo-progress tests covering the opt-in stock chip and its\n  completion once a turn produces a getStockPrice output",
          "is_bot": false,
          "headline": "Tailor the Temporal demo intro, chips, and route",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-09T08:48:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f55324c971eb6a67d69135553863cbe13b2e1278",
          "body": "Replace the global first-attempt flag with a stateless flake: generate a\nwhole-dollar price and throw when it lands odd (~50% of attempts),\nsucceeding only on an even roll. Each Temporal retry re-rolls, so the\nstep self-heals within its retry budget while still visibly exercising\nactivity retry in t\n[…]\nves\ncross-invocation coupling between runs.\n\nAdd tools.test.ts covering both branches by pinning Math.random, and\nrefresh the now-stale \"throws on first attempt\" comments in the workflow\nand its test.",
          "is_bot": false,
          "headline": "Fail getStockPrice on odd prices in temporal demo",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-09T08:48:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "35842aa7e5d268e5bc51c2f56074be59cc18316c",
          "body": "openRun previously created the run, started it, AND ran the first\ninference in one activity. Fusing them meant a first-inference failure\nretried the whole activity (re-opening the run), and if inference\nfailed past its retries openRun threw before returning ids — so the\nworkflow's cleanup couldn't r\n[…]\nhrows before the model is called, so no\ninference is wasted).\n\nTests cover the new open -> infer -> loop sequences and add a case\nasserting cleanupRun runs when the first inference fails past retries.",
          "is_bot": false,
          "headline": "Split run creation from first inference in temporal demo",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-09T08:48:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "df7687c17e5a8e930afa77f141f614267e4fdced",
          "body": "Reference demo for driving @ably/ai-transport agents from a Temporal\nworkflow: each turn is a chatWorkflow instance, each LLM inference\ncall and each server-side tool execution runs as its own activity,\nand each activity opens/closes its own AgentSession so it's\nfresh-process safe across retries and\n[…]\ner), and an\n  intentionally-flaky one (getStockPrice) that exercises Temporal's\n  activity retry.\n\nTests cover the workflow's routing decisions (mock activities in\nTemporal's TestWorkflowEnvironment).",
          "is_bot": false,
          "headline": "demo: add temporal-driven agent example (use-client-session-temporal)",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-09T08:48:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "46784edb090a73fe548507371057bae8ea81ef49",
          "body": "The demos adopted shadcn's MessageScroller for the transcript, but its\nbuilt-in scroll behaviour never worked for a streaming chat that must stay\npinned to the bottom, and a long run of attempts to bend it into shape only\ntraded one failure for the next:\n\n- turn anchoring (scrollAnchor) pinned each \n[…]\nows\n  scrollbars.\n\nThe shadcn presentational components (Message, Bubble, Marker) are kept — only\nthe scroll component is removed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: replace the shadcn MessageScroller with a plain scroll container",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f8e69d8ef477a9bed82443899034b912447c0106",
          "body": "The pane's information-dense colour vocabulary returns on top of the shadcn\nprimitives: the event-name, action, callback-type, and tool-status chips stay\nshadcn Badges carrying single-utility colour accents (green event names, amber\nactions, colour-mapped callback types, blue/green client-tool entri\n[…]\nchy expressed as muted-foreground\ntiers and error states on the destructive variant, so the pane recedes next to\nthe conversation.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: restore the debug pane's keyword colouring on darker cards",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "58f2c6bfe6ffaa59db3bb72e8798b85d6b36b0dc",
          "body": "…ients\n\nTool calls render as bordered rows on the theme's muted surface (pending,\ngeneric output, location, denied, and error states), so programmatic calls\nstand out from the assistant's prose; error rows use the destructive token.\nThe weather and forecast cards get their sky/indigo and indigo/purple\ngradients back on top of the shadcn Card.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: box the tool-activity rows and restore the generative-card grad…",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3c669fce11816998e709ba766b126795cf96a0c9",
          "body": "Each turn shrink-wraps to its content (capped at 75%), with the bubble\nstretching to the badge row's width so the footer never overhangs it.\n\nThe user's prompt bubble is themed per client through shadcn's own channel:\nthe client palette stores an oklch hue that the bubble sets as its local\n--primary\n[…]\naccent for complete/streaming. Badges drop to 10px with a slightly squarer\nradius, and the gap between bubble and badges tightens.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: size and colour the bubbles and badges through shadcn variants",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "02bf5c0b9555c405dbf039f9c459057f02050537",
          "body": "The intro card renders at the top of the message scroller's content, so once\na prompt is sent it stays reachable in the scrollback instead of\ndisappearing. The empty-conversation view still shows it in a plain container\nso the scroller's end-anchoring cannot push it off-screen. Each demo's\nmessage-list test pins that the intro is still rendered once messages exist.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: keep the walkthrough intro visible after the conversation starts",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ea977e44bbd1f979f992c6401555d91cb488a448",
          "body": "A small jsdom test that the role/client/run/step/status badges render once a\nmessage's owning run is known, and are omitted when it isn't. The linear DB\ndemos have no run/step/status badge footer, so there is nothing to cover\nthere.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat): unit-test the message-bubble debug badges",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "26fe3f1c0ad6ee8130ff58f8b16d47fe88c8f070",
          "body": "The shadcn InputGroup with a block-end button addon rendered the composer as a\ntall multi-line box. Switch the send/stop button to an inline-end addon and\nconstrain the textarea to one line (min-h-0 + rows={1}) so it opens at one line\nand grows only as the message wraps, with the send button inline on the right.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: keep the message composer to a single line",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "53274c1ed5c8b3838ea973a9d382e77a6268dd15",
          "body": "The two linear DB-hydration demos shipped no message-list test, though their\nfull siblings do. Cover the list's three jobs: the intro (no scroller) when\nempty, one bubble per message once there is content, and the streaming status\nwired through to the bubble's thinking loader.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: add message-list unit tests for the DB demos",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4bffa52a6f414aa0012beb9f9a5c9a781c071b71",
          "body": "Backfill shadcn's `shimmer` text utility — which the installed\nshadcn/tailwind.css (4.11) omits, like scroll-fade-b — and apply it to the\n\"Thinking…\" streaming placeholder, so the live-status text uses shadcn's\ncanonical shimmer treatment across the demos.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: add a shimmer treatment to the streaming status text",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d3e26b595830b323d0e1e737daa179a151506e7e",
          "body": "…tion\n\nRebasing the shadcn demo migration onto latest main replayed the demos'\nshadcn rewrite over main's independent demo work, so main's demo deltas\nare re-applied on top of the new shadcn components:\n\n- tool-invocation/message-bubble: handle both tool-part representations\n  via isToolUIPart()/get\n[…]\nfrom run.steps\n- use-chat: render the LiveObjects ChecklistWidget\n\nThe message-bubble unit tests pass the new required step props.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo: reintegrate main's demo changes after rebasing the shadcn migra…",
          "author_name": "Andrew Bulat",
          "author_login": "VeskeR",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "95e5a4528de0ea4069e5afd3d497e9c58b54b6e8",
          "body": "Mirror the shadcn restyle onto the rebuilt generic-hooks database-hydration demo\n(useClientSession / session.view, no useChat). Vendor the shadcn primitives + `cn`,\nshadcn-theme globals.css, Geist/dark layout, ESLint 9 flat config, and the\n@shadcn/* cooldown exclude.\n\nRebuild the conversation surfac\n[…]\nThinking loader, and migrate the e2e message locator from the removed\n`div.max-w-[75%]` class to `[data-testid=\"message-bubble\"]`.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-client-session-db): adopt shadcn UI",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f8a13bcf2a624d36f23157037feaed48c551c058",
          "body": "main rebuilt this database-hydration demo as a rich linear clone of use-chat in\nthe old hand-rolled UI; re-apply the shadcn treatment to match the sibling. Vendor\nthe shadcn primitives + `cn`, layer the shadcn theme + semantic tokens into\nglobals.css, switch the layout to Geist + dark mode, and migr\n[…]\nports); add a message-bubble unit test for the Thinking\nloader and fix the forecast-card e2e assertion for the new lowercase copy.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat-db): adopt shadcn UI",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7f275c83d211665524d36511d5f71694a5fa1e64",
          "body": "Add unit tests for two behaviours the shadcn restyle introduced but left\nuntested: MessageBubble's \"Thinking…\" loader (shown for a streaming assistant\nturn with no text or tool activity yet, suppressed once text or a tool part\narrives) and MessageList's visibility-driven history pagination (AutoLoad\n[…]\nts: narrow the in-memory getItem with `?? null` instead\nof an `as string` cast, and document the localStorage trust-boundary cast.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat): cover the thinking loader and history auto-load",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f30dca40340fd7d1df2223725b4856a886b517a5",
          "body": "prettier --check was failing across the demos because it formatted the vendored\nshadcn/ui primitives (kept in shadcn's own formatting, regeneratable) and\nPlaywright's gitignored test-results/ output. Add both to .prettierignore and\nrun prettier over the remaining hand-maintained files (the four demos'\nglobals.css and a seeded-chat test) so `pnpm run format:check` passes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(demo): keep vendored shadcn and test artifacts out of prettier",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bb2938b5a70184a60ffa029894328572d85745bd",
          "body": "Wrap the suggestion chips in shadcn's ScrollArea and delete the bespoke\n.chip-scrollbar CSS, so the scroll affordance comes from the design system\nrather than hand-written ::-webkit-scrollbar rules. The prompt/done chip\ndistinction is unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat): scroll suggestion chips with ScrollArea",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "59693f4d50db74916ad377118bf7a9c1f54d450d",
          "body": "Real models reply in markdown, but assistant text was rendered as plain\npre-wrapped spans, so lists, emphasis, tables, and code showed as raw\ncharacters. Render assistant text parts through a Response component built\non Streamdown (GitHub-flavoured markdown with safe HTML hardening); user\nmessages stay plain pre-wrapped text.\n\nAdd the streamdown dependency and a Tailwind @source so the utility classes\nit emits are generated.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat): render assistant markdown with Response",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3358d7fe3da2d0ab85453e46a02c3c7ec86a4b3f",
          "body": "Wrap the branch-navigation chevrons and the debug-pane reopen toggle in\nshadcn's Tooltip so the icon-only buttons carry a visible, accessible hint\ninstead of a native title attribute, and add a TooltipProvider at the root\nlayout.\n\nThe debug-pane test now renders within TooltipProvider and targets the\nreopen toggle by its accessible name rather than its title.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat): label icon-only controls with Tooltip",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c1a4f45964781cb56d7e9b4cd15e1658fc48e177",
          "body": "Replace hand-rolled markup and hardcoded Tailwind palette classes with\nshadcn primitives and semantic theme tokens across the chat UI, following\nthe shadcn component and styling conventions:\n\n- Header links and the new-tab control become Button (asChild for the\n  anchors); drop the inline SVG for lu\n[…]\nuses a shared spinner instead of an animate-pulse div.\n\nExisting data-testid anchors are preserved, so test coverage is unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat): use semantic tokens and shadcn primitives throughout",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8f766b22e4070d17d1cd7484e86e9cea6bb5ff34",
          "body": "Restyle the conversation surface to follow shadcn's message-scroller chat\nconventions rather than the pre-shadcn UX:\n\n- Only the user's own messages sit in a filled Bubble (variant default, aligned\n  end). The assistant's reply is a ghost Bubble — no visible bubble, it reads as\n  plain left-aligned \n[…]\n\ntargets the edit field via its data-testid now that the composer is also a\ntextarea. typecheck, lint, unit tests, and build pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat): adopt shadcn's canonical AI-chat UX",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9073ec289599d18705295c5d6613ebf42a1202a9",
          "body": "…pping\n\nVisual polish from the screenshot review:\n\n- The MessageScroller anchors to the newest message, so on an empty chat the\n  tall onboarding intro was scrolled off the top (you landed mid-list). Render\n  the intro as a plain top-anchored empty state and only mount the scroller once\n  there are \n[…]\n-day temperature line (\"85°/44°F (29°/7°C)\") wrapped in\n  the narrow card. Widen it slightly and keep the temperature on one line.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat): fix empty-state intro anchoring and forecast card wra…",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b76703496592595ceb8cc609f3c714c75c34e1de",
          "body": "- Delete the vendored collapsible.tsx: added but never imported (the debug pane\n  uses Tabs), so it was dead on arrival.\n- Move the two react-hooks/set-state-in-effect suppressions off inline\n  eslint-disable directives (which the project bans in demo code) into a\n  file-scoped rule override in esli\n[…]\ned values are exactly Tab).\n- Drop the unused .scroll-fade-t utility from globals.css (only scroll-fade-b and\n  shimmer are used).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat): address code-review findings",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9f637c28db799770af3396d5e6e341608ad3f024",
          "body": "The Playwright suite located message bubbles by their old Tailwind classes\n(`div.max-w-[75%]` wrapper, `div.rounded-lg` body). Those classes are gone with\nthe shadcn Message/Bubble rewrite, so retarget the two helpers at stable hooks:\nthe bubble wrapper via `[data-testid=\"message-bubble\"]` and the b\n[…]\nthe branch counter's tabular-nums,\nthe status-badge text) was deliberately preserved in the rewrite, so no other\nselectors change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat): point e2e selectors at the shadcn DOM",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1b4ca70a94595c5883882e9f6d56a797ee79c291",
          "body": "…nents\n\nMove the conversation rendering and scroll behaviour onto shadcn's new chat\ncomponents, replacing the hand-rolled markup and scroll machinery:\n\n- message-list: MessageScroller (Provider/Viewport/Content/Item) replaces the\n  bespoke scrollRef/endRef/pinnedToBottom logic. autoScroll follows st\n[…]\nroller expects but that shadcn 4.11's tailwind.css does not ship.\n\ntypecheck, lint, unit tests, and the production build all pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat): rebuild the conversation surface on shadcn chat compo…",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d77362720c9791fe4c9c46e3e919929972d0ddf2",
          "body": "Next 16 removed the `next lint` subcommand, so `pnpm lint` no longer ran in the\ndemo. Replace the legacy `.eslintrc.json` with an ESLint 9 flat config\n(eslint.config.mjs) composing eslint-config-next's core-web-vitals and\ntypescript flat exports, and point the `lint` script at `eslint .`.\n\nLinting w\n[…]\n remove now-unused eslint-disable\n  directives; drop an unused e2e test param.\n\npnpm lint, typecheck, and the unit tests all pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat): migrate to ESLint flat config (Next 16)",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "31e820635088c56a132e50400e7aa3542728db2e",
          "body": "Move the non-conversation UI of the use-chat demo onto shadcn primitives and\nenable shadcn's dark theme so its theme tokens match the demo's dark palette:\n\n- layout: add the `dark` class and switch the body to bg-background/text-\n  foreground so shadcn components render against the intended dark the\n[…]\nder this Node does not expose a working Storage\n(pre-existing; any test mounting the debug pane hit it). All demo unit tests\npass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat): swap supporting components to shadcn primitives",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fc0c9bfa8f7a4de903eaecf2aed10a613e2b2b3e",
          "body": "Scaffold shadcn/ui (Radix base) in the use-chat demo and vendor the component\nset the UI migration builds on:\n\n- components.json (style radix-nova, neutral base, @/components/ui + @/lib/utils\n  aliases), the cn util, and the shadcn theme + scroll-fade/shimmer utilities\n  (@import \"shadcn/tailwind.cs\n[…]\ning\npnpm-workspace.yaml minimumReleaseAgeExclude. This is scoped to the demo; the\nroot SDK workspace keeps the cooldown unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "demo(use-chat): set up shadcn/ui and vendor the chat component set",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-08T12:08:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f4b1afa306bd7794625299211e065999180ff680",
          "body": "Give `demo/shared-frontend` the same self-check triad the four demo\napps already have (lint / format / typecheck / test), and wire a CI job\nthat runs all four against a real install so a regression surfaces on\nthe PR rather than in a downstream demo's build.\n\n- Add a minimal flat eslint config: JS +\n[…]\nives\nthat referenced rules this config doesn't enforce (`import/first`,\n`@typescript-eslint/promise-function-async`, `no-empty-function`),\nand re-flow `chat.test.tsx` through prettier for consistency.",
          "is_bot": false,
          "headline": "Wire lint, format, and CI for shared-frontend",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-07T09:52:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e5146705a853aae1a56f367913a257ae2b77ff6c",
          "body": "The use-client-session demo owned the entire chat UI — providers,\ncomponents, hooks, styles, the demo intro card, and the client-tools\nhook. Publishing a second demo (the incoming Temporal one) would\nforce a copy-paste of every file it shares. Extract the frontend into\n`demo/shared-frontend/` as its\n[…]\ners so shared-frontend doesn't\npull duplicate copies of react / ably / ai / @ably/ai-transport\ninto its own node_modules — that would give consumers two-instance\nhooks-return-null failures at runtime.",
          "is_bot": false,
          "headline": "demo: extract shared frontend into a workspace package",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-07T09:52:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "993c07e27d03ebc521018c48edebf00d1db50228",
          "body": "Fold in reviewer comments on the ergonomics PR:\n\n- Delete `activityInvocationIdFor`. Its per-activity suffix\n  contradicted the SDK's contract that one HTTP invocation stamps one\n  invocation-id on every event for that run. Adopters now pass\n  `input.ids.invocationId` directly, matching the value re\n[…]\nd and eslint ignores.\n\n- Replace the destructure-and-discard in `stripToolExecutes` with an\n  `Object.entries` filter, dropping the `void _drop` linter appeasement\n  and the `CAST:` block it required.",
          "is_bot": false,
          "headline": "Address driver-ergonomics review feedback",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-06T15:50:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b0ed59012b6fc08df3a80cb5053ddd0468d6d268",
          "body": "New SDK entry point for drivers that host agent work inside a\nTemporal workflow. Two deterministic-identifier helpers, both\nworkflow-scoped so they survive cross-process retries and don't\ncollide across workflows:\n\n- stepIdFor(workflowInvocationId, activityId) — produces a stepId\n  for run.createSte\n[…]\nity; is stable across retries of the same activity;\nhandles the short-workflow-id shape. activityInvocationIdFor reads\nContext.current() and falls back to 'nowf' when no workflow context\nis available.",
          "is_bot": false,
          "headline": "temporal: add @ably/ai-transport/temporal subpath with step-id helpers",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-06T15:50:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f1183a55985b043a2b5b809d529e1f8426a3fed8",
          "body": "For drivers that want to own their agentic loop rather than letting\nstreamText run its internal multi-step pipeline — a Temporal worker,\nan Inngest step, any framework that puts each tool call under its\nown durable boundary — three helpers on top of the Vercel AI SDK's\nUIMessage shape:\n\n- stripToolE\n[…]\ne.\napprovedPendingToolCalls returns approval-responded parts, skips\ninput-available (delegated to pendingToolCalls), returns [] when the\nlast message is not an assistant or the messages list is empty.",
          "is_bot": false,
          "headline": "vercel: add tool-registry helpers for self-controlled agent loops",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-06T15:50:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "19a53722b9910ef910d7b2c8936c21f30381556a",
          "body": "Some outputs belong on the wire as a single discrete message rather\nthan a stream: a tool-result payload, a data event, a metadata blob.\nToday the only per-step publish path is pipe(), which forces the\ncaller to wrap the output in a ReadableStream. RunStep.send(output)\ntakes one output directly, sta\n[…]\nl; N send calls mint N codec-message-ids; send() rejects\nbefore start() and after end() under the same active-state gate as\npipe(); a publish error propagates as a throw and settles the step\n'failed'.",
          "is_bot": false,
          "headline": "transport: add RunStep.send() for discrete output publish",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-06T15:50:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d1132695a5fde228262fa446fd651d05a1868bbd",
          "body": "The pagination test asserted a user bubble was visible immediately\nafter refreshing with limit=1. That held under the old run-based\nloadOlder, but loadOlder now reveals exactly `limit` codecMessages\nnewest-first: on a channel whose last acked event is the assistant\nreply, limit=1 surfaces only that \n[…]\na fixed sleep, and asserting the\n  visible-bubble count grows by exactly one per click.\n- End with the full two-turn conversation (2 users + 2 assistants)\n  visible and PAGE1 reachable via Load older.",
          "is_bot": false,
          "headline": "Rework limit=1 pagination e2e to the codec-message contract",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-06T12:04:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8a12a1fdffadbb49f852e4127c845be05dd2f4a9",
          "body": "Two workflows publishing to the same run can interleave their\nlifecycle events on the wire: workflow A's run-suspend can lose\npublish-ordering to workflow B's run-resume, so the tree applies\nstart → resume → suspend and ends up 'suspended' even though B has\ntaken over. A follow-up activity in B then\n[…]\n\n\nTests cover: retired-invocation suspend is skipped after a newer\nresume; current-invocation suspend still applies; suspend before\nany resume still applies; empty-invocation-id suspend still applies.",
          "is_bot": false,
          "headline": "transport: skip retired-invocation run-suspend",
          "author_name": "zak",
          "author_login": "zknill",
          "committed_at": "2026-07-06T12:04:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2a7734dcabad0373d896a0cc0ae2fe1bb1e2611b",
          "body": "Regression coverage for the loadOlder flattening memoisation: one test pins\nthat per-reveal codec.getMessages calls stay flat as the window grows (the\nO(K^2) to O(K) seam-walk fix), and one pins that a fold mutating a run\nprojection in place drops the memoised flattening so getMessages reflects it.\n\nRefs AIT-1086.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Transport: test View reveal cost is independent of window size",
          "author_name": "Mike Christensen",
          "author_login": "mschristensen",
          "committed_at": "2026-07-03T11:35:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 7,
      "commits_last_year": 771,
      "latest_release_at": "2026-07-21T15:31:33Z",
      "latest_release_tag": "0.6.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 19,
      "days_since_latest_release": 8,
      "mean_days_between_releases": 19.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@ably/ai-transport",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "ai",
            "ably",
            "ably-realtime",
            "transport",
            "websockets"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@ably/ai-transport",
          "is_deprecated": false,
          "latest_version": "0.6.0",
          "repository_url": "https://github.com/ably/ably-ai-transport-js",
          "versions_count": 7,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 12,
          "monthly_downloads": 2719,
          "first_published_at": "2026-03-27T14:21:02.994000Z",
          "latest_published_at": "2026-07-21T15:32:50.176000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 8
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 4,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 22
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "demo/openai/react/use-client-session/tsconfig.json",
        "demo/shared-frontend/tsconfig.json",
        "demo/temporal/use-client-session-temporal/tsconfig.json",
        "demo/vercel/react/use-chat-db/tsconfig.json",
        "demo/vercel/react/use-chat-wdk/tsconfig.json",
        "demo/vercel/react/use-chat/tsconfig.json",
        "demo/vercel/react/use-client-session-db/tsconfig.json",
        "demo/vercel/react/use-client-session/tsconfig.json",
        "src/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 223067,
      "source_files_sampled": 446,
      "oversized_source_files": 11,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 7464
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "5.0.7",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-mh99-v99m-4gvg"
            ],
            "fixed_version": "5.0.8",
            "advisory_count": 1,
            "oldest_advisory_days": 5
          },
          {
            "name": "pnpm",
            "direct": false,
            "version": "11.3.0",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 8.8,
            "advisory_ids": [
              "GHSA-3qhv-2rgh-x77r",
              "GHSA-4gxm-v5v7-fqc4",
              "GHSA-54hh-g5mx-jqcp",
              "GHSA-5wx6-mg75-v57r",
              "GHSA-72r4-9c5j-mj57",
              "GHSA-cjhr-43r9-cfmw",
              "GHSA-fr4h-3cph-29xv",
              "GHSA-gj8w-mvpf-x27x",
              "GHSA-hwx4-2j3j-g496",
              "GHSA-p4xf-rf54-rj3x"
            ],
            "fixed_version": "11.8.0",
            "advisory_count": 15,
            "oldest_advisory_days": 33
          },
          {
            "name": "postcss",
            "direct": false,
            "version": "8.5.15",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-r28c-9q8g-f849"
            ],
            "fixed_version": "8.5.18",
            "advisory_count": 1,
            "oldest_advisory_days": 5
          },
          {
            "name": "dompurify",
            "direct": false,
            "version": "3.4.11",
            "severity": "low",
            "ecosystem": "npm",
            "cvss_score": 0,
            "advisory_ids": [
              "GHSA-c2j3-45gr-mqc4"
            ],
            "fixed_version": "3.4.12",
            "advisory_count": 1,
            "oldest_advisory_days": 8
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "low": 1,
          "high": 3
        },
        "advisory_count": 18,
        "affected_count": 4,
        "assessed_count": 611,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "@ably/msgpack-js",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "@ai-sdk/gateway",
            "direct": false,
            "version": "3.0.116",
            "ecosystem": "npm"
          },
          {
            "name": "@ai-sdk/provider",
            "direct": false,
            "version": "3.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "@ai-sdk/provider-utils",
            "direct": false,
            "version": "4.0.27",
            "ecosystem": "npm"
          },
          {
            "name": "@antfu/install-pkg",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@asamuzakjp/css-color",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/code-frame",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/compat-data",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/core",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/generator",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-compilation-targets",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-globals",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-module-imports",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-module-transforms",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-string-parser",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-identifier",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-option",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helpers",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/parser",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/runtime",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/template",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/traverse",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/types",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@braintree/sanitize-url",
            "direct": false,
            "version": "7.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@chevrotain/types",
            "direct": false,
            "version": "11.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/color-helpers",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/css-calc",
            "direct": false,
            "version": "2.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/css-color-parser",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/css-parser-algorithms",
            "direct": false,
            "version": "3.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/css-tokenizer",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/core",
            "direct": false,
            "version": "1.11.1",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/runtime",
            "direct": false,
            "version": "1.11.1",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/wasi-threads",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint-community/eslint-utils",
            "direct": false,
            "version": "4.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint-community/regexpp",
            "direct": false,
            "version": "4.12.2",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/config-array",
            "direct": false,
            "version": "0.23.5",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/config-helpers",
            "direct": false,
            "version": "0.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/core",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/js",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/object-schema",
            "direct": false,
            "version": "3.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/plugin-kit",
            "direct": false,
            "version": "0.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "@floating-ui/core",
            "direct": false,
            "version": "1.7.5",
            "ecosystem": "npm"
          },
          {
            "name": "@floating-ui/dom",
            "direct": false,
            "version": "1.7.6",
            "ecosystem": "npm"
          },
          {
            "name": "@floating-ui/react-dom",
            "direct": false,
            "version": "2.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "@floating-ui/utils",
            "direct": false,
            "version": "0.2.11",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/core",
            "direct": false,
            "version": "0.19.2",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/node",
            "direct": false,
            "version": "0.16.8",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/types",
            "direct": false,
            "version": "0.15.0",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/module-importer",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/retry",
            "direct": false,
            "version": "0.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "@iconify/types",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@iconify/utils",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/gen-mapping",
            "direct": false,
            "version": "0.3.13",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/remapping",
            "direct": false,
            "version": "2.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/resolve-uri",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/sourcemap-codec",
            "direct": false,
            "version": "1.5.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/trace-mapping",
            "direct": false,
            "version": "0.3.31",
            "ecosystem": "npm"
          },
          {
            "name": "@mermaid-js/parser",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/wasm-runtime",
            "direct": false,
            "version": "1.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "@opentelemetry/api",
            "direct": false,
            "version": "1.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "@oxc-project/types",
            "direct": false,
            "version": "0.137.0",
            "ecosystem": "npm"
          },
          {
            "name": "@pnpm/exe",
            "direct": false,
            "version": "11.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@pnpm/linux-arm64",
            "direct": false,
            "version": "11.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@pnpm/linux-x64",
            "direct": false,
            "version": "11.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@pnpm/linuxstatic-arm64",
            "direct": false,
            "version": "11.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@pnpm/linuxstatic-x64",
            "direct": false,
            "version": "11.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@pnpm/macos-arm64",
            "direct": false,
            "version": "11.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@pnpm/win-arm64",
            "direct": false,
            "version": "11.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@pnpm/win-x64",
            "direct": false,
            "version": "11.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/number",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/primitive",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-accessible-icon",
            "direct": false,
            "version": "1.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-accordion",
            "direct": false,
            "version": "1.2.15",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-alert-dialog",
            "direct": false,
            "version": "1.1.18",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-arrow",
            "direct": false,
            "version": "1.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-aspect-ratio",
            "direct": false,
            "version": "1.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-avatar",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-checkbox",
            "direct": false,
            "version": "1.3.6",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-collapsible",
            "direct": false,
            "version": "1.1.15",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-collection",
            "direct": false,
            "version": "1.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-compose-refs",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-context",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-context-menu",
            "direct": false,
            "version": "2.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-dialog",
            "direct": false,
            "version": "1.1.18",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-direction",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-dismissable-layer",
            "direct": false,
            "version": "1.1.14",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-dropdown-menu",
            "direct": false,
            "version": "2.1.19",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-focus-guards",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-focus-scope",
            "direct": false,
            "version": "1.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-form",
            "direct": false,
            "version": "0.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-hover-card",
            "direct": false,
            "version": "1.1.18",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-id",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-label",
            "direct": false,
            "version": "2.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-menu",
            "direct": false,
            "version": "2.1.19",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-menubar",
            "direct": false,
            "version": "1.1.19",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-navigation-menu",
            "direct": false,
            "version": "1.2.17",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-one-time-password-field",
            "direct": false,
            "version": "0.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-password-toggle-field",
            "direct": false,
            "version": "0.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-popover",
            "direct": false,
            "version": "1.1.18",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-popper",
            "direct": false,
            "version": "1.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-portal",
            "direct": false,
            "version": "1.1.13",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-presence",
            "direct": false,
            "version": "1.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-primitive",
            "direct": false,
            "version": "2.1.7",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-progress",
            "direct": false,
            "version": "1.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-radio-group",
            "direct": false,
            "version": "1.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-roving-focus",
            "direct": false,
            "version": "1.1.14",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-scroll-area",
            "direct": false,
            "version": "1.2.13",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-select",
            "direct": false,
            "version": "2.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-separator",
            "direct": false,
            "version": "1.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-slider",
            "direct": false,
            "version": "1.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-slot",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-switch",
            "direct": false,
            "version": "1.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-tabs",
            "direct": false,
            "version": "1.1.16",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-toast",
            "direct": false,
            "version": "1.2.18",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-toggle",
            "direct": false,
            "version": "1.1.13",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-toggle-group",
            "direct": false,
            "version": "1.1.14",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-toolbar",
            "direct": false,
            "version": "1.1.14",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-tooltip",
            "direct": false,
            "version": "1.2.11",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-use-callback-ref",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-use-controllable-state",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-use-effect-event",
            "direct": false,
            "version": "0.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-use-escape-keydown",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-use-is-hydrated",
            "direct": false,
            "version": "0.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-use-layout-effect",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-use-previous",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-use-rect",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-use-size",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-visually-hidden",
            "direct": false,
            "version": "1.2.7",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/rect",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@reflink/reflink",
            "direct": false,
            "version": "0.1.19",
            "ecosystem": "npm"
          },
          {
            "name": "@reflink/reflink-darwin-arm64",
            "direct": false,
            "version": "0.1.19",
            "ecosystem": "npm"
          },
          {
            "name": "@reflink/reflink-darwin-x64",
            "direct": false,
            "version": "0.1.19",
            "ecosystem": "npm"
          },
          {
            "name": "@reflink/reflink-linux-arm64-gnu",
            "direct": false,
            "version": "0.1.19",
            "ecosystem": "npm"
          },
          {
            "name": "@reflink/reflink-linux-arm64-musl",
            "direct": false,
            "version": "0.1.19",
            "ecosystem": "npm"
          },
          {
            "name": "@reflink/reflink-linux-x64-gnu",
            "direct": false,
            "version": "0.1.19",
            "ecosystem": "npm"
          },
          {
            "name": "@reflink/reflink-linux-x64-musl",
            "direct": false,
            "version": "0.1.19",
            "ecosystem": "npm"
          },
          {
            "name": "@reflink/reflink-win32-arm64-msvc",
            "direct": false,
            "version": "0.1.19",
            "ecosystem": "npm"
          },
          {
            "name": "@reflink/reflink-win32-x64-msvc",
            "direct": false,
            "version": "0.1.19",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-android-arm64",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-darwin-arm64",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-darwin-x64",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-freebsd-x64",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm-gnueabihf",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm64-gnu",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm64-musl",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-ppc64-gnu",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-s390x-gnu",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-x64-gnu",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-x64-musl",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-openharmony-arm64",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-wasm32-wasi",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-win32-arm64-msvc",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-win32-x64-msvc",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/pluginutils",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@sindresorhus/is",
            "direct": false,
            "version": "4.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@standard-schema/spec",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@szmarczak/http-timer",
            "direct": false,
            "version": "4.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "@testing-library/dom",
            "direct": false,
            "version": "10.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "@testing-library/react",
            "direct": false,
            "version": "16.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tybys/wasm-util",
            "direct": false,
            "version": "0.10.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/aria-query",
            "direct": false,
            "version": "5.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/cacheable-request",
            "direct": false,
            "version": "6.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/chai",
            "direct": false,
            "version": "5.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3",
            "direct": false,
            "version": "7.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-array",
            "direct": false,
            "version": "3.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-axis",
            "direct": false,
            "version": "3.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-brush",
            "direct": false,
            "version": "3.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-chord",
            "direct": false,
            "version": "3.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-color",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-contour",
            "direct": false,
            "version": "3.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-delaunay",
            "direct": false,
            "version": "6.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-dispatch",
            "direct": false,
            "version": "3.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-drag",
            "direct": false,
            "version": "3.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-dsv",
            "direct": false,
            "version": "3.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-ease",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-fetch",
            "direct": false,
            "version": "3.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-force",
            "direct": false,
            "version": "3.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-format",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-geo",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-hierarchy",
            "direct": false,
            "version": "3.1.7",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-interpolate",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-path",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-polygon",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-quadtree",
            "direct": false,
            "version": "3.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-random",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-scale",
            "direct": false,
            "version": "4.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-scale-chromatic",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-selection",
            "direct": false,
            "version": "3.0.11",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-shape",
            "direct": false,
            "version": "3.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-time",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-time-format",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-timer",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-transition",
            "direct": false,
            "version": "3.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "@types/d3-zoom",
            "direct": false,
            "version": "3.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "@types/debug",
            "direct": false,
            "version": "4.1.13",
            "ecosystem": "npm"
          },
          {
            "name": "@types/deep-eql",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/esrecurse",
            "direct": false,
            "version": "4.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree-jsx",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@types/geojson",
            "direct": false,
            "version": "7946.0.16",
            "ecosystem": "npm"
          },
          {
            "name": "@types/hast",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/http-cache-semantics",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/json-schema",
            "direct": false,
            "version": "7.0.15",
            "ecosystem": "npm"
          },
          {
            "name": "@types/keyv",
            "direct": false,
            "version": "3.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/mdast",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/ms",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "26.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@types/react",
            "direct": false,
            "version": "19.2.17",
            "ecosystem": "npm"
          },
          {
            "name": "@types/react-dom",
            "direct": false,
            "version": "19.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/responselike",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/trusted-types",
            "direct": false,
            "version": "2.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "@types/unist",
            "direct": false,
            "version": "2.0.11",
            "ecosystem": "npm"
          },
          {
            "name": "@types/unist",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/eslint-plugin",
            "direct": false,
            "version": "8.62.0",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/parser",
            "direct": false,
            "version": "8.62.0",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/project-service",
            "direct": false,
            "version": "8.62.0",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/scope-manager",
            "direct": false,
            "version": "8.62.0",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/tsconfig-utils",
            "direct": false,
            "version": "8.62.0",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/type-utils",
            "direct": false,
            "version": "8.62.0",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/types",
            "direct": false,
            "version": "8.62.0",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/typescript-estree",
            "direct": false,
            "version": "8.62.0",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/utils",
            "direct": false,
            "version": "8.62.0",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/visitor-keys",
            "direct": false,
            "version": "8.62.0",
            "ecosystem": "npm"
          },
          {
            "name": "@ungap/structured-clone",
            "direct": false,
            "version": "1.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "@upsetjs/venn.js",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@vercel/oidc",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/expect",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/mocker",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/pretty-format",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/runner",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/snapshot",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/spy",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/utils",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "ably",
            "direct": false,
            "version": "2.23.0",
            "ecosystem": "npm"
          },
          {
            "name": "acorn",
            "direct": false,
            "version": "8.17.0",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-jsx",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "agent-base",
            "direct": false,
            "version": "7.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "ai",
            "direct": false,
            "version": "6.0.185",
            "ecosystem": "npm"
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "6.15.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "5.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "aria-hidden",
            "direct": false,
            "version": "1.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "aria-query",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "assertion-error",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "bail",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "base64-js",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "baseline-browser-mapping",
            "direct": false,
            "version": "2.10.40",
            "ecosystem": "npm"
          },
          {
            "name": "bops",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "5.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "browserslist",
            "direct": false,
            "version": "4.28.4",
            "ecosystem": "npm"
          },
          {
            "name": "cacheable-lookup",
            "direct": false,
            "version": "5.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "cacheable-request",
            "direct": false,
            "version": "7.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "caniuse-lite",
            "direct": false,
            "version": "1.0.30001799",
            "ecosystem": "npm"
          },
          {
            "name": "ccount",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "chai",
            "direct": false,
            "version": "6.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "character-entities",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "character-entities-html4",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "character-entities-legacy",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "character-reference-invalid",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "class-variance-authority",
            "direct": false,
            "version": "0.7.1",
            "ecosystem": "npm"
          },
          {
            "name": "clone-response",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "clsx",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "comma-separated-tokens",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "8.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "convert-source-map",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cose-base",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "cose-base",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "cross-spawn",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "cssstyle",
            "direct": false,
            "version": "4.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "csstype",
            "direct": false,
            "version": "3.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "cytoscape",
            "direct": false,
            "version": "3.34.0",
            "ecosystem": "npm"
          },
          {
            "name": "cytoscape-cose-bilkent",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "cytoscape-fcose",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "d3",
            "direct": false,
            "version": "7.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "d3-array",
            "direct": false,
            "version": "2.12.1",
            "ecosystem": "npm"
          },
          {
            "name": "d3-array",
            "direct": false,
            "version": "3.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "d3-axis",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "d3-brush",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "d3-chord",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "d3-color",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "d3-contour",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "d3-delaunay",
            "direct": false,
            "version": "6.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "d3-dispatch",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "d3-drag",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "d3-dsv",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "d3-ease",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "d3-fetch",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "d3-force",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "d3-format",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "d3-geo",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "d3-hierarchy",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "d3-interpolate",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "d3-path",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "d3-path",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "d3-polygon",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "d3-quadtree",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "d3-random",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "d3-sankey",
            "direct": false,
            "version": "0.12.3",
            "ecosystem": "npm"
          },
          {
            "name": "d3-scale",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "d3-scale-chromatic",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "d3-selection",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "d3-shape",
            "direct": false,
            "version": "1.3.7",
            "ecosystem": "npm"
          },
          {
            "name": "d3-shape",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "d3-time",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "d3-time-format",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "d3-timer",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "d3-transition",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "d3-zoom",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "dagre-d3-es",
            "direct": false,
            "version": "7.0.14",
            "ecosystem": "npm"
          },
          {
            "name": "data-urls",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "dayjs",
            "direct": false,
            "version": "1.11.21",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "decimal.js",
            "direct": false,
            "version": "10.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "decode-named-character-reference",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "decompress-response",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "deep-is",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "defer-to-connect",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "delaunator",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "dequal",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "detect-libc",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "detect-node-es",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "devlop",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "dom-accessibility-api",
            "direct": false,
            "version": "0.5.16",
            "ecosystem": "npm"
          },
          {
            "name": "dompurify",
            "direct": false,
            "version": "3.4.11",
            "ecosystem": "npm"
          },
          {
            "name": "electron-to-chromium",
            "direct": false,
            "version": "1.5.381",
            "ecosystem": "npm"
          },
          {
            "name": "end-of-stream",
            "direct": false,
            "version": "1.4.5",
            "ecosystem": "npm"
          },
          {
            "name": "entities",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "es-module-lexer",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-toolkit",
            "direct": false,
            "version": "1.49.0",
            "ecosystem": "npm"
          },
          {
            "name": "escalade",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint",
            "direct": false,
            "version": "10.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-plugin-react-hooks",
            "direct": false,
            "version": "7.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-scope",
            "direct": false,
            "version": "9.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-visitor-keys",
            "direct": false,
            "version": "3.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-visitor-keys",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "espree",
            "direct": false,
            "version": "11.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "esquery",
            "direct": false,
            "version": "1.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "esrecurse",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "estraverse",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "estree-util-is-identifier-name",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "estree-walker",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "esutils",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "eventsource-parser",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "expect-type",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "extend",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "fast-deep-equal",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "fast-json-stable-stringify",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "fast-levenshtein",
            "direct": false,
            "version": "2.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "fastestsmallesttextencoderdecoder",
            "direct": false,
            "version": "1.0.22",
            "ecosystem": "npm"
          },
          {
            "name": "fdir",
            "direct": false,
            "version": "6.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "file-entry-cache",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "find-up",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "flat-cache",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "flatted",
            "direct": false,
            "version": "3.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "fsevents",
            "direct": false,
            "version": "2.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "gensync",
            "direct": false,
            "version": "1.0.0-beta.2",
            "ecosystem": "npm"
          },
          {
            "name": "get-nonce",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "get-stream",
            "direct": false,
            "version": "5.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "glob-parent",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "got",
            "direct": false,
            "version": "11.8.6",
            "ecosystem": "npm"
          },
          {
            "name": "hachure-fill",
            "direct": false,
            "version": "0.5.2",
            "ecosystem": "npm"
          },
          {
            "name": "hast-util-from-parse5",
            "direct": false,
            "version": "8.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "hast-util-parse-selector",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "hast-util-raw",
            "direct": false,
            "version": "9.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "hast-util-sanitize",
            "direct": false,
            "version": "5.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "hast-util-to-jsx-runtime",
            "direct": false,
            "version": "2.3.6",
            "ecosystem": "npm"
          },
          {
            "name": "hast-util-to-parse5",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "hast-util-whitespace",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "hastscript",
            "direct": false,
            "version": "9.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "hermes-estree",
            "direct": false,
            "version": "0.25.1",
            "ecosystem": "npm"
          },
          {
            "name": "hermes-parser",
            "direct": false,
            "version": "0.25.1",
            "ecosystem": "npm"
          },
          {
            "name": "html-encoding-sniffer",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "html-url-attributes",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "html-void-elements",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "http-cache-semantics",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "http-proxy-agent",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "http2-wrapper",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "https-proxy-agent",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "iconv-lite",
            "direct": false,
            "version": "0.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "7.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "import-meta-resolve",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "imurmurhash",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "inline-style-parser",
            "direct": false,
            "version": "0.2.7",
            "ecosystem": "npm"
          },
          {
            "name": "internmap",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "internmap",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-alphabetical",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-alphanumerical",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-decimal",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-extglob",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-glob",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-hexadecimal",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-plain-obj",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-potential-custom-element-name",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "isexe",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "js-tokens",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "jsdom",
            "direct": false,
            "version": "26.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "jsesc",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-buffer",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-traverse",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-stable-stringify-without-jsonify",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "json5",
            "direct": false,
            "version": "2.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "katex",
            "direct": false,
            "version": "0.16.47",
            "ecosystem": "npm"
          },
          {
            "name": "keyv",
            "direct": false,
            "version": "4.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "khroma",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "layout-base",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "layout-base",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "levn",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-android-arm64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-darwin-arm64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-darwin-x64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-freebsd-x64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm-gnueabihf",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm64-gnu",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm64-musl",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-x64-gnu",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-x64-musl",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-win32-arm64-msvc",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-win32-x64-msvc",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "locate-path",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "lodash-es",
            "direct": false,
            "version": "4.18.1",
            "ecosystem": "npm"
          },
          {
            "name": "longest-streak",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "lowercase-keys",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "lru-cache",
            "direct": false,
            "version": "10.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "lru-cache",
            "direct": false,
            "version": "5.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "lucide-react",
            "direct": false,
            "version": "1.23.0",
            "ecosystem": "npm"
          },
          {
            "name": "lz-string",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "magic-string",
            "direct": false,
            "version": "0.30.21",
            "ecosystem": "npm"
          },
          {
            "name": "markdown-table",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "marked",
            "direct": false,
            "version": "16.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "marked",
            "direct": false,
            "version": "17.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-find-and-replace",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-from-markdown",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-gfm",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-gfm-autolink-literal",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-gfm-footnote",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-gfm-strikethrough",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-gfm-table",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-gfm-task-list-item",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-mdx-expression",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-mdx-jsx",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-mdxjs-esm",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-phrasing",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-to-hast",
            "direct": false,
            "version": "13.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-to-markdown",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-to-string",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "mermaid",
            "direct": false,
            "version": "11.16.0",
            "ecosystem": "npm"
          },
          {
            "name": "micromark",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-core-commonmark",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-extension-gfm",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-extension-gfm-autolink-literal",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-extension-gfm-footnote",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-extension-gfm-strikethrough",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-extension-gfm-table",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-extension-gfm-tagfilter",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-extension-gfm-task-list-item",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-factory-destination",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-factory-label",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-factory-space",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-factory-title",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-factory-whitespace",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-character",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-chunked",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-classify-character",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-combine-extensions",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-decode-numeric-character-reference",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-decode-string",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-encode",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-html-tag-name",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-normalize-identifier",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-resolve-all",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-sanitize-uri",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-subtokenize",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-symbol",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-types",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "mimic-response",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "mimic-response",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "10.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "nanoid",
            "direct": false,
            "version": "3.3.15",
            "ecosystem": "npm"
          },
          {
            "name": "natural-compare",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "next-themes",
            "direct": false,
            "version": "0.4.6",
            "ecosystem": "npm"
          },
          {
            "name": "node-releases",
            "direct": false,
            "version": "2.0.50",
            "ecosystem": "npm"
          },
          {
            "name": "normalize-url",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "nwsapi",
            "direct": false,
            "version": "2.2.24",
            "ecosystem": "npm"
          },
          {
            "name": "obug",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "once",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "optionator",
            "direct": false,
            "version": "0.9.4",
            "ecosystem": "npm"
          },
          {
            "name": "p-cancelable",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "p-limit",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-locate",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "package-manager-detector",
            "direct": false,
            "version": "1.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "parse-entities",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "parse5",
            "direct": false,
            "version": "7.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-data-parser",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-exists",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-key",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "pathe",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "picocolors",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "pnpm",
            "direct": false,
            "version": "11.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "points-on-curve",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "points-on-path",
            "direct": false,
            "version": "0.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "postcss",
            "direct": false,
            "version": "8.5.15",
            "ecosystem": "npm"
          },
          {
            "name": "prelude-ls",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "prettier",
            "direct": false,
            "version": "3.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "pretty-format",
            "direct": false,
            "version": "27.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "property-information",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "pump",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "punycode",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "quick-lru",
            "direct": false,
            "version": "5.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "radix-ui",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "react",
            "direct": false,
            "version": "19.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "react-dom",
            "direct": false,
            "version": "19.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "react-is",
            "direct": false,
            "version": "17.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "react-remove-scroll",
            "direct": false,
            "version": "2.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "react-remove-scroll-bar",
            "direct": false,
            "version": "2.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "react-style-singleton",
            "direct": false,
            "version": "2.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "rehype-harden",
            "direct": false,
            "version": "1.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "rehype-raw",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "rehype-sanitize",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "remark-gfm",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "remark-parse",
            "direct": false,
            "version": "11.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "remark-rehype",
            "direct": false,
            "version": "11.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "remark-stringify",
            "direct": false,
            "version": "11.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "remend",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-alpn",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "responselike",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "robust-predicates",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "rolldown",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "roughjs",
            "direct": false,
            "version": "4.6.6",
            "ecosystem": "npm"
          },
          {
            "name": "rrweb-cssom",
            "direct": false,
            "version": "0.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "rw",
            "direct": false,
            "version": "1.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "safer-buffer",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "saxes",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "scheduler",
            "direct": false,
            "version": "0.27.0",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "6.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "7.8.5",
            "ecosystem": "npm"
          },
          {
            "name": "shebang-command",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "shebang-regex",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "siginfo",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-js",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "space-separated-tokens",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "stackback",
            "direct": false,
            "version": "0.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "std-env",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "streamdown",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "stringify-entities",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "style-to-js",
            "direct": false,
            "version": "1.1.21",
            "ecosystem": "npm"
          },
          {
            "name": "style-to-object",
            "direct": false,
            "version": "1.0.14",
            "ecosystem": "npm"
          },
          {
            "name": "stylis",
            "direct": false,
            "version": "4.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "symbol-tree",
            "direct": false,
            "version": "3.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "tailwind-merge",
            "direct": false,
            "version": "3.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinybench",
            "direct": false,
            "version": "2.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinyexec",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "tinyglobby",
            "direct": false,
            "version": "0.2.17",
            "ecosystem": "npm"
          },
          {
            "name": "tinyrainbow",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "tldts",
            "direct": false,
            "version": "6.1.86",
            "ecosystem": "npm"
          },
          {
            "name": "tldts-core",
            "direct": false,
            "version": "6.1.86",
            "ecosystem": "npm"
          },
          {
            "name": "to-utf8",
            "direct": false,
            "version": "0.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "tough-cookie",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "tr46",
            "direct": false,
            "version": "5.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "trim-lines",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "trough",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "ts-api-utils",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "ts-dedent",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "tslib",
            "direct": false,
            "version": "2.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "type-check",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "5.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "typescript-eslint",
            "direct": false,
            "version": "8.62.0",
            "ecosystem": "npm"
          },
          {
            "name": "ulid",
            "direct": false,
            "version": "2.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "undici-types",
            "direct": false,
            "version": "8.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "unified",
            "direct": false,
            "version": "11.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "unist-util-is",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "unist-util-position",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "unist-util-stringify-position",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "unist-util-visit",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "unist-util-visit-parents",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "update-browserslist-db",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "uri-js",
            "direct": false,
            "version": "4.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "use-callback-ref",
            "direct": false,
            "version": "1.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "use-sidecar",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "uuid",
            "direct": false,
            "version": "14.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "vfile",
            "direct": false,
            "version": "6.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "vfile-location",
            "direct": false,
            "version": "5.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "vfile-message",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "8.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "vitest",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "w3c-xmlserializer",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "web-namespaces",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "webidl-conversions",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "whatwg-encoding",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "whatwg-mimetype",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "whatwg-url",
            "direct": false,
            "version": "14.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "which",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "why-is-node-running",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "word-wrap",
            "direct": false,
            "version": "1.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "wrappy",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "ws",
            "direct": false,
            "version": "8.21.0",
            "ecosystem": "npm"
          },
          {
            "name": "xml-name-validator",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "xmlchars",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "yallist",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "yocto-queue",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "zod",
            "direct": false,
            "version": "4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "zod-validation-error",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "zwitch",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 611,
        "direct_count": 0,
        "indirect_count": 611
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 22,
        "merged_prs": 215,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 49
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "mschristensen",
          "commits": 437,
          "avatar_url": "https://avatars.githubusercontent.com/u/9295665?v=4"
        },
        {
          "type": "User",
          "login": "zknill",
          "commits": 117,
          "avatar_url": "https://avatars.githubusercontent.com/u/6664336?v=4"
        },
        {
          "type": "User",
          "login": "VeskeR",
          "commits": 101,
          "avatar_url": "https://avatars.githubusercontent.com/u/9639405?v=4"
        },
        {
          "type": "User",
          "login": "ttypic",
          "commits": 31,
          "avatar_url": "https://avatars.githubusercontent.com/u/16488867?v=4"
        },
        {
          "type": "User",
          "login": "lawrence-forooghian",
          "commits": 25,
          "avatar_url": "https://avatars.githubusercontent.com/u/53756884?v=4"
        },
        {
          "type": "User",
          "login": "owenpearson",
          "commits": 22,
          "avatar_url": "https://avatars.githubusercontent.com/u/48608556?v=4"
        },
        {
          "type": "User",
          "login": "rainbowFi",
          "commits": 13,
          "avatar_url": "https://avatars.githubusercontent.com/u/2848753?v=4"
        },
        {
          "type": "User",
          "login": "JoaoDiasAbly",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/112943738?v=4"
        },
        {
          "type": "User",
          "login": "emptyhammond",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/356187?v=4"
        },
        {
          "type": "User",
          "login": "lmars",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/488515?v=4"
        }
      ],
      "contributors_sampled": 13,
      "top_contributor_share": 0.571
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "check-commits.yml",
        "dev.yml",
        "docs.yml",
        "publish.cdn.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".eslintrc.json",
        "eslint.config.js",
        "eslint.config.mjs"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "pnpm-lock.yaml"
      ],
      "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": 5,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "12 out of 12 merged PRs checked by a CI test -- score normalized to 10",
            "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": 10,
            "reason": "all changesets reviewed",
            "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": 10,
            "reason": "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": 10,
            "reason": "all dependencies are pinned",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "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": 8,
            "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": "18 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "57bb9c79544d736d3466a718538e41f4f89e2a0d",
        "ran_at": "2026-07-30T04:08:35Z",
        "aggregate_score": 6.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-29T16:16:34Z",
      "oldest_open_prs": [
        {
          "number": 15,
          "created_at": "2026-03-27T17:46:48Z",
          "last_comment_at": "2026-04-02T17:10:33Z",
          "last_comment_author": "lawrence-forooghian"
        },
        {
          "number": 17,
          "created_at": "2026-03-30T13:32:40Z",
          "last_comment_at": "2026-04-15T14:02:59Z",
          "last_comment_author": "JoaoDiasAbly"
        },
        {
          "number": 66,
          "created_at": "2026-04-21T10:44:08Z",
          "last_comment_at": "2026-04-24T13:30:53Z",
          "last_comment_author": "zknill"
        },
        {
          "number": 93,
          "created_at": "2026-05-13T12:45:13Z",
          "last_comment_at": "2026-05-19T14:24:48Z",
          "last_comment_author": "VeskeR"
        },
        {
          "number": 138,
          "created_at": "2026-06-01T21:12:03Z",
          "last_comment_at": "2026-06-10T13:39:43Z",
          "last_comment_author": "vercel"
        },
        {
          "number": 158,
          "created_at": "2026-06-04T11:41:07Z",
          "last_comment_at": "2026-06-04T11:42:00Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 186,
          "created_at": "2026-06-11T10:42:54Z",
          "last_comment_at": "2026-06-26T13:30:13Z",
          "last_comment_author": "zknill"
        },
        {
          "number": 187,
          "created_at": "2026-06-11T15:05:36Z",
          "last_comment_at": "2026-06-11T15:09:03Z",
          "last_comment_author": "zknill"
        },
        {
          "number": 205,
          "created_at": "2026-06-20T12:25:13Z",
          "last_comment_at": "2026-06-22T06:59:46Z",
          "last_comment_author": "mschristensen"
        },
        {
          "number": 211,
          "created_at": "2026-06-24T11:04:39Z",
          "last_comment_at": "2026-06-25T08:11:15Z",
          "last_comment_author": "lawrence-forooghian"
        },
        {
          "number": 239,
          "created_at": "2026-07-01T06:19:19Z",
          "last_comment_at": "2026-07-01T06:20:11Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 240,
          "created_at": "2026-07-01T06:19:24Z",
          "last_comment_at": "2026-07-01T06:20:26Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 245,
          "created_at": "2026-07-01T11:25:17Z",
          "last_comment_at": "2026-07-01T11:26:15Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 247,
          "created_at": "2026-07-02T16:41:03Z",
          "last_comment_at": "2026-07-02T16:42:15Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 254,
          "created_at": "2026-07-06T16:20:50Z",
          "last_comment_at": "2026-07-09T15:18:54Z",
          "last_comment_author": "lawrence-forooghian"
        },
        {
          "number": 269,
          "created_at": "2026-07-20T15:41:43Z",
          "last_comment_at": "2026-07-20T15:42:44Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 271,
          "created_at": "2026-07-21T12:42:57Z",
          "last_comment_at": "2026-07-21T12:44:02Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 278,
          "created_at": "2026-07-24T08:23:02Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 279,
          "created_at": "2026-07-27T09:41:42Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 284,
          "created_at": "2026-07-29T12:11:25Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-29T16:14:33Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/ably/ably-ai-transport-js",
    "host": "github.com",
    "name": "ably-ai-transport-js",
    "owner": "ably"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 72,
      "inputs": {
        "security": 74,
        "vitality": 86,
        "community": 42,
        "governance": 70,
        "engineering": 86
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "commits_last_year": 771,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 19
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "19/52 weeks with commits",
                "points": 13.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 19
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "771 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 771
                    }
                  }
                ],
                "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": 100,
            "inputs": {
              "releases_count": 7,
              "latest_release_tag": "0.6.0",
              "releases_from_tags": false,
              "days_since_latest_release": 8,
              "mean_days_between_releases": 19.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "7 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 8 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~19.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 19.3
                    }
                  }
                ],
                "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": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 42,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 8,
            "inputs": {
              "forks": 0,
              "stars": 4,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "4 stars",
                "points": 7.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "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 (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "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
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 57,
            "inputs": {
              "packages": [
                "@ably/ai-transport"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 2719
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,719 downloads/month across npm",
                "points": 45.8,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2719,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "good",
        "name": "Sustainability & Governance",
        "value": 70,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 35,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 13,
              "top_contributor_share": 0.571
            },
            "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 57% of commits",
                "points": 9.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 57
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "13 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "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": "excellent",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 87,
            "inputs": {
              "merged_prs": 215,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 49
            },
            "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": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "215/264 decided PRs merged",
                "points": 31.2,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 215,
                      "decided": 264
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "all changesets reviewed",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "followers": 214,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "ably",
              "public_repos": 123,
              "account_age_days": 5155
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "214 followers of ably",
                "points": 16.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 214,
                      "login": "ably"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "123 public repos, account ~14 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 123
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 14
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@ably/ai-transport"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 8
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 8 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "7 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 86,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "5 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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": ".eslintrc.json, eslint.config.js, eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc.json, eslint.config.js, eslint.config.mjs"
                    }
                  }
                ],
                "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": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "12 out of 12 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": "https://ably-ai-transport-js-demo-vercel-us.vercel.app",
              "has_readme": true,
              "has_docs_dir": true,
              "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": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://ably-ai-transport-js-demo-vercel-us.vercel.app",
                "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "good",
        "name": "Security",
        "value": 74,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 67,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 6.7
            },
            "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 is not maximal on development and all release branches",
                "points": 3.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "12 out of 12 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "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": "all changesets reviewed",
                "points": 7.5,
                "status": "met",
                "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": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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": "all dependencies are pinned",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "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,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "18 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 611 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 611
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 18,
              "affected_packages": 4,
              "assessed_packages": 611,
              "unassessed_packages": 0,
              "affected_by_severity": "high 3, low 1",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 611,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "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"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 9
            },
            "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": 85,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 7464
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.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": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 79,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "demo/openai/react/use-client-session/tsconfig.json",
                "demo/shared-frontend/tsconfig.json",
                "demo/temporal/use-client-session-temporal/tsconfig.json",
                "demo/vercel/react/use-chat-db/tsconfig.json",
                "demo/vercel/react/use-chat-wdk/tsconfig.json",
                "demo/vercel/react/use-chat/tsconfig.json",
                "demo/vercel/react/use-client-session-db/tsconfig.json",
                "demo/vercel/react/use-client-session/tsconfig.json",
                "src/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.63,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": ".eslintrc.json, eslint.config.js, eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc.json, eslint.config.js, eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "demo/openai/react/use-client-session/tsconfig.json, demo/shared-frontend/tsconfig.json, demo/temporal/use-client-session-temporal/tsconfig.json, demo/vercel/react/use-chat-db/tsconfig.json, demo/vercel/react/use-chat-wdk/tsconfig.json, demo/vercel/react/use-chat/tsconfig.json, demo/vercel/react/use-client-session-db/tsconfig.json, demo/vercel/react/use-client-session/tsconfig.json, src/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "demo/openai/react/use-client-session/tsconfig.json, demo/shared-frontend/tsconfig.json, demo/temporal/use-client-session-temporal/tsconfig.json, demo/vercel/react/use-chat-db/tsconfig.json, demo/vercel/react/use-chat-wdk/tsconfig.json, demo/vercel/react/use-chat/tsconfig.json, demo/vercel/react/use-client-session-db/tsconfig.json, demo/vercel/react/use-client-session/tsconfig.json, src/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "63 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 63,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "dependency automation configured, none observed in the sampled commits",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "dependency_bot_config_only",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "all dependencies are pinned",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 223067,
              "source_files_sampled": 446,
              "oversized_source_files": 11
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "11/446 source files over 60KB",
                "points": 53.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 446,
                      "oversized": 11
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-30T04:08:56.619895Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/ably/ably-ai-transport-js.svg",
  "full_name": "ably/ably-ai-transport-js",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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