公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-30 04:08 UTC

ably / ably-ai-transport-js

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

TypeScriptApache-2.0★ 4 星标⑂ 0 复刻始于 2026年3月在 GitHub 上查看 ↗

ably/ably-ai-transport-js 的健康指数为 100 分中的 72 分,处于「良好」区间。 其得分最高的类别是Vitality(86/100),最低的是Community & Adoption(42/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

72
总分 / 100
良好

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

72
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

214 关注者123 个公开仓库始于 2012年6月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npm@ably/ai-transport0.6.02,71978 天前aiablyably-realtimetransportwebsockets

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

86优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
13.2/36提交节奏 — 52 周中有 19 周有提交
18/18提交量 — 最近一年 771 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year771
human_commit_share1
days_since_last_push0
active_weeks_last_year19

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 7 个发布版本
36/36发布时效 — 最近一次发布版本于 8 天前
27/27发布节奏 — 约每 19.3 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count7
latest_release_tag0.6.0
releases_from_tags
days_since_latest_release8
mean_days_between_releases19.3
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

42存在风险 · 占总体的 18%
评分方式
7.7/60星标 — 4 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars4
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

70良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.0)
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
45.8/80月度下载量 — npm 合计每月 2,719 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packages@ably/ai-transport
dependents
ecosystemsnpm
total_downloads
monthly_downloads2,719
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

70良好 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
9.7/22.5提交分布 — 头号贡献者编写了 57% 的提交
13.5/13.5贡献者广度 — 13 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled13
top_contributor_share0.571
评分方式
0/46.8议题解决 — 没有议题或无数据
31.2/38.3PR 接受 — 已裁定的 PR 中 215/264 已合并
15/15OpenSSF Scorecard:Code-Review — all changesets reviewed
所用输入
merged_prs215
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs49
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
16.8/25所有者影响力 — ably 有 214 位关注者
25/25既往记录 — 123 个公开仓库,账户约 14 年
所用输入
followers214
owner_typeOrganization
is_verified
owner_loginably
public_repos123
account_age_days5,155
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 8 天前
20/20版本历史 — 7 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packages@ably/ai-transport
ecosystemsnpm
any_deprecated
min_days_since_publish8

工程质量

基础的工程与文档实践是否到位?

86优秀 · 占总体的 20%

工程实践

90优秀
评分方式
24/24CI 工作流 — 5 个工作流
24/24存在测试
16/16Linter 配置 — .eslintrc.json, eslint.config.js, eslint.config.mjs
0/9.6Pre-commit 钩子
6.4/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 12 out of 12 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

80良好
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://ably-ai-transport-js-demo-vercel-us.vercel.app
10/10仓库描述
0/10主题标签
0/10Wiki
所用输入
topics
has_wiki
homepagehttps://ably-ai-transport-js-demo-vercel-us.vercel.app
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

74良好 · 占总体的 16%

安全态势

67中等
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
3.8/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 12 out of 12 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
7.5/7.5Code-Review — all changesets reviewed
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
5/5Pinned-Dependencies — all dependencies are pinned
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
6/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 18 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate6.7
已排除计分(无数据或不适用):signed_releases。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
0/25间接依赖不含已知公告 — 在此范围内,传递依赖集合无法与开发和测试依赖区分
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories18
affected_packages4
assessed_packages611
unassessed_packages0
affected_by_severityhigh 3, low 1
direct_affected_packages0
已排除计分(无数据或不适用):间接依赖不含已知公告, 没有长期未处理的公告。 其余权重已重新归一化。 已将 611 个已解析依赖与 OSV 比对。 该仓库未发布任何索引可解析的软件包,因此改为评估仓库依赖图。该图将开发与测试版本固定同交付的依赖混在一起,因此仅对声明的运行时依赖计分;传递性发现仅作为背景信息列出,不计入评分。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

85优秀 · 占总体的 0%
评分方式
45/45代理指令 — CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 100 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes7,464
评分方式
0/18一条命令的引导启动
22/22自动化测试
11/11Lint / 格式化配置 — .eslintrc.json, eslint.config.js, eslint.config.mjs
11/11静态类型检查 — demo/openai/react/use-client-session/tsconfig.json, demo/shared-frontend/tsconfig.json, demo/temporal/use-client-session-temporal/tsconfig.json, demo/vercel/react/use-chat-db/tsconfig.json, demo/vercel/react/use-chat-wdk/tsconfig.json, demo/vercel/react/use-chat/tsconfig.json, demo/vercel/react/use-client-session-db/tsconfig.json, demo/vercel/react/use-client-session/tsconfig.json, src/tsconfig.json, tsconfig.json
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 63 次由代理编写或署名代理
5/8自动化维护 — 已配置依赖自动化,但在抽样提交中未观察到
10/10OpenSSF Scorecard:Pinned-Dependencies — all dependencies are pinned
所用输入
has_nix
has_tests
lockfilespnpm-lock.yaml
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configsdemo/openai/react/use-client-session/tsconfig.json, demo/shared-frontend/tsconfig.json, demo/temporal/use-client-session-temporal/tsconfig.json, demo/vercel/react/use-chat-db/tsconfig.json, demo/vercel/react/use-chat-wdk/tsconfig.json, demo/vercel/react/use-chat/tsconfig.json, demo/vercel/react/use-client-session-db/tsconfig.json, demo/vercel/react/use-client-session/tsconfig.json, src/tsconfig.json, tsconfig.json
agent_commit_share0.63
toolchain_manifests
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
53.6/55可控的文件大小 — 采样的 446 个源文件中有 11 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes223,067
source_files_sampled446
oversized_source_files11

关键数据

4GitHub 星标
13贡献者
771最近 12 个月提交数
0距最近推送天数
7发布版本数
1巴士系数(bus factor)
0开放议题
npm软件包生态系统数

数据采集警告

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

更多细节

OpenSSF Scorecard 6.7 / 10
6.7综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-30 04:08 UTC

10Binary-Artifactsno binaries found in the repo
5Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests12 out of 12 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
10Code-Reviewall changesets reviewed
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
10Pinned-Dependenciesall dependencies are pinned
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
8Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities18 existing vulnerabilities detected
全部依赖 611

来自 GitHub 依赖图的完整解析依赖集合:0 个直接依赖与 611 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

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

该仓库未发布可被索引解析的包,因此评估的是其自身的依赖图——共 611 个包,其中也包含从不交付的开发与测试版本固定:4 个存在已知公告,0 个为直接依赖。

软件包版本关系严重程度公告数修复版本
brace-expansion5.0.7间接15.0.8
pnpm11.3.0间接1511.8.0
postcss8.5.15间接18.5.18
dompurify3.4.11间接13.4.12

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

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

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计npm.