diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3284105053..eb7601bd6c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -93,6 +93,7 @@ jobs: steps: - uses: actions/checkout@v7 with: + fetch-depth: 0 persist-credentials: false - uses: actions/setup-node@v7 with: @@ -127,6 +128,7 @@ jobs: - run: npm run check:any-budget:t11 - run: npm run check:provider-consistency - run: npm run check:model-lifecycle + - run: npm run check:provider-asset-provenance - run: npm run check:fetch-targets - run: npm run check:deps - run: npm run check:file-size diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index c0efa13a2f..f58fae0c92 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -269,7 +269,7 @@ jobs: run: | set -uo pipefail gates=( - provider-consistency fetch-targets deps file-size error-helper + provider-consistency provider-asset-provenance fetch-targets deps file-size error-helper migration-numbering public-creds db-rules known-symbols route-guard-membership test-discovery test-runner-api mutation-test-coverage any-budget:t11 build-scope pack-policy diff --git a/changelog.d/maintenance/11743-provider-asset-provenance.md b/changelog.d/maintenance/11743-provider-asset-provenance.md new file mode 100644 index 0000000000..26b8e8775a --- /dev/null +++ b/changelog.d/maintenance/11743-provider-asset-provenance.md @@ -0,0 +1 @@ +- **chore(quality):** added a versioned 225/225 provider-asset provenance manifest and blocking drift gate ([#11743](https://github.com/diegosouzapw/OmniRoute/pull/11743)) — the inventory pins magic MIME and SHA-256 for every physical file, records immutable source matches for 71 assets, keeps 69 probable and 85 unresolved entries explicit but non-blocking, and treats provenance as source evidence rather than copyright or trademark clearance. diff --git a/config/quality/provider-assets-provenance.jsonl b/config/quality/provider-assets-provenance.jsonl new file mode 100644 index 0000000000..23f925cab1 --- /dev/null +++ b/config/quality/provider-assets-provenance.jsonl @@ -0,0 +1,231 @@ +{"recordType":"manifest","schemaVersion":1,"expectedAssetCount":225,"auditedCommit":"091589089cd134a94df9f6cdab9ba562b2cefd18","auditedAt":"2026-08-26","scope":"Every regular file directly under public/providers at the audited commit.","statusSemantics":{"proven":"Immutable source plus byte-exact or SVG path-data match.","probable":"Repository evidence suggests provenance, but no immutable upstream match is proven.","unresolved":"No sufficient immutable provenance evidence is recorded."},"enforcement":"All physical files, hashes, magic MIME values, statuses, and duplicate aliases are blocking. Probable and unresolved statuses are recorded but non-blocking in schema version 1.","legalScope":"Provenance records source matching only; it does not establish copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/360ai.svg","mediaType":"image/svg+xml","sha256":"59366fe04a4336518b8277b430f4a464a91e7ec944c9cf6f40a945c74002386d","provenanceStatus":"proven","source":{"kind":"npm","url":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz","ref":"5.10.0","path":"package/es/Ai360/components/Color.js","integrity":"sha512-CIpjkISCLRK7haDtSugGFd0o3odaJts8ewJOkUiEFtns3xvsqbl8i24eowBnjw+yMDQVQyNONlhqTD58YC6Ljg==","packageShasum":"add1baced073a60157d39c7820b8d5c1928a1054","match":"svg-path-data","matchDetail":"All 5/5 local SVG path d values match the pinned Color component."},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"@lobehub/icons@5.10.0 package/LICENSE","evidence":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz#package/LICENSE","independentlyVerified":true,"scope":"Pinned package distribution only; no trademark clearance."},"trademarkClearance":null,"evidenceNote":"All local SVG path data matches the pinned LobeHub Color component. This proves source provenance only, not trademark clearance."} +{"recordType":"asset","path":"public/providers/adapta-web.png","mediaType":"image/png","sha256":"4b6e748879bd76ced99f3885767ead179739c5d56a63daf7baccda0805b69d11","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/agentrouter.png","mediaType":"image/png","sha256":"32132a307cad98d7f93b0384de87411f087bb34c148c932dcd5eea92101cbec3","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/aimlapi.png","mediaType":"image/png","sha256":"775ac2602a35e725b4f452b29c0827ca51872914a6f834afaf451342c1400c90","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/alibaba.svg","mediaType":"image/svg+xml","sha256":"1cd1e7be5108d1e847508dc9e40591fb6eb29aac20bbf7f4c56c6f082359b323","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/alibaba/default.svg","integrity":"sha256:1cd1e7be5108d1e847508dc9e40591fb6eb29aac20bbf7f4c56c6f082359b323","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://alibaba.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/anthropic-m.png","mediaType":"image/png","sha256":"2440273e0dde1c58af905aa5c6246e603d949b11aceef70dc39502e620e4e3ee","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/anthropic.svg","mediaType":"image/svg+xml","sha256":"7fea3100bfc2a9480e181fc615d4791cab014f54674b83953785abb86dc293f0","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/anthropic/default.svg","integrity":"sha256:7fea3100bfc2a9480e181fc615d4791cab014f54674b83953785abb86dc293f0","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://www.anthropic.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/api-airforce.svg","mediaType":"image/svg+xml","sha256":"1b03c991ad613f781fa02b3a22e357e753beee6e8801249ac366acec7a6b974f","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/apikey.svg","mediaType":"image/svg+xml","sha256":"b348407ccd0b19eaa00b5ed4e5cf7e69ea8e244291c9cadc41dfb2495f80c381","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/arcee-ai.svg","mediaType":"image/svg+xml","sha256":"41a8ed8278ec89d6a12ba5c96172ee30d6fadc93474792a8c95732ad7466233e","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/arcee.svg","mediaType":"image/svg+xml","sha256":"c54fde7b3f98270594daaa1215f07c22d705bb89799d9a116321fd2b3379e971","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/arcee/default.svg","integrity":"sha256:c54fde7b3f98270594daaa1215f07c22d705bb89799d9a116321fd2b3379e971","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://arcee.ai/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/arena-dark.svg","mediaType":"image/svg+xml","sha256":"5c783b4dadd9c76f65cc64d4a42a3a285d12dfe3d6b297280223b5f893350735","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/arena-light.svg","mediaType":"image/svg+xml","sha256":"b4e3a8342fa5e9669455581d68e5ae0b34deaf3dde7e99297bc002626b7f3679","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/assemblyai.svg","mediaType":"image/svg+xml","sha256":"12b95e8db89da1d2676fe289b942e5ebd23e61743bfbae5291c18e07509f5f1a","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/assemblyai/default.svg","integrity":"sha256:12b95e8db89da1d2676fe289b942e5ebd23e61743bfbae5291c18e07509f5f1a","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://assemblyai.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/auggie.svg","mediaType":"image/svg+xml","sha256":"deef0f33f2be4516c977d1ca0c2580265752eb6b2111ffa6a10d99ae6e39f3fb","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/aws.svg","mediaType":"image/svg+xml","sha256":"65e2ca39ef0669dbb0323bc5ab69f981b8087d8ebb3e4a3bce1d3b32b3b67151","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/aws/default.svg","integrity":"sha256:65e2ca39ef0669dbb0323bc5ab69f981b8087d8ebb3e4a3bce1d3b32b3b67151","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://aws.amazon.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/azure.svg","mediaType":"image/svg+xml","sha256":"6c6f0097f0e4a2b4adb7c29f770205c25b7b5c97fb317f3eaebab603f0de4a35","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/azure/default.svg","integrity":"sha256:6c6f0097f0e4a2b4adb7c29f770205c25b7b5c97fb317f3eaebab603f0de4a35","match":"byte-exact"},"upstreamLicenseClaim":{"value":"brand-use","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://azure.microsoft.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/azureai.svg","mediaType":"image/svg+xml","sha256":"a8ad4524c2b8277209bfd0fda29dd9a659fa0d8c2d75f7adb0acd36045b98f96","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/baichuan.svg","mediaType":"image/svg+xml","sha256":"7d49311206402734850ed9dc112759780429bb363dcee31eccb5a92f428532a6","provenanceStatus":"proven","source":{"kind":"npm","url":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz","ref":"5.10.0","path":"package/es/Baichuan/components/Color.js","integrity":"sha512-CIpjkISCLRK7haDtSugGFd0o3odaJts8ewJOkUiEFtns3xvsqbl8i24eowBnjw+yMDQVQyNONlhqTD58YC6Ljg==","packageShasum":"add1baced073a60157d39c7820b8d5c1928a1054","match":"svg-path-data","matchDetail":"The local SVG path d value matches the pinned Color component (1/1)."},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"@lobehub/icons@5.10.0 package/LICENSE","evidence":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz#package/LICENSE","independentlyVerified":true,"scope":"Pinned package distribution only; no trademark clearance."},"trademarkClearance":null,"evidenceNote":"All local SVG path data matches the pinned LobeHub Color component. This proves source provenance only, not trademark clearance."} +{"recordType":"asset","path":"public/providers/baidu.svg","mediaType":"image/svg+xml","sha256":"1059750a2069aec6080ff48732931e87a99bd3d22db3e8471cebe255b6014b75","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/bailian.svg","mediaType":"image/svg+xml","sha256":"240f4584c8ae0a32ec84ab53068abc6649881393e831af716c389e4825ac6779","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/bailian/default.svg","integrity":"sha256:240f4584c8ae0a32ec84ab53068abc6649881393e831af716c389e4825ac6779","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://bailian.console.aliyun.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/baseten.svg","mediaType":"image/svg+xml","sha256":"345e69ec97668ac946cdeb36cd47f39f82d9d0a9fb597325df21874881c6c95c","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/baseten/default.svg","integrity":"sha256:345e69ec97668ac946cdeb36cd47f39f82d9d0a9fb597325df21874881c6c95c","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://baseten.co"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/bazaarlink.svg","mediaType":"image/svg+xml","sha256":"9e16ff0a57ca5badc2e2fdcc3661b69ea4c5395c5cedc839d93ae670f043f9a8","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/blackbox-web.png","mediaType":"image/png","sha256":"ba3be1b3edff386b3a55bedb03e219d6cd497504ead4eae93a20d4172924af54","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/blackbox.png","mediaType":"image/png","sha256":"4f5f895b0b6a777f0ab75e9be328ca7c092be2625c89414a2d994d1255c6524f","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/bluesminds.svg","mediaType":"image/svg+xml","sha256":"669efe432349463f0753fc093e55181f91ac604a08ef23d354085c2ed439c9e4","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/brave-search.svg","mediaType":"image/svg+xml","sha256":"2530f80fdf2144b62f96953a81c6988c9c31a6cc7c9de72e069079485817cbe7","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/brave.svg","mediaType":"image/svg+xml","sha256":"2530f80fdf2144b62f96953a81c6988c9c31a6cc7c9de72e069079485817cbe7","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/byteplus.svg","mediaType":"image/svg+xml","sha256":"8fe36c991b3f5a4f7ab32d381f8685705894ee9167bd54def172065cc90e8667","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/bytez.svg","mediaType":"image/svg+xml","sha256":"64e352d06ecb3f5d4ecb64506eea82f6b1583118574dd203316b750e2737421b","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/cartesia.svg","mediaType":"image/svg+xml","sha256":"f9771f7cc47f6ead48cc82202fcf48343ca7c8d6acc112d2a810aa0719f37341","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/cerebras.svg","mediaType":"image/svg+xml","sha256":"b0f331de0f07ef52cd9078b7cd85a646b3363fbdafe8203a022a8ce01038d0d4","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/cerebras/default.svg","integrity":"sha256:b0f331de0f07ef52cd9078b7cd85a646b3363fbdafe8203a022a8ce01038d0d4","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://cerebras.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/charm-hyper.svg","mediaType":"image/svg+xml","sha256":"2203baaa2c92e3ba51ce1102a56d5252de464769f3a136e0e541dd770f6e0493","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/cheaperinference.svg","mediaType":"image/svg+xml","sha256":"ba0bc069c23635cec121631c00a83821c2b37a9c305047e1137c5ed91c206f04","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/chipotle.svg","mediaType":"image/svg+xml","sha256":"a6dbd58ac2709f911f72a5b3f7b213eefaf386e45ca57265bb5d846490b41802","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/chutes.svg","mediaType":"image/svg+xml","sha256":"0da85d29012d21825d7a23e9ed9733f1736fb4457aaa807ac1cbb6ccd50447e5","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/clarifai.svg","mediaType":"image/svg+xml","sha256":"329d129d742c7a98ddb9609d14fd5fa40ed6a6acb0df37f7df1ec6a625d7b3cf","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/claude-web.svg","mediaType":"image/svg+xml","sha256":"a3101f3047a119aa11825ad9369510f0c472428c8c52d420e31bc62db44a8364","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/claude.svg","mediaType":"image/svg+xml","sha256":"a3101f3047a119aa11825ad9369510f0c472428c8c52d420e31bc62db44a8364","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/cli-generic.svg","mediaType":"image/svg+xml","sha256":"7e84afa7786c12713ef24fae43636ac569238baa183f4f4cf447bfe8927abef2","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history describes a neutral terminal glyph, but no immutable authorship or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/cline.svg","mediaType":"image/svg+xml","sha256":"9ba76231c007d458b43d6ed104feff2e0e32299cef30e43f643f941ff92a7153","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/cline/default.svg","integrity":"sha256:9ba76231c007d458b43d6ed104feff2e0e32299cef30e43f643f941ff92a7153","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://cline.bot/assets/branding/logos/cline-wordmark-black.svg"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/cliproxyapi.png","mediaType":"image/png","sha256":"ec3768ec99fe47ac13e748720e85f67c7e05aa6794d619d13af50f5b8f8d1f21","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/cloudflare.svg","mediaType":"image/svg+xml","sha256":"a986a9eda9b111bb0e3745bb4453f3c7aad33b974367348d36b5c02719ae01a2","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/codex.svg","mediaType":"image/svg+xml","sha256":"4a2f43ce46b5b6e3722c95088f88d26ef91e6a8c2e598e70642a1c54367386e4","provenanceStatus":"proven","source":{"kind":"npm","url":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz","ref":"5.10.0","path":"package/es/Codex/components/Color.js","integrity":"sha512-CIpjkISCLRK7haDtSugGFd0o3odaJts8ewJOkUiEFtns3xvsqbl8i24eowBnjw+yMDQVQyNONlhqTD58YC6Ljg==","packageShasum":"add1baced073a60157d39c7820b8d5c1928a1054","match":"svg-path-data","matchDetail":"All 2/2 local SVG path d values match the pinned Color component."},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"@lobehub/icons@5.10.0 package/LICENSE","evidence":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz#package/LICENSE","independentlyVerified":true,"scope":"Pinned package distribution only; no trademark clearance."},"trademarkClearance":null,"evidenceNote":"All local SVG path data matches the pinned LobeHub Color component. This proves source provenance only, not trademark clearance."} +{"recordType":"asset","path":"public/providers/cohere.svg","mediaType":"image/svg+xml","sha256":"f6aa4ebde660951b60e9f3438bbf82f48d7e64ddcd1707a672b92ba57626a024","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/comfyui.svg","mediaType":"image/svg+xml","sha256":"0867b6df03d94ac9240993abb8f7636e4d1254aa8a0cb69fe3c29be1d30fbdcf","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/comfyui/default.svg","integrity":"sha256:0867b6df03d94ac9240993abb8f7636e4d1254aa8a0cb69fe3c29be1d30fbdcf","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://comfy.org"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/command-code.svg","mediaType":"image/svg+xml","sha256":"7137a48d8522ee555dde47166edc3b36f1078a8952e77943df037648f6b5b571","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/continue.svg","mediaType":"image/svg+xml","sha256":"c289d46ef6901c5fa9f4968e314d209af4d3bb774b9f390d7aeb4a5290b9ed2b","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/continue/default.svg","integrity":"sha256:c289d46ef6901c5fa9f4968e314d209af4d3bb774b9f390d7aeb4a5290b9ed2b","match":"byte-exact"},"upstreamLicenseClaim":{"value":"Apache-2.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://continue.dev"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/copilot.svg","mediaType":"image/svg+xml","sha256":"04f15d0556fbac10a4e0f82d1560610db8b33cd04780a4f24ad3b91c4abd278d","provenanceStatus":"proven","source":{"kind":"npm","url":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz","ref":"5.10.0","path":"package/es/Copilot/components/Color.js","integrity":"sha512-CIpjkISCLRK7haDtSugGFd0o3odaJts8ewJOkUiEFtns3xvsqbl8i24eowBnjw+yMDQVQyNONlhqTD58YC6Ljg==","packageShasum":"add1baced073a60157d39c7820b8d5c1928a1054","match":"svg-path-data","matchDetail":"All 6/6 local SVG path d values match the pinned Color component."},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"@lobehub/icons@5.10.0 package/LICENSE","evidence":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz#package/LICENSE","independentlyVerified":true,"scope":"Pinned package distribution only; no trademark clearance."},"trademarkClearance":null,"evidenceNote":"All local SVG path data matches the pinned LobeHub Color component. This proves source provenance only, not trademark clearance."} +{"recordType":"asset","path":"public/providers/coze.svg","mediaType":"image/svg+xml","sha256":"6e941b56746e9c58e9b3ec9734f92384462bec857fff7234abb671b0aa81a5e6","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/crof.svg","mediaType":"image/svg+xml","sha256":"10287dca3f0efca484d917a6abb8b3b1b7cb9458127522dedd1df3095df792bf","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/cursor.svg","mediaType":"image/svg+xml","sha256":"cd0e3e5d8991a4cdd4577f8896cd063105207665165c73e25a1ff918dd367eb7","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/cursor/default.svg","integrity":"sha256:cd0e3e5d8991a4cdd4577f8896cd063105207665165c73e25a1ff918dd367eb7","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://www.cursor.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/dahl.png","mediaType":"image/png","sha256":"f89396a077cd4118157fca8d983ff31397baabe6531d03c4e7fd3bc3a7342982","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/deepgram.svg","mediaType":"image/svg+xml","sha256":"391f7d32e87f97489a3f409fc80a38bc8ef592617070e735055bfaa2c6e6f711","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/deepgram/default.svg","integrity":"sha256:391f7d32e87f97489a3f409fc80a38bc8ef592617070e735055bfaa2c6e6f711","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://deepgram.com/company/newsroom"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/deepinfra.svg","mediaType":"image/svg+xml","sha256":"e2daddb98348277845a52a78bf1b04d33d333aaaf06fd641b020f26e5a0669ee","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/deepinfra/default.svg","integrity":"sha256:e2daddb98348277845a52a78bf1b04d33d333aaaf06fd641b020f26e5a0669ee","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://deepinfra.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/deepseek.svg","mediaType":"image/svg+xml","sha256":"2ac9f2281f078ffd2857c050b7828fe5eb49a69bdcea65da3839fdc46af70335","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/dgrid.svg","mediaType":"image/svg+xml","sha256":"7b55bc9f408193c2a6e9967b33ef1e17522194341a4f51c54025ec7c68afb5a6","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/dify.svg","mediaType":"image/svg+xml","sha256":"6c1704b6f14eb995d010549847b733dbbc54af66974a2bc62623fbdad4981c66","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/digitalocean.svg","mediaType":"image/svg+xml","sha256":"095e5839f856cc930d8cf33c619470480dddbf785b930cd4c20a360347effdce","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/dit.svg","mediaType":"image/svg+xml","sha256":"2df81e2ba3401ed8024b01dd1f11704744574e5333dbf0ef0a5c1898e9be6f93","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/docker-model-runner.svg","mediaType":"image/svg+xml","sha256":"d516c4eda88941f8816786d310624e42a40941712c9801abe2a918d1a6fdcbc7","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/doubao.svg","mediaType":"image/svg+xml","sha256":"3cd31ba03ae44b8c29561597a3b863809efecb13fcdfd08407a086df86a69b55","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/droid.svg","mediaType":"image/svg+xml","sha256":"96290a3c012904a4796e51629ef72ff20fddc6a24d1a21fece96f17c0439e062","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/duckduckgo-web.svg","mediaType":"image/svg+xml","sha256":"83fde60229cb98fd381a1b0f01e7330ac74bcd50cbaf43db5d2e3004a3eeab84","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/elevenlabs.svg","mediaType":"image/svg+xml","sha256":"24e2fe318bc1ed54a29ceb867e4ecead952355cda4241b07402d1ff6510dc133","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/elevenlabs/default.svg","integrity":"sha256:24e2fe318bc1ed54a29ceb867e4ecead952355cda4241b07402d1ff6510dc133","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://elevenlabs.io/brand"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/empower.png","mediaType":"image/png","sha256":"ea0dbf43dbbcc8d6ea22681a95ca694f2ba7797ce5a8abdfced3f73eb1b0a72a","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/exa.svg","mediaType":"image/svg+xml","sha256":"2ccd7ec05fa43dbfcfa7d0df1810f07978edb82afca3b2cb83a9393aa2e33ee8","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/exa/default.svg","integrity":"sha256:2ccd7ec05fa43dbfcfa7d0df1810f07978edb82afca3b2cb83a9393aa2e33ee8","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://exa.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/factory.svg","mediaType":"image/svg+xml","sha256":"472057d6a04afc32a23af1e90ce318491dee2f3fc03ab3e6b6c06d254c419253","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/fal.svg","mediaType":"image/svg+xml","sha256":"5214ae1cf705b0ce4c155f03efadca2b16685586fc46a237910610b920a46e2f","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/fal/default.svg","integrity":"sha256:5214ae1cf705b0ce4c155f03efadca2b16685586fc46a237910610b920a46e2f","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://fal.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/fireworks.svg","mediaType":"image/svg+xml","sha256":"1df32a350d032f6d8a0860271473c10ae5d9d97273f3f8402c454e7feb33a626","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/fireworks/default.svg","integrity":"sha256:1df32a350d032f6d8a0860271473c10ae5d9d97273f3f8402c454e7feb33a626","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://fireworks.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/freeaiapikey.svg","mediaType":"image/svg+xml","sha256":"36dac65bf68ce787c222d342fa497e2c1c2e051ca011befa4e3d27f6e9dd3b0d","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/freebuff-dark.svg","mediaType":"image/svg+xml","sha256":"4d48a1405c68b00121fa7100e080025fa3e9e090c59055b56e4ad0aee1a7de7f","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/freebuff-light.svg","mediaType":"image/svg+xml","sha256":"4d48a1405c68b00121fa7100e080025fa3e9e090c59055b56e4ad0aee1a7de7f","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/freebuff.png","mediaType":"image/png","sha256":"ef3ddde4bbda499f6d9e04139bfef9a9eac310244d8b5215da7c075806388011","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/freebuff.svg","mediaType":"image/svg+xml","sha256":"4d48a1405c68b00121fa7100e080025fa3e9e090c59055b56e4ad0aee1a7de7f","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/freemodel-dev.svg","mediaType":"image/svg+xml","sha256":"492311bb580cb397a8ba245fcd7585912bc3e3ffc09c2e0a6a245319c6005c77","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/friendli.svg","mediaType":"image/svg+xml","sha256":"2c39f9cfb3cb37dd96c72972495341b6e5dc5077a49566a232a692428a39aefa","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/friendli/default.svg","integrity":"sha256:2c39f9cfb3cb37dd96c72972495341b6e5dc5077a49566a232a692428a39aefa","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://friendli.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/galadriel.svg","mediaType":"image/svg+xml","sha256":"c515553cb07a098a9e494fc139954deb19abd97ed9a0fa212005d3fb1c0ad31d","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/gemini.svg","mediaType":"image/svg+xml","sha256":"c11d94a9e3ecb32f67dd9350848cf3124d617680533275c672e1e6bf61ce8cd4","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/gemini/default.svg","integrity":"sha256:c11d94a9e3ecb32f67dd9350848cf3124d617680533275c672e1e6bf61ce8cd4","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://gemini.google.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/gigachat.png","mediaType":"image/jpeg","sha256":"e541f8a2537150bec9c1f09ed4e850205af6f553a31207c95372af3ba1f9d3a9","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/gitlab-duo.svg","mediaType":"image/svg+xml","sha256":"67413dbdc9be21ca995ad318234e5463af1262668b4a203da72388e22ef3ac40","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/gitlab.svg","mediaType":"image/svg+xml","sha256":"67413dbdc9be21ca995ad318234e5463af1262668b4a203da72388e22ef3ac40","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/gitlawb-gmi.svg","mediaType":"image/svg+xml","sha256":"7e79329c67b011fece39606151f500720ff6017bc2c2cb2ca8a841a453fb14ef","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/gitlawb.svg","mediaType":"image/svg+xml","sha256":"4f8a7ba91c2db0383bbab00c80d45919de1394337e83269396afedad1c957a15","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/google.svg","mediaType":"image/svg+xml","sha256":"fb800918b0b68f12d7a143cb3f51316e478697daa662e7c3d03621f15a4d1d73","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/grok.svg","mediaType":"image/svg+xml","sha256":"b20648e2f111d7fbc91f58b22d1e76e9885b68a163cb5a1010f7f11bf5840491","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/grok/default.svg","integrity":"sha256:b20648e2f111d7fbc91f58b22d1e76e9885b68a163cb5a1010f7f11bf5840491","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://grok.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/groq.svg","mediaType":"image/svg+xml","sha256":"f8b4420340ff8875a1f04ce80909325dd81b0cb78d0c7a15fd567977338ae956","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/groq/default.svg","integrity":"sha256:f8b4420340ff8875a1f04ce80909325dd81b0cb78d0c7a15fd567977338ae956","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://groq.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/haiper.svg","mediaType":"image/svg+xml","sha256":"961d91a3cbcf20372128a5e2a12f568ff8fb5b09cd6d63e5b85fe2e8f5e47c48","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/hcnsec.svg","mediaType":"image/svg+xml","sha256":"ea059057d9f92f7ad8ee0fea634812ff31e454924043f26009f6c1f58db58146","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/heroku.svg","mediaType":"image/svg+xml","sha256":"eed8d3cb106c7d1047cbf85d974011911c46aed78616dc748133fe6b7740ee33","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/heroku/default.svg","integrity":"sha256:eed8d3cb106c7d1047cbf85d974011911c46aed78616dc748133fe6b7740ee33","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://www.heroku.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/huggingchat.svg","mediaType":"image/svg+xml","sha256":"5d39d66bb6c9b026d3cb5de7bd9978dad3906570df2aca8f00078a6f8a3d0f5e","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/huggingface.svg","mediaType":"image/svg+xml","sha256":"596c7b0e1fb7598c0b178276bfba4a33022e9e285461db42c5903b07375f81fa","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/huggingface/default.svg","integrity":"sha256:596c7b0e1fb7598c0b178276bfba4a33022e9e285461db42c5903b07375f81fa","match":"byte-exact"},"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source, but that registry ref has no license metadata for this slug. No legal clearance is inferred."} +{"recordType":"asset","path":"public/providers/hyperbolic.svg","mediaType":"image/svg+xml","sha256":"f61f429451497ffc5d03e3e4dfc09f79ac067d848336a048e0a373aa5299990a","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/hyperbolic/default.svg","integrity":"sha256:f61f429451497ffc5d03e3e4dfc09f79ac067d848336a048e0a373aa5299990a","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://hyperbolic.xyz"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/ibm.svg","mediaType":"image/svg+xml","sha256":"b68f2d7e0cb1e0a7c09a54574402528be3b00bfdd4bb7710e85aec7a50efb6f2","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/ibm/default.svg","integrity":"sha256:b68f2d7e0cb1e0a7c09a54574402528be3b00bfdd4bb7710e85aec7a50efb6f2","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://www.ibm.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/ideogram.svg","mediaType":"image/svg+xml","sha256":"bbccfb17aaf068aeebdfd598b4130f0992feea075f553015be82f086b9ff68ad","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/iflytek.svg","mediaType":"image/svg+xml","sha256":"0012c7c24cf8d987a9e2fd17e9b555ff8082e4a7369b3e57dc0a827146bb0868","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/inclusionai.svg","mediaType":"image/svg+xml","sha256":"5f400bfb76593c16907eecc95fa875e3d0751ba49b32c6c10d7c07744d5d1ba0","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/inference.svg","mediaType":"image/svg+xml","sha256":"f3f44ad6cb293023d7df21dd38109377197503df52b1baeb2f51556a6d52873b","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/inference/default.svg","integrity":"sha256:f3f44ad6cb293023d7df21dd38109377197503df52b1baeb2f51556a6d52873b","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://inference.net"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/inner-ai.png","mediaType":"image/png","sha256":"fbc0bf77452b6b705c788aeef0c396d8cafe32a5e7143f9fcb3030ce221b9ebc","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/inworld.svg","mediaType":"image/svg+xml","sha256":"04d63fe0089ba50aaa98a5e77f6970ff8cfa8aa807f51c38967170879762f9ed","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/ironclaw.png","mediaType":"image/png","sha256":"af3a8075083264332fc8a3d5b0d4f936716753738e57f3b63e9c81f16bb83171","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/kenari.svg","mediaType":"image/svg+xml","sha256":"d5c66cc423f69cbd326c1b4612e343d97278ec0cc1bcdfc39a23e074ac06420c","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/kie.png","mediaType":"image/png","sha256":"c1854980b86614a6539341cf38bb1f83ddcda1ce11e3718543d3a8562973f6a7","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/kilo-gateway.svg","mediaType":"image/svg+xml","sha256":"0bf05e2f9c1355e8a1d020c07f433ea725f1270607f04b83c398d44914ebe422","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/kilocode.svg","mediaType":"image/svg+xml","sha256":"0bf05e2f9c1355e8a1d020c07f433ea725f1270607f04b83c398d44914ebe422","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/kimi-logomark-dark.svg","mediaType":"image/svg+xml","sha256":"e15425da3274436f2203cfe532e8194965cbc2602c49baf60e320fe3c6f76b08","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #8039 describes official partnership logomarks, but no immutable asset URL or explicit rights grant is recorded."} +{"recordType":"asset","path":"public/providers/kimi-logomark-light.svg","mediaType":"image/svg+xml","sha256":"dbb37a7a98d6661516c35229376b9bfd22d3d802a559aeebca274d7ad7140be8","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #8039 describes official partnership logomarks, but no immutable asset URL or explicit rights grant is recorded."} +{"recordType":"asset","path":"public/providers/kimi.svg","mediaType":"image/svg+xml","sha256":"193be48cd5306bf67ab3bc349e8fba9bfdeae85b3a52ffa86fd145ed2ff23f0e","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/kiro.svg","mediaType":"image/svg+xml","sha256":"4eae4d6e818da7342c32c7d443ab7c97b93c544db9af379d5b5bf7f0a3127d66","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/krutrim.svg","mediaType":"image/svg+xml","sha256":"7ab68a187354ea58039e5d9129886e063b9fa21af4e3875bb395e8eba727808b","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/lambda.svg","mediaType":"image/svg+xml","sha256":"5749cb1b812858dca0c85233e9b1400d67dfbdd47c5ddea5ec70e1b47538799d","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/lambda/default.svg","integrity":"sha256:5749cb1b812858dca0c85233e9b1400d67dfbdd47c5ddea5ec70e1b47538799d","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://lambdalabs.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/lemonade.png","mediaType":"image/png","sha256":"e7717e379558213ec9675dac8c07cd74ed62b485259b02e76359a8489885f30a","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/leonardo.svg","mediaType":"image/svg+xml","sha256":"5269781259061dae191cde70884e3a108c215d8c530e7b1458d9d7dc1b698243","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/letta.png","mediaType":"image/png","sha256":"f3f47bce18599153df5b8a683172f9fc644f343da3ba2d8416d791c3b2941e57","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/linkup-search.png","mediaType":"image/png","sha256":"ba30bce9eb7e7eac2669df05174d64215a584022e86fd7c1a3cea06bd242e384","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/liquid.svg","mediaType":"image/svg+xml","sha256":"a09beaff7addad17c5a55add836aabb95acfe3147055a9d9a38000ce076e153c","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/llamafile.png","mediaType":"image/png","sha256":"dba51fea70faacb3dc985dbc33142a459e74c983222a818375ca455c0dd2e300","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/llamagate.png","mediaType":"image/jpeg","sha256":"255510f8d30b26bee7618c5524e1c3b27524cc9594eb70e0500c05c0ac5cf75c","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/llm7.svg","mediaType":"image/svg+xml","sha256":"0b763a74f152dbaea9d55171bedad9614259ac1979feeb8452a7f09dfa402e32","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/logfare.png","mediaType":"image/png","sha256":"f08afcdb0e3886de6f9433dccfd915a14006a554f01f2f6cf4064d9f4fffd6ec","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/longcat.svg","mediaType":"image/svg+xml","sha256":"73e6838c126557998803a3c864ceb8ac6982597fa680fa139ff942d456c23687","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/longcat/default.svg","integrity":"sha256:73e6838c126557998803a3c864ceb8ac6982597fa680fa139ff942d456c23687","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://longcat.chat/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/maritalk.png","mediaType":"image/png","sha256":"61cf3c66581e4b2c356b3ca37e056efb4cf2bcefd5560f0f7a7613ce6c2744e0","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/meta.svg","mediaType":"image/svg+xml","sha256":"f983ce7206fa1a889255f47b4a70bd13ddcbb01e8cefb4f2d0f98638f6d5d500","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/metaai.svg","mediaType":"image/svg+xml","sha256":"a7b52cfde49434eab56dfaf8550633fe2200885d7fe9880f0ddac49ecef71393","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/minimax.svg","mediaType":"image/svg+xml","sha256":"e514235f472e335f8bb0094ddcc2762b7e38e0dca66225893294457081cc6abf","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/minimax/default.svg","integrity":"sha256:e514235f472e335f8bb0094ddcc2762b7e38e0dca66225893294457081cc6abf","match":"byte-exact"},"upstreamLicenseClaim":{"value":"Custom","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://github.com/MiniMax-AI/MiniMax-01/blob/57cf223b177e99636c7711a0f179e9fdc9c38e8a/figures/minimax.svg"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/mistral.svg","mediaType":"image/svg+xml","sha256":"a21838f4a3714b9f537bd849de4848dca712778517bfc4177621cc58b3050006","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/mistral/default.svg","integrity":"sha256:a21838f4a3714b9f537bd849de4848dca712778517bfc4177621cc58b3050006","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://mistral.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/modal.svg","mediaType":"image/svg+xml","sha256":"650307e51a2972207ac3f480db2c6326f08b21978b9fcfed4a383997a6da3575","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/modelscope.svg","mediaType":"image/svg+xml","sha256":"abf2eed2273769c447af57bcbb0b13e23c23fac97182664b31c5cf67c8cb321e","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/monsterapi.svg","mediaType":"image/svg+xml","sha256":"463d672cbb1caa930d50457c4f4c0319a67305b03d45328eef4c3c00ce451da7","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/moonshot.svg","mediaType":"image/svg+xml","sha256":"a6ac95d972fdb044cd4155b0f75d9c1c816348868c810f63c7e5c8840c9e3e12","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/moonshot/default.svg","integrity":"sha256:a6ac95d972fdb044cd4155b0f75d9c1c816348868c810f63c7e5c8840c9e3e12","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://moonshot.cn"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/morph.svg","mediaType":"image/svg+xml","sha256":"0fdb479e13c5d5de15aa89d1f87c8d55f8f8a56d33fc5dee8c566d2e0dbd5b96","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/morph/default.svg","integrity":"sha256:0fdb479e13c5d5de15aa89d1f87c8d55f8f8a56d33fc5dee8c566d2e0dbd5b96","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://morphllm.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/nanobot.png","mediaType":"image/png","sha256":"5ddd4b100b012b9f48f29e5f8e2d254ffb802f73afb34617f86005c2d1f343a6","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/nanogpt.png","mediaType":"image/png","sha256":"38cef0646e02d8b98da4577e2c83950cb77e4f12b217b83d0b543d2dae37a4b5","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/nebius.svg","mediaType":"image/svg+xml","sha256":"fb190b4efb1d143442ef6c5eb0258801fc27b7316e88216c59a0f4b58b8b0281","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/nebius/default.svg","integrity":"sha256:fb190b4efb1d143442ef6c5eb0258801fc27b7316e88216c59a0f4b58b8b0281","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://nebius.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/nlpcloud.svg","mediaType":"image/svg+xml","sha256":"ace1d772d2a7d6fa10ecf76f45af550c9c9a6f96ce1783f398472ba46fe79f85","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/nomic.svg","mediaType":"image/svg+xml","sha256":"73cc513c9d5f460ec8f00a097f3fabaa54c0e1f824944412e9a4461c0620fba6","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/novita.svg","mediaType":"image/svg+xml","sha256":"ab99ef3113a12e64ef8b44eda132094017359ede5bdb33e830ed855b69520612","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/novita/default.svg","integrity":"sha256:ab99ef3113a12e64ef8b44eda132094017359ede5bdb33e830ed855b69520612","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://novita.ai/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/nscale.png","mediaType":"image/png","sha256":"6a8b22c12696fe55048793b251921c7c19673cc17dce76cad27bd4f11085adf8","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/nube.svg","mediaType":"image/svg+xml","sha256":"e5eff793cbc8a917e499c18365979f001010b229dd53b0802d5f29d9dfb963e1","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/nvidia.svg","mediaType":"image/svg+xml","sha256":"c0ba24515aa21f07119e15914abbde64dd17b42fd95518a15df208a615c3810e","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/nvidia/default.svg","integrity":"sha256:c0ba24515aa21f07119e15914abbde64dd17b42fd95518a15df208a615c3810e","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://www.nvidia.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/oai-cc.png","mediaType":"image/png","sha256":"ad7f82ac767381117a6eee9102184611fd9b930c8f5e1ed60381872482137eb9","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/oai-r.png","mediaType":"image/png","sha256":"6d8111fb61596d0d445f869d40f82eb115ee19c5d6e8c56ba88ce40a96ef3398","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/oauth.svg","mediaType":"image/svg+xml","sha256":"661c74f5381a85ebc04edb7bae8fffbf1610a248d4389b8c2745191065fa6c88","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/oci.svg","mediaType":"image/svg+xml","sha256":"c4886bba91144a634b646343911da7801524e1c7118b1542172483bddeaa83ad","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/ollama.svg","mediaType":"image/svg+xml","sha256":"04d95aa0e2cccdd24f8f6c9c58ac2f312464d0f8280a6744fdd48b28b15aebab","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/ollama/default.svg","integrity":"sha256:04d95aa0e2cccdd24f8f6c9c58ac2f312464d0f8280a6744fdd48b28b15aebab","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://www.ollama.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/omp.png","mediaType":"image/png","sha256":"1e67ede0be3373c6fdfe32be6d0704692db368010fa05d8cf5de8064071c4977","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/openadapter.svg","mediaType":"image/svg+xml","sha256":"dd55136c854f36a2ffe93062e5296ac77f3d4b753f7106cf832212f87f81c408","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/openai.svg","mediaType":"image/svg+xml","sha256":"db81a8225166f02f773304ba4d8f0141343da5f43870d8b41f10bf6bc59840c8","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/openai/default.svg","integrity":"sha256:db81a8225166f02f773304ba4d8f0141343da5f43870d8b41f10bf6bc59840c8","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://openai.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/openclaw.svg","mediaType":"image/svg+xml","sha256":"4123c0c75dda5b28e3e0d38075514085bf546178a620776344813c08fa41277c","provenanceStatus":"proven","source":{"kind":"npm","url":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz","ref":"5.10.0","path":"package/es/OpenClaw/components/Color.js","integrity":"sha512-CIpjkISCLRK7haDtSugGFd0o3odaJts8ewJOkUiEFtns3xvsqbl8i24eowBnjw+yMDQVQyNONlhqTD58YC6Ljg==","packageShasum":"add1baced073a60157d39c7820b8d5c1928a1054","match":"svg-path-data","matchDetail":"All 6/6 local SVG path d values match the pinned Color component."},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"@lobehub/icons@5.10.0 package/LICENSE","evidence":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz#package/LICENSE","independentlyVerified":true,"scope":"Pinned package distribution only; no trademark clearance."},"trademarkClearance":null,"evidenceNote":"All local SVG path data matches the pinned LobeHub Color component. This proves source provenance only, not trademark clearance."} +{"recordType":"asset","path":"public/providers/opencode-dark.svg","mediaType":"image/svg+xml","sha256":"4e84f87aa7bc2a5f8a72eeb08d3d4f1836b422189256d0bd5e7bfabc830d7ed0","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/opencode-light.svg","mediaType":"image/svg+xml","sha256":"5eeb3a5f14dbbccc03111296ecfd3cd05cc98844150d4f9d77ba921847953380","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/opencode.svg","mediaType":"image/svg+xml","sha256":"231e3f47f332a0ace170bae2605488ac016cc85e584d89b1f9f9f0dff47170ee","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/openference.svg","mediaType":"image/svg+xml","sha256":"c70cc7e1a0e2e14b5e42d53a2b4432218e223d520fcfdf7da592352283a91851","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/openrouter.svg","mediaType":"image/svg+xml","sha256":"d05021526e72fddf3426eabc066924aca83da0cd66a699a3de3bac58ed2fe0a2","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/openrouter/default.svg","integrity":"sha256:d05021526e72fddf3426eabc066924aca83da0cd66a699a3de3bac58ed2fe0a2","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://openrouter.ai/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/openvecta.svg","mediaType":"image/svg+xml","sha256":"97f49e7096ef502e8c498011989e467294a5b997707beea4455e0cc1160cb89c","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/orcarouter.svg","mediaType":"image/svg+xml","sha256":"06b36d030492901cada4c1e757b613c3ada340727d74f601fe407cfad7b529cf","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/ovhcloud.svg","mediaType":"image/svg+xml","sha256":"ab65efec83d5106fa649e1f3ec5db98beb20ec6708158362844c912c34e1d31a","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/ovhcloud/default.svg","integrity":"sha256:ab65efec83d5106fa649e1f3ec5db98beb20ec6708158362844c912c34e1d31a","match":"byte-exact"},"upstreamLicenseClaim":{"value":"brand-use","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://ovhcloud.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/perplexity.svg","mediaType":"image/svg+xml","sha256":"c7a4c847b6b3c0e8a10868d35b0b4a89727c03f8db3394060dcdb33c4b21c83b","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/phind.svg","mediaType":"image/svg+xml","sha256":"d22bfa86c189016aad4a8f2fa115549f33af825b5be91c31f5566c672009cf01","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/piapi.png","mediaType":"image/png","sha256":"6f3d64217aa149098db84d4a5c5608918781cf864947275aae51e3f5ab6ccfca","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/picoclaw.jpg","mediaType":"image/jpeg","sha256":"f2274cc93345c8218f574f6c51a26f624a56ecc2b6f909d5b7e0c3d7d4f49c92","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/picoclaw.svg","mediaType":"image/svg+xml","sha256":"a4efdede50ec1d327f83bc61d2e811ac9b245f1b8c82aff45fd3fac299bc6a57","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/picoclaw/default.svg","integrity":"sha256:a4efdede50ec1d327f83bc61d2e811ac9b245f1b8c82aff45fd3fac299bc6a57","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://picoclaw.io"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/pioneer.svg","mediaType":"image/svg+xml","sha256":"d30adb4ffa16988af01f49682ca0c849dca173efa8d894053e3628449247d44a","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/playht.svg","mediaType":"image/svg+xml","sha256":"ec4a7bf38b10c1ea045237f2c7b01f3781a7c9c00ac2d79d6a7b3ad5841485fe","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/poe.svg","mediaType":"image/svg+xml","sha256":"5e50e10d6ef231593fc406b0d78bea24f8266e2555cab47a8bbbb88e42d31797","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/poe/default.svg","integrity":"sha256:5e50e10d6ef231593fc406b0d78bea24f8266e2555cab47a8bbbb88e42d31797","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://poe.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/pollinations.svg","mediaType":"image/svg+xml","sha256":"49011d5b329349754c7722571ae0d9d384ea32331e22c0fb6a9a2d1a22862346","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/pollinations/default.svg","integrity":"sha256:49011d5b329349754c7722571ae0d9d384ea32331e22c0fb6a9a2d1a22862346","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://pollinations.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/poolside.svg","mediaType":"image/svg+xml","sha256":"1bf4dfc87c887b8abc93eb7df5faa0588139a89052c7d3fa25abcf8bd259a223","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/predibase.png","mediaType":"image/png","sha256":"70c8d3b98500d2f3a169771cfd53e2cc65b2b7152fa11cae342c8d3fe1d4c8e4","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/publicai.svg","mediaType":"image/svg+xml","sha256":"6553a9acf2e8cbe8cc2253ddd589d8132dc81c5301013a9ca94d2661f0d6e46f","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/qianfan.svg","mediaType":"image/svg+xml","sha256":"a6fb89080675ae00a4a240b7aa50dae31c80e67b24bfa2dc08f2c98277f2a0a7","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/qiniu.svg","mediaType":"image/svg+xml","sha256":"f92a36faea7b76b8e708f3866ccb315011f0f91dd486868546dfe8523199a728","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/qwen.svg","mediaType":"image/svg+xml","sha256":"1729febe65990585b1ba96c223143f108f709f722c1d354238fd470630b51f54","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/qwen/default.svg","integrity":"sha256:1729febe65990585b1ba96c223143f108f709f722c1d354238fd470630b51f54","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://chat.qwenlm.ai/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/qwencloud.svg","mediaType":"image/svg+xml","sha256":"84ae1a3822a67a9281c3f19221f046fb4fe7f8dcd5ec71bb2470503a8dcfa086","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/recraft.svg","mediaType":"image/svg+xml","sha256":"1fab4aeaf66fc3f9ffdc08bc2e13d9f99335e246e5be2877fae5801045ff4ce6","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/recraft/default.svg","integrity":"sha256:1fab4aeaf66fc3f9ffdc08bc2e13d9f99335e246e5be2877fae5801045ff4ce6","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://recraft.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/reka.png","mediaType":"image/jpeg","sha256":"6881acff8cd7b2dc92bbe90066f549114e6d4066ffc4c43ac84cb69402834aca","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/replicate.svg","mediaType":"image/svg+xml","sha256":"3a1a39f81c20c507bb84b105d022f5c3af35c1f561005493b1c654bcf356f3a5","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/replicate/default.svg","integrity":"sha256:3a1a39f81c20c507bb84b105d022f5c3af35c1f561005493b1c654bcf356f3a5","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://replicate.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/requesty.svg","mediaType":"image/svg+xml","sha256":"edaf34203dd8c575b460435e01eabbc764c80724bfb5d9891420329949d7008e","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/roocode.svg","mediaType":"image/svg+xml","sha256":"6f3f1767bbe13ec049aa179689d66354fc2ec8c8ffb083eeab56b6730d3f92e4","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/roocode/default.svg","integrity":"sha256:6f3f1767bbe13ec049aa179689d66354fc2ec8c8ffb083eeab56b6730d3f92e4","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://roocode.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/runway.svg","mediaType":"image/svg+xml","sha256":"ef0fbd9493bef73b1db7d69910078fbc90024780e4e326d33107983ebd66a4e0","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/runway/default.svg","integrity":"sha256:ef0fbd9493bef73b1db7d69910078fbc90024780e4e326d33107983ebd66a4e0","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://runwayml.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/sambanova.svg","mediaType":"image/svg+xml","sha256":"1eae1179dbeb2a31edcabeca5f2c9d593bb1255aa8354e784be60a94dd850aa9","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/sambanova/default.svg","integrity":"sha256:1eae1179dbeb2a31edcabeca5f2c9d593bb1255aa8354e784be60a94dd850aa9","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://sambanova.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/sap.svg","mediaType":"image/svg+xml","sha256":"99df1825ec8254f712794c8e980d844967427d6720855ebad02ec6803df04374","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/scaleway.svg","mediaType":"image/svg+xml","sha256":"4fc81081bd54878b20e05c9344f34d9e77df4a8f37844f4e29a7cfe99eaeea76","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/searchapi.svg","mediaType":"image/svg+xml","sha256":"124f551340b92a8493faeddce914d7034377ab1d0364c5b4285ecc940e80a2c1","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/searchapi/default.svg","integrity":"sha256:124f551340b92a8493faeddce914d7034377ab1d0364c5b4285ecc940e80a2c1","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://searchapi.io"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/searxng-search.svg","mediaType":"image/svg+xml","sha256":"7e40327a9ce25056fd73712b2ea0bd57490bbb86ce7330cacac893c13e7adbcf","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/sensenova.svg","mediaType":"image/svg+xml","sha256":"bd2e0f8e310ff6a5edcc56a85560221923262767ba76b660a193f45c40c123fa","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/serper-search.svg","mediaType":"image/svg+xml","sha256":"b417fbf30fe71bac4350b0e18d91bd0917c732257a74b50a0cc59b2984b9c0dd","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/snowflake.svg","mediaType":"image/svg+xml","sha256":"262b832658b821a8ff2eb0c536b5deb151dca0915f780f10161e3b2d219abe63","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/soniox.svg","mediaType":"image/svg+xml","sha256":"92b81993f7fd72b17b957d13e6b49a19d75f7668230a6cf9ef0d4975d6e825db","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/sparkdesk.svg","mediaType":"image/svg+xml","sha256":"e597fc689ea06a6a23166ff769fac8a6839535a9b626565913d87989c724b559","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/stepfun.svg","mediaType":"image/svg+xml","sha256":"f55afc0e6004c8854f76bd5bbcc0fce9fc0ed9316691d54fb02d088c24fab40d","provenanceStatus":"proven","source":{"kind":"npm","url":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz","ref":"5.10.0","path":"package/es/Stepfun/components/Color.js","integrity":"sha512-CIpjkISCLRK7haDtSugGFd0o3odaJts8ewJOkUiEFtns3xvsqbl8i24eowBnjw+yMDQVQyNONlhqTD58YC6Ljg==","packageShasum":"add1baced073a60157d39c7820b8d5c1928a1054","match":"svg-path-data","matchDetail":"The local SVG path d value matches the pinned Color component (1/1)."},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"@lobehub/icons@5.10.0 package/LICENSE","evidence":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz#package/LICENSE","independentlyVerified":true,"scope":"Pinned package distribution only; no trademark clearance."},"trademarkClearance":null,"evidenceNote":"All local SVG path data matches the pinned LobeHub Color component. This proves source provenance only, not trademark clearance."} +{"recordType":"asset","path":"public/providers/sumopod.svg","mediaType":"image/svg+xml","sha256":"a0a903dbb021049a6faa62c757d18abbb192d4a26a4352e459a9e462facee42f","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/suno.svg","mediaType":"image/svg+xml","sha256":"03bd7a6888d7ba010c616ae6402c222683d7f909eddb028241220f227ff6d1a6","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/suno/default.svg","integrity":"sha256:03bd7a6888d7ba010c616ae6402c222683d7f909eddb028241220f227ff6d1a6","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://suno.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/synthetic.svg","mediaType":"image/svg+xml","sha256":"c6db0e026416fdee7376185ce6cbeda05b1afdc74bdd2ee8f5d158767aa5ce4b","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/t3-web.svg","mediaType":"image/svg+xml","sha256":"776c95beab6f441754bac9911cc6669ffdf6631f76661a659ee69de2af053a06","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/tavily.svg","mediaType":"image/svg+xml","sha256":"80dddf9848f8761a2552c10ad0b60e4d11ad399f6ae014a8b43af6150456aa1a","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/tavily/default.svg","integrity":"sha256:80dddf9848f8761a2552c10ad0b60e4d11ad399f6ae014a8b43af6150456aa1a","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://tavily.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/tencent.svg","mediaType":"image/svg+xml","sha256":"7c370ad4b75e3f30d0fa7da71f90466a0ee95a887189479aa9df414079b50eb6","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/theoldllm.svg","mediaType":"image/svg+xml","sha256":"41214483e28c7464d44ade68c29d05ec9eb5f9413a7df8a30ed2e2ff6bb171c5","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/tokenrouter.svg","mediaType":"image/svg+xml","sha256":"a9613d5a485878613e50300a5d675c456fd551ca37c978522342a4d2d0313a21","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/topazlabs.svg","mediaType":"image/svg+xml","sha256":"93b23f19b6c9ef2f5edc88205318dbd908d8071435fc971cef5f05dd13b97450","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/topazlabs/default.svg","integrity":"sha256:93b23f19b6c9ef2f5edc88205318dbd908d8071435fc971cef5f05dd13b97450","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://topazlabs.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/trae.svg","mediaType":"image/svg+xml","sha256":"1445a2fa3fba86fe876175e23ddb0bc8dbfa889971628bc451d5d2f53f974703","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/trae/default.svg","integrity":"sha256:1445a2fa3fba86fe876175e23ddb0bc8dbfa889971628bc451d5d2f53f974703","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://trae.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/udio.svg","mediaType":"image/svg+xml","sha256":"ae4b9af080f08bb1aedbe6f5b7fa2532c3a0b3e5de129b2dbcb795245ff05ee6","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/udio/default.svg","integrity":"sha256:ae4b9af080f08bb1aedbe6f5b7fa2532c3a0b3e5de129b2dbcb795245ff05ee6","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://udio.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/uncloseai.svg","mediaType":"image/svg+xml","sha256":"09de727ac4976b6bf737d7f6f02ea2d7919d8c4ea19228d80f5b872eabf65f98","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/unorouter.svg","mediaType":"image/svg+xml","sha256":"89024ca813164d736836addc83d5f313095ce2b27474d39c941236fc45ea9cae","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/upstage.svg","mediaType":"image/svg+xml","sha256":"14dc984f2f6d1dcb3481387438d5b4528f794aea8ac20f1a4442bb5d8f2dcedc","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/upstage/default.svg","integrity":"sha256:14dc984f2f6d1dcb3481387438d5b4528f794aea8ac20f1a4442bb5d8f2dcedc","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://upstage.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/v0.svg","mediaType":"image/svg+xml","sha256":"e33ce9865356b381e2752a07a100d136ed80179645084eef185448be29c65a17","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/v0/default.svg","integrity":"sha256:e33ce9865356b381e2752a07a100d136ed80179645084eef185448be29c65a17","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://v0.dev/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/veoaifree-web.svg","mediaType":"image/svg+xml","sha256":"24a38f25e677b479907feccdd00d19476f2a0646c37f88b1dd5d68a109b58664","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/vercel.svg","mediaType":"image/svg+xml","sha256":"a9ae5ad4ea10c39122cc6b07927132f9c684dd2f1a7bef5337b0eb7364e139ae","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/vercel/default.svg","integrity":"sha256:a9ae5ad4ea10c39122cc6b07927132f9c684dd2f1a7bef5337b0eb7364e139ae","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://vercel.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/vllm.svg","mediaType":"image/svg+xml","sha256":"918d594cfb73c0dd269b725cf6672f4863d10c39a443d58c68c0662ae6ae84b1","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/vllm/default.svg","integrity":"sha256:918d594cfb73c0dd269b725cf6672f4863d10c39a443d58c68c0662ae6ae84b1","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://github.com/vllm-project"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/volcengine.svg","mediaType":"image/svg+xml","sha256":"e519337670163eb3babc1fb5ce8abe24b8777f3180aeb135870c40672d757a58","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/volcengine/default.svg","integrity":"sha256:e519337670163eb3babc1fb5ce8abe24b8777f3180aeb135870c40672d757a58","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://volcengine.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/voyage.svg","mediaType":"image/svg+xml","sha256":"f20ac1f2bef06f52e34bb63dbb215163641d4703fe347337250d03b19bcecb2c","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/voyage/default.svg","integrity":"sha256:f20ac1f2bef06f52e34bb63dbb215163641d4703fe347337250d03b19bcecb2c","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://voyageai.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/wafer.svg","mediaType":"image/svg+xml","sha256":"6b00a03f1e8781e94effd6ac93f812a2c2feb386bf87793a2483f72aaf297058","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/wandb.svg","mediaType":"image/svg+xml","sha256":"bbb87752bb3b16555841198b6fa77a9d934be317c0109280b16739d30abc98b1","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/windsurf.svg","mediaType":"image/svg+xml","sha256":"e961c08c7e84e90d74e67830cc4812298af404f2e205a9b120a16bff80b1d617","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/windsurf/default.svg","integrity":"sha256:e961c08c7e84e90d74e67830cc4812298af404f2e205a9b120a16bff80b1d617","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://windsurf.com/editor"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/x5lab.svg","mediaType":"image/svg+xml","sha256":"52f9eb439192a563dd0b8f5545e851b5bcd6b661d64538997ca338616d0f2716","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/xai.svg","mediaType":"image/svg+xml","sha256":"823bbbf2c6781192aa849f69dbaf57c8caffa21d39e79992c473dacaad2b09f5","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/xai/default.svg","integrity":"sha256:823bbbf2c6781192aa849f69dbaf57c8caffa21d39e79992c473dacaad2b09f5","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://x.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/xinference.svg","mediaType":"image/svg+xml","sha256":"e0caa389b4acd614f4f6a809fddf55d96563936fd47c12d6cb6f8e5ff335aeb9","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/yi.svg","mediaType":"image/svg+xml","sha256":"d78b1ce0eeb7a7d1a6132785dfa0218be48d6d1ccd3751ca3f9240a2e3b38756","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."} +{"recordType":"asset","path":"public/providers/youcom-search.svg","mediaType":"image/svg+xml","sha256":"0657bd314df49bcca7d0e2446099a517272c0166db84b45c9994a9b62638d742","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/yuanbao-web.svg","mediaType":"image/svg+xml","sha256":"21b658d85bcda8344b484db75cf10ec1bdbbc60ee428071b7a747ed80b9780f8","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/zed-hosted.svg","mediaType":"image/svg+xml","sha256":"52435227cd02ff2152ae2e69e5737cb7f5c87d9169c16591c6f50040beb8d197","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/zenmux-free.svg","mediaType":"image/svg+xml","sha256":"13cb431c91a018d16ad384de205a2b2aff7d786306f2401ea88f3caac0ee4d9e","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/zenmux.svg","mediaType":"image/svg+xml","sha256":"e16974c1ef2177b93e5820967f07542f433b56e46f28447a62e2a00bee91f597","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."} +{"recordType":"asset","path":"public/providers/zeroclaw.png","mediaType":"image/png","sha256":"247a7d9519a4e97ffa1c8691ce071bfbd9b85dc9d9158b1f1b3810a5dc82ba0f","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"asset","path":"public/providers/zhipu.svg","mediaType":"image/svg+xml","sha256":"4e7400476df64ad7c41a19828bd1dc8250cfab014a97e7cc89a1536384c48e31","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/zhipu/default.svg","integrity":"sha256:4e7400476df64ad7c41a19828bd1dc8250cfab014a97e7cc89a1536384c48e31","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://zhipuai.cn"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."} +{"recordType":"asset","path":"public/providers/zoocode.png","mediaType":"image/png","sha256":"a90d9ff41a3436e35069dc0c3d3c8f1ce27a2df2fd7fea1692913021f83292a5","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."} +{"recordType":"contentAlias","sha256":"2530f80fdf2144b62f96953a81c6988c9c31a6cc7c9de72e069079485817cbe7","canonicalPath":"public/providers/brave.svg","aliases":["public/providers/brave-search.svg"]} +{"recordType":"contentAlias","sha256":"a3101f3047a119aa11825ad9369510f0c472428c8c52d420e31bc62db44a8364","canonicalPath":"public/providers/claude.svg","aliases":["public/providers/claude-web.svg"]} +{"recordType":"contentAlias","sha256":"4d48a1405c68b00121fa7100e080025fa3e9e090c59055b56e4ad0aee1a7de7f","canonicalPath":"public/providers/freebuff.svg","aliases":["public/providers/freebuff-dark.svg","public/providers/freebuff-light.svg"]} +{"recordType":"contentAlias","sha256":"67413dbdc9be21ca995ad318234e5463af1262668b4a203da72388e22ef3ac40","canonicalPath":"public/providers/gitlab.svg","aliases":["public/providers/gitlab-duo.svg"]} +{"recordType":"contentAlias","sha256":"0bf05e2f9c1355e8a1d020c07f433ea725f1270607f04b83c398d44914ebe422","canonicalPath":"public/providers/kilocode.svg","aliases":["public/providers/kilo-gateway.svg"]} diff --git a/package.json b/package.json index cee0296390..07ec0a46d0 100644 --- a/package.json +++ b/package.json @@ -165,6 +165,7 @@ "check:model-lifecycle": "node --import tsx/esm scripts/check/check-model-lifecycle.mjs", "check:provider-consistency": "bun scripts/check/check-provider-consistency.ts", "check:provider-assets": "node scripts/check/check-provider-assets.mjs", + "check:provider-asset-provenance": "node scripts/check/check-provider-asset-provenance.mjs", "check:nvidia-catalog-drift": "node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts", "check:fetch-targets": "node scripts/check/check-fetch-targets.mjs", "check:openapi-routes": "node scripts/check/check-openapi-routes.mjs", diff --git a/scripts/check/check-provider-asset-provenance.mjs b/scripts/check/check-provider-asset-provenance.mjs new file mode 100644 index 0000000000..76957e06cf --- /dev/null +++ b/scripts/check/check-provider-asset-provenance.mjs @@ -0,0 +1,480 @@ +#!/usr/bin/env node + +import { spawnSync } from "node:child_process"; +import { createHash } from "node:crypto"; +import { readFile, readdir } from "node:fs/promises"; +import { join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const repoRoot = fileURLToPath(new URL("../..", import.meta.url)); +const defaultProvidersDir = join(repoRoot, "public/providers"); +const defaultManifestPath = join(repoRoot, "config/quality/provider-assets-provenance.jsonl"); + +function readOption(name, fallback) { + const index = process.argv.indexOf(name); + return index >= 0 ? resolve(process.argv[index + 1]) : fallback; +} + +const providersDir = readOption("--providers-dir", defaultProvidersDir); +const manifestPath = readOption("--manifest", defaultManifestPath); +const PROVENANCE_STATUSES = new Set(["proven", "probable", "unresolved"]); + +function isXmlWhitespace(character) { + return character === " " || character === "\t" || character === "\n" || character === "\r"; +} + +function skipXmlWhitespace(text, start) { + let index = start; + while (index < text.length && isXmlWhitespace(text[index])) index += 1; + return index; +} + +function startsWithAsciiCaseInsensitive(text, token, start) { + if (start + token.length > text.length) return false; + return text.slice(start, start + token.length).toLowerCase() === token; +} + +function skipXmlComments(text, start) { + let index = start; + while (text.startsWith("", index + 4); + if (commentEnd < 0) return -1; + index = skipXmlWhitespace(text, commentEnd + 3); + } + return index; +} + +function skipSvgDoctype(text, start) { + if (!startsWithAsciiCaseInsensitive(text, "" + ) { + return -1; + } + + let quote = null; + let subsetDepth = 0; + for (; index < text.length; index++) { + const character = text[index]; + if (quote) { + if (character === quote) quote = null; + } else if (character === '"' || character === "'") { + quote = character; + } else if (character === "[") { + subsetDepth += 1; + } else if (character === "]" && subsetDepth > 0) { + subsetDepth -= 1; + } else if (character === ">" && subsetDepth === 0) { + return index + 1; + } + } + return -1; +} + +function hasSvgRoot(content) { + let text = content.toString("utf8"); + if (text.charCodeAt(0) === 0xfeff) text = text.slice(1); + let index = skipXmlWhitespace(text, 0); + + if (startsWithAsciiCaseInsensitive(text, "", index + 5); + if (declarationEnd < 0) return false; + index = skipXmlWhitespace(text, declarationEnd + 2); + } + + index = skipXmlComments(text, index); + if (index < 0) return false; + const afterDoctype = skipSvgDoctype(text, index); + if (afterDoctype < 0) return false; + index = skipXmlWhitespace(text, afterDoctype); + index = skipXmlComments(text, index); + if (index < 0 || !startsWithAsciiCaseInsensitive(text, "" || boundary === "/" || isXmlWhitespace(boundary) + ); +} + +function detectMediaType(content) { + const pngSignature = "89504e470d0a1a0a"; + if (content.length >= 8 && content.subarray(0, 8).toString("hex") === pngSignature) { + return "image/png"; + } + if (content.length >= 3 && content[0] === 0xff && content[1] === 0xd8 && content[2] === 0xff) { + return "image/jpeg"; + } + + return hasSvgRoot(content) ? "image/svg+xml" : null; +} + +function isAsciiDigitString(value) { + if (!value) return false; + for (const character of value) { + if (character < "0" || character > "9") return false; + } + return true; +} + +function isPinnedSemver(value) { + if (typeof value !== "string" || value.length === 0) return false; + const normalized = value.startsWith("v") ? value.slice(1) : value; + let suffixIndex = -1; + for (let index = 0; index < normalized.length; index++) { + if (normalized[index] === "-" || normalized[index] === "+") { + suffixIndex = index; + break; + } + } + const core = suffixIndex < 0 ? normalized : normalized.slice(0, suffixIndex); + const suffix = suffixIndex < 0 ? null : normalized.slice(suffixIndex + 1); + if (suffix !== null) { + if (suffix.length === 0) return false; + for (const character of suffix) { + const isDigit = character >= "0" && character <= "9"; + const isLowercase = character >= "a" && character <= "z"; + const isUppercase = character >= "A" && character <= "Z"; + if (!isDigit && !isLowercase && !isUppercase && character !== "." && character !== "-") { + return false; + } + } + } + const parts = core.split("."); + return parts.length === 3 && parts.every(isAsciiDigitString); +} + +function hasImmutableSourceEvidence(source) { + if (!source || typeof source !== "object") return false; + if (!new Set(["git", "npm"]).has(source.kind)) return false; + if (typeof source.url !== "string" || !source.url.startsWith("https://")) return false; + if (typeof source.path !== "string" || source.path.length === 0) return false; + if (!new Set(["byte-exact", "svg-path-data"]).has(source.match)) return false; + if (source.kind === "git") { + return /^[0-9a-f]{40}$/i.test(source.ref) && /^sha256:[0-9a-f]{64}$/.test(source.integrity); + } + return ( + isPinnedSemver(source.ref) && + /^sha512-[A-Za-z0-9+/]{86}==$/.test(source.integrity) && + /^[0-9a-f]{40}$/i.test(source.packageShasum) + ); +} + +function isValidUpstreamLicenseClaim(claim) { + if (claim === null) return true; + return ( + typeof claim === "object" && + typeof claim.value === "string" && + claim.value.length > 0 && + typeof claim.assertedBy === "string" && + claim.assertedBy.length > 0 && + typeof claim.evidence === "string" && + claim.evidence.startsWith("https://") && + typeof claim.independentlyVerified === "boolean" && + typeof claim.scope === "string" && + /no trademark clearance/i.test(claim.scope) + ); +} + +function inspectGitCommit(objectId) { + const result = spawnSync("git", ["-C", repoRoot, "cat-file", "-t", objectId], { + encoding: "utf8", + }); + if (result.error) { + return `unable to verify auditedCommit with Git: ${result.error.message}`; + } + if (result.status !== 0) { + return `auditedCommit object does not exist: ${objectId}`; + } + const objectType = result.stdout.trim(); + if (objectType !== "commit") { + return `auditedCommit must identify a Git commit: ${objectId} (found ${objectType || "unknown"})`; + } + return null; +} + +function verifyAuditedProviderSnapshot(commit, physicalFiles) { + const failures = []; + const treeResult = spawnSync( + "git", + ["-C", repoRoot, "ls-tree", "-r", "-z", commit, "--", "public/providers"], + { encoding: "utf8" } + ); + if (treeResult.error) { + return [`unable to read audited provider tree with Git: ${treeResult.error.message}`]; + } + if (treeResult.status !== 0) { + return [ + `unable to read audited provider tree for ${commit}: ${treeResult.stderr.trim() || "git ls-tree failed"}`, + ]; + } + + const auditedBlobs = new Map(); + for (const entry of treeResult.stdout.split("\0").filter(Boolean)) { + const tabIndex = entry.indexOf("\t"); + const metadata = entry.slice(0, tabIndex).split(" "); + const path = entry.slice(tabIndex + 1); + const [, objectType, objectId] = metadata; + if (tabIndex < 0 || objectType !== "blob" || !objectId) { + failures.push(`invalid Git tree entry at auditedCommit: ${entry}`); + continue; + } + auditedBlobs.set(path, objectId); + } + + const hashResult = spawnSync("git", ["-C", repoRoot, "hash-object", "--", ...physicalFiles], { + encoding: "utf8", + }); + if (hashResult.error) { + return [ + ...failures, + `unable to hash physical provider assets with Git: ${hashResult.error.message}`, + ]; + } + if (hashResult.status !== 0) { + return [ + ...failures, + `unable to hash physical provider assets with Git: ${hashResult.stderr.trim() || "git hash-object failed"}`, + ]; + } + const physicalBlobIds = hashResult.stdout.trim() ? hashResult.stdout.trim().split(/\r?\n/) : []; + if (physicalBlobIds.length !== physicalFiles.length) { + failures.push( + `Git hash count mismatch: expected ${physicalFiles.length}, received ${physicalBlobIds.length}` + ); + } + + const physicalPaths = new Set(physicalFiles); + for (let index = 0; index < physicalFiles.length; index++) { + const path = physicalFiles[index]; + const auditedBlobId = auditedBlobs.get(path); + if (!auditedBlobId) { + failures.push(`auditedCommit provider snapshot is missing: ${path}`); + } else if (auditedBlobId !== physicalBlobIds[index]) { + failures.push(`auditedCommit provider snapshot differs: ${path}`); + } + } + for (const path of auditedBlobs.keys()) { + if (!physicalPaths.has(path)) { + failures.push(`auditedCommit provider snapshot has no physical file: ${path}`); + } + } + return failures; +} + +async function readManifest(path) { + const text = await readFile(path, "utf8"); + return text + .split("\n") + .filter((line) => line.trim()) + .map((line, index) => { + try { + return JSON.parse(line); + } catch (error) { + throw new Error(`invalid JSON on manifest line ${index + 1}: ${error.message}`); + } + }); +} + +async function main() { + const records = await readManifest(manifestPath); + const headers = records.filter((record) => record.recordType === "manifest"); + const assets = records.filter((record) => record.recordType === "asset"); + const aliases = records.filter((record) => record.recordType === "contentAlias"); + const providerEntries = await readdir(providersDir, { withFileTypes: true }); + const physicalFiles = providerEntries + .filter((entry) => entry.isFile()) + .map((entry) => `public/providers/${entry.name}`) + .sort(); + const nonRegularPaths = providerEntries + .filter((entry) => !entry.isFile()) + .map((entry) => `public/providers/${entry.name}`) + .sort(); + const manifestPaths = new Set(assets.map((asset) => asset.path)); + const physicalPaths = new Set(physicalFiles); + const failures = []; + const pathsBySha256 = new Map(); + + for (const path of nonRegularPaths) { + failures.push(`non-regular provider asset entry is not allowed: ${path}`); + } + + if (headers.length !== 1 || records[0]?.recordType !== "manifest") { + failures.push("manifest must contain exactly one recordType=manifest header on line 1"); + } + const header = headers[0]; + if (header) { + if (header.schemaVersion !== 1) { + failures.push(`unsupported schemaVersion: ${header.schemaVersion}`); + } + if ( + header.expectedAssetCount !== assets.length || + header.expectedAssetCount !== physicalFiles.length + ) { + failures.push( + `expectedAssetCount mismatch: manifest ${header.expectedAssetCount}, ` + + `records ${assets.length}, physical ${physicalFiles.length}` + ); + } + if (typeof header.auditedCommit !== "string" || !/^[0-9a-f]{40}$/i.test(header.auditedCommit)) { + failures.push("manifest auditedCommit must be a full 40-character Git SHA"); + } else { + const gitCommitFailure = inspectGitCommit(header.auditedCommit); + if (gitCommitFailure) { + failures.push(gitCommitFailure); + } else if (providersDir === defaultProvidersDir) { + failures.push(...verifyAuditedProviderSnapshot(header.auditedCommit, physicalFiles)); + } + } + if (typeof header.auditedAt !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(header.auditedAt)) { + failures.push("manifest auditedAt must use YYYY-MM-DD"); + } + if ( + typeof header.legalScope !== "string" || + !header.legalScope.includes("does not establish copyright or trademark clearance") + ) { + failures.push("manifest legalScope must disclaim copyright and trademark clearance"); + } + } + for (const record of records) { + if (!new Set(["manifest", "asset", "contentAlias"]).has(record.recordType)) { + failures.push(`unknown manifest recordType: ${record.recordType}`); + } + } + + const pathRecordCounts = new Map(); + for (const asset of assets) { + pathRecordCounts.set(asset.path, (pathRecordCounts.get(asset.path) ?? 0) + 1); + } + for (const [path, count] of pathRecordCounts) { + if (count > 1) failures.push(`duplicate manifest asset path: ${path}`); + } + + for (const path of physicalFiles) { + if (!manifestPaths.has(path)) failures.push(`missing from manifest: ${path}`); + } + for (const path of manifestPaths) { + if (!physicalPaths.has(path)) failures.push(`manifest path missing on disk: ${path}`); + } + for (const asset of assets) { + if (typeof asset.path !== "string" || !/^public\/providers\/[^/]+$/.test(asset.path)) { + failures.push(`invalid provider asset path: ${asset.path}`); + } + if (typeof asset.sha256 !== "string" || !/^[0-9a-f]{64}$/.test(asset.sha256)) { + failures.push(`invalid sha256 for ${asset.path}`); + } + if (!new Set(["image/svg+xml", "image/png", "image/jpeg"]).has(asset.mediaType)) { + failures.push(`invalid mediaType for ${asset.path}: ${asset.mediaType}`); + } + if (!PROVENANCE_STATUSES.has(asset.provenanceStatus)) { + failures.push(`invalid provenanceStatus for ${asset.path}: ${asset.provenanceStatus}`); + } + if (asset.provenanceStatus === "proven" && !hasImmutableSourceEvidence(asset.source)) { + failures.push(`proven asset requires immutable source evidence: ${asset.path}`); + } + if ( + asset.provenanceStatus === "proven" && + asset.source?.match === "byte-exact" && + asset.source.integrity !== `sha256:${asset.sha256}` + ) { + failures.push(`byte-exact source integrity must match local sha256: ${asset.path}`); + } + if ( + asset.provenanceStatus === "proven" && + asset.source?.match === "svg-path-data" && + (typeof asset.source.matchDetail !== "string" || asset.source.matchDetail.length === 0) + ) { + failures.push(`svg-path-data source requires matchDetail: ${asset.path}`); + } + if (!isValidUpstreamLicenseClaim(asset.upstreamLicenseClaim)) { + failures.push(`invalid upstreamLicenseClaim for ${asset.path}`); + } + if (new Set(["probable", "unresolved"]).has(asset.provenanceStatus) && asset.source !== null) { + failures.push(`${asset.provenanceStatus} asset source must be null: ${asset.path}`); + } + if ( + new Set(["probable", "unresolved"]).has(asset.provenanceStatus) && + asset.upstreamLicenseClaim !== null + ) { + failures.push(`${asset.provenanceStatus} asset license claim must be null: ${asset.path}`); + } + if (asset.trademarkClearance !== null) { + failures.push(`trademarkClearance must remain null: ${asset.path}`); + } + if (typeof asset.evidenceNote !== "string" || asset.evidenceNote.trim().length === 0) { + failures.push(`evidenceNote is required: ${asset.path}`); + } + if (!physicalPaths.has(asset.path)) continue; + const fileName = asset.path.slice("public/providers/".length); + const content = await readFile(join(providersDir, fileName)); + const actualSha256 = createHash("sha256").update(content).digest("hex"); + const matchingPaths = pathsBySha256.get(actualSha256) ?? []; + matchingPaths.push(asset.path); + pathsBySha256.set(actualSha256, matchingPaths); + if (asset.sha256 !== actualSha256) { + failures.push(`sha256 mismatch: ${asset.path}`); + } + const actualMediaType = detectMediaType(content); + if (asset.mediaType !== actualMediaType) { + failures.push( + `mediaType mismatch: ${asset.path} (manifest ${asset.mediaType}, actual ${actualMediaType ?? "unknown"})` + ); + } + } + + const aliasesBySha256 = new Map(); + for (const alias of aliases) { + if (aliasesBySha256.has(alias.sha256)) { + failures.push(`duplicate contentAlias record: sha256:${alias.sha256}`); + continue; + } + aliasesBySha256.set(alias.sha256, alias); + } + for (const [sha256, paths] of pathsBySha256) { + if (paths.length < 2) continue; + const alias = aliasesBySha256.get(sha256); + if (!alias) { + failures.push(`duplicate content missing alias record: sha256:${sha256}`); + continue; + } + const declaredPaths = [alias.canonicalPath, ...(alias.aliases ?? [])].sort(); + const actualPaths = [...paths].sort(); + if (JSON.stringify(declaredPaths) !== JSON.stringify(actualPaths)) { + failures.push(`contentAlias paths mismatch: sha256:${sha256}`); + } + } + for (const alias of aliases) { + if ((pathsBySha256.get(alias.sha256) ?? []).length < 2) { + failures.push(`contentAlias does not describe duplicate content: sha256:${alias.sha256}`); + } + } + + if (failures.length > 0) { + console.error("Provider asset provenance failed:"); + for (const failure of failures) console.error(`- ${failure}`); + process.exitCode = 1; + return; + } + + const statusCounts = { proven: 0, probable: 0, unresolved: 0 }; + for (const asset of assets) statusCounts[asset.provenanceStatus] += 1; + const duplicateGroupCount = [...pathsBySha256.values()].filter( + (paths) => paths.length > 1 + ).length; + console.log( + `Provider asset provenance passed: ${assets.length}/${physicalFiles.length} registered; ` + + `proven=${statusCounts.proven} probable=${statusCounts.probable} ` + + `unresolved=${statusCounts.unresolved}; duplicate-groups=${duplicateGroupCount}.` + ); +} + +main().catch((error) => { + console.error(`Provider asset provenance failed: ${error.message}`); + process.exitCode = 1; +}); diff --git a/tests/unit/check-provider-asset-provenance.test.ts b/tests/unit/check-provider-asset-provenance.test.ts new file mode 100644 index 0000000000..c7ea61728f --- /dev/null +++ b/tests/unit/check-provider-asset-provenance.test.ts @@ -0,0 +1,524 @@ +import assert from "node:assert/strict"; +import { spawnSync } from "node:child_process"; +import { createHash } from "node:crypto"; +import { mkdirSync, mkdtempSync, readFileSync, rmSync, symlinkSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { fileURLToPath } from "node:url"; +import test from "node:test"; + +const SCRIPT_PATH = fileURLToPath( + new URL("../../scripts/check/check-provider-asset-provenance.mjs", import.meta.url) +); +const REPO_ROOT = fileURLToPath(new URL("../..", import.meta.url)); + +const SVG = '\n'; +const SVG_WITH_DOCTYPE = ` + + +`; + +function sha256(value: string | Buffer) { + return createHash("sha256").update(value).digest("hex"); +} + +function makeFixture() { + const root = mkdtempSync(join(tmpdir(), "provider-asset-provenance-")); + const providersDir = join(root, "public/providers"); + const manifestPath = join(root, "config/quality/provider-assets-provenance.jsonl"); + mkdirSync(providersDir, { recursive: true }); + mkdirSync(join(root, "config/quality"), { recursive: true }); + return { root, providersDir, manifestPath }; +} + +function writeManifest( + path: string, + records: Record[], + headerOverrides: Record = {} +) { + const header = { + recordType: "manifest", + schemaVersion: 1, + expectedAssetCount: records.filter((record) => record.recordType === "asset").length, + auditedCommit: "091589089cd134a94df9f6cdab9ba562b2cefd18", + auditedAt: "2026-08-26", + legalScope: + "Provenance records source matching only; it does not establish copyright or trademark clearance.", + ...headerOverrides, + }; + writeFileSync( + path, + `${[header, ...records].map((record) => JSON.stringify(record)).join("\n")}\n` + ); +} + +function unresolvedAsset(path: string, content: string | Buffer = SVG) { + return { + recordType: "asset", + path, + mediaType: "image/svg+xml", + sha256: sha256(content), + provenanceStatus: "unresolved", + source: null, + upstreamLicenseClaim: null, + trademarkClearance: null, + evidenceNote: "No immutable upstream source is recorded yet.", + }; +} + +function provenAsset(path: string, content: string | Buffer = SVG) { + return { + ...unresolvedAsset(path, content), + provenanceStatus: "proven", + source: { + kind: "git", + url: "https://example.invalid/source", + ref: "a".repeat(40), + path: "icons/example.svg", + integrity: `sha256:${sha256(content)}`, + match: "byte-exact", + }, + evidenceNote: "Local bytes match an immutable source; no legal clearance is inferred.", + }; +} + +function runGate(providersDir: string, manifestPath: string, timeout?: number) { + return spawnSync( + process.execPath, + [SCRIPT_PATH, "--providers-dir", providersDir, "--manifest", manifestPath], + { encoding: "utf8", timeout } + ); +} + +function gitObjectId(revision: string) { + const result = spawnSync("git", ["-C", REPO_ROOT, "rev-parse", revision], { + encoding: "utf8", + }); + assert.equal(result.status, 0, result.stderr); + return result.stdout.trim(); +} + +function gitRootCommit() { + const result = spawnSync("git", ["-C", REPO_ROOT, "rev-list", "--max-parents=0", "HEAD"], { + encoding: "utf8", + }); + assert.equal(result.status, 0, result.stderr); + return result.stdout.trim().split(/\r?\n/)[0]; +} + +function workflowJob(source: string, name: string) { + const lines = source.split("\n"); + const start = lines.indexOf(` ${name}:`); + assert.notEqual(start, -1, `workflow job ${name} must exist`); + let end = lines.length; + for (let index = start + 1; index < lines.length; index++) { + const line = lines[index]; + if (line.startsWith(" ") && !line.startsWith(" ") && line.endsWith(":")) { + end = index; + break; + } + } + return lines.slice(start + 1, end).join("\n"); +} + +test("provider asset provenance gate rejects a new physical asset without a manifest record", () => { + const fixture = makeFixture(); + try { + writeFileSync(join(fixture.providersDir, "registered.svg"), SVG); + writeFileSync(join(fixture.providersDir, "surprise.svg"), SVG); + writeManifest(fixture.manifestPath, [unresolvedAsset("public/providers/registered.svg")]); + + const result = runGate(fixture.providersDir, fixture.manifestPath); + + assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`); + assert.match( + `${result.stdout}\n${result.stderr}`, + /missing from manifest: public\/providers\/surprise\.svg/ + ); + } finally { + rmSync(fixture.root, { recursive: true, force: true }); + } +}); + +test("provider asset provenance gate rejects a symlink that could evade physical coverage", () => { + const fixture = makeFixture(); + try { + writeFileSync(join(fixture.providersDir, "registered.svg"), SVG); + symlinkSync("registered.svg", join(fixture.providersDir, "unregistered-link.svg")); + writeManifest(fixture.manifestPath, [unresolvedAsset("public/providers/registered.svg")]); + + const result = runGate(fixture.providersDir, fixture.manifestPath); + + assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`); + assert.match( + `${result.stdout}\n${result.stderr}`, + /non-regular provider asset entry is not allowed: public\/providers\/unregistered-link\.svg/ + ); + } finally { + rmSync(fixture.root, { recursive: true, force: true }); + } +}); + +test("provider asset provenance gate rejects a stale SHA-256", () => { + const fixture = makeFixture(); + try { + writeFileSync(join(fixture.providersDir, "registered.svg"), SVG); + writeManifest(fixture.manifestPath, [ + { + ...unresolvedAsset("public/providers/registered.svg"), + sha256: "0".repeat(64), + }, + ]); + + const result = runGate(fixture.providersDir, fixture.manifestPath); + + assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`); + assert.match( + `${result.stdout}\n${result.stderr}`, + /sha256 mismatch: public\/providers\/registered\.svg/ + ); + } finally { + rmSync(fixture.root, { recursive: true, force: true }); + } +}); + +test("provider asset provenance gate validates magic MIME instead of trusting the suffix", () => { + const fixture = makeFixture(); + const jpeg = Buffer.from([0xff, 0xd8, 0xff, 0xd9]); + try { + writeFileSync(join(fixture.providersDir, "misleading.png"), jpeg); + writeManifest(fixture.manifestPath, [ + { + ...unresolvedAsset("public/providers/misleading.png", jpeg), + mediaType: "image/png", + }, + ]); + + const result = runGate(fixture.providersDir, fixture.manifestPath); + + assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`); + assert.match( + `${result.stdout}\n${result.stderr}`, + /mediaType mismatch: public\/providers\/misleading\.png \(manifest image\/png, actual image\/jpeg\)/ + ); + } finally { + rmSync(fixture.root, { recursive: true, force: true }); + } +}); + +test("provider asset provenance gate does not accept a truncated JPEG prefix", () => { + const fixture = makeFixture(); + const falseJpeg = Buffer.from([0xff, 0xd8, 0x00]); + try { + writeFileSync(join(fixture.providersDir, "truncated.jpg"), falseJpeg); + writeManifest(fixture.manifestPath, [ + { + ...unresolvedAsset("public/providers/truncated.jpg", falseJpeg), + mediaType: "image/jpeg", + }, + ]); + + const result = runGate(fixture.providersDir, fixture.manifestPath); + + assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`); + assert.match( + `${result.stdout}\n${result.stderr}`, + /mediaType mismatch: public\/providers\/truncated\.jpg \(manifest image\/jpeg, actual unknown\)/ + ); + } finally { + rmSync(fixture.root, { recursive: true, force: true }); + } +}); + +test("provider asset provenance gate recognizes an SVG with an XML doctype", () => { + const fixture = makeFixture(); + try { + writeFileSync(join(fixture.providersDir, "doctype.svg"), SVG_WITH_DOCTYPE); + writeManifest(fixture.manifestPath, [ + unresolvedAsset("public/providers/doctype.svg", SVG_WITH_DOCTYPE), + ]); + + const result = runGate(fixture.providersDir, fixture.manifestPath); + + assert.equal(result.status, 0, `${result.stdout}\n${result.stderr}`); + } finally { + rmSync(fixture.root, { recursive: true, force: true }); + } +}); + +test("provider asset provenance gate scans adversarial SVG comment chains within a fixed bound", () => { + const fixture = makeFixture(); + const adversarial = `