@singi-labs/sifa-sdk 0.19.86 → 0.19.88

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/{follow-profile-ceqefXAw.d.ts → follow-profile-CcMgQDsh.d.ts} +1 -1
  2. package/dist/{follow-profile-CQ3DTTak.d.cts → follow-profile-D3zDoDll.d.cts} +1 -1
  3. package/dist/format/blob-proxy-url.js +9 -0
  4. package/dist/format/blob-proxy-url.js.map +1 -0
  5. package/dist/format/index.js +2 -0
  6. package/dist/format/index.js.map +1 -1
  7. package/dist/{index-BrWWVQLL.d.cts → index-C2n-GjH2.d.cts} +1 -1
  8. package/dist/{index-B0BDMGLm.d.ts → index-LxGL5I-J.d.ts} +1 -1
  9. package/dist/index.cjs +60 -10
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.cts +26 -10
  12. package/dist/index.d.ts +26 -10
  13. package/dist/index.js +5 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/jsonld/index.d.cts +2 -2
  16. package/dist/jsonld/index.d.ts +2 -2
  17. package/dist/{network-map-BRoBXwPG.d.cts → network-map-CFZx_xXE.d.cts} +4 -4
  18. package/dist/{network-map-NbEQwn91.d.ts → network-map-k2QxGpGf.d.ts} +4 -4
  19. package/dist/{profile-summary-BGIJ6ovO.d.ts → profile-summary-2pFtukEK.d.ts} +1 -1
  20. package/dist/{profile-summary-BpfRgE0z.d.cts → profile-summary-CwJD0-wo.d.cts} +1 -1
  21. package/dist/query/fetchers/index.d.cts +8 -8
  22. package/dist/query/fetchers/index.d.ts +8 -8
  23. package/dist/query/hooks/index.d.cts +6 -6
  24. package/dist/query/hooks/index.d.ts +6 -6
  25. package/dist/query/index.d.cts +11 -11
  26. package/dist/query/index.d.ts +11 -11
  27. package/dist/resume/index.d.cts +2 -2
  28. package/dist/resume/index.d.ts +2 -2
  29. package/dist/schemas/follow-profile.js +3 -1
  30. package/dist/schemas/follow-profile.js.map +1 -1
  31. package/dist/schemas/index.cjs +9 -5
  32. package/dist/schemas/index.cjs.map +1 -1
  33. package/dist/schemas/index.d.cts +2 -2
  34. package/dist/schemas/index.d.ts +2 -2
  35. package/dist/stream/stream-card-vm-schema.js +2 -1
  36. package/dist/stream/stream-card-vm-schema.js.map +1 -1
  37. package/dist/stream/to-stream-card-vm.js +13 -2
  38. package/dist/stream/to-stream-card-vm.js.map +1 -1
  39. package/dist/taxonomy/index.js +2 -0
  40. package/dist/taxonomy/index.js.map +1 -1
  41. package/dist/taxonomy/verification-providers.js +26 -5
  42. package/dist/taxonomy/verification-providers.js.map +1 -1
  43. package/dist/{types-D2IffOnb.d.ts → types-CICITVJa.d.ts} +2 -2
  44. package/dist/{types-CPi-Xcur.d.cts → types-DkrZo5eF.d.cts} +2 -2
  45. package/dist/{use-user-settings-BxIVvuk3.d.cts → use-user-settings-Azxf51V9.d.cts} +4 -4
  46. package/dist/{use-user-settings-D_APuRP2.d.ts → use-user-settings-DQNz9PYA.d.ts} +4 -4
  47. package/dist/{user-settings-BFyyuR3C.d.cts → user-settings-BDZ9i-Pk.d.cts} +4 -4
  48. package/dist/{user-settings-BSlRJc0W.d.ts → user-settings-DvqRXhdC.d.ts} +4 -4
  49. package/dist/{verification-providers-7il3kPQS.d.cts → verification-providers-BPdY3KyH.d.cts} +43 -9
  50. package/dist/{verification-providers-7il3kPQS.d.ts → verification-providers-BPdY3KyH.d.ts} +43 -9
  51. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/taxonomy/verification-providers.ts"],"sourcesContent":["/**\n * Verification providers -- the trust roots Sifa recognizes for AT Protocol\n * `app.bsky.graph.verification` records.\n *\n * Framing (see decisions/2026-07-13-third-party-verification-providers.md, D4):\n * a verification checkmark is ONE low-tier trust layer, not Sifa's headline.\n * Most of what it certifies is \"this account is who they claim to be\" -- useful,\n * and worth carrying because it's an already-recognized network signal, but low\n * value on its own. It sits among Sifa's other trust signals and never becomes a\n * score or a gate. This registry only decides which issuers Sifa displays and\n * with what provenance.\n *\n * Data-only: badge colors and icons are consumer concerns (React DOM on web,\n * React Native on mobile), same split as {@link PLATFORM_LABELS}. Consumers map\n * a provider id to a token/color.\n */\n\nexport type VerificationProviderId = 'bluesky' | 'mu';\n\n/** How Sifa learns about a provider's verifications. */\nexport type VerificationSource = 'bluesky-api' | 'firehose';\n\nexport interface VerificationProvider {\n id: VerificationProviderId;\n /** Human label for the badge popover, e.g. \"Bluesky\", \"mu (Eurosky)\". */\n label: string;\n /**\n * Primary-display priority (D1): when an account holds verifications from\n * multiple providers, the lowest number wins the single inline badge and the\n * rest move into the popover. Must be unique across providers.\n */\n priority: number;\n /**\n * - `bluesky-api`: sourced from Bluesky's public-API `verifiedStatus`. Bluesky\n * maintains its own trusted-verifier set, so Sifa keeps no local DID list.\n * - `firehose`: sourced from the Jetstream, gated on {@link verifierDids}.\n */\n source: VerificationSource;\n /**\n * Trusted verifier DIDs for firehose-sourced providers. A verification record\n * counts only if its ISSUER DID is in this list. Empty for `bluesky-api`\n * providers (Bluesky's AppView owns that decision). DIDs, not handles: a handle\n * takeover must never confer verifier status.\n */\n verifierDids: readonly string[];\n}\n\n/**\n * A verification held by an account, as surfaced to the UI. `issuerDid` is\n * present for firehose-sourced providers and absent for `bluesky-api`.\n */\nexport interface AccountVerification {\n provider: VerificationProviderId;\n verifiedAt?: string | null;\n issuerDid?: string | null;\n}\n\n/**\n * mu / Eurosky trusted verifiers (see https://hello.mu.social/verification).\n * Sifa-maintained allowlist -- this is the governance commitment. Add a DID here\n * only after confirming the organization is a mu trusted verifier. Handles are\n * comments for humans; the DID is what the firehose issuer gate matches.\n */\nconst MU_VERIFIER_DIDS = [\n 'did:plc:ooensn4mr5mhznzypvxelfa3', // eurosky.social -- coordinates the trusted-verifier program\n 'did:plc:durcipmx2rwgzzagbiumobs5', // france-atmosphe.re\n 'did:plc:zsf5p7rqilz2qvyd7ezmxrfj', // belgium-atmosphe.re\n 'did:plc:hd564mpf6bekrwzyhvujs54b', // medsky.network\n 'did:plc:u5zp7npt5kpueado77kuihyz', // npmx.dev\n 'did:plc:6tndl5lqrzjrx7ahjom2gjbq', // stewardshiplab.org\n 'did:plc:vnycpb2e4lh4tc7oyr3n2jvh', // newsmastfoundation.org\n 'did:plc:dsiqe4pszk5ldbjk66fyryjv', // cpesr.fr\n] as const;\n\nexport const VERIFICATION_PROVIDERS: Record<VerificationProviderId, VerificationProvider> = {\n bluesky: {\n id: 'bluesky',\n label: 'Bluesky',\n priority: 0,\n source: 'bluesky-api',\n verifierDids: [],\n },\n mu: {\n id: 'mu',\n label: 'mu (Eurosky)',\n priority: 1,\n source: 'firehose',\n verifierDids: MU_VERIFIER_DIDS,\n },\n};\n\nexport function isKnownVerificationProvider(id: string): id is VerificationProviderId {\n // Object.hasOwn, not `in`: `in` also matches inherited Object.prototype keys\n // ('toString', 'constructor', ...), which would wrongly narrow those strings\n // and make getVerificationProvider return a prototype function.\n return Object.hasOwn(VERIFICATION_PROVIDERS, id);\n}\n\nexport function getVerificationProvider(id: string): VerificationProvider | undefined {\n return isKnownVerificationProvider(id) ? VERIFICATION_PROVIDERS[id] : undefined;\n}\n\n/**\n * The firehose issuer gate: given the DID that authored an\n * `app.bsky.graph.verification` record, return the provider it verifies for, or\n * `null` if the issuer is not a recognized firehose verifier. API-sourced\n * providers (Bluesky) are never matched here -- their verifications do not enter\n * through the firehose, so a self-issued record cannot resolve to them.\n */\nexport function resolveVerifierProvider(issuerDid: string): VerificationProviderId | null {\n for (const provider of Object.values(VERIFICATION_PROVIDERS)) {\n if (provider.source !== 'firehose') continue;\n if (provider.verifierDids.includes(issuerDid)) return provider.id;\n }\n return null;\n}\n\n/**\n * D1 primary-provider selection: from all verifications an account holds, pick\n * the one whose provider has the highest priority (lowest `priority` number) for\n * the single inline badge. The rest belong in the popover. Verifications from\n * unknown providers are ignored. Returns `null` when nothing is displayable.\n */\nexport function primaryVerification(\n verifications: readonly AccountVerification[],\n): AccountVerification | null {\n let best: AccountVerification | null = null;\n let bestPriority = Number.POSITIVE_INFINITY;\n for (const verification of verifications) {\n const provider = getVerificationProvider(verification.provider);\n if (!provider) continue;\n if (provider.priority < bestPriority) {\n best = verification;\n bestPriority = provider.priority;\n }\n }\n return best;\n}\n"],"mappings":";AA+DA,IAAM,mBAAmB;AAAA,EACvB;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAEO,IAAM,yBAA+E;AAAA,EAC1F,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc,CAAC;AAAA,EACjB;AAAA,EACA,IAAI;AAAA,IACF,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AACF;AAEO,SAAS,4BAA4B,IAA0C;AAIpF,SAAO,OAAO,OAAO,wBAAwB,EAAE;AACjD;AAEO,SAAS,wBAAwB,IAA8C;AACpF,SAAO,4BAA4B,EAAE,IAAI,uBAAuB,EAAE,IAAI;AACxE;AASO,SAAS,wBAAwB,WAAkD;AACxF,aAAW,YAAY,OAAO,OAAO,sBAAsB,GAAG;AAC5D,QAAI,SAAS,WAAW,WAAY;AACpC,QAAI,SAAS,aAAa,SAAS,SAAS,EAAG,QAAO,SAAS;AAAA,EACjE;AACA,SAAO;AACT;AAQO,SAAS,oBACd,eAC4B;AAC5B,MAAI,OAAmC;AACvC,MAAI,eAAe,OAAO;AAC1B,aAAW,gBAAgB,eAAe;AACxC,UAAM,WAAW,wBAAwB,aAAa,QAAQ;AAC9D,QAAI,CAAC,SAAU;AACf,QAAI,SAAS,WAAW,cAAc;AACpC,aAAO;AACP,qBAAe,SAAS;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/taxonomy/verification-providers.ts"],"sourcesContent":["/**\n * Verification providers -- the trust roots Sifa recognizes for AT Protocol\n * `app.bsky.graph.verification` records.\n *\n * Framing (see decisions/2026-07-13-third-party-verification-providers.md, D4):\n * a verification checkmark is ONE low-tier trust layer, not Sifa's headline.\n * Most of what it certifies is \"this account is who they claim to be\" -- useful,\n * and worth carrying because it's an already-recognized network signal, but low\n * value on its own. It sits among Sifa's other trust signals and never becomes a\n * score or a gate. This registry only decides which issuers Sifa displays and\n * with what provenance.\n *\n * Data-only: badge colors and icons are consumer concerns (React DOM on web,\n * React Native on mobile), same split as {@link PLATFORM_LABELS}. Consumers map\n * a provider id to a token/color.\n */\n\nexport type VerificationProviderId = 'bluesky' | 'mu';\n\n/** How Sifa learns about a provider's verifications. */\nexport type VerificationSource = 'bluesky-api' | 'firehose';\n\nexport interface VerificationProvider {\n id: VerificationProviderId;\n /** Human label for the badge popover, e.g. \"Bluesky\", \"mu (Eurosky)\". */\n label: string;\n /**\n * Primary-display priority (D1): when an account holds verifications from\n * multiple providers, the lowest number wins the single inline badge and the\n * rest move into the popover. Must be unique across providers.\n */\n priority: number;\n /**\n * - `bluesky-api`: sourced from Bluesky's public-API `verifiedStatus`. Bluesky\n * maintains its own trusted-verifier set, so Sifa keeps no local DID list.\n * - `firehose`: sourced from the Jetstream, gated on {@link verifierDids}.\n */\n source: VerificationSource;\n /**\n * Trust-root DIDs for firehose-sourced providers. A verification record counts\n * if its ISSUER DID is a root or a member of {@link verifierListUri}. Empty for\n * `bluesky-api` providers (Bluesky's AppView owns that decision). DIDs, not\n * handles: a handle takeover must never confer verifier status.\n */\n verifierDids: readonly string[];\n /**\n * AT-URI of the `app.bsky.graph.list` where the provider publishes its\n * trusted verifiers. Consumers load its members at runtime and pass them to\n * {@link resolveVerifierProvider}, so a verifier the provider adds counts on\n * Sifa without a release. The list owner must be in {@link verifierDids}.\n */\n verifierListUri?: string;\n /**\n * Verifiers last confirmed by hand, used ONLY when the caller supplies no\n * list members (list not loaded yet, or a consumer that does not load it).\n * Keeps such callers working; once members are supplied, the list wins.\n */\n fallbackVerifierDids?: readonly string[];\n}\n\n/**\n * A verification held by an account, as surfaced to the UI. `issuerDid` is\n * present for firehose-sourced providers and absent for `bluesky-api`.\n */\nexport interface AccountVerification {\n provider: VerificationProviderId;\n verifiedAt?: string | null;\n issuerDid?: string | null;\n /** Display name of the issuer (firehose providers), when the API knows it. */\n issuerName?: string | null;\n}\n\n/**\n * mu / Eurosky trust root (see https://hello.mu.social/verification).\n * eurosky.social coordinates the trusted-verifier program and publishes the\n * verifier set as {@link MU_VERIFIER_LIST_URI}; the individual verifiers are\n * read from that list at runtime, not maintained here.\n */\nconst MU_ROOT_DID = 'did:plc:ooensn4mr5mhznzypvxelfa3'; // eurosky.social\n\n/** \"Trusted verifiers on mu\", owned by {@link MU_ROOT_DID}. */\nconst MU_VERIFIER_LIST_URI = `at://${MU_ROOT_DID}/app.bsky.graph.list/3mogaw2g4an23`;\n\n/** Snapshot of the mu verifiers confirmed by hand before the list was used. */\nconst MU_FALLBACK_VERIFIER_DIDS = [\n 'did:plc:durcipmx2rwgzzagbiumobs5', // france-atmosphe.re\n 'did:plc:zsf5p7rqilz2qvyd7ezmxrfj', // belgium-atmosphe.re\n 'did:plc:hd564mpf6bekrwzyhvujs54b', // medsky.network\n 'did:plc:u5zp7npt5kpueado77kuihyz', // npmx.dev\n 'did:plc:6tndl5lqrzjrx7ahjom2gjbq', // stewardshiplab.org\n 'did:plc:vnycpb2e4lh4tc7oyr3n2jvh', // newsmastfoundation.org\n 'did:plc:dsiqe4pszk5ldbjk66fyryjv', // cpesr.fr\n] as const;\n\nexport const VERIFICATION_PROVIDERS: Record<VerificationProviderId, VerificationProvider> = {\n bluesky: {\n id: 'bluesky',\n label: 'Bluesky',\n priority: 0,\n source: 'bluesky-api',\n verifierDids: [],\n },\n mu: {\n id: 'mu',\n label: 'mu (Eurosky)',\n priority: 1,\n source: 'firehose',\n verifierDids: [MU_ROOT_DID],\n verifierListUri: MU_VERIFIER_LIST_URI,\n fallbackVerifierDids: MU_FALLBACK_VERIFIER_DIDS,\n },\n};\n\nexport function isKnownVerificationProvider(id: string): id is VerificationProviderId {\n // Object.hasOwn, not `in`: `in` also matches inherited Object.prototype keys\n // ('toString', 'constructor', ...), which would wrongly narrow those strings\n // and make getVerificationProvider return a prototype function.\n return Object.hasOwn(VERIFICATION_PROVIDERS, id);\n}\n\nexport function getVerificationProvider(id: string): VerificationProvider | undefined {\n return isKnownVerificationProvider(id) ? VERIFICATION_PROVIDERS[id] : undefined;\n}\n\n/**\n * The firehose issuer gate: given the DID that authored an\n * `app.bsky.graph.verification` record, return the provider it verifies for, or\n * `null` if the issuer is not a recognized firehose verifier. A DID counts if it\n * is a provider's trust root, or if `listMembers` (built with\n * {@link buildVerifierListMembers}) maps it to a firehose provider. Without\n * `listMembers`, each provider's `fallbackVerifierDids` apply instead.\n * API-sourced providers (Bluesky) are never matched here -- their verifications\n * do not enter through the firehose, so a self-issued record cannot resolve to\n * them.\n */\nexport function resolveVerifierProvider(\n issuerDid: string,\n listMembers?: ReadonlyMap<string, VerificationProviderId>,\n): VerificationProviderId | null {\n for (const provider of Object.values(VERIFICATION_PROVIDERS)) {\n if (provider.source !== 'firehose') continue;\n if (provider.verifierDids.includes(issuerDid)) return provider.id;\n if (!listMembers && provider.fallbackVerifierDids?.includes(issuerDid)) return provider.id;\n }\n const fromList = listMembers?.get(issuerDid);\n if (fromList && getVerificationProvider(fromList)?.source === 'firehose') return fromList;\n return null;\n}\n\n/** One `app.bsky.graph.listitem` record value, plus the repo it was read from. */\nexport interface VerifierListItem {\n /** DID of the repo the listitem record was read from. */\n repoDid: string;\n list: unknown;\n subject: unknown;\n}\n\n/**\n * Build the `listMembers` map for {@link resolveVerifierProvider} from raw\n * listitem records. An item counts only if it belongs to a firehose provider's\n * {@link VerificationProvider.verifierListUri}, was read from that list owner's\n * repo, and that owner is one of the provider's trust roots. Anything else\n * (a list item someone else wrote, another list, a malformed subject) is dropped.\n */\nexport function buildVerifierListMembers(\n items: readonly VerifierListItem[],\n): Map<string, VerificationProviderId> {\n const members = new Map<string, VerificationProviderId>();\n for (const provider of Object.values(VERIFICATION_PROVIDERS)) {\n if (provider.source !== 'firehose' || !provider.verifierListUri) continue;\n const owner = provider.verifierListUri.split('/')[2];\n if (!owner || !provider.verifierDids.includes(owner)) continue;\n for (const item of items) {\n if (item.repoDid !== owner || item.list !== provider.verifierListUri) continue;\n if (typeof item.subject !== 'string' || !/^did:[a-z]+:[A-Za-z0-9._:%-]+$/.test(item.subject))\n continue;\n if (!members.has(item.subject)) members.set(item.subject, provider.id);\n }\n }\n return members;\n}\n\n/**\n * D1 primary-provider selection: from all verifications an account holds, pick\n * the one whose provider has the highest priority (lowest `priority` number) for\n * the single inline badge. The rest belong in the popover. Verifications from\n * unknown providers are ignored. Returns `null` when nothing is displayable.\n */\nexport function primaryVerification(\n verifications: readonly AccountVerification[],\n): AccountVerification | null {\n let best: AccountVerification | null = null;\n let bestPriority = Number.POSITIVE_INFINITY;\n for (const verification of verifications) {\n const provider = getVerificationProvider(verification.provider);\n if (!provider) continue;\n if (provider.priority < bestPriority) {\n best = verification;\n bestPriority = provider.priority;\n }\n }\n return best;\n}\n"],"mappings":";AA8EA,IAAM,cAAc;AAGpB,IAAM,uBAAuB,QAAQ,WAAW;AAGhD,IAAM,4BAA4B;AAAA,EAChC;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAEO,IAAM,yBAA+E;AAAA,EAC1F,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc,CAAC;AAAA,EACjB;AAAA,EACA,IAAI;AAAA,IACF,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc,CAAC,WAAW;AAAA,IAC1B,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,EACxB;AACF;AAEO,SAAS,4BAA4B,IAA0C;AAIpF,SAAO,OAAO,OAAO,wBAAwB,EAAE;AACjD;AAEO,SAAS,wBAAwB,IAA8C;AACpF,SAAO,4BAA4B,EAAE,IAAI,uBAAuB,EAAE,IAAI;AACxE;AAaO,SAAS,wBACd,WACA,aAC+B;AAC/B,aAAW,YAAY,OAAO,OAAO,sBAAsB,GAAG;AAC5D,QAAI,SAAS,WAAW,WAAY;AACpC,QAAI,SAAS,aAAa,SAAS,SAAS,EAAG,QAAO,SAAS;AAC/D,QAAI,CAAC,eAAe,SAAS,sBAAsB,SAAS,SAAS,EAAG,QAAO,SAAS;AAAA,EAC1F;AACA,QAAM,WAAW,aAAa,IAAI,SAAS;AAC3C,MAAI,YAAY,wBAAwB,QAAQ,GAAG,WAAW,WAAY,QAAO;AACjF,SAAO;AACT;AAiBO,SAAS,yBACd,OACqC;AACrC,QAAM,UAAU,oBAAI,IAAoC;AACxD,aAAW,YAAY,OAAO,OAAO,sBAAsB,GAAG;AAC5D,QAAI,SAAS,WAAW,cAAc,CAAC,SAAS,gBAAiB;AACjE,UAAM,QAAQ,SAAS,gBAAgB,MAAM,GAAG,EAAE,CAAC;AACnD,QAAI,CAAC,SAAS,CAAC,SAAS,aAAa,SAAS,KAAK,EAAG;AACtD,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,YAAY,SAAS,KAAK,SAAS,SAAS,gBAAiB;AACtE,UAAI,OAAO,KAAK,YAAY,YAAY,CAAC,iCAAiC,KAAK,KAAK,OAAO;AACzF;AACF,UAAI,CAAC,QAAQ,IAAI,KAAK,OAAO,EAAG,SAAQ,IAAI,KAAK,SAAS,SAAS,EAAE;AAAA,IACvE;AAAA,EACF;AACA,SAAO;AACT;AAQO,SAAS,oBACd,eAC4B;AAC5B,MAAI,OAAmC;AACvC,MAAI,eAAe,OAAO;AAC1B,aAAW,gBAAgB,eAAe;AACxC,UAAM,WAAW,wBAAwB,aAAa,QAAQ;AAC9D,QAAI,CAAC,SAAU;AACf,QAAI,SAAS,WAAW,cAAc;AACpC,aAAO;AACP,qBAAe,SAAS;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
@@ -1,5 +1,5 @@
1
- import { z as PresentationLinkView, b as PdsProviderInfo, X as SkillSuggestion } from './index-B0BDMGLm.js';
2
- import { a as AccountVerification } from './verification-providers-7il3kPQS.js';
1
+ import { z as PresentationLinkView, b as PdsProviderInfo, X as SkillSuggestion } from './index-LxGL5I-J.js';
2
+ import { a as AccountVerification } from './verification-providers-BPdY3KyH.js';
3
3
  import { z } from 'zod';
4
4
 
5
5
  /**
@@ -1,5 +1,5 @@
1
- import { z as PresentationLinkView, b as PdsProviderInfo, X as SkillSuggestion } from './index-BrWWVQLL.cjs';
2
- import { a as AccountVerification } from './verification-providers-7il3kPQS.cjs';
1
+ import { z as PresentationLinkView, b as PdsProviderInfo, X as SkillSuggestion } from './index-C2n-GjH2.cjs';
2
+ import { a as AccountVerification } from './verification-providers-BPdY3KyH.cjs';
3
3
  import { z } from 'zod';
4
4
 
5
5
  /**
@@ -1,12 +1,12 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { a0 as SifaApiConfig, a1 as ApiFetchOptions, a3 as WriteResult, o as ProfileView, a2 as CreateResult, a5 as FilterOptions, S as SearchFilters, a8 as SearchResponse, a9 as SkillSearchResult, ai as CompanySearchFilters, aj as CompanySearchResponse, u as RepoDeleteResult, x as RepoInventory } from './types-CPi-Xcur.cjs';
3
+ import { a0 as SifaApiConfig, a1 as ApiFetchOptions, a3 as WriteResult, o as ProfileView, a2 as CreateResult, a5 as FilterOptions, S as SearchFilters, a8 as SearchResponse, a9 as SkillSearchResult, ai as CompanySearchFilters, aj as CompanySearchResponse, u as RepoDeleteResult, x as RepoInventory } from './types-DkrZo5eF.cjs';
4
4
  import * as _tanstack_react_query from '@tanstack/react-query';
5
5
  import { UseQueryOptions, UseMutationOptions, UseInfiniteQueryOptions, InfiniteData } from '@tanstack/react-query';
6
- import { c as Profile, d as ProfilePosition, W as SkillRef, p as ExternalAccount, X as SkillSuggestion, s as OrgFloorVerdict } from './index-BrWWVQLL.cjs';
7
- import { s as sifaQueryKeys, aI as RefreshPdsResult, b5 as UpdateProfileOverrideInput, b6 as UpdateProfileSelfInput, b7 as UploadAvatarResult, b8 as UploadPronunciationAudioResult, as as PrimarySection, a_ as SubCategoryBulkResult, ax as ProfileLocationInput, p as ExternalAccountInput, n as CreateExternalAccountResult, bc as VerifyExternalAccountResult, E as EndorsementInput, l as ConfirmationInput, m as ConfirmationSubjectInput, a2 as GivenConfirmation, ar as PendingConfirmationsPage, ad as InboxCounts, o as DismissUnlinkedPositionInput, b3 as UnlinkedPositionsResult, at as ProfileCompleteness, aQ as RpgClaimableResponse, aU as RpgStatusResponse, aH as RefreshOrcidPublicationsResult, B as BulkHideProfileItemInput, ac as HideProfileItemInput, a7 as HiddenActivityItem, ab as HideActivityItemInput, b1 as UnhideActivityItemInput, f as ActivityPreferences, aY as SiteActivityPresetResponse, b4 as UpdateActivityPreferencesInput, aZ as StatsResponse, i as AppRegistryEntry, a8 as HiddenApp, b as AccountSummary, q as FeaturedProfile, aX as SimilarProfile, P as FetchSuggestionsOptions, b0 as SuggestionsResponse, V as FollowUserResult, x as FetchFollowListOptions, S as FollowListPage, $ as FollowingResponse, z as FetchFollowingFeedOptions, Z as FollowingFeedResponse, _ as FollowingFeedVersion, y as FetchFollowProfilePageOptions, U as FollowProfilePageResponse, F as FeatureAllowlistResponse, h as AdminReviewQueues, t as FetchActivityFeedOptions, c as ActivityFeedResponse, g as ActivityTeaserResponse, a6 as HeatmapResponse, af as MyGithubPullRequestsResponse, A as AccountCheckResult, aG as ReactionStatus, aF as ReactionResult, aE as ReactionError, aP as RoadmapVotesResponse, j as CastRoadmapVoteResult, D as DeleteAccountResult, aK as ResetProfileResult, bd as WipePreview, aJ as RepoDeleteInput, ah as OrgClaimResult, an as OrgProfileUpdateResult, ai as OrgDomainChallengeResult, aj as OrgDomainVerifyResult, ak as OrgNotificationEmailAddResult, al as OrgNotificationEmailRemoveResult, b9 as UserSettings } from './user-settings-BFyyuR3C.cjs';
6
+ import { c as Profile, d as ProfilePosition, W as SkillRef, p as ExternalAccount, X as SkillSuggestion, s as OrgFloorVerdict } from './index-C2n-GjH2.cjs';
7
+ import { s as sifaQueryKeys, aI as RefreshPdsResult, b5 as UpdateProfileOverrideInput, b6 as UpdateProfileSelfInput, b7 as UploadAvatarResult, b8 as UploadPronunciationAudioResult, as as PrimarySection, a_ as SubCategoryBulkResult, ax as ProfileLocationInput, p as ExternalAccountInput, n as CreateExternalAccountResult, bc as VerifyExternalAccountResult, E as EndorsementInput, l as ConfirmationInput, m as ConfirmationSubjectInput, a2 as GivenConfirmation, ar as PendingConfirmationsPage, ad as InboxCounts, o as DismissUnlinkedPositionInput, b3 as UnlinkedPositionsResult, at as ProfileCompleteness, aQ as RpgClaimableResponse, aU as RpgStatusResponse, aH as RefreshOrcidPublicationsResult, B as BulkHideProfileItemInput, ac as HideProfileItemInput, a7 as HiddenActivityItem, ab as HideActivityItemInput, b1 as UnhideActivityItemInput, f as ActivityPreferences, aY as SiteActivityPresetResponse, b4 as UpdateActivityPreferencesInput, aZ as StatsResponse, i as AppRegistryEntry, a8 as HiddenApp, b as AccountSummary, q as FeaturedProfile, aX as SimilarProfile, P as FetchSuggestionsOptions, b0 as SuggestionsResponse, V as FollowUserResult, x as FetchFollowListOptions, S as FollowListPage, $ as FollowingResponse, z as FetchFollowingFeedOptions, Z as FollowingFeedResponse, _ as FollowingFeedVersion, y as FetchFollowProfilePageOptions, U as FollowProfilePageResponse, F as FeatureAllowlistResponse, h as AdminReviewQueues, t as FetchActivityFeedOptions, c as ActivityFeedResponse, g as ActivityTeaserResponse, a6 as HeatmapResponse, af as MyGithubPullRequestsResponse, A as AccountCheckResult, aG as ReactionStatus, aF as ReactionResult, aE as ReactionError, aP as RoadmapVotesResponse, j as CastRoadmapVoteResult, D as DeleteAccountResult, aK as ResetProfileResult, bd as WipePreview, aJ as RepoDeleteInput, ah as OrgClaimResult, an as OrgProfileUpdateResult, ai as OrgDomainChallengeResult, aj as OrgDomainVerifyResult, ak as OrgNotificationEmailAddResult, al as OrgNotificationEmailRemoveResult, b9 as UserSettings } from './user-settings-BDZ9i-Pk.cjs';
8
8
  import { z } from 'zod';
9
- import { i as EntitySearchResponse, E as EntitySearchResult, c as EntityMintDomainResponse, g as EntityResolveDomainResponse, n as EntitySelectResponse, l as EntitySelectRequest, r as FeatureFlag } from './follow-profile-CQ3DTTak.cjs';
9
+ import { i as EntitySearchResponse, E as EntitySearchResult, c as EntityMintDomainResponse, g as EntityResolveDomainResponse, n as EntitySelectResponse, l as EntitySelectRequest, r as FeatureFlag } from './follow-profile-D3zDoDll.cjs';
10
10
  import { O as OrgClaimRequestInput, a as OrgProfileUpdateRequestInput, b as OrgDomainChallengeRequestInput, c as OrgDomainVerifyRequestInput, d as OrgNotificationEmailRequestInput } from './org-settings-C73Sin5E.cjs';
11
11
 
12
12
  interface SifaProviderProps {
@@ -1,12 +1,12 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { a0 as SifaApiConfig, a1 as ApiFetchOptions, a3 as WriteResult, o as ProfileView, a2 as CreateResult, a5 as FilterOptions, S as SearchFilters, a8 as SearchResponse, a9 as SkillSearchResult, ai as CompanySearchFilters, aj as CompanySearchResponse, u as RepoDeleteResult, x as RepoInventory } from './types-D2IffOnb.js';
3
+ import { a0 as SifaApiConfig, a1 as ApiFetchOptions, a3 as WriteResult, o as ProfileView, a2 as CreateResult, a5 as FilterOptions, S as SearchFilters, a8 as SearchResponse, a9 as SkillSearchResult, ai as CompanySearchFilters, aj as CompanySearchResponse, u as RepoDeleteResult, x as RepoInventory } from './types-CICITVJa.js';
4
4
  import * as _tanstack_react_query from '@tanstack/react-query';
5
5
  import { UseQueryOptions, UseMutationOptions, UseInfiniteQueryOptions, InfiniteData } from '@tanstack/react-query';
6
- import { c as Profile, d as ProfilePosition, W as SkillRef, p as ExternalAccount, X as SkillSuggestion, s as OrgFloorVerdict } from './index-B0BDMGLm.js';
7
- import { s as sifaQueryKeys, aI as RefreshPdsResult, b5 as UpdateProfileOverrideInput, b6 as UpdateProfileSelfInput, b7 as UploadAvatarResult, b8 as UploadPronunciationAudioResult, as as PrimarySection, a_ as SubCategoryBulkResult, ax as ProfileLocationInput, p as ExternalAccountInput, n as CreateExternalAccountResult, bc as VerifyExternalAccountResult, E as EndorsementInput, l as ConfirmationInput, m as ConfirmationSubjectInput, a2 as GivenConfirmation, ar as PendingConfirmationsPage, ad as InboxCounts, o as DismissUnlinkedPositionInput, b3 as UnlinkedPositionsResult, at as ProfileCompleteness, aQ as RpgClaimableResponse, aU as RpgStatusResponse, aH as RefreshOrcidPublicationsResult, B as BulkHideProfileItemInput, ac as HideProfileItemInput, a7 as HiddenActivityItem, ab as HideActivityItemInput, b1 as UnhideActivityItemInput, f as ActivityPreferences, aY as SiteActivityPresetResponse, b4 as UpdateActivityPreferencesInput, aZ as StatsResponse, i as AppRegistryEntry, a8 as HiddenApp, b as AccountSummary, q as FeaturedProfile, aX as SimilarProfile, P as FetchSuggestionsOptions, b0 as SuggestionsResponse, V as FollowUserResult, x as FetchFollowListOptions, S as FollowListPage, $ as FollowingResponse, z as FetchFollowingFeedOptions, Z as FollowingFeedResponse, _ as FollowingFeedVersion, y as FetchFollowProfilePageOptions, U as FollowProfilePageResponse, F as FeatureAllowlistResponse, h as AdminReviewQueues, t as FetchActivityFeedOptions, c as ActivityFeedResponse, g as ActivityTeaserResponse, a6 as HeatmapResponse, af as MyGithubPullRequestsResponse, A as AccountCheckResult, aG as ReactionStatus, aF as ReactionResult, aE as ReactionError, aP as RoadmapVotesResponse, j as CastRoadmapVoteResult, D as DeleteAccountResult, aK as ResetProfileResult, bd as WipePreview, aJ as RepoDeleteInput, ah as OrgClaimResult, an as OrgProfileUpdateResult, ai as OrgDomainChallengeResult, aj as OrgDomainVerifyResult, ak as OrgNotificationEmailAddResult, al as OrgNotificationEmailRemoveResult, b9 as UserSettings } from './user-settings-BSlRJc0W.js';
6
+ import { c as Profile, d as ProfilePosition, W as SkillRef, p as ExternalAccount, X as SkillSuggestion, s as OrgFloorVerdict } from './index-LxGL5I-J.js';
7
+ import { s as sifaQueryKeys, aI as RefreshPdsResult, b5 as UpdateProfileOverrideInput, b6 as UpdateProfileSelfInput, b7 as UploadAvatarResult, b8 as UploadPronunciationAudioResult, as as PrimarySection, a_ as SubCategoryBulkResult, ax as ProfileLocationInput, p as ExternalAccountInput, n as CreateExternalAccountResult, bc as VerifyExternalAccountResult, E as EndorsementInput, l as ConfirmationInput, m as ConfirmationSubjectInput, a2 as GivenConfirmation, ar as PendingConfirmationsPage, ad as InboxCounts, o as DismissUnlinkedPositionInput, b3 as UnlinkedPositionsResult, at as ProfileCompleteness, aQ as RpgClaimableResponse, aU as RpgStatusResponse, aH as RefreshOrcidPublicationsResult, B as BulkHideProfileItemInput, ac as HideProfileItemInput, a7 as HiddenActivityItem, ab as HideActivityItemInput, b1 as UnhideActivityItemInput, f as ActivityPreferences, aY as SiteActivityPresetResponse, b4 as UpdateActivityPreferencesInput, aZ as StatsResponse, i as AppRegistryEntry, a8 as HiddenApp, b as AccountSummary, q as FeaturedProfile, aX as SimilarProfile, P as FetchSuggestionsOptions, b0 as SuggestionsResponse, V as FollowUserResult, x as FetchFollowListOptions, S as FollowListPage, $ as FollowingResponse, z as FetchFollowingFeedOptions, Z as FollowingFeedResponse, _ as FollowingFeedVersion, y as FetchFollowProfilePageOptions, U as FollowProfilePageResponse, F as FeatureAllowlistResponse, h as AdminReviewQueues, t as FetchActivityFeedOptions, c as ActivityFeedResponse, g as ActivityTeaserResponse, a6 as HeatmapResponse, af as MyGithubPullRequestsResponse, A as AccountCheckResult, aG as ReactionStatus, aF as ReactionResult, aE as ReactionError, aP as RoadmapVotesResponse, j as CastRoadmapVoteResult, D as DeleteAccountResult, aK as ResetProfileResult, bd as WipePreview, aJ as RepoDeleteInput, ah as OrgClaimResult, an as OrgProfileUpdateResult, ai as OrgDomainChallengeResult, aj as OrgDomainVerifyResult, ak as OrgNotificationEmailAddResult, al as OrgNotificationEmailRemoveResult, b9 as UserSettings } from './user-settings-DvqRXhdC.js';
8
8
  import { z } from 'zod';
9
- import { i as EntitySearchResponse, E as EntitySearchResult, c as EntityMintDomainResponse, g as EntityResolveDomainResponse, n as EntitySelectResponse, l as EntitySelectRequest, r as FeatureFlag } from './follow-profile-ceqefXAw.js';
9
+ import { i as EntitySearchResponse, E as EntitySearchResult, c as EntityMintDomainResponse, g as EntityResolveDomainResponse, n as EntitySelectResponse, l as EntitySelectRequest, r as FeatureFlag } from './follow-profile-CcMgQDsh.js';
10
10
  import { O as OrgClaimRequestInput, h as OrgProfileUpdateRequestInput, b as OrgDomainChallengeRequestInput, d as OrgDomainVerifyRequestInput, f as OrgNotificationEmailRequestInput } from './org-settings-BShvhyFp.js';
11
11
 
12
12
  interface SifaProviderProps {
@@ -1,7 +1,7 @@
1
- import { a3 as WriteResult, a0 as SifaApiConfig, a1 as ApiFetchOptions, a2 as CreateResult, K as SiteActivityPreset, b as ActivityLabel, u as RepoDeleteResult, x as RepoInventory } from './types-CPi-Xcur.cjs';
2
- import { p as ExternalAccount, y as PositionViewerConfirmation } from './index-BrWWVQLL.cjs';
3
- import { a as AccountVerification } from './verification-providers-7il3kPQS.cjs';
4
- import { s as FollowProfileItem, p as FeatureAllowlistEntry, r as FeatureFlag } from './follow-profile-CQ3DTTak.cjs';
1
+ import { a3 as WriteResult, a0 as SifaApiConfig, a1 as ApiFetchOptions, a2 as CreateResult, K as SiteActivityPreset, b as ActivityLabel, u as RepoDeleteResult, x as RepoInventory } from './types-DkrZo5eF.cjs';
2
+ import { p as ExternalAccount, y as PositionViewerConfirmation } from './index-C2n-GjH2.cjs';
3
+ import { a as AccountVerification } from './verification-providers-BPdY3KyH.cjs';
4
+ import { s as FollowProfileItem, p as FeatureAllowlistEntry, r as FeatureFlag } from './follow-profile-D3zDoDll.cjs';
5
5
  import { z } from 'zod';
6
6
  import { d as OrgNotificationEmailRequestInput, b as OrgDomainChallengeRequestInput, O as OrgClaimRequestInput, a as OrgProfileUpdateRequestInput, c as OrgDomainVerifyRequestInput } from './org-settings-C73Sin5E.cjs';
7
7
 
@@ -1,7 +1,7 @@
1
- import { a3 as WriteResult, a0 as SifaApiConfig, a1 as ApiFetchOptions, a2 as CreateResult, K as SiteActivityPreset, b as ActivityLabel, u as RepoDeleteResult, x as RepoInventory } from './types-D2IffOnb.js';
2
- import { p as ExternalAccount, y as PositionViewerConfirmation } from './index-B0BDMGLm.js';
3
- import { a as AccountVerification } from './verification-providers-7il3kPQS.js';
4
- import { s as FollowProfileItem, p as FeatureAllowlistEntry, r as FeatureFlag } from './follow-profile-ceqefXAw.js';
1
+ import { a3 as WriteResult, a0 as SifaApiConfig, a1 as ApiFetchOptions, a2 as CreateResult, K as SiteActivityPreset, b as ActivityLabel, u as RepoDeleteResult, x as RepoInventory } from './types-CICITVJa.js';
2
+ import { p as ExternalAccount, y as PositionViewerConfirmation } from './index-LxGL5I-J.js';
3
+ import { a as AccountVerification } from './verification-providers-BPdY3KyH.js';
4
+ import { s as FollowProfileItem, p as FeatureAllowlistEntry, r as FeatureFlag } from './follow-profile-CcMgQDsh.js';
5
5
  import { z } from 'zod';
6
6
  import { f as OrgNotificationEmailRequestInput, b as OrgDomainChallengeRequestInput, O as OrgClaimRequestInput, h as OrgProfileUpdateRequestInput, d as OrgDomainVerifyRequestInput } from './org-settings-BShvhyFp.js';
7
7
 
@@ -120,12 +120,25 @@ interface VerificationProvider {
120
120
  */
121
121
  source: VerificationSource;
122
122
  /**
123
- * Trusted verifier DIDs for firehose-sourced providers. A verification record
124
- * counts only if its ISSUER DID is in this list. Empty for `bluesky-api`
125
- * providers (Bluesky's AppView owns that decision). DIDs, not handles: a handle
126
- * takeover must never confer verifier status.
123
+ * Trust-root DIDs for firehose-sourced providers. A verification record counts
124
+ * if its ISSUER DID is a root or a member of {@link verifierListUri}. Empty for
125
+ * `bluesky-api` providers (Bluesky's AppView owns that decision). DIDs, not
126
+ * handles: a handle takeover must never confer verifier status.
127
127
  */
128
128
  verifierDids: readonly string[];
129
+ /**
130
+ * AT-URI of the `app.bsky.graph.list` where the provider publishes its
131
+ * trusted verifiers. Consumers load its members at runtime and pass them to
132
+ * {@link resolveVerifierProvider}, so a verifier the provider adds counts on
133
+ * Sifa without a release. The list owner must be in {@link verifierDids}.
134
+ */
135
+ verifierListUri?: string;
136
+ /**
137
+ * Verifiers last confirmed by hand, used ONLY when the caller supplies no
138
+ * list members (list not loaded yet, or a consumer that does not load it).
139
+ * Keeps such callers working; once members are supplied, the list wins.
140
+ */
141
+ fallbackVerifierDids?: readonly string[];
129
142
  }
