@singi-labs/sifa-sdk 0.19.56 → 0.19.58

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 (40) hide show
  1. package/dist/index.cjs +24 -9
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +41 -32
  4. package/dist/index.d.ts +41 -32
  5. package/dist/index.js +1 -1
  6. package/dist/logic/company-page-indexable.js +26 -8
  7. package/dist/logic/company-page-indexable.js.map +1 -1
  8. package/dist/logic/index.js +7 -1
  9. package/dist/logic/index.js.map +1 -1
  10. package/dist/{network-map-D-XnMy5U.d.ts → network-map-CKF7Yozc.d.ts} +2 -2
  11. package/dist/{network-map-4C9UwVmp.d.cts → network-map-DHOOMSCP.d.cts} +2 -2
  12. package/dist/{org-DTZzfRQs.d.cts → org-Bq3HbpLD.d.cts} +18 -4
  13. package/dist/{org-DtO2TCzd.d.ts → org-CelDIOiN.d.ts} +18 -4
  14. package/dist/{profile-summary-CVFSy7BE.d.cts → profile-summary-CD3-QflX.d.cts} +1 -1
  15. package/dist/{profile-summary-DiONU2n-.d.ts → profile-summary-CyRzFe7f.d.ts} +1 -1
  16. package/dist/query/fetchers/follow.js +13 -4
  17. package/dist/query/fetchers/follow.js.map +1 -1
  18. package/dist/query/fetchers/index.cjs +21 -6
  19. package/dist/query/fetchers/index.cjs.map +1 -1
  20. package/dist/query/fetchers/index.d.cts +5 -5
  21. package/dist/query/fetchers/index.d.ts +5 -5
  22. package/dist/query/fetchers/index.js.map +1 -1
  23. package/dist/query/fetchers/search.js +8 -2
  24. package/dist/query/fetchers/search.js.map +1 -1
  25. package/dist/query/hooks/index.cjs +17 -4
  26. package/dist/query/hooks/index.cjs.map +1 -1
  27. package/dist/query/hooks/index.d.cts +3 -3
  28. package/dist/query/hooks/index.d.ts +3 -3
  29. package/dist/query/hooks/use-follow.js +1 -1
  30. package/dist/query/hooks/use-follow.js.map +1 -1
  31. package/dist/query/index.cjs +22 -7
  32. package/dist/query/index.cjs.map +1 -1
  33. package/dist/query/index.d.cts +8 -8
  34. package/dist/query/index.d.ts +8 -8
  35. package/dist/query/index.js.map +1 -1
  36. package/dist/{types-CYjcuKr4.d.cts → types-BHnGSJ3z.d.cts} +26 -3
  37. package/dist/{types-Bl8KYBSl.d.ts → types-BKEBVobU.d.ts} +26 -3
  38. package/dist/{use-org-notification-emails-D29UFyp2.d.cts → use-org-notification-emails-BTR2Yxq8.d.cts} +7 -6
  39. package/dist/{use-org-notification-emails-C-GftYx5.d.ts → use-org-notification-emails-DDIi6giD.d.ts} +7 -6
  40. package/package.json +1 -1
package/dist/index.d.cts CHANGED
@@ -1,13 +1,13 @@
1
1
  import { P as ProfileSkill, a as ProfilePresentationDelivery, L as LocationValue, b as PdsProviderInfo, c as Profile, A as AccountFacetMode, d as ProfilePosition, e as ProfileCertification, f as ProfileEducation, g as ProfileHonor, h as ProfileLanguage, i as ProfileProject, j as ProfilePublication, k as ProfileInvolvement, R as RelatedIdentifier } from './index-BeQbepFn.cjs';
2
2
  export { l as ActiveApp, m as ActorCard, n as AuthorSuggestion, C as CoSpeaker, E as Endorsement, o as EndorsementData, p as ExternalAccount, q as ExternalAccountKeytraceClaim, F as FeedItem, r as LanguageProficiency, O as OrgAddressView, s as OrgFloorVerdict, t as OrgLinkView, u as OrgProfileView, v as PROJECT_ROLES, w as PresentationLinkView, x as ProfileCourse, y as ProfileIndustry, z as ProfileInvestment, B as ProfileInvestmentLink, D as ProfileInvolvementLink, G as ProfileLocation, H as ProfileOverrideSource, I as ProfilePresentation, J as ProfileVolunteering, K as ProjectMemberCard, M as ProjectRole, N as PublicationContributor, Q as RecognizedEntity, S as SkillRef, T as SkillSuggestion, U as TrustStat, V as VerifiedAccount } from './index-BeQbepFn.cjs';
3
- import { S as SearchFilters } from './types-CYjcuKr4.cjs';
4
- export { A as ADULT_CONTENT_LABELS, a as ActiveAppView, b as ActivityLabel, c as AdultContentLabel, d as AtfundLinkView, C as CertificationView, e as CoSpeakerView, f as ContributorView, g as CourseView, D as DurationView, E as EducationView, h as ExternalAccountView, H as HonorView, I as IndustryDomain, i as InvolvementLinkView, j as InvolvementView, L as LanguageView, P as PositionView, k as PresentationDeliveryView, l as PresentationView, m as ProfileLocationView, n as ProfileView, o as ProjectMemberView, p as ProjectView, q as PublicationView, R as RepoCollectionGroup, r as RepoDeleteOutcome, s as RepoDeleteRecordResult, t as RepoDeleteResult, u as RepoGroupDefinition, v as RepoGroupId, w as RepoInventory, x as RepoRecordLabel, y as RepoRecordSummary, z as SIFA_REPO_GROUPS, B as SkillView, V as VolunteeringView, F as describeSifaRecord, G as hasAdultContent, J as repoGroupForCollection } from './types-CYjcuKr4.cjs';
3
+ import { S as SearchFilters } from './types-BHnGSJ3z.cjs';
4
+ export { A as ADULT_CONTENT_LABELS, a as ActiveAppView, b as ActivityLabel, c as AdultContentLabel, d as AtfundLinkView, C as CertificationView, e as CoSpeakerView, f as ContributorView, g as CourseView, D as DurationView, E as EducationView, h as ExternalAccountView, H as HonorView, I as IndustryDomain, i as InvolvementLinkView, j as InvolvementView, L as LanguageView, P as PositionView, k as PresentationDeliveryView, l as PresentationView, m as ProfileLocationView, n as ProfileView, o as ProjectMemberView, p as ProjectView, q as PublicationView, R as RepoCollectionGroup, r as RepoDeleteOutcome, s as RepoDeleteRecordResult, t as RepoDeleteResult, u as RepoGroupDefinition, v as RepoGroupId, w as RepoInventory, x as RepoRecordLabel, y as RepoRecordSummary, z as SIFA_REPO_GROUPS, B as SkillView, V as VolunteeringView, F as describeSifaRecord, G as hasAdultContent, J as repoGroupForCollection } from './types-BHnGSJ3z.cjs';
5
5
  import { A as AgentRef } from './verification-providers-7il3kPQS.cjs';
6
6
  export { a as AccountVerification, V as VERIFICATION_PROVIDERS, b as VerificationProvider, c as VerificationProviderId, d as VerificationSource, e as agentRefSchema, f as atUriSchema, g as cidSchema, h as datetimeSchema, i as didSchema, j as externalRecordRefSchema, k as getVerificationProvider, l as isKnownVerificationProvider, m as languageTagSchema, n as maxGraphemes, p as partialDateSchema, o as primaryVerification, r as resolveVerifierProvider, s as selfLabelsSchema, q as skillRefSchema, t as strongRefSchema, u as uriSchema } from './verification-providers-7il3kPQS.cjs';
7
7
  import { P as PresentationDuration, a as ProfilePresentationDeliveryRecord, b as ProfilePresentationRecord, O as OrgProfileRecord } from './profile-investment-BiHM7C5q.cjs';
8
8
  export { A as ArtifactLink, c as ArtifactLinkSchema, d as AtmosphereFeedItem, e as AtmosphereFeedItemSchema, B as BlobRef, f as BlobRefSchema, E as EndorsementConfirmationRecord, g as EndorsementConfirmationRecordSchema, h as EndorsementRecord, i as EndorsementRecordSchema, F as FeedActor, j as FeedActorSchema, k as FeedCursor, l as FollowFeedItem, m as FollowFeedItemSchema, n as FollowFeedPage, o as FollowFeedPageSchema, G as GraphFollowRecord, p as GraphFollowRecordSchema, I as InvestmentAmountSchema, q as OrgEmploymentAttestationRecord, r as OrgEmploymentAttestationRecordSchema, s as OrgProfileRecordSchema, t as PROFILE_INVESTMENT_NSID, u as PROFILE_INVOLVEMENT_NSID, v as PresentationDurationSchema, w as PresentationLink, x as PresentationLinkSchema, y as ProfileCertificationRecord, z as ProfileCertificationRecordSchema, C as ProfileCourseRecord, D as ProfileCourseRecordSchema, H as ProfileEducationRecord, J as ProfileEducationRecordSchema, K as ProfileExternalAccountRecord, L as ProfileExternalAccountRecordSchema, M as ProfileHonorRecord, N as ProfileHonorRecordSchema, Q as ProfileInvestmentRecordSchema, R as ProfileInvolvementRecord, S as ProfileInvolvementRecordSchema, T as ProfileLanguageRecord, U as ProfileLanguageRecordSchema, V as ProfilePositionRecord, W as ProfilePositionRecordSchema, X as ProfilePresentationDeliveryRecordSchema, Y as ProfilePresentationRecordSchema, Z as ProfileProjectRecord, _ as ProfileProjectRecordSchema, $ as ProfilePublicationRecord, a0 as ProfilePublicationRecordSchema, a1 as ProfileSelfRecord, a2 as ProfileSelfRecordSchema, a3 as ProfileSkillRecord, a4 as ProfileSkillRecordSchema, a5 as ProfileVolunteeringRecord, a6 as ProfileVolunteeringRecordSchema, a7 as PublicationAuthor, a8 as PublicationAuthorSchema, a9 as RelatedIdentifierSchema, aa as SifaFeedItem, ab as SifaFeedItemSchema, ac as decodeFeedCursor, ad as encodeFeedCursor, ae as makeGraphFollowRecordSchema } from './profile-investment-BiHM7C5q.cjs';
9
9
  import { z } from 'zod';
10
- export { P as ProfileSummary, S as SummarizeProfileViewOptions, s as summarizeProfileView } from './profile-summary-CVFSy7BE.cjs';
10
+ export { P as ProfileSummary, S as SummarizeProfileViewOptions, s as summarizeProfileView } from './profile-summary-CD3-QflX.cjs';
11
11
  import { E as EntitySearchResult } from './follow-profile-CQ3DTTak.cjs';
12
12
  export { a as EntityImportSearchResponse, b as EntityImportSearchResponseSchema, c as EntityMintDomainResponse, d as EntityMintDomainResponseSchema, e as EntityResolveDomainRequest, f as EntityResolveDomainRequestSchema, g as EntityResolveDomainResponse, h as EntityResolveDomainResponseSchema, i as EntitySearchResponse, j as EntitySearchResponseSchema, k as EntitySearchResultSchema, l as EntitySelectRequest, m as EntitySelectRequestSchema, n as EntitySelectResponse, o as EntitySelectResponseSchema, F as FEATURE_FLAGS, p as FeatureAllowlistEntry, q as FeatureAllowlistEntrySchema, r as FeatureFlag, s as FollowProfileItem, t as FollowProfilePage, u as FollowProfilePageSchema, v as FollowProfileSchema } from './follow-profile-CQ3DTTak.cjs';
13
13
 
@@ -2599,49 +2599,58 @@ declare function resolveAccountFacetMode(profile: {
2599
2599
  }): AccountFacetMode;
2600
2600
 
2601
2601
  /**
2602
- * Firmographic subset of a company profile that decides whether its `/c/` page
2603
- * is worth indexing. A minimal STRUCTURAL type on purpose -- it does not import
2602
+ * The subset of a company profile that decides whether its `/c/` page is worth
2603
+ * indexing. A minimal STRUCTURAL type on purpose -- it does not import
2604
2604
  * sifa-web's `CompanyProfile`, so this predicate stays importable by any
2605
- * consumer (sifa-web, sifa-app, third parties). Fields mirror the external
2606
- * firmographics that lead a `/c/` page (Wikidata / ROR / GLEIF derived), NOT
2607
- * Sifa-aggregated stats.
2605
+ * consumer (sifa-web, sifa-app, sifa-api's sitemap, third parties).
2608
2606
  *
2609
- * Deliberately ABSENT: claim status and Sifa-derived employee count. Company
2610
- * page indexability is NEVER gated on either (product decision, 2026-07-16) --
2611
- * a rich unclaimed page is indexable; a claimed but empty page is not.
2607
+ * The line (product decision, 2026-09-28): a page is indexable when it is
2608
+ * claimed, when it has a visible people roster, or when it carries enough real
2609
+ * facts. Inferred values (a Jev-classified industry) never count: they are
2610
+ * guesses at the lowest provenance, not content a searcher came for.
2612
2611
  */
2613
2612
  interface CompanyFirmographics {
2614
2613
  /** External canonical name (Wikidata label / registry name). */
2615
2614
  canonicalName?: string | null;
2616
- /** Free-text description / about. */
2615
+ /** Free-text description / about. Counts only from {@link COMPANY_PAGE_MIN_DESCRIPTION_LENGTH} characters. */
2617
2616
  description?: string | null;
2618
2617
  /** Industry / sector label. */
2619
2618
  industry?: string | null;
2619
+ /** Provenance source of `industry`. `'jev'` (inferred) never counts; absent counts. */
2620
+ industrySource?: string | null;
2620
2621
  /** URL of the company logo. */
2621
2622
  logoUrl?: string | null;
2622
- /** External headcount figure (e.g. Wikidata P1128). NOT the Sifa employee count. */
2623
+ /** External headcount figure (e.g. Wikidata P1128). NOT the Sifa member count. */
2623
2624
  employeeCount?: number | null;
2624
2625
  /** Founding year or date. */
2625
2626
  founded?: string | number | null;
2626
- }
2627
- /**
2628
- * Minimum number of the optional firmographic fields
2629
- * ({@link CompanyFirmographics} minus `canonicalName`) that must be present for
2630
- * a `/c/` company page to be indexable. Named + exported so the threshold is
2631
- * tunable in one place.
2632
- */
2633
- declare const COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS = 2;
2634
- /**
2635
- * Is a `/c/` company page worth indexing?
2636
- *
2637
- * True iff it has real firmographic content: a non-empty `canonicalName` AND at
2638
- * least {@link COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS} of the optional firmographic
2639
- * fields ({@link CompanyFirmographics.description | description},
2640
- * `industry`, `logoUrl`, `employeeCount`, `founded`) present.
2641
- *
2642
- * NEVER gated on claim status or Sifa employee count -- there is no such
2643
- * parameter (product decision, 2026-07-16). A rich unclaimed stub is indexable;
2644
- * a name-only page (claimed or not) is not.
2627
+ /** Country code or name. */
2628
+ country?: string | null;
2629
+ /** Headquarters block; any non-empty part counts as a location. */
2630
+ hq?: Record<string, unknown> | null;
2631
+ /** External links keyed by type (website, linkedin, wikipedia, ...). */
2632
+ externalLinks?: Record<string, unknown> | null;
2633
+ /** Number of Sifa members who list this organization. */
2634
+ memberCount?: number | null;
2635
+ /** The organization has claimed the page. */
2636
+ claimed?: boolean | null;
2637
+ }
2638
+ /**
2639
+ * Minimum number of real facts an unclaimed page without a visible roster needs
2640
+ * to be indexable. The seven facts are a description of at least
2641
+ * {@link COMPANY_PAGE_MIN_DESCRIPTION_LENGTH} characters, a logo, a headcount,
2642
+ * a founding date, a location, an external link, and a non-inferred industry;
2643
+ * at least one Sifa member adds one bonus point.
2644
+ */
2645
+ declare const COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS = 5;
2646
+ /**
2647
+ * Is a `/c/` company page worth indexing (per-page `robots` meta and the
2648
+ * company sitemap)?
2649
+ *
2650
+ * True iff it has a non-empty `canonicalName` AND any of: it is claimed; it has
2651
+ * at least {@link COMPANY_PAGE_ROSTER_MIN_MEMBERS} Sifa members (the roster is
2652
+ * visible); or its {@link companyPageRichness} reaches
2653
+ * {@link COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS}.
2645
2654
  *
2646
2655
  * Pure: no network, no I/O. Third-party importable.
2647
2656
  */
package/dist/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  import { P as ProfileSkill, a as ProfilePresentationDelivery, L as LocationValue, b as PdsProviderInfo, c as Profile, A as AccountFacetMode, d as ProfilePosition, e as ProfileCertification, f as ProfileEducation, g as ProfileHonor, h as ProfileLanguage, i as ProfileProject, j as ProfilePublication, k as ProfileInvolvement, R as RelatedIdentifier } from './index-CT-A3BEe.js';
2
2
  export { l as ActiveApp, m as ActorCard, n as AuthorSuggestion, C as CoSpeaker, E as Endorsement, o as EndorsementData, p as ExternalAccount, q as ExternalAccountKeytraceClaim, F as FeedItem, r as LanguageProficiency, O as OrgAddressView, s as OrgFloorVerdict, t as OrgLinkView, u as OrgProfileView, v as PROJECT_ROLES, w as PresentationLinkView, x as ProfileCourse, y as ProfileIndustry, z as ProfileInvestment, B as ProfileInvestmentLink, D as ProfileInvolvementLink, G as ProfileLocation, H as ProfileOverrideSource, I as ProfilePresentation, J as ProfileVolunteering, K as ProjectMemberCard, M as ProjectRole, N as PublicationContributor, Q as RecognizedEntity, S as SkillRef, T as SkillSuggestion, U as TrustStat, V as VerifiedAccount } from './index-CT-A3BEe.js';
3
- import { S as SearchFilters } from './types-Bl8KYBSl.js';
4
- export { A as ADULT_CONTENT_LABELS, a as ActiveAppView, b as ActivityLabel, c as AdultContentLabel, d as AtfundLinkView, C as CertificationView, e as CoSpeakerView, f as ContributorView, g as CourseView, D as DurationView, E as EducationView, h as ExternalAccountView, H as HonorView, I as IndustryDomain, i as InvolvementLinkView, j as InvolvementView, L as LanguageView, P as PositionView, k as PresentationDeliveryView, l as PresentationView, m as ProfileLocationView, n as ProfileView, o as ProjectMemberView, p as ProjectView, q as PublicationView, R as RepoCollectionGroup, r as RepoDeleteOutcome, s as RepoDeleteRecordResult, t as RepoDeleteResult, u as RepoGroupDefinition, v as RepoGroupId, w as RepoInventory, x as RepoRecordLabel, y as RepoRecordSummary, z as SIFA_REPO_GROUPS, B as SkillView, V as VolunteeringView, F as describeSifaRecord, G as hasAdultContent, J as repoGroupForCollection } from './types-Bl8KYBSl.js';
3
+ import { S as SearchFilters } from './types-BKEBVobU.js';
4
+ export { A as ADULT_CONTENT_LABELS, a as ActiveAppView, b as ActivityLabel, c as AdultContentLabel, d as AtfundLinkView, C as CertificationView, e as CoSpeakerView, f as ContributorView, g as CourseView, D as DurationView, E as EducationView, h as ExternalAccountView, H as HonorView, I as IndustryDomain, i as InvolvementLinkView, j as InvolvementView, L as LanguageView, P as PositionView, k as PresentationDeliveryView, l as PresentationView, m as ProfileLocationView, n as ProfileView, o as ProjectMemberView, p as ProjectView, q as PublicationView, R as RepoCollectionGroup, r as RepoDeleteOutcome, s as RepoDeleteRecordResult, t as RepoDeleteResult, u as RepoGroupDefinition, v as RepoGroupId, w as RepoInventory, x as RepoRecordLabel, y as RepoRecordSummary, z as SIFA_REPO_GROUPS, B as SkillView, V as VolunteeringView, F as describeSifaRecord, G as hasAdultContent, J as repoGroupForCollection } from './types-BKEBVobU.js';
5
5
  import { A as AgentRef } from './verification-providers-7il3kPQS.js';
6
6
  export { a as AccountVerification, V as VERIFICATION_PROVIDERS, b as VerificationProvider, c as VerificationProviderId, d as VerificationSource, e as agentRefSchema, f as atUriSchema, g as cidSchema, h as datetimeSchema, i as didSchema, j as externalRecordRefSchema, k as getVerificationProvider, l as isKnownVerificationProvider, m as languageTagSchema, n as maxGraphemes, p as partialDateSchema, o as primaryVerification, r as resolveVerifierProvider, s as selfLabelsSchema, q as skillRefSchema, t as strongRefSchema, u as uriSchema } from './verification-providers-7il3kPQS.js';
7
7
  import { P as PresentationDuration, a as ProfilePresentationDeliveryRecord, b as ProfilePresentationRecord, O as OrgProfileRecord } from './profile-investment-BiHM7C5q.js';
8
8
  export { A as ArtifactLink, c as ArtifactLinkSchema, d as AtmosphereFeedItem, e as AtmosphereFeedItemSchema, B as BlobRef, f as BlobRefSchema, E as EndorsementConfirmationRecord, g as EndorsementConfirmationRecordSchema, h as EndorsementRecord, i as EndorsementRecordSchema, F as FeedActor, j as FeedActorSchema, k as FeedCursor, l as FollowFeedItem, m as FollowFeedItemSchema, n as FollowFeedPage, o as FollowFeedPageSchema, G as GraphFollowRecord, p as GraphFollowRecordSchema, I as InvestmentAmountSchema, q as OrgEmploymentAttestationRecord, r as OrgEmploymentAttestationRecordSchema, s as OrgProfileRecordSchema, t as PROFILE_INVESTMENT_NSID, u as PROFILE_INVOLVEMENT_NSID, v as PresentationDurationSchema, w as PresentationLink, x as PresentationLinkSchema, y as ProfileCertificationRecord, z as ProfileCertificationRecordSchema, C as ProfileCourseRecord, D as ProfileCourseRecordSchema, H as ProfileEducationRecord, J as ProfileEducationRecordSchema, K as ProfileExternalAccountRecord, L as ProfileExternalAccountRecordSchema, M as ProfileHonorRecord, N as ProfileHonorRecordSchema, Q as ProfileInvestmentRecordSchema, R as ProfileInvolvementRecord, S as ProfileInvolvementRecordSchema, T as ProfileLanguageRecord, U as ProfileLanguageRecordSchema, V as ProfilePositionRecord, W as ProfilePositionRecordSchema, X as ProfilePresentationDeliveryRecordSchema, Y as ProfilePresentationRecordSchema, Z as ProfileProjectRecord, _ as ProfileProjectRecordSchema, $ as ProfilePublicationRecord, a0 as ProfilePublicationRecordSchema, a1 as ProfileSelfRecord, a2 as ProfileSelfRecordSchema, a3 as ProfileSkillRecord, a4 as ProfileSkillRecordSchema, a5 as ProfileVolunteeringRecord, a6 as ProfileVolunteeringRecordSchema, a7 as PublicationAuthor, a8 as PublicationAuthorSchema, a9 as RelatedIdentifierSchema, aa as SifaFeedItem, ab as SifaFeedItemSchema, ac as decodeFeedCursor, ad as encodeFeedCursor, ae as makeGraphFollowRecordSchema } from './profile-investment-BiHM7C5q.js';
9
9
  import { z } from 'zod';
10
- export { P as ProfileSummary, S as SummarizeProfileViewOptions, s as summarizeProfileView } from './profile-summary-DiONU2n-.js';
10
+ export { P as ProfileSummary, S as SummarizeProfileViewOptions, s as summarizeProfileView } from './profile-summary-CyRzFe7f.js';
11
11
  import { E as EntitySearchResult } from './follow-profile-ceqefXAw.js';
12
12
  export { a as EntityImportSearchResponse, b as EntityImportSearchResponseSchema, c as EntityMintDomainResponse, d as EntityMintDomainResponseSchema, e as EntityResolveDomainRequest, f as EntityResolveDomainRequestSchema, g as EntityResolveDomainResponse, h as EntityResolveDomainResponseSchema, i as EntitySearchResponse, j as EntitySearchResponseSchema, k as EntitySearchResultSchema, l as EntitySelectRequest, m as EntitySelectRequestSchema, n as EntitySelectResponse, o as EntitySelectResponseSchema, F as FEATURE_FLAGS, p as FeatureAllowlistEntry, q as FeatureAllowlistEntrySchema, r as FeatureFlag, s as FollowProfileItem, t as FollowProfilePage, u as FollowProfilePageSchema, v as FollowProfileSchema } from './follow-profile-ceqefXAw.js';
13
13
 
@@ -2599,49 +2599,58 @@ declare function resolveAccountFacetMode(profile: {
2599
2599
  }): AccountFacetMode;
2600
2600
 
2601
2601
  /**
2602
- * Firmographic subset of a company profile that decides whether its `/c/` page
2603
- * is worth indexing. A minimal STRUCTURAL type on purpose -- it does not import
2602
+ * The subset of a company profile that decides whether its `/c/` page is worth
2603
+ * indexing. A minimal STRUCTURAL type on purpose -- it does not import
2604
2604
  * sifa-web's `CompanyProfile`, so this predicate stays importable by any
2605
- * consumer (sifa-web, sifa-app, third parties). Fields mirror the external
2606
- * firmographics that lead a `/c/` page (Wikidata / ROR / GLEIF derived), NOT
2607
- * Sifa-aggregated stats.
2605
+ * consumer (sifa-web, sifa-app, sifa-api's sitemap, third parties).
2608
2606
  *
2609
- * Deliberately ABSENT: claim status and Sifa-derived employee count. Company
2610
- * page indexability is NEVER gated on either (product decision, 2026-07-16) --
2611
- * a rich unclaimed page is indexable; a claimed but empty page is not.
2607
+ * The line (product decision, 2026-09-28): a page is indexable when it is
2608
+ * claimed, when it has a visible people roster, or when it carries enough real
2609
+ * facts. Inferred values (a Jev-classified industry) never count: they are
2610
+ * guesses at the lowest provenance, not content a searcher came for.
2612
2611
  */
2613
2612
  interface CompanyFirmographics {
2614
2613
  /** External canonical name (Wikidata label / registry name). */
2615
2614
  canonicalName?: string | null;
2616
- /** Free-text description / about. */
2615
+ /** Free-text description / about. Counts only from {@link COMPANY_PAGE_MIN_DESCRIPTION_LENGTH} characters. */
2617
2616
  description?: string | null;
2618
2617
  /** Industry / sector label. */
2619
2618
  industry?: string | null;
2619
+ /** Provenance source of `industry`. `'jev'` (inferred) never counts; absent counts. */
2620
+ industrySource?: string | null;
2620
2621
  /** URL of the company logo. */
2621
2622
  logoUrl?: string | null;
2622
- /** External headcount figure (e.g. Wikidata P1128). NOT the Sifa employee count. */
2623
+ /** External headcount figure (e.g. Wikidata P1128). NOT the Sifa member count. */
2623
2624
  employeeCount?: number | null;
2624
2625
  /** Founding year or date. */
2625
2626
  founded?: string | number | null;
2626
- }
2627
- /**
2628
- * Minimum number of the optional firmographic fields
2629
- * ({@link CompanyFirmographics} minus `canonicalName`) that must be present for
2630
- * a `/c/` company page to be indexable. Named + exported so the threshold is
2631
- * tunable in one place.
2632
- */
2633
- declare const COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS = 2;
2634
- /**
2635
- * Is a `/c/` company page worth indexing?
2636
- *
2637
- * True iff it has real firmographic content: a non-empty `canonicalName` AND at
2638
- * least {@link COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS} of the optional firmographic
2639
- * fields ({@link CompanyFirmographics.description | description},
2640
- * `industry`, `logoUrl`, `employeeCount`, `founded`) present.
2641
- *
2642
- * NEVER gated on claim status or Sifa employee count -- there is no such
2643
- * parameter (product decision, 2026-07-16). A rich unclaimed stub is indexable;
2644
- * a name-only page (claimed or not) is not.
2627
+ /** Country code or name. */
2628
+ country?: string | null;
2629
+ /** Headquarters block; any non-empty part counts as a location. */
2630
+ hq?: Record<string, unknown> | null;
2631
+ /** External links keyed by type (website, linkedin, wikipedia, ...). */
2632
+ externalLinks?: Record<string, unknown> | null;
2633
+ /** Number of Sifa members who list this organization. */
2634
+ memberCount?: number | null;
2635
+ /** The organization has claimed the page. */
2636
+ claimed?: boolean | null;
2637
+ }
2638
+ /**
2639
+ * Minimum number of real facts an unclaimed page without a visible roster needs
2640
+ * to be indexable. The seven facts are a description of at least
2641
+ * {@link COMPANY_PAGE_MIN_DESCRIPTION_LENGTH} characters, a logo, a headcount,
2642
+ * a founding date, a location, an external link, and a non-inferred industry;
2643
+ * at least one Sifa member adds one bonus point.
2644
+ */
2645
+ declare const COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS = 5;
2646
+ /**
2647
+ * Is a `/c/` company page worth indexing (per-page `robots` meta and the
2648
+ * company sitemap)?
2649
+ *
2650
+ * True iff it has a non-empty `canonicalName` AND any of: it is claimed; it has
2651
+ * at least {@link COMPANY_PAGE_ROSTER_MIN_MEMBERS} Sifa members (the roster is
2652
+ * visible); or its {@link companyPageRichness} reaches
2653
+ * {@link COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS}.
2645
2654
  *
2646
2655
  * Pure: no network, no I/O. Third-party importable.
2647
2656
  */
package/dist/index.js CHANGED
@@ -350,7 +350,7 @@ import {
350
350
  roadmapIssueUrl
351
351
  } from "./roadmap/index.js";
352
352
  import { SIFA_REPO_GROUPS, describeSifaRecord, repoGroupForCollection } from "./repo/index.js";
353
- var SIFA_SDK_VERSION = "0.19.56";
353
+ var SIFA_SDK_VERSION = "0.19.58";
354
354
  export {
355
355
  ACTIVITY_TIERS,
356
356
  ACTIVITY_VERBS,
@@ -1,23 +1,41 @@
1
1
  // src/logic/company-page-indexable.ts
2
- var COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS = 2;
2
+ var COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS = 5;
3
+ var COMPANY_PAGE_MIN_DESCRIPTION_LENGTH = 40;
4
+ var COMPANY_PAGE_ROSTER_MIN_MEMBERS = 5;
3
5
  function isNonEmptyString(value) {
4
6
  return typeof value === "string" && value.trim().length > 0;
5
7
  }
6
8
  function isPresentNumber(value) {
7
9
  return typeof value === "number" && Number.isFinite(value);
8
10
  }
11
+ function hasAnyValue(record) {
12
+ if (!record) return false;
13
+ return Object.values(record).some((v) => isNonEmptyString(v) || isPresentNumber(v));
14
+ }
15
+ function companyPageRichness(company) {
16
+ let score = 0;
17
+ const description = company.description?.trim() ?? "";
18
+ if (description.length >= COMPANY_PAGE_MIN_DESCRIPTION_LENGTH) score += 1;
19
+ if (isNonEmptyString(company.logoUrl)) score += 1;
20
+ if (isPresentNumber(company.employeeCount)) score += 1;
21
+ if (isPresentNumber(company.founded) || isNonEmptyString(company.founded)) score += 1;
22
+ if (isNonEmptyString(company.country) || hasAnyValue(company.hq)) score += 1;
23
+ if (hasAnyValue(company.externalLinks)) score += 1;
24
+ if (isNonEmptyString(company.industry) && company.industrySource !== "jev") score += 1;
25
+ if (isPresentNumber(company.memberCount) && (company.memberCount ?? 0) >= 1) score += 1;
26
+ return score;
27
+ }
9
28
  function isCompanyPageIndexable(company) {
10
29
  if (!isNonEmptyString(company.canonicalName)) return false;
11
- let present = 0;
12
- if (isNonEmptyString(company.description)) present += 1;
13
- if (isNonEmptyString(company.industry)) present += 1;
14
- if (isNonEmptyString(company.logoUrl)) present += 1;
15
- if (isPresentNumber(company.employeeCount)) present += 1;
16
- if (isPresentNumber(company.founded) || isNonEmptyString(company.founded)) present += 1;
17
- return present >= COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS;
30
+ if (company.claimed === true) return true;
31
+ if ((company.memberCount ?? 0) >= COMPANY_PAGE_ROSTER_MIN_MEMBERS) return true;
32
+ return companyPageRichness(company) >= COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS;
18
33
  }
19
34
  export {
35
+ COMPANY_PAGE_MIN_DESCRIPTION_LENGTH,
20
36
  COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS,
37
+ COMPANY_PAGE_ROSTER_MIN_MEMBERS,
38
+ companyPageRichness,
21
39
  isCompanyPageIndexable
22
40
  };
23
41
  //# sourceMappingURL=company-page-indexable.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/logic/company-page-indexable.ts"],"sourcesContent":["/**\n * Firmographic subset of a company profile that decides whether its `/c/` page\n * is worth indexing. A minimal STRUCTURAL type on purpose -- it does not import\n * sifa-web's `CompanyProfile`, so this predicate stays importable by any\n * consumer (sifa-web, sifa-app, third parties). Fields mirror the external\n * firmographics that lead a `/c/` page (Wikidata / ROR / GLEIF derived), NOT\n * Sifa-aggregated stats.\n *\n * Deliberately ABSENT: claim status and Sifa-derived employee count. Company\n * page indexability is NEVER gated on either (product decision, 2026-07-16) --\n * a rich unclaimed page is indexable; a claimed but empty page is not.\n */\nexport interface CompanyFirmographics {\n /** External canonical name (Wikidata label / registry name). */\n canonicalName?: string | null;\n /** Free-text description / about. */\n description?: string | null;\n /** Industry / sector label. */\n industry?: string | null;\n /** URL of the company logo. */\n logoUrl?: string | null;\n /** External headcount figure (e.g. Wikidata P1128). NOT the Sifa employee count. */\n employeeCount?: number | null;\n /** Founding year or date. */\n founded?: string | number | null;\n}\n\n/**\n * Minimum number of the optional firmographic fields\n * ({@link CompanyFirmographics} minus `canonicalName`) that must be present for\n * a `/c/` company page to be indexable. Named + exported so the threshold is\n * tunable in one place.\n */\nexport const COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS = 2;\n\nfunction isNonEmptyString(value: unknown): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n/** A number counts as present when finite; a founded-string counts when non-empty. */\nfunction isPresentNumber(value: unknown): boolean {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\n/**\n * Is a `/c/` company page worth indexing?\n *\n * True iff it has real firmographic content: a non-empty `canonicalName` AND at\n * least {@link COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS} of the optional firmographic\n * fields ({@link CompanyFirmographics.description | description},\n * `industry`, `logoUrl`, `employeeCount`, `founded`) present.\n *\n * NEVER gated on claim status or Sifa employee count -- there is no such\n * parameter (product decision, 2026-07-16). A rich unclaimed stub is indexable;\n * a name-only page (claimed or not) is not.\n *\n * Pure: no network, no I/O. Third-party importable.\n */\nexport function isCompanyPageIndexable(company: CompanyFirmographics): boolean {\n if (!isNonEmptyString(company.canonicalName)) return false;\n\n let present = 0;\n if (isNonEmptyString(company.description)) present += 1;\n if (isNonEmptyString(company.industry)) present += 1;\n if (isNonEmptyString(company.logoUrl)) present += 1;\n if (isPresentNumber(company.employeeCount)) present += 1;\n if (isPresentNumber(company.founded) || isNonEmptyString(company.founded)) present += 1;\n\n return present >= COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS;\n}\n"],"mappings":";AAiCO,IAAM,uCAAuC;AAEpD,SAAS,iBAAiB,OAAyB;AACjD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAC5D;AAGA,SAAS,gBAAgB,OAAyB;AAChD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AAC3D;AAgBO,SAAS,uBAAuB,SAAwC;AAC7E,MAAI,CAAC,iBAAiB,QAAQ,aAAa,EAAG,QAAO;AAErD,MAAI,UAAU;AACd,MAAI,iBAAiB,QAAQ,WAAW,EAAG,YAAW;AACtD,MAAI,iBAAiB,QAAQ,QAAQ,EAAG,YAAW;AACnD,MAAI,iBAAiB,QAAQ,OAAO,EAAG,YAAW;AAClD,MAAI,gBAAgB,QAAQ,aAAa,EAAG,YAAW;AACvD,MAAI,gBAAgB,QAAQ,OAAO,KAAK,iBAAiB,QAAQ,OAAO,EAAG,YAAW;AAEtF,SAAO,WAAW;AACpB;","names":[]}
1
+ {"version":3,"sources":["../../src/logic/company-page-indexable.ts"],"sourcesContent":["/**\n * The subset of a company profile that decides whether its `/c/` page is worth\n * indexing. A minimal STRUCTURAL type on purpose -- it does not import\n * sifa-web's `CompanyProfile`, so this predicate stays importable by any\n * consumer (sifa-web, sifa-app, sifa-api's sitemap, third parties).\n *\n * The line (product decision, 2026-09-28): a page is indexable when it is\n * claimed, when it has a visible people roster, or when it carries enough real\n * facts. Inferred values (a Jev-classified industry) never count: they are\n * guesses at the lowest provenance, not content a searcher came for.\n */\nexport interface CompanyFirmographics {\n /** External canonical name (Wikidata label / registry name). */\n canonicalName?: string | null;\n /** Free-text description / about. Counts only from {@link COMPANY_PAGE_MIN_DESCRIPTION_LENGTH} characters. */\n description?: string | null;\n /** Industry / sector label. */\n industry?: string | null;\n /** Provenance source of `industry`. `'jev'` (inferred) never counts; absent counts. */\n industrySource?: string | null;\n /** URL of the company logo. */\n logoUrl?: string | null;\n /** External headcount figure (e.g. Wikidata P1128). NOT the Sifa member count. */\n employeeCount?: number | null;\n /** Founding year or date. */\n founded?: string | number | null;\n /** Country code or name. */\n country?: string | null;\n /** Headquarters block; any non-empty part counts as a location. */\n hq?: Record<string, unknown> | null;\n /** External links keyed by type (website, linkedin, wikipedia, ...). */\n externalLinks?: Record<string, unknown> | null;\n /** Number of Sifa members who list this organization. */\n memberCount?: number | null;\n /** The organization has claimed the page. */\n claimed?: boolean | null;\n}\n\n/**\n * Minimum number of real facts an unclaimed page without a visible roster needs\n * to be indexable. The seven facts are a description of at least\n * {@link COMPANY_PAGE_MIN_DESCRIPTION_LENGTH} characters, a logo, a headcount,\n * a founding date, a location, an external link, and a non-inferred industry;\n * at least one Sifa member adds one bonus point.\n */\nexport const COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS = 5;\n\n/** Shorter descriptions (\"company in Japan\") are registry one-liners, not content. */\nexport const COMPANY_PAGE_MIN_DESCRIPTION_LENGTH = 40;\n\n/** Member count at which the page shows its people roster; such a page is always indexable. */\nexport const COMPANY_PAGE_ROSTER_MIN_MEMBERS = 5;\n\nfunction isNonEmptyString(value: unknown): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction isPresentNumber(value: unknown): boolean {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction hasAnyValue(record: Record<string, unknown> | null | undefined): boolean {\n if (!record) return false;\n return Object.values(record).some((v) => isNonEmptyString(v) || isPresentNumber(v));\n}\n\n/**\n * Richness score of a `/c/` page: one point per real fact present, plus one\n * bonus point when at least one Sifa member lists the organization. Pure.\n */\nexport function companyPageRichness(company: CompanyFirmographics): number {\n let score = 0;\n const description = company.description?.trim() ?? '';\n if (description.length >= COMPANY_PAGE_MIN_DESCRIPTION_LENGTH) score += 1;\n if (isNonEmptyString(company.logoUrl)) score += 1;\n if (isPresentNumber(company.employeeCount)) score += 1;\n if (isPresentNumber(company.founded) || isNonEmptyString(company.founded)) score += 1;\n if (isNonEmptyString(company.country) || hasAnyValue(company.hq)) score += 1;\n if (hasAnyValue(company.externalLinks)) score += 1;\n if (isNonEmptyString(company.industry) && company.industrySource !== 'jev') score += 1;\n if (isPresentNumber(company.memberCount) && (company.memberCount ?? 0) >= 1) score += 1;\n return score;\n}\n\n/**\n * Is a `/c/` company page worth indexing (per-page `robots` meta and the\n * company sitemap)?\n *\n * True iff it has a non-empty `canonicalName` AND any of: it is claimed; it has\n * at least {@link COMPANY_PAGE_ROSTER_MIN_MEMBERS} Sifa members (the roster is\n * visible); or its {@link companyPageRichness} reaches\n * {@link COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS}.\n *\n * Pure: no network, no I/O. Third-party importable.\n */\nexport function isCompanyPageIndexable(company: CompanyFirmographics): boolean {\n if (!isNonEmptyString(company.canonicalName)) return false;\n if (company.claimed === true) return true;\n if ((company.memberCount ?? 0) >= COMPANY_PAGE_ROSTER_MIN_MEMBERS) return true;\n return companyPageRichness(company) >= COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS;\n}\n"],"mappings":";AA6CO,IAAM,uCAAuC;AAG7C,IAAM,sCAAsC;AAG5C,IAAM,kCAAkC;AAE/C,SAAS,iBAAiB,OAAyB;AACjD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAC5D;AAEA,SAAS,gBAAgB,OAAyB;AAChD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AAC3D;AAEA,SAAS,YAAY,QAA6D;AAChF,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,OAAO,OAAO,MAAM,EAAE,KAAK,CAAC,MAAM,iBAAiB,CAAC,KAAK,gBAAgB,CAAC,CAAC;AACpF;AAMO,SAAS,oBAAoB,SAAuC;AACzE,MAAI,QAAQ;AACZ,QAAM,cAAc,QAAQ,aAAa,KAAK,KAAK;AACnD,MAAI,YAAY,UAAU,oCAAqC,UAAS;AACxE,MAAI,iBAAiB,QAAQ,OAAO,EAAG,UAAS;AAChD,MAAI,gBAAgB,QAAQ,aAAa,EAAG,UAAS;AACrD,MAAI,gBAAgB,QAAQ,OAAO,KAAK,iBAAiB,QAAQ,OAAO,EAAG,UAAS;AACpF,MAAI,iBAAiB,QAAQ,OAAO,KAAK,YAAY,QAAQ,EAAE,EAAG,UAAS;AAC3E,MAAI,YAAY,QAAQ,aAAa,EAAG,UAAS;AACjD,MAAI,iBAAiB,QAAQ,QAAQ,KAAK,QAAQ,mBAAmB,MAAO,UAAS;AACrF,MAAI,gBAAgB,QAAQ,WAAW,MAAM,QAAQ,eAAe,MAAM,EAAG,UAAS;AACtF,SAAO;AACT;AAaO,SAAS,uBAAuB,SAAwC;AAC7E,MAAI,CAAC,iBAAiB,QAAQ,aAAa,EAAG,QAAO;AACrD,MAAI,QAAQ,YAAY,KAAM,QAAO;AACrC,OAAK,QAAQ,eAAe,MAAM,gCAAiC,QAAO;AAC1E,SAAO,oBAAoB,OAAO,KAAK;AACzC;","names":[]}
@@ -45,14 +45,19 @@ import {
45
45
  } from "./org-floor.js";
46
46
  import {
47
47
  isCompanyPageIndexable,
48
- COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS
48
+ companyPageRichness,
49
+ COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS,
50
+ COMPANY_PAGE_MIN_DESCRIPTION_LENGTH,
51
+ COMPANY_PAGE_ROSTER_MIN_MEMBERS
49
52
  } from "./company-page-indexable.js";
50
53
  import { countRecentActivity } from "./recent-activity.js";
51
54
  import { followingFeedFallbackApp } from "./following-feed-fallback.js";
52
55
  import { SELF_APP_ID, excludeSelfApp } from "./self-app.js";
53
56
  import { actorShowsIdentity } from "./actor-identity.js";
54
57
  export {
58
+ COMPANY_PAGE_MIN_DESCRIPTION_LENGTH,
55
59
  COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS,
60
+ COMPANY_PAGE_ROSTER_MIN_MEMBERS,
56
61
  COMPLETENESS_MAX_SCORE,
57
62
  DATE_LOOKAHEAD_MONTHS,
58
63
  DIMENSIONS_MAX_SCORE,
@@ -61,6 +66,7 @@ export {
61
66
  SELF_APP_ID,
62
67
  actorShowsIdentity,
63
68
  classifyEntityRef,
69
+ companyPageRichness,
64
70
  completenessPercent,
65
71
  completenessScore,
66
72
  countFilledDimensions,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/logic/index.ts"],"sourcesContent":["export {\n COMPLETENESS_MAX_SCORE,\n completenessPercent,\n completenessScore,\n type ProfileCompletion,\n} from './profile-completeness.js';\n\nexport {\n DIMENSIONS_MAX_SCORE,\n MIN_SKILLS,\n countFilledDimensions,\n dimensionsFromInputs,\n getFilledDimensionsMap,\n profileToDimensionInputs,\n type DimensionKey,\n type DimensionMap,\n type ProfileDimensionInputs,\n} from './profile-dimensions.js';\n\nexport { pickPrimaryPosition, type PrimaryPositionCandidate } from './primary-position.js';\n\nexport {\n DATE_LOOKAHEAD_MONTHS,\n isBeyondLookahead,\n isUpcomingStart,\n type DateLookaheadKind,\n} from './date-lookahead.js';\n\nexport { pickPrimaryFlagged, type PrimaryFlagCandidate } from './primary-item.js';\n\nexport {\n summarizeProfileView,\n type ProfileSummary,\n type SummarizeProfileViewOptions,\n} from './profile-summary.js';\n\nexport { isPseudoEmployer } from './pseudo-employer.js';\nexport { looksLikeDomain } from './domain-detect.js';\nexport {\n entityDisambiguationLabel,\n searchResultDisambiguation,\n entityResultKey,\n type DisambiguationFields,\n} from './entity-disambiguation.js';\nexport {\n classifyEntityRef,\n isLinked,\n ENTITY_REF_ANCHORS,\n type EntityRefAnchor,\n} from './entity-ref-anchor.js';\nexport { resolveAgentRef, type AgentRefFlat } from './agent-ref.js';\nexport {\n qualifiesAsOrg,\n isRegistrableDomainHandle,\n hasPersonalProfileContent,\n rendersPersonalProfile,\n rendersCompanyProfile,\n resolveAccountFacetMode,\n} from './org-floor.js';\nexport type { PersonalFacetContent } from './org-floor.js';\nexport {\n isCompanyPageIndexable,\n COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS,\n type CompanyFirmographics,\n} from './company-page-indexable.js';\nexport { countRecentActivity, type DailyActivityCount } from './recent-activity.js';\nexport { followingFeedFallbackApp } from './following-feed-fallback.js';\nexport { SELF_APP_ID, excludeSelfApp, type AppWithId } from './self-app.js';\nexport { actorShowsIdentity } from './actor-identity.js';\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAEP,SAAS,2BAA0D;AAEnE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,0BAAqD;AAE9D;AAAA,EACE;AAAA,OAGK;AAEP,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,uBAA0C;AACnD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,2BAAoD;AAC7D,SAAS,gCAAgC;AACzC,SAAS,aAAa,sBAAsC;AAC5D,SAAS,0BAA0B;","names":[]}
1
+ {"version":3,"sources":["../../src/logic/index.ts"],"sourcesContent":["export {\n COMPLETENESS_MAX_SCORE,\n completenessPercent,\n completenessScore,\n type ProfileCompletion,\n} from './profile-completeness.js';\n\nexport {\n DIMENSIONS_MAX_SCORE,\n MIN_SKILLS,\n countFilledDimensions,\n dimensionsFromInputs,\n getFilledDimensionsMap,\n profileToDimensionInputs,\n type DimensionKey,\n type DimensionMap,\n type ProfileDimensionInputs,\n} from './profile-dimensions.js';\n\nexport { pickPrimaryPosition, type PrimaryPositionCandidate } from './primary-position.js';\n\nexport {\n DATE_LOOKAHEAD_MONTHS,\n isBeyondLookahead,\n isUpcomingStart,\n type DateLookaheadKind,\n} from './date-lookahead.js';\n\nexport { pickPrimaryFlagged, type PrimaryFlagCandidate } from './primary-item.js';\n\nexport {\n summarizeProfileView,\n type ProfileSummary,\n type SummarizeProfileViewOptions,\n} from './profile-summary.js';\n\nexport { isPseudoEmployer } from './pseudo-employer.js';\nexport { looksLikeDomain } from './domain-detect.js';\nexport {\n entityDisambiguationLabel,\n searchResultDisambiguation,\n entityResultKey,\n type DisambiguationFields,\n} from './entity-disambiguation.js';\nexport {\n classifyEntityRef,\n isLinked,\n ENTITY_REF_ANCHORS,\n type EntityRefAnchor,\n} from './entity-ref-anchor.js';\nexport { resolveAgentRef, type AgentRefFlat } from './agent-ref.js';\nexport {\n qualifiesAsOrg,\n isRegistrableDomainHandle,\n hasPersonalProfileContent,\n rendersPersonalProfile,\n rendersCompanyProfile,\n resolveAccountFacetMode,\n} from './org-floor.js';\nexport type { PersonalFacetContent } from './org-floor.js';\nexport {\n isCompanyPageIndexable,\n companyPageRichness,\n COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS,\n COMPANY_PAGE_MIN_DESCRIPTION_LENGTH,\n COMPANY_PAGE_ROSTER_MIN_MEMBERS,\n type CompanyFirmographics,\n} from './company-page-indexable.js';\nexport { countRecentActivity, type DailyActivityCount } from './recent-activity.js';\nexport { followingFeedFallbackApp } from './following-feed-fallback.js';\nexport { SELF_APP_ID, excludeSelfApp, type AppWithId } from './self-app.js';\nexport { actorShowsIdentity } from './actor-identity.js';\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAEP,SAAS,2BAA0D;AAEnE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,0BAAqD;AAE9D;AAAA,EACE;AAAA,OAGK;AAEP,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,uBAA0C;AACnD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,2BAAoD;AAC7D,SAAS,gCAAgC;AACzC,SAAS,aAAa,sBAAsC;AAC5D,SAAS,0BAA0B;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import { c as Profile, d as ProfilePosition, S as SkillRef, w as PresentationLinkView } from './index-CT-A3BEe.js';
2
- import { K as SifaApiConfig, M as ApiFetchOptions, n as ProfileView, N as CreateResult, W as WriteResult } from './types-Bl8KYBSl.js';
3
- import { S as SummarizeProfileViewOptions, P as ProfileSummary } from './profile-summary-DiONU2n-.js';
2
+ import { K as SifaApiConfig, M as ApiFetchOptions, n as ProfileView, N as CreateResult, W as WriteResult } from './types-BKEBVobU.js';
3
+ import { S as SummarizeProfileViewOptions, P as ProfileSummary } from './profile-summary-CyRzFe7f.js';
4
4
  import { i as EntitySearchResponse, E as EntitySearchResult, c as EntityMintDomainResponse, g as EntityResolveDomainResponse, l as EntitySelectRequest, n as EntitySelectResponse } from './follow-profile-ceqefXAw.js';
5
5
  import { z } from 'zod';
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { c as Profile, d as ProfilePosition, S as SkillRef, w as PresentationLinkView } from './index-BeQbepFn.cjs';
2
- import { K as SifaApiConfig, M as ApiFetchOptions, n as ProfileView, N as CreateResult, W as WriteResult } from './types-CYjcuKr4.cjs';
3
- import { S as SummarizeProfileViewOptions, P as ProfileSummary } from './profile-summary-CVFSy7BE.cjs';
2
+ import { K as SifaApiConfig, M as ApiFetchOptions, n as ProfileView, N as CreateResult, W as WriteResult } from './types-BHnGSJ3z.cjs';
3
+ import { S as SummarizeProfileViewOptions, P as ProfileSummary } from './profile-summary-CD3-QflX.cjs';
4
4
  import { i as EntitySearchResponse, E as EntitySearchResult, c as EntityMintDomainResponse, g as EntityResolveDomainResponse, l as EntitySelectRequest, n as EntitySelectResponse } from './follow-profile-CQ3DTTak.cjs';
5
5
  import { z } from 'zod';
6
6
 
@@ -1,4 +1,4 @@
1
- import { W as WriteResult, K as SifaApiConfig, M as ApiFetchOptions, N as CreateResult, b as ActivityLabel, t as RepoDeleteResult, w as RepoInventory } from './types-CYjcuKr4.cjs';
1
+ import { W as WriteResult, K as SifaApiConfig, M as ApiFetchOptions, N as CreateResult, b as ActivityLabel, t as RepoDeleteResult, w as RepoInventory } from './types-BHnGSJ3z.cjs';
2
2
  import { p as ExternalAccount } from './index-BeQbepFn.cjs';
3
3
  import { a as AccountVerification } from './verification-providers-7il3kPQS.cjs';
4
4
  import { s as FollowProfileItem, p as FeatureAllowlistEntry, r as FeatureFlag } from './follow-profile-CQ3DTTak.cjs';
@@ -1096,6 +1096,11 @@ interface FollowingFeedResponse extends ActivityFeedResponse {
1096
1096
  reason?: FollowingFeedEmptyReason;
1097
1097
  /** When this feed was built (ISO 8601). Absent on a `building` answer. */
1098
1098
  builtAt?: string;
1099
+ /**
1100
+ * Fingerprint of the items shown. Equal for a rebuild that found nothing
1101
+ * new, so compare it (with {@link isNewerFollowingFeed}) rather than times.
1102
+ */
1103
+ contentHash?: string;
1099
1104
  /**
1100
1105
  * True when this is an older build, served while a newer one is built in
1101
1106
  * the background. Poll {@link fetchFollowingFeedVersion} to learn when the
@@ -1119,6 +1124,8 @@ declare function fetchFollowingFeed(config: SifaApiConfig, opts?: FetchFollowing
1119
1124
  interface FollowingFeedVersion {
1120
1125
  /** ISO 8601, or null when nothing is cached for this query. */
1121
1126
  builtAt: string | null;
1127
+ /** Fingerprint of the cached feed's items, or null when unknown. */
1128
+ contentHash: string | null;
1122
1129
  }
1123
1130
  /**
1124
1131
  * When the cached following feed for the same query was built. Cheap: it never
@@ -1126,8 +1133,15 @@ interface FollowingFeedVersion {
1126
1133
  * newer one once {@link isNewerFollowingFeed} says so. Returns `null` on error.
1127
1134
  */
1128
1135
  declare function fetchFollowingFeedVersion(config: SifaApiConfig, opts?: FetchFollowingFeedOptions): Promise<FollowingFeedVersion | null>;
1129
- /** True when `latestBuiltAt` is a newer build than the one shown (`shownBuiltAt`). */
1130
- declare function isNewerFollowingFeed(shownBuiltAt: string | null | undefined, latestBuiltAt: string | null | undefined): boolean;
1136
+ /** The parts of a feed build that {@link isNewerFollowingFeed} compares. */
1137
+ type FollowingFeedBuild = Partial<FollowingFeedVersion>;
1138
+ /**
1139
+ * True when `latest` is a newer build than the one shown AND shows different
1140
+ * items. A rebuild that found nothing new has the same fingerprint, and
1141
+ * offering it would show nothing new. Missing data on either side is false:
1142
+ * better to miss an offer than to make an empty one.
1143
+ */
1144
+ declare function isNewerFollowingFeed(shown: FollowingFeedBuild | null | undefined, latest: FollowingFeedBuild | null | undefined): boolean;
1131
1145
 
1132
1146
  /**
1133
1147
  * Options shared by the cursor-paginated follow-graph endpoints introduced in
@@ -1760,4 +1774,4 @@ declare function addOrgNotificationEmail(config: SifaApiConfig, body: OrgNotific
1760
1774
  */
1761
1775
  declare function removeOrgNotificationEmail(config: SifaApiConfig, body: OrgNotificationEmailRequestInput, options?: Omit<ApiFetchOptions, 'method' | 'body'>): Promise<WriteResult<Partial<OrgNotificationEmailRemoveResult>>>;
1762
1776
 
1763
- export { type HeatmapDay as $, type AccountCheckResult as A, type BulkHideProfileItemInput as B, type ConfirmEndorsementInput as C, type DeleteAccountResult as D, type EndorsementInput as E, type FeatureAllowlistResponse as F, type FetchInboxCountsOptions as G, type FetchMyGithubPullRequestsOptions as H, type FetchMyRoadmapVotesOptions as I, type FetchProfileCompletenessOptions as J, type FetchReactionStatusOptions as K, type FetchSuggestionsOptions as L, type FetchUnlinkedPositionsOptions as M, type FollowListPage as N, type FollowProfile as O, type FollowProfilePageResponse as P, type FollowUserResult as Q, type FollowingFeedApp as R, type FollowingFeedEmptyReason as S, type FollowingFeedResponse as T, type FollowingFeedVersion as U, type FollowingResponse as V, type GetAdminReviewQueuesOptions as W, type GithubPullRequest as X, type GivenConfirmation as Y, HIDDEN_ITEM_SOURCES as Z, HIDDEN_ITEM_TYPES as _, type ConfirmEndorsementResult as a, bulkHideProfileItems as a$, type HeatmapResponse as a0, type HiddenActivityItem as a1, type HiddenApp as a2, type HiddenItemSource as a3, type HiddenItemType as a4, type HideActivityItemInput as a5, type HideProfileItemInput as a6, type InboxCounts as a7, type ListFeatureAllowlistOptions as a8, type MyGithubPullRequestsResponse as a9, type ReactionStatus as aA, type RefreshOrcidPublicationsResult as aB, type RefreshPdsResult as aC, type RepoDeleteInput as aD, type ResetProfileResult as aE, type ResolveQuotedPostsOptions as aF, type RoadmapVoteError as aG, type RoadmapVoteResult as aH, type RoadmapVoter as aI, type RoadmapVotesResponse as aJ, type SifaQueryKey as aK, type SimilarProfile as aL, type StatsResponse as aM, type SubCategoryBulkResult as aN, type SuggestionProfile as aO, type SuggestionsResponse as aP, type UnhideActivityItemInput as aQ, type UnlinkedPosition as aR, type UnlinkedPositionsResult as aS, type UpdateProfileOverrideInput as aT, type UpdateProfileSelfInput as aU, type UploadAvatarResult as aV, type UploadPronunciationAudioResult as aW, type VerifyExternalAccountResult as aX, type WipePreview as aY, addFeatureAllowlist as aZ, addOrgNotificationEmail as a_, type OrgClaimBinding as aa, type OrgClaimResult as ab, type OrgDomainChallengeResult as ac, type OrgDomainVerifyResult as ad, type OrgNotificationEmailAddResult as ae, type OrgNotificationEmailRemoveResult as af, type OrgProfileEcho as ag, type OrgProfileUpdateResult as ah, PROFILE_COMPLETENESS_SIGNALS as ai, type PdsWipeOutcome as aj, type PendingConfirmation as ak, type PendingConfirmationsPage as al, type PrimarySection as am, type ProfileCompleteness as an, type ProfileCompletenessSignal as ao, type ProfileIndustryInput as ap, type ProfileLocationAddress as aq, type ProfileLocationInput as ar, type ProfileSelfLocation as as, QUOTED_POSTS_BATCH_MAX as at, type QuotedPostAuthor as au, type QuotedPostImage as av, type QuotedPostResult as aw, type QuotedPostView as ax, type ReactionError as ay, type ReactionResult as az, type AccountSummary as b, refreshPds as b$, bulkHideStandardPublications as b0, bulkUnhideProfileItems as b1, bulkUnhideStandardPublications as b2, castRoadmapVote as b3, checkAppAccount as b4, confirmEndorsement as b5, createConfirmation as b6, createEndorsement as b7, createExternalAccount as b8, createProfileLocation as b9, fetchMyGithubPullRequests as bA, fetchMyRoadmapVotes as bB, fetchPendingConfirmations as bC, fetchProfileCompleteness as bD, fetchReactionStatus as bE, fetchRepoInventory as bF, fetchRoadmapVotes as bG, fetchSimilarProfiles as bH, fetchStats as bI, fetchSuggestionCount as bJ, fetchSuggestions as bK, fetchUnlinkedPositions as bL, fetchWipePreview as bM, followUser as bN, getAdminReviewQueues as bO, getBlueskySuggestions as bP, getFollowers as bQ, getFollowing as bR, getMutuals as bS, hideActivityItem as bT, hideOrcidPublication as bU, hideProfileItem as bV, hideSifaPublication as bW, hideStandardPublication as bX, isNewerFollowingFeed as bY, listFeatureAllowlist as bZ, refreshOrcidPublications as b_, createReaction as ba, createSkill as bb, deleteAccount as bc, deleteAvatarOverride as bd, deleteExternalAccount as be, deleteNamePronunciationAudio as bf, deleteProfileLocation as bg, deleteReaction as bh, deleteRepoRecords as bi, deleteSkill as bj, dismissConfirmation as bk, dismissUnlinkedPosition as bl, fetchAccounts as bm, fetchActivityFeed as bn, fetchActivityTeaser as bo, fetchAppsRegistry as bp, fetchExternalAccounts as bq, fetchFeaturedProfile as br, fetchFollowing as bs, fetchFollowingFeed as bt, fetchFollowingFeedVersion as bu, fetchGivenConfirmations as bv, fetchHeatmapData as bw, fetchHiddenActivityItems as bx, fetchHiddenApps as by, fetchInboxCounts as bz, type ActivityFeedResponse as c, removeFeatureAllowlist as c0, removeOrgNotificationEmail as c1, repoExportUrl as c2, requestOrgDomainChallenge as c3, resetProfile as c4, resolveQuotedPosts as c5, retractRoadmapVote as c6, revokeConfirmation as c7, setExternalAccountPrimary as c8, setSectionPrimary as c9, submitOrgClaim as ca, switchAccount as cb, unfollowUser as cc, unhideActivityItem as cd, unhideOrcidPublication as ce, unhideProfileItem as cf, unhideSifaPublication as cg, unhideStandardPublication as ch, unsetExternalAccountPrimary as ci, unsetSectionPrimary as cj, updateExternalAccount as ck, updateOrgProfile as cl, updateProfileLocation as cm, updateProfileOverride as cn, updateProfileSelf as co, updateSkill as cp, updateSkillSubCategories as cq, uploadAvatar as cr, uploadNamePronunciationAudio as cs, verifyExternalAccount as ct, verifyOrgDomain as cu, type ActivityItem as d, type ActivityItemLinkHealth as e, type ActivityTeaserResponse as f, type AdminReviewQueues as g, type AppRegistryEntry as h, type CastRoadmapVoteResult as i, type CheckAppAccountOptions as j, type ConfirmationInput as k, type ConfirmationSubjectInput as l, type CreateExternalAccountResult as m, type DismissUnlinkedPositionInput as n, type ExternalAccountInput as o, type FeaturedProfile as p, type FetchAccountsOptions as q, type FetchActivityFeedOptions as r, sifaQueryKeys as s, type FetchActivityTeaserOptions as t, type FetchConfirmationsOptions as u, type FetchFollowListOptions as v, type FetchFollowProfilePageOptions as w, type FetchFollowingFeedOptions as x, type FetchHiddenActivityItemsOptions as y, type FetchHiddenAppsOptions as z };
1777
+ export { HIDDEN_ITEM_TYPES as $, type AccountCheckResult as A, type BulkHideProfileItemInput as B, type ConfirmEndorsementInput as C, type DeleteAccountResult as D, type EndorsementInput as E, type FeatureAllowlistResponse as F, type FetchInboxCountsOptions as G, type FetchMyGithubPullRequestsOptions as H, type FetchMyRoadmapVotesOptions as I, type FetchProfileCompletenessOptions as J, type FetchReactionStatusOptions as K, type FetchSuggestionsOptions as L, type FetchUnlinkedPositionsOptions as M, type FollowListPage as N, type FollowProfile as O, type FollowProfilePageResponse as P, type FollowUserResult as Q, type FollowingFeedApp as R, type FollowingFeedBuild as S, type FollowingFeedEmptyReason as T, type FollowingFeedResponse as U, type FollowingFeedVersion as V, type FollowingResponse as W, type GetAdminReviewQueuesOptions as X, type GithubPullRequest as Y, type GivenConfirmation as Z, HIDDEN_ITEM_SOURCES as _, type ConfirmEndorsementResult as a, addOrgNotificationEmail as a$, type HeatmapDay as a0, type HeatmapResponse as a1, type HiddenActivityItem as a2, type HiddenApp as a3, type HiddenItemSource as a4, type HiddenItemType as a5, type HideActivityItemInput as a6, type HideProfileItemInput as a7, type InboxCounts as a8, type ListFeatureAllowlistOptions as a9, type ReactionResult as aA, type ReactionStatus as aB, type RefreshOrcidPublicationsResult as aC, type RefreshPdsResult as aD, type RepoDeleteInput as aE, type ResetProfileResult as aF, type ResolveQuotedPostsOptions as aG, type RoadmapVoteError as aH, type RoadmapVoteResult as aI, type RoadmapVoter as aJ, type RoadmapVotesResponse as aK, type SifaQueryKey as aL, type SimilarProfile as aM, type StatsResponse as aN, type SubCategoryBulkResult as aO, type SuggestionProfile as aP, type SuggestionsResponse as aQ, type UnhideActivityItemInput as aR, type UnlinkedPosition as aS, type UnlinkedPositionsResult as aT, type UpdateProfileOverrideInput as aU, type UpdateProfileSelfInput as aV, type UploadAvatarResult as aW, type UploadPronunciationAudioResult as aX, type VerifyExternalAccountResult as aY, type WipePreview as aZ, addFeatureAllowlist as a_, type MyGithubPullRequestsResponse as aa, type OrgClaimBinding as ab, type OrgClaimResult as ac, type OrgDomainChallengeResult as ad, type OrgDomainVerifyResult as ae, type OrgNotificationEmailAddResult as af, type OrgNotificationEmailRemoveResult as ag, type OrgProfileEcho as ah, type OrgProfileUpdateResult as ai, PROFILE_COMPLETENESS_SIGNALS as aj, type PdsWipeOutcome as ak, type PendingConfirmation as al, type PendingConfirmationsPage as am, type PrimarySection as an, type ProfileCompleteness as ao, type ProfileCompletenessSignal as ap, type ProfileIndustryInput as aq, type ProfileLocationAddress as ar, type ProfileLocationInput as as, type ProfileSelfLocation as at, QUOTED_POSTS_BATCH_MAX as au, type QuotedPostAuthor as av, type QuotedPostImage as aw, type QuotedPostResult as ax, type QuotedPostView as ay, type ReactionError as az, type AccountSummary as b, refreshOrcidPublications as b$, bulkHideProfileItems as b0, bulkHideStandardPublications as b1, bulkUnhideProfileItems as b2, bulkUnhideStandardPublications as b3, castRoadmapVote as b4, checkAppAccount as b5, confirmEndorsement as b6, createConfirmation as b7, createEndorsement as b8, createExternalAccount as b9, fetchInboxCounts as bA, fetchMyGithubPullRequests as bB, fetchMyRoadmapVotes as bC, fetchPendingConfirmations as bD, fetchProfileCompleteness as bE, fetchReactionStatus as bF, fetchRepoInventory as bG, fetchRoadmapVotes as bH, fetchSimilarProfiles as bI, fetchStats as bJ, fetchSuggestionCount as bK, fetchSuggestions as bL, fetchUnlinkedPositions as bM, fetchWipePreview as bN, followUser as bO, getAdminReviewQueues as bP, getBlueskySuggestions as bQ, getFollowers as bR, getFollowing as bS, getMutuals as bT, hideActivityItem as bU, hideOrcidPublication as bV, hideProfileItem as bW, hideSifaPublication as bX, hideStandardPublication as bY, isNewerFollowingFeed as bZ, listFeatureAllowlist as b_, createProfileLocation as ba, createReaction as bb, createSkill as bc, deleteAccount as bd, deleteAvatarOverride as be, deleteExternalAccount as bf, deleteNamePronunciationAudio as bg, deleteProfileLocation as bh, deleteReaction as bi, deleteRepoRecords as bj, deleteSkill as bk, dismissConfirmation as bl, dismissUnlinkedPosition as bm, fetchAccounts as bn, fetchActivityFeed as bo, fetchActivityTeaser as bp, fetchAppsRegistry as bq, fetchExternalAccounts as br, fetchFeaturedProfile as bs, fetchFollowing as bt, fetchFollowingFeed as bu, fetchFollowingFeedVersion as bv, fetchGivenConfirmations as bw, fetchHeatmapData as bx, fetchHiddenActivityItems as by, fetchHiddenApps as bz, type ActivityFeedResponse as c, refreshPds as c0, removeFeatureAllowlist as c1, removeOrgNotificationEmail as c2, repoExportUrl as c3, requestOrgDomainChallenge as c4, resetProfile as c5, resolveQuotedPosts as c6, retractRoadmapVote as c7, revokeConfirmation as c8, setExternalAccountPrimary as c9, setSectionPrimary as ca, submitOrgClaim as cb, switchAccount as cc, unfollowUser as cd, unhideActivityItem as ce, unhideOrcidPublication as cf, unhideProfileItem as cg, unhideSifaPublication as ch, unhideStandardPublication as ci, unsetExternalAccountPrimary as cj, unsetSectionPrimary as ck, updateExternalAccount as cl, updateOrgProfile as cm, updateProfileLocation as cn, updateProfileOverride as co, updateProfileSelf as cp, updateSkill as cq, updateSkillSubCategories as cr, uploadAvatar as cs, uploadNamePronunciationAudio as ct, verifyExternalAccount as cu, verifyOrgDomain as cv, type ActivityItem as d, type ActivityItemLinkHealth as e, type ActivityTeaserResponse as f, type AdminReviewQueues as g, type AppRegistryEntry as h, type CastRoadmapVoteResult as i, type CheckAppAccountOptions as j, type ConfirmationInput as k, type ConfirmationSubjectInput as l, type CreateExternalAccountResult as m, type DismissUnlinkedPositionInput as n, type ExternalAccountInput as o, type FeaturedProfile as p, type FetchAccountsOptions as q, type FetchActivityFeedOptions as r, sifaQueryKeys as s, type FetchActivityTeaserOptions as t, type FetchConfirmationsOptions as u, type FetchFollowListOptions as v, type FetchFollowProfilePageOptions as w, type FetchFollowingFeedOptions as x, type FetchHiddenActivityItemsOptions as y, type FetchHiddenAppsOptions as z };
@@ -1,4 +1,4 @@
1
- import { W as WriteResult, K as SifaApiConfig, M as ApiFetchOptions, N as CreateResult, b as ActivityLabel, t as RepoDeleteResult, w as RepoInventory } from './types-Bl8KYBSl.js';
1
+ import { W as WriteResult, K as SifaApiConfig, M as ApiFetchOptions, N as CreateResult, b as ActivityLabel, t as RepoDeleteResult, w as RepoInventory } from './types-BKEBVobU.js';
2
2
  import { p as ExternalAccount } from './index-CT-A3BEe.js';
3
3
  import { a as AccountVerification } from './verification-providers-7il3kPQS.js';
4
4
  import { s as FollowProfileItem, p as FeatureAllowlistEntry, r as FeatureFlag } from './follow-profile-ceqefXAw.js';
@@ -1096,6 +1096,11 @@ interface FollowingFeedResponse extends ActivityFeedResponse {
1096
1096
  reason?: FollowingFeedEmptyReason;
1097
1097
  /** When this feed was built (ISO 8601). Absent on a `building` answer. */
1098
1098
  builtAt?: string;
1099
+ /**
1100
+ * Fingerprint of the items shown. Equal for a rebuild that found nothing
1101
+ * new, so compare it (with {@link isNewerFollowingFeed}) rather than times.
1102
+ */
1103
+ contentHash?: string;
1099
1104
  /**
1100
1105
  * True when this is an older build, served while a newer one is built in
1101
1106
  * the background. Poll {@link fetchFollowingFeedVersion} to learn when the
@@ -1119,6 +1124,8 @@ declare function fetchFollowingFeed(config: SifaApiConfig, opts?: FetchFollowing
1119
1124
  interface FollowingFeedVersion {
1120
1125
  /** ISO 8601, or null when nothing is cached for this query. */
1121
1126
  builtAt: string | null;
1127
+ /** Fingerprint of the cached feed's items, or null when unknown. */
1128
+ contentHash: string | null;
1122
1129
  }
1123
1130
  /**
1124
1131
  * When the cached following feed for the same query was built. Cheap: it never
@@ -1126,8 +1133,15 @@ interface FollowingFeedVersion {
1126
1133
  * newer one once {@link isNewerFollowingFeed} says so. Returns `null` on error.
1127
1134
  */
1128
1135
  declare function fetchFollowingFeedVersion(config: SifaApiConfig, opts?: FetchFollowingFeedOptions): Promise<FollowingFeedVersion | null>;
1129
- /** True when `latestBuiltAt` is a newer build than the one shown (`shownBuiltAt`). */
1130
- declare function isNewerFollowingFeed(shownBuiltAt: string | null | undefined, latestBuiltAt: string | null | undefined): boolean;
1136
+ /** The parts of a feed build that {@link isNewerFollowingFeed} compares. */
1137
+ type FollowingFeedBuild = Partial<FollowingFeedVersion>;
1138
+ /**
1139
+ * True when `latest` is a newer build than the one shown AND shows different
1140
+ * items. A rebuild that found nothing new has the same fingerprint, and
1141
+ * offering it would show nothing new. Missing data on either side is false:
1142
+ * better to miss an offer than to make an empty one.
1143
+ */
1144
+ declare function isNewerFollowingFeed(shown: FollowingFeedBuild | null | undefined, latest: FollowingFeedBuild | null | undefined): boolean;
1131
1145
 
1132
1146
  /**
1133
1147
  * Options shared by the cursor-paginated follow-graph endpoints introduced in
@@ -1760,4 +1774,4 @@ declare function addOrgNotificationEmail(config: SifaApiConfig, body: OrgNotific
1760
1774
  */
1761
1775
  declare function removeOrgNotificationEmail(config: SifaApiConfig, body: OrgNotificationEmailRequestInput, options?: Omit<ApiFetchOptions, 'method' | 'body'>): Promise<WriteResult<Partial<OrgNotificationEmailRemoveResult>>>;
1762
1776
 
1763
- export { type HeatmapDay as $, type AccountCheckResult as A, type BulkHideProfileItemInput as B, type ConfirmEndorsementInput as C, type DeleteAccountResult as D, type EndorsementInput as E, type FeatureAllowlistResponse as F, type FetchInboxCountsOptions as G, type FetchMyGithubPullRequestsOptions as H, type FetchMyRoadmapVotesOptions as I, type FetchProfileCompletenessOptions as J, type FetchReactionStatusOptions as K, type FetchSuggestionsOptions as L, type FetchUnlinkedPositionsOptions as M, type FollowListPage as N, type FollowProfile as O, type FollowProfilePageResponse as P, type FollowUserResult as Q, type FollowingFeedApp as R, type FollowingFeedEmptyReason as S, type FollowingFeedResponse as T, type FollowingFeedVersion as U, type FollowingResponse as V, type GetAdminReviewQueuesOptions as W, type GithubPullRequest as X, type GivenConfirmation as Y, HIDDEN_ITEM_SOURCES as Z, HIDDEN_ITEM_TYPES as _, type ConfirmEndorsementResult as a, bulkHideProfileItems as a$, type HeatmapResponse as a0, type HiddenActivityItem as a1, type HiddenApp as a2, type HiddenItemSource as a3, type HiddenItemType as a4, type HideActivityItemInput as a5, type HideProfileItemInput as a6, type InboxCounts as a7, type ListFeatureAllowlistOptions as a8, type MyGithubPullRequestsResponse as a9, type ReactionStatus as aA, type RefreshOrcidPublicationsResult as aB, type RefreshPdsResult as aC, type RepoDeleteInput as aD, type ResetProfileResult as aE, type ResolveQuotedPostsOptions as aF, type RoadmapVoteError as aG, type RoadmapVoteResult as aH, type RoadmapVoter as aI, type RoadmapVotesResponse as aJ, type SifaQueryKey as aK, type SimilarProfile as aL, type StatsResponse as aM, type SubCategoryBulkResult as aN, type SuggestionProfile as aO, type SuggestionsResponse as aP, type UnhideActivityItemInput as aQ, type UnlinkedPosition as aR, type UnlinkedPositionsResult as aS, type UpdateProfileOverrideInput as aT, type UpdateProfileSelfInput as aU, type UploadAvatarResult as aV, type UploadPronunciationAudioResult as aW, type VerifyExternalAccountResult as aX, type WipePreview as aY, addFeatureAllowlist as aZ, addOrgNotificationEmail as a_, type OrgClaimBinding as aa, type OrgClaimResult as ab, type OrgDomainChallengeResult as ac, type OrgDomainVerifyResult as ad, type OrgNotificationEmailAddResult as ae, type OrgNotificationEmailRemoveResult as af, type OrgProfileEcho as ag, type OrgProfileUpdateResult as ah, PROFILE_COMPLETENESS_SIGNALS as ai, type PdsWipeOutcome as aj, type PendingConfirmation as ak, type PendingConfirmationsPage as al, type PrimarySection as am, type ProfileCompleteness as an, type ProfileCompletenessSignal as ao, type ProfileIndustryInput as ap, type ProfileLocationAddress as aq, type ProfileLocationInput as ar, type ProfileSelfLocation as as, QUOTED_POSTS_BATCH_MAX as at, type QuotedPostAuthor as au, type QuotedPostImage as av, type QuotedPostResult as aw, type QuotedPostView as ax, type ReactionError as ay, type ReactionResult as az, type AccountSummary as b, refreshPds as b$, bulkHideStandardPublications as b0, bulkUnhideProfileItems as b1, bulkUnhideStandardPublications as b2, castRoadmapVote as b3, checkAppAccount as b4, confirmEndorsement as b5, createConfirmation as b6, createEndorsement as b7, createExternalAccount as b8, createProfileLocation as b9, fetchMyGithubPullRequests as bA, fetchMyRoadmapVotes as bB, fetchPendingConfirmations as bC, fetchProfileCompleteness as bD, fetchReactionStatus as bE, fetchRepoInventory as bF, fetchRoadmapVotes as bG, fetchSimilarProfiles as bH, fetchStats as bI, fetchSuggestionCount as bJ, fetchSuggestions as bK, fetchUnlinkedPositions as bL, fetchWipePreview as bM, followUser as bN, getAdminReviewQueues as bO, getBlueskySuggestions as bP, getFollowers as bQ, getFollowing as bR, getMutuals as bS, hideActivityItem as bT, hideOrcidPublication as bU, hideProfileItem as bV, hideSifaPublication as bW, hideStandardPublication as bX, isNewerFollowingFeed as bY, listFeatureAllowlist as bZ, refreshOrcidPublications as b_, createReaction as ba, createSkill as bb, deleteAccount as bc, deleteAvatarOverride as bd, deleteExternalAccount as be, deleteNamePronunciationAudio as bf, deleteProfileLocation as bg, deleteReaction as bh, deleteRepoRecords as bi, deleteSkill as bj, dismissConfirmation as bk, dismissUnlinkedPosition as bl, fetchAccounts as bm, fetchActivityFeed as bn, fetchActivityTeaser as bo, fetchAppsRegistry as bp, fetchExternalAccounts as bq, fetchFeaturedProfile as br, fetchFollowing as bs, fetchFollowingFeed as bt, fetchFollowingFeedVersion as bu, fetchGivenConfirmations as bv, fetchHeatmapData as bw, fetchHiddenActivityItems as bx, fetchHiddenApps as by, fetchInboxCounts as bz, type ActivityFeedResponse as c, removeFeatureAllowlist as c0, removeOrgNotificationEmail as c1, repoExportUrl as c2, requestOrgDomainChallenge as c3, resetProfile as c4, resolveQuotedPosts as c5, retractRoadmapVote as c6, revokeConfirmation as c7, setExternalAccountPrimary as c8, setSectionPrimary as c9, submitOrgClaim as ca, switchAccount as cb, unfollowUser as cc, unhideActivityItem as cd, unhideOrcidPublication as ce, unhideProfileItem as cf, unhideSifaPublication as cg, unhideStandardPublication as ch, unsetExternalAccountPrimary as ci, unsetSectionPrimary as cj, updateExternalAccount as ck, updateOrgProfile as cl, updateProfileLocation as cm, updateProfileOverride as cn, updateProfileSelf as co, updateSkill as cp, updateSkillSubCategories as cq, uploadAvatar as cr, uploadNamePronunciationAudio as cs, verifyExternalAccount as ct, verifyOrgDomain as cu, type ActivityItem as d, type ActivityItemLinkHealth as e, type ActivityTeaserResponse as f, type AdminReviewQueues as g, type AppRegistryEntry as h, type CastRoadmapVoteResult as i, type CheckAppAccountOptions as j, type ConfirmationInput as k, type ConfirmationSubjectInput as l, type CreateExternalAccountResult as m, type DismissUnlinkedPositionInput as n, type ExternalAccountInput as o, type FeaturedProfile as p, type FetchAccountsOptions as q, type FetchActivityFeedOptions as r, sifaQueryKeys as s, type FetchActivityTeaserOptions as t, type FetchConfirmationsOptions as u, type FetchFollowListOptions as v, type FetchFollowProfilePageOptions as w, type FetchFollowingFeedOptions as x, type FetchHiddenActivityItemsOptions as y, type FetchHiddenAppsOptions as z };
1777
+ export { HIDDEN_ITEM_TYPES as $, type AccountCheckResult as A, type BulkHideProfileItemInput as B, type ConfirmEndorsementInput as C, type DeleteAccountResult as D, type EndorsementInput as E, type FeatureAllowlistResponse as F, type FetchInboxCountsOptions as G, type FetchMyGithubPullRequestsOptions as H, type FetchMyRoadmapVotesOptions as I, type FetchProfileCompletenessOptions as J, type FetchReactionStatusOptions as K, type FetchSuggestionsOptions as L, type FetchUnlinkedPositionsOptions as M, type FollowListPage as N, type FollowProfile as O, type FollowProfilePageResponse as P, type FollowUserResult as Q, type FollowingFeedApp as R, type FollowingFeedBuild as S, type FollowingFeedEmptyReason as T, type FollowingFeedResponse as U, type FollowingFeedVersion as V, type FollowingResponse as W, type GetAdminReviewQueuesOptions as X, type GithubPullRequest as Y, type GivenConfirmation as Z, HIDDEN_ITEM_SOURCES as _, type ConfirmEndorsementResult as a, addOrgNotificationEmail as a$, type HeatmapDay as a0, type HeatmapResponse as a1, type HiddenActivityItem as a2, type HiddenApp as a3, type HiddenItemSource as a4, type HiddenItemType as a5, type HideActivityItemInput as a6, type HideProfileItemInput as a7, type InboxCounts as a8, type ListFeatureAllowlistOptions as a9, type ReactionResult as aA, type ReactionStatus as aB, type RefreshOrcidPublicationsResult as aC, type RefreshPdsResult as aD, type RepoDeleteInput as aE, type ResetProfileResult as aF, type ResolveQuotedPostsOptions as aG, type RoadmapVoteError as aH, type RoadmapVoteResult as aI, type RoadmapVoter as aJ, type RoadmapVotesResponse as aK, type SifaQueryKey as aL, type SimilarProfile as aM, type StatsResponse as aN, type SubCategoryBulkResult as aO, type SuggestionProfile as aP, type SuggestionsResponse as aQ, type UnhideActivityItemInput as aR, type UnlinkedPosition as aS, type UnlinkedPositionsResult as aT, type UpdateProfileOverrideInput as aU, type UpdateProfileSelfInput as aV, type UploadAvatarResult as aW, type UploadPronunciationAudioResult as aX, type VerifyExternalAccountResult as aY, type WipePreview as aZ, addFeatureAllowlist as a_, type MyGithubPullRequestsResponse as aa, type OrgClaimBinding as ab, type OrgClaimResult as ac, type OrgDomainChallengeResult as ad, type OrgDomainVerifyResult as ae, type OrgNotificationEmailAddResult as af, type OrgNotificationEmailRemoveResult as ag, type OrgProfileEcho as ah, type OrgProfileUpdateResult as ai, PROFILE_COMPLETENESS_SIGNALS as aj, type PdsWipeOutcome as ak, type PendingConfirmation as al, type PendingConfirmationsPage as am, type PrimarySection as an, type ProfileCompleteness as ao, type ProfileCompletenessSignal as ap, type ProfileIndustryInput as aq, type ProfileLocationAddress as ar, type ProfileLocationInput as as, type ProfileSelfLocation as at, QUOTED_POSTS_BATCH_MAX as au, type QuotedPostAuthor as av, type QuotedPostImage as aw, type QuotedPostResult as ax, type QuotedPostView as ay, type ReactionError as az, type AccountSummary as b, refreshOrcidPublications as b$, bulkHideProfileItems as b0, bulkHideStandardPublications as b1, bulkUnhideProfileItems as b2, bulkUnhideStandardPublications as b3, castRoadmapVote as b4, checkAppAccount as b5, confirmEndorsement as b6, createConfirmation as b7, createEndorsement as b8, createExternalAccount as b9, fetchInboxCounts as bA, fetchMyGithubPullRequests as bB, fetchMyRoadmapVotes as bC, fetchPendingConfirmations as bD, fetchProfileCompleteness as bE, fetchReactionStatus as bF, fetchRepoInventory as bG, fetchRoadmapVotes as bH, fetchSimilarProfiles as bI, fetchStats as bJ, fetchSuggestionCount as bK, fetchSuggestions as bL, fetchUnlinkedPositions as bM, fetchWipePreview as bN, followUser as bO, getAdminReviewQueues as bP, getBlueskySuggestions as bQ, getFollowers as bR, getFollowing as bS, getMutuals as bT, hideActivityItem as bU, hideOrcidPublication as bV, hideProfileItem as bW, hideSifaPublication as bX, hideStandardPublication as bY, isNewerFollowingFeed as bZ, listFeatureAllowlist as b_, createProfileLocation as ba, createReaction as bb, createSkill as bc, deleteAccount as bd, deleteAvatarOverride as be, deleteExternalAccount as bf, deleteNamePronunciationAudio as bg, deleteProfileLocation as bh, deleteReaction as bi, deleteRepoRecords as bj, deleteSkill as bk, dismissConfirmation as bl, dismissUnlinkedPosition as bm, fetchAccounts as bn, fetchActivityFeed as bo, fetchActivityTeaser as bp, fetchAppsRegistry as bq, fetchExternalAccounts as br, fetchFeaturedProfile as bs, fetchFollowing as bt, fetchFollowingFeed as bu, fetchFollowingFeedVersion as bv, fetchGivenConfirmations as bw, fetchHeatmapData as bx, fetchHiddenActivityItems as by, fetchHiddenApps as bz, type ActivityFeedResponse as c, refreshPds as c0, removeFeatureAllowlist as c1, removeOrgNotificationEmail as c2, repoExportUrl as c3, requestOrgDomainChallenge as c4, resetProfile as c5, resolveQuotedPosts as c6, retractRoadmapVote as c7, revokeConfirmation as c8, setExternalAccountPrimary as c9, setSectionPrimary as ca, submitOrgClaim as cb, switchAccount as cc, unfollowUser as cd, unhideActivityItem as ce, unhideOrcidPublication as cf, unhideProfileItem as cg, unhideSifaPublication as ch, unhideStandardPublication as ci, unsetExternalAccountPrimary as cj, unsetSectionPrimary as ck, updateExternalAccount as cl, updateOrgProfile as cm, updateProfileLocation as cn, updateProfileOverride as co, updateProfileSelf as cp, updateSkill as cq, updateSkillSubCategories as cr, uploadAvatar as cs, uploadNamePronunciationAudio as ct, verifyExternalAccount as cu, verifyOrgDomain as cv, type ActivityItem as d, type ActivityItemLinkHealth as e, type ActivityTeaserResponse as f, type AdminReviewQueues as g, type AppRegistryEntry as h, type CastRoadmapVoteResult as i, type CheckAppAccountOptions as j, type ConfirmationInput as k, type ConfirmationSubjectInput as l, type CreateExternalAccountResult as m, type DismissUnlinkedPositionInput as n, type ExternalAccountInput as o, type FeaturedProfile as p, type FetchAccountsOptions as q, type FetchActivityFeedOptions as r, sifaQueryKeys as s, type FetchActivityTeaserOptions as t, type FetchConfirmationsOptions as u, type FetchFollowListOptions as v, type FetchFollowProfilePageOptions as w, type FetchFollowingFeedOptions as x, type FetchHiddenActivityItemsOptions as y, type FetchHiddenAppsOptions as z };
@@ -1,4 +1,4 @@
1
- import { n as ProfileView } from './types-CYjcuKr4.cjs';
1
+ import { n as ProfileView } from './types-BHnGSJ3z.cjs';
2
2
 
3
3
  /**
4
4
  * Compact professional summary derived from a {@link ProfileView}.
@@ -1,4 +1,4 @@
1
- import { n as ProfileView } from './types-Bl8KYBSl.js';
1
+ import { n as ProfileView } from './types-BKEBVobU.js';
2
2
 
3
3
  /**
4
4
  * Compact professional summary derived from a {@link ProfileView}.