Звіт у форматі 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"
}