130
143
  /**
131
144
  * A verification held by an account, as surfaced to the UI. `issuerDid` is
@@ -135,6 +148,8 @@ interface AccountVerification {
135
148
  provider: VerificationProviderId;
136
149
  verifiedAt?: string | null;
137
150
  issuerDid?: string | null;
151
+ /** Display name of the issuer (firehose providers), when the API knows it. */
152
+ issuerName?: string | null;
138
153
  }
139
154
  declare const VERIFICATION_PROVIDERS: Record<VerificationProviderId, VerificationProvider>;
140
155
  declare function isKnownVerificationProvider(id: string): id is VerificationProviderId;
@@ -142,11 +157,30 @@ declare function getVerificationProvider(id: string): VerificationProvider | und
142
157
  /**
143
158
  * The firehose issuer gate: given the DID that authored an
144
159
  * `app.bsky.graph.verification` record, return the provider it verifies for, or
145
- * `null` if the issuer is not a recognized firehose verifier. API-sourced
146
- * providers (Bluesky) are never matched here -- their verifications do not enter
147
- * through the firehose, so a self-issued record cannot resolve to them.
160
+ * `null` if the issuer is not a recognized firehose verifier. A DID counts if it
161
+ * is a provider's trust root, or if `listMembers` (built with
162
+ * {@link buildVerifierListMembers}) maps it to a firehose provider. Without
163
+ * `listMembers`, each provider's `fallbackVerifierDids` apply instead.
164
+ * API-sourced providers (Bluesky) are never matched here -- their verifications
165
+ * do not enter through the firehose, so a self-issued record cannot resolve to
166
+ * them.
167
+ */
168
+ declare function resolveVerifierProvider(issuerDid: string, listMembers?: ReadonlyMap<string, VerificationProviderId>): VerificationProviderId | null;
169
+ /** One `app.bsky.graph.listitem` record value, plus the repo it was read from. */
170
+ interface VerifierListItem {
171
+ /** DID of the repo the listitem record was read from. */
172
+ repoDid: string;
173
+ list: unknown;
174
+ subject: unknown;
175
+ }
176
+ /**
177
+ * Build the `listMembers` map for {@link resolveVerifierProvider} from raw
178
+ * listitem records. An item counts only if it belongs to a firehose provider's
179
+ * {@link VerificationProvider.verifierListUri}, was read from that list owner's
180
+ * repo, and that owner is one of the provider's trust roots. Anything else
181
+ * (a list item someone else wrote, another list, a malformed subject) is dropped.
148
182
  */
149
- declare function resolveVerifierProvider(issuerDid: string): VerificationProviderId | null;
183
+ declare function buildVerifierListMembers(items: readonly VerifierListItem[]): Map<string, VerificationProviderId>;
150
184
  /**
151
185
  * D1 primary-provider selection: from all verifications an account holds, pick
152
186
  * the one whose provider has the highest priority (lowest `priority` number) for
@@ -155,4 +189,4 @@ declare function resolveVerifierProvider(issuerDid: string): VerificationProvide
155
189
  */
156
190
  declare function primaryVerification(verifications: readonly AccountVerification[]): AccountVerification | null;
157
191
 
158
- export { type AgentRef as A, VERIFICATION_PROVIDERS as V, type AccountVerification as a, type VerificationProvider as b, type VerificationProviderId as c, type VerificationSource as d, agentRefSchema as e, atUriSchema as f, cidSchema as g, datetimeSchema as h, didSchema as i, externalRecordRefSchema as j, getVerificationProvider as k, isKnownVerificationProvider as l, languageTagSchema as m, maxGraphemes as n, primaryVerification as o, partialDateSchema as p, skillRefSchema as q, resolveVerifierProvider as r, selfLabelsSchema as s, strongRefSchema as t, uriSchema as u };
192
+ export { type AgentRef as A, VERIFICATION_PROVIDERS as V, type AccountVerification as a, type VerificationProvider as b, type VerificationProviderId as c, type VerificationSource as d, type VerifierListItem as e, agentRefSchema as f, atUriSchema as g, buildVerifierListMembers as h, cidSchema as i, datetimeSchema as j, didSchema as k, externalRecordRefSchema as l, getVerificationProvider as m, isKnownVerificationProvider as n, languageTagSchema as o, maxGraphemes as p, partialDateSchema as q, primaryVerification as r, resolveVerifierProvider as s, selfLabelsSchema as t, skillRefSchema as u, strongRefSchema as v, uriSchema as w };
@@ -120,12 +120,25 @@ interface VerificationProvider {
120
120
  */
121
121
  source: VerificationSource;
122
122
  /**
123
- * Trusted verifier DIDs for firehose-sourced providers. A verification record
124
- * counts only if its ISSUER DID is in this list. Empty for `bluesky-api`
125
- * providers (Bluesky's AppView owns that decision). DIDs, not handles: a handle
126
- * takeover must never confer verifier status.
123
+ * Trust-root DIDs for firehose-sourced providers. A verification record counts
124
+ * if its ISSUER DID is a root or a member of {@link verifierListUri}. Empty for
125
+ * `bluesky-api` providers (Bluesky's AppView owns that decision). DIDs, not
126
+ * handles: a handle takeover must never confer verifier status.
127
127
  */
128
128
  verifierDids: readonly string[];
129
+ /**
130
+ * AT-URI of the `app.bsky.graph.list` where the provider publishes its
131
+ * trusted verifiers. Consumers load its members at runtime and pass them to
132
+ * {@link resolveVerifierProvider}, so a verifier the provider adds counts on
133
+ * Sifa without a release. The list owner must be in {@link verifierDids}.
134
+ */
135
+ verifierListUri?: string;
136
+ /**
137
+ * Verifiers last confirmed by hand, used ONLY when the caller supplies no
138
+ * list members (list not loaded yet, or a consumer that does not load it).
139
+ * Keeps such callers working; once members are supplied, the list wins.
140
+ */
141
+ fallbackVerifierDids?: readonly string[];
129
142
  }
