Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 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 estrellas⑂ 0 forksdesde mar 2026Ver en GitHub ↗

ably/ably-ai-transport-js tiene un índice de salud de 72 sobre 100, lo que lo sitúa en la banda Bueno. Su puntuación más alta es Vitality (86/100) y la más baja, Community & Adoption (42/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

72
global / 100
Bueno

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

72
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

214 seguidores123 repositorios públicosdesde jun 2012

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npm@ably/ai-transport0.6.027197hace 8 díasaiablyably-realtimetransportwebsockets

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

86Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
13.2/36Cadencia de commits — 19/52 semanas con commits
18/18Volumen de commits — 771 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year771
human_commit_share1
days_since_last_push0
active_weeks_last_year19
Cómo se puntúa
27/27Publica versiones — 7 versiones publicadas
36/36Recencia de las versiones — última versión hace 8 días
27/27Cadencia de publicación — una versión cada ~19,3 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count7
latest_release_tag0.6.0
releases_from_tagsno
days_since_latest_release8
mean_days_between_releases19,3
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

42En riesgo · 18% del índice global
Cómo se puntúa
7.7/60Estrellas — 4 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars4
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
45.8/80Descargas mensuales — 2719 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@ably/ai-transport
dependents
ecosystemsnpm
total_downloads
monthly_downloads2719
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

70Bueno · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
9.7/22.5Distribución de commits — el principal contribuyente firma el 57% de los commits
13.5/13.5Amplitud de contribuyentes — 13 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled13
top_contributor_share0,571
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
31.2/38.3Aceptación de PR — 215/264 PR decididos fusionados
15/15OpenSSF Scorecard: Code-Review — all changesets reviewed
Datos de entrada utilizados
merged_prs215
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs49
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
16.8/25Alcance del propietario — 214 seguidores de ably
25/25Trayectoria — 123 repos públicos, cuenta de ~14 años
Datos de entrada utilizados
followers214
owner_typeOrganization
is_verified
owner_loginably
public_repos123
account_age_days5155
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 8 días
20/20Historial de versiones — 7 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@ably/ai-transport
ecosystemsnpm
any_deprecatedno
min_days_since_publish8

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

86Excelente · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 5 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — .eslintrc.json, eslint.config.js, eslint.config.mjs
0/9.6Hooks de pre-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
Datos de entrada utilizados
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_configno
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://ably-ai-transport-js-demo-vercel-us.vercel.app
10/10Descripción del repositorio
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
homepagehttps://ably-ai-transport-js-demo-vercel-us.vercel.app
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

74Bueno · 16% del índice global
Cómo se puntúa
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.5Licencia — 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 — sin datos
6/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 18 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate6,7
Excluidos de la puntuación (sin datos o no aplicable): signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
0/25Dependencias indirectas libres de avisos conocidos — el conjunto transitivo no es separable de las dependencias de desarrollo y prueba en este alcance
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories18
affected_packages4
assessed_packages611
unassessed_packages0
affected_by_severityhigh 3, low 1
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Dependencias indirectas libres de avisos conocidos, Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejaron 611 dependencias resueltas con OSV. Este repositorio no publica ningún paquete que el índice resuelva, por lo que se evaluó en su lugar el grafo de dependencias del repositorio. Ese grafo mezcla fijaciones de desarrollo y prueba con las dependencias distribuidas, de modo que solo se puntúan las dependencias declaradas en tiempo de ejecución; los hallazgos transitivos se informan como contexto y quedan excluidos de la puntuación. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

85Excelente · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 100 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes7464
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .eslintrc.json, eslint.config.js, eslint.config.mjs
11/11Verificación estática de tipos — 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/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 63 de los últimos 100 commits con autoría o crédito de agente
5/8Mantenimiento automatizado — automatización de dependencias configurada, no observada en los commits muestreados
10/10OpenSSF Scorecard: Pinned-Dependencies — all dependencies are pinned
Datos de entrada utilizados
has_nixno
has_tests
lockfilespnpm-lock.yaml
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
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
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
53.6/55Tamaños de archivo manejables — 11/446 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes223.067
source_files_sampled446
oversized_source_files11

Datos clave

4estrellas de GitHub
13contribuidores
771commits en los últimos 12 meses
0días desde el último push
7versiones publicadas
1factor bus
0issues abiertas
npmecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 6.7 / 10
6.7agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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
n/dSigned-Releasesno releases found
8Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities18 existing vulnerabilities detected
Todas las dependencias 611

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 0 paquetes directos y 611 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

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

Este repositorio no publica ningún paquete que el índice resuelva, así que se evaluó su propio grafo de dependencias — 611 paquetes, que incluyen también fijaciones de desarrollo y prueba que nunca se distribuyen: 4 tienen avisos conocidos, de los cuales 0 son directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
brace-expansion5.0.7indirectaalta15.0.8
pnpm11.3.0indirectaalta1511.8.0
postcss8.5.15indirectaalta18.5.18
dompurify3.4.11indirectabaja13.4.12

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasnpm.