Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-27 14:07 UTC

3rg0n / webex-message-handler

Lightweight Webex Mercury WebSocket + KMS message decryption — Node.js, Python, Go, Rust

TypeScript · Go · RustMIT★ 0 stars⑂ 2 forkssince Feb 2026View on GitHub ↗

3rg0n/webex-message-handler holds a health index of 59 out of 100, placing it in the Moderate band. It scores highest on Vitality (83/100) and lowest on Community & Adoption (39/100). It was last updated 3 days ago. A single contributor accounts for most of its recent work.

59
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

59
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

Ergon CopelandPersonal account
6 followers18 public repossince Mar 2020Cisco

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
Gogithub.com/3rg0n/webex-message-handler/gov0.6.15-203 days ago
crates.iowebex-message-handler0.6.1557213 days agobotkmsmercurywebexwebsocketnetwork-programmingweb-programming
npmwebex-message-handler0.6.152,348153 days agowebexmercurywebsocketkmsbotmessaging
PyPIwebex-message-handler0.6.14-175 days agobotkmsmercurymessagingwebexwebsocket

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

83Good · 22% of overall
How it's scored
36/36Push recency — last push 3 days ago
6.9/36Commit cadence — 10/52 weeks with commits
17.9/18Commit volume — 97 commits in the last year
10/10OpenSSF Scorecard: Maintained — 10 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year97
human_commit_share1
days_since_last_push3
active_weeks_last_year10

Release discipline

100Excellent
How it's scored
27/27Ships releases — 37 releases published
36/36Release recency — latest release 5 days ago
27/27Release cadence — a release every ~11 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count37
latest_release_tagv0.6.14
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases11
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

39At risk · 18% of overall
How it's scored
0/60Stars — 0 stars
0/25Forks — 2 forks
0/15Watchers — 0 watchers
Inputs used
forks2
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
18/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
45.1/80Monthly downloads — 2,405 downloads/month across crates, go, npm, pypi
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesgithub.com/3rg0n/webex-message-handler/go, webex-message-handler, webex-message-handler, webex-message-handler
dependents
ecosystemscrates, go, npm, pypi
total_downloads400
monthly_downloads2,405
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

49At risk · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0.5/22.5Commit distribution — top contributor authored 98% of commits
2.7/13.5Contributor breadth — 2 contributors
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Inputs used
bus_factor1
contributors_sampled2
top_contributor_share0.979
How it's scored
43.2/46.8Issue resolution — 92% of issues closed
6.4/38.3PR acceptance — 2/12 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 1/28 approved changesets -- score normalized to 0
Inputs used
merged_prs2
open_issues1
closed_issues12
issue_closed_ratio0.923
closed_unmerged_prs10
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
6.1/25Owner reach — 6 followers of 3rg0n
21.3/25Track record — 18 public repos, account ~6 yr old
Inputs used
followers6
owner_typeUser
is_verified
owner_login3rg0n
public_repos18
account_age_days2,308
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 4 package(s) on crates, go, npm, pypi
35/35Publish recency — latest publish 3 days ago
20/20Version history — 21 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesgithub.com/3rg0n/webex-message-handler/go, webex-message-handler, webex-message-handler, webex-message-handler
ecosystemscrates, go, npm, pypi
any_deprecatedno
min_days_since_publish3

Engineering Quality

Are baseline engineering and documentation practices in place?

68Moderate · 20% of overall
How it's scored
24/24CI workflows — 3 workflow(s)
24/24Tests present
16/16Linter config — .eslintrc.cjs
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — 0 out of 1 merged PRs checked by a CI test -- score normalized to 0
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepage
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

52Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 0 out of 1 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 1/28 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 10 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
2.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 5
3.5/5SAST — SAST tool detected but not run on all commits
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
2.2/7.5Vulnerabilities — 7 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4.3
Excluded from scoring (no data or not applicable): signed_releases. Remaining weights renormalized.
How it's scored
26.6/35Direct dependencies free of known advisories — 1 affected: golang.org/x/crypto v0.54.0 (unknown)
0/25Indirect dependencies free of known advisories — transitive set not separable from development and test dependencies in this scope
40/40No advisories left outstanding — no advisory has been public longer than 90 days
Inputs used
sourceosv
advisories9
affected_packages5
assessed_packages516
unassessed_packages30
affected_by_severityhigh 4, unknown 1
direct_affected_packages1
Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories. Remaining weights renormalized. Matched 516 resolved dependencies against OSV. 30 could not be assessed — no resolved version, an unsupported ecosystem, or beyond the reported package list. 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.

AI Readiness

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.

66Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 95 of 97 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.979
agent_instruction_files
agent_instruction_max_bytes
How it's scored
12.6/18One-command bootstrap — go/go.mod, rust/Cargo.toml (toolchain convention, no task runner)
22/22Automated tests
11/11Lint / format config — .eslintrc.cjs
11/11Static type checking — node/tsconfig.json
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 81 of the last 97 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
5/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 5
Inputs used
has_nixno
has_testsyes
lockfilesgo.sum, pnpm-lock.yaml
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configsnode/tsconfig.json
agent_commit_share0.835
toolchain_manifestsgo/go.mod, rust/Cargo.toml
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
55/55Manageable file sizes — 0/99 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes44,381
source_files_sampled99
oversized_source_files0
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

0GitHub stars
2contributors
97commits, last 12 months
3days since last push
37releases
1bus factor
1open issues
crates.io, Go, npm, PyPIpackage ecosystems

More detail

Star and fork history 0 ★ / 2 ⇿
0Stars
2Forks
8Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

111222212026-042026-052026-06
Major 0Minor 0Patch 8
OpenSSF Scorecard 4.3 / 10
4.3aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-27 14:07 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 1 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 1/28 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained10 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
5Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 5
7SASTSAST tool detected but not run on all commits
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
3Vulnerabilities7 existing vulnerabilities detected
Direct dependencies 31
RegistryPackageVersion constraintManifest
Gogithub.com/go-jose/go-jose/v4v4.1.4go/go.mod
Gogithub.com/google/uuidv1.6.0go/go.mod
Gogolang.org/x/cryptov0.54.0go/go.mod
Gogithub.com/coder/websocketv1.8.15go/go.mod
npmnode-jose^2.2.0node/package.json
npmnode-kms^0.4.1node/package.json
npmundici^8.7.0node/package.json
PyPIaiohttp>=3.14.1python/pyproject.toml
PyPIcryptography>=48.0.1python/pyproject.toml
PyPIjwcrypto>=1.5.7python/pyproject.toml
crates.iotokio1rust/Cargo.toml
crates.iotokio-tungstenite0.24rust/Cargo.toml
crates.ioreqwest0.12rust/Cargo.toml
crates.ioserde1rust/Cargo.toml
crates.ioserde_json1rust/Cargo.toml
crates.iouuid1rust/Cargo.toml
crates.iothiserror2rust/Cargo.toml
crates.iotracing0.1rust/Cargo.toml
crates.iourl2rust/Cargo.toml
crates.iofutures-util0.3rust/Cargo.toml
crates.iobase640.22rust/Cargo.toml
crates.iop2560.13rust/Cargo.toml
crates.iohkdf0.12rust/Cargo.toml
crates.iosha10.10rust/Cargo.toml
crates.iosha20.10rust/Cargo.toml
crates.iorand0.8rust/Cargo.toml
crates.ioaes-gcm0.10rust/Cargo.toml
crates.ioaes-kw0.2rust/Cargo.toml
crates.iorsa0.9rust/Cargo.toml
crates.ioregex1rust/Cargo.toml
crates.ioonce_cell1rust/Cargo.toml
All dependencies 546

Full resolved dependency set from the GitHub dependency graph: 31 direct and 515 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
crates.ioaes-gcmdirect
crates.ioaes-kwdirect
crates.iobase64direct
crates.iofutures-utildirect
crates.iohkdfdirect
crates.ioonce_celldirect
crates.iop256direct
crates.ioranddirect
crates.ioregexdirect
crates.ioreqwestdirect
crates.iorsadirect
crates.ioserdedirect
crates.ioserde_jsondirect
crates.iosha1direct
crates.iosha2direct
crates.iothiserrordirect
crates.iotokiodirect
crates.iotokio-tungstenitedirect
crates.iotracingdirect
crates.iourldirect
crates.iouuiddirect
Gogithub.com/coder/websocketv1.8.15direct
Gogithub.com/go-jose/go-jose/v4v4.1.4direct
Gogithub.com/google/uuidv1.6.0direct
Gogolang.org/x/cryptov0.54.0direct
npmnode-jose2.2.0direct
npmnode-kms0.4.1direct
npmundici8.7.0direct
PyPIaiohttpdirect
PyPIcryptographydirect
PyPIjwcryptodirect
crates.iotracing-subscriberindirect
crates.iowiremockindirect
npm@babel/code-frame7.29.0indirect
npm@babel/code-frame8.0.0indirect
npm@babel/compat-data8.0.0indirect
npm@babel/core8.0.1indirect
npm@babel/generator7.29.1indirect
npm@babel/generator8.0.0indirect
npm@babel/helper-compilation-targets8.0.0indirect
npm@babel/helper-globals8.0.0indirect
npm@babel/helper-plugin-utils7.28.6indirect
npm@babel/helper-string-parser7.27.1indirect
npm@babel/helper-string-parser8.0.0indirect
npm@babel/helper-validator-identifier7.28.5indirect
npm@babel/helper-validator-identifier8.0.2indirect
npm@babel/helper-validator-option8.0.0indirect
npm@babel/helpers8.0.0indirect
npm@babel/parser7.29.2indirect
npm@babel/parser8.0.0indirect
npm@babel/plugin-syntax-async-generators7.8.4indirect
npm@babel/plugin-syntax-bigint7.8.3indirect
npm@babel/plugin-syntax-class-properties7.12.13indirect
npm@babel/plugin-syntax-class-static-block7.14.5indirect
npm@babel/plugin-syntax-import-attributes7.28.6indirect
npm@babel/plugin-syntax-import-meta7.10.4indirect
npm@babel/plugin-syntax-json-strings7.8.3indirect
npm@babel/plugin-syntax-jsx7.28.6indirect
npm@babel/plugin-syntax-logical-assignment-operators7.10.4indirect
npm@babel/plugin-syntax-nullish-coalescing-operator7.8.3indirect
npm@babel/plugin-syntax-numeric-separator7.10.4indirect
npm@babel/plugin-syntax-object-rest-spread7.8.3indirect
npm@babel/plugin-syntax-optional-catch-binding7.8.3indirect
npm@babel/plugin-syntax-optional-chaining7.8.3indirect
npm@babel/plugin-syntax-private-property-in-object7.14.5indirect
npm@babel/plugin-syntax-top-level-await7.14.5indirect
npm@babel/plugin-syntax-typescript7.28.6indirect
npm@babel/template7.28.6indirect
npm@babel/template8.0.0indirect
npm@babel/traverse8.0.0indirect
npm@babel/types7.29.0indirect
npm@babel/types8.0.0indirect
npm@bcoe/v8-coverage0.2.3indirect
npm@cspotcode/source-map-support0.8.1indirect
npm@esbuild/aix-ppc640.28.1indirect
npm@esbuild/android-arm0.28.1indirect
npm@esbuild/android-arm640.28.1indirect
npm@esbuild/android-x640.28.1indirect
npm@esbuild/darwin-arm640.28.1indirect
npm@esbuild/darwin-x640.28.1indirect
npm@esbuild/freebsd-arm640.28.1indirect
npm@esbuild/freebsd-x640.28.1indirect
npm@esbuild/linux-arm0.28.1indirect
npm@esbuild/linux-arm640.28.1indirect
npm@esbuild/linux-ia320.28.1indirect
npm@esbuild/linux-loong640.28.1indirect
npm@esbuild/linux-mips64el0.28.1indirect
npm@esbuild/linux-ppc640.28.1indirect
npm@esbuild/linux-riscv640.28.1indirect
npm@esbuild/linux-s390x0.28.1indirect
npm@esbuild/linux-x640.28.1indirect
npm@esbuild/netbsd-arm640.28.1indirect
npm@esbuild/netbsd-x640.28.1indirect
npm@esbuild/openbsd-arm640.28.1indirect
npm@esbuild/openbsd-x640.28.1indirect
npm@esbuild/openharmony-arm640.28.1indirect
npm@esbuild/sunos-x640.28.1indirect
npm@esbuild/win32-arm640.28.1indirect
npm@esbuild/win32-ia320.28.1indirect
npm@esbuild/win32-x640.28.1indirect
npm@eslint-community/eslint-utils4.9.1indirect
npm@eslint-community/regexpp4.12.2indirect
npm@eslint/eslintrc2.1.4indirect
npm@eslint/js8.57.0indirect
npm@humanwhocodes/config-array0.11.14indirect
npm@humanwhocodes/module-importer1.0.1indirect
npm@humanwhocodes/object-schema2.0.3indirect
npm@istanbuljs/load-nyc-config1.1.0indirect
npm@istanbuljs/schema0.1.3indirect
npm@jest/console29.7.0indirect
npm@jest/core29.7.0indirect
npm@jest/environment29.7.0indirect
npm@jest/expect29.7.0indirect
npm@jest/expect-utils29.7.0indirect
npm@jest/fake-timers29.7.0indirect
npm@jest/globals29.7.0indirect
npm@jest/pattern30.0.1indirect
npm@jest/reporters29.7.0indirect
npm@jest/schemas29.6.3indirect
npm@jest/schemas30.0.5indirect
npm@jest/source-map29.6.3indirect
npm@jest/test-result29.7.0indirect
npm@jest/test-sequencer29.7.0indirect
npm@jest/transform29.7.0indirect
npm@jest/transform30.3.0indirect
npm@jest/types29.6.3indirect
npm@jest/types30.3.0indirect
npm@jridgewell/gen-mapping0.3.13indirect
npm@jridgewell/resolve-uri3.1.2indirect
npm@jridgewell/sourcemap-codec1.5.5indirect
npm@jridgewell/trace-mapping0.3.31indirect
npm@jridgewell/trace-mapping0.3.9indirect
npm@nodelib/fs.scandir2.1.5indirect
npm@nodelib/fs.stat2.0.5indirect
npm@nodelib/fs.walk1.2.8indirect
npm@rollup/rollup-android-arm-eabi4.60.0indirect
npm@rollup/rollup-android-arm644.60.0indirect
npm@rollup/rollup-darwin-arm644.60.0indirect
npm@rollup/rollup-darwin-x644.60.0indirect
npm@rollup/rollup-freebsd-arm644.60.0indirect
npm@rollup/rollup-freebsd-x644.60.0indirect
npm@rollup/rollup-linux-arm-gnueabihf4.60.0indirect
npm@rollup/rollup-linux-arm-musleabihf4.60.0indirect
npm@rollup/rollup-linux-arm64-gnu4.60.0indirect
npm@rollup/rollup-linux-arm64-musl4.60.0indirect
npm@rollup/rollup-linux-loong64-gnu4.60.0indirect
npm@rollup/rollup-linux-loong64-musl4.60.0indirect
npm@rollup/rollup-linux-ppc64-gnu4.60.0indirect
npm@rollup/rollup-linux-ppc64-musl4.60.0indirect
npm@rollup/rollup-linux-riscv64-gnu4.60.0indirect
npm@rollup/rollup-linux-riscv64-musl4.60.0indirect
npm@rollup/rollup-linux-s390x-gnu4.60.0indirect
npm@rollup/rollup-linux-x64-gnu4.60.0indirect
npm@rollup/rollup-linux-x64-musl4.60.0indirect
npm@rollup/rollup-openbsd-x644.60.0indirect
npm@rollup/rollup-openharmony-arm644.60.0indirect
npm@rollup/rollup-win32-arm64-msvc4.60.0indirect
npm@rollup/rollup-win32-ia32-msvc4.60.0indirect
npm@rollup/rollup-win32-x64-gnu4.60.0indirect
npm@rollup/rollup-win32-x64-msvc4.60.0indirect
npm@sinclair/typebox0.27.10indirect
npm@sinclair/typebox0.34.48indirect
npm@sinonjs/commons3.0.1indirect
npm@sinonjs/fake-timers10.3.0indirect
npm@tsconfig/node101.0.12indirect
npm@tsconfig/node121.0.11indirect
npm@tsconfig/node141.0.3indirect
npm@tsconfig/node161.0.4indirect
npm@types/babel__core7.20.5indirect
npm@types/babel__generator7.27.0indirect
npm@types/babel__template7.4.4indirect
npm@types/babel__traverse7.28.0indirect
npm@types/estree1.0.8indirect
npm@types/gensync1.0.5indirect
npm@types/graceful-fs4.1.9indirect
npm@types/istanbul-lib-coverage2.0.6indirect
npm@types/istanbul-lib-report3.0.3indirect
npm@types/istanbul-reports3.0.4indirect
npm@types/jest29.5.14indirect
npm@types/jsesc2.5.1indirect
npm@types/node22.13.4indirect
npm@types/node25.5.0indirect
npm@types/stack-utils2.0.3indirect
npm@types/yargs17.0.35indirect
npm@types/yargs-parser21.0.3indirect
npm@typescript-eslint/eslint-plugin8.57.2indirect
npm@typescript-eslint/parser8.57.2indirect
npm@typescript-eslint/project-service8.57.2indirect
npm@typescript-eslint/scope-manager8.57.2indirect
npm@typescript-eslint/tsconfig-utils8.57.2indirect
npm@typescript-eslint/type-utils8.57.2indirect
npm@typescript-eslint/types8.57.2indirect
npm@typescript-eslint/typescript-estree8.57.2indirect
npm@typescript-eslint/utils8.57.2indirect
npm@typescript-eslint/visitor-keys8.57.2indirect
npm@ungap/structured-clone1.3.0indirect
npmacorn8.16.0indirect
npmacorn-jsx5.3.2indirect
npmacorn-walk8.3.5indirect
npmajv6.14.0indirect
npmansi-escapes4.3.2indirect
npmansi-regex5.0.1indirect
npmansi-styles4.3.0indirect
npmansi-styles5.2.0indirect
npmany-promise1.3.0indirect
npmanymatch3.1.3indirect
npmarg4.1.3indirect
npmargparse2.0.1indirect
npmbabel-jest29.7.0indirect
npmbabel-jest30.3.0indirect
npmbabel-plugin-istanbul6.1.1indirect
npmbabel-plugin-istanbul7.0.1indirect
npmbabel-plugin-jest-hoist29.6.3indirect
npmbabel-plugin-jest-hoist30.3.0indirect
npmbabel-preset-current-node-syntax1.2.0indirect
npmbabel-preset-jest29.6.3indirect
npmbabel-preset-jest30.3.0indirect
npmbalanced-match1.0.2indirect
npmbalanced-match4.0.4indirect
npmbase64-js1.5.1indirect
npmbase64url3.0.1indirect
npmbaseline-browser-mapping2.10.11indirect
npmbrace-expansion1.1.13indirect
npmbrace-expansion5.0.6indirect
npmbraces3.0.3indirect
npmbrowserslist4.28.1indirect
npmbs-logger0.2.6indirect
npmbser2.1.1indirect
npmbuffer6.0.3indirect
npmbuffer-from1.1.2indirect
npmbundle-require5.1.0indirect
npmcac6.7.14indirect
npmcallsites3.1.0indirect
npmcamelcase5.3.1indirect
npmcamelcase6.3.0indirect
npmcaniuse-lite1.0.30001781indirect
npmchalk4.1.2indirect
npmchar-regex1.0.2indirect
npmchokidar4.0.3indirect
npmci-info3.9.0indirect
npmci-info4.4.0indirect
npmcjs-module-lexer1.4.3indirect
npmcliui8.0.1indirect
npmco4.6.0indirect
npmcollect-v8-coverage1.0.3indirect
npmcolor-convert2.0.1indirect
npmcolor-name1.1.4indirect
npmcommander4.1.1indirect
npmconcat-map0.0.1indirect
npmconfbox0.1.8indirect
npmconsola3.4.2indirect
npmconvert-source-map2.0.0indirect
npmcreate-jest29.7.0indirect
npmcreate-require1.1.1indirect
npmcross-spawn7.0.6indirect
npmdebug4.4.3indirect
npmdedent1.7.2indirect
npmdeep-is0.1.4indirect
npmdeepmerge4.3.1indirect
npmdetect-newline3.1.0indirect
npmdiff4.0.4indirect
npmdiff-sequences29.6.3indirect
npmdoctrine3.0.0indirect
npmelectron-to-chromium1.5.328indirect
npmemittery0.13.1indirect
npmemoji-regex8.0.0indirect
npmempathic2.0.1indirect
npmerror-ex1.3.4indirect
npmes6-promise2.3.0indirect
npmes6-promise4.2.8indirect
npmesbuild0.28.1indirect
npmescalade3.2.0indirect
npmescape-string-regexp2.0.0indirect
npmescape-string-regexp4.0.0indirect
npmeslint8.57.0indirect
npmeslint-scope7.2.2indirect
npmeslint-visitor-keys3.4.3indirect
npmeslint-visitor-keys5.0.1indirect
npmespree9.6.1indirect
npmesquery1.7.0indirect
npmesrecurse4.3.0indirect
npmestraverse5.3.0indirect
npmesutils2.0.3indirect
npmexeca5.1.1indirect
npmexit0.1.2indirect
npmexpect29.7.0indirect
npmfast-deep-equal3.1.3indirect
npmfast-json-stable-stringify2.1.0indirect
npmfast-levenshtein2.0.6indirect
npmfastq1.20.1indirect
npmfb-watchman2.0.2indirect
npmfdir6.5.0indirect
npmfile-entry-cache6.0.1indirect
npmfill-range7.1.1indirect
npmfind-up4.1.0indirect
npmfind-up5.0.0indirect
npmfix-dts-default-cjs-exports1.0.1indirect
npmflat-cache3.2.0indirect
npmflatted3.4.2indirect
npmfs.realpath1.0.0indirect
npmfsevents2.3.3indirect
npmfunction-bind1.1.2indirect
npmgensync1.0.0-beta.2indirect
npmget-caller-file2.0.5indirect
npmget-package-type0.1.0indirect
npmget-stream6.0.1indirect
npmget-tsconfig4.13.7indirect
npmglob7.2.3indirect
npmglob-parent6.0.2indirect
npmglobals13.24.0indirect
npmgraceful-fs4.2.11indirect
npmgraphemer1.4.0indirect
npmhandlebars4.7.9indirect
npmhas-flag4.0.0indirect
npmhasown2.0.2indirect
npmhtml-escaper2.0.2indirect
npmhuman-signals2.1.0indirect
npmieee7541.2.1indirect
npmignore5.3.2indirect
npmignore7.0.5indirect
npmimport-fresh3.3.1indirect
npmimport-local3.2.0indirect
npmimport-meta-resolve4.2.0indirect
npmimurmurhash0.1.4indirect
npminflight1.0.6indirect
npminherits2.0.4indirect
npmis-arrayish0.2.1indirect
npmis-core-module2.16.1indirect
npmis-extglob2.1.1indirect
npmis-fullwidth-code-point3.0.0indirect
npmis-generator-fn2.1.0indirect
npmis-glob4.0.3indirect
npmis-number7.0.0indirect
npmis-path-inside3.0.3indirect
npmis-stream2.0.1indirect
npmisexe2.0.0indirect
npmistanbul-lib-coverage3.2.2indirect
npmistanbul-lib-instrument5.2.1indirect
npmistanbul-lib-instrument6.0.3indirect
npmistanbul-lib-report3.0.1indirect
npmistanbul-lib-source-maps4.0.1indirect
npmistanbul-reports3.2.0indirect
npmjest29.7.0indirect
npmjest-changed-files29.7.0indirect
npmjest-circus29.7.0indirect
npmjest-cli29.7.0indirect
npmjest-config29.7.0indirect
npmjest-diff29.7.0indirect
npmjest-docblock29.7.0indirect
npmjest-each29.7.0indirect
npmjest-environment-node29.7.0indirect
npmjest-get-type29.6.3indirect
npmjest-haste-map29.7.0indirect
npmjest-haste-map30.3.0indirect
npmjest-leak-detector29.7.0indirect
npmjest-matcher-utils29.7.0indirect
npmjest-message-util29.7.0indirect
npmjest-mock29.7.0indirect
npmjest-pnp-resolver1.2.3indirect
npmjest-regex-util29.6.3indirect
npmjest-regex-util30.0.1indirect
npmjest-resolve29.7.0indirect
npmjest-resolve-dependencies29.7.0indirect
npmjest-runner29.7.0indirect
npmjest-runtime29.7.0indirect
npmjest-snapshot29.7.0indirect
npmjest-util29.7.0indirect
npmjest-util30.3.0indirect
npmjest-validate29.7.0indirect
npmjest-watcher29.7.0indirect
npmjest-worker29.7.0indirect
npmjest-worker30.3.0indirect
npmjiti2.6.1indirect
npmjoycon3.1.1indirect
npmjs-tokens10.0.0indirect
npmjs-tokens4.0.0indirect
npmjs-yaml5.0.0indirect
npmjsesc3.1.0indirect
npmjson-buffer3.0.1indirect
npmjson-parse-even-better-errors2.3.1indirect
npmjson-schema-traverse0.4.1indirect
npmjson-stable-stringify-without-jsonify1.0.1indirect
npmjson52.2.3indirect
npmkeyv4.5.4indirect
npmkleur3.0.3indirect
npmleven3.1.0indirect
npmlevn0.4.1indirect
npmlilconfig3.1.3indirect
npmlines-and-columns1.2.4indirect
npmload-tsconfig0.2.5indirect
npmlocate-path5.0.0indirect
npmlocate-path6.0.0indirect
npmlodash4.18.1indirect
npmlodash._arraycopy3.0.0indirect
npmlodash._arrayeach3.0.0indirect
npmlodash._baseassign3.2.0indirect
npmlodash._baseclone3.3.0indirect
npmlodash._basecopy3.0.1indirect
npmlodash._basefor3.0.3indirect
npmlodash._bindcallback3.0.1indirect
npmlodash._getnative3.9.1indirect
npmlodash._isiterateecall3.0.9indirect
npmlodash.clone3.0.3indirect
npmlodash.clonedeep3.0.2indirect
npmlodash.isarguments3.1.0indirect
npmlodash.isarray3.0.4indirect
npmlodash.keys3.1.2indirect
npmlodash.memoize4.1.2indirect
npmlodash.merge4.6.2indirect
npmlong5.3.2indirect
npmlru-cache11.5.1indirect
npmmagic-string0.30.21indirect
npmmake-dir4.0.0indirect
npmmake-error1.3.6indirect
npmmakeerror1.0.12indirect
npmmerge-stream2.0.0indirect
npmmicromatch4.0.8indirect
npmmimic-fn2.1.0indirect
npmminimatch10.2.4indirect
npmminimatch3.1.5indirect
npmminimist1.2.8indirect
npmmlly1.8.2indirect
npmms2.1.3indirect
npmmz2.7.0indirect
npmnatural-compare1.4.0indirect
npmneo-async2.6.2indirect
npmnode-forge1.4.0indirect
npmnode-int640.4.0indirect
npmnode-releases2.0.36indirect
npmnormalize-path3.0.0indirect
npmnpm-run-path4.0.1indirect
npmobject-assign4.1.1indirect
npmobug2.1.3indirect
npmonce1.4.0indirect
npmonetime5.1.2indirect
npmoptionator0.9.4indirect
npmp-limit2.3.0indirect
npmp-limit3.1.0indirect
npmp-locate4.1.0indirect
npmp-locate5.0.0indirect
npmp-try2.2.0indirect
npmpako2.1.0indirect
npmparent-module1.0.1indirect
npmparse-json5.2.0indirect
npmpath-exists4.0.0indirect
npmpath-is-absolute1.0.1indirect
npmpath-key3.1.1indirect
npmpath-parse1.0.7indirect
npmpathe2.0.3indirect
npmpicocolors1.1.1indirect
npmpicomatch2.3.2indirect
npmpicomatch4.0.4indirect
npmpirates4.0.7indirect
npmpkg-dir4.2.0indirect
npmpkg-types1.3.1indirect
npmpostcss-load-config6.0.1indirect
npmprelude-ls1.2.1indirect
npmpretty-format29.7.0indirect
npmprocess0.11.10indirect
npmprompts2.4.2indirect
npmpunycode2.3.1indirect
npmpure-rand6.1.0indirect
npmqueue-microtask1.2.3indirect
npmreact-is18.3.1indirect
npmreaddirp4.1.2indirect
npmrequire-directory2.1.1indirect
npmresolve1.22.11indirect
npmresolve-cwd3.0.0indirect
npmresolve-from4.0.0indirect
npmresolve-from5.0.0indirect
npmresolve-pkg-maps1.0.0indirect
npmresolve.exports2.0.3indirect
npmreusify1.1.0indirect
npmrimraf3.0.2indirect
npmrollup4.60.0indirect
npmrun-parallel1.2.0indirect
npmsemver6.3.1indirect
npmsemver7.7.4indirect
npmshebang-command2.0.0indirect
npmshebang-regex3.0.0indirect
npmsignal-exit3.0.7indirect
npmsignal-exit4.1.0indirect
npmsisteransi1.0.5indirect
npmslash3.0.0indirect
npmsource-map0.6.1indirect
npmsource-map0.7.6indirect
npmsource-map-support0.5.13indirect
npmstack-utils2.0.6indirect
npmstring-length4.0.2indirect
npmstring-width4.2.3indirect
npmstrip-ansi6.0.1indirect
npmstrip-bom4.0.0indirect
npmstrip-final-newline2.0.0indirect
npmstrip-json-comments3.1.1indirect
npmsucrase3.35.1indirect
npmsupports-color7.2.0indirect
npmsupports-color8.1.1indirect
npmsupports-preserve-symlinks-flag1.0.0indirect
npmtest-exclude6.0.0indirect
npmtext-table0.2.0indirect
npmthenify3.3.1indirect
npmthenify-all1.6.0indirect
npmtinyexec0.3.2indirect
npmtinyglobby0.2.15indirect
npmtmpl1.0.5indirect
npmto-regex-range5.0.1indirect
npmtree-kill1.2.2indirect
npmts-api-utils2.5.0indirect
npmts-interface-checker0.1.13indirect
npmts-jest29.4.6indirect
npmts-node10.9.2indirect
npmtsup8.5.1indirect
npmtsx4.21.0indirect
npmtype-check0.4.0indirect
npmtype-detect4.0.8indirect
npmtype-fest0.20.2indirect
npmtype-fest0.21.3indirect
npmtype-fest4.41.0indirect
npmtypescript5.9.3indirect
npmufo1.6.3indirect
npmuglify-js3.19.3indirect
npmundici-types6.20.0indirect
npmundici-types7.18.2indirect
npmupdate-browserslist-db1.2.3indirect
npmuri-js4.4.1indirect
npmuuid11.1.1indirect
npmuuid2.0.3indirect
npmv8-compile-cache-lib3.0.1indirect
npmv8-to-istanbul9.3.0indirect
npmwalker1.0.8indirect
npmwhich2.0.2indirect
npmword-wrap1.2.5indirect
npmwordwrap1.0.0indirect
npmwrap-ansi7.0.0indirect
npmwrappy1.0.2indirect
npmwrite-file-atomic4.0.2indirect
npmwrite-file-atomic5.0.1indirect
npmy18n5.0.8indirect
npmyargs17.7.2indirect
npmyargs-parser21.1.1indirect
npmyn3.1.1indirect
npmyocto-queue0.1.0indirect
PyPImypyindirect
PyPIpytestindirect
PyPIpytest-asyncioindirect
PyPIruffindirect
Dependency advisories 5

This repository publishes no package the index resolves, so its own dependency graph was assessed — 516 packages, which also include development and test pins that never ship: 5 carry known advisories, of which 1 are direct. 30 could not be assessed — no resolved version, an unsupported ecosystem, or beyond the reported package list.

PackageVersionRelationSeverityAdvisoriesFixed in
brace-expansion1.1.13indirecthigh25.0.8
brace-expansion5.0.6indirecthigh25.0.8
js-yaml5.0.0indirecthigh35.2.2
uuid2.0.3indirecthigh113.0.1
golang.org/x/cryptov0.54.0directunknown1

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 699,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 184643,
        "Rust": 184311,
        "Python": 173933,
        "JavaScript": 7266,
        "TypeScript": 235365
      },
      "pushed_at": "2026-07-23T15:42:16Z",
      "created_at": "2026-02-11T15:56:48Z",
      "owner_type": "User",
      "updated_at": "2026-07-23T15:42:06Z",
      "description": "Lightweight Webex Mercury WebSocket + KMS message decryption — Node.js, Python, Go, Rust",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "Go",
        "Rust",
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Ergon Copeland",
      "type": "User",
      "login": "3rg0n",
      "company": "Cisco",
      "location": "London, UK",
      "followers": 6,
      "avatar_url": "https://avatars.githubusercontent.com/u/62959009?v=4",
      "created_at": "2020-03-31T18:16:10Z",
      "is_verified": null,
      "public_repos": 18,
      "account_age_days": 2308
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.6.14",
          "kind": "patch",
          "published_at": "2026-07-21T16:28:46Z"
        },
        {
          "tag": "v0.6.13",
          "kind": "patch",
          "published_at": "2026-07-19T18:13:31Z"
        },
        {
          "tag": "v0.6.12",
          "kind": "patch",
          "published_at": "2026-06-22T17:28:32Z"
        },
        {
          "tag": "v0.6.11",
          "kind": "patch",
          "published_at": "2026-06-02T14:29:22Z"
        },
        {
          "tag": "v0.6.10",
          "kind": "patch",
          "published_at": "2026-06-01T23:20:56Z"
        },
        {
          "tag": "v0.6.9",
          "kind": "patch",
          "published_at": "2026-04-17T16:45:22Z"
        },
        {
          "tag": "v0.6.8",
          "kind": "patch",
          "published_at": "2026-04-13T15:36:04Z"
        },
        {
          "tag": "v0.6.7",
          "kind": "patch",
          "published_at": "2026-04-13T15:09:54Z"
        },
        {
          "tag": "v0.6.6",
          "kind": "patch",
          "published_at": "2026-04-13T14:02:42Z"
        },
        {
          "tag": "v0.6.5",
          "kind": "patch",
          "published_at": "2026-04-13T12:23:40Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2026-04-13T12:12:47Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-04-06T13:35:16Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-04-05T14:58:08Z"
        },
        {
          "tag": "rust/v0.6.1",
          "kind": "other",
          "published_at": "2026-03-27T23:21:38Z"
        },
        {
          "tag": "go/v0.6.1",
          "kind": "other",
          "published_at": "2026-03-27T23:21:38Z"
        },
        {
          "tag": "python/v0.6.1",
          "kind": "other",
          "published_at": "2026-03-27T23:21:37Z"
        },
        {
          "tag": "node/v0.6.1",
          "kind": "other",
          "published_at": "2026-03-27T23:21:37Z"
        },
        {
          "tag": "rust/v0.6.0",
          "kind": "other",
          "published_at": "2026-03-27T23:11:10Z"
        },
        {
          "tag": "go/v0.6.0",
          "kind": "other",
          "published_at": "2026-03-27T23:11:10Z"
        },
        {
          "tag": "python/v0.6.0",
          "kind": "other",
          "published_at": "2026-03-27T23:11:09Z"
        },
        {
          "tag": "node/v0.6.0",
          "kind": "other",
          "published_at": "2026-03-27T23:11:09Z"
        },
        {
          "tag": "go/v0.5.1",
          "kind": "other",
          "published_at": "2026-03-16T15:18:23Z"
        },
        {
          "tag": "go/v0.5.0",
          "kind": "other",
          "published_at": "2026-02-12T13:19:51Z"
        },
        {
          "tag": "rust/v0.5.0",
          "kind": "other",
          "published_at": "2026-02-12T12:48:26Z"
        },
        {
          "tag": "python/v0.5.0",
          "kind": "other",
          "published_at": "2026-02-12T12:48:04Z"
        },
        {
          "tag": "node/v0.5.0",
          "kind": "other",
          "published_at": "2026-02-12T12:47:54Z"
        },
        {
          "tag": "rust/v0.3.2",
          "kind": "other",
          "published_at": "2026-02-12T09:15:36Z"
        },
        {
          "tag": "go/v0.3.1",
          "kind": "other",
          "published_at": "2026-02-12T09:15:26Z"
        },
        {
          "tag": "python/v0.3.1",
          "kind": "other",
          "published_at": "2026-02-12T09:15:16Z"
        },
        {
          "tag": "node/v0.3.3",
          "kind": "other",
          "published_at": "2026-02-12T09:15:06Z"
        },
        {
          "tag": "node/v0.3.2",
          "kind": "other",
          "published_at": "2026-02-12T00:03:54Z"
        },
        {
          "tag": "rust/v0.3.1",
          "kind": "other",
          "published_at": "2026-02-11T22:52:14Z"
        },
        {
          "tag": "node/v0.3.1",
          "kind": "other",
          "published_at": "2026-02-11T22:52:04Z"
        },
        {
          "tag": "rust/v0.3.0",
          "kind": "other",
          "published_at": "2026-02-11T22:18:42Z"
        },
        {
          "tag": "python/v0.3.0",
          "kind": "other",
          "published_at": "2026-02-11T22:18:32Z"
        },
        {
          "tag": "node/v0.3.0",
          "kind": "other",
          "published_at": "2026-02-11T22:18:23Z"
        },
        {
          "tag": "go/v0.3.0",
          "kind": "other",
          "published_at": "2026-02-11T22:16:16Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "fbf1c62c1a51ead882975b4f367f63f6b2e3ad9e",
          "body": "Card submit clicks arrive as a conversation.activity (verb=cardAction,\nobject.objectType=submit) whose object.inputs is a JWE-encrypted string\n(dir/A256GCM, under the activity's encryptionKeyUrl — the same key as\nmessage content). Every language's parser type-asserted inputs as an\nobject and silentl\n[…]\n Rust, each with\nnew parser + decryptor tests. Adds an opt-in shape-only debug instrument\n(WMH_DEBUG_RAW_ACTIVITY, Go) that never logs content.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cards): decrypt JWE object.inputs on Action.Submit (v0.6.15)",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-07-23T15:39:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "62affeeec9f1cf670f8775b1d142e1265273bdc9",
          "body": "….6.14)\n\nThe library hard-coded the WDM endpoint wdm-a.wbx2.com and never did service\ndiscovery. Webex assigns each org to a region; registering a device in the\nwrong region yields a socket that authorizes and completes the KMS handshake\nbut never receives that org's conversation.activity (REST stil\n[…]\n the 0.6.13 \"backend\nlimitation\" note is marked superseded (root cause was client-side).\n\nThanks to Webex Engineering for the region diagnosis.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(#27): U2C region discovery — register in the org's WDM region (v0…",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-07-21T16:27:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7616855fb7d2f15ee7bb4884849672e601f0029a",
          "body": "…s (v0.6.13)\n\nSecurity:\n- ReDoS (CodeQL js/polynomial-redos, high): the <spark-mention> regex used\n  two unbounded [^>]* around the attribute, backtracking polynomially on\n  crafted message HTML. Rewritten to a single bounded tag match + attribute\n  extraction, in Node and Python (both backtracking \n[…]\ncury-sandbox-activity-report.md: #27 write-up (Webex sandbox-org\n  Mercury backend limitation — not a library bug; production works, verified).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(security): ReDoS in mention parser + device-leak parity, bump dep…",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-07-19T18:10:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9bbc9ac29259f70accb780b29ba0804902e9a042",
          "body": "A dependency-free repro tool for the silent-delivery bug (#27). Connects an\nOBSERVER account via the library with debug logging, optionally creates a room +\nadds a second user, then posts round-trip messages AS A SEPARATE POSTER (so they\naren't self-filtered) via REST and reports whether the observe\n[…]\nge), stays healthy (ping/pong), but receives ZERO\nconversation.activity — all round-trips report silent delivery. Isolates the bug\nto the library's Mercury layer, independent of any application stack.",
          "is_bot": false,
          "headline": "examples: add observe-harness (standalone Mercury delivery repro)",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-07-18T20:48:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a59a4ef76f7ac5a77c869d44a39222860613b9c",
          "body": "…auth frame\"\n\nThis reverts commit e9a4ce897dee23e94de26ec98df975dbf9a9d868.",
          "is_bot": false,
          "headline": "Revert \"fix(mercury): send raw token (not \"Bearer \"-prefixed) in the …",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-07-18T20:24:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9a4ce897dee23e94de26ec98df975dbf9a9d868",
          "body": "The Mercury WebSocket authorization frame must carry the RAW access token in\ndata.token, matching the Webex JS SDK (internal-plugin-mercury socket-base.js\n_authorize: data:{token: this.token}). The Go impl prefixed it with \"Bearer \"\n(the HTTP Authorization header form), which is wrong for the WS aut\n[…]\n complete the handshake (buffer_state returns) yet\nreceive no conversation.activity pushes. Send ms.token unprefixed.\n\nVerified: build + unit tests green. Live delivery to be confirmed on the sandbox.",
          "is_bot": false,
          "headline": "fix(mercury): send raw token (not \"Bearer \"-prefixed) in the auth frame",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-07-18T20:02:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7239c734bbbd76955fda5e75af93482f523bbe23",
          "body": "- node/README: document the Node >=24.0.0 requirement (was undocumented)\n  and point Node 22 users to 0.6.9 (last release before the engine bump)\n- go/README: Requires Go 1.26.4+ (was stale \"1.21+\")\n- CONTRIBUTING: bump Node (18->24) and Go (1.21->1.26.4) prerequisites\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update version requirements for v0.6.12",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-06-22T21:40:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c619180aac5f133ff5ab0fb565d4c9a8b3ad1236",
          "body": "Node: bump undici 7.24.6 -> 8.5.0 (7 advisories incl. CVE-2026-12151 High,\nDependabot #24). undici 8.x needs Node >=22.19.0, so engines.node raised to\n>=24.0.0 (Node 24 LTS \"Krypton\") — BREAKING for consumers on Node 22.x.\npnpm overrides added for dev-tool transitives (js-yaml, esbuild, @babel/core)\n[…]\n/staticcheck +\ngovulncheck 0, Rust 45 (unchanged). npm audit 1 moderate remaining\n(node-kms>uuid@2, unreachable). Versions: node+python 0.6.12.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(security): remediate Dependabot/GHAS findings + bump deps (v0.6.12)",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-06-22T17:26:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "24baf24635727c41152a11f6b5fe705c82b403b6",
          "body": "Node: drop the uuid dependency entirely — replace uuid.v4() with built-in\ncrypto.randomUUID() (Node >=22.4.0 is already required). Resolves the\nDependabot bump to ESM-only uuid 14.x (#21) at the root instead of working\naround it. Pin node-jose's transitive uuid to >=11.1.1 and brace-expansion\nto >=5\n[…]\nonly; rand unsound only via rand::rng()+custom logger).\n\nAll tests pass: Node 142, Python 73, Rust 45. cargo audit clean; go\ngovulncheck clean.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(security): remediate Dependabot/audit findings (v0.6.11)",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-06-02T14:27:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4aa46bda0162de5ccaaff1643c3f3340ccd5c312",
          "body": "Implements GitHub issues #20 and #23.\n\n#23 (all 4 languages): expose the WDM device registration read-only so\ninbound-only wrappers can make their own outbound calls (e.g. a\nConversation-service read-receipt) using cluster-correct service URLs\ninstead of hardcoding hostnames. Adds deviceRegistration\n[…]\nraw parent\nobject, so ParentID/MessageID were always empty in production.\n\nTests added across all languages; READMEs + CHANGELOG + ADR updated.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: expose WDM service catalog + fix aiohttp connector close (v0.6.10)",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-06-01T23:19:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d730cd44284cf1d0751d721cac1a63af97c8b0a2",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add v0.6.9 config options to all READMEs",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-17T16:42:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "922caa8f92f26834cf31809b3890b57657446bfe",
          "body": "KMS circuit breaker prevents 30s stalls during outages by failing fast\nafter 3 consecutive failures. KMS key fetch retry handles transient\nerrors with 1 attempt + 1s delay. Optional timing metrics callback\nreports connect and decrypt latency. Delivery guarantees section added\nto all READMEs documenting at-most-once semantics.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add KMS resilience, timing metrics, delivery docs (v0.6.9)",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-17T12:20:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "89629418f2d4265603640d6c90362522c5a188ac",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(go): bump go directive to 1.26.2",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-13T16:26:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fb0cdd56f4c8b09b556aaba890c4f1186c244424",
          "body": "Webex returns kms:// (not https://) for the kmsCluster field from the\nencryption service. The URL validator was rejecting it. Also fixed bare\ndomain matching (ciscospark.com) in Node.js and Go validators.\n\nPython was already fixed via PR #16 by @ojaber. This applies the same\nfix to Node.js, Go, and Rust with test coverage for all 4 languages.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: accept kms:// scheme for KMS cluster URL (all languages)",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-13T15:34:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2ddf8bf40ab793010c65ecb196d5df750d8202e4",
          "body": "fix: accept kms:// scheme for KMS cluster URL",
          "is_bot": false,
          "headline": "fix: accept kms:// scheme for KMS cluster URL (#16)",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-13T15:14:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c59ad3f0415aec020dd845e41dc50313e317180a",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump all versions to 0.6.7",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-13T14:52:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "01cb276181f23de763803dc6733a6a4ead934945",
          "body": "Document mentions, message edits, card actions, room events, and files\nfield across Node.js, Python, Go, and Rust READMEs.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add v0.6.6 features to all language READMEs",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-13T14:19:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4f19e2065ef163aaecc1a0b1c751dc49e5ea0bbb",
          "body": "…es support\n\nFive new features across all 4 languages (Node.js, Python, Go, Rust):\n\n- Mention parsing: extract mentionedPeople/mentionedGroups from <spark-mention> HTML tags\n- Message edit event (message:updated): verb=update + objectType=comment\n- Adaptive Card submissions (attachmentAction:created\n[…]\neated, room:updated): verb=create/update + objectType=conversation\n- Files field: surface file URLs from Mercury activities on DecryptedMessage\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add mentions, message edits, card actions, room events, and fil…",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-13T14:01:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0589666e8eb70b96a4d6fc4853cf8b29b2a66455",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump all versions to 0.6.5",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-13T12:22:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0a2e25a6b7fd85cdec808d75cc71dab69ce7d586",
          "body": "All four language-specific READMEs now document parentId,\ntoRestId/fromRestId, and threading usage examples.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add threading and ID conversion to language READMEs",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-13T12:19:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4a88101b1f8b6022803fe4f2fdf262421e5435fa",
          "body": "- Add MercuryParent type and parentId field to DecryptedMessage\n  across all 4 languages, parsed from Mercury activity parent object\n- Add toRestId/fromRestId utilities to convert between Mercury\n  activity UUIDs and Webex REST API base64-encoded IDs\n- Document threading and ID conversion in README with examples\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add thread support (parentId) and Mercury/REST ID conversion",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-13T12:01:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "59374e8bf0a6d8596e727ef3f7c1afd68df54fd2",
          "body": "…ect.id\n\nMercury does not populate activity.object.id for encrypted messages,\nleaving DecryptedMessage.id empty. Use activity.id (the Mercury activity\nUUID) which is always present and works as parentId for threaded replies.\n\nReported by Omar Abduljaber.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: set DecryptedMessage.id from activity.id instead of activity.obj…",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-13T11:36:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "05f3d0ca032649ab807c33a6f5f522d825787694",
          "body": null,
          "is_bot": false,
          "headline": "test: cover realistic KMS cluster URLs",
          "author_name": "Omar",
          "author_login": "ojaber",
          "committed_at": "2026-04-13T02:23:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab980d5c817e04197a46895fc5dddf2ce06e77e7",
          "body": "Webex returns a kms:// scheme in the kmsCluster field from the\nencryption service. The URL validator was requiring https://, which\ncaused KmsError during initialization. The kmsCluster value is used\nas a URI in KMS JSON payloads (not as an HTTP endpoint), so the\nkms:// scheme is correct.",
          "is_bot": false,
          "headline": "fix: accept kms:// scheme for KMS cluster URL",
          "author_name": "Omar",
          "author_login": "ojaber",
          "committed_at": "2026-04-13T01:32:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aed3f4a116f6d1da4479d77e21a7ea3daa78d717",
          "body": "Document disposition of all 18 findings (10 fixed, 3 verified,\n4 accepted, 1 deferred) and update data flow diagram annotations.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: append remediation status to MAESTRO threat model",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-06T17:12:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2c582b245c7321accc1b02ffd13eb70616a06213",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: correct cyclonedx-py SBOM args and add continue-on-error",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-06T13:50:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3883ec57ca4d4eb7d5713e5312ef695e0118d8d0",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update Rust test count to 30",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-06T13:37:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "97d77a010abe0cb00d1c79f91ac79ef2052020e8",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump all versions to 0.6.3",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-06T13:34:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "40a91ede7d45095436266d10929b1ac903a52124",
          "body": "Remediates 15 of 18 findings from MAESTRO threat assessment:\n\n- F1 (Critical): Upgrade Python aiohttp 3.13.3→3.13.4 (10 HIGH CVEs),\n  pin cryptography>=46.0.6\n- F2 (High): KMS request serialization via mutex (Go, Python)\n- F3 (High): URL validation for all external API responses — enforce\n  HTTPS/WS\n[…]\nes),\nF11 (dependency pinning — lockfiles already pin), F13 (token zeroing —\nlanguage-specific complexity), F17-18 (already accepted/mitigated).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "security: remediate MAESTRO threat model findings across all languages",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-06T12:33:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1664207c799ca0880f9daa120f0b6677786ad072",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump all versions to 0.6.2",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-05T14:57:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "79efe5b5445b16ed1071bd5bf2f8c1d9b1703025",
          "body": "… findings\n\nGo: go-jose/v4 v4.0.5→v4.1.4 (JWE decryption panic, DoS parsing).\nNode: lodash 4.17.23→4.18.1 via pnpm override (code injection, prototype pollution).\ngolang.org/x/crypto SSH alerts auto-resolved (unused subpackages).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: upgrade go-jose v4.1.4 and override lodash 4.18.1 for Dependabot…",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-05T08:53:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f1cd5eb5edcff3e08b111e342afd246530991b88",
          "body": "Scans JavaScript/TypeScript, Go, and Python on push, PR,\nand weekly schedule. Rust is not yet supported by CodeQL.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: add CodeQL code scanning workflow",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-04T21:26:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fe59856d24754df7912711dc79fe809d8f08c7e4",
          "body": "Document how to use OAuth tokens with the existing reconnect(newToken)\nAPI. The library already handles 401/4401 auth failures by emitting\nAuthError and stopping reconnection — the app just needs to refresh\nthe token and call reconnect().\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add OAuth integration token pattern to README",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-04-03T15:32:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cf4bdcf4ee727d199d0e0c9a0437e3cc7b34d60e",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add v0.6.1 changelog and update README test counts",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-03-28T10:07:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c0347479cc0feb2403ed161623702237d2d436d6",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump all versions to 0.6.1",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-03-27T23:20:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dfb82b8067fd9fdbd266679d3336bbe496fc4608",
          "body": "…guages\n\nGo:\n- Upgrade go-jose v4.0.4→v4.0.5 (fixes DoS in JWE parsing, GO-2025-3485)\n- Upgrade golang.org/x/crypto v0.31.0→v0.49.0 (multiple CVEs)\n- Fix staticcheck SA1012: replace nil contexts with context.TODO() in tests\n\nPython:\n- Narrow broad exception handlers flagged by bandit (B110)\n- Replac\n[…]\nde rustls-webpki 0.103.9→0.103.10 (CRL validation, RUSTSEC-2026-0049)\n- Document rsa Marvin side-channel as false positive (encrypt-only usage)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: security scanner findings and dependency upgrades across all lan…",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-03-27T23:08:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d8e7d7a562ed76c32cf63b2fa5ba4ca87055c7f",
          "body": "…r/websocket\n\nnhooyr.io/websocket is deprecated — the maintainer moved the library to\ngithub.com/coder/websocket. Same API, new module path.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(go): migrate websocket library from nhooyr.io/websocket to code…",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-03-27T22:45:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9631cf5b7d86d3ea490de66ae864c89a20b19d62",
          "body": "- kms_client.go: check json.Unmarshal error on local JWK\n- kms_client.go: acknowledge body drain/close errors\n- device_manager.go: acknowledge body drain error\n- mercury_socket.go: acknowledge conn.Close error\n- examples/basic-bot: acknowledge Disconnect error\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(go): handle all gosec G104 unhandled error findings",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-03-27T22:26:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e629bd089a3ce6dbfcb0889275c5abe3fde71f4c",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump all versions to 0.6.0",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-03-19T21:04:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9439a1bace5425517b0f1e0d3a61091d9757a785",
          "body": "…nguages\n\nGo:\n- Add RWMutex to WebexMessageHandler protecting shared state fields\n- Replace recursive reconnect() with iterative loop (prevents stack overflow)\n- Protect MercurySocket boolean fields with mutex helpers\n- Use cancelable context for activity handlers instead of context.Background()\n- L\n[…]\ndiscard\n- Set 1MB WebSocket message size limit\n- Validate ECDH remote JWK has kty=EC and crv=P-256\n- Replace unwrap() with descriptive expect()\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: concurrency, security, and robustness improvements across all la…",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-03-19T21:03:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ab3dae7c2e70d8bd09d4a7b1572f12308b74b350",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add v0.5.1 to CHANGELOG",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-03-16T15:21:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a51ed61852e110145586631014fa53fe5cf026cd",
          "body": "…reconnection\n\npendingPongID was accessed from multiple goroutines without mutex\nprotection. Go strings are (pointer, length) headers — concurrent\nread/write can corrupt the header, causing == to dereference a nil\ndata pointer.\n\nAlso fixes:\n- closeWebSocket now cancels context, stopping stale ping/pong goroutines\n- triggerReconnect guard prevents concurrent reconnection attempts\n- Pong timeout goroutine respects context cancellation\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(go): race condition in ping loop causes nil pointer panic during …",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-03-16T15:17:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2d708ff99f5309dd6efe3fde9a2e248c062081b1",
          "body": "Changed module path from github.com/ecopelan/webex-message-handler-go\nto github.com/3rg0n/webex-message-handler/go to match the consolidated\nmonorepo structure under the 3rg0n organization.\n\nUpdated in:\n- go.mod module declaration\n- All import statements in tests and examples\n- Documentation (README.md, API.md)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(go): update module path to monorepo structure",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T13:17:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ac0593878e101717b0e123d9ed7252299da051ad",
          "body": "- Correct Rust README: tokio-tungstenite does not read proxy env vars\n- Add trust_env=True to Python native HTTP adapter for proxy support\n- Add v0.5.0 changelog entry\n\nCloses #6\nCloses #7\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Rust README proxy docs, Python trust_env, update CHANGELOG",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T12:59:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c6f826d49b39b8ab7b79e8ed92c19cb85fb1ffc1",
          "body": "Add mitmproxy-based proxy validation scripts for Python, Go, and Rust.\nAdd Node.js e2e integration test.\n\nCloses #9\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add proxy validation and e2e test scripts for all languages",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T12:58:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ae014164e1efd4f98f31b72e0eb6b5b33ca06b72",
          "body": "Replace deprecated elliptic.Marshal() with (*ecdsa.PublicKey).ECDH().\nRemove dead code and unused imports.\n\nCloses #12\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(go): bump to go 1.24, modernize ECDH key derivation",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T12:57:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "795b300e6b8bdc43f52d21daac1c89bcb1530f7d",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump versions to 0.5.0 for membership event release",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T12:47:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "760e326611bf40ed7812af953e9fe6625330a7f3",
          "body": "Add MembershipActivity type and membership:created event for Mercury\nmembership activities (add, leave, assignModerator, unassignModerator)\nwith objectType=person. No decryption needed — membership activities\nare unencrypted. No self-message filtering — bots should see their\nown membership events.\n\nAlso fixes all pre-existing lint issues across Python (ruff), Rust\n(clippy), and cleans up unused imports/variables.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add membership:created event support (all 4 languages)",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T12:46:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f3fcc67cb5d8a5714296d99551ca511bc4440ca7",
          "body": "actions/setup-go@v5 looks for go.sum at the repo root by default.\nSince ours is in the go/ subdirectory, set cache-dependency-path.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: fix Go cache warning by pointing to go/go.sum",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T12:04:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4289d9b57839158be2dd068472dcf32c9d415cbb",
          "body": "…fix)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(python): bump to 0.4.4 (0.4.3 published without mercury_socket …",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T12:03:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5820460d40bcc67c0eaf62312b6c6d1178d0ec83",
          "body": "All 4 language integration tests run in parallel against the same bots.\nMessages from other tests (Python, Go, Rust) would bump the message\ncount and cause the Node.js test to falsely report self-filtering as\nbroken. Now only counts messages matching the test pattern.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(node): e2e test ignores unrelated messages from concurrent tests",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T12:01:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ddbc02f0f7dcfd115589da113604764ddd7ea295",
          "body": "…ocket\n\n- Add `import aiohttp` (needed for WSMsgType, WSCloseCode references)\n- Change `.send()` to `.send_str()` for auth and ping messages\n  (aiohttp ClientWebSocketResponse uses send_str for text)\n- Use literal 1000 for close code instead of aiohttp.WSCloseCode.OK\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(python): add missing aiohttp import and fix send_str in mercury_s…",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T11:59:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "97e6e9a54387ec5fcbb7498b6d9922858765608b",
          "body": "…ership\n\n- Remove undefined `connector` reference in KmsClient.__init__ (NameError in production)\n- Fix connector_owner logic: let session own auto-created connector when\n  no user connector is provided, preventing \"Unclosed connector\" warnings\n- Bump Python version to 0.4.3\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(python): remove stale connector ref in KmsClient, fix session own…",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T11:56:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9d61b9885e165e6dd95e22b8af1a1183484c1106",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(python): bump version to 0.4.2",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T11:54:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "de4476b26a111841ccc646dae040972d07d15702",
          "body": "The native HTTP adapter used async context managers that closed the\naiohttp session before the caller could read response.json(). This\ncaused ClientConnectionError in production (including CI integration\ntests). Now reads the body bytes eagerly inside the try block and\nreturns a wrapper with the cached data.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(python): read HTTP response body eagerly before closing session",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T11:54:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "090f54756d697ef24fca5de6c07276e96a005281",
          "body": "- Node.js 20 → 22 (package requires >=22.4.0)\n- pnpm 8 → 9\n- Add pnpm build step before e2e test\n- Fix test command: npx tsx src/test/integration.test.ts → node test-e2e.js\n- Python 3.11 → 3.12\n- Go 1.21 → 1.24\n- actions/cache v3 → v4\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: fix integration test workflow for v0.4.1",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T11:43:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "36e4fe527918d2808c8e0d097a69217bce3807e3",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump Rust and Python versions to 0.4.1",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T11:33:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "33553c08f96163b082809325d199bdd2eb3d2c0d",
          "body": "…guages)\n\nconnect() now throws if /people/me is unreachable when\nignoreSelfMessages is enabled, preventing silent degradation to\nunprotected mode. Previously this silently skipped filtering.\n\nAdded \"Important: Implementing Loop Detection\" section to all 4\nREADMEs explaining that the library only sees the receive side and\nrecommending wrapper-level rate limiting for send loops.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: fail-closed on /people/me failure + loop detection docs (all lan…",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T11:19:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "388e818e1e17ce4d646d65a42e64dfbe1329da7c",
          "body": "The receiver bot now replies to every incoming message via REST API.\nMercury echoes the reply back. If ignoreSelfMessages works correctly,\nthe handler silently drops it. If broken, the test fails with explicit\nLOOP DETECTED or SELF-MESSAGE NOT FILTERED errors.\n\nThis would have caught the ID format mismatch bug immediately.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(node): bidirectional e2e test that exercises self-message filtering",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T11:07:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "44164f8cade0fd75f55d05bf6e66abb1cef02b02",
          "body": "The Webex REST API (/v1/people/me) returns base64-encoded IDs\n(ciscospark://us/PEOPLE/<uuid>) while Mercury wire format uses raw\nUUIDs. The direct equality comparison always failed, so\nignoreSelfMessages never actually filtered anything, causing infinite\nmessage loops in production.\n\nAdded extractPe\n[…]\nrmalize both formats\nto the raw UUID before comparison. Updated tests to use realistic\nmismatched ID formats that reproduce the real-world bug.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: self-message filtering ID format mismatch (all languages) — v0.4.1",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T11:02:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cbfbfe1cce12d807216d9832e86cf50767f0a4d1",
          "body": "BREAKING CHANGES:\n- `agent` config field replaced with `dispatcher` (accepts undici Dispatcher)\n- Node.js engine requirement raised to >=22.4.0\n- Removed `ws` and `@types/ws` dependencies\n- `undici` moved to production dependency\n\nA single ProxyAgent now proxies both fetch() and WebSocket in native \n[…]\n.on() interface, preserving the existing mercury-socket contract.\n\nAll 128 unit tests pass, e2e integration test passes, mitmproxy test passes.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(node)!: migrate from ws to native WebSocket (undici) — v0.4.0",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T10:13:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9da6eda3cad8838a12165b4145d30bf68956182d",
          "body": "Bots automatically filter their own messages out of the box,\npreventing infinite response loops without any configuration.\n\n- Node.js 0.3.3: default changed from false to true\n- Python 0.3.1: new feature with default true\n- Go: new feature with default true (*bool for nil=true)\n- Rust 0.3.2: new fea\n[…]\nth default true\n\nEach language fetches /people/me on connect, caches the bot's\nperson ID, and filters matching messages before emitting events.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add ignoreSelfMessages (default true) to all languages",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T09:14:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f17300d9359d4dc046c1d49c472cba7a1e80065e",
          "body": "There is no practical reason for a bot to process its own messages\nechoed back through Mercury. The bot already knows what it sent via\nthe REST API response. Defaulting to true prevents message loops\nout of the box. Set ignoreSelfMessages: false to opt out.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: default ignoreSelfMessages to true",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T09:06:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7486361e465643a542f91ec0ba3eb965f5d13e1f",
          "body": "Replaces simulated tests with actual handler integration tests that:\n- Mock sub-components (DeviceManager, Mercury, KMS, Decryptor)\n- Let the handler's real _handleActivity filtering logic run\n- Reproduce the runaway loop bug (bot processes own echoes)\n- Prove ignoreSelfMessages prevents the loop\n- Verify /people/me caching and graceful degradation\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: real integration test for message loop prevention",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T09:02:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "820af7e241d2dc3f6da1fa92c7f51e5e7ad76959",
          "body": "…ion tests",
          "is_bot": false,
          "headline": "test: remove overly complex integration tests, keep simple demonstrat…",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T08:56:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "822263865b289af00cf6a65b80c81dc003321a51",
          "body": null,
          "is_bot": false,
          "headline": "docs: remove internal product references from tests and documentation",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T08:56:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee71bf7d71969ce86d3fa08b7fa7336b12df4c7e",
          "body": null,
          "is_bot": false,
          "headline": "docs: update CHANGELOG with loop prevention tests",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T00:14:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97e10ba0d3334e9f56975490f2ae96c5f73aae31",
          "body": "- Demonstrates infinite loop without ignoreSelfMessages\n- Validates filtering prevents loops\n- Shows multi-user conversation handling\n- Documents OKRatlas issue scenario",
          "is_bot": false,
          "headline": "test: add message loop prevention validation tests",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T00:14:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "782c70032c126c8d5be61958f46c96455181235d",
          "body": "Version 0.3.2 includes:\n- New ignoreSelfMessages feature to prevent bot message loops\n- WebSocket proxy documentation for injected mode\n- Comprehensive proxy and self-message filtering tests\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.3.2 and add CHANGELOG",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T00:02:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1d41e2a417b07401c786408be850082f177e6a13",
          "body": "Add built-in self-message filtering to prevent infinite response loops,\naddressing common bot development issue discovered in production usage.\n\nFeatures:\n- New ignoreSelfMessages config option (default: false)\n- Automatically fetches bot's person ID on connect()\n- Caches person ID for session lifet\n[…]\nPersonInfo type\n- _fetchBotPersonId() method\n- Filtering logic in _handleActivity()\n- 5 new tests (all passing)\n- Comprehensive documentation\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(node): add ignoreSelfMessages option to prevent message loops",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-12T00:00:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9aeeb5c0b6f3615fd88f56227cff6bc385039b85",
          "body": "Add comprehensive documentation and examples for proxy support in\ninjected mode, addressing real-world issue where WebSocket connections\nbypassed proxy configuration.\n\nKey additions:\n- Updated README.md with proxy example for injected mode\n- Added Node.js README section on advanced proxy configurati\n[…]\nte addresses production issue discovered in\nOKRatlas deployment where HTTP requests succeeded through proxy\nbut WebSocket connections failed.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(node): add WebSocket proxy configuration for injected mode",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T23:32:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0af134881aa04afab88a7c1719ab0f23643248b1",
          "body": "Add 14 tests validating proxy configuration and usage:\n- ProxyAgent (undici) support\n- http.Agent and https.Agent support\n- Native vs injected mode validation\n- Configuration error handling\n- Environment variable pattern support\n\nAll tests passing. Added undici as devDependency for testing.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(node): add comprehensive proxy support test suite",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T23:17:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3138968945e97af2bc5fb07e189b469d14e05744",
          "body": "Bump version to include TypeScript fixes from commits after 0.3.0 release.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(node): bump version to 0.3.1",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T22:48:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "88186bc03bca128bf0b44de1147da077bd7e4dbc",
          "body": "Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: rename workflow to publish.yml to match PyPI config",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T22:46:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "72055a31bc7a95b842d010e88e9b95902e2bade5",
          "body": "Add GitHub Actions workflow for automated PyPI publishing using\ntrusted publishing (OIDC). This eliminates the need for API tokens\nand provides more secure package publishing.\n\nTo use:\n1. Configure trusted publisher at https://pypi.org/manage/account/publishing/\n2. Trigger manually or automatically on GitHub releases\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: add trusted publishing workflow for PyPI",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T22:46:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "25e2eb6a341cf5cf7c9b8418a01d7c65d9647df1",
          "body": "Bump version to republish with unused variable fix since crates.io\ndoesn't allow republishing yanked versions.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(rust): bump version to 0.3.1",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T22:41:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "59190c708fca97a17b99d04837d8814896317ee0",
          "body": "Remove leftover unused client variable from adapter refactoring.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(rust): remove unused client variable",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T22:38:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "267d9cf1837401ce5d9a1ae25c19ca6a1d0939b5",
          "body": "Update proxy documentation to recommend undici's ProxyAgent instead of\nHttpsProxyAgent for Node.js v18+ environments. Node.js native fetch()\nuses undici internally, so undici's ProxyAgent provides more reliable\nproxy support than traditional https-proxy-agent.\n\nKey changes:\n- Updated README.md proxy\n[…]\n may still work in some cases, this change helps\nusers avoid the \"TypeError: fetch failed\" issue encountered in\ncorporate proxy environments.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: recommend undici ProxyAgent for Node.js proxy support",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T22:30:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2195af813947e5daa75e513c6af24f154431d788",
          "body": "- Remove unused 'agent' field from handler\n- Update WsFactoryFn type to support both native WebSocket and InjectedWebSocket\n- Remove unused http/https imports from mercury-socket\n- Use type assertions for WebSocket event listeners to support both types\n- Handle both string and Buffer types in message/close event handlers\n- All 105 tests passing\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix Node.js TypeScript build errors",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T22:25:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c337cebd80decb2bd91e61b32b0182e116ed3c78",
          "body": "Add support for injecting custom networking implementations across all four languages (Node.js, Python, Go, Rust). This enables wrappers to intercept, log, mock, or route all network calls without the library knowing.\n\nKey changes:\n- Add explicit 'mode' config field ('native' or 'injected')\n- Implem\n[…]\n- Version bumps: Node.js 0.3.0, Python 0.3.0, Go 0.3.0, Rust 0.3.0\n\nNative mode maintains 100% backward compatibility with v0.2.0.\n\nCloses #4\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Implement dependency injection for fetch/WebSocket (Issue #4)",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T22:12:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ba114cfbcbaee3a85696483f1b937bdaacb8a103",
          "body": "New features:\n- Add proxy support via connector/client parameter\n- Add integration tests with two-bot pattern",
          "is_bot": false,
          "headline": "Bump Python and Rust versions to 0.2.0",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T20:48:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "797be094c183cc2eae406c6327a965f596c4da19",
          "body": "New features:\n- Add proxy support via agent parameter\n- Add integration tests with two-bot pattern",
          "is_bot": false,
          "headline": "Bump version to 0.2.0",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T20:47:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad209b79bac083ec30f37cca28ae7deaf9a501f8",
          "body": null,
          "is_bot": false,
          "headline": "Fix import path in Node.js integration test",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T20:45:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "051062ca871dfbd0c9b7b023f49c18f4930e7f7c",
          "body": "The test file doesn't need to be part of the compiled library output.\nUse tsx to run the TypeScript test directly.",
          "is_bot": false,
          "headline": "Run Node.js integration test with tsx instead of compiling",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T20:44:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a34421ad6993072e1ab48e3b33bbfd7c3cee2f02",
          "body": "- Node.js: Move test to src/test/ for compilation to dist/\n- Go: Update to use WEBEX_BOT_TOKEN (receiver) and WEBEX_BOT_TOKEN_TEST (sender)\n- Rust: Update to use two-bot pattern, suppress unused field warning\n\nAll tests now send message FROM sender bot TO receiver bot instead of\ntrying to send to self (which returns HTTP 400).",
          "is_bot": false,
          "headline": "Fix integration tests to use two-bot pattern",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T20:42:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f8869ca904ecf1be38b2db6d89070962a9da123a",
          "body": "- Bot-to-bot messaging confirmed working! (HTTP 200 OK)\n- Change from self-messaging (blocked) to sender→receiver pattern\n  - Receiver bot (WEBEX_BOT_TOKEN): OKR Atlas - runs handler, listens for messages\n  - Sender bot (WEBEX_BOT_TOKEN_TEST): experts - sends test message\n- Update Node.js test to fe\n[…]\n WEBEX_TEST_TARGET_EMAIL (no longer needed with two tokens)\n\nThis fixes the HTTP 400 error caused by bots being unable to message themselves.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update integration tests to use two-bot pattern",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T20:37:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2608550a1c3906e54833360a72808f0abb37a103",
          "body": "- Remove invalid pnpm-workspace.yaml (was causing Node.js install failure)\n- Fix Node.js test to run built version (dist/test/integration.test.js)\n- Fix Go test linting errors (redundant newlines in fmt.Println)\n- Fix Rust test compilation error (disconnect() returns () not Result)\n- Update Python t\n[…]\nests to use WEBEX_TEST_TARGET_EMAIL\n- Update workflow to set WEBEX_TEST_TARGET_EMAIL secret\n- Update TESTING.md with workaround documentation\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix integration test issues",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T20:29:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "10a15a23489df230ca41f06bd4f57c06db118a95",
          "body": "- Add agent/connector/client parameter for proxy support (Node.js, Python, Go, Rust)\n- Add integration tests for all languages\n- Add GitHub Actions workflow for CI/CD integration testing\n- Add TESTING.md documentation\n- Set WEBEX_BOT_TOKEN secret\n\nFixes #1",
          "is_bot": false,
          "headline": "Add proxy support and integration tests for all languages",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T20:26:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c732c6c034d3a2ddd09a742dd67eba09bf5e736c",
          "body": "- Update repository URLs to 3rg0n/webex-message-handler\n- Rust: crates.io ready\n- Python: PyPI ready\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update Rust and Python package metadata for publishing",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T18:38:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cb9c18c25b8e650b504dddecc7a8bd86abd2f842",
          "body": "- Update repository URL to 3rg0n/webex-message-handler\n- Add monorepo directory field\n- Change license from Apache-2.0 to MIT (matches root)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update Node.js package.json for npm publish",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T17:21:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dd9c3fcd3ad15bab3ceb5c8485e8935367db6961",
          "body": "Captures every non-obvious detail discovered while porting across\nfour languages: two-channel KMS pattern, dir vs A256KW JWE,\nJWE/JWS detection, ECDH flow, Mercury auth, concurrency pitfalls,\nand common mistakes ranked by debugging cost.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add PORTING.md with implementation insights and protocol details",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T16:35:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e68b4a44a33f2042081d005c9c6bac0b45fda499",
          "body": "Guidelines for setup, testing, code style, and PR process\nacross all four language implementations.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add CONTRIBUTING.md",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T15:56:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "30ef06593ca15bd7ceebe783d76ba091b7829990",
          "body": "Root README with quick-start examples for all four languages,\narchitecture overview, and links to per-language API docs.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add monorepo root documentation",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T15:53:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cebed7204ad76480dd0507d9516cd1046c6283ad",
          "body": "Rust port using tokio, reqwest, tokio-tungstenite, and josekit.\nIncludes source, tests (12 passing), examples, and API documentation.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Rust implementation in rust/ subdirectory",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T15:53:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5c2c385c7777035b0caca7143a1fc7101f6cd766",
          "body": "Go port using nhooyr.io/websocket, go-jose/v4, and crypto/ecdh.\nIncludes source, tests (68 passing), examples, and API documentation.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Go implementation in go/ subdirectory",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T15:52:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "59367ae73251f8efd8777a8685e3bc5921955e9a",
          "body": "Async Python port using aiohttp, jwcrypto, and asyncio.\nIncludes source, tests (41 passing), examples, and API documentation.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Python implementation in python/ subdirectory",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T15:52:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e8dfd2d3c5df9139151cc817084f7310c83ca163",
          "body": "Webex Mercury WebSocket + KMS message decryption library.\nIncludes source, tests, examples, and API documentation.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Node.js/TypeScript implementation in node/ subdirectory",
          "author_name": "Ergon Copeland",
          "author_login": "3rg0n",
          "committed_at": "2026-02-11T15:51:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 37,
      "commits_last_year": 97,
      "latest_release_at": "2026-07-21T16:28:46Z",
      "latest_release_tag": "v0.6.14",
      "releases_from_tags": false,
      "days_since_last_push": 3,
      "active_weeks_last_year": 10,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 11
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/3rg0n/webex-message-handler/go",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/3rg0n/webex-message-handler/go",
          "is_deprecated": false,
          "latest_version": "v0.6.15",
          "repository_url": "https://github.com/3rg0n/webex-message-handler",
          "versions_count": 20,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-23T15:39:51Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 3
        },
        {
          "name": "webex-message-handler",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "bot",
            "kms",
            "mercury",
            "webex",
            "websocket",
            "network-programming",
            "web-programming"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/webex-message-handler",
          "is_deprecated": false,
          "latest_version": "0.6.15",
          "repository_url": "https://github.com/3rg0n/webex-message-handler",
          "versions_count": 21,
          "total_downloads": 400,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 57,
          "first_published_at": "2026-02-11T18:53:10.017355Z",
          "latest_published_at": "2026-07-23T15:58:47.143587Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 3
        },
        {
          "name": "webex-message-handler",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "webex",
            "mercury",
            "websocket",
            "kms",
            "bot",
            "messaging"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/webex-message-handler",
          "is_deprecated": false,
          "latest_version": "0.6.15",
          "repository_url": "https://github.com/3rg0n/webex-message-handler",
          "versions_count": 15,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2348,
          "first_published_at": "2026-02-11T18:37:36.491000Z",
          "latest_published_at": "2026-07-23T15:58:25.600000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 3
        },
        {
          "name": "webex-message-handler",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "bot",
            "kms",
            "mercury",
            "messaging",
            "webex",
            "websocket",
            "Development Status :: 4 - Beta",
            "Framework :: AsyncIO",
            "Intended Audience :: Developers",
            "License :: OSI Approved :: MIT License",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Topic :: Communications :: Chat"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/webex-message-handler/",
          "is_deprecated": false,
          "latest_version": "0.6.14",
          "repository_url": "https://github.com/3rg0n/webex-message-handler",
          "versions_count": 17,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-02-12T12:04:13.534632Z",
          "latest_published_at": "2026-07-21T16:29:21.300074Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 2,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-04-13",
            "count": 1
          },
          {
            "date": "2026-06-09",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 2,
        "total_forks": 2
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 3
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "node/tsconfig.json"
      ],
      "toolchain_manifests": [
        "go/go.mod",
        "rust/Cargo.toml"
      ],
      "largest_source_bytes": 44381,
      "source_files_sampled": 99,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go/go.mod",
        "node/package.json",
        "python/pyproject.toml",
        "rust/Cargo.toml"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "1.1.13",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-3jxr-9vmj-r5cp",
              "GHSA-mh99-v99m-4gvg"
            ],
            "fixed_version": "5.0.8",
            "advisory_count": 2,
            "oldest_advisory_days": 6
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "5.0.6",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-3jxr-9vmj-r5cp",
              "GHSA-mh99-v99m-4gvg"
            ],
            "fixed_version": "5.0.8",
            "advisory_count": 2,
            "oldest_advisory_days": 6
          },
          {
            "name": "js-yaml",
            "direct": false,
            "version": "5.0.0",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-724g-mxrg-4qvm",
              "GHSA-g796-fgmg-93mv",
              "GHSA-pm4m-ph32-ghv5"
            ],
            "fixed_version": "5.2.2",
            "advisory_count": 3,
            "oldest_advisory_days": 6
          },
          {
            "name": "uuid",
            "direct": false,
            "version": "2.0.3",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-w5hq-g745-h8pq"
            ],
            "fixed_version": "13.0.1",
            "advisory_count": 1,
            "oldest_advisory_days": 95
          },
          {
            "name": "golang.org/x/crypto",
            "direct": true,
            "version": "v0.54.0",
            "severity": "unknown",
            "ecosystem": "go",
            "cvss_score": null,
            "advisory_ids": [
              "GO-2026-5932"
            ],
            "fixed_version": null,
            "advisory_count": 1,
            "oldest_advisory_days": 19
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 4,
          "unknown": 1
        },
        "advisory_count": 9,
        "affected_count": 5,
        "assessed_count": 516,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 30,
        "direct_affected_count": 1
      },
      "ecosystems": [
        "crates",
        "go",
        "npm",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "github.com/go-jose/go-jose/v4",
          "manifest": "go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v4.1.4"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "golang.org/x/crypto",
          "manifest": "go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.54.0"
        },
        {
          "name": "github.com/coder/websocket",
          "manifest": "go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.8.15"
        },
        {
          "name": "node-jose",
          "manifest": "node/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.2.0"
        },
        {
          "name": "node-kms",
          "manifest": "node/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.4.1"
        },
        {
          "name": "undici",
          "manifest": "node/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.7.0"
        },
        {
          "name": "aiohttp",
          "manifest": "python/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.14.1"
        },
        {
          "name": "cryptography",
          "manifest": "python/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=48.0.1"
        },
        {
          "name": "jwcrypto",
          "manifest": "python/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.5.7"
        },
        {
          "name": "tokio",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tokio-tungstenite",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.24"
        },
        {
          "name": "reqwest",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "serde",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "uuid",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "thiserror",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "tracing",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "url",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "futures-util",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "base64",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.22"
        },
        {
          "name": "p256",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.13"
        },
        {
          "name": "hkdf",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "sha1",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10"
        },
        {
          "name": "sha2",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10"
        },
        {
          "name": "rand",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "aes-gcm",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10"
        },
        {
          "name": "aes-kw",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2"
        },
        {
          "name": "rsa",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.9"
        },
        {
          "name": "regex",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "once_cell",
          "manifest": "rust/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "aes-gcm",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "aes-kw",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "base64",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "futures-util",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "hkdf",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "once_cell",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "p256",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "rand",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "regex",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "reqwest",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "rsa",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "serde",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "serde_json",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "sha1",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "sha2",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "thiserror",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "tokio",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "tokio-tungstenite",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "tracing",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "url",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "uuid",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "github.com/coder/websocket",
            "direct": true,
            "version": "v1.8.15",
            "ecosystem": "go"
          },
          {
            "name": "github.com/go-jose/go-jose/v4",
            "direct": true,
            "version": "v4.1.4",
            "ecosystem": "go"
          },
          {
            "name": "github.com/google/uuid",
            "direct": true,
            "version": "v1.6.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/crypto",
            "direct": true,
            "version": "v0.54.0",
            "ecosystem": "go"
          },
          {
            "name": "node-jose",
            "direct": true,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-kms",
            "direct": true,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "undici",
            "direct": true,
            "version": "8.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "aiohttp",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "cryptography",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "jwcrypto",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "tracing-subscriber",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "wiremock",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "@babel/code-frame",
            "direct": false,
            "version": "7.29.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/code-frame",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/compat-data",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/core",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/generator",
            "direct": false,
            "version": "7.29.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/generator",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-compilation-targets",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-globals",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-plugin-utils",
            "direct": false,
            "version": "7.28.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-string-parser",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-string-parser",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-identifier",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-identifier",
            "direct": false,
            "version": "8.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-option",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helpers",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/parser",
            "direct": false,
            "version": "7.29.2",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/parser",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-async-generators",
            "direct": false,
            "version": "7.8.4",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-bigint",
            "direct": false,
            "version": "7.8.3",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-class-properties",
            "direct": false,
            "version": "7.12.13",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-class-static-block",
            "direct": false,
            "version": "7.14.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-import-attributes",
            "direct": false,
            "version": "7.28.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-import-meta",
            "direct": false,
            "version": "7.10.4",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-json-strings",
            "direct": false,
            "version": "7.8.3",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-jsx",
            "direct": false,
            "version": "7.28.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-logical-assignment-operators",
            "direct": false,
            "version": "7.10.4",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-nullish-coalescing-operator",
            "direct": false,
            "version": "7.8.3",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-numeric-separator",
            "direct": false,
            "version": "7.10.4",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-object-rest-spread",
            "direct": false,
            "version": "7.8.3",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-optional-catch-binding",
            "direct": false,
            "version": "7.8.3",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-optional-chaining",
            "direct": false,
            "version": "7.8.3",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-private-property-in-object",
            "direct": false,
            "version": "7.14.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-top-level-await",
            "direct": false,
            "version": "7.14.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-typescript",
            "direct": false,
            "version": "7.28.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/template",
            "direct": false,
            "version": "7.28.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/template",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/traverse",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/types",
            "direct": false,
            "version": "7.29.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/types",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@bcoe/v8-coverage",
            "direct": false,
            "version": "0.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "@cspotcode/source-map-support",
            "direct": false,
            "version": "0.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/aix-ppc64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ia32",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-loong64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-mips64el",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ppc64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-riscv64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-s390x",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openharmony-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/sunos-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-ia32",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-x64",
            "direct": false,
            "version": "0.28.1",
            "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/eslintrc",
            "direct": false,
            "version": "2.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/js",
            "direct": false,
            "version": "8.57.0",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/config-array",
            "direct": false,
            "version": "0.11.14",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/module-importer",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/object-schema",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@istanbuljs/load-nyc-config",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@istanbuljs/schema",
            "direct": false,
            "version": "0.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/console",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/core",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/environment",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/expect",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/expect-utils",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/fake-timers",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/globals",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/pattern",
            "direct": false,
            "version": "30.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/reporters",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/schemas",
            "direct": false,
            "version": "29.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/schemas",
            "direct": false,
            "version": "30.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/source-map",
            "direct": false,
            "version": "29.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/test-result",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/test-sequencer",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/transform",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/transform",
            "direct": false,
            "version": "30.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/types",
            "direct": false,
            "version": "29.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "@jest/types",
            "direct": false,
            "version": "30.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/gen-mapping",
            "direct": false,
            "version": "0.3.13",
            "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": "@jridgewell/trace-mapping",
            "direct": false,
            "version": "0.3.9",
            "ecosystem": "npm"
          },
          {
            "name": "@nodelib/fs.scandir",
            "direct": false,
            "version": "2.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "@nodelib/fs.stat",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@nodelib/fs.walk",
            "direct": false,
            "version": "1.2.8",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-android-arm-eabi",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-android-arm64",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-darwin-arm64",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-darwin-x64",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-freebsd-arm64",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-freebsd-x64",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm-gnueabihf",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm-musleabihf",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm64-gnu",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm64-musl",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-loong64-gnu",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-loong64-musl",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-ppc64-gnu",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-ppc64-musl",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-riscv64-gnu",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-riscv64-musl",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-s390x-gnu",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-x64-gnu",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-x64-musl",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-openbsd-x64",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-openharmony-arm64",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-arm64-msvc",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-ia32-msvc",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-x64-gnu",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-x64-msvc",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@sinclair/typebox",
            "direct": false,
            "version": "0.27.10",
            "ecosystem": "npm"
          },
          {
            "name": "@sinclair/typebox",
            "direct": false,
            "version": "0.34.48",
            "ecosystem": "npm"
          },
          {
            "name": "@sinonjs/commons",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@sinonjs/fake-timers",
            "direct": false,
            "version": "10.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tsconfig/node10",
            "direct": false,
            "version": "1.0.12",
            "ecosystem": "npm"
          },
          {
            "name": "@tsconfig/node12",
            "direct": false,
            "version": "1.0.11",
            "ecosystem": "npm"
          },
          {
            "name": "@tsconfig/node14",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@tsconfig/node16",
            "direct": false,
            "version": "1.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/babel__core",
            "direct": false,
            "version": "7.20.5",
            "ecosystem": "npm"
          },
          {
            "name": "@types/babel__generator",
            "direct": false,
            "version": "7.27.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/babel__template",
            "direct": false,
            "version": "7.4.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/babel__traverse",
            "direct": false,
            "version": "7.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree",
            "direct": false,
            "version": "1.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "@types/gensync",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@types/graceful-fs",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@types/istanbul-lib-coverage",
            "direct": false,
            "version": "2.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "@types/istanbul-lib-report",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/istanbul-reports",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/jest",
            "direct": false,
            "version": "29.5.14",
            "ecosystem": "npm"
          },
          {
            "name": "@types/jsesc",
            "direct": false,
            "version": "2.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "22.13.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "25.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/stack-utils",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/yargs",
            "direct": false,
            "version": "17.0.35",
            "ecosystem": "npm"
          },
          {
            "name": "@types/yargs-parser",
            "direct": false,
            "version": "21.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/eslint-plugin",
            "direct": false,
            "version": "8.57.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/parser",
            "direct": false,
            "version": "8.57.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/project-service",
            "direct": false,
            "version": "8.57.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/scope-manager",
            "direct": false,
            "version": "8.57.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/tsconfig-utils",
            "direct": false,
            "version": "8.57.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/type-utils",
            "direct": false,
            "version": "8.57.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/types",
            "direct": false,
            "version": "8.57.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/typescript-estree",
            "direct": false,
            "version": "8.57.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/utils",
            "direct": false,
            "version": "8.57.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/visitor-keys",
            "direct": false,
            "version": "8.57.2",
            "ecosystem": "npm"
          },
          {
            "name": "@ungap/structured-clone",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "acorn",
            "direct": false,
            "version": "8.16.0",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-jsx",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-walk",
            "direct": false,
            "version": "8.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "6.14.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-escapes",
            "direct": false,
            "version": "4.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "5.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "any-promise",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "anymatch",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "arg",
            "direct": false,
            "version": "4.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "argparse",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "babel-jest",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "babel-jest",
            "direct": false,
            "version": "30.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "babel-plugin-istanbul",
            "direct": false,
            "version": "6.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "babel-plugin-istanbul",
            "direct": false,
            "version": "7.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "babel-plugin-jest-hoist",
            "direct": false,
            "version": "29.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "babel-plugin-jest-hoist",
            "direct": false,
            "version": "30.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "babel-preset-current-node-syntax",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "babel-preset-jest",
            "direct": false,
            "version": "29.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "babel-preset-jest",
            "direct": false,
            "version": "30.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "base64-js",
            "direct": false,
            "version": "1.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "base64url",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "baseline-browser-mapping",
            "direct": false,
            "version": "2.10.11",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "1.1.13",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "5.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "braces",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "browserslist",
            "direct": false,
            "version": "4.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "bs-logger",
            "direct": false,
            "version": "0.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "bser",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "buffer",
            "direct": false,
            "version": "6.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "buffer-from",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "bundle-require",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "cac",
            "direct": false,
            "version": "6.7.14",
            "ecosystem": "npm"
          },
          {
            "name": "callsites",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "camelcase",
            "direct": false,
            "version": "5.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "camelcase",
            "direct": false,
            "version": "6.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "caniuse-lite",
            "direct": false,
            "version": "1.0.30001781",
            "ecosystem": "npm"
          },
          {
            "name": "chalk",
            "direct": false,
            "version": "4.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "char-regex",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "chokidar",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "ci-info",
            "direct": false,
            "version": "3.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "ci-info",
            "direct": false,
            "version": "4.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "cjs-module-lexer",
            "direct": false,
            "version": "1.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "cliui",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "co",
            "direct": false,
            "version": "4.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "collect-v8-coverage",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "color-convert",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "color-name",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "concat-map",
            "direct": false,
            "version": "0.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "confbox",
            "direct": false,
            "version": "0.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "consola",
            "direct": false,
            "version": "3.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "convert-source-map",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "create-jest",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "create-require",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "cross-spawn",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "dedent",
            "direct": false,
            "version": "1.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "deep-is",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "deepmerge",
            "direct": false,
            "version": "4.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "detect-newline",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "diff",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "diff-sequences",
            "direct": false,
            "version": "29.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "doctrine",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "electron-to-chromium",
            "direct": false,
            "version": "1.5.328",
            "ecosystem": "npm"
          },
          {
            "name": "emittery",
            "direct": false,
            "version": "0.13.1",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "empathic",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "error-ex",
            "direct": false,
            "version": "1.3.4",
            "ecosystem": "npm"
          },
          {
            "name": "es6-promise",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "es6-promise",
            "direct": false,
            "version": "4.2.8",
            "ecosystem": "npm"
          },
          {
            "name": "esbuild",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "escalade",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint",
            "direct": false,
            "version": "8.57.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-scope",
            "direct": false,
            "version": "7.2.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": "9.6.1",
            "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": "esutils",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "execa",
            "direct": false,
            "version": "5.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "exit",
            "direct": false,
            "version": "0.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "expect",
            "direct": false,
            "version": "29.7.0",
            "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": "fastq",
            "direct": false,
            "version": "1.20.1",
            "ecosystem": "npm"
          },
          {
            "name": "fb-watchman",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "fdir",
            "direct": false,
            "version": "6.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "file-entry-cache",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "fill-range",
            "direct": false,
            "version": "7.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "find-up",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "find-up",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "fix-dts-default-cjs-exports",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "flat-cache",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "flatted",
            "direct": false,
            "version": "3.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "fs.realpath",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "fsevents",
            "direct": false,
            "version": "2.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "function-bind",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "gensync",
            "direct": false,
            "version": "1.0.0-beta.2",
            "ecosystem": "npm"
          },
          {
            "name": "get-caller-file",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "get-package-type",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "get-stream",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "get-tsconfig",
            "direct": false,
            "version": "4.13.7",
            "ecosystem": "npm"
          },
          {
            "name": "glob",
            "direct": false,
            "version": "7.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "glob-parent",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "globals",
            "direct": false,
            "version": "13.24.0",
            "ecosystem": "npm"
          },
          {
            "name": "graceful-fs",
            "direct": false,
            "version": "4.2.11",
            "ecosystem": "npm"
          },
          {
            "name": "graphemer",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "handlebars",
            "direct": false,
            "version": "4.7.9",
            "ecosystem": "npm"
          },
          {
            "name": "has-flag",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "hasown",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "html-escaper",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "human-signals",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "ieee754",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "7.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "import-fresh",
            "direct": false,
            "version": "3.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "import-local",
            "direct": false,
            "version": "3.2.0",
            "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": "inflight",
            "direct": false,
            "version": "1.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "inherits",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "is-arrayish",
            "direct": false,
            "version": "0.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-core-module",
            "direct": false,
            "version": "2.16.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-extglob",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-fullwidth-code-point",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-generator-fn",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-glob",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-number",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-path-inside",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-stream",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "isexe",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-lib-coverage",
            "direct": false,
            "version": "3.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-lib-instrument",
            "direct": false,
            "version": "5.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-lib-instrument",
            "direct": false,
            "version": "6.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-lib-report",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-lib-source-maps",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-reports",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-changed-files",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-circus",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-cli",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-config",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-diff",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-docblock",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-each",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-environment-node",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-get-type",
            "direct": false,
            "version": "29.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "jest-haste-map",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-haste-map",
            "direct": false,
            "version": "30.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-leak-detector",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-matcher-utils",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-message-util",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-mock",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-pnp-resolver",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "jest-regex-util",
            "direct": false,
            "version": "29.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "jest-regex-util",
            "direct": false,
            "version": "30.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "jest-resolve",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-resolve-dependencies",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-runner",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-runtime",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-snapshot",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-util",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-util",
            "direct": false,
            "version": "30.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-validate",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-watcher",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-worker",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "jest-worker",
            "direct": false,
            "version": "30.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "jiti",
            "direct": false,
            "version": "2.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "joycon",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "js-tokens",
            "direct": false,
            "version": "10.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "js-tokens",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "js-yaml",
            "direct": false,
            "version": "5.0.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-parse-even-better-errors",
            "direct": false,
            "version": "2.3.1",
            "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": "keyv",
            "direct": false,
            "version": "4.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "kleur",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "leven",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "levn",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "lilconfig",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "lines-and-columns",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "load-tsconfig",
            "direct": false,
            "version": "0.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "locate-path",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "locate-path",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "lodash",
            "direct": false,
            "version": "4.18.1",
            "ecosystem": "npm"
          },
          {
            "name": "lodash._arraycopy",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "lodash._arrayeach",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "lodash._baseassign",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "lodash._baseclone",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "lodash._basecopy",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "lodash._basefor",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "lodash._bindcallback",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "lodash._getnative",
            "direct": false,
            "version": "3.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "lodash._isiterateecall",
            "direct": false,
            "version": "3.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "lodash.clone",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "lodash.clonedeep",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "lodash.isarguments",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "lodash.isarray",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "lodash.keys",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "lodash.memoize",
            "direct": false,
            "version": "4.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "lodash.merge",
            "direct": false,
            "version": "4.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "long",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "lru-cache",
            "direct": false,
            "version": "11.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "magic-string",
            "direct": false,
            "version": "0.30.21",
            "ecosystem": "npm"
          },
          {
            "name": "make-dir",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "make-error",
            "direct": false,
            "version": "1.3.6",
            "ecosystem": "npm"
          },
          {
            "name": "makeerror",
            "direct": false,
            "version": "1.0.12",
            "ecosystem": "npm"
          },
          {
            "name": "merge-stream",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "micromatch",
            "direct": false,
            "version": "4.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "mimic-fn",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "10.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "3.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "minimist",
            "direct": false,
            "version": "1.2.8",
            "ecosystem": "npm"
          },
          {
            "name": "mlly",
            "direct": false,
            "version": "1.8.2",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "mz",
            "direct": false,
            "version": "2.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "natural-compare",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "neo-async",
            "direct": false,
            "version": "2.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "node-forge",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-int64",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-releases",
            "direct": false,
            "version": "2.0.36",
            "ecosystem": "npm"
          },
          {
            "name": "normalize-path",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "npm-run-path",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "object-assign",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "obug",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "once",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "onetime",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "optionator",
            "direct": false,
            "version": "0.9.4",
            "ecosystem": "npm"
          },
          {
            "name": "p-limit",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-limit",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-locate",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-locate",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-try",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "pako",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "parent-module",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "parse-json",
            "direct": false,
            "version": "5.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-exists",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-is-absolute",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-key",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-parse",
            "direct": false,
            "version": "1.0.7",
            "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": "2.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "pirates",
            "direct": false,
            "version": "4.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "pkg-dir",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "pkg-types",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "postcss-load-config",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "prelude-ls",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "pretty-format",
            "direct": false,
            "version": "29.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "process",
            "direct": false,
            "version": "0.11.10",
            "ecosystem": "npm"
          },
          {
            "name": "prompts",
            "direct": false,
            "version": "2.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "punycode",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "pure-rand",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "queue-microtask",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "react-is",
            "direct": false,
            "version": "18.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "readdirp",
            "direct": false,
            "version": "4.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "require-directory",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "resolve",
            "direct": false,
            "version": "1.22.11",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-cwd",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-from",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-from",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-pkg-maps",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "resolve.exports",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "reusify",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "rimraf",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "rollup",
            "direct": false,
            "version": "4.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "run-parallel",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "6.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "7.7.4",
            "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": "signal-exit",
            "direct": false,
            "version": "3.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "signal-exit",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "sisteransi",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "slash",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "source-map",
            "direct": false,
            "version": "0.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "source-map",
            "direct": false,
            "version": "0.7.6",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-support",
            "direct": false,
            "version": "0.5.13",
            "ecosystem": "npm"
          },
          {
            "name": "stack-utils",
            "direct": false,
            "version": "2.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "string-length",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "4.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-bom",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-final-newline",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-json-comments",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "sucrase",
            "direct": false,
            "version": "3.35.1",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "8.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "supports-preserve-symlinks-flag",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "test-exclude",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "text-table",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "thenify",
            "direct": false,
            "version": "3.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "thenify-all",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinyexec",
            "direct": false,
            "version": "0.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "tinyglobby",
            "direct": false,
            "version": "0.2.15",
            "ecosystem": "npm"
          },
          {
            "name": "tmpl",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "to-regex-range",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "tree-kill",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "ts-api-utils",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "ts-interface-checker",
            "direct": false,
            "version": "0.1.13",
            "ecosystem": "npm"
          },
          {
            "name": "ts-jest",
            "direct": false,
            "version": "29.4.6",
            "ecosystem": "npm"
          },
          {
            "name": "ts-node",
            "direct": false,
            "version": "10.9.2",
            "ecosystem": "npm"
          },
          {
            "name": "tsup",
            "direct": false,
            "version": "8.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "tsx",
            "direct": false,
            "version": "4.21.0",
            "ecosystem": "npm"
          },
          {
            "name": "type-check",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "type-detect",
            "direct": false,
            "version": "4.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "type-fest",
            "direct": false,
            "version": "0.20.2",
            "ecosystem": "npm"
          },
          {
            "name": "type-fest",
            "direct": false,
            "version": "0.21.3",
            "ecosystem": "npm"
          },
          {
            "name": "type-fest",
            "direct": false,
            "version": "4.41.0",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "5.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "ufo",
            "direct": false,
            "version": "1.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "uglify-js",
            "direct": false,
            "version": "3.19.3",
            "ecosystem": "npm"
          },
          {
            "name": "undici-types",
            "direct": false,
            "version": "6.20.0",
            "ecosystem": "npm"
          },
          {
            "name": "undici-types",
            "direct": false,
            "version": "7.18.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": "uuid",
            "direct": false,
            "version": "11.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "uuid",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "v8-compile-cache-lib",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "v8-to-istanbul",
            "direct": false,
            "version": "9.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "walker",
            "direct": false,
            "version": "1.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "which",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "word-wrap",
            "direct": false,
            "version": "1.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "wordwrap",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "wrap-ansi",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "wrappy",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "write-file-atomic",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "write-file-atomic",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "y18n",
            "direct": false,
            "version": "5.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "yargs",
            "direct": false,
            "version": "17.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "yargs-parser",
            "direct": false,
            "version": "21.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "yn",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "yocto-queue",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "mypy",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-asyncio",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "ruff",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 546,
        "direct_count": 31,
        "indirect_count": 515
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 2,
        "merged_prs": 2,
        "open_issues": 1,
        "closed_ratio": 0.923,
        "closed_issues": 12,
        "closed_unmerged_prs": 10
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "3rg0n",
          "commits": 95,
          "avatar_url": "https://avatars.githubusercontent.com/u/62959009?v=4"
        },
        {
          "type": "User",
          "login": "ojaber",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/468248?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.979
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "codeql.yml",
        "integration-tests.yml",
        "publish.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".eslintrc.cjs"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 0,
            "reason": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 1/28 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "10 commit(s) and 5 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": 5,
            "reason": "dependency not pinned by hash detected -- score normalized to 5",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 7,
            "reason": "SAST tool detected but not run on all commits",
            "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": 0,
            "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": 3,
            "reason": "7 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "fbf1c62c1a51ead882975b4f367f63f6b2e3ad9e",
        "ran_at": "2026-07-27T14:07:02Z",
        "aggregate_score": 4.3,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": true,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-27T07:51:30Z",
      "oldest_open_prs": [
        {
          "number": 18,
          "created_at": "2026-04-27T19:27:29Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 19,
          "created_at": "2026-04-28T02:55:02Z",
          "last_comment_at": "2026-04-28T05:15:53Z",
          "last_comment_author": "ojaber"
        }
      ],
      "last_merged_pr_at": "2026-04-13T15:14:16Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 26,
          "created_at": "2026-07-18T20:41:36Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/3rg0n/webex-message-handler",
    "host": "github.com",
    "name": "webex-message-handler",
    "owner": "3rg0n"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 59,
      "inputs": {
        "security": 52,
        "vitality": 83,
        "community": 39,
        "governance": 49,
        "engineering": 68
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 83,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "commits_last_year": 97,
              "human_commit_share": 1,
              "days_since_last_push": 3,
              "active_weeks_last_year": 10
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 3 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "10/52 weeks with commits",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "97 commits in the last year",
                "points": 17.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 97
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "10 commit(s) and 5 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": 37,
              "latest_release_tag": "v0.6.14",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 11
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "37 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 37
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~11 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 11
                    }
                  }
                ],
                "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": 39,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 2,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "2 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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 (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 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": 56,
            "inputs": {
              "packages": [
                "github.com/3rg0n/webex-message-handler/go",
                "webex-message-handler",
                "webex-message-handler",
                "webex-message-handler"
              ],
              "dependents": null,
              "ecosystems": "crates, go, npm, pypi",
              "total_downloads": 400,
              "monthly_downloads": 2405
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,405 downloads/month across crates, go, npm, pypi",
                "points": 45.1,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2405,
                      "ecosystems": "crates, go, npm, pypi"
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Sustainability & Governance",
        "value": 49,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.979
            },
            "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 98% of commits",
                "points": 0.5,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 98
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "merged_prs": 2,
              "open_issues": 1,
              "closed_issues": 12,
              "issue_closed_ratio": 0.923,
              "closed_unmerged_prs": 10
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "92% of issues closed",
                "points": 43.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 92
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "2/12 decided PRs merged",
                "points": 6.4,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 2,
                      "decided": 12
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/28 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 47,
            "inputs": {
              "followers": 6,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "3rg0n",
              "public_repos": 18,
              "account_age_days": 2308
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "6 followers of 3rg0n",
                "points": 6.1,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 6,
                      "login": "3rg0n"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "18 public repos, account ~6 yr old",
                "points": 21.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 18
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/3rg0n/webex-message-handler/go",
                "webex-message-handler",
                "webex-message-handler",
                "webex-message-handler"
              ],
              "ecosystems": "crates, go, npm, pypi",
              "any_deprecated": false,
              "min_days_since_publish": 3
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "4 package(s) on crates, go, npm, pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 4,
                      "ecosystems": "crates, go, npm, pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 3 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "21 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 21
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 68,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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.cjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc.cjs"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 52,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "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": 43,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.3
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "Found 1/28 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "10 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 5",
                "points": 2.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool detected but not run on all commits",
                "points": 3.5,
                "status": "partial",
                "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "7 existing vulnerabilities detected",
                "points": 2.2,
                "status": "partial",
                "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. Remaining weights renormalized. Matched 516 resolved dependencies against OSV; 30 could not be assessed (no resolved version, an unsupported ecosystem, or beyond the reported package list). 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"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 516
                }
              },
              {
                "code": "advisories_unassessed",
                "params": {
                  "count": 30
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 89,
            "inputs": {
              "source": "osv",
              "advisories": 9,
              "affected_packages": 5,
              "assessed_packages": 516,
              "unassessed_packages": 30,
              "affected_by_severity": "high 4, unknown 1",
              "direct_affected_packages": 1
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "1 affected: golang.org/x/crypto v0.54.0 (unknown)",
                "points": 26.6,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "golang.org/x/crypto v0.54.0 (unknown)"
                    }
                  }
                ],
                "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 has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "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": 516,
              "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": 4
            },
            "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": "moderate",
        "name": "AI Readiness",
        "value": 66,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.979,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "95 of 97 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 95,
                      "sampled": 97
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "node/tsconfig.json"
              ],
              "agent_commit_share": 0.835,
              "toolchain_manifests": [
                "go/go.mod",
                "rust/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go/go.mod, rust/Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go/go.mod, rust/Cargo.toml"
                    }
                  }
                ],
                "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.cjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc.cjs"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "node/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "node/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": "81 of the last 97 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 81,
                      "sampled": 97
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 5",
                "points": 5,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 44381,
              "source_files_sampled": 99,
              "oversized_source_files": 0
            },
            "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": "0/99 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 99,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "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": [],
  "report_type": "repository",
  "generated_at": "2026-07-27T14:07:11.709620Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/3/3rg0n/webex-message-handler.svg",
  "full_name": "3rg0n/webex-message-handler",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsGo, crates.io, npm, PyPI.