130
143
  /**
131
144
  * A verification held by an account, as surfaced to the UI. `issuerDid` is
@@ -135,6 +148,8 @@ interface AccountVerification {
135
148
  provider: VerificationProviderId;
136
149
  verifiedAt?: string | null;
137
150
  issuerDid?: string | null;
151
+ /** Display name of the issuer (firehose providers), when the API knows it. */
152
+ issuerName?: string | null;
138
153
  }
139
154
  declare const VERIFICATION_PROVIDERS: Record<VerificationProviderId, VerificationProvider>;
140
155
  declare function isKnownVerificationProvider(id: string): id is VerificationProviderId;
@@ -142,11 +157,30 @@ declare function getVerificationProvider(id: string): VerificationProvider | und
142
157
  /**
143
158
  * The firehose issuer gate: given the DID that authored an
144
159
  * `app.bsky.graph.verification` record, return the provider it verifies for, or
145
- * `null` if the issuer is not a recognized firehose verifier. API-sourced
146
- * providers (Bluesky) are never matched here -- their verifications do not enter
147
- * through the firehose, so a self-issued record cannot resolve to them.
160
+ * `null` if the issuer is not a recognized firehose verifier. A DID counts if it
161
+ * is a provider's trust root, or if `listMembers` (built with
162
+ * {@link buildVerifierListMembers}) maps it to a firehose provider. Without
163
+ * `listMembers`, each provider's `fallbackVerifierDids` apply instead.
164
+ * API-sourced providers (Bluesky) are never matched here -- their verifications
165
+ * do not enter through the firehose, so a self-issued record cannot resolve to
166
+ * them.
167
+ */
168
+ declare function resolveVerifierProvider(issuerDid: string, listMembers?: ReadonlyMap<string, VerificationProviderId>): VerificationProviderId | null;
169
+ /** One `app.bsky.graph.listitem` record value, plus the repo it was read from. */
170
+ interface VerifierListItem {
171
+ /** DID of the repo the listitem record was read from. */
172
+ repoDid: string;
173
+ list: unknown;
174
+ subject: unknown;
175
+ }
176
+ /**
177
+ * Build the `listMembers` map for {@link resolveVerifierProvider} from raw
178
+ * listitem records. An item counts only if it belongs to a firehose provider's
179
+ * {@link VerificationProvider.verifierListUri}, was read from that list owner's
180
+ * repo, and that owner is one of the provider's trust roots. Anything else
181
+ * (a list item someone else wrote, another list, a malformed subject) is dropped.
148
182
  */
149
- declare function resolveVerifierProvider(issuerDid: string): VerificationProviderId | null;
183
+ declare function buildVerifierListMembers(items: readonly VerifierListItem[]): Map<string, VerificationProviderId>;
150
184
  /**
151
185
  * D1 primary-provider selection: from all verifications an account holds, pick
152
186
  * the one whose provider has the highest priority (lowest `priority` number) for
@@ -155,4 +189,4 @@ declare function resolveVerifierProvider(issuerDid: string): VerificationProvide
155
189
  */
156
190
  declare function primaryVerification(verifications: readonly AccountVerification[]): AccountVerification | null;
157
191
 
158
- export { type AgentRef as A, VERIFICATION_PROVIDERS as V, type AccountVerification as a, type VerificationProvider as b, type VerificationProviderId as c, type VerificationSource as d, agentRefSchema as e, atUriSchema as f, cidSchema as g, datetimeSchema as h, didSchema as i, externalRecordRefSchema as j, getVerificationProvider as k, isKnownVerificationProvider as l, languageTagSchema as m, maxGraphemes as n, primaryVerification as o, partialDateSchema as p, skillRefSchema as q, resolveVerifierProvider as r, selfLabelsSchema as s, strongRefSchema as t, uriSchema as u };
192
+ export { type AgentRef as A, VERIFICATION_PROVIDERS as V, type AccountVerification as a, type VerificationProvider as b, type VerificationProviderId as c, type VerificationSource as d, type VerifierListItem as e, agentRefSchema as f, atUriSchema as g, buildVerifierListMembers as h, cidSchema as i, datetimeSchema as j, didSchema as k, externalRecordRefSchema as l, getVerificationProvider as m, isKnownVerificationProvider as n, languageTagSchema as o, maxGraphemes as p, partialDateSchema as q, primaryVerification as r, resolveVerifierProvider as s, selfLabelsSchema as t, skillRefSchema as u, strongRefSchema as v, uriSchema as w };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@singi-labs/sifa-sdk",
3
- "version": "0.19.86",
3
+ "version": "0.19.88",
4
4
  "description": "Sifa SDK — public client library for the Sifa AppView on AT Protocol. Shared by sifa-web and sifa-app.",
5
5
  "license": "MIT",
6
6
  "type": "